diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 000000000..8cf7d4c46
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,64 @@
+name: CI Pipeline
+
+on:
+  push:
+    branches: [ "master" ]
+  pull_request:
+    branches: [ "master" ]
+  workflow_dispatch:
+
+permissions: write-all
+
+jobs:
+  gradle_check:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@main
+        with:
+          fetch-depth: 0
+      - name: Set up JDK 17
+        uses: actions/setup-java@main
+        with:
+          java-version: '17'
+          distribution: 'temurin'
+      - name: Build with Gradle
+        uses: gradle/actions/setup-gradle@main
+      - name: Run Gradle Check
+        run: ./gradlew check
+
+  gradle_publish:
+    needs: gradle_check
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@main
+        with:
+          fetch-depth: 0
+      - name: Set up JDK 17
+        uses: actions/setup-java@main
+        with:
+          java-version: '17'
+          distribution: 'temurin'
+      - name: Build with Gradle
+        uses: gradle/actions/setup-gradle@main
+      - name: Publish with Gradle
+        run: ./gradlew publish
+        env:
+          ossrhUsername: ${{ secrets.OSSRHUSERNAME }}
+          ossrhPassword: ${{ secrets.OSSRHPASSWORD }}
+      - uses: actions/setup-python@main
+      - name: Install XSLT Processor
+        run: sudo apt-get install xsltproc sphinx-common
+      - name: Install Python dependencies
+        #run: pip install furo myst_parser sphinx-prompt sphinx_substitution_extensions sphinx_issues sphinx_inline_tabs pygments
+        run: pip install furo myst_parser sphinx_substitution_extensions sphinx_issues sphinx_inline_tabs pygments
+      - name: Build Sphinx documentation with Gradle
+        run: ./gradlew -DFLOATING_TOC=false gitChangelogTask renderRR xslt xmldoc sphinx
+      - name: Deploy Sphinx documentation
+        uses: actions/configure-pages@main
+      - name: Upload artifact
+        uses: actions/upload-pages-artifact@main
+        with:
+          path: 'build/sphinx'
+      - name: Deploy to GitHub Pages
+        id: deployment
+        uses: actions/deploy-pages@main
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
deleted file mode 100644
index ba1434e1d..000000000
--- a/.github/workflows/gradle.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
-# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
-
-name: Gradle CI
-
-on:
-  push:
-    branches: [ "master" ]
-  pull_request:
-    branches: [ "master" ]
-
-permissions:
-  contents: read
-
-jobs:
-  check:
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v4
-      with:
-        fetch-depth: 0
-    - name: Set up JDK 11
-      uses: actions/setup-java@v3
-      with:
-        java-version: '11'
-        distribution: 'temurin'
-    - name: Build with Gradle
-      uses: gradle/gradle-build-action@v3.5.0
-      with:
-        arguments: check
-      env:
-        ossrhUsername: ${{ secrets.OSSRHPASSWORD }}
-        ossrhPassword: ${{ secrets.OSSRHUSERNAME }}
diff --git a/.github/workflows/gradle_publish.yml b/.github/workflows/gradle_publish.yml
deleted file mode 100644
index ff272f018..000000000
--- a/.github/workflows/gradle_publish.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-# This workflow uses actions that are not certified by GitHub.
-# They are provided by a third-party and are governed by
-# separate terms of service, privacy policy, and support
-# documentation.
-# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
-# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
-
-name: Gradle publish Snapshot
-
-on:
-  workflow_dispatch:
-
-permissions:
-  contents: read
-
-jobs:
-  publish:
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v4
-      with:
-        fetch-depth: 0
-    - name: Set up JDK 11
-      uses: actions/setup-java@v3
-      with:
-        java-version: '11'
-        distribution: 'temurin'
-    - name: Build with Gradle
-      uses: gradle/gradle-build-action@v3.5.0
-      with:
-        arguments: publish
-        # arguments: build check publish
-      env:
-        ossrhUsername: ${{ secrets.OSSRHPASSWORD }}
-        ossrhPassword: ${{ secrets.OSSRHUSERNAME }}
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
deleted file mode 100644
index 3c265b631..000000000
--- a/.github/workflows/maven.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
-# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
-
-name: Maven CI
-
-on:
-  push:
-    branches: [ master ]
-  pull_request:
-    branches: [ master ]
-
-jobs:
-  package:
-
-    runs-on: ubuntu-latest
-    strategy:
-      matrix: 
-        java: [11]
-    name: Java ${{ matrix.java }} building ... 
-    
-    steps:
-    - uses: actions/checkout@v3
-    - name: Set up Java ${{ matrix.java }} 
-      uses: actions/setup-java@v3
-      with:
-        java-version: ${{ matrix.java }}
-        distribution: 'temurin'
-        cache: maven
-        server-id: sonatype-nexus-snapshots 
-        server-username: MAVEN_USERNAME
-        server-password: MAVEN_PASSWORD
-    - name: Build with Maven
-      run: mvn -B package --file pom.xml -DdisableXmlReport=true -Djacoco.skip=true -Dpmd.skip=true
-      env:
-        MAVEN_USERNAME: ${{ secrets.OSSRHUSERNAME }}
-        MAVEN_PASSWORD: ${{ secrets.OSSRHPASSWORD }}
diff --git a/.github/workflows/maven_deploy.yml b/.github/workflows/maven_deploy.yml
deleted file mode 100644
index e63de93eb..000000000
--- a/.github/workflows/maven_deploy.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-name: Maven deploy snapshot
-
-on:
-  push:
-    branches: [ "master" ]
-
-jobs:
-  deploy:
-
-    runs-on: ubuntu-latest
-    strategy:
-      matrix: 
-        java: [11]
-    name: Java ${{ matrix.java }} building ... 
-    
-    steps:
-    - uses: actions/checkout@v4
-      with:
-        fetch-depth: 0
-    - name: Set up Java ${{ matrix.java }} 
-      uses: actions/setup-java@v4
-      with:
-        java-version: ${{ matrix.java }}
-        distribution: 'temurin'
-        cache: maven
-        server-id: sonatype-nexus-snapshots 
-        server-username: MAVEN_USERNAME
-        server-password: MAVEN_PASSWORD
-    - name: Build with Maven
-      run: mvn -B deploy --file pom.xml -DdisableXmlReport=true -Djacoco.skip=true -Dpmd.skip=true
-      env:
-        MAVEN_USERNAME: ${{ secrets.OSSRHUSERNAME }}
-        MAVEN_PASSWORD: ${{ secrets.OSSRHPASSWORD }}
diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml
deleted file mode 100644
index 27a821746..000000000
--- a/.github/workflows/sphinx.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: Sphinx Pages
-on:
-  push:
-    branches: [ "master" ]
-
-permissions: write-all
-jobs:
-  docs:
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/setup-python@v4
-      - name: Install XSLT Processor
-        run: sudo apt-get install xsltproc sphinx-common
-      - name: Install dependencies
-        run: pip install furo myst_parser sphinx-prompt sphinx_substitution_extensions sphinx_issues sphinx_inline_tabs pygments
-      - name: Checkout project sources
-        uses: actions/checkout@v4
-        with:
-          ref: master
-          fetch-depth: 0
-      - name: Setup Gradle
-        uses: gradle/gradle-build-action@v3.5.0
-      - name: Run build with Gradle Wrapper
-        run: FLOATING_TOC=false ./gradlew --no-build-cache clean xmldoc sphinx
-      - name: Deploy
-        uses: actions/configure-pages@v2
-      - name: Upload artifact
-        uses: actions/upload-pages-artifact@v1
-        with:
-          # Upload entire repository
-          path: 'build/sphinx'
-      - name: Deploy to GitHub Pages
-        id: deployment
-        uses: actions/deploy-pages@v1
diff --git a/.gitignore b/.gitignore
index a2b625283..7129aacf7 100755
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,6 @@
 /nbproject/
 
 /.gradle
+
+# Mac
+.DS_Store
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 70bf11431..000000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,10578 +0,0 @@
-# JSqlParser changelog
-
-Changelog of JSqlParser.
-
-## jsqlparser-5.0 (2024-06-30)
-
-### Breaking changes
-
--  Visitors return Objects and accept parameters ([5bd28](https://github.com/JSQLParser/JSqlParser/commit/5bd28c8b309df6c) Andreas Reichel)  
--  Visitors return Objects ([131a9](https://github.com/JSQLParser/JSqlParser/commit/131a988ccea2d91) Andreas Reichel)  
--  Visitors return Objects ([c2328](https://github.com/JSQLParser/JSqlParser/commit/c2328120e7a79ff) Andreas Reichel)  
--  Visitors return Objects ([ec497](https://github.com/JSQLParser/JSqlParser/commit/ec49762708e920a) Andreas Reichel)  
--  Visitors return Objects ([681ca](https://github.com/JSQLParser/JSqlParser/commit/681cac933d83516) Andreas Reichel)  
-
-### Features
-
--  provide compatibility methods ([3f995](https://github.com/JSQLParser/JSqlParser/commit/3f99548b99bbfe3) Andreas Reichel)  
--  apply the new parametrized Visitor patterns to all entities and provide default implementations ([e1692](https://github.com/JSQLParser/JSqlParser/commit/e1692990c543ed1) Andreas Reichel)  
--  syntax sugar ([2fce4](https://github.com/JSQLParser/JSqlParser/commit/2fce4c009b77d85) Andreas Reichel)  
--  Visitors return Objects and accept parameters ([5bd28](https://github.com/JSQLParser/JSqlParser/commit/5bd28c8b309df6c) Andreas Reichel)  
--  Visitors return Objects ([131a9](https://github.com/JSQLParser/JSqlParser/commit/131a988ccea2d91) Andreas Reichel)  
--  Visitors return Objects ([c2328](https://github.com/JSQLParser/JSqlParser/commit/c2328120e7a79ff) Andreas Reichel)  
--  Visitors return Objects ([ec497](https://github.com/JSQLParser/JSqlParser/commit/ec49762708e920a) Andreas Reichel)  
--  Visitors return Objects ([681ca](https://github.com/JSQLParser/JSqlParser/commit/681cac933d83516) Andreas Reichel)  
--  Allow OUTER keyword as function parameter name (#2021) ([fc90c](https://github.com/JSQLParser/JSqlParser/commit/fc90c0b5e566533) Chris Crabtree)  
--  BigQuery `SELECT AS STRUCT ...` and `SELECT AS VALUE ...` ([5c360](https://github.com/JSQLParser/JSqlParser/commit/5c360a2fc95c261) Andreas Reichel)  
--  add syntax sugar ([2ace7](https://github.com/JSQLParser/JSqlParser/commit/2ace74d1047e87d) Andreas Reichel)  
--  `AllColumns`, DuckDB uses `EXCLUDE` instead of `EXCEPT` ([1ad42](https://github.com/JSQLParser/JSqlParser/commit/1ad4234280f7a70) Andreas Reichel)  
--  syntax sugar ([ae1ef](https://github.com/JSQLParser/JSqlParser/commit/ae1eff9f7434c08) Andreas Reichel)  
--  syntax sugar ([81846](https://github.com/JSQLParser/JSqlParser/commit/818464c93ae665a) Andreas Reichel)  
--  syntax sugar ([2cb3e](https://github.com/JSQLParser/JSqlParser/commit/2cb3e589b60e192) Andreas Reichel)  
--  syntax sugar ([b2eed](https://github.com/JSQLParser/JSqlParser/commit/b2eed1e910c97de) Andreas Reichel)  
--  Databricks IGNORE/RESPECT NULLS ([e9c9a](https://github.com/JSQLParser/JSqlParser/commit/e9c9a173a660bbe) Andreas Reichel)  
--  Databricks IGNORE/RESPECT NULLS ([544b1](https://github.com/JSQLParser/JSqlParser/commit/544b1683789f20b) Andreas Reichel)  
--  Capture expression name part delimiters (#2001) ([0368b](https://github.com/JSQLParser/JSqlParser/commit/0368b9ebad76742) Chris Crabtree)  
--  syntax sugar ([ca5c5](https://github.com/JSQLParser/JSqlParser/commit/ca5c553efde37eb) Andreas Reichel)  
--  translate HEX to Unicode String and ByteArray String ([df519](https://github.com/JSQLParser/JSqlParser/commit/df519333ff34740) Andreas Reichel)  
--  `StructType` syntax sugar ([6e9bf](https://github.com/JSQLParser/JSqlParser/commit/6e9bf42b0b2d783) Andreas Reichel)  
--  `Values` implement `FromItem` ([e426c](https://github.com/JSQLParser/JSqlParser/commit/e426c5a67c505b5) Andreas Reichel)  
--  add `ParenthesedSelect` delegate ([66d05](https://github.com/JSQLParser/JSqlParser/commit/66d05a2bb7c41f3) Andreas Reichel)  
--  add `ParenthesedSelect` delegate ([f1699](https://github.com/JSQLParser/JSqlParser/commit/f16999393589702) Andreas Reichel)  
--  Simplify traversing the AST bottom to top ([bddc4](https://github.com/JSQLParser/JSqlParser/commit/bddc41cddf5b5bf) Andreas Reichel)  
--  AST Node access for `FromItem` ([c1edf](https://github.com/JSQLParser/JSqlParser/commit/c1edf0f8f21bd52) Andreas Reichel)  
--  RedShift specific Window function IGNORE | RESPECT NULLS ([321c8](https://github.com/JSQLParser/JSqlParser/commit/321c88098a75791) Andreas Reichel)  
--  RedShift allows `TOP` before `DISTINCT`, see https://docs.aws.amazon.com/redshift/latest/dg/r_SELECT_list.html ([13e61](https://github.com/JSQLParser/JSqlParser/commit/13e61a726a87c2f) Andreas Reichel)  
--  Redshift `APPROXIMATE` Aggregate functions ([e4ece](https://github.com/JSQLParser/JSqlParser/commit/e4ece0c3ecd7ce3) Andreas Reichel)  
--  add `CCJSqlParserUtil.sanitizeSingleSql(String sqlStr)` to help MyBatikPlus users to clean their statements ([1606e](https://github.com/JSQLParser/JSqlParser/commit/1606e5f0492a485) Andreas Reichel)  
--  return any `UnsupportedStatement` content ([063d2](https://github.com/JSQLParser/JSqlParser/commit/063d2442d82f920) Andreas Reichel)  
--  re-enable `UnsupportedStatement` ([82b45](https://github.com/JSQLParser/JSqlParser/commit/82b459bfcd23851) Andreas Reichel)  
--  better statement error recovery ([b3d3a](https://github.com/JSQLParser/JSqlParser/commit/b3d3a8e492f74a8) Andreas Reichel)  
--  Syntax Sugar for the parser features ([1d943](https://github.com/JSQLParser/JSqlParser/commit/1d9438e7ef1a86f) Andreas Reichel)  
--  allow `EXTRACT` to be parsed as regular function also ([b85dc](https://github.com/JSQLParser/JSqlParser/commit/b85dc2fd0004652) Andreas Reichel)  
--  syntax sugar ([a3858](https://github.com/JSQLParser/JSqlParser/commit/a38581acd538d95) Andreas Reichel)  
--  syntax sugar ([df7c7](https://github.com/JSQLParser/JSqlParser/commit/df7c792184c61a6) Andreas Reichel)  
--  Syntax sugar ([67bfa](https://github.com/JSQLParser/JSqlParser/commit/67bfae673421d7c) Andreas Reichel)  
--  syntax sugar ([b0317](https://github.com/JSQLParser/JSqlParser/commit/b03170e180175b1) Andreas Reichel)  
--  syntax sugar ([57a29](https://github.com/JSQLParser/JSqlParser/commit/57a296b2c8c5bb0) Andreas Reichel)  
--  remove Aliases of `ParenthesedSelect`, `LateralSubSelect` and `ParenthesedFromItem` from the Table Names ([46682](https://github.com/JSQLParser/JSqlParser/commit/466826b9b115cb7) Andreas Reichel)  
--  better access to the `DataType` checks ([edeaf](https://github.com/JSQLParser/JSqlParser/commit/edeafc311c2ab7e) Andreas Reichel)  
--  Add Data Type information to task for making it easy to understand the expected return type ([31c55](https://github.com/JSQLParser/JSqlParser/commit/31c5533f49776c6) Andreas Reichel)  
--  Implicit Casts `SELECT DOUBLE PRECISION '1'` ([411a3](https://github.com/JSQLParser/JSqlParser/commit/411a3da9facf206) Andreas Reichel)  
--  Function Column Aliases without an Alias Name `func(x) (a, b, c)` ([b4ef7](https://github.com/JSQLParser/JSqlParser/commit/b4ef763614bf3a4) Andreas Reichel)  
--  Support BigQuery specific Aggregate clauses ([0179c](https://github.com/JSQLParser/JSqlParser/commit/0179cc0cac9ceeb) Andreas Reichel)  
--  syntax sugar for Binary Expressions like Conact, Addition, Multiplication ([ffdde](https://github.com/JSQLParser/JSqlParser/commit/ffddeef7199a056) Andreas Reichel)  
--  Hex to Long conversion ([620db](https://github.com/JSQLParser/JSqlParser/commit/620db709e48c22e) Andreas Reichel)  
--  syntax sugar for Expressions ([a5693](https://github.com/JSQLParser/JSqlParser/commit/a56934da1d3a7ae) Andreas Reichel)  
--  Salesforce SOQL `INCLUDES` and `EXCLUDES` operators (#1985) ([f3f0e](https://github.com/JSQLParser/JSqlParser/commit/f3f0e051358a493) lucarota)  
--  Google BigQuery `CAST` with `FORMAT` clause ([0d813](https://github.com/JSQLParser/JSqlParser/commit/0d813f03faa2b3b) Andreas Reichel)  
--  DuckDB Lambda Functions ([23679](https://github.com/JSQLParser/JSqlParser/commit/236793aaeabc30f) Andreas Reichel)  
--  DuckDB `STRUCT` with curly brackets and explicit Column Type Cast ([1cd57](https://github.com/JSQLParser/JSqlParser/commit/1cd576b32c774e8) Andreas Reichel)  
--  `RECURSIVE` does not need to be a reserved ([5cb4c](https://github.com/JSQLParser/JSqlParser/commit/5cb4c55067f4fe2) Andreas Reichel)  
--  DuckDB `STRUCT` with curly brackets ([339d6](https://github.com/JSQLParser/JSqlParser/commit/339d6baece2c199) Andreas Reichel)  
--  BigQuery `STRUCT` data types and literal ([4c187](https://github.com/JSQLParser/JSqlParser/commit/4c187d51055a3d8) Andreas Reichel)  
--  TablesNamesFinder can return also references to WITH items ([9d645](https://github.com/JSQLParser/JSqlParser/commit/9d64511239a4514) Andreas Reichel)  
--  allow double-quoted `DateTimeLiteral` like `DATETIME "2005-01-03 12:34:56"` ([f6790](https://github.com/JSQLParser/JSqlParser/commit/f6790913b754850) Andreas Reichel)  
--  support `DATETIME` literal used for Google BigQuery ([a386d](https://github.com/JSQLParser/JSqlParser/commit/a386d297c418921) Andreas Reichel)  
--  link `TOP` to AST node ([79c42](https://github.com/JSQLParser/JSqlParser/commit/79c42ed31eb6986) Andreas Reichel)  
-
-### Bug Fixes
-
--  `AllTableColumns`, DuckDB specific `EXCLUDE` ([c9ecf](https://github.com/JSQLParser/JSqlParser/commit/c9ecfc6ddbdd139) Andreas Reichel)  
--  `AllColumns` Replacement shall be about Columns only ([f4b40](https://github.com/JSQLParser/JSqlParser/commit/f4b40e43a4f8d3d) Andreas Reichel)  
--  `FromItem` with Alias without `AS` keyword ([5f580](https://github.com/JSQLParser/JSqlParser/commit/5f580af190c6fbb) Andreas Reichel)  
--  set `stringValue` in `DoubleValue.setValue` (#2009) ([e07f8](https://github.com/JSQLParser/JSqlParser/commit/e07f8d019ddf38d) Damian)  
--  try working around `UnsupportedStatement` issue ([fbe97](https://github.com/JSQLParser/JSqlParser/commit/fbe97a8deb84ae9) Andreas Reichel)  
--  allow `BASE64` keyword ([7daf7](https://github.com/JSQLParser/JSqlParser/commit/7daf7af36d825f7) Andreas Reichel)  
--  `StructType` expressions must use Visitor instead of `toString()` ([b95d8](https://github.com/JSQLParser/JSqlParser/commit/b95d8e3e4ee01b0) Andreas Reichel)  
--  `AnyComparisionItem` with extra brackets ([4e1a1](https://github.com/JSQLParser/JSqlParser/commit/4e1a1535f4ef706) Andreas Reichel)  
--  `FOR UPDATE` clause should come after the select body ([cf7fe](https://github.com/JSQLParser/JSqlParser/commit/cf7fe157de372f3) Andreas Reichel)  
--  initialise the `SelectDeparser` with an `ExpressionDeparser` (but not with an empty Adaptor only) ([f417c](https://github.com/JSQLParser/JSqlParser/commit/f417c8f248c7bb1) Andreas Reichel)  
--  `ALTER ...` shall `captureRest()` only to the next statement terminator ([15d14](https://github.com/JSQLParser/JSqlParser/commit/15d14ab0b9dcadf) Andreas Reichel)  
--  correct the wrong Assertion ([8461e](https://github.com/JSQLParser/JSqlParser/commit/8461e8ad1a3f5e3) Andreas Reichel)  
--  don't insert space after certain punctuation ([159c2](https://github.com/JSQLParser/JSqlParser/commit/159c28ee8f68cab) Andreas Reichel)  
--  treat Array Brackets `[..]` as syntax characters and surround by space when normalizing for comparison ([c9d1e](https://github.com/JSQLParser/JSqlParser/commit/c9d1eaefca91c6e) Andreas Reichel)  
--  `REGEXP` does not need to be reserved ([f6524](https://github.com/JSQLParser/JSqlParser/commit/f65240f381f9855) Andreas Reichel)  
--  `REGEXP` does not need to be reserved ([a9e67](https://github.com/JSQLParser/JSqlParser/commit/a9e67667b9c1590) Andreas Reichel)  
--  Array Arguments without `ARRAY` keyword ([0f9a8](https://github.com/JSQLParser/JSqlParser/commit/0f9a8ec02786f5d) Andreas Reichel)  
--  Function with Array Arguments ([f782e](https://github.com/JSQLParser/JSqlParser/commit/f782eda7afa17d3) Andreas Reichel)  
--  parsing `SelectItem` shall support `Xor` ([c8839](https://github.com/JSQLParser/JSqlParser/commit/c883920a1175ffc) Andreas Reichel)  
-
-### Other changes
-
-**switched to version 5.0-SNAPSHOT**
-
-
-[275e0](https://github.com/JSQLParser/JSqlParser/commit/275e0c0627bb8a2) Tobias Warneke *2024-06-30 20:26:08*
-
-**corrected license header**
-
-
-[5fb9f](https://github.com/JSQLParser/JSqlParser/commit/5fb9f568684ace1) Tobias Warneke *2024-06-30 20:21:47*
-
-**corrected license header**
-
-
-[456d5](https://github.com/JSQLParser/JSqlParser/commit/456d53b09c48f77) Tobias Warneke *2024-06-30 20:02:41*
-
-**support custom DeParser (#2013)**
-
-
-[74793](https://github.com/JSQLParser/JSqlParser/commit/7479342dd95125a) Redkale *2024-05-29 06:02:40*
-
-**Add missing java.sql require (#1999)**
-
-* Add missing java.sql 
-* Update maven checkstyle 
-* Fix gradle checkstyle 
-* Bump surefire plugin 
-* Skip modules in tests 
-
-[df48c](https://github.com/JSQLParser/JSqlParser/commit/df48c4ba5b2b44f) Ethan McCue *2024-04-30 05:13:54*
-
-**Add module info (#1998)**
-
-* Add module info 
-* Trailing newline 
-
-[761b4](https://github.com/JSQLParser/JSqlParser/commit/761b45b2f6c4b81) Ethan McCue *2024-04-30 04:36:41*
-
-****
-
-
-[89ac0](https://github.com/JSQLParser/JSqlParser/commit/89ac0fc3c0af712) Tobias Warneke *2024-03-09 22:12:33*
-
-
-## jsqlparser-4.9 (2024-03-09)
-
-### Features
-
--  add DB2 special register `CURRENT TIMEZONE` ([c412d](https://github.com/JSQLParser/JSqlParser/commit/c412d6a52f9b2ea) Andreas Reichel)  
--  add additional CREATE VIEW modifiers (#1964) ([67e22](https://github.com/JSQLParser/JSqlParser/commit/67e220425f24148) David Goss)  
--  with no log (#1953) ([d9c44](https://github.com/JSQLParser/JSqlParser/commit/d9c44499d096b1f) mjh)  
--  support keyword "only" for postgresql (#1952) ([f1676](https://github.com/JSQLParser/JSqlParser/commit/f1676dd992911d9) 猫屎咖啡)  
--  support any number/order of merge operations (#1938) ([f1c52](https://github.com/JSQLParser/JSqlParser/commit/f1c525a1eaf3087) David Goss)  
-
-### Bug Fixes
-
--  chained function calls of `SimpleFunction` ([98055](https://github.com/JSQLParser/JSqlParser/commit/9805581accf89d2) Andreas Reichel)  
--  issue #1948 `Between` with expression ([b9453](https://github.com/JSQLParser/JSqlParser/commit/b9453f228adf9ad) Andreas Reichel)  
--  return NULL when parsing empty Strings ([94fb8](https://github.com/JSQLParser/JSqlParser/commit/94fb87237f36cce) Andreas Reichel)  
--  allow Parameters like `$1`,`$2` ([17f5f](https://github.com/JSQLParser/JSqlParser/commit/17f5f2ad680dfdb) Andreas Reichel)  
--  allow `DATA` as `ColumnType()` keyword ([72a51](https://github.com/JSQLParser/JSqlParser/commit/72a51e58413a291) Andreas Reichel)  
--  make analytic expression visitor null-safe (#1944) ([768c6](https://github.com/JSQLParser/JSqlParser/commit/768c63f4660509b) David Goss)  
--  Fixes parsing failing for ALTER MODIFY queries not containing datatype (#1961) ([029fd](https://github.com/JSQLParser/JSqlParser/commit/029fd42e84e65ee) Tanish Grover)  
--  tables not find in parentheses join sql. (#1956) ([182f4](https://github.com/JSQLParser/JSqlParser/commit/182f484dc43945b) hancher)  
--  issue1875 (#1957) ([98aa9](https://github.com/JSQLParser/JSqlParser/commit/98aa90cb988580a) mjh)  
--  ExpressionVisitor.visit(AllTableColumns) method isn't being called. (#1942) ([bc166](https://github.com/JSQLParser/JSqlParser/commit/bc16618eaa8fd93) Brian S. O&#x27;Neill)  
-
-### Other changes
-
-****
-
-
-[2319d](https://github.com/JSQLParser/JSqlParser/commit/2319da81bb27f4e) Tobias Warneke *2024-03-09 20:49:14*
-
-**Handle select in ExpressionVisitorAdapter (#1972)**
-
-
-[424a8](https://github.com/JSQLParser/JSqlParser/commit/424a852ac8071d7) Kaartic Sivaraam *2024-02-23 23:32:07*
-
-**Update README.md**
-
-* Fixes  #1968 
-
-[8dcfb](https://github.com/JSQLParser/JSqlParser/commit/8dcfb4a3bf5682d) manticore-projects *2024-02-17 12:03:43*
-
-**Guard Values against null/empty values (#1965)**
-
-* Guard Values against null/empty values 
-* The classes modified by this commit are &#x60;DoubleValue&#x60;, &#x60;LongValue&#x60;, and 
-* &#x60;TimeValue&#x60;. Both &#x60;null&#x60; and empty strings provided to their 
-* constructors fail, but they provide very different error messages 
-* (NullPointerException and StringIndexOutOfBoundsException), which is 
-* neither sensible nor helpful in debugging. 
-* This commit adds a guard to throw &#x60;IllegalArgumentException&#x60; for both 
-* cases in order to improve coherency and usefulness of the error 
-* messages. 
-* fix checkstyle issues 
-
-[b0032](https://github.com/JSQLParser/JSqlParser/commit/b00322efa0c77d2) Heewon Lee *2024-02-14 07:34:40*
-
-**support oracle alter table truncate partition  (#1954)**
-
-* feat: oracle alter table truncate partition 
-* feat: oracle alter table truncate partition 
-* feat: code format 
-* feat: code format 
-* --------- 
-* Co-authored-by: mjh &lt;majh118@chinaunicom.cn&gt; 
-
-[cc7aa](https://github.com/JSQLParser/JSqlParser/commit/cc7aa01913a7201) mjh *2024-02-04 07:19:19*
-
-**Build with Automatic-Module-Name for compatibility with the Java module system. (#1941)**
-
-
-[92e02](https://github.com/JSQLParser/JSqlParser/commit/92e02c6da69d917) Brian S. O&#x27;Neill *2024-01-06 14:04:45*
-
-**Create maven_deploy.yml**
-
-
-[b4070](https://github.com/JSQLParser/JSqlParser/commit/b40705785751b49) Tobias *2023-12-28 22:31:54*
-
-**corrected hopefully maven snapshot deployment**
-
-
-[a70f0](https://github.com/JSQLParser/JSqlParser/commit/a70f0d1f3f3d91e) Tobias Warneke *2023-12-28 22:20:08*
-
-**corrected hopefully maven snapshot deployment**
-
-
-[f0d3a](https://github.com/JSQLParser/JSqlParser/commit/f0d3ab6b42193ae) Tobias Warneke *2023-12-28 22:17:43*
-
-**finally done**
-
-
-[6c1ca](https://github.com/JSQLParser/JSqlParser/commit/6c1caff118f84bd) Tobias Warneke *2023-12-28 00:29:26*
-
-
-## jsqlparser-4.8 (2023-12-28)
-
-### Features
-
--  support mysql with rollup (#1923) ([77f6f](https://github.com/JSQLParser/JSqlParser/commit/77f6fb8c92b3378) jxnu-liguobin)  
--  Support `FOR SHARE` (#1922) ([815f8](https://github.com/JSQLParser/JSqlParser/commit/815f8753d552d89) jxnu-liguobin)  
--  [MySQL] Support `TABLE STATEMENT` (#1921) ([313a4](https://github.com/JSQLParser/JSqlParser/commit/313a4b42444b2d2) jxnu-liguobin)  
--  Support `RENAME INDEX` for MySQL, `RENAME CONSTRAINT` for PostgreSQL (#1920) ([989a8](https://github.com/JSQLParser/JSqlParser/commit/989a84bb215283b) jxnu-liguobin)  
--  Add support comment in `create view` for MySQL and MariaDb (#1913) ([4d47e](https://github.com/JSQLParser/JSqlParser/commit/4d47e0ab7bc2872) jxnu-liguobin)  
--  Add support for `REFRESH MATERIALIZED VIEW` (#1911) ([425c7](https://github.com/JSQLParser/JSqlParser/commit/425c72eb7d7f931) jxnu-liguobin)  
--  `SimpleFunction` for faster parsing of simple, but deep nested functions ([085d7](https://github.com/JSQLParser/JSqlParser/commit/085d7504235e58c) Andreas Reichel)  
--  add support for snowflake merge statements (#1887) ([36b80](https://github.com/JSQLParser/JSqlParser/commit/36b806dede06260) David Goss)  
--  `ColDataType` supports `PUBLIC` schema and all non-restricted keywords for type ([1088d](https://github.com/JSQLParser/JSqlParser/commit/1088db7aea0b2f9) Andreas Reichel)  
--  T-SQL Join Hints ([5f09e](https://github.com/JSQLParser/JSqlParser/commit/5f09ec4914fbdd1) Andreas Reichel)  
--  old TSQL Joins `*=` and `=*` ([0b50d](https://github.com/JSQLParser/JSqlParser/commit/0b50da4cca555b6) Andreas Reichel)  
--  MS SQL Server `Merge` `Output` clause ([7bd42](https://github.com/JSQLParser/JSqlParser/commit/7bd42edaa0d9aed) Andreas Reichel)  
--  MS SQL Server `UPDATE ...` Index Hint ([f919e](https://github.com/JSQLParser/JSqlParser/commit/f919e00c30ff5df) Andreas Reichel)  
--  Postgres `Contains` and `ContainedBy` Operators ([28a4c](https://github.com/JSQLParser/JSqlParser/commit/28a4c080b718aba) Andreas Reichel)  
--  Postgres `Contains` and `ContainedBy` Operators ([09d6d](https://github.com/JSQLParser/JSqlParser/commit/09d6dfe7bc7acb8) Andreas Reichel)  
--  Clickhouse `GLOBAL IN ...` ([ced0d](https://github.com/JSQLParser/JSqlParser/commit/ced0d0090c5c9a9) Andreas Reichel)  
--  `CREATE INDEX IF NOT EXISTS...` ([da13d](https://github.com/JSQLParser/JSqlParser/commit/da13d7dc1dd1608) Andreas Reichel)  
--  support clickhouse global keyword in IN Expression ([a9ed7](https://github.com/JSQLParser/JSqlParser/commit/a9ed79825110df7) hezw)  
-
-### Bug Fixes
-
--  refactor `JsonExpression`, avoiding expensive semantic lookahead and improving performance ([56515](https://github.com/JSQLParser/JSqlParser/commit/56515aba6ca893f) Andreas Reichel)  
--  `GO` shall terminate statement only, when appearing alone on an empty line ([14637](https://github.com/JSQLParser/JSqlParser/commit/14637ce64763b42) Andreas Reichel)  
--  De-Parse Oracle Hints in UPDATE, INSERT, DELETE and MERGE ([aaca0](https://github.com/JSQLParser/JSqlParser/commit/aaca05855f9a11b) Andreas Reichel)  
--  `UpdateSet` shall not have brackets with single element only ([15b9a](https://github.com/JSQLParser/JSqlParser/commit/15b9aef7ca05416) Andreas Reichel)  
--  make `GLOBAL` a restricted keyword, not usable as an Alias ([dd6cf](https://github.com/JSQLParser/JSqlParser/commit/dd6cf23150f4804) Andreas Reichel)  
--  Postgres `NextVal()` function ([e3afa](https://github.com/JSQLParser/JSqlParser/commit/e3afa5fbdebc715) Andreas Reichel)  
--  optional `Expression` in `FETCH` clause ([daee3](https://github.com/JSQLParser/JSqlParser/commit/daee30f7ae88bea) Andreas Reichel)  
--  allow `RAW` as `CreateParameter` ([ecd40](https://github.com/JSQLParser/JSqlParser/commit/ecd40386585a519) Andreas Reichel)  
-
-### Other changes
-
-**problem with old sonatype repo?**
-
-
-[66dd0](https://github.com/JSQLParser/JSqlParser/commit/66dd0cffad8255d) Tobias Warneke *2023-12-28 00:10:08*
-
-**problem with old sonatype repo?**
-
-
-[19bde](https://github.com/JSQLParser/JSqlParser/commit/19bdef65c0e04c3) Tobias Warneke *2023-12-27 22:50:54*
-
-**problem with old sonatype repo?**
-
-
-[d6b4c](https://github.com/JSQLParser/JSqlParser/commit/d6b4cc374db4197) Tobias Warneke *2023-12-27 22:43:59*
-
-**problem with old sonatype repo?**
-
-
-[5ff53](https://github.com/JSQLParser/JSqlParser/commit/5ff53e835e675ea) Tobias Warneke *2023-12-27 00:54:26*
-
-****
-
-
-[6a327](https://github.com/JSQLParser/JSqlParser/commit/6a327b186528d1a) Tobias Warneke *2023-12-26 23:15:57*
-
-**npe in memory leak verifier**
-
-
-[63955](https://github.com/JSQLParser/JSqlParser/commit/639555315180cbf) Tobias Warneke *2023-12-26 23:01:20*
-
-**allow reinitializing of javacc semanticize**
-
-
-[44274](https://github.com/JSQLParser/JSqlParser/commit/44274b252c21cd1) Tobias Warneke *2023-12-26 22:53:28*
-
-**Allowed to build JSqlParser on slower computers by increasing a fixed timeout. This should take machine power into account.**
-
-
-[806d3](https://github.com/JSQLParser/JSqlParser/commit/806d3a39e8f093e) Tobias Warneke *2023-12-26 20:31:48*
-
-**upgraded some plugins**
-
-
-[cff03](https://github.com/JSQLParser/JSqlParser/commit/cff03ca200c674c) Tobias Warneke *2023-12-26 12:59:38*
-
-**upgraded some plugins**
-
-
-[256a1](https://github.com/JSQLParser/JSqlParser/commit/256a1eff904834b) Tobias Warneke *2023-12-25 23:53:18*
-
-**upgraded some plugins**
-
-
-[b2bd0](https://github.com/JSQLParser/JSqlParser/commit/b2bd025b424e472) Tobias Warneke *2023-12-25 23:51:46*
-
-**corrected license header of some files**
-
-
-[23ba3](https://github.com/JSQLParser/JSqlParser/commit/23ba326db05e863) Tobias Warneke *2023-12-25 23:39:37*
-
-**Update sphinx.yml**
-
-
-[2974f](https://github.com/JSQLParser/JSqlParser/commit/2974f4d20e2d785) manticore-projects *2023-12-16 07:13:01*
-
-**Update sphinx.yml**
-
-
-[a35fb](https://github.com/JSQLParser/JSqlParser/commit/a35fbe77b33a07b) manticore-projects *2023-12-16 04:42:01*
-
-**Update build.gradle**
-
-
-[546b3](https://github.com/JSQLParser/JSqlParser/commit/546b3ee00e4c3f8) manticore-projects *2023-12-15 09:14:49*
-
-**Update build.gradle**
-
-
-[48b3a](https://github.com/JSQLParser/JSqlParser/commit/48b3acbeef56b2d) manticore-projects *2023-12-15 09:11:51*
-
-**Closed #1814, mysql and mariadb can use `index type` before `ON` (#1918)**
-
-
-[b0aff](https://github.com/JSQLParser/JSqlParser/commit/b0aff31314a8df4) jxnu-liguobin *2023-12-15 04:56:55*
-
-**Fix conflict (#1915)**
-
-
-[2ae1d](https://github.com/JSQLParser/JSqlParser/commit/2ae1d53e56e45b2) jxnu-liguobin *2023-12-14 07:22:57*
-
-**Fix typo in migration.rst (#1888)**
-
-* Found a typo in the 4.7 migration document. Trivial PR. Please merge. 
-
-[902e4](https://github.com/JSQLParser/JSqlParser/commit/902e4c46f783985) Ed Sabol *2023-11-10 03:05:39*
-
-**Unit tests support multi-os and higher versions of jdk (#1886)**
-
-* fix: tokenBlockPattern support \r\n or \r 
-* test: remove nashorn ignore annotation to support jdk11+ 
-
-[97e92](https://github.com/JSQLParser/JSqlParser/commit/97e9229d15df7d6) human-user *2023-11-08 03:07:04*
-
-**Support for Nested With Clauses Added**
-
-
-[59104](https://github.com/JSQLParser/JSqlParser/commit/59104fd96f29a2e) MathewJoseph31 *2023-09-12 12:01:59*
-
-**Support for Array Contains (&>) and ContainedBy (<&) operator added**
-
-
-[727c7](https://github.com/JSQLParser/JSqlParser/commit/727c732fd217843) MathewJoseph31 *2023-09-12 12:01:20*
-
-**Support for postgres overlap operator && added, natural left/right/full outer joins added**
-
-
-[6955c](https://github.com/JSQLParser/JSqlParser/commit/6955c4391e65a33) MathewJoseph31 *2023-09-12 12:01:15*
-
-**add support for index hints in Update statement for MySQL**
-
-
-[9a67d](https://github.com/JSQLParser/JSqlParser/commit/9a67d1277a0bf80) joeqiao *2022-11-08 01:27:25*
-
-**added support for T-SQL left and right joins (*= and =*)**
-
-
-[786c8](https://github.com/JSQLParser/JSqlParser/commit/786c8fc65858ff6) Nico *2019-01-29 11:11:07*
-
-
-## jsqlparser-4.7 (2023-09-02)
-
-### Breaking changes
-
--  add support for INTERPRET function parsing (#1816) ([180ec](https://github.com/JSQLParser/JSqlParser/commit/180ec68cc9fa7eb) Matteo Sist)  
--  Remove `ItemsList`, `MultiExpressionList`, `Replace` ([14170](https://github.com/JSQLParser/JSqlParser/commit/141708eabc4f2ea) Andreas Reichel)  
--  Consolidate the `ExpressionList`, removing many redundant List alike Classes and Productions ([288b1](https://github.com/JSQLParser/JSqlParser/commit/288b177fe9c8a4c) Andreas Reichel)  
--  remove `SelectExpressionItem` in favor of `SelectItem` ([b9057](https://github.com/JSQLParser/JSqlParser/commit/b9057d2b75cd1d7) Andreas Reichel)  
--  ClickHouse `Select...` ``FINAL` modifier ([4b7f2](https://github.com/JSQLParser/JSqlParser/commit/4b7f21c54c24d04) Andreas Reichel)  
-
-### Features
-
--  H2 BYTEA Values `X'01' '02'` ([54828](https://github.com/JSQLParser/JSqlParser/commit/54828a456a7f192) Andreas Reichel)  
--  BigQuery Except(..) Replace(..) syntax ([4b4ae](https://github.com/JSQLParser/JSqlParser/commit/4b4ae04f44ff18b) Andreas Reichel)  
--  implement a few missing expressions ([04128](https://github.com/JSQLParser/JSqlParser/commit/0412897f9ea809f) Andreas Reichel)  
--  SQL:2016 TABLESAMPLE clause ([4d8a5](https://github.com/JSQLParser/JSqlParser/commit/4d8a512191a4a1b) Andreas Reichel)  
--  add a method checking balanced brackets ([52df3](https://github.com/JSQLParser/JSqlParser/commit/52df32dd8ec2c10) Andreas Reichel)  
--  add support for INTERPRET function parsing (#1816) ([180ec](https://github.com/JSQLParser/JSqlParser/commit/180ec68cc9fa7eb) Matteo Sist)  
--  MySQL `NOT RLIKE`, `NOT REGEXP` expressions ([f1325](https://github.com/JSQLParser/JSqlParser/commit/f132547f56a1edd) Andreas Reichel)  
--  Postgres `NOTNULL` support ([386dc](https://github.com/JSQLParser/JSqlParser/commit/386dc7a0df98f1c) manticore-projects)  
--  `QUALIFY` clause ([75e4d](https://github.com/JSQLParser/JSqlParser/commit/75e4d30747a7e6e) Andreas Reichel)  
--  T-SQL `FOR ...` clause ([8027d](https://github.com/JSQLParser/JSqlParser/commit/8027dbf2cbf9163) Andreas Reichel)  
--  Quoted Identifiers can contain double-quotes (PostgreSQL) ([73c55](https://github.com/JSQLParser/JSqlParser/commit/73c55fda1ac6a42) Andreas Reichel)  
--  functions blocks, parenthesed JSON Expressions ([5263b](https://github.com/JSQLParser/JSqlParser/commit/5263b91f3e555b7) Andreas Reichel)  
--  functions blocks, parenthesed JSON Expressions ([e19dc](https://github.com/JSQLParser/JSqlParser/commit/e19dc0e081f741d) Andreas Reichel)  
--  parse CREATE TRIGGER as UnsupportedStatement ([64b03](https://github.com/JSQLParser/JSqlParser/commit/64b0331f772278b) Andreas Reichel)  
--  chaining JSON Expressions ([6ef5e](https://github.com/JSQLParser/JSqlParser/commit/6ef5e0b6ee06211) Andreas Reichel)  
--  Write API documentation to the WebSite via XMLDoclet ([c5366](https://github.com/JSQLParser/JSqlParser/commit/c53667f8eff30e3) Andreas Reichel)  
--  `MEMBER OF` condition as shown at https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#operator_member-of ([6e7a7](https://github.com/JSQLParser/JSqlParser/commit/6e7a78dfc563749) Andreas Reichel)  
--  access Elements of Array Columns ([09a70](https://github.com/JSQLParser/JSqlParser/commit/09a70a499121792) Andreas Reichel)  
--  JdbcNamedParameter allows "&" (instead of ":") ([c07a4](https://github.com/JSQLParser/JSqlParser/commit/c07a43b3c128a5d) Andreas Reichel)  
--  Consolidate the `ExpressionList`, removing many redundant List alike Classes and Productions ([288b1](https://github.com/JSQLParser/JSqlParser/commit/288b177fe9c8a4c) Andreas Reichel)  
--  ClickHouse `LIMIT ... BY ...` clause ([4d5e2](https://github.com/JSQLParser/JSqlParser/commit/4d5e26d3febe686) Andreas Reichel)  
--  implement SQL:2016 Convert() and Trim() ([3a27a](https://github.com/JSQLParser/JSqlParser/commit/3a27a9dd4add700) Andreas Reichel)  
--  Switch off contradicting `JOIN` qualifiers, when setting a qualifier ([b6ea8](https://github.com/JSQLParser/JSqlParser/commit/b6ea8b162450545) Andreas Reichel)  
--  Test if a JOIN is an INNER JOIN according to the SQL:2016 ([6281b](https://github.com/JSQLParser/JSqlParser/commit/6281b07a543b088) Andreas Reichel)  
--  ClickHouse `Select...` ``FINAL` modifier ([4b7f2](https://github.com/JSQLParser/JSqlParser/commit/4b7f21c54c24d04) Andreas Reichel)  
--  Multi-Part Names for Variables and Parameters ([9da7a](https://github.com/JSQLParser/JSqlParser/commit/9da7a06ebe9b036) Andreas Reichel)  
--  Oracle `HAVING` before `GROUP BY` ([4efb9](https://github.com/JSQLParser/JSqlParser/commit/4efb99f1510ad16) Andreas Reichel)  
--  Lateral View ([8a1bd](https://github.com/JSQLParser/JSqlParser/commit/8a1bdeccbadb04f) Andreas Reichel)  
--  FETCH uses EXPRESSION ([0979b](https://github.com/JSQLParser/JSqlParser/commit/0979b2e5ea76b8c) Andreas Reichel)  
--  Support more Statement Separators ([b0814](https://github.com/JSQLParser/JSqlParser/commit/b08148414bd8f30) Andreas Reichel)  
--  CREATE VIEW ... REFRESH AUTO... ([1c8d8](https://github.com/JSQLParser/JSqlParser/commit/1c8d8daf48ebac1) Andreas Reichel)  
--  Oracle Alternative Quoting ([c57c4](https://github.com/JSQLParser/JSqlParser/commit/c57c427032c91d0) Andreas Reichel)  
--  make important Classes Serializable ([b94b2](https://github.com/JSQLParser/JSqlParser/commit/b94b2cc6a8f8c7d) Andreas Reichel)  
-
-### Bug Fixes
-
--  ExpressionList of Expressions in `Values` ([994e6](https://github.com/JSQLParser/JSqlParser/commit/994e6c63d065a48) Andreas Reichel)  
--  check for NULL before iterating ([beb68](https://github.com/JSQLParser/JSqlParser/commit/beb68d55239da97) Andreas Reichel)  
--  Backslash escaped single quote `'\''` ([a2975](https://github.com/JSQLParser/JSqlParser/commit/a29754341adeffc) Andreas Reichel)  
--  `INSERT` must use simple Column Names only ([420d7](https://github.com/JSQLParser/JSqlParser/commit/420d7d834760f14) Andreas Reichel)  
--  SPHINX modules and themes ([6f277](https://github.com/JSQLParser/JSqlParser/commit/6f277654b9344ec) Andreas Reichel)  
--  expose IntervalExpression attributes and use DeParser ([b6fab](https://github.com/JSQLParser/JSqlParser/commit/b6fab2a484e0b47) Andreas Reichel)  
--  throw the specific exception ([cb960](https://github.com/JSQLParser/JSqlParser/commit/cb960a35647a19a) Andreas Reichel)  
--  Complex Parsing Approach ([4f048](https://github.com/JSQLParser/JSqlParser/commit/4f0488ccb4611f0) Andreas Reichel)  
--  issue #1789 ([32ec5](https://github.com/JSQLParser/JSqlParser/commit/32ec56114c1fbc4) Andreas Reichel)  
--  issue #1789 ([d20c8](https://github.com/JSQLParser/JSqlParser/commit/d20c8e94de64e2a) Andreas Reichel)  
--  issue #1791 ([88d1b](https://github.com/JSQLParser/JSqlParser/commit/88d1b62f0038a9a) Andreas Reichel)  
--  Java Version 8 ([7cecd](https://github.com/JSQLParser/JSqlParser/commit/7cecd293cf4e0ea) Andreas Reichel)  
--  find the correct position when field belongs to an internal class ([21389](https://github.com/JSQLParser/JSqlParser/commit/21389b712995674) Andreas Reichel)  
--  Remove tests for `()`, since `ParenthesedExpressionList` will catch those too ([905ef](https://github.com/JSQLParser/JSqlParser/commit/905ef6512d592d6) Andreas Reichel)  
--  assign Enum case insensitive ([fc577](https://github.com/JSQLParser/JSqlParser/commit/fc577caa4146878) Andreas Reichel)  
-
-### Other changes
-
-****
-
-
-[d45f2](https://github.com/JSQLParser/JSqlParser/commit/d45f29ef42a6859) Tobias Warneke *2023-09-01 22:07:49*
-
-**Fixing a problem with an OP_CONCAT in WhenExpression (#1837)**
-
-* fix: Concatenation in inner ELSE statement (Second level of Case Expression) 
-* fix: broken tests 
-* fix: Delete lookahead(3) 
-
-[f05cb](https://github.com/JSQLParser/JSqlParser/commit/f05cb7ff4aa46c5) amigalev *2023-08-20 04:43:30*
-
-**Update Gradle JavaCC parser to latest version (3.0.0) (#1843)**
-
-
-[c59a0](https://github.com/JSQLParser/JSqlParser/commit/c59a088dfaee75a) Zbynek Konecny *2023-08-05 22:14:21*
-
-**Update sql-parser-error.md**
-
-
-[41d70](https://github.com/JSQLParser/JSqlParser/commit/41d705bb1036b34) manticore-projects *2023-07-26 00:37:51*
-
-**Update sql-parser-error.md**
-
-
-[812c6](https://github.com/JSQLParser/JSqlParser/commit/812c6cae3a8438b) manticore-projects *2023-07-26 00:37:14*
-
-**Update sql-parser-error.md**
-
-
-[b34d3](https://github.com/JSQLParser/JSqlParser/commit/b34d3c88a881c0f) manticore-projects *2023-07-25 00:09:05*
-
-**Update sphinx.yml**
-
-* fix the FURO theme 
-
-[51cc4](https://github.com/JSQLParser/JSqlParser/commit/51cc444ff98ad1d) manticore-projects *2023-06-01 02:49:23*
-
-**Create gradle.yml**
-
-
-[be7fc](https://github.com/JSQLParser/JSqlParser/commit/be7fc53cff240be) manticore-projects *2023-05-18 10:16:14*
-
-**Update sphinx.yml**
-
-
-[11323](https://github.com/JSQLParser/JSqlParser/commit/11323388ab4abfd) manticore-projects *2023-05-14 13:10:16*
-
-****
-
-
-[0aa8a](https://github.com/JSQLParser/JSqlParser/commit/0aa8a629b9cecc2) Tobias Warneke *2023-04-27 21:18:29*
-
-**Fix #1758: Use long for Feature.timeOut (#1759)**
-
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[3314e](https://github.com/JSQLParser/JSqlParser/commit/3314edf0ea17772) Tomasz Zarna *2023-04-27 20:30:31*
-
-**Ignoring unnecessarily generated jacoco report (#1762)**
-
-* Ignoring unnecessarily generated jacoco report 
-* Ignoring unnecessarily generated by pmd plugin 
-* --------- 
-* Co-authored-by: other &lt;other@ECE-A55006.austin.utexas.edu&gt; 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[1bbb1](https://github.com/JSQLParser/JSqlParser/commit/1bbb1443d84684c) optimizing-ci-builds *2023-04-27 19:50:42*
-
-**Ignoring unnecessarily generated by pmd plugin (#1763)**
-
-* Co-authored-by: other &lt;other@ECE-A55006.austin.utexas.edu&gt; 
-
-[52648](https://github.com/JSQLParser/JSqlParser/commit/52648277e69fa07) optimizing-ci-builds *2023-04-27 19:49:15*
-
-**Refactor Parenthesed SelectBody and FromItem (#1754)**
-
-* 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 &#x60;Conventional Commit&#x60; 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. &#x60;q&#x27;(...)&#x27;&#x60; 
-* - 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&#x3D;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 
-* - &#x60;GO&#x60; 
-* - Slash &#x60;/&#x60; 
-* - Two empty lines 
-* feat: FETCH uses EXPRESSION 
-* - &#x60;FETCH&#x60; uses &#x60;EXPRESSION&#x60; instead of SimpleJDBCParameter only 
-* - Visit/Accept &#x60;FETCH&#x60; &#x60;EXPRESSION&#x60; instead of &#x60;append&#x60; to String 
-* - Visit/Accept &#x60;OFFSET&#x60; &#x60;EXPRESSION&#x60; instead of &#x60;append&#x60; to String 
-* - Gradle: remove obsolete/incompatible &#x60;jvmArgs&#x60; from Test() 
-* style: apply Spotless 
-* test: commit missing test 
-* fix: JSon Operator can use Simple Function 
-* Supports &#x60;Function() -&gt;&gt; Literal&#x60; (although &#x60;Function()&#x60; would not allow Nested Expression Parameters) 
-* fixes #1571 
-* style: Reformat changed files and headers 
-* style: Remove unused variable 
-* feat: Add support for Hangul &quot;\uAC00&quot;-&quot;\uD7A3&quot; 
-* fixes #1747 
-* style: expose &#x60;SetStatement&#x60; key-value list 
-* fixes #1746 
-* style: Appease PMD/Codacy 
-* feat: &#x60;ConflictTarget&#x60; allows multiple &#x60;IndexColumnNames&#x60; 
-* fixes #1749 
-* fixes #1633 
-* fixes #955 
-* doc: fix reference in the Java Doc 
-* build: better Upload Groovy Task 
-* feat: ParenthesedSelectBody and ParenthesedFromItem 
-* - First properly working version 
-* - Work in progress, 13 tests failing 
-* feat: ParenthesedSelectBody and ParenthesedFromItem 
-* - delete unneeded ParenthesedJoin 
-* - rename ParenthesisFromItem into ParenthesedFromItem 
-* feat: ParenthesedSelectBody and ParenthesedFromItem 
-* - fix &#x60;NULLS FIRST&#x60; and &#x60;NULLS LAST&#x60; 
-* feat: ParenthesedSelectBody and ParenthesedFromItem 
-* - fix Oracle Hints 
-* feat: ParenthesedSelectBody and ParenthesedFromItem 
-* - parse &#x60;SetOperation&#x60; only after a (first plain) SelectBody has found, this fixes the performance issue 
-* - one more special Oracle Test succeeds 
-* - 5 remaining test failures 
-* feat: ParenthesedSelectBody and ParenthesedFromItem 
-* - extract &#x60;OrderByElements&#x60; into &#x60;SelectBody&#x60; 
-* - one more special Oracle Test succeeds 
-* - all tests succeed 
-* style: Appease PMD/Codacy 
-* style: Appease PMD/Codacy 
-* feat: Refactor SelectBody implementations 
-* - &#x60;SelectBody&#x60; implements &#x60;FromItem&#x60; 
-* - get rid of &#x60;SubSelect&#x60; and &#x60;SpecialSubSelect&#x60; 
-* - &#x60;Merge&#x60; can use &#x60;FromItem&#x60; instead of &#x60;SubSelect&#x60; or &#x60;Table&#x60; 
-* - &#x60;LateralSubSelect&#x60; extends &#x60;ParenthesedSelectBody&#x60; directly 
-* - Simplify the &#x60;Select&#x60; statement, although it is still redundant since     &#x60;SelectBody&#x60; also could implement &#x60;Statement&#x60; directly 
-* - &#x60;WithItem&#x60; can use &#x60;SelectBody&#x60; directly, which allows for nested &#x60;WithItems&#x60; 
-* BREAKING-CHANGE: Lots of redundant methods and intermediate removed 
-* feat: Refactor SelectBody implementations 
-* - &#x60;SelectBody&#x60; implements &#x60;Statement&#x60; and so makes &#x60;Select&#x60; redundant 
-* - get rid of &#x60;ValuesList&#x60; 
-* - refactor &#x60;ValuesStatement&#x60; into &#x60;Values&#x60; which just implements &#x60;SelectBody&#x60; (and becomes a &#x60;Statement&#x60; and a &#x60;FromItem&#x60;), move to &#x60;select&#x60; package 
-* BREAKING-CHANGE: Lots of redundant methods and intermediate removed 
-* style: Code cleanup 
-* - remove 3 unused/obsolete productions 
-* - appease PMD/Codacy 
-* feat: Merge &#x60;SelectBody&#x60; into &#x60;Select&#x60; Statement 
-* - former &#x60;SelectBody&#x60; implements &#x60;Statement&#x60; and so becomes &#x60;Select&#x60; 
-* - this reduces the AST by 1 hierarchy level 
-* style: Remove unused import 
-* test: @Disabled invalid Test 
-* style: Appease PMD/Codacy 
-* test: Add a SubSelect Parsing Test 
-* --------- 
-* Co-authored-by: zaza &lt;tzarna@gmail.com&gt; 
-
-[a312d](https://github.com/JSQLParser/JSqlParser/commit/a312dcdc2d618f1) manticore-projects *2023-04-27 19:38:24*
-
-****
-
-
-[c1c92](https://github.com/JSQLParser/JSqlParser/commit/c1c92ade94ebe60) Tobias Warneke *2023-04-01 19:54:09*
-
-**Assorted Fixes #7 (#1745)**
-
-* 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 &#x60;Conventional Commit&#x60; 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. &#x60;q&#x27;(...)&#x27;&#x60; 
-* - 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&#x3D;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 
-* - &#x60;GO&#x60; 
-* - Slash &#x60;/&#x60; 
-* - Two empty lines 
-* feat: FETCH uses EXPRESSION 
-* - &#x60;FETCH&#x60; uses &#x60;EXPRESSION&#x60; instead of SimpleJDBCParameter only 
-* - Visit/Accept &#x60;FETCH&#x60; &#x60;EXPRESSION&#x60; instead of &#x60;append&#x60; to String 
-* - Visit/Accept &#x60;OFFSET&#x60; &#x60;EXPRESSION&#x60; instead of &#x60;append&#x60; to String 
-* - Gradle: remove obsolete/incompatible &#x60;jvmArgs&#x60; from Test() 
-* style: apply Spotless 
-* test: commit missing test 
-* fix: JSon Operator can use Simple Function 
-* Supports &#x60;Function() -&gt;&gt; Literal&#x60; (although &#x60;Function()&#x60; would not allow Nested Expression Parameters) 
-* fixes #1571 
-* style: Reformat changed files and headers 
-* style: Remove unused variable 
-* feat: Add support for Hangul &quot;\uAC00&quot;-&quot;\uD7A3&quot; 
-* fixes #1747 
-* style: expose &#x60;SetStatement&#x60; key-value list 
-* fixes #1746 
-* style: Appease PMD/Codacy 
-* feat: &#x60;ConflictTarget&#x60; allows multiple &#x60;IndexColumnNames&#x60; 
-* fixes #1749 
-* fixes #1633 
-* fixes #955 
-* doc: fix reference in the Java Doc 
-* build: better Upload Groovy Task 
-* --------- 
-* Co-authored-by: zaza &lt;tzarna@gmail.com&gt; 
-
-[31ef1](https://github.com/JSQLParser/JSqlParser/commit/31ef1aaf23e2917) manticore-projects *2023-03-21 22:04:58*
-
-**disable xml report (#1748)**
-
-* Co-authored-by: other &lt;other@ECE-A55006.austin.utexas.edu&gt; 
-
-[476d9](https://github.com/JSQLParser/JSqlParser/commit/476d96965492131) optimizing-ci-builds *2023-03-21 21:58:25*
-
-**Assorted Fixes #6 (#1740)**
-
-* 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 &#x60;Conventional Commit&#x60; 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. &#x60;q&#x27;(...)&#x27;&#x60; 
-* - 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&#x3D;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 
-* - &#x60;GO&#x60; 
-* - Slash &#x60;/&#x60; 
-* - Two empty lines 
-* feat: FETCH uses EXPRESSION 
-* - &#x60;FETCH&#x60; uses &#x60;EXPRESSION&#x60; instead of SimpleJDBCParameter only 
-* - Visit/Accept &#x60;FETCH&#x60; &#x60;EXPRESSION&#x60; instead of &#x60;append&#x60; to String 
-* - Visit/Accept &#x60;OFFSET&#x60; &#x60;EXPRESSION&#x60; instead of &#x60;append&#x60; to String 
-* - Gradle: remove obsolete/incompatible &#x60;jvmArgs&#x60; from Test() 
-* style: apply Spotless 
-* test: commit missing test 
-* feat: Unicode CJK Unified Ideographs (Unicode block) 
-* fixes #1741 
-* feat: Unicode CJK Unified Ideographs (Unicode block) 
-* fixes #1741 
-* feat: Functions with nested Attributes 
-* Supports &#x60;SELECT schemaName.f1(arguments).f2(arguments).f3.f4&#x60; and similar constructs 
-* fixes #1742 
-* fixes #1050 
-* --------- 
-* Co-authored-by: zaza &lt;tzarna@gmail.com&gt; 
-
-[adeed](https://github.com/JSQLParser/JSqlParser/commit/adeed5359c65b8f) manticore-projects *2023-03-09 21:22:40*
-
-**version 4.7-SNAPSHOT**
-
-
-[74570](https://github.com/JSQLParser/JSqlParser/commit/745701bfb90a233) Tobias Warneke *2023-02-23 21:41:03*
-
-**Update issue templates**
-
-
-[4aeaf](https://github.com/JSQLParser/JSqlParser/commit/4aeafbc68f0525c) manticore-projects *2023-02-01 01:37:53*
-
-**Update issue templates**
-
-
-[46314](https://github.com/JSQLParser/JSqlParser/commit/46314c41eb06957) manticore-projects *2023-02-01 01:24:35*
-
-**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 
-
-[2ef66](https://github.com/JSQLParser/JSqlParser/commit/2ef6637afffa943) Andreas Reichel *2023-01-21 04:06:00*
-
-**Define Reserved Keywords explicitly**
-
-* Derive All Keywords from Grammar directly 
-* Generate production for Object Names (semi-) automatically 
-* Add parametrized Keyword Tests 
-
-[f49e8](https://github.com/JSQLParser/JSqlParser/commit/f49e828fc9c5f2f) Andreas Reichel *2023-01-21 04:05:51*
-
-**Adjust Gradle to JUnit 5**
-
-* Parallel Test execution 
-* Gradle Caching 
-* Explicitly request for latest JavaCC 7.0.10 
-
-[e960a](https://github.com/JSQLParser/JSqlParser/commit/e960a35e591ce07) Andreas Reichel *2023-01-21 04:05:51*
-
-**Enhanced Keywords**
-
-* Add Keywords and document, which keywords are allowed for what purpose 
-
-[b5321](https://github.com/JSQLParser/JSqlParser/commit/b5321d6e8bac588) Andreas Reichel *2023-01-21 04:05:51*
-
-**Remove unused imports**
-
-
-[a016b](https://github.com/JSQLParser/JSqlParser/commit/a016be0c7f8a46f) Andreas Reichel *2023-01-21 04:05:51*
-
-**Fix test resources**
-
-
-[86f33](https://github.com/JSQLParser/JSqlParser/commit/86f337dbafd10ab) Andreas Reichel *2023-01-21 04:05:51*
-
-**Do not mark SpeedTest for concurrent execution**
-
-
-[67f79](https://github.com/JSQLParser/JSqlParser/commit/67f7951a048a05d) Andreas Reichel *2023-01-21 04:05:51*
-
-**Fix incorrect tests**
-
-
-[5fae2](https://github.com/JSQLParser/JSqlParser/commit/5fae2f5984c3b39) Andreas Reichel *2023-01-21 04:05:51*
-
-**Remove unused imports**
-
-
-[3ba54](https://github.com/JSQLParser/JSqlParser/commit/3ba5410bf052091) Andreas Reichel *2023-01-21 04:05:51*
-
-**Adjust Gradle to JUnit 5**
-
-* Parallel Test execution 
-* Gradle Caching 
-* Explicitly request for latest JavaCC 7.0.10 
-
-[2d51a](https://github.com/JSQLParser/JSqlParser/commit/2d51a82d3e9e51c) Andreas Reichel *2023-01-21 04:05:51*
-
-**Do not mark SpeedTest for concurrent execution**
-
-
-[232af](https://github.com/JSQLParser/JSqlParser/commit/232aff6873f24f9) Andreas Reichel *2023-01-21 04:05:51*
-
-**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. 
-
-[ea447](https://github.com/JSQLParser/JSqlParser/commit/ea4477bb775ebdb) zaza *2023-01-08 20:43:40*
-
-**Fixes #1684: Support CREATE MATERIALIZED VIEW with AUTO REFRESH**
-
-* Support parsing create view statements in Redshift with AUTO REFRESH 
-* option. 
-
-[74715](https://github.com/JSQLParser/JSqlParser/commit/747152a9fc1bfd1) zaza *2022-12-11 20:03:52*
-
-
-## jsqlparser-4.6 (2023-02-23)
-
-### Bug Fixes
-
--  add missing public Getter (#1632) ([d2212](https://github.com/JSQLParser/JSqlParser/commit/d2212776ac5eb83) manticore-projects)  
-
-### Other changes
-
-**actualized release plugin**
-
-
-[9911a](https://github.com/JSQLParser/JSqlParser/commit/9911ad7a990356f) Tobias Warneke *2023-02-23 21:17:52*
-
-**actualized release plugin**
-
-
-[0b2c3](https://github.com/JSQLParser/JSqlParser/commit/0b2c33b29928ec4) Tobias Warneke *2023-02-23 21:16:43*
-
-****
-
-
-[b07f7](https://github.com/JSQLParser/JSqlParser/commit/b07f791b27c3ee4) Tobias Warneke *2023-02-23 19:50:39*
-
-**Update build.gradle**
-
-
-[35233](https://github.com/JSQLParser/JSqlParser/commit/35233882aaffb0e) Tobias *2023-02-17 20:20:25*
-
-**Update README.md**
-
-
-[0b092](https://github.com/JSQLParser/JSqlParser/commit/0b09229a3d92547) Tobias *2023-02-17 16:27:41*
-
-**Oracle Alternative Quoting (#1722)**
-
-* 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 &#x60;Conventional Commit&#x60; 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. &#x60;q&#x27;(...)&#x27;&#x60; 
-* - 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&#x3D;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 
-* - &#x60;GO&#x60; 
-* - Slash &#x60;/&#x60; 
-* - Two empty lines 
-* --------- 
-* Co-authored-by: zaza &lt;tzarna@gmail.com&gt; 
-
-[e71e5](https://github.com/JSQLParser/JSqlParser/commit/e71e57dfe4b377c) manticore-projects *2023-02-07 20:18:52*
-
-**Issue1673 case within brackets (#1675)**
-
-* fix: add missing public Getter 
-* Add public Getter for &#x60;updateSets&#x60; 
-* Fixes #1630 
-* fix: Case within brackets 
-* fixes #1673 
-
-[2ced7](https://github.com/JSQLParser/JSqlParser/commit/2ced7ded930f8b0) manticore-projects *2023-01-31 20:56:01*
-
-**Added support for SHOW INDEX from table (#1704)**
-
-* Added support for SHOW INDEX from table 
-* Added * import 
-* fix for javadoc 
-* added &lt;doclint&gt;none&lt;/doclint&gt; 
-
-[a2618](https://github.com/JSQLParser/JSqlParser/commit/a2618321135d517) Jayant Kumar Yadav *2023-01-31 20:54:05*
-
-****
-
-
-[d33f6](https://github.com/JSQLParser/JSqlParser/commit/d33f6f5a658751d) Tobias Warneke *2023-01-22 15:43:07*
-
-**Sphinx Website (#1624)**
-
-* 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 
-* Keyword test adopt JUnit5 
-* Update keywords 
-* CheckStyle sanitation of method names 
-* Merge Master 
-* Add Jupiter Parameters dependency again 
-* Automate the &#x60;updateKeywords&#x60; Step 
-* Update PMD and rules 
-* Rewrite test expected to fail 
-* Appease Codacy 
-* Remove broken rule warning about perfectly fine switch-case statements 
-* Force Changes 
-* Fix Merge Issues 
-* Read Tokens directly from the Grammar File without invoking JTREE 
-* - read Tokens per REGEX Matcher 
-* - move Reserved Keywords from Grammar into ParserKeywordsUtils 
-* - adjust the Tests 
-* Appease PMD/Codacy 
-* Extract the Keywords from the Grammar by using JTRee (instead of Regex) 
-* Add some tests to ensure, that all Keywords or found 
-* Appease Codacy/PMD 
-* Separate UpdateKeywords Task again 
-* Including it into compileJavacc won&#x27;t work since it depends on compiling the ParserKeywordUtils.java 
-* Single file compilation did not work 
-* Clean-up the imports 
-* Add JavaCC dependency to Maven for building ParserKeywordsUtils 
-* Add JavaCC dependency to Maven for building ParserKeywordsUtils 
-* Merge Upstream 
-* Merge Master 
-* Fixes broken PR #1524 and Commit fb6e950ce0e62ebcd7a44ba9eea679da2b04b2ed 
-* Add AST Visualization 
-* Show the Statement&#x27;s Java Objects in a tree hierarchy 
-* 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 
-* test: Document an additional Special Oracle test success 
-* doc: ignore the autogenerated changelog.rst in GIT 
-* build: temporarily reduce the Code Coverage requirements 
-* Temporarily reduce the Coverage checks regarding Minimum Coverage and Maximum Missed Lines in order to get the Keywords PR accepted. We should do a major Code cleanup afterwards. 
-* build: Clean-up the Gradle Build 
-* Prefix the Sphinx Prolog Variables with JSQLPARSER in order to allow for build the Main Website for various projects 
-* Remove some redundant version requests for PMD, CheckStyle and friends 
-* Remove JUnit-4 dependency and add HarmCrest 
-* Complete the PUBLISHING task 
-* doc: Explain the &#x60;&#x60;updateKeywords&#x60;&#x60; Gradle Task 
-* build: Un-escape the Unicode on the changelog file 
-* build: Un-escape the Unicode on the changelog file 
-* doc: Cleanup 
-* Unescape unicode characters from Git Changelog 
-* Remove obsolete code from Sphinx&#x27; conf.py 
-* doc: Properly un-escape the Git Commit message 
-* doc: request for &#x60;Conventional Commit&#x60; messages 
-* doc: correctly refer to &#x60;RelObjectNameWithoutValue()&#x60; 
-* build: upload the built files via Excec/SFTP 
-* doc: Add an example on Token White-listing 
-* doc: write the correct Git Repository 
-* doc: pronounce the OVERLAPS example more 
-* feat: make important Classes Serializable 
-* Implement Serializable for persisting via ObjectOutputStream 
-* doc: Add the &quot;How to Use&quot; java code 
-* chore: Make Serializable 
-* fix: Non-serializable field in serializable class 
-* build: various fixes to the Maven build file 
-* add the Keywords Documentation file to the task 
-* exclude the Sphinx files from the license header plugin 
-* fix the JavaDoc plugin options 
-* build: add the Keywords Documentation file to the task 
-* doc: add a page about actually Reserved Keywords 
-* build: avoid PMD/Codacy for Sphinx Documentation 
-* update Changelog 
-* build: Add Sphinx GitHub Action 
-* Add a GitHub Action, which will 
-* - Install Sphinx and Extensions 
-* - Install Gradle Wrapper 
-* - Run Gradle Wrapper Task &#x60;sphinx&#x60; 
-* - Deploy the generated static HTML site to GH Pages 
-* fix: fix a merge error, brackets 
-* fix: remove JavaCC dependency 
-* Parse Tokens via Regex 
-* Move JavaCC Token Parser into the KeywordsTest 
-* Make JavaCC a Test Dependency only 
-* doc: Fix Maven Artifact Version 
-* style: Avoid throwing raw exception types. 
-* style: Avoid throwing raw exception types. 
-* 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 
-* build: gradle, execute all Checks after Test 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[be8e7](https://github.com/JSQLParser/JSqlParser/commit/be8e7a8a1d77184) manticore-projects *2023-01-20 21:45:35*
-
-**Assorted Fixes #5 (#1715)**
-
-* refactor: Merge REPLACE into UPSERT 
-* fixes #1706 
-* feat: &#x60;DROP TEMPORARY TABLE ...&#x60; 
-* fixes #1712 
-* build: PMD compliance 
-* ci: Merge master 
-* feat: Configurable backslash &#x60;\&#x60; escaping 
-* - Enables &#x60;\&#x60; as escape character in String Literals (beside SQL:2016 compliant &#x60;&#x27;&#x60;) 
-* - Default is OFF (since its not SQL:2016 compliant) 
-* - Activate per Parser Feature 
-* - Fixes #1638 
-* - Fixes #1209 
-* - Fixes #1173 
-* - Fixes #1172 
-* - Fixes #832 
-* - Fixes #827 
-* - Fixes #578 
-* BREAKING-CHANGE: Backslash Escaping needs to be activated explicitly or else Backslash won&#x27;t work as Escape Character. 
-* style: Checkstyle 
-* style: remove dead code 
-* style: PMD compliance 
-* style: Checkstyle, unused import 
-* feat: allow &#x60;S_CHAR_LITERAL&#x60; to break lines 
-* - fixes #875 
-
-[a00d7](https://github.com/JSQLParser/JSqlParser/commit/a00d77a100bfab7) manticore-projects *2023-01-20 21:32:20*
-
-**Support DROP MATERIALIZED VIEW statements (#1711)**
-
-
-[1af68](https://github.com/JSQLParser/JSqlParser/commit/1af682d436055ad) Tomasz Zarna *2023-01-12 21:37:42*
-
-**corrected readme**
-
-
-[4dfd2](https://github.com/JSQLParser/JSqlParser/commit/4dfd2e43fcdd3ab) Tobias Warneke *2023-01-04 21:07:17*
-
-**Update README.md**
-
-* lgtm removed 
-
-[954b8](https://github.com/JSQLParser/JSqlParser/commit/954b8dd2e760a01) Tobias *2022-12-27 10:34:18*
-
-**Fix #1686: add support for creating views with "IF NOT EXISTS" clause (#1690)**
-
-
-[0f34f](https://github.com/JSQLParser/JSqlParser/commit/0f34f5bc647365d) Tomasz Zarna *2022-12-22 21:52:35*
-
-**Assorted Fixes #4 (#1676)**
-
-* support clickhouse global keyword in join 
-* fix: add missing public Getter 
-* Add public Getter for &#x60;updateSets&#x60; 
-* Fixes #1630 
-* feat: Clickhouse GLOBAL JOIN 
-* All credits to @julianzlzhang 
-* fixes #1615 
-* fixes #1535 
-* feat: IF/ELSE statements supports Block 
-* Make &#x60;If... Else...&#x60; statements work with Blocks 
-* Make &#x60;Statement()&#x60; production work with &#x60;Block()&#x60; 
-* Rewrite the &#x60;Block()&#x60; related Unit Tests 
-* fixes #1682 
-* fix: Revert unintended changes to the Special Oracle Tests 
-* fix: &#x60;SET&#x60; statement supports &#x60;UserVariable&#x60; 
-* Make &#x60;SetStatement&#x60; parse Objects instead of Names only 
-* Add Grammar to accept &#x60;UserVariable&#x60; (e.g. &quot;set @Flag &#x3D; 1&quot;) 
-* Add Test Case for &#x60;UserVariable&#x60; 
-* fixes #1682 
-* feat: Google Spanner Support 
-* Replaces PR #1415, all credit goes to @s13o 
-* Re-arranged some recently added Tokens in alphabetical order 
-* Update Keywords 
-* fix: fix JSonExpression, accept Expressions 
-* Make JSonExpression accept Expressions 
-* Add Testcase 
-* Expose Idents() and Operators() 
-* Fixes #1696 
-* test: add Test for Issue #1237 
-* Co-authored-by: Zhang Zhongliang &lt;zhangzhongliang@xiaomi.com&gt; 
-
-[8d9db](https://github.com/JSQLParser/JSqlParser/commit/8d9db7052c3aeb5) manticore-projects *2022-12-22 21:17:55*
-
-**Fixed download war script in the renderRR task (#1659)**
-
-* Co-authored-by: Hai Chang &lt;haichang@microsoft.com&gt; 
-
-[08a92](https://github.com/JSQLParser/JSqlParser/commit/08a92fcd7b4f7f2) haha1903 *2022-12-10 09:23:53*
-
-**Assorted fixes (#1666)**
-
-* fix: add missing public Getter 
-* Add public Getter for &#x60;updateSets&#x60; 
-* Fixes #1630 
-* feat: LISTAGG() with OVER() clause 
-* fixes issue #1652 
-* fixes 3 more Special Oracle Tests 
-* fix: White-list CURRENT_DATE and CURRENT_TIMESTAMP tokens 
-* allows CURRENT_DATE(3) and CURRENT_TIMESTAMP(3) as regular functions 
-* fixes #1507 
-* fixes #1607 
-* feat: Deparser for Expression Lists 
-* Visit each Expression of a List instead ExpressionList.toString() 
-* fixes #1608 
-* fix: Lookahead needed 
-
-[bff26](https://github.com/JSQLParser/JSqlParser/commit/bff268a7c699947) manticore-projects *2022-11-20 10:06:01*
-
-**Fix parsing statements with multidimensional array PR2 (#1665)**
-
-* Fix parsing statements with multidimensional array 
-* fix: Whitelist LOCKED keyword 
-* Co-authored-by: Andrei Lisouski &lt;alisousk@akamai.com&gt; 
-
-[e1865](https://github.com/JSQLParser/JSqlParser/commit/e186588f044753f) manticore-projects *2022-11-20 09:59:26*
-
-**removed disabled from Keyword tests and imports**
-
-
-[af6c2](https://github.com/JSQLParser/JSqlParser/commit/af6c2702c8a505c) Tobias Warneke *2022-11-02 23:02:38*
-
-**removed disabled from Keyword tests**
-
-
-[89a9a](https://github.com/JSQLParser/JSqlParser/commit/89a9a575fac1ba8) Tobias Warneke *2022-11-02 22:58:19*
-
-****
-
-
-[8a018](https://github.com/JSQLParser/JSqlParser/commit/8a0183311b01d2d) Tobias Warneke *2022-10-28 22:30:25*
-
-****
-
-
-[67de4](https://github.com/JSQLParser/JSqlParser/commit/67de469e585060f) Tobias Warneke *2022-10-25 23:26:28*
-
-**Enhanced Keywords (#1382)**
-
-* 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 
-* Keyword test adopt JUnit5 
-* Update keywords 
-* CheckStyle sanitation of method names 
-* Merge Master 
-* Add Jupiter Parameters dependency again 
-* Automate the &#x60;updateKeywords&#x60; Step 
-* Update PMD and rules 
-* Rewrite test expected to fail 
-* Appease Codacy 
-* Remove broken rule warning about perfectly fine switch-case statements 
-* Force Changes 
-* Fix Merge Issues 
-* Read Tokens directly from the Grammar File without invoking JTREE 
-* - read Tokens per REGEX Matcher 
-* - move Reserved Keywords from Grammar into ParserKeywordsUtils 
-* - adjust the Tests 
-* Appease PMD/Codacy 
-* Extract the Keywords from the Grammar by using JTRee (instead of Regex) 
-* Add some tests to ensure, that all Keywords or found 
-* Appease Codacy/PMD 
-* Separate UpdateKeywords Task again 
-* Including it into compileJavacc won&#x27;t work since it depends on compiling the ParserKeywordUtils.java 
-* Single file compilation did not work 
-* Clean-up the imports 
-* Add JavaCC dependency to Maven for building ParserKeywordsUtils 
-* Add JavaCC dependency to Maven for building ParserKeywordsUtils 
-* Merge Upstream 
-* Merge Master 
-* Fixes broken PR #1524 and Commit fb6e950ce0e62ebcd7a44ba9eea679da2b04b2ed 
-* Add AST Visualization 
-* Show the Statement&#x27;s Java Objects in a tree hierarchy 
-* build: temporarily reduce the Code Coverage requirements 
-* Temporarily reduce the Coverage checks regarding Minimum Coverage and Maximum Missed Lines in order to get the Keywords PR accepted. We should do a major Code cleanup afterwards. 
-* build:  JSQLParser is a build  dependency 
-* chore:  Update keywords 
-* feat: add line count to output 
-
-[4863e](https://github.com/JSQLParser/JSqlParser/commit/4863eb5a8e30a5d) manticore-projects *2022-10-25 23:15:32*
-
-**#1610 Support for SKIP LOCKED tokens on SELECT statements (#1649)**
-
-* Co-authored-by: Lucas Dillmann &lt;lucas.dillmann@totvs.com.br&gt; 
-
-[e6d50](https://github.com/JSQLParser/JSqlParser/commit/e6d50f756e99846) Lucas Dillmann *2022-10-25 22:59:09*
-
-**Assorted fixes (#1646)**
-
-* fix: add missing public Getter 
-* Add public Getter for &#x60;updateSets&#x60; 
-* Fixes #1630 
-* fix: Assorted Fixes 
-* SelectExpressionItem with Function and Complex Parameters 
-* Tables with Oracle DB Links 
-* Make Table Name Parts accessible 
-* Fixes #1644 
-* Fixes #1643 
-* fix: Revert correct test case 
-
-[15ff8](https://github.com/JSQLParser/JSqlParser/commit/15ff84348228278) manticore-projects *2022-10-16 20:15:36*
-
-**actualized multiple dependencies**
-
-
-[34502](https://github.com/JSQLParser/JSqlParser/commit/34502d0e66ad214) Tobias Warneke *2022-09-28 20:17:35*
-
-**Bump h2 from 1.4.200 to 2.1.210 (#1639)**
-
-* Bumps [h2](https://github.com/h2database/h2database) from 1.4.200 to 2.1.210. 
-* - [Release notes](https://github.com/h2database/h2database/releases) 
-* - [Commits](https://github.com/h2database/h2database/compare/version-1.4.200...version-2.1.210) 
-* --- 
-* updated-dependencies: 
-* - dependency-name: com.h2database:h2 
-* dependency-type: direct:development 
-* ... 
-* Signed-off-by: dependabot[bot] &lt;support@github.com&gt; 
-* Signed-off-by: dependabot[bot] &lt;support@github.com&gt; 
-* Co-authored-by: dependabot[bot] &lt;49699333+dependabot[bot]@users.noreply.github.com&gt; 
-
-[fc3c4](https://github.com/JSQLParser/JSqlParser/commit/fc3c4cfd6b1eda9) dependabot[bot] *2022-09-28 19:52:31*
-
-**Support BigQuery SAFE_CAST (#1622) (#1634)**
-
-* Co-authored-by: Zhang, Dequn &lt;deqzhang@paypal.com&gt; 
-
-[d9985](https://github.com/JSQLParser/JSqlParser/commit/d9985ae4f559cda) dequn *2022-09-20 18:22:25*
-
-**Support timestamptz dateliteral (#1621)**
-
-* support timestamptz as datetime literal 
-* rename test 
-
-[81a64](https://github.com/JSQLParser/JSqlParser/commit/81a648eba8db92d) Todd Pollak *2022-08-31 20:31:44*
-
-**fixes #1617**
-
-
-[b0aae](https://github.com/JSQLParser/JSqlParser/commit/b0aae378864c6e1) Tobias Warneke *2022-08-31 20:22:25*
-
-**fixes #419**
-
-
-[427e9](https://github.com/JSQLParser/JSqlParser/commit/427e90f6b861e23) Tobias Warneke *2022-08-31 19:01:57*
-
-**Closes #1604, added simple OVERLAPS support (#1611)**
-
-
-[236a5](https://github.com/JSQLParser/JSqlParser/commit/236a50b800a4794) Rob Audenaerde *2022-08-16 08:21:03*
-
-**Fixes  PR #1524 support hive alter sql (#1609)**
-
-* 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 
-* Fixes broken PR #1524 and Commit fb6e950ce0e62ebcd7a44ba9eea679da2b04b2ed 
-
-[2619c](https://github.com/JSQLParser/JSqlParser/commit/2619ce0a6fd8bd5) manticore-projects *2022-08-14 16:29:18*
-
-**#1524  support hive alter sql : ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]) (#1605)**
-
-* Co-authored-by: zhum@aotain.com &lt;zm7705264&gt; 
-
-[fb6e9](https://github.com/JSQLParser/JSqlParser/commit/fb6e950ce0e62eb) Zhumin-lv-wn *2022-08-03 20:56:44*
-
-**fixes #1581**
-
-
-[732e8](https://github.com/JSQLParser/JSqlParser/commit/732e840e99740ff) Tobias Warneke *2022-07-25 06:43:39*
-
-**Using own Feature - constant for "delete with returning" #1597 (#1598)**
-
-
-[d3218](https://github.com/JSQLParser/JSqlParser/commit/d3218483f7f33ec) gitmotte *2022-07-25 04:55:20*
-
-****
-
-
-[2f491](https://github.com/JSQLParser/JSqlParser/commit/2f4916d3e512e14) Tobias Warneke *2022-07-22 23:19:59*
-
-
-## jsqlparser-4.5 (2022-07-22)
-
-### Other changes
-
-**introduced changelog generator**
-
-
-[e0f0e](https://github.com/JSQLParser/JSqlParser/commit/e0f0eabdfd1e820) Tobias Warneke *2022-07-22 22:47:00*
-
-**fixes #1596**
-
-
-[60d64](https://github.com/JSQLParser/JSqlParser/commit/60d648397b01c2d) Tobias Warneke *2022-07-22 22:31:12*
-
-**integrated test for #1595**
-
-
-[b3927](https://github.com/JSQLParser/JSqlParser/commit/b392733f25468f1) Tobias Warneke *2022-07-19 22:04:18*
-
-****
-
-
-[09830](https://github.com/JSQLParser/JSqlParser/commit/09830c9fb999bc6) Tobias Warneke *2022-07-19 21:44:43*
-
-**reduced time to parse exception to minimize impact on building time**
-
-
-[191b9](https://github.com/JSQLParser/JSqlParser/commit/191b9fd2c796aa1) Tobias Warneke *2022-07-19 21:40:35*
-
-**add support for drop column if exists (#1594)**
-
-
-[fcfdf](https://github.com/JSQLParser/JSqlParser/commit/fcfdfb7458fd28f) rrrship *2022-07-19 21:38:40*
-
-**PostgreSQL INSERT ... ON CONFLICT Issue #1551 (#1552)**
-
-* 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 
-* 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 
-* Support Postgres INSERT ... ON CONFLICT 
-* Fixes #1551 
-* Refactor UpdateSet.toString(), which is used by Insert and Update 
-* Allow KEEP keyword 
-* Enables special Oracle Test keywordasidentifier04.sql, now 191 tests succeed 
-* Sanitize before push 
-* Tweak Grammar in order to survive the Maven Build 
-* Ammend the README 
-* Move Plugin configuration files to the CONFIG folder (hoping, that Codacy will find it there) 
-* Update PMD in the Maven configuration 
-* Update PMD in the Maven and Gradle configuration 
-* Appease Codacy 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[5ae09](https://github.com/JSQLParser/JSqlParser/commit/5ae09ad097c7294) manticore-projects *2022-07-19 21:18:02*
-
-**Configurable Parser Timeout via Feature (#1592)**
-
-* Configurable Parser Timeout via Feature 
-* Fixes #1582 
-* Implement Parser Timeout Feature, e. g. &#x60;CCJSqlParserUtil.parse(sqlStr, parser -&gt; parser.withTimeOut(60000));&#x60; 
-* Add a special test failing after a long time only, to test TimeOut vs. Parser Exception 
-* Appease Codacy 
-* Appease Codacy 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[74000](https://github.com/JSQLParser/JSqlParser/commit/74000130e850788) manticore-projects *2022-07-19 20:48:49*
-
-**fixes #1590**
-
-
-[cfba6](https://github.com/JSQLParser/JSqlParser/commit/cfba6e54df4ed58) Tobias Warneke *2022-07-19 20:26:19*
-
-**fixes #1590**
-
-
-[1abaf](https://github.com/JSQLParser/JSqlParser/commit/1abaf4cdbed1938) Tobias Warneke *2022-07-19 20:17:50*
-
-**extended support Postgres' `Extract( field FROM source)` where `field` is a String instead of a Keyword (#1591)**
-
-* Fixes #1582 
-* Amend the ExtractExpression 
-* Add Test case for issue #1582 
-* Amend the README 
-
-[2b3ce](https://github.com/JSQLParser/JSqlParser/commit/2b3ce25a23b264a) manticore-projects *2022-07-19 19:25:23*
-
-****
-
-
-[87a37](https://github.com/JSQLParser/JSqlParser/commit/87a37d73f29ff55) Tobias Warneke *2022-07-14 19:30:27*
-
-****
-
-
-[26545](https://github.com/JSQLParser/JSqlParser/commit/26545484caa9372) Tobias Warneke *2022-07-14 19:23:39*
-
-**Closes #1579. Added ANALYZE <table> support. (#1587)**
-
-
-[e5c8a](https://github.com/JSQLParser/JSqlParser/commit/e5c8a89ded6d5ca) Rob Audenaerde *2022-07-14 19:22:47*
-
-****
-
-
-[b4a5c](https://github.com/JSQLParser/JSqlParser/commit/b4a5ce1374ab4f1) Tobias Warneke *2022-07-14 19:01:29*
-
-****
-
-
-[b08f2](https://github.com/JSQLParser/JSqlParser/commit/b08f205ea573553) Tobias Warneke *2022-07-14 18:56:19*
-
-**Closes #1583:: Implement Postgresql optional TABLE in TRUNCATE (#1585)**
-
-* Closes #1583 
-* Closes #1583, removed unnecessary local variable. 
-* Closes #1583, proper support for deparsing. 
-
-[26248](https://github.com/JSQLParser/JSqlParser/commit/262482610b80d18) Rob Audenaerde *2022-07-14 18:55:44*
-
-****
-
-
-[6b242](https://github.com/JSQLParser/JSqlParser/commit/6b2422e9cca5d56) Tobias Warneke *2022-07-14 18:53:41*
-
-**Support table option character set and index options (#1586)**
-
-* Support table option character set and index options 
-* Signed-off-by: luofei &lt;luoffei@outlook.com&gt; 
-* move test 
-* Signed-off-by: luofei &lt;luoffei@outlook.com&gt; 
-
-[27cdf](https://github.com/JSQLParser/JSqlParser/commit/27cdfa9ca1237f6) luofei *2022-07-14 18:46:14*
-
-**corrected a last minute bug**
-
-
-[afbaf](https://github.com/JSQLParser/JSqlParser/commit/afbaf53f4d5e727) Tobias Warneke *2022-07-09 15:28:17*
-
-**corrected a last minute bug**
-
-
-[f3d2b](https://github.com/JSQLParser/JSqlParser/commit/f3d2b19dda25d09) Tobias Warneke *2022-07-09 15:25:36*
-
-**corrected a last minute bug**
-
-
-[8378e](https://github.com/JSQLParser/JSqlParser/commit/8378ea4343e1a97) Tobias Warneke *2022-07-09 15:23:50*
-
-**fixes #1576**
-
-
-[48ea0](https://github.com/JSQLParser/JSqlParser/commit/48ea0e2238e8186) Tobias Warneke *2022-07-09 14:26:07*
-
-**added simple test for #1580**
-
-
-[5fdab](https://github.com/JSQLParser/JSqlParser/commit/5fdabf13251b193) Tobias Warneke *2022-07-07 20:13:12*
-
-**disabled test for large cnf expansion and stack overflow problem**
-
-
-[d3000](https://github.com/JSQLParser/JSqlParser/commit/d30005b4486618b) Tobias Warneke *2022-07-07 19:30:37*
-
-**Add test for LikeExpression.setEscape and LikeExpression.getStringExpression (#1568)**
-
-* Add test for LikeExpression.setEscape and LikeExpression.getStringExpression 
-* like + set escape test for $ as escape character 
-
-[bcf6f](https://github.com/JSQLParser/JSqlParser/commit/bcf6ff4157277f9) Caro *2022-07-07 19:27:43*
-
-****
-
-
-[a8a05](https://github.com/JSQLParser/JSqlParser/commit/a8a05535ca6e7c9) Tobias Warneke *2022-07-06 20:22:51*
-
-**add support for postgres drop function statement (#1557)**
-
-
-[964fa](https://github.com/JSQLParser/JSqlParser/commit/964fa49ff25cd46) rrrship *2022-07-06 20:06:09*
-
-****
-
-
-[afbb5](https://github.com/JSQLParser/JSqlParser/commit/afbb595c749d2c2) Tobias Warneke *2022-07-06 19:53:35*
-
-**Add support for Hive dialect GROUPING SETS. (#1539)**
-
-* Add support for Hive GROUPING SETS dialect &#x60;GROUP BY a, b, c GROUPING SETS ((a, b), (a, c))&#x60; 
-* Simplify HiveTest::testGroupByGroupingSets. 
-
-[03c58](https://github.com/JSQLParser/JSqlParser/commit/03c58de9d341a13) chenwl *2022-07-06 19:40:41*
-
-**fixes #1566**
-
-
-[886f0](https://github.com/JSQLParser/JSqlParser/commit/886f06dac867b55) Tobias Warneke *2022-06-28 20:55:12*
-
-**Postgres NATURAL LEFT/RIGHT joins (#1560)**
-
-* Postgres NATURAL LEFT/RIGHT joins 
-* Fixes #1559 
-* Make NATURAL an optional Join Keyword, which can be combined with LEFT, RIGHT, INNER 
-* Add tests 
-* Postgres NATURAL LEFT/RIGHT joins 
-* Amend readme 
-* Revert successful Oracle test 
-
-[74a0f](https://github.com/JSQLParser/JSqlParser/commit/74a0f2fb22e24fe) manticore-projects *2022-06-28 20:15:34*
-
-**compound statement tests (#1545)**
-
-
-[c1c38](https://github.com/JSQLParser/JSqlParser/commit/c1c38fe26b1fe90) Matthew Rathbone *2022-06-08 19:11:08*
-
-**Allow isolation keywords as column name and aliases (#1534)**
-
-
-[fc5a9](https://github.com/JSQLParser/JSqlParser/commit/fc5a9a3dbb91e8e) Tomer Shay (Shimshi) *2022-05-19 21:01:44*
-
-**added github action badge**
-
-
-[e4ec0](https://github.com/JSQLParser/JSqlParser/commit/e4ec041bdcf5683) Tobias *2022-05-16 09:31:36*
-
-**Create maven.yml**
-
-* started maven build using github actions 
-
-[b7e5c](https://github.com/JSQLParser/JSqlParser/commit/b7e5c151df37f5e) Tobias *2022-05-16 09:24:24*
-
-**introduced deparser and toString correction for insert output clause**
-
-
-[51105](https://github.com/JSQLParser/JSqlParser/commit/5110598f0a2a774) Tobias Warneke *2022-05-15 22:07:19*
-
-**revived compilable status after merge**
-
-
-[75489](https://github.com/JSQLParser/JSqlParser/commit/75489bfc3a0355c) Tobias Warneke *2022-05-15 21:29:21*
-
-**INSERT with SetOperations (#1531)**
-
-* INSERT with SetOperations 
-* Simplify the INSERT production 
-* Use SetOperations for Select and Values 
-* Better Bracket handling for WITH ... SELECT ... 
-* Fixes #1491 
-* INSERT with SetOperations 
-* Appease Codazy/PMD 
-* INSERT with SetOperations 
-* Appease Codazy/PMD 
-* Update Readme 
-* List the changes 
-* Minor rephrases 
-* Correct the Maven Artifact Example 
-* Fix the two test cases (missing white space) 
-* Remove unused import 
-
-[b5672](https://github.com/JSQLParser/JSqlParser/commit/b5672c54386cdf8) manticore-projects *2022-05-15 20:29:06*
-
-**#1516 rename without column keyword (#1533)**
-
-* 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 
-* &#x60;RENAME ... TO ...&#x60; without &#x60;COLUMN&#x60; keyword 
-* Fixes #1516 
-
-[e8f07](https://github.com/JSQLParser/JSqlParser/commit/e8f0750d75e74c7) manticore-projects *2022-05-11 20:44:34*
-
-**Add support for `... ALTER COLUMN ... DROP DEFAULT` (#1532)**
-
-
-[de0e8](https://github.com/JSQLParser/JSqlParser/commit/de0e8715ad7cab5) manticore-projects *2022-05-11 20:37:08*
-
-****
-
-
-[81caf](https://github.com/JSQLParser/JSqlParser/commit/81caf3af5eb2762) Tobias Warneke *2022-05-11 20:15:28*
-
-**#1527 DELETE ... RETURNING ... (#1528)**
-
-* #1527 DELETE ... RETURNING ... 
-* Fixes #1527 
-* Add DELETE... RETURNING ... expression 
-* Simplify INSERT ... RETURNING ... expression 
-* Simply UPDATE ... RETURNING ... expression 
-* TSQL Output Clause 
-* According to https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view&#x3D;sql-server-ver15 
-* Implement Output Clause for INSERT, UPDATE and DELETE 
-* Add Tests according the Microsoft Documentation 
-* Appease Codacy/PMD 
-
-[4d815](https://github.com/JSQLParser/JSqlParser/commit/4d8152159454069) manticore-projects *2022-05-11 20:04:23*
-
-**fixs #1520 (#1521)**
-
-
-[f7f9d](https://github.com/JSQLParser/JSqlParser/commit/f7f9d270b13377d) chiangcho *2022-05-11 19:51:47*
-
-****
-
-
-[22fef](https://github.com/JSQLParser/JSqlParser/commit/22fef8c95eddbce) Tobias Warneke *2022-05-11 19:45:25*
-
-**Unsupported statement (#1519)**
-
-* 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 
-* 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 
-* Implement UnsupportedStatement 
-* - Add Feature allowUnsupportedStatement, default&#x3D;false 
-* - Fully implement UnsupportedStatement for the Statement() production 
-* - Partially implement UnsupportedStatement for the Statements() production, works only when UnsupportedStatement comes first 
-* Revert unintended changes of the test resources 
-* Reformat BLOCK production 
-* Disable STATEMENTS() test, which will never fail and add comments to this regard 
-
-[59bb9](https://github.com/JSQLParser/JSqlParser/commit/59bb9a4e40753cf) manticore-projects *2022-05-11 19:23:35*
-
-**fixes #1518**
-
-
-[bc113](https://github.com/JSQLParser/JSqlParser/commit/bc11309777df6b4) Tobias Warneke *2022-04-26 21:06:44*
-
-**Update bug_report.md (#1512)**
-
-* Focus more on the particular SQL Statement and the JSQLParser Version. 
-* Link to the Online Formatter for testing. 
-
-[13441](https://github.com/JSQLParser/JSqlParser/commit/13441f47fbd8023) manticore-projects *2022-04-22 22:29:07*
-
-**changed to allow #1481**
-
-
-[0cc2a](https://github.com/JSQLParser/JSqlParser/commit/0cc2a29c4d7b3ad) Tobias Warneke *2022-04-22 21:56:27*
-
-**Performance Improvements (#1439)**
-
-* 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 
-* Performance Improvements 
-* Simplify the Primary Expression Production 
-* Try to simple parse without Complex Expressions first, before parsing complex and slow (if supported by max nesting depth) 
-* Add Test cases for issues #1397 and #1438 
-* Update Libraries to its latest version 
-* Remove JUnit 4 from Gradle 
-* Appease PMD 
-* Update Gradle Plugins to its latest versions 
-* Let Parser timeout after 6 seconds and fail gently 
-* Add a special test verifying the clean up after timeout 
-* Revert unintended changes to the Test Resources 
-* Appease PMD/Codacy 
-* Correct the Gradle &quot;+&quot; dependencies 
-* Bump version to 4.4.-SNAPSHOT 
-* update build file 
-* revert unwarranted changes in test files 
-* strip the Exception Class Name from the Message 
-* maxDepth &#x3D; 10 collides with the Parser Timeout &#x3D; 6 seconds 
-* License Headers 
-* Unused imports 
-* Bump version to 4.5-SNAPSHOT 
-* Reduce test loops to fit intothe timeout 
-
-[181a2](https://github.com/JSQLParser/JSqlParser/commit/181a21ab90870e1) manticore-projects *2022-04-14 21:18:18*
-
-
-## jsqlparser-4.4 (2022-04-10)
-
-### Other changes
-
-****
-
-
-[00b24](https://github.com/JSQLParser/JSqlParser/commit/00b2440852b847a) Tobias Warneke *2022-04-09 22:43:11*
-
-**Json function Improvements (#1506)**
-
-* 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 
-* Improve JSON Functions 
-* Space around the &#x60;:&#x60; delimiter of JSON Functions 
-* Improve JSON Functions 
-* Enforce &#x60;KEY&#x60; as &#x60;S_CHAR_LITERAL&#x60; 
-* Allow &#x60;Column&#x60; as &#x60;VALUE&#x60; 
-* Temporarily disable Postgres Syntax 
-* Improve JSON Functions 
-* Bring back Postgres Syntax 
-* Enable MySQL Syntax JSON_OBJECT(key, value [, key, value, ...]) 
-* Fix some more tests, where key was not a String 
-* Appease Codacy 
-* Let JSON_OBJECT accept Expressions as value 
-* set Version &#x3D; 4.4-SNAPSHOT 
-
-[e3f53](https://github.com/JSQLParser/JSqlParser/commit/e3f531caf7ad9ba) manticore-projects *2022-04-09 22:37:36*
-
-**fixes #1505**
-
-
-[41c77](https://github.com/JSQLParser/JSqlParser/commit/41c77ca5dd75ae1) Tobias Warneke *2022-04-09 21:16:45*
-
-****
-
-
-[f3fac](https://github.com/JSQLParser/JSqlParser/commit/f3facb762de3ef7) Tobias Warneke *2022-04-09 20:20:23*
-
-**fixes #1502**
-
-
-[fea85](https://github.com/JSQLParser/JSqlParser/commit/fea8575fbed4cbb) Tobias Warneke *2022-04-09 20:10:41*
-
-**Issue1500 - Circular References in `AllColumns` and `AllTableColumns` (#1501)**
-
-* 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 
-* Remove circular reference revealed by issue #1500 
-* Add test for Issue 1500 Circular reference for All Columns Expression 
-* Fix Test case 
-* Add Test for AllTableColumn due to similar circular reference 
-* Remove similar circular reference from AllTableColumn 
-* Update dependencies 
-* Adjust Jacoco Missed Lines count 
-
-[0949d](https://github.com/JSQLParser/JSqlParser/commit/0949df9d789123c) manticore-projects *2022-04-03 18:51:35*
-
-****
-
-
-[62677](https://github.com/JSQLParser/JSqlParser/commit/62677a68fcc5c34) Tobias Warneke *2022-04-02 23:59:19*
-
-**Optimize assertCanBeParsedAndDeparsed (#1389)**
-
-* Optimize assertCanBeParsedAndDeparsed 
-* - Avoid redundant calls of buildSqlString() 
-* - Replace String.replaceAll() with Matcher.replaceAll() based on precompiled Regex Patterns 
-* Reset the testcase results 
-
-[ea316](https://github.com/JSQLParser/JSqlParser/commit/ea3164a1e418f3b) manticore-projects *2022-04-02 22:40:09*
-
-**Add geometry distance operator (#1493)**
-
-* Add support for geometry distance operators in PostGIS. 
-* Fix missing imports. 
-* Co-authored-by: Thomas Powell &lt;tpowell@palantir.com&gt; 
-
-[98c47](https://github.com/JSQLParser/JSqlParser/commit/98c476a6c9fa1a1) Thomas Powell *2022-04-02 22:31:08*
-
-**Support WITH TIES option in TOP #1435 (#1479)**
-
-* Support WITH TIES option in TOP 
-* - Add the support of WITH TIES option in SELECT TOP statement. 
-* add specific test 
-
-[1756a](https://github.com/JSQLParser/JSqlParser/commit/1756adcade48fb4) Olivier Cavadenti *2022-04-02 21:26:54*
-
-**fixes #1482**
-
-
-[7ddb7](https://github.com/JSQLParser/JSqlParser/commit/7ddb7c8e056be6d) Tobias Warneke *2022-03-15 21:51:56*
-
-**fixes #1482**
-
-
-[251cc](https://github.com/JSQLParser/JSqlParser/commit/251cc3c09c477d1) Tobias Warneke *2022-03-15 21:48:13*
-
-**Extending CaseExpression, covering #1458 (#1459)**
-
-* Add unit tests for Case expressions. 
-* More tests for CaseExpression. 
-* Switch expression becomes an Expression instead of a Condition. 
-* It allows complex expressions in the switch, similarly to what is allowed in when clauses. 
-
-[4df13](https://github.com/JSQLParser/JSqlParser/commit/4df1391a28a7402) Mathieu Goeminne *2022-03-15 20:07:43*
-
-**fixes #1471**
-
-
-[3695e](https://github.com/JSQLParser/JSqlParser/commit/3695e0479448ab9) Tobias Warneke *2022-02-18 23:03:24*
-
-**fixes #1471**
-
-
-[e789c](https://github.com/JSQLParser/JSqlParser/commit/e789c9c7869dc27) Tobias Warneke *2022-02-18 22:32:04*
-
-**fixes #1470**
-
-
-[c7075](https://github.com/JSQLParser/JSqlParser/commit/c70758266b5af51) Tobias Warneke *2022-02-06 22:21:12*
-
-**Add support for IS DISTINCT FROM clause (#1457)**
-
-* Co-authored-by: Tomer Shay &lt;tomer@Tomers-MBP.lan&gt; 
-
-[31ed3](https://github.com/JSQLParser/JSqlParser/commit/31ed383ff0f3903) Tomer Shay (Shimshi) *2022-01-18 07:01:14*
-
-**fix fetch present in the end of union query (#1456)**
-
-
-[6e632](https://github.com/JSQLParser/JSqlParser/commit/6e6321481a15965) chiangcho *2022-01-18 07:00:14*
-
-**added SQL_CACHE implementation and changed**
-
-
-[cf012](https://github.com/JSQLParser/JSqlParser/commit/cf0128ac884c2b8) Tobias Warneke *2022-01-09 12:16:39*
-
-**support for db2 with ru (#1446)**
-
-
-[3e976](https://github.com/JSQLParser/JSqlParser/commit/3e976528094e646) chiangcho *2021-12-20 22:50:56*
-
-****
-
-
-[13878](https://github.com/JSQLParser/JSqlParser/commit/1387891cc837f64) Tobias Warneke *2021-12-12 15:37:58*
-
-
-## jsqlparser-4.3 (2021-12-12)
-
-### Other changes
-
-**updated readme.md to show all changes for version 4.3**
-
-
-[f0396](https://github.com/JSQLParser/JSqlParser/commit/f039659d1fb5b35) Tobias Warneke *2021-12-12 15:20:32*
-
-**Adjust Gradle to JUnit 5 (#1428)**
-
-* 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 
-
-[af7bc](https://github.com/JSQLParser/JSqlParser/commit/af7bc1cc06700c3) manticore-projects *2021-11-28 21:43:10*
-
-**corrected some maven plugin versions**
-
-
-[0acb2](https://github.com/JSQLParser/JSqlParser/commit/0acb28fe33bc7df) Tobias Warneke *2021-11-28 21:40:56*
-
-**fixes #1429**
-
-
-[bc891](https://github.com/JSQLParser/JSqlParser/commit/bc891e7dcf1d86d) Tobias Warneke *2021-11-23 06:29:25*
-
-**closes #1427**
-
-
-[46424](https://github.com/JSQLParser/JSqlParser/commit/46424d93784f205) Tobias Warneke *2021-11-21 19:42:11*
-
-**CreateTableTest**
-
-
-[50ef7](https://github.com/JSQLParser/JSqlParser/commit/50ef7edc3ed6bd6) Tobias Warneke *2021-11-21 12:21:21*
-
-**Support EMIT CHANGES for KSQL (#1426)**
-
-* - Add the EMIT CHANGES syntax used in KSQL. 
-
-[f6c17](https://github.com/JSQLParser/JSqlParser/commit/f6c17412accdd18) Olivier Cavadenti *2021-11-21 12:20:56*
-
-**SelectTest.testMultiPartColumnNameWithDatabaseNameAndSchemaName**
-
-
-[d8735](https://github.com/JSQLParser/JSqlParser/commit/d873526fe9f9a38) Tobias Warneke *2021-11-21 12:17:29*
-
-**reformatted test source code**
-
-
-[fb455](https://github.com/JSQLParser/JSqlParser/commit/fb455a7efe1ed04) Tobias Warneke *2021-11-21 12:11:43*
-
-**organize imports**
-
-
-[31921](https://github.com/JSQLParser/JSqlParser/commit/31921285376bb41) Tobias Warneke *2021-11-21 12:09:26*
-
-**replaced all junit 3 and 4 with junit 5 stuff**
-
-
-[2c672](https://github.com/JSQLParser/JSqlParser/commit/2c6724769e76429) Tobias Warneke *2021-11-21 12:03:37*
-
-****
-
-
-[fce5b](https://github.com/JSQLParser/JSqlParser/commit/fce5b9953a5a9c1) Tobias Warneke *2021-11-20 00:08:05*
-
-**Support RESTART without value (#1425)**
-
-* Since Postgre 8.4, RESTART in ALTER SEQUENCE can be set without value. 
-
-[98b66](https://github.com/JSQLParser/JSqlParser/commit/98b66be4b2919df) Olivier Cavadenti *2021-11-20 00:00:32*
-
-**Add support for oracle UnPivot when use multi columns at once. (#1419)**
-
-* Co-authored-by: LeiJun &lt;02280245@yto.net.cn&gt; 
-
-[8e8bb](https://github.com/JSQLParser/JSqlParser/commit/8e8bb708636e6c6) LeiJun *2021-11-19 23:22:29*
-
-****
-
-
-[1fe92](https://github.com/JSQLParser/JSqlParser/commit/1fe92bc61914135) Tobias Warneke *2021-11-19 22:36:41*
-
-**Fix issue in parsing TRY_CAST() function (#1391)**
-
-* Fix issue in parsing TRY_CAST() function 
-* Fix issue in parsing TRY_CAST() function 
-* Add parser, deparser, validator and vistior implementation for try_cast function 
-* Update toString() method of TryCastExpression class 
-
-[bfcf0](https://github.com/JSQLParser/JSqlParser/commit/bfcf00f9dfcc0a3) Prashant Sutar *2021-11-19 22:24:49*
-
-**fixes #1414**
-
-
-[93b8c](https://github.com/JSQLParser/JSqlParser/commit/93b8c8b96d5558d) Tobias Warneke *2021-11-19 22:21:21*
-
-**Add support for expressions (such as columns) in AT TIME ZONE expressions (#1413)**
-
-* Co-authored-by: EverSQL &lt;tomer@eversql.com&gt; 
-
-[ebe17](https://github.com/JSQLParser/JSqlParser/commit/ebe171b3b502089) Tomer Shay (Shimshi) *2021-11-19 22:04:40*
-
-**Add supported for quoted cast expressions for PostgreSQL (#1411)**
-
-* Co-authored-by: EverSQL &lt;tomer@eversql.com&gt; 
-
-[dbbce](https://github.com/JSQLParser/JSqlParser/commit/dbbcebbf0490e1c) Tomer Shay (Shimshi) *2021-11-19 21:54:37*
-
-**added USE SCHEMA <schema> and CREATE OR REPLACE <table> support; things that are allowed in Snowflake SQL (#1409)**
-
-* Co-authored-by: Richard Kooijman &lt;richard.kooijman@inergy.nl&gt; 
-
-[f35d2](https://github.com/JSQLParser/JSqlParser/commit/f35d24cfbb88342) Richard Kooijman *2021-11-19 21:40:45*
-
-**Issue #420 Like Expression with Escape Expression (#1406)**
-
-* Issue #420 Like Expression with Escape Expression 
-* Fixes issue #420 
-* CheckStyle compliance 
-
-[8eaa4](https://github.com/JSQLParser/JSqlParser/commit/8eaa4d2fc243f0a) manticore-projects *2021-11-19 21:38:54*
-
-**fixes #1405 and some junit.jupiter stuff**
-
-
-[9adab](https://github.com/JSQLParser/JSqlParser/commit/9adab8d059685ff) Tobias Warneke *2021-11-19 21:32:23*
-
-**#1401 add junit-jupiter-api (#1403)**
-
-
-[80ff5](https://github.com/JSQLParser/JSqlParser/commit/80ff50e0296c107) gitmotte *2021-11-19 21:10:18*
-
-**Support Postgres Dollar Quotes #1372 (#1395)**
-
-
-[0bd4c](https://github.com/JSQLParser/JSqlParser/commit/0bd4c198e483616) Olivier Cavadenti *2021-11-19 20:32:26*
-
-**Add Delete / Update modifiers for MySQL #1254 (#1396)**
-
-* Add Delete / Update modifiers for MySQL #1254 
-* fix codacy issues + pr return 
-* simplify low_priority 
-
-[7be5d](https://github.com/JSQLParser/JSqlParser/commit/7be5d8e65e23f6e) Olivier Cavadenti *2021-11-19 20:31:00*
-
-**Fixes #1381 (#1383)**
-
-* Allow Complex Expressions as SelectItem 
-
-[cdf0f](https://github.com/JSQLParser/JSqlParser/commit/cdf0f095294b04a) manticore-projects *2021-11-19 20:27:44*
-
-**Allows CASE ... ELSE ComplexExpression (#1388)**
-
-* Fixes #1375 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[60a7d](https://github.com/JSQLParser/JSqlParser/commit/60a7d103853cb5e) manticore-projects *2021-11-02 20:48:39*
-
-**IN() with complex expressions (#1384)**
-
-* IN() with Complex Expressions 
-* Fixes #905 
-* Allow Complex Expressions and multiple SubSelects for the IN() Expression 
-* Tune the Test Coverage 
-* Remove unused import 
-* Reset TEST status 
-
-[c4232](https://github.com/JSQLParser/JSqlParser/commit/c42322440d5fb36) manticore-projects *2021-11-01 21:23:48*
-
-**Fixes #1385 and PR#1380 (#1386)**
-
-* Add another Alias() Keyword related LOOKAHEAD 
-* Fix a Keyword Spelling Error in the Deparser 
-* Remove UNPIVOT from the PARENTHESIS Deparser, as it was an ugly workaround made obsolete by PR #1380 
-
-[8c1eb](https://github.com/JSQLParser/JSqlParser/commit/8c1eba24be61cf0) manticore-projects *2021-10-22 20:19:15*
-
-**Fixes #1369 (#1370)**
-
-* Issue1369 
-* Add test 
-
-[2335e](https://github.com/JSQLParser/JSqlParser/commit/2335ed136e92163) Ben Grabham *2021-10-20 21:44:06*
-
-**Fixes #1371 (#1377)**
-
-* Fixes #1371 
-* Postgres specific JSON_OBJECT syntax supporting: 
-* SELECT json_object(&#x27;{a, 1, b, 2}&#x27;); 
-* SELECT json_object(&#x27;{{a, 1}, {b, 2}}&#x27;); 
-* SELECT json_object(&#x27;{a, b}&#x27;, &#x27;{1,2 }&#x27;); 
-* Improve Test Coverage 
-
-[cbffe](https://github.com/JSQLParser/JSqlParser/commit/cbffe6b58cd0074) manticore-projects *2021-10-20 21:13:54*
-
-**LIMIT OFFSET with Expressions (#1378)**
-
-* Fixes #933 
-
-[a52db](https://github.com/JSQLParser/JSqlParser/commit/a52db54ff61be34) manticore-projects *2021-10-20 21:05:27*
-
-**Oracle Multi Column Drop (#1379)**
-
-* Fixes #1363 
-
-[9ad18](https://github.com/JSQLParser/JSqlParser/commit/9ad18d29efb66a2) manticore-projects *2021-10-20 21:01:04*
-
-**Support alias for UnPivot statement (see discussion #1374) (#1380)**
-
-* - Changed JSqlParserCC.jjt file to add the alias to the UnPivot lexical entity. 
-* - Added Alias to the UnPivot object. 
-* - Improved SelectDeParser to correctly deparse SubSelect&#x27;s UnPivot component. 
-
-[0c0c3](https://github.com/JSQLParser/JSqlParser/commit/0c0c32e9cda0f1a) fabriziodelfranco *2021-10-20 20:18:13*
-
-**Issue1352 (#1353)**
-
-* Fixes #1352 
-* Allow SYSTEM as table- or column- name 
-* Fixes #1352 
-* Allow SYSTEM as tablename 
-* Fixes #1352 
-* Allow SYSTEM as tablename and columnname 
-* Fixes #1352 
-* Allow QUERY as tablename and columnname 
-* Fixes #1352 
-* Allow FULLTEXT as tablename and columnname 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[a8afd](https://github.com/JSQLParser/JSqlParser/commit/a8afd9a4e6a8bc0) manticore-projects *2021-10-09 21:31:45*
-
-**Enhance ALTER TABLE ... DROP CONSTRAINTS ... (#1351)**
-
-* Enhance ALTER TABLE ... DROP CONSTRAINTS ... 
-* Add support for DROP PRIMARY KEY, DROP UNIQUE(...) 
-* Add support for DROP FOREIGN KEY(...) 
-* Fixes #1342 
-* Remove one useless PMD rule 
-* Add more tests 
-* Adjust Test Coverage 
-
-[388b7](https://github.com/JSQLParser/JSqlParser/commit/388b7c3afff4f50) manticore-projects *2021-10-08 23:02:46*
-
-**Function to use AllColumns or AllTableColumns Expression (#1350)**
-
-* Fix a trivial MERGE error from Commit 4797a8d676625fcc6cf8c9e3b403ca120b6a8141 
-* Function use AllColumns or AllTableColumns 
-* Fixes #1346 
-* Remove one useless PMD rule 
-
-[b0ada](https://github.com/JSQLParser/JSqlParser/commit/b0adaa8de1421ea) manticore-projects *2021-10-08 21:58:04*
-
-**Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)**
-
-* Fix a trivial MERGE error from Commit 4797a8d676625fcc6cf8c9e3b403ca120b6a8141 
-* Fixes #1333 
-* Postgres compliant ALTER TABLE ... RENAME TO ... 
-* Postgres compliant ALTER TABLE IF EXISTS ... RENAME TO ... 
-* Postgres compliant ALTER TABLE IF EXISTS ... RENAME TO ... 
-
-[f353e](https://github.com/JSQLParser/JSqlParser/commit/f353ec830deb719) manticore-projects *2021-09-18 11:35:17*
-
-**Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)**
-
-* Fix a trivial MERGE error from Commit 4797a8d676625fcc6cf8c9e3b403ca120b6a8141 
-* Fixes #1333 
-* Postgres compliant ALTER TABLE ... RENAME TO ... 
-* Postgres compliant ALTER TABLE IF EXISTS ... RENAME TO ... 
-* Postgres compliant ALTER TABLE IF EXISTS ... RENAME TO ... 
-
-[5e904](https://github.com/JSQLParser/JSqlParser/commit/5e9045f431d9cc4) manticore-projects *2021-09-18 11:34:50*
-
-**corrected readme to the new snapshot version**
-
-
-[b8867](https://github.com/JSQLParser/JSqlParser/commit/b8867d71c0f29d3) Tobias Warneke *2021-09-08 09:57:36*
-
-
-## jsqlparser-4.2 (2021-09-08)
-
-### Other changes
-
-**introducing test for issue #1328**
-
-
-[56a39](https://github.com/JSQLParser/JSqlParser/commit/56a39a4693a991f) Tobias Warneke *2021-09-07 09:57:20*
-
-**included some distinct check**
-
-
-[1264a](https://github.com/JSQLParser/JSqlParser/commit/1264a2033c0062a) Tobias Warneke *2021-09-07 09:49:48*
-
-**corrected a merge bug**
-
-
-[d53f8](https://github.com/JSQLParser/JSqlParser/commit/d53f8a7fb6b898c) Tobias Warneke *2021-09-07 09:28:35*
-
-**Prepare4.2 (#1329)**
-
-* Implement caching of the Gradle and Maven files 
-* Provided by @YunLemon via PR #1307 
-* Fix CREATE TABLE AS SELECT ... UNION SELECT ... 
-* Provided by @fanchuo via PR #1309 
-* Fix #1316 
-* Add more specific tests verifying the nature of the UpdateSets 
-* Allow &quot;SELECT *&quot; (without FROM) to parse, its a valid SELECT statement 
-* Add the enhancements since Release 4.1 
-* Adjust the Coverage 
-* Improve Test Coverage 
-* Revert the Special Oracle Tests (accidentally set to FAILURE) 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[4797a](https://github.com/JSQLParser/JSqlParser/commit/4797a8d676625fc) manticore-projects *2021-09-07 08:56:12*
-
-**CREATE TABLE AS (...) UNION (...) fails (#1309)**
-
-
-[a7b5c](https://github.com/JSQLParser/JSqlParser/commit/a7b5c2b078e3ebe) François Sécherre *2021-09-07 08:51:01*
-
-**Fixes #1325 (#1327)**
-
-* Removes redundant production Identifier() and uses RelObjectnameWithoutValue() instead for MS SQL Server Hints 
-
-[cf0d7](https://github.com/JSQLParser/JSqlParser/commit/cf0d74f6572d6aa) manticore-projects *2021-09-06 12:09:01*
-
-**Implement Joins with multiple trailing ON Expressions (#1303)**
-
-* Implement Joins with multiple trailing ON Expressions 
-* Fixes #1302 
-* Fixes SpecialOracleTest JOIN17, now 190/273 tests pass 
-* Fixes #1229 
-* Merge MASTER 
-* Refactor the appendTo() method in favour of the traditional toString() 
-* Remove unused imports 
-
-[d18c5](https://github.com/JSQLParser/JSqlParser/commit/d18c59bf845c57d) manticore-projects *2021-09-06 11:34:05*
-
-**Fix Gradle PMD and Checkstyle (#1318)**
-
-* Fixes #1306 
-* Nested Cases with Complex Expressions 
-* Reduce coverage for Java 8 
-* GROUP BY with Complex Expressions 
-* Fixes #1308 
-* Update Sets with Complex Expressions 
-* Fixes #1316 
-* Update Sets with Complex Expressions 
-* Fix existing tests 
-* Add tests for the new functionality 
-* Implement PMD/Codacy recommendations 
-* Add Checkstyle Configuration to Gradle 
-* Add Checkstyle Config files 
-* Fix additional exceptions in Test Sources 
-
-[2e876](https://github.com/JSQLParser/JSqlParser/commit/2e876130b46d087) manticore-projects *2021-09-01 22:01:40*
-
-****
-
-
-[3f2e7](https://github.com/JSQLParser/JSqlParser/commit/3f2e76cf07ba699) Tobias Warneke *2021-08-28 20:59:29*
-
-**Fixes #1306 (#1311)**
-
-* Fixes #1306 
-* Nested Cases with Complex Expressions 
-* Reduce coverage for Java 8 
-* GROUP BY with Complex Expressions 
-* Fixes #1308 
-
-[8f632](https://github.com/JSQLParser/JSqlParser/commit/8f632b92e511b28) manticore-projects *2021-08-28 20:28:55*
-
-**Update sets (#1317)**
-
-* Fixes #1306 
-* Nested Cases with Complex Expressions 
-* Reduce coverage for Java 8 
-* GROUP BY with Complex Expressions 
-* Fixes #1308 
-* Update Sets with Complex Expressions 
-* Fixes #1316 
-* Update Sets with Complex Expressions 
-* Fix existing tests 
-* Add tests for the new functionality 
-* Implement PMD/Codacy recommendations 
-
-[21e5e](https://github.com/JSQLParser/JSqlParser/commit/21e5ebac02822e2) manticore-projects *2021-08-27 21:37:05*
-
-****
-
-
-[50313](https://github.com/JSQLParser/JSqlParser/commit/50313376d5e6554) Tobias Warneke *2021-08-25 21:12:12*
-
-**Special oracle tests (#1279)**
-
-* Allow keywords: LINK, GROUPING() 
-* Deparse ParenthesisFromItem&#x27;s Pivot and UnPivot correctly 
-* Write Test results to the SQL File 
-* Reduce the noise during the test 
-* Update/correct the list of expected passing files 
-* Get the benchmark from the list of expected passing files 
-* There are no Pivots or UnPivots yet, so we will return NULL. 
-* Record the expected Test Results on each SQL Source 
-* Fail the test when any expected success suddenly fails 
-* Improve Test Coverage 
-* Appease Codacy 
-
-[346ee](https://github.com/JSQLParser/JSqlParser/commit/346eea5fbcf2461) manticore-projects *2021-08-09 21:55:00*
-
-**Implements Hierarchical CONNECT_BY_ROOT Operator (#1282)**
-
-* Implements Hierarchical CONNECT_BY_ROOT Operator 
-* Fixes Issue #1269 
-* Resolves some Special Oracle Tests 
-* Improve Test Coverage 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[b6014](https://github.com/JSQLParser/JSqlParser/commit/b60140740aab93e) manticore-projects *2021-08-09 21:53:08*
-
-**Implement Transact-SQL IF ELSE Statement Control Flows. (#1275)**
-
-* Implement Transact-SQL IF ELSE Statement Control Flows. 
-* Fixes #1273 except for Blocks. 
-* Improce Test Coverage 
-* Adjust the required Test Coverage for JDK 8 
-
-[750c3](https://github.com/JSQLParser/JSqlParser/commit/750c30aafe83957) manticore-projects *2021-08-09 21:43:50*
-
-**Add some flexibility to the Alter Statement (#1293)**
-
-* in order to allow: 
-* ALTER TABLE ... MOVE TABLESPACE ... 
-* ALTER TABLE ... COMPRESS NOLOGGING 
-* ALTER TABLE ... ROWFORMAT&#x3D;DYNAMIC 
-* Fixes #1033 
-
-[a88e9](https://github.com/JSQLParser/JSqlParser/commit/a88e921970c57b8) manticore-projects *2021-08-02 20:51:19*
-
-**Implement Oracle's Alter System (#1288)**
-
-
-[4ac5a](https://github.com/JSQLParser/JSqlParser/commit/4ac5ab468b1dd1d) manticore-projects *2021-08-02 20:37:40*
-
-**Implement Oracle Named Function Parameters Func( param1 => arg1, ...) (#1283)**
-
-* Fixes #1270 
-
-[c8a5d](https://github.com/JSQLParser/JSqlParser/commit/c8a5d7c3dfc97f4) manticore-projects *2021-08-02 20:32:41*
-
-**Implement Gradle Buildsystem (#1271)**
-
-* Gradle build 
-* implement SpotBugs, PMD and JaCoCo 
-* implement RR diagrams 
-* Move Special Oracle Test resources into the correct package 
-* Implement a basic Gradle/Maven compatibility workaround for the Special Oracle Test 
-* Fix the Gradle Wrapper and add the folder to git 
-
-[6933d](https://github.com/JSQLParser/JSqlParser/commit/6933d86e0fa2d48) manticore-projects *2021-08-02 20:18:48*
-
-**fixes #1272**
-
-
-[48a11](https://github.com/JSQLParser/JSqlParser/commit/48a1133ced7dd19) Tobias Warneke *2021-07-26 21:14:20*
-
-**Allowes JdbcParameter or JdbcNamedParameter for MySQL FullTextSearch (#1278)**
-
-* Fixes issue #1223 
-
-[e6c91](https://github.com/JSQLParser/JSqlParser/commit/e6c91b6a813a1e0) manticore-projects *2021-07-26 21:06:38*
-
-**Fixes #1267 Cast into RowConstructor (#1274)**
-
-* Fixes #1267 Cast into RowConstructor 
-* Improve Test Coverage 
-* Improve Test Coverage 
-* Improve Test Coverage 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[c89cf](https://github.com/JSQLParser/JSqlParser/commit/c89cf21641d672b) manticore-projects *2021-07-26 21:02:19*
-
-****
-
-
-[fecc9](https://github.com/JSQLParser/JSqlParser/commit/fecc95d0ee93100) Tobias Warneke *2021-07-26 20:47:58*
-
-**Separate MySQL Special String Functions accepting Named Argument Separation as this could collide with ComplexExpressionList when InExpression is involved (#1285)**
-
-* Fixes #1284 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[c074a](https://github.com/JSQLParser/JSqlParser/commit/c074a21ad70dd0e) manticore-projects *2021-07-26 20:34:06*
-
-**Implements Oracle RENAME oldTable TO newTable Statement (#1286)**
-
-* Implements Oracle RENAME oldTable TO newTable Statement 
-* Fixes #1253 
-* Implement MariaDB specific syntax 
-* Remove redundant License Headers 
-* Use LinkedHashMap to preserve the order of the Entries 
-* Increase Test Coverage 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[f7f7b](https://github.com/JSQLParser/JSqlParser/commit/f7f7bcd65be8f4c) manticore-projects *2021-07-26 20:26:47*
-
-**Implement Oracle Purge Statement (#1287)**
-
-
-[f86bc](https://github.com/JSQLParser/JSqlParser/commit/f86bc2e432305fb) manticore-projects *2021-07-26 20:18:39*
-
-**included jacoco to allow code coverage for netbeans**
-
-
-[f85b4](https://github.com/JSQLParser/JSqlParser/commit/f85b4b630008d9e) Tobias Warneke *2021-07-18 21:15:14*
-
-**corrected a Lookahead problem**
-
-
-[db90e](https://github.com/JSQLParser/JSqlParser/commit/db90e74f1d5d6e8) Tobias Warneke *2021-07-16 21:31:17*
-
-**Json functions (#1263)**
-
-* Implement Json Aggregate Functions JSON_OBJECTAGG() and JSON_ARRAYAGG() 
-* fix the returned type 
-* Implement JSON_OBJECT and JSON_ARRAY 
-* Solves #1260 and dbeaver/dbeaver/#13141 
-* Better workaround for NULL, NULL NULL ON NULL 
-* Remove the workaround for NULL ON NULL (without expression) 
-* Implement &quot;PMD.MissingBreakInSwitch&quot; in order to appease Codacy 
-* Improve Test Coverage 
-* Improve Test Coverage 
-* KEYs can be SQL Value Expressions 
-* Add another testcase 
-
-[59bf0](https://github.com/JSQLParser/JSqlParser/commit/59bf07f5425ecb4) manticore-projects *2021-07-16 21:24:44*
-
-**fixes #1255**
-
-
-[2c732](https://github.com/JSQLParser/JSqlParser/commit/2c732ad9bfbe34e) Tobias Warneke *2021-07-16 21:12:45*
-
-**Active JJDoc and let it create the Grammar BNF documentation (#1256)**
-
-* Clean-up the Site generation 
-
-[1ecff](https://github.com/JSQLParser/JSqlParser/commit/1ecffd2c1a6e8d8) manticore-projects *2021-07-16 20:38:05*
-
-**Bump commons-io from 2.6 to 2.7 (#1265)**
-
-* Bumps commons-io from 2.6 to 2.7. 
-* --- 
-* updated-dependencies: 
-* - dependency-name: commons-io:commons-io 
-* dependency-type: direct:development 
-* ... 
-* Signed-off-by: dependabot[bot] &lt;support@github.com&gt; 
-* Co-authored-by: dependabot[bot] &lt;49699333+dependabot[bot]@users.noreply.github.com&gt; 
-
-[09898](https://github.com/JSQLParser/JSqlParser/commit/09898107fe6d001) dependabot[bot] *2021-07-14 05:27:57*
-
-**Update README.md**
-
-
-[e6303](https://github.com/JSQLParser/JSqlParser/commit/e630354df1cd0f4) Tobias *2021-07-13 05:34:12*
-
-**Implement DB2 Special Register Date Time CURRENT DATE and CURRENT TIME (#1252)**
-
-* Implement DB2 Special Register Date Time CURRENT DATE and CURRENT TIME 
-* Fixes issue #1249 
-* (Although there are more Special Registers which are not supported yet.) 
-* Make the spaces mandatory 
-* Add 2 more tests 
-
-[05157](https://github.com/JSQLParser/JSqlParser/commit/05157a841897033) manticore-projects *2021-07-13 05:32:38*
-
-**Rename the PMD ruleset configuration file hoping for automatic synchronization with Codacy (#1251)**
-
-* Solves Issue #1220 
-
-[930b7](https://github.com/JSQLParser/JSqlParser/commit/930b7a561876b7e) manticore-projects *2021-07-13 05:28:43*
-
-**corrected .travis.yml**
-
-
-[11124](https://github.com/JSQLParser/JSqlParser/commit/111244ab565a160) Tobias Warneke *2021-07-05 20:57:22*
-
-**corrected .travis.yml**
-
-
-[5cf7e](https://github.com/JSQLParser/JSqlParser/commit/5cf7eeaa6f7074d) Tobias Warneke *2021-07-05 20:52:40*
-
-****
-
-
-[3e0e7](https://github.com/JSQLParser/JSqlParser/commit/3e0e7f38a11fe21) Tobias Warneke *2021-07-05 20:39:11*
-
-**Update README.md**
-
-
-[ec16d](https://github.com/JSQLParser/JSqlParser/commit/ec16d1f68c83063) Tobias *2021-07-05 20:27:41*
-
-**fixes #1250**
-
-
-[9e434](https://github.com/JSQLParser/JSqlParser/commit/9e4341a26be1f7f) Tobias Warneke *2021-07-01 12:24:36*
-
-****
-
-
-[05d68](https://github.com/JSQLParser/JSqlParser/commit/05d684416f338b6) Tobias Warneke *2021-06-30 22:12:00*
-
-
-## jsqlparser-4.1 (2021-06-30)
-
-### Other changes
-
-**fixes #1140**
-
-
-[1a917](https://github.com/JSQLParser/JSqlParser/commit/1a9173f7d65a026) Tobias Warneke *2021-06-30 21:50:28*
-
-**introduced #1248 halfway**
-
-
-[1deea](https://github.com/JSQLParser/JSqlParser/commit/1deeab8b349343f) Tobias Warneke *2021-06-30 21:15:56*
-
-**Savepoint rollback (#1236)**
-
-* Implement SAVEPOINT and ROLLBACK statements, fixes issue #1235 
-* Activate a test which is supported now. 
-
-[2cae6](https://github.com/JSQLParser/JSqlParser/commit/2cae62dbf74a744) manticore-projects *2021-06-30 19:57:56*
-
-**Fixes Function Parameter List Brackets issue #1239 (#1240)**
-
-
-[750f3](https://github.com/JSQLParser/JSqlParser/commit/750f3d1e28fa0d9) manticore-projects *2021-06-30 19:45:32*
-
-****
-
-
-[0ba44](https://github.com/JSQLParser/JSqlParser/commit/0ba44c59fcea1cc) Tobias Warneke *2021-06-30 19:41:44*
-
-**corrected javadoc problem**
-
-
-[f7ea4](https://github.com/JSQLParser/JSqlParser/commit/f7ea4a5040ac7c7) Tobias Warneke *2021-06-27 00:20:35*
-
-**corrected some lookahead problem**
-
-
-[59c2a](https://github.com/JSQLParser/JSqlParser/commit/59c2a9432ee23d7) Tobias Warneke *2021-06-26 23:57:06*
-
-**RESET statement, SET PostgreSQL compatibility (#1104)**
-
-* Support 
-* RESET statement  (https://www.postgresql.org/docs/current/sql-reset.html) 
-* SET [LOCAL|SESSION]  (https://www.postgresql.org/docs/current/sql-set.html) 
-* SET search_path&#x3D;my_schema, public ( https://www.postgresql.org/docs/current/sql-set.html 
-* value New value of parameter. Values can be specified as string constants, identifiers, numbers, or comma-separated lists of these) 
-* Update ResetStatementTest.java 
-* remove Tim Zone token 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[13503](https://github.com/JSQLParser/JSqlParser/commit/13503edff30f06d) Роман Зотов *2021-06-26 22:44:33*
-
-**corrected some lookahead problem**
-
-
-[6711f](https://github.com/JSQLParser/JSqlParser/commit/6711f6043c168f7) Tobias Warneke *2021-06-26 22:42:24*
-
-**Implement Oracle Alter Session Statements (#1234)**
-
-* Implement Oracle Alter Session Statements according to https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_2012.htm 
-* Implement PMD Rule &quot;SwitchStmtsShouldHaveDefault&quot; 
-* Reorganize Test Case imports 
-
-[3a46a](https://github.com/JSQLParser/JSqlParser/commit/3a46a29d6936611) manticore-projects *2021-06-26 22:38:19*
-
-**fixes #1230**
-
-
-[3082d](https://github.com/JSQLParser/JSqlParser/commit/3082de3a689c88e) Tobias Warneke *2021-06-26 22:31:43*
-
-**Support DELETE FROM T1 USING T2 WHERE ... (#1228)**
-
-* Co-authored-by: Francois Secherre &lt;secherre.nospam@gmail.com&gt; 
-
-[96cd4](https://github.com/JSQLParser/JSqlParser/commit/96cd483ab85783d) francois-secherre *2021-06-16 05:27:14*
-
-**Row access support (#1181)**
-
-* Row acess support 
-* Remove IN Left Expression List, replaced by RowConstructor Expression 
-* Remove IN Left Expression List, replaced by RowConstructor Expression 
-* Formatting 
-
-[27e6a](https://github.com/JSQLParser/JSqlParser/commit/27e6a9f0e07320e) Роман Зотов *2021-06-16 05:15:47*
-
-**corrected lookahead problem of PR #1225**
-
-
-[aec76](https://github.com/JSQLParser/JSqlParser/commit/aec76eae23f1edd) Tobias Warneke *2021-06-14 05:27:40*
-
-**Delete queries without from, with a schema identifier fails (#1224)**
-
-* Delete queries without from, with a schema identifier fails 
-* Better tests 
-* Fix style issue 
-* Deparse should match for DELETE WITHOUT FROM queries 
-* Co-authored-by: François Sécherre &lt;francois.secherre@ouicar.fr&gt; 
-
-[d70e1](https://github.com/JSQLParser/JSqlParser/commit/d70e151c0f22f22) François Sécherre *2021-06-14 05:15:15*
-
-**Create temporary table t(c1, c2) as select ... (#1225)**
-
-* Co-authored-by: Francois Secherre &lt;secherre.nospam@gmail.com&gt; 
-
-[b62f1](https://github.com/JSQLParser/JSqlParser/commit/b62f19feb3b497c) francois-secherre *2021-06-14 05:13:13*
-
-**Nested with items (#1221)**
-
-* Nested WithItems, fixes issue #1186 
-* Remove redundant Test 
-* Avoid altering the nb-configuration 
-* Mention Nested WITH CTEs in the readme 
-* Eliminate dead/unused MultiExpression Code 
-
-[8eb3d](https://github.com/JSQLParser/JSqlParser/commit/8eb3d9a586a182e) manticore-projects *2021-06-10 05:50:08*
-
-**Implement GROUP BY () without columns (#1218)**
-
-* Implement GROUP BY () without columns 
-* Migrate GroupByElement to ExpressionList 
-* Also solves issue #1210 automatically 
-* Solves issue #1168, add a test for it. 
-
-[999db](https://github.com/JSQLParser/JSqlParser/commit/999db01658c30f9) manticore-projects *2021-06-03 05:55:35*
-
-**TSQL Compliant NEXT VALUE FOR sequence_id (but keeping the spurious NEXTVAL FOR expression) (#1216)**
-
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[7c212](https://github.com/JSQLParser/JSqlParser/commit/7c21242e893abcd) manticore-projects *2021-06-02 12:35:03*
-
-**Pmd clean up (#1215)**
-
-* Add PMD Annotations in order to avoid useless exceptions for the Deparsers 
-* Add Eclipse Formatter configuration 
-* Fix typo 
-* Replace Comments on empty methods with Class wide PMD Annotation 
-* Do not enforce checkstyle formatting 
-
-[53764](https://github.com/JSQLParser/JSqlParser/commit/537649bf28f641b) manticore-projects *2021-06-02 12:19:32*
-
-**Add support for boolean 'XOR' operator (#1193)**
-
-* Add support for boolean &#x27;XOR&#x27; operator 
-* XorExpression added to the ReflectionModelTest 
-* XorExpression case added to the SelectTest 
-* XorExpression cases added for Validation 
-* Additional tests added for code coverage. 
-* Code style fixed. 
-* Separate test case for XOR added. 
-* Imports explicitly added to avoid namespace pollution. 
-* Additional tests cases for precedence and associativity. 
-* Co-authored-by: Szabó Miklós &lt;miklos.szabo@arh.hu&gt; 
-
-[c7832](https://github.com/JSQLParser/JSqlParser/commit/c7832402dded4c0) Adaptive Recognition *2021-06-02 12:10:56*
-
-**Update README.md**
-
-
-[1feea](https://github.com/JSQLParser/JSqlParser/commit/1feea013d865f58) Tobias *2021-05-31 08:46:48*
-
-**Implement WITH for DELETE, UPDATE and MERGE statements (#1217)**
-
-
-[63ed1](https://github.com/JSQLParser/JSqlParser/commit/63ed1a2f42d14e9) manticore-projects *2021-05-31 08:44:08*
-
-****
-
-
-[9184c](https://github.com/JSQLParser/JSqlParser/commit/9184cda558e60a5) Tobias Warneke *2021-05-26 23:12:05*
-
-****
-
-
-[f83ed](https://github.com/JSQLParser/JSqlParser/commit/f83ed0a3a30f6d4) Tobias Warneke *2021-05-26 23:09:08*
-
-****
-
-
-[76bff](https://github.com/JSQLParser/JSqlParser/commit/76bff01b6b4450f) Tobias Warneke *2021-05-26 23:04:41*
-
-**increases complex scanning range**
-
-
-[13b88](https://github.com/JSQLParser/JSqlParser/commit/13b88f7f511107e) Tobias Warneke *2021-05-26 21:38:44*
-
-**Allow Complex Parsing of Functions (#1200)**
-
-* Allow Complex Parsing of Functions 
-* Fixes issues #1190 #1103 
-* Apply Complex Parsing to PrimaryExpression() 
-* Fixes issue #1194 
-* Increase Test Timeout to 2 seconds for slow CI Servers. 
-* Appease Codazy 
-
-[3a5da](https://github.com/JSQLParser/JSqlParser/commit/3a5da445ea9cb85) manticore-projects *2021-05-26 20:35:10*
-
-**Add support for AT TIME ZONE expressions (#1196)**
-
-* Add support for AT TIME ZONE expressions 
-* adding tests 
-* Fixing imports 
-
-[a5204](https://github.com/JSQLParser/JSqlParser/commit/a5204f63ccb1ea8) Tomer Shay (Shimshi) *2021-05-25 23:03:31*
-
-**fixes #1211**
-
-
-[ed089](https://github.com/JSQLParser/JSqlParser/commit/ed089f1f800ece1) Tobias Warneke *2021-05-25 21:52:01*
-
-**fixes #1212**
-
-
-[b8ee7](https://github.com/JSQLParser/JSqlParser/commit/b8ee7526375c9d9) Tobias Warneke *2021-05-25 21:45:01*
-
-****
-
-
-[1c2ac](https://github.com/JSQLParser/JSqlParser/commit/1c2ac7a4e998e76) Tobias Warneke *2021-05-25 21:32:45*
-
-****
-
-
-[68695](https://github.com/JSQLParser/JSqlParser/commit/686958cf0bd758b) Tobias Warneke *2021-05-25 19:42:23*
-
-**Fix Nested CASE WHEN performance, fixes issue #1162 (#1208)**
-
-* Fix Nested CASE WHEN performance, fixes issue #1162 
-* Apease Codazy 
-* Apease Codazy 
-
-[42610](https://github.com/JSQLParser/JSqlParser/commit/426102e4cf272ca) manticore-projects *2021-05-25 19:26:30*
-
-**Add support for casts in json expressions (#1189)**
-
-
-[86b61](https://github.com/JSQLParser/JSqlParser/commit/86b613c72428e0c) Tomer Shay (Shimshi) *2021-05-10 20:00:59*
-
-**fixes #1185**
-
-
-[2320b](https://github.com/JSQLParser/JSqlParser/commit/2320b1baa6e1dea) Tobias Warneke *2021-05-04 21:11:12*
-
-****
-
-
-[53745](https://github.com/JSQLParser/JSqlParser/commit/537452dda91bcc3) Tobias Warneke *2021-05-01 20:57:01*
-
-****
-
-
-[002f5](https://github.com/JSQLParser/JSqlParser/commit/002f5966c577366) Tobias Warneke *2021-05-01 19:57:10*
-
-**supporting/fixing unique inside sql function such as count eg - SELECT count(UNIQUE col2) FROM mytable (#1184)**
-
-* Co-authored-by: Adhikesavan &lt;radhikesavan@paypal.com&gt; 
-
-[f18e9](https://github.com/JSQLParser/JSqlParser/commit/f18e92eaf4b3bc6) RajaSudharsan Adhikesavan *2021-05-01 19:28:05*
-
-**Oracle compliant ALTER TABLE ADD/MODIFY deparser (#1163)**
-
-* javadoc-fixes 
-* fix check-style error : assignment to parameter not allowed 
-* import for javadoc reference 
-* javadoc - add description to parameter &quot;fqn&quot; (fix warning) 
-* remove doclint&#x3D;none, but exclude package with exclude package with 
-* generated sources (javacc/jjtree) from javadoc 
-* Implement Oracle Hints for INSERT, UPDATE, MERGE, DELETE 
-* Correct CreateIndex TailOptions 
-* Add a Test Case for CreateIndex TailOptions 
-* Add WHERE expression to MergeInsert 
-* Add test case for MergeInsert WHERE expression 
-* Fix Issue #1156: ALTER TABLE ADD FOREIGN KEY with schema reference 
-* Add a specific test case 
-* Fix Issue #1157: Oracle does not accept COLUMN keyword in ALTER TABLE ADD/MODIFY 
-* Correct the test cases accepting a non existing COLUMN keyword 
-* Add a specific test cases 
-* Fix Issue #1164 UNIQUE after PRIMARY KEY 
-* Add test case for UNIQUE after PRIMARY KEY 
-* Switch of warnings for un-fixble method namings 
-* Switch of warnings for un-fixble method namings 
-* Activate PMD and define our own ruleset 
-* Execute PMD before building/testing in order to fail early 
-* Fix 63 PMD warnings 
-* Activate rule &quot;PMD.CyclomaticComplexity&quot; in order to simulate the Codazy checks 
-* Apply @SuppressWarnings({&quot;PMD.CyclomaticComplexity&quot;}) where this rule throws an unavoidable warning (especially for toString() and deparse()) 
-* Activate rule , &quot;PMD.ExcessiveMethodLength&quot; in order to simulate the Codazy checks 
-* Apply @SuppressWarnings({&quot;PMD.ExcessiveMethodLength&quot;}) where this rule throws an unavoidable warning (especially for toString() and deparse()) 
-* Refactor an ENUM name 
-* Refactor an ENUM name and reflect this also in the JavaCC Parser definition file 
-* Co-authored-by: gitmotte &lt;www@synbee.at&gt; 
-
-[83837](https://github.com/JSQLParser/JSqlParser/commit/838379f21be0d32) manticore-projects *2021-04-21 07:55:17*
-
-**Pmd (#1165)**
-
-* Implement Oracle Hints for INSERT, UPDATE, MERGE, DELETE 
-* Correct CreateIndex TailOptions 
-* Add a Test Case for CreateIndex TailOptions 
-* Add WHERE expression to MergeInsert 
-* Add test case for MergeInsert WHERE expression 
-* Fix Issue #1156: ALTER TABLE ADD FOREIGN KEY with schema reference 
-* Add a specific test case 
-* Fix Issue #1157: Oracle does not accept COLUMN keyword in ALTER TABLE ADD/MODIFY 
-* Correct the test cases accepting a non existing COLUMN keyword 
-* Add a specific test cases 
-* Fix Issue #1164 UNIQUE after PRIMARY KEY 
-* Add test case for UNIQUE after PRIMARY KEY 
-* Switch of warnings for un-fixble method namings 
-* Switch of warnings for un-fixble method namings 
-* Activate PMD and define our own ruleset 
-* Execute PMD before building/testing in order to fail early 
-* Fix 63 PMD warnings 
-* Activate rule &quot;PMD.CyclomaticComplexity&quot; in order to simulate the Codazy checks 
-* Apply @SuppressWarnings({&quot;PMD.CyclomaticComplexity&quot;}) where this rule throws an unavoidable warning (especially for toString() and deparse()) 
-* Activate rule , &quot;PMD.ExcessiveMethodLength&quot; in order to simulate the Codazy checks 
-* Apply @SuppressWarnings({&quot;PMD.ExcessiveMethodLength&quot;}) where this rule throws an unavoidable warning (especially for toString() and deparse()) 
-* Refactor an ENUM name 
-* Refactor an ENUM name and reflect this also in the JavaCC Parser definition file 
-
-[08cfd](https://github.com/JSQLParser/JSqlParser/commit/08cfd29459044c6) manticore-projects *2021-04-20 08:01:48*
-
-**function order by support (#1108)**
-
-
-[d6ef7](https://github.com/JSQLParser/JSqlParser/commit/d6ef7b995134594) Роман Зотов *2021-04-20 04:16:03*
-
-**fixes #1159**
-
-
-[79e2f](https://github.com/JSQLParser/JSqlParser/commit/79e2f587ee11297) Tobias Warneke *2021-04-16 23:51:24*
-
-**added improvements of pr to readme**
-
-
-[0ef4a](https://github.com/JSQLParser/JSqlParser/commit/0ef4a5c8a105a44) Tobias Warneke *2021-04-16 23:02:51*
-
-**Assorted fixes to the Java CC Parser definition (#1153)**
-
-* Implement Oracle Hints for INSERT, UPDATE, MERGE, DELETE 
-* Correct CreateIndex TailOptions 
-* Add a Test Case for CreateIndex TailOptions 
-* Add WHERE expression to MergeInsert 
-* Add test case for MergeInsert WHERE expression 
-* Fix Issue #1156: ALTER TABLE ADD FOREIGN KEY with schema reference 
-* Add a specific test case 
-
-[5ee6e](https://github.com/JSQLParser/JSqlParser/commit/5ee6ec9dd7a66bf) manticore-projects *2021-04-16 22:51:27*
-
-****
-
-
-[b880e](https://github.com/JSQLParser/JSqlParser/commit/b880e1663ca607f) Tobias Warneke *2021-04-16 22:49:29*
-
-**fixes #1138**
-
-
-[e95f6](https://github.com/JSQLParser/JSqlParser/commit/e95f6ce1c5ecca8) Tobias Warneke *2021-04-10 21:36:07*
-
-**fixes #1138**
-
-
-[cb7a0](https://github.com/JSQLParser/JSqlParser/commit/cb7a018a8c0cd9e) Tobias Warneke *2021-04-10 21:35:53*
-
-**fixes #1137**
-
-
-[9d676](https://github.com/JSQLParser/JSqlParser/commit/9d676b90c6c1e30) Tobias Warneke *2021-04-10 21:23:00*
-
-**fixes #1136**
-
-
-[ba9b8](https://github.com/JSQLParser/JSqlParser/commit/ba9b8d7a6f24274) Tobias Warneke *2021-04-10 21:09:19*
-
-****
-
-
-[f0bec](https://github.com/JSQLParser/JSqlParser/commit/f0bec22644f99e7) Tobias Warneke *2021-03-22 21:21:13*
-
-**issue #1134 adressed**
-
-
-[5d9f4](https://github.com/JSQLParser/JSqlParser/commit/5d9f4fdff2e6ce6) Tobias Warneke *2021-03-20 21:35:05*
-
-**Add support for union_with_brackets_and_orderby (#1131)**
-
-
-[c3a1a](https://github.com/JSQLParser/JSqlParser/commit/c3a1aa688442c1d) Tomer Shay (Shimshi) *2021-03-14 20:10:33*
-
-**Add support for union without brackets and with limit (#1132)**
-
-* add support for union without brackets and with limit 
-* Fixing the last commit. 
-
-[56c2d](https://github.com/JSQLParser/JSqlParser/commit/56c2dfe332b5ee8) Tomer Shay (Shimshi) *2021-03-14 20:09:12*
-
-****
-
-
-[d2f61](https://github.com/JSQLParser/JSqlParser/commit/d2f61d138c2c0e3) Tobias Warneke *2021-03-14 20:04:28*
-
-**Add support for functions in an interval expression (#1099)**
-
-
-[7f8b5](https://github.com/JSQLParser/JSqlParser/commit/7f8b58c1e32a919) Tomer Shay (Shimshi) *2021-03-14 19:55:40*
-
-****
-
-
-[bcc68](https://github.com/JSQLParser/JSqlParser/commit/bcc683ab8791b71) Tobias Warneke *2021-02-06 20:37:50*
-
-****
-
-
-[7deb6](https://github.com/JSQLParser/JSqlParser/commit/7deb6d9bde678d6) Tobias Warneke *2021-02-05 21:59:11*
-
-**subArray support arr[1:3] (#1109)**
-
-
-[cde50](https://github.com/JSQLParser/JSqlParser/commit/cde50692c131fff) Роман Зотов *2021-02-05 21:55:29*
-
-**bug fix (#769)**
-
-* Co-authored-by: Kunal Jha &lt;kjha@zalando-11116.corp.ad.zalando.net&gt; 
-
-[7234d](https://github.com/JSQLParser/JSqlParser/commit/7234de1d65ccf1b) Kunal jha *2021-02-05 17:46:15*
-
-****
-
-
-[089fc](https://github.com/JSQLParser/JSqlParser/commit/089fc44eba26cb1) Tobias Warneke *2021-02-04 19:47:39*
-
-**Array contructor support (#1105)**
-
-* Array contructor support array[[1, 2], [id1, id2]] 
-* ARRAYLITERAL-&gt;ARRAY_LITERAL 
-* Fix empty array 
-* Support ARRAY as DEFAULT value in CREATE TABLE 
-* https://github.com/JSQLParser/JSqlParser/issues/970#issue-594819872 
-* fix empty Array 
-
-[43c28](https://github.com/JSQLParser/JSqlParser/commit/43c282deaa05555) Роман Зотов *2021-02-04 19:28:49*
-
-****
-
-
-[85193](https://github.com/JSQLParser/JSqlParser/commit/8519356a4939816) Tobias Warneke *2021-01-31 22:59:20*
-
-**Partial support construct tuple as simple expression (#1107)**
-
-* SELECT (1,2) 
-
-[2065f](https://github.com/JSQLParser/JSqlParser/commit/2065fedb5b4c318) Роман Зотов *2021-01-31 22:58:08*
-
-**support create table parameters without columns, parameter values any names (#1106)**
-
-* CREATE TEMPORARY TABLE t1 WITH (APPENDONLY&#x3D;true,ORIENTATION&#x3D;column,COMPRESSTYPE&#x3D;zlib,OIDS&#x3D;FALSE) ON COMMIT DROP AS SELECT column FROM t2 
-
-[f2e74](https://github.com/JSQLParser/JSqlParser/commit/f2e74f15cd63d87) Роман Зотов *2021-01-31 22:53:09*
-
-**fixes #995**
-
-
-[d7b46](https://github.com/JSQLParser/JSqlParser/commit/d7b468a651ab966) Tobias Warneke *2021-01-13 19:21:40*
-
-**fixes #1100**
-
-
-[ea31a](https://github.com/JSQLParser/JSqlParser/commit/ea31a0480cea00e) Tobias Warneke *2021-01-13 18:58:16*
-
-**next correction of parenthesis around unions**
-
-
-[5706f](https://github.com/JSQLParser/JSqlParser/commit/5706fb4e1133884) Tobias Warneke *2021-01-11 23:15:21*
-
-****
-
-
-[e2ff2](https://github.com/JSQLParser/JSqlParser/commit/e2ff225132bfedd) Tobias Warneke *2021-01-10 00:13:16*
-
-**fixes #992**
-
-
-[9fd11](https://github.com/JSQLParser/JSqlParser/commit/9fd11563fc86281) Tobias Warneke *2021-01-07 22:34:40*
-
-**corrected patch for case as table name**
-
-
-[f2638](https://github.com/JSQLParser/JSqlParser/commit/f2638ead2f189c2) Tobias Warneke *2021-01-07 21:57:52*
-
-**Added support for the Case keyword in table names (#1093)**
-
-
-[b85a2](https://github.com/JSQLParser/JSqlParser/commit/b85a2003bbd9a1a) Tomer Shay (Shimshi) *2021-01-07 21:43:11*
-
-****
-
-
-[9785b](https://github.com/JSQLParser/JSqlParser/commit/9785b09cd774e14) Tobias Warneke *2021-01-04 06:45:18*
-
-**corrected some javadoc parameter**
-
-
-[449b7](https://github.com/JSQLParser/JSqlParser/commit/449b74a67c50700) Tobias Warneke *2021-01-03 22:16:44*
-
-**added missing pivot test files**
-
-
-[e599b](https://github.com/JSQLParser/JSqlParser/commit/e599bd957b2a70f) Tobias Warneke *2021-01-03 21:07:06*
-
-**fixes #282 - first refactoring to allow with clause as a start in insert and update**
-
-
-[d4402](https://github.com/JSQLParser/JSqlParser/commit/d4402df3ef4978d) Tobias Warneke *2021-01-02 23:57:26*
-
-**fixes #282 - first refactoring to allow with clause as a start in insert and update**
-
-
-[e6d65](https://github.com/JSQLParser/JSqlParser/commit/e6d65ab3808b9cc) Tobias Warneke *2021-01-02 23:56:12*
-
-**Update README.md**
-
-
-[54708](https://github.com/JSQLParser/JSqlParser/commit/5470880139cdc94) Tobias *2021-01-02 08:58:01*
-
-**fixes #887**
-
-
-[74aab](https://github.com/JSQLParser/JSqlParser/commit/74aab7cc81f5665) Tobias Warneke *2021-01-02 00:04:43*
-
-**fixes #1091 - added H2 casewhen function with conditional parameters**
-
-
-[085e1](https://github.com/JSQLParser/JSqlParser/commit/085e120d4221f1a) Tobias Warneke *2021-01-01 23:49:30*
-
-**fixes #1091 - added H2 casewhen function with conditional parameters**
-
-
-[e5e7d](https://github.com/JSQLParser/JSqlParser/commit/e5e7d376fc641a9) Tobias Warneke *2021-01-01 23:46:03*
-
-****
-
-
-[1eaa1](https://github.com/JSQLParser/JSqlParser/commit/1eaa1ba88028f79) Tobias Warneke *2021-01-01 23:18:55*
-
-
-## jsqlparser-4.0 (2021-01-01)
-
-### Other changes
-
-**fixes #961 - allow unsigned as type**
-
-
-[7783e](https://github.com/JSQLParser/JSqlParser/commit/7783e05d024b006) Tobias Warneke *2020-12-31 01:49:42*
-
-**fixes #961 - allow unsigned as type**
-
-
-[67a33](https://github.com/JSQLParser/JSqlParser/commit/67a331e0052527a) Tobias Warneke *2020-12-31 01:46:19*
-
-**fixes #1006 - included limit / offset test**
-
-
-[b5514](https://github.com/JSQLParser/JSqlParser/commit/b55141b0bdb975d) Tobias Warneke *2020-12-31 00:59:36*
-
-**fixes #1013 - refactored fromitem grammar to drastically improve performance**
-
-
-[36d0b](https://github.com/JSQLParser/JSqlParser/commit/36d0b7420fe9225) Tobias Warneke *2020-12-31 00:47:09*
-
-****
-
-
-[05a6f](https://github.com/JSQLParser/JSqlParser/commit/05a6f4b3cb719e6) Tobias Warneke *2020-12-30 23:12:55*
-
-****
-
-
-[b2c60](https://github.com/JSQLParser/JSqlParser/commit/b2c6097ab0a713e) Tobias Warneke *2020-12-30 22:50:48*
-
-**fixes #1088 - allowed CURRENT as jdbc named parameter name**
-
-
-[4f925](https://github.com/JSQLParser/JSqlParser/commit/4f925c54cd89e12) Tobias Warneke *2020-12-30 22:12:28*
-
-**fixes #1089 - just included test case**
-
-
-[4183a](https://github.com/JSQLParser/JSqlParser/commit/4183ae0a55a9455) Tobias Warneke *2020-12-30 21:45:32*
-
-****
-
-
-[f484d](https://github.com/JSQLParser/JSqlParser/commit/f484de7c4813cf9) Tobias Warneke *2020-12-18 22:15:09*
-
-****
-
-
-[10a69](https://github.com/JSQLParser/JSqlParser/commit/10a69a2dd873053) Tobias Warneke *2020-12-18 22:13:16*
-
-**fixes #1080**
-
-
-[d9282](https://github.com/JSQLParser/JSqlParser/commit/d928268fb61c088) Tobias Warneke *2020-12-17 20:17:14*
-
-**Update README.md**
-
-
-[624f2](https://github.com/JSQLParser/JSqlParser/commit/624f247eaab9a54) Tobias *2020-12-16 10:08:46*
-
-**fixes #926**
-
-
-[97ab8](https://github.com/JSQLParser/JSqlParser/commit/97ab8e9b6cf4af8) Tobias Warneke *2020-12-11 22:13:14*
-
-**tested**
-
-
-[d9da6](https://github.com/JSQLParser/JSqlParser/commit/d9da64bd9ac032b) Tobias Warneke *2020-12-06 11:53:35*
-
-**tested**
-
-
-[875f7](https://github.com/JSQLParser/JSqlParser/commit/875f769e4ba353c) Tobias Warneke *2020-12-06 11:52:16*
-
-**upgraded to javacc 7.0.10, this time the lookahead seems to be working**
-
-
-[881e4](https://github.com/JSQLParser/JSqlParser/commit/881e457d7520aab) Tobias Warneke *2020-11-30 06:35:59*
-
-**upgraded to javacc 7.0.10, this time the lookahead seems to be working**
-
-
-[eae2e](https://github.com/JSQLParser/JSqlParser/commit/eae2e0d450c88c0) Tobias Warneke *2020-11-30 06:34:55*
-
-**fixes #1065**
-
-
-[e0b3a](https://github.com/JSQLParser/JSqlParser/commit/e0b3a180da5b1f8) Tobias Warneke *2020-11-22 19:39:48*
-
-**support IN with value (#1065)**
-
-* Co-authored-by: Jan Monterrubio &lt;Jan.Monterrubio@Cerner.com&gt; 
-* Co-authored-by: Tobias &lt;t.warneke@gmx.net&gt; 
-
-[8c7ee](https://github.com/JSQLParser/JSqlParser/commit/8c7ee289e78d07d) Jan Monterrubio *2020-11-22 19:29:27*
-
-**fixes #1074**
-
-
-[ece8a](https://github.com/JSQLParser/JSqlParser/commit/ece8a5a9e39abff) Tobias Warneke *2020-11-22 19:14:52*
-
-**fixes #1075**
-
-
-[b74f5](https://github.com/JSQLParser/JSqlParser/commit/b74f53228295d96) Tobias Warneke *2020-11-22 19:08:39*
-
-****
-
-
-[1008e](https://github.com/JSQLParser/JSqlParser/commit/1008ebcc5a806b9) Tobias Warneke *2020-11-06 22:01:54*
-
-**Support CreateSynonym statement (#1064)**
-
-* visual 
-* add synonym support 
-* add tests 
-* exclude keyword 
-* Co-authored-by: Jan Monterrubio &lt;Jan.Monterrubio@Cerner.com&gt; 
-
-[17e26](https://github.com/JSQLParser/JSqlParser/commit/17e2633e46778c6) Jan Monterrubio *2020-11-06 21:45:14*
-
-****
-
-
-[d5258](https://github.com/JSQLParser/JSqlParser/commit/d5258232ea77690) Tobias Warneke *2020-11-06 21:34:08*
-
-**Validation visitor framework (#1045)**
-
-* * add with prefix for fluent setters. 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* add getters 
-* * add with prefix for fluent setters. (revert to chaining setters, do 
-* not break current api) 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* * add with prefix for fluent setters. (revert to chaining setters, do 
-* not break current api) 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* remove create() methods - they do not add enough value to be justified 
-* * use new methods within testcases 
-* add some constructors 
-* fix and add &quot;with&quot; / &quot;add&quot; methods 
-* * use new methods within testcases 
-* * use new methods within testcases 
-* add some constructors 
-* * renamed constant 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* * use new methods within testcases 
-* add some with-methods 
-* add getter/setter named after the field without abbrivation 
-* * use new methods within testcases 
-* remove empty implicit constructor 
-* return the deparsed Statement - object 
-* compare object tree 
-* compare object tree 
-* * fix ObjectTreeToStringStyle 
-* compare object tree 
-* remove casts not needed 
-* * use new methods within testcases 
-* add some &quot;set&quot; &quot;with&quot; &quot;add&quot; methods missing 
-* * use new methods within testcases 
-* add empty constructors and override with-/add-methods returning concrete 
-* type 
-* * add ReflectionModelTest 
-* * use new methods within testcases 
-* fix checkstyle errors 
-* license header 
-* remove test-classes from ReflectionModelTest 
-* remove visitoradapter-classes from ReflectionModelTest 
-* * add SelectDeParser(StringBuilder) 
-* remove overriding setters/getters of buffer 
-* #1007 
-* push to synbee-contrib 
-* org.synbee.commons.contrib:jsqlparser:3.2-0.0.6-SNAPSHOT 
-* add ValidationUtil for simple validation of one or more statements 
-* remove overrides of 
-* getCause 
-* printStackTrace variants 
-* why add an additional cause ? 
-* set cause.getMessage() the message within constructor 
-* JSQLParserException(Throwable cause), othewise cause.toString() will be 
-* set as default. 
-* add ValidationVisitor showcase 
-* https://github.com/JSQLParser/JSqlParser/issues/1005 
-* add ValidationUtil for simple validation of one or more statements 
-* remove overrides of 
-* getCause 
-* printStackTrace variants 
-* why add an additional cause ? 
-* set cause.getMessage() the message within constructor 
-* JSQLParserException(Throwable cause), othewise cause.toString() will be 
-* set as default. 
-* visit(ShowTablesStatement) 
-* copyright/license 
-* add stubs (use deparsers as template) 
-* Merge branch &#x27;master.validate&#x27; of 
-* https://github.com/gitmotte/JSqlParser.git into master.validate 
-* add ValidationVisitor showcase 
-* https://github.com/JSQLParser/JSqlParser/issues/1005 
-* add ValidationUtil for simple validation of one or more statements 
-* remove overrides of 
-* getCause 
-* printStackTrace variants 
-* why add an additional cause ? 
-* set cause.getMessage() the message within constructor 
-* JSQLParserException(Throwable cause), othewise cause.toString() will be 
-* set as default. 
-* visit(ShowTablesStatement) 
-* add stubs (use deparsers as template) 
-* Merge branch &#x27;master.validate&#x27; of 
-* https://github.com/gitmotte/JSqlParser.git into master.validate 
-* add tests for ValidationUtil 
-* + implements OrderByVisitor 
-* split Expressionvalidator which implements both ItemsListVisitor and 
-* Expressionvisitor into Expressionvalidator and ItemListValidator 
-* Merge branch &#x27;github.validate&#x27; 
-* implement upsertvalidator 
-* add copyright 
-* validate through given ValidationCapability&#x27;s 
-* * switch to new method forced by 
-* ValidationCapability.validate(ValidationContext context, 
-* Consumer&lt;String&gt; errorMessageConsumer); 
-* add AllowedTypesValidation 
-* add FeatureConfiguration 
-* use FeatureConfiguration within parser 
-* repair pom.xml 
-* repair pom.xml 
-* repair pom.xml 
-* repair pom.xml 
-* * make FeatureConfiguration not a singleton any more 
-* CCJSqlParser extends AbstractJSqlParser&lt;CCJSqlParser&gt; 
-* add FeaturesAllowed for testing against features allowed 
-* implement some Validators 
-* basic implementation of DatabaseMetaDataValidation / 
-* JdbcDatabaseMetaDataCapability 
-* moving classes to sub-packages 
-* * moving classes to sub-packages 
-* fixing some bugs 
-* repair pom.xml 
-* add and fix validations 
-* add javadoc 
-* * force definition of &#x60;&#x60;&#x60;public String getMessage(Feature feature)&#x60;&#x60;&#x60; 
-* in FeatureSetValidation 
-* allow all objects as feature-value - this may be needed by the parser, 
-* if a none-boolean configuration is needed 
-* impl. 
-* SelectValidator.visit(PlainSelect) 
-* OrderByValidator 
-* add Version-enums 
-* impl. 
-* InsertValidator 
-* multiple implementations of visit(SubSelect) -&gt; forward to 
-* SelectValidator 
-* add some known features to SqlServerVersion 
-* refactoring enum-name should be upper case 
-* add ansi sql enum 
-* refactoring enum-name should be upper case 
-* implement limitvalidator 
-* + validateOffset 
-* + validateFetch 
-* + validate Pivot, UnPivot, PivotXml 
-* + implement DropValidator 
-* change testcase to image a more probably usecase 
-* * add javadoc and 
-* predefined sets for EXECUTE, ALTER, DROP 
-* allow to combine FeatureSets 
-* * implement executevalidator 
-* implement ExpressionValidator 
-* implement GrantValidator 
-* javadoc and complete SELECT constant 
-* use utility methods from AbstractValidator 
-* more user friendly names 
-* javadoc 
-* add subtypes for ValidationException 
-* ValidationParseException 
-* DatabaseException 
-* UnexpectedValidationException 
-* and change Set&lt;String&gt; errors to Set&lt;ValidationException&gt; for collect. 
-* javadoc &amp; rename exception 
-* rename method 
-* extract parsing task into package - private class for {@link 
-* ValidationUtil} to parse the statements 
-* within it&#x27;s own {@link ValidationCapability} 
-* add null-check for parsedStatement 
-* bugfix - do not collect duplicates 
-* implement toString() for 
-* ValidationError 
-* ValidationException 
-* add simple caching 
-* + validateOptionalFromItem(s) 
-* * implement GroupByValidator 
-* implement merge-validator 
-* renaming ItemListValidator -&gt; ItemsListValidator 
-* + validateOptionalItemsList 
-* + implement ReplaceValidator 
-* + use validateOptionalColumns, validateOptionalExpression where possible 
-* * remove validateOptionalColumns -&gt; switch to 
-* validateOptionalExpressions 
-* move validateOptionalOrderByElements to AbstractValidator 
-* add validateOptional in AbstractValidator 
-* add validateOptionalList in AbstractValidator 
-* + SetStatementValidator 
-* + ValuesStatementValidator 
-* + UseStatementValidator 
-* * implement UpdateValidator 
-* * implement ShowStatementValidator/ShowColumnsStatementValidator 
-* * implement UpdateValidator 
-* * add Feature.jdbcParameter, Feature.jdbcNamedParameter, to all 
-* featuresets 
-* + Version.getFeaturesClone 
-* add javadoc to Version-enum-constructors 
-* + validateOptionalFeature 
-* * implement DeleteValidator 
-* ... 
-* fix typo 
-* small optimization 
-* * move method getFeaturesClone to FeatureSet 
-* implement join - validation 
-* add copy(), add(Collection), remove(*) methods to FeaturesAllowed 
-* * add join - features to sqlserver, h2 
-* implementations 
-* bugfix - merging the errors 
-* copyright 
-* https://github.com/JSQLParser/JSqlParser/issues/1022 
-* add more fine granular control for setOperations 
-* fix nullpointerexception 
-* add more fine granular control for comments 
-* add Features supported 
-* * add javadoc 
-* add features to *Version-files 
-* extract methods isNotEmpty 
-* check for isNotEmpty 
-* * add features to *Version-files 
-* always parse net.sf.jsqlparser.statement.Statements and validate the 
-* list of included net.sf.jsqlparser.statement.Statement&#x27;s 
-* add known mariadb features 
-* new names-set for FeaturesAllowed 
-* new names-set for FeaturesAllowed 
-* new names-set for FeaturesAllowed 
-* add ature.withItem, Feature.withItemRecursive to H2 
-* Feature.setOperation, Feature.setOperationUnion, 
-* Feature.setOperationIntersect, Feature.setOperationExcept, 
-* for MariaDb 
-* add features to SQLServer 
-* Merge branch &#x27;master.orig&#x27; into github.validate 
-* @Override() -&gt; @Override 
-* fix typing error &quot;joinStaight&quot; &gt; joinStraight 
-* rename Feature &quot;insertValues&quot; -&gt; &quot;values&quot; and use &quot;insertValues&quot; for 
-* INSERT INTO ... VALUES 
-* add javadoc 
-* add Feature.selectGroupByGroupingSets to PostgresqlVersion 
-* implement basic OracleVersion 
-* add Feature.mySql* - also supported by mariadb 
-* add some more finegraned control over &quot;drop&quot; Feature. 
-* drop, 
-* dropTable, 
-* dropIndex, 
-* dropView, 
-* dropSchema, 
-* dropSequence, 
-* dropIfExists, 
-* complete FeaturesAllowed groups INSERT/UPDATE/DELETE/MERGE/DML 
-* add link to documentation 
-* fix - duplicate use of feature &quot;function&quot; - the use of functions in 
-* statements and &quot;createFunction&quot; as a ddl statement 
-* TODO this feature seams very close to a jsqlparser-user usecase 
-* * implement MySqlVersion 
-* replace feature Feature.dropIfExists by features dropTableIfExists, 
-* dropIndexIfExists, dropViewIfExists, dropSchemaIfExists, 
-* dropSequenceIfExists 
-* add methods FeatureSet.getNotContained FeatureSet.retainAll 
-* remove HSQLDBVersion - do not support this variant 
-* remove HSQLDBVersion - do not support this variant 
-* add unit-test 
-* + add unittests for 
-* UpdateValidator 
-* DeleteValidator 
-* add stubs for all other Validator-classes 
-* + ModifyableFeatureSet 
-* add some utility-methods in ValidationTestAsserts 
-* complete unit-tests for InsertValidator 
-* remote Feature.insertReturningExpressionList for Oracle - 
-* returning_clause requires INTO clause (only PL/SQL) 
-* add some more select validation tests 
-* add DropValidatorTests 
-* add DropValidatorTests 
-* add CreateTableValidatorTests 
-* add CreateTableValidatorTests 
-* add ExpressionValidatorTests 
-* add OrderByValidatorTest 
-* use isNotEmpty 
-* implement GroupByValidatorTest 
-* implement CreateSequenceValidatorTest 
-* remove @Ignore - test is ok 
-* implement CreateIndexValidatorTest 
-* implement CreateViewValidatorTest 
-* enable validation of Feature.commentOnView (#1024 is merged already) 
-* change format of #toString() for better readability 
-* * implement MergeValidatorTest 
-* implement ReplaceValidatorTest 
-* implement StatementValidatorTest 
-* rename 
-* ValidationUtil -&gt; Validation 
-* ValidatorUtil -&gt; ValidationUtil 
-* add testcases for ValidationUtil 
-* add DatabaseMetaDataValidationTest 
-* checkstyle fix 
-* add copyright statement 
-* add unit-tests for show tables, show column, show statements 
-* * add ExecuteValidatorTest 
-* as there is a difference between execute &lt;procedure&gt; and execute 
-* [immediate] &lt;dynamic sql&gt; with USING expr, ... remove support for 
-* execute on MYSQL, MARIADB, ORACLE 
-* * add ExecuteValidatorTest for CALL fnName (mysql, mariadb, postgres) 
-* add upsertvalidatortest 
-* add GrantValidatorTest 
-* add AlterSequenceValidatorTest 
-* add AlterSequenceValidatorTest 
-* add AlterViewValidatorTest 
-* add AlterValidatorTest 
-* replace !&#x3D; null by isNotEmpty on collections 
-* fix formatting 
-* add validate commit 
-* add validate block 
-* add DeclareStatementValidatorTest 
-* let NamesLookup implement UnaryOperator&lt;String&gt; 
-* let NamesLookup implement UnaryOperator&lt;String&gt; 
-* add javadoc 
-* add more DatabaseMetaDataValidationTest&#x27;s 
-* extract JdbcDatabaseMetaDataCapability.splitAndValidateMinMax 
-* add pivot/unpivot/pivotxml validation testcases 
-* add testcase for Feature.tableFunction 
-* add test for lateral joins and subjoins 
-* add testValidationRowMovementOption 
-* add values validator test 
-* move tests to LimitValidatorTest 
-* move tests to UseStatementValidatorTest 
-* add tests for SET - statements 
-* fix checkstyle error 
-* new serialVersionUID 
-* add validation for NamedObject not existing 
-* need table/view reference to validate column names 
-* fix typo 
-* fix errormessage (Arrays.toString(types)) 
-* add trigger, alias 
-* return null, instead of throwing exception, if not found 
-* extract NamesLookup to own file (jdk-bug enum inner classes) 
-* fix name-check AlterOperation.ALTER 
-* fix error message 
-* remove methods not needed (they only delegate to ValidationContext) 
-* add tests - validate metadata 
-* fix compile error 
-* fix columnExists check - depending on the statement the prefix is an 
-* alias, a table/view or it has no prefix (need to lookup within all 
-* related tables/views) 
-* fix javadoc warnings 
-
-[8c735](https://github.com/JSQLParser/JSqlParser/commit/8c735be5b179e51) gitmotte *2020-11-06 21:12:25*
-
-**Support Create table LIKE (#1066)**
-
-* fixes #413 
-* add coverage 
-* Co-authored-by: chyun &lt;chyun_wu@163.com&gt; 
-
-[ac746](https://github.com/JSQLParser/JSqlParser/commit/ac7462286ae15b9) Chyun *2020-11-06 21:05:09*
-
-**fixes #1068**
-
-
-[f1cf0](https://github.com/JSQLParser/JSqlParser/commit/f1cf0abc11ed783) Tobias Warneke *2020-11-06 20:59:19*
-
-**Bump junit from 4.12 to 4.13.1 (#1063)**
-
-* Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1. 
-* - [Release notes](https://github.com/junit-team/junit4/releases) 
-* - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) 
-* - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1) 
-* Signed-off-by: dependabot[bot] &lt;support@github.com&gt; 
-* Co-authored-by: dependabot[bot] &lt;49699333+dependabot[bot]@users.noreply.github.com&gt; 
-
-[f9a11](https://github.com/JSQLParser/JSqlParser/commit/f9a115c582dd59b) dependabot[bot] *2020-10-13 12:26:17*
-
-**fixes #1062**
-
-
-[80e28](https://github.com/JSQLParser/JSqlParser/commit/80e2891e8a79402) wumpz *2020-10-11 19:59:03*
-
-**corrected a test failure**
-
-
-[bc0e5](https://github.com/JSQLParser/JSqlParser/commit/bc0e5b913fc4f61) wumpz *2020-10-06 21:07:00*
-
-**support FILTER not only for window function (#1046)**
-
-* support FILTER not only for window function 
-* Fixed imports 
-
-[f32fa](https://github.com/JSQLParser/JSqlParser/commit/f32fa6137d6161b) Роман Зотов *2020-10-05 19:45:36*
-
-**fixes #1059**
-
-
-[3e84a](https://github.com/JSQLParser/JSqlParser/commit/3e84a377b488960) wumpz *2020-10-04 20:43:42*
-
-****
-
-
-[6b35e](https://github.com/JSQLParser/JSqlParser/commit/6b35e2fc4f39083) wumpz *2020-10-04 20:17:54*
-
-**fixes #1055 - added simple jdbc parameter to interval expression**
-
-
-[68659](https://github.com/JSQLParser/JSqlParser/commit/686599b199d6d49) wumpz *2020-10-04 20:16:04*
-
-**Retain original value in TimestampValue (#1057)**
-
-* Co-authored-by: Enrico Olivelli &lt;enrico.olivelli@diennea.com&gt; 
-
-[622f9](https://github.com/JSQLParser/JSqlParser/commit/622f9aebb3ebce7) Enrico Olivelli *2020-10-04 19:51:01*
-
-**fixes #1053**
-
-
-[45aa8](https://github.com/JSQLParser/JSqlParser/commit/45aa8f853a10779) wumpz *2020-10-04 19:42:23*
-
-**Addons/fixes for Fluent API  (#1049)**
-
-* fix unittests for setter/wither methods with primitive arguments 
-* add missing withAscDescPresent 
-
-[8165e](https://github.com/JSQLParser/JSqlParser/commit/8165e29cb081080) gitmotte *2020-10-04 19:20:43*
-
-**fixes #1040**
-
-
-[3f516](https://github.com/JSQLParser/JSqlParser/commit/3f5165122bc9824) wumpz *2020-09-27 21:12:11*
-
-**xmlserialize support patch for optional order by part**
-
-
-[3747f](https://github.com/JSQLParser/JSqlParser/commit/3747f1c00503b54) wumpz *2020-09-10 21:21:47*
-
-**xmlserialize support patch for expressions**
-
-
-[8c4e0](https://github.com/JSQLParser/JSqlParser/commit/8c4e0ca141656fd) wumpz *2020-09-08 20:35:36*
-
-**Make UnPivot.getUnPivotInClause() return List<SelectExpressionItem> (#1039)**
-
-
-[abedc](https://github.com/JSQLParser/JSqlParser/commit/abedce539515638) MoonFruit *2020-09-07 11:32:37*
-
-**xmlserialize support**
-
-
-[b580a](https://github.com/JSQLParser/JSqlParser/commit/b580a093c2edda6) wumpz *2020-09-05 22:00:43*
-
-****
-
-
-[536fb](https://github.com/JSQLParser/JSqlParser/commit/536fb0348ae985e) wumpz *2020-08-30 20:23:52*
-
-**bugfix issue #1036: supporting DROP SEQUENCE (#1037)**
-
-
-[e5cd7](https://github.com/JSQLParser/JSqlParser/commit/e5cd7c83e15f7f9) suiwenbo *2020-08-30 20:16:20*
-
-**modified Condition production to be more performant**
-
-
-[3d7f5](https://github.com/JSQLParser/JSqlParser/commit/3d7f55c48a8dfae) wumpz *2020-08-29 22:30:01*
-
-**bugfix #720 #991: supporting SELECT "conditions" (#1032)**
-
-* bugfix issue #1020: JSON type in MySQL not supported in v3.2 
-* bugfix issue #720 #991: supporting SELECT &quot;CONDITIONS&quot; 
-
-[9e26b](https://github.com/JSQLParser/JSqlParser/commit/9e26b76ddbc626f) suiwenbo *2020-08-25 22:29:41*
-
-****
-
-
-[81523](https://github.com/JSQLParser/JSqlParser/commit/815235606244b01) wumpz *2020-08-23 20:33:42*
-
-**setting version to 4-SNAPSHOT**
-
-
-[85286](https://github.com/JSQLParser/JSqlParser/commit/852860985832c4c) wumpz *2020-08-23 20:32:33*
-
-**Fluent builder api #1004 (#1014)**
-
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* create(...) methods 
-* chaining - methods returning &quot;this&quot; 
-* overwrite chaining - methods of abstract parents/interfaces for 
-* returning concrete type 
-* add&lt;Name&gt; methods on collection-fields with varargs-parameter 
-* add public T get&lt;Name&gt;(Class&lt;T&gt;) - casting and returning an inner 
-* interface-type 
-* 1004 add chaining - methods returning &quot;this&quot; 
-* #1004 add chaining - methods returning &quot;this&quot; 
-* * add&lt;Name&gt; methods on collection-fields with varargs-parameter 
-* add&lt;Name&gt; methods on collection-fields with collection-parameter 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* * add chaining - methods returning &quot;this&quot; 
-* add&lt;Name&gt; methods on collection-fields with varargs-parameter 
-* add&lt;Name&gt; methods on collection-fields with collection-parameter 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* * add public T get&lt;Name&gt;(Class&lt;T&gt;) - casting and returning the concrete 
-* type 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* * add public T get&lt;Name&gt;(Class&lt;T&gt;) - casting and returning the concrete 
-* type (swap Class&lt;? extends E&gt; for Class&lt;E&gt;) 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* * overwrite chaining - methods of abstract parents/interfaces for 
-* returning concrete type 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* * add with prefix for fluent setters. 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* add getters 
-* * add with prefix for fluent setters. (revert to chaining setters, do 
-* not break current api) 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* * add with prefix for fluent setters. (revert to chaining setters, do 
-* not break current api) 
-* https://github.com/JSQLParser/JSqlParser/issues/1004 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* remove create() methods - they do not add enough value to be justified 
-* * use new methods within testcases 
-* add some constructors 
-* fix and add &quot;with&quot; / &quot;add&quot; methods 
-* * use new methods within testcases 
-* * use new methods within testcases 
-* add some constructors 
-* * renamed constant 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* use new methods within testcases 
-* * use new methods within testcases 
-* add some with-methods 
-* add getter/setter named after the field without abbrivation 
-* * use new methods within testcases 
-* remove empty implicit constructor 
-* return the deparsed Statement - object 
-* compare object tree 
-* compare object tree 
-* * fix ObjectTreeToStringStyle 
-* compare object tree 
-* remove casts not needed 
-* * use new methods within testcases 
-* add some &quot;set&quot; &quot;with&quot; &quot;add&quot; methods missing 
-* * use new methods within testcases 
-* add empty constructors and override with-/add-methods returning concrete 
-* type 
-* * add ReflectionModelTest 
-* * use new methods within testcases 
-* fix checkstyle errors 
-* license header 
-* remove test-classes from ReflectionModelTest 
-* remove visitoradapter-classes from ReflectionModelTest 
-* remove duplicate import declaration (checkstyle error) 
-* * fix RandomUtils to support used java.sql.* types 
-* fix RandomUtils to support enums 
-* fix RandomUtils to map objects by its interfaces and super-classes 
-* filter method &quot;setASTNode&quot; - do not test setters (cannot randomly 
-* create a SimpleNode) 
-* add javadoc, stating that this is a marker interface 
-* https://github.com/JSQLParser/JSqlParser/pull/1014#discussion_r454761902 
-* revert formatting change 
-* https://github.com/JSQLParser/JSqlParser/pull/1014#discussion_r454762463 
-* change to EXEC_TYPE.EXECUTE just so the assertion didn&#x27;t change 
-* https://github.com/JSQLParser/JSqlParser/pull/1014#discussion_r454763565 
-* try to revert format changes 
-* https://github.com/JSQLParser/JSqlParser/pull/1014#discussion_r454800430 
-* try to revert format changes 
-* https://github.com/JSQLParser/JSqlParser/pull/1014#discussion_r454800430 
-* remove brackets on @Override() -&gt; @Override 
-* add with-methods to new fields 
-
-[6cff1](https://github.com/JSQLParser/JSqlParser/commit/6cff161dacc1e6f) gitmotte *2020-08-23 20:07:53*
-
-****
-
-
-[02d58](https://github.com/JSQLParser/JSqlParser/commit/02d5837c5ee8c92) wumpz *2020-08-09 21:26:57*
-
-****
-
-
-[574a6](https://github.com/JSQLParser/JSqlParser/commit/574a6b7fda44857) wumpz *2020-08-09 21:22:24*
-
-**Support Foreign Key ON UPDATE CASCADE (#1025)**
-
-* https://github.com/JSQLParser/JSqlParser/issues/985 
-* add 2 unit-tests for given statements 
-* https://github.com/JSQLParser/JSqlParser/issues/985 
-* fix formating (line width) 
-* https://github.com/JSQLParser/JSqlParser/issues/985 
-* * fix nullpointerexceptions 
-* add more unittest-assertions 
-* https://github.com/JSQLParser/JSqlParser/issues/985 
-* change order to match the same order as in ForeignKeyIndex 
-* byAction should not throw an exception (is used by deprecated 
-* string-setters) 
-* add unit-tests for ReferentialAction within AlterExpression 
-* fix toString (added bug on refactoring) 
-* javadoc 
-* test set from get on null-values too 
-* refactoring: add and use ReferentialAction() to evaluate enum 
-* https://github.com/JSQLParser/JSqlParser/issues/985 
-* refactoring: fix parser that order of referential actions does not 
-* matter 
-* https://github.com/JSQLParser/JSqlParser/issues/985 
-* add empty constructor 
-
-[1e88d](https://github.com/JSQLParser/JSqlParser/commit/1e88dd57eb48ebf) gitmotte *2020-08-09 21:01:34*
-
-**bugfix issue #1020: JSON type in MySQL not supported in v3.2 (#1028)**
-
-
-[685f6](https://github.com/JSQLParser/JSqlParser/commit/685f6fe43fb35d7) suiwenbo *2020-08-09 20:59:52*
-
-****
-
-
-[cfe5a](https://github.com/JSQLParser/JSqlParser/commit/cfe5a2e725b555b) wumpz *2020-08-09 20:58:15*
-
-**Add generated sources to classpath. (#804)**
-
-
-[14fb8](https://github.com/JSQLParser/JSqlParser/commit/14fb80d947d9bf0) Matthieu Vergne *2020-08-09 20:53:38*
-
-****
-
-
-[008d9](https://github.com/JSQLParser/JSqlParser/commit/008d9ad7f28a7b9) wumpz *2020-08-09 20:51:34*
-
-**COMMENT ON VIEW (#1024)**
-
-* * implement COMMENT ON VIEW 
-* testcase &quot;testCommentOnView&quot; 
-* https://github.com/JSQLParser/JSqlParser/issues/1023 
-* add more asserts 
-
-[449f5](https://github.com/JSQLParser/JSqlParser/commit/449f55219fc39eb) gitmotte *2020-08-09 20:49:05*
-
-**fixes #1026**
-
-
-[4f888](https://github.com/JSQLParser/JSqlParser/commit/4f8882dd143469d) wumpz *2020-08-09 20:46:07*
-
-**fixes #1026**
-
-
-[4c323](https://github.com/JSQLParser/JSqlParser/commit/4c32302d386ec88) wumpz *2020-08-09 20:39:48*
-
-**fixes #1027**
-
-
-[a923e](https://github.com/JSQLParser/JSqlParser/commit/a923e7e00ef3518) wumpz *2020-08-09 20:31:26*
-
-**fixes #1029**
-
-
-[db6ac](https://github.com/JSQLParser/JSqlParser/commit/db6acef1c38e09e) wumpz *2020-08-09 19:55:55*
-
-**fixes #732**
-
-
-[57a7d](https://github.com/JSQLParser/JSqlParser/commit/57a7dcdf2ede8a0) wumpz *2020-07-15 21:07:09*
-
-**variable assignment implemented**
-
-
-[cdd0f](https://github.com/JSQLParser/JSqlParser/commit/cdd0fa244dadca1) wumpz *2020-07-13 22:03:12*
-
-**allowed Jdbc named parameters within interval expressions**
-
-
-[869a7](https://github.com/JSQLParser/JSqlParser/commit/869a7b2088ff54f) wumpz *2020-07-12 21:25:43*
-
-**allowed Jdbc named parameters within interval expressions**
-
-
-[3602c](https://github.com/JSQLParser/JSqlParser/commit/3602c5f6d0a1766) wumpz *2020-07-12 21:25:05*
-
-**some house keeping**
-
-
-[8bcf2](https://github.com/JSQLParser/JSqlParser/commit/8bcf2dc4f64cde3) wumpz *2020-07-11 20:39:37*
-
-**fixes #1009**
-
-
-[71d65](https://github.com/JSQLParser/JSqlParser/commit/71d6523f2150bc2) wumpz *2020-07-11 20:30:30*
-
-**Add show tables support (#1015)**
-
-* visual 
-* implement show tables 
-* Co-authored-by: Jan Monterrubio &lt;Jan.Monterrubio@Cerner.com&gt; 
-
-[c0373](https://github.com/JSQLParser/JSqlParser/commit/c03733b3cfcb758) Jan Monterrubio *2020-07-11 16:43:42*
-
-**let all deparsers extend AbstractDeParser (#1007)**
-
-* let all deparsers extend AbstractDeParser 
-* * add SelectDeParser(StringBuilder) 
-* remove overriding setters/getters of buffer 
-* #1007 
-
-[2b790](https://github.com/JSQLParser/JSqlParser/commit/2b7909c3be31ca8) gitmotte *2020-07-11 16:40:11*
-
-****
-
-
-[ea88e](https://github.com/JSQLParser/JSqlParser/commit/ea88e1b2899176e) wumpz *2020-06-28 19:22:52*
-
-****
-
-
-[51e84](https://github.com/JSQLParser/JSqlParser/commit/51e8428d7dcf7dc) wumpz *2020-06-27 23:01:20*
-
-
-## jsqlparser-3.2 (2020-06-28)
-
-### Other changes
-
-****
-
-
-[cd742](https://github.com/JSQLParser/JSqlParser/commit/cd742d3104218ab) wumpz *2020-06-27 22:29:23*
-
-**partial func support (#1000)**
-
-
-[9df19](https://github.com/JSQLParser/JSqlParser/commit/9df19b9517112b8) Jan Monterrubio *2020-06-25 05:31:27*
-
-****
-
-
-[7a19a](https://github.com/JSQLParser/JSqlParser/commit/7a19a9b71c2a44d) wumpz *2020-06-23 21:56:47*
-
-**Support options for Explain (#996)**
-
-* visual 
-* issue-995 
-* support verbose 
-* postgres explain 
-* tests 
-* no text 
-* Co-authored-by: Jan Monterrubio &lt;Jan.Monterrubio@Cerner.com&gt; 
-
-[13873](https://github.com/JSQLParser/JSqlParser/commit/1387354712285e4) Jan Monterrubio *2020-06-23 21:52:42*
-
-****
-
-
-[8c307](https://github.com/JSQLParser/JSqlParser/commit/8c3076efc9544cb) wumpz *2020-06-23 20:45:19*
-
-**Support multiple lists for an IN clause (#997)**
-
-* visual 
-* wip 
-* cleanup n test 
-* polish 
-* lookahead 
-* Co-authored-by: Jan Monterrubio &lt;Jan.Monterrubio@Cerner.com&gt; 
-
-[5de4a](https://github.com/JSQLParser/JSqlParser/commit/5de4ae597fbeda3) Jan Monterrubio *2020-06-20 22:10:38*
-
-**fixes #999**
-
-
-[ce8ee](https://github.com/JSQLParser/JSqlParser/commit/ce8eef8bb6c2526) wumpz *2020-06-20 22:06:17*
-
-**fixes #999**
-
-
-[325cc](https://github.com/JSQLParser/JSqlParser/commit/325ccb0fc2cf067) wumpz *2020-06-20 21:57:10*
-
-**Support ALTER SEQUENCE  (#980)**
-
-* support alter sequence 
-* improve coverage 
-
-[d34c8](https://github.com/JSQLParser/JSqlParser/commit/d34c885ba5a8c93) Jan Monterrubio *2020-05-23 10:16:07*
-
-****
-
-
-[779a7](https://github.com/JSQLParser/JSqlParser/commit/779a744a8ab80c7) wumpz *2020-05-23 10:12:52*
-
-**fixes #984**
-
-
-[38597](https://github.com/JSQLParser/JSqlParser/commit/38597f347c820a7) wumpz *2020-05-16 21:14:26*
-
-**fixes #984**
-
-
-[60ac1](https://github.com/JSQLParser/JSqlParser/commit/60ac16a98022455) wumpz *2020-05-16 21:00:28*
-
-**tests for issue**
-
-
-[82894](https://github.com/JSQLParser/JSqlParser/commit/8289406bbcbba45) wumpz *2020-05-14 21:16:52*
-
-****
-
-
-[d6bbc](https://github.com/JSQLParser/JSqlParser/commit/d6bbc3fa8a10d58) wumpz *2020-05-08 21:12:13*
-
-****
-
-
-[1ee7c](https://github.com/JSQLParser/JSqlParser/commit/1ee7c417bf0936e) wumpz *2020-05-08 20:19:13*
-
-**fixes #981**
-
-
-[d79b4](https://github.com/JSQLParser/JSqlParser/commit/d79b44db122652e) wumpz *2020-05-08 20:14:21*
-
-**fixbuild (#978)**
-
-
-[08b94](https://github.com/JSQLParser/JSqlParser/commit/08b9477ef28a377) Jan Monterrubio *2020-04-30 04:42:04*
-
-**Implement row movement clause for table creation (#974)**
-
-* visual 
-* implement row movement 
-* support row + AS 
-* Co-authored-by: Jan Monterrubio &lt;Jan.Monterrubio@Cerner.com&gt; 
-
-[79b5f](https://github.com/JSQLParser/JSqlParser/commit/79b5fe9c5681961) Jan Monterrubio *2020-04-28 07:02:51*
-
-**Support CREATE SEQUENCE (#977)**
-
-* wip 
-* wip, some parsing 
-* support sequence 
-* implement feature 
-* delete issue tests 
-* compile it 
-
-[a6a3c](https://github.com/JSQLParser/JSqlParser/commit/a6a3c616b8994f1) Jan Monterrubio *2020-04-28 07:01:10*
-
-****
-
-
-[ca76f](https://github.com/JSQLParser/JSqlParser/commit/ca76fed4be73522) wumpz *2020-04-19 19:50:28*
-
-**fixes #962**
-
-
-[3f918](https://github.com/JSQLParser/JSqlParser/commit/3f918501bda7fc4) wumpz *2020-04-18 21:53:14*
-
-**implement feature (#972)**
-
-* Co-authored-by: Jan Monterrubio &lt;Jan.Monterrubio@Cerner.com&gt; 
-
-[aee39](https://github.com/JSQLParser/JSqlParser/commit/aee3947757eecf4) Jan Monterrubio *2020-04-17 21:01:22*
-
-**test method names changed**
-
-
-[2b564](https://github.com/JSQLParser/JSqlParser/commit/2b5647b5af32b74) zhumaliev-rv *2020-04-03 05:31:40*
-
-**added Oracle GRANT statement**
-
-
-[fa215](https://github.com/JSQLParser/JSqlParser/commit/fa21512ea2f2dd8) zhumaliev-rv *2020-04-02 12:03:43*
-
-**fixes #855**
-
-
-[f3ecd](https://github.com/JSQLParser/JSqlParser/commit/f3ecdcb1a8fe8b0) wumpz *2020-03-25 22:42:33*
-
-**fixes #915**
-
-
-[9ce74](https://github.com/JSQLParser/JSqlParser/commit/9ce74e234e09525) wumpz *2020-03-04 22:04:40*
-
-**fixes #922**
-
-
-[8abd6](https://github.com/JSQLParser/JSqlParser/commit/8abd6e732c926c2) wumpz *2020-03-01 00:00:26*
-
-****
-
-
-[65ad8](https://github.com/JSQLParser/JSqlParser/commit/65ad8f9b8b05835) wumpz *2020-02-29 23:22:26*
-
-**fixes #864**
-
-
-[5783b](https://github.com/JSQLParser/JSqlParser/commit/5783b65f169560a) wumpz *2020-02-15 21:31:55*
-
-**fixes #701**
-
-
-[8d43f](https://github.com/JSQLParser/JSqlParser/commit/8d43facbc33c803) wumpz *2020-02-15 20:43:38*
-
-**fixes #945**
-
-
-[ab405](https://github.com/JSQLParser/JSqlParser/commit/ab4054ce5c1917e) wumpz *2020-02-14 23:19:47*
-
-**fixes #944**
-
-
-[e1ff1](https://github.com/JSQLParser/JSqlParser/commit/e1ff1f09e9ad946) wumpz *2020-02-14 23:02:57*
-
-**fixes #944**
-
-
-[22117](https://github.com/JSQLParser/JSqlParser/commit/22117c40613778b) wumpz *2020-02-14 22:58:06*
-
-**introduces sql server hints**
-
-
-[92c74](https://github.com/JSQLParser/JSqlParser/commit/92c74bfb15b18ac) wumpz *2020-02-14 19:40:15*
-
-**introduces sql server hints**
-
-
-[6a414](https://github.com/JSQLParser/JSqlParser/commit/6a414aa703b9a5b) wumpz *2020-02-14 19:04:41*
-
-**introduced view keyword**
-
-
-[f12bb](https://github.com/JSQLParser/JSqlParser/commit/f12bb31a14973ac) wumpz *2020-02-12 23:54:37*
-
-**fixes #909**
-
-
-[9b998](https://github.com/JSQLParser/JSqlParser/commit/9b998d67699bf5c) wumpz *2020-02-02 21:51:56*
-
-**fixes #930**
-
-
-[4c4a5](https://github.com/JSQLParser/JSqlParser/commit/4c4a5361453c434) wumpz *2020-02-02 21:09:52*
-
-**fixes #940**
-
-
-[dc93a](https://github.com/JSQLParser/JSqlParser/commit/dc93a07e38341de) wumpz *2020-02-02 20:43:09*
-
-**fixes #941  again :)**
-
-
-[782dc](https://github.com/JSQLParser/JSqlParser/commit/782dce8d20ce99f) wumpz *2020-02-02 20:22:40*
-
-**fixes #941**
-
-
-[ce392](https://github.com/JSQLParser/JSqlParser/commit/ce392b3739dcfbb) wumpz *2020-02-01 23:49:17*
-
-**fixes #924**
-
-
-[d0cd8](https://github.com/JSQLParser/JSqlParser/commit/d0cd8f869bb1173) wumpz *2020-02-01 23:21:52*
-
-**Update README.md**
-
-
-[a03d2](https://github.com/JSQLParser/JSqlParser/commit/a03d235d91de445) Tobias *2020-02-01 00:34:26*
-
-**updated some maven plugins**
-
-
-[3ba29](https://github.com/JSQLParser/JSqlParser/commit/3ba29f1fdc76a7a) wumpz *2020-02-01 00:33:17*
-
-**fixes #936**
-
-* fixes #938 
-
-[39e92](https://github.com/JSQLParser/JSqlParser/commit/39e920df15fefd7) wumpz *2020-02-01 00:08:17*
-
-**fixes #936**
-
-
-[abf44](https://github.com/JSQLParser/JSqlParser/commit/abf440d2be0fbc6) wumpz *2020-01-31 23:47:06*
-
-**added keyword group to possible object names**
-
-
-[430b3](https://github.com/JSQLParser/JSqlParser/commit/430b3ee8f506173) wumpz *2020-01-27 06:42:20*
-
-**fixes #923**
-
-
-[775a0](https://github.com/JSQLParser/JSqlParser/commit/775a09b0a763f55) wumpz *2020-01-25 23:09:35*
-
-**fixes #923**
-
-
-[57d50](https://github.com/JSQLParser/JSqlParser/commit/57d5044a1a1d6bc) wumpz *2020-01-25 23:09:18*
-
-**started fixing #923**
-
-
-[0f78d](https://github.com/JSQLParser/JSqlParser/commit/0f78dfdf5dfa6a7) wumpz *2020-01-23 23:19:41*
-
-**fixes #932**
-
-
-[3490e](https://github.com/JSQLParser/JSqlParser/commit/3490e61dbc6b9b0) wumpz *2020-01-23 21:57:59*
-
-**fixes #918**
-
-
-[3b89c](https://github.com/JSQLParser/JSqlParser/commit/3b89cd28ad893ae) wumpz *2020-01-23 21:26:58*
-
-**fixes #921**
-
-
-[f4b10](https://github.com/JSQLParser/JSqlParser/commit/f4b10cff44e90f4) wumpz *2020-01-21 07:27:10*
-
-**fixes #921**
-
-
-[a23d3](https://github.com/JSQLParser/JSqlParser/commit/a23d30bc9425b19) wumpz *2020-01-21 07:26:35*
-
-**fixes #929**
-
-
-[a3c95](https://github.com/JSQLParser/JSqlParser/commit/a3c95d4712852f2) wumpz *2020-01-21 07:11:38*
-
-**fixes #928**
-
-
-[0bae6](https://github.com/JSQLParser/JSqlParser/commit/0bae629dba2459c) wumpz *2020-01-21 06:58:58*
-
-**fixes #927**
-
-
-[62648](https://github.com/JSQLParser/JSqlParser/commit/6264801af1c0bef) wumpz *2020-01-21 06:49:23*
-
-**fixes #917**
-
-
-[8de0f](https://github.com/JSQLParser/JSqlParser/commit/8de0fd9971b6e07) wumpz *2020-01-05 22:08:03*
-
-**rewind #910**
-
-
-[9ca4f](https://github.com/JSQLParser/JSqlParser/commit/9ca4f3e63b26353) wumpz *2020-01-03 00:03:35*
-
-**Adding support for simple expressions in INTERVAL expressions (#910)**
-
-
-[ebac9](https://github.com/JSQLParser/JSqlParser/commit/ebac9dbcadb4df8) Tomer Shay (Shimshi) *2019-12-20 06:14:04*
-
-**removed null check**
-
-
-[aba6f](https://github.com/JSQLParser/JSqlParser/commit/aba6f3ae2148d51) wumpz *2019-12-18 14:01:17*
-
-**Update README.md**
-
-
-[6fd3c](https://github.com/JSQLParser/JSqlParser/commit/6fd3c9c0e6fa4b6) Tobias *2019-12-02 15:55:47*
-
-****
-
-
-[5be06](https://github.com/JSQLParser/JSqlParser/commit/5be0646d9004b6e) wumpz *2019-12-01 22:12:59*
-
-****
-
-
-[82d8f](https://github.com/JSQLParser/JSqlParser/commit/82d8f59db9f1c33) wumpz *2019-12-01 22:12:54*
-
-**Update README.md**
-
-
-[f7ae7](https://github.com/JSQLParser/JSqlParser/commit/f7ae75ace8ecb98) Tobias *2019-11-27 20:26:12*
-
-**fixes #899**
-
-* switched to assertj from hamcrest 
-
-[9707e](https://github.com/JSQLParser/JSqlParser/commit/9707e4f0aacff16) wumpz *2019-11-23 23:18:56*
-
-**Adding support for casting to SIGNED (#900)**
-
-
-[73b3d](https://github.com/JSQLParser/JSqlParser/commit/73b3d44f16a57c9) Tomer Shay (Shimshi) *2019-11-20 09:39:47*
-
-**Support parsing SELECT FOR UPDATE NOWAIT - Refer to documents on https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-locking-reads.html#innodb-locking-reads-nowait-skip-locked (#896)**
-
-
-[596e6](https://github.com/JSQLParser/JSqlParser/commit/596e631ff985c10) Yoon Kyong Sik *2019-11-16 10:07:59*
-
-**added some doc to CCJSqlParserUtil**
-
-
-[5242a](https://github.com/JSQLParser/JSqlParser/commit/5242a18d20a7c2a) wumpz *2019-11-13 08:31:40*
-
-**Adding support for STRAIGHT_JOIN in the select clause (#861)**
-
-* Adding support for straight_join in the select clause 
-* Renaming the field name to reflect that this is a MySQL hint 
-
-[3cdea](https://github.com/JSQLParser/JSqlParser/commit/3cdea6bd3d9ce21) Tomer Shay (Shimshi) *2019-11-09 20:30:54*
-
-**Update README.md**
-
-
-[a0077](https://github.com/JSQLParser/JSqlParser/commit/a0077a1e3b4c0c1) Tobias *2019-11-08 07:53:42*
-
-****
-
-
-[47a94](https://github.com/JSQLParser/JSqlParser/commit/47a944eb4571b02) wumpz *2019-11-06 22:36:04*
-
-
-## jsqlparser-3.1 (2019-11-06)
-
-### Other changes
-
-**fixes #344**
-
-
-[43862](https://github.com/JSQLParser/JSqlParser/commit/43862ddf607493d) wumpz *2019-11-06 22:23:56*
-
-**fixes #344**
-
-
-[782de](https://github.com/JSQLParser/JSqlParser/commit/782de006989e787) wumpz *2019-11-06 22:23:06*
-
-**Adding support for complex expressions in the ORDER BY clause (#890)**
-
-
-[678ac](https://github.com/JSQLParser/JSqlParser/commit/678ac96b5948175) Tomer Shay (Shimshi) *2019-10-31 07:19:03*
-
-**fixes #884**
-
-
-[1d8a9](https://github.com/JSQLParser/JSqlParser/commit/1d8a9479ff3fc6f) wumpz *2019-10-26 21:38:48*
-
-**fixes #880**
-
-
-[7746b](https://github.com/JSQLParser/JSqlParser/commit/7746bbb7ffa8fb4) wumpz *2019-10-26 21:25:47*
-
-****
-
-
-[552bf](https://github.com/JSQLParser/JSqlParser/commit/552bf605ec075ec) wumpz *2019-10-26 20:41:45*
-
-**Added support for Oracle UNPIVOT keyword. (#882)**
-
-* Added support for Oracle UNPIVOT keyword. 
-* Back to original version number. 
-* Updated imports. 
-* Added missing import. 
-
-[bcc27](https://github.com/JSQLParser/JSqlParser/commit/bcc271870ad767f) Pascal Mulder *2019-10-26 20:35:43*
-
-**fixes #878**
-
-
-[c2836](https://github.com/JSQLParser/JSqlParser/commit/c2836f6a276879e) wumpz *2019-10-26 20:27:03*
-
-**fixes #869**
-
-
-[5b781](https://github.com/JSQLParser/JSqlParser/commit/5b78153ad5b8eb1) wumpz *2019-10-18 23:02:59*
-
-**fixes #876**
-
-
-[144e6](https://github.com/JSQLParser/JSqlParser/commit/144e60b43fd24ab) wumpz *2019-10-18 21:19:50*
-
-**fixes #866**
-
-
-[25e1d](https://github.com/JSQLParser/JSqlParser/commit/25e1dcc3fc83440) wumpz *2019-10-16 22:44:27*
-
-**fixes #862**
-
-
-[51c92](https://github.com/JSQLParser/JSqlParser/commit/51c92d89389f780) wumpz *2019-10-16 21:40:42*
-
-**tests #874**
-
-
-[1ecfc](https://github.com/JSQLParser/JSqlParser/commit/1ecfcbc4abfd054) wumpz *2019-10-16 20:46:13*
-
-**fixes #865**
-
-
-[8a965](https://github.com/JSQLParser/JSqlParser/commit/8a965554e1005ca) wumpz *2019-10-14 21:12:05*
-
-**fixes #867**
-
-
-[22229](https://github.com/JSQLParser/JSqlParser/commit/22229459fb65b6f) wumpz *2019-10-09 08:40:11*
-
-**fixes #867**
-
-
-[6ef7e](https://github.com/JSQLParser/JSqlParser/commit/6ef7ebbad314090) wumpz *2019-10-09 08:38:23*
-
-**fixes #847**
-
-
-[2147a](https://github.com/JSQLParser/JSqlParser/commit/2147a21b0caee90) wumpz *2019-10-05 22:41:29*
-
-**allowing start as keyword for column and tablenames**
-
-
-[f9bba](https://github.com/JSQLParser/JSqlParser/commit/f9bba25386300ca) wumpz *2019-10-05 22:39:45*
-
-**allowing start as keyword for column and tablenames**
-
-
-[cc6a4](https://github.com/JSQLParser/JSqlParser/commit/cc6a4c5cba1e523) wumpz *2019-10-05 22:37:57*
-
-**fixes #859**
-
-
-[8e61a](https://github.com/JSQLParser/JSqlParser/commit/8e61a1884297af9) wumpz *2019-10-01 06:14:39*
-
-**Update README.md**
-
-
-[c6441](https://github.com/JSQLParser/JSqlParser/commit/c6441e05b5d3c59) Tobias *2019-09-30 23:04:05*
-
-**Fixes linkage of SubSelect to Node**
-
-
-[55783](https://github.com/JSQLParser/JSqlParser/commit/557831dc6621141) PGrafkin *2019-09-22 19:02:33*
-
-**fixes #845**
-
-
-[d6b4e](https://github.com/JSQLParser/JSqlParser/commit/d6b4e4d7bec895a) wumpz *2019-09-20 15:01:04*
-
-****
-
-
-[56ddc](https://github.com/JSQLParser/JSqlParser/commit/56ddc2d8fe4e898) wumpz *2019-09-20 14:41:27*
-
-**fixes #849**
-
-
-[62a03](https://github.com/JSQLParser/JSqlParser/commit/62a0341a35690fe) wumpz *2019-09-20 14:39:58*
-
-**fixes #848**
-
-
-[1d2c2](https://github.com/JSQLParser/JSqlParser/commit/1d2c261721d0d61) wumpz *2019-09-20 13:05:40*
-
-****
-
-
-[484ea](https://github.com/JSQLParser/JSqlParser/commit/484ea9dd02a9c4c) wumpz *2019-09-20 13:05:14*
-
-**fixes #850**
-
-
-[1cd3c](https://github.com/JSQLParser/JSqlParser/commit/1cd3c27f32aed64) wumpz *2019-09-20 12:26:44*
-
-**Update README.md**
-
-
-[6191a](https://github.com/JSQLParser/JSqlParser/commit/6191ae0646e1e40) Tobias *2019-08-29 21:32:25*
-
-
-## jsqlparser-3.0 (2019-08-29)
-
-### Other changes
-
-**fixes #842**
-
-
-[516ea](https://github.com/JSQLParser/JSqlParser/commit/516ea8a3a6988b0) wumpz *2019-08-26 22:12:59*
-
-**fixes #750 - duplicate**
-
-
-[dd7ed](https://github.com/JSQLParser/JSqlParser/commit/dd7eda0c4c6ab8c) wumpz *2019-08-19 08:07:41*
-
-****
-
-
-[55974](https://github.com/JSQLParser/JSqlParser/commit/55974c31d955565) wumpz *2019-08-14 15:23:23*
-
-****
-
-
-[c481c](https://github.com/JSQLParser/JSqlParser/commit/c481ce03c35ea0d) wumpz *2019-08-13 19:44:50*
-
-**fixes #677**
-
-
-[695d5](https://github.com/JSQLParser/JSqlParser/commit/695d532571c02c1) wumpz *2019-08-13 19:33:14*
-
-**fixes #378**
-
-
-[7a133](https://github.com/JSQLParser/JSqlParser/commit/7a133446d0c7fe4) wumpz *2019-08-13 19:26:13*
-
-**fixes #377**
-
-
-[9b6c4](https://github.com/JSQLParser/JSqlParser/commit/9b6c46c376f4591) wumpz *2019-08-13 19:24:23*
-
-**fixes #489**
-
-
-[27139](https://github.com/JSQLParser/JSqlParser/commit/27139a034edda7b) wumpz *2019-08-13 19:21:27*
-
-**fixes #648**
-
-* fixes #638 
-
-[74e02](https://github.com/JSQLParser/JSqlParser/commit/74e02267404da4e) wumpz *2019-08-13 19:19:12*
-
-****
-
-
-[36907](https://github.com/JSQLParser/JSqlParser/commit/36907e4e1295fc1) wumpz *2019-08-11 22:25:40*
-
-****
-
-
-[48dbd](https://github.com/JSQLParser/JSqlParser/commit/48dbd58c6ad38bc) wumpz *2019-08-11 20:54:19*
-
-****
-
-
-[089e6](https://github.com/JSQLParser/JSqlParser/commit/089e6b4667ca921) wumpz *2019-08-11 20:32:24*
-
-****
-
-
-[ca821](https://github.com/JSQLParser/JSqlParser/commit/ca821e5277c8ffd) wumpz *2019-08-11 20:31:58*
-
-****
-
-
-[b3cfd](https://github.com/JSQLParser/JSqlParser/commit/b3cfdac1a31a8de) wumpz *2019-08-11 08:36:52*
-
-****
-
-
-[d86cb](https://github.com/JSQLParser/JSqlParser/commit/d86cb90b0f0ff5b) wumpz *2019-08-11 08:08:22*
-
-****
-
-
-[68d01](https://github.com/JSQLParser/JSqlParser/commit/68d01212af90b3d) wumpz *2019-08-11 08:06:16*
-
-**fixes #838**
-
-
-[1d1b6](https://github.com/JSQLParser/JSqlParser/commit/1d1b62507670a9b) wumpz *2019-08-09 21:22:53*
-
-**fixes #826**
-
-
-[7567d](https://github.com/JSQLParser/JSqlParser/commit/7567d25fdabf631) wumpz *2019-08-09 20:59:36*
-
-**fixes #826**
-
-
-[01296](https://github.com/JSQLParser/JSqlParser/commit/01296c302471a9c) wumpz *2019-08-09 20:49:18*
-
-****
-
-
-[30619](https://github.com/JSQLParser/JSqlParser/commit/30619d8f214d876) wumpz *2019-08-09 14:07:15*
-
-**Delete ISSUE_TEMPLATE.md**
-
-
-[9bea1](https://github.com/JSQLParser/JSqlParser/commit/9bea1e3850e2078) Tobias *2019-08-09 06:31:24*
-
-**Update issue templates**
-
-
-[1182e](https://github.com/JSQLParser/JSqlParser/commit/1182e8b792beac4) Tobias *2019-08-09 06:31:05*
-
-**fixes #828**
-
-
-[5139f](https://github.com/JSQLParser/JSqlParser/commit/5139fb279960013) wumpz *2019-08-08 21:16:23*
-
-**fixes #828**
-
-
-[8d0de](https://github.com/JSQLParser/JSqlParser/commit/8d0dec177748bdf) wumpz *2019-08-08 21:11:19*
-
-****
-
-
-[c766e](https://github.com/JSQLParser/JSqlParser/commit/c766ebce151708c) wumpz *2019-08-07 23:24:17*
-
-****
-
-
-[1a732](https://github.com/JSQLParser/JSqlParser/commit/1a732025a27872d) wumpz *2019-08-07 23:22:23*
-
-****
-
-
-[5c530](https://github.com/JSQLParser/JSqlParser/commit/5c5303eb8997f03) wumpz *2019-08-07 18:20:34*
-
-**Updated test**
-
-
-[47457](https://github.com/JSQLParser/JSqlParser/commit/47457ed95a8e688) Tomer S *2019-08-05 20:14:23*
-
-**Fix issue of missing comma between joins in subjoin**
-
-
-[92db2](https://github.com/JSQLParser/JSqlParser/commit/92db2d81fbed39d) Tomer S *2019-08-05 19:43:18*
-
-**Fix issue of missing comma between joins in subjoin**
-
-
-[449c4](https://github.com/JSQLParser/JSqlParser/commit/449c4e89c2a9c6a) Tomer S *2019-08-05 19:32:41*
-
-****
-
-
-[e586f](https://github.com/JSQLParser/JSqlParser/commit/e586fa31e251221) t.warneke@gmx.net *2019-08-03 23:27:55*
-
-**Update latest version(1.4 => 2.1)**
-
-
-[5768e](https://github.com/JSQLParser/JSqlParser/commit/5768ea92f63c2ab) yidasanqian *2019-08-02 09:29:48*
-
-**added linkast to table**
-
-
-[9c5f5](https://github.com/JSQLParser/JSqlParser/commit/9c5f52f3dddb10c) wumpz *2019-08-01 06:44:58*
-
-**The duration part in INTERVAL expressions can contain a column and not only a constant - now supporting that use case**
-
-
-[5492f](https://github.com/JSQLParser/JSqlParser/commit/5492f5105a75781) Tomer S *2019-07-26 17:15:25*
-
-****
-
-
-[1314c](https://github.com/JSQLParser/JSqlParser/commit/1314cd0e7f05543) wumpz *2019-07-22 22:00:36*
-
-****
-
-
-[2b944](https://github.com/JSQLParser/JSqlParser/commit/2b944807b6e9058) wumpz *2019-07-22 21:17:54*
-
-****
-
-
-[86693](https://github.com/JSQLParser/JSqlParser/commit/86693e0bf34fbf9) wumpz *2019-07-21 21:33:59*
-
-**proof of correct parsing for #829**
-
-
-[12ff2](https://github.com/JSQLParser/JSqlParser/commit/12ff225b0afd16f) wumpz *2019-07-21 21:27:36*
-
-**fixes #830**
-
-
-[a416b](https://github.com/JSQLParser/JSqlParser/commit/a416b96e7576dd0) wumpz *2019-07-21 21:11:51*
-
-**fixes #830**
-
-
-[5fc7c](https://github.com/JSQLParser/JSqlParser/commit/5fc7ce8f6cfeef6) wumpz *2019-07-21 21:08:22*
-
-****
-
-
-[914ee](https://github.com/JSQLParser/JSqlParser/commit/914ee73b6de95ae) wumpz *2019-07-21 20:42:54*
-
-****
-
-
-[0b404](https://github.com/JSQLParser/JSqlParser/commit/0b404539ab6e985) wumpz *2019-07-21 20:42:38*
-
-**Update README.md**
-
-
-[216bd](https://github.com/JSQLParser/JSqlParser/commit/216bd3733cacfee) Tobias *2019-07-19 06:23:59*
-
-**Update README.md**
-
-
-[7077d](https://github.com/JSQLParser/JSqlParser/commit/7077d2148bf9e06) Tobias *2019-07-18 05:58:47*
-
-**Update README.md**
-
-
-[6148a](https://github.com/JSQLParser/JSqlParser/commit/6148a895113ed5b) Tobias *2019-07-18 05:57:14*
-
-**Update README.md**
-
-
-[f28b6](https://github.com/JSQLParser/JSqlParser/commit/f28b6252683d2d4) Tobias *2019-07-18 05:56:14*
-
-****
-
-
-[34014](https://github.com/JSQLParser/JSqlParser/commit/34014c2b9ac862f) wumpz *2019-07-17 22:46:55*
-
-**allow jdk 11 build**
-
-
-[73be3](https://github.com/JSQLParser/JSqlParser/commit/73be39017363a4e) wumpz *2019-07-17 22:36:28*
-
-**allow jdk 11 build**
-
-
-[2cf8e](https://github.com/JSQLParser/JSqlParser/commit/2cf8e15b8987458) wumpz *2019-07-17 22:35:51*
-
-**fixes limit as name for jdbc named parameters**
-
-
-[7034c](https://github.com/JSQLParser/JSqlParser/commit/7034cb10c6abe11) wumpz *2019-07-17 22:03:55*
-
-**Update README.md**
-
-
-[bf942](https://github.com/JSQLParser/JSqlParser/commit/bf942f92098f5cc) Tobias *2019-07-12 20:37:33*
-
-**Update FUNDING.yml**
-
-
-[448da](https://github.com/JSQLParser/JSqlParser/commit/448da80f820a270) Tobias *2019-07-12 20:33:32*
-
-**Create FUNDING.yml**
-
-
-[73c82](https://github.com/JSQLParser/JSqlParser/commit/73c82ad776db592) Tobias *2019-07-12 20:32:32*
-
-****
-
-
-[55f20](https://github.com/JSQLParser/JSqlParser/commit/55f20e07faa13ee) wumpz *2019-07-10 23:12:27*
-
-****
-
-
-[27552](https://github.com/JSQLParser/JSqlParser/commit/275522f53782871) wumpz *2019-07-10 21:43:51*
-
-**moved to java 8**
-
-
-[bfb8e](https://github.com/JSQLParser/JSqlParser/commit/bfb8e274f247350) wumpz *2019-07-09 22:41:18*
-
-****
-
-
-[39c6a](https://github.com/JSQLParser/JSqlParser/commit/39c6a4885f7bd20) wumpz *2019-07-09 22:31:35*
-
-****
-
-
-[6001f](https://github.com/JSQLParser/JSqlParser/commit/6001fdecada77fa) wumpz *2019-07-09 21:15:42*
-
-****
-
-
-[cfc3f](https://github.com/JSQLParser/JSqlParser/commit/cfc3f64850410bc) wumpz *2019-07-09 21:12:01*
-
-**Support default mode in full text search**
-
-
-[ecb54](https://github.com/JSQLParser/JSqlParser/commit/ecb5464ccb6bab4) Tomer S *2019-07-07 18:04:00*
-
-****
-
-
-[0022e](https://github.com/JSQLParser/JSqlParser/commit/0022ef4889f39de) wumpz *2019-07-07 12:11:44*
-
-****
-
-
-[694d0](https://github.com/JSQLParser/JSqlParser/commit/694d06ccf707494) wumpz *2019-07-04 21:51:34*
-
-**Add support for full text search (MATCH..AGAINST)**
-
-
-[6750a](https://github.com/JSQLParser/JSqlParser/commit/6750a5360084439) Tomer S *2019-07-04 21:23:25*
-
-****
-
-
-[c88f5](https://github.com/JSQLParser/JSqlParser/commit/c88f5ba08f4ee41) wumpz *2019-07-04 20:51:01*
-
-**Adding support for IS [NOT] TRUE/FALSE expressions**
-
-
-[00839](https://github.com/JSQLParser/JSqlParser/commit/0083971851df6d4) Tomer S *2019-07-02 21:39:16*
-
-**Adding support for the DIV operator**
-
-
-[c8bbc](https://github.com/JSQLParser/JSqlParser/commit/c8bbc0f7ecf198e) Tomer S *2019-07-02 19:28:47*
-
-**fixes #200 - was already fixed, introduced test case**
-
-
-[4d100](https://github.com/JSQLParser/JSqlParser/commit/4d100a7c011abda) wumpz *2019-07-02 12:43:46*
-
-**fixes #259 - was already fixed, introduced test case**
-
-
-[500ee](https://github.com/JSQLParser/JSqlParser/commit/500ee6e5010fe79) wumpz *2019-07-02 12:40:33*
-
-**fixes #262 - was already fixed, introduced test case**
-
-
-[dbdfb](https://github.com/JSQLParser/JSqlParser/commit/dbdfb4ea45121c9) wumpz *2019-07-02 12:36:31*
-
-**fixes #113**
-
-
-[cd16a](https://github.com/JSQLParser/JSqlParser/commit/cd16a6d911fe8b2) wumpz *2019-07-02 12:28:02*
-
-****
-
-
-[424c8](https://github.com/JSQLParser/JSqlParser/commit/424c81ce91887d5) wumpz *2019-06-30 19:55:27*
-
-****
-
-
-[d6949](https://github.com/JSQLParser/JSqlParser/commit/d6949999cd77c97) wumpz *2019-06-30 17:08:23*
-
-**Add support for STRAIGHT_JOIN**
-
-
-[89089](https://github.com/JSQLParser/JSqlParser/commit/890898806d2b6b3) Tomer S *2019-04-04 17:15:48*
-
-
-## jsqlparser-2.1 (2019-06-30)
-
-### Other changes
-
-**fixes #812**
-
-
-[38aad](https://github.com/JSQLParser/JSqlParser/commit/38aadee9b2a941b) wumpz *2019-06-25 23:07:07*
-
-**Update README.md**
-
-
-[4763d](https://github.com/JSQLParser/JSqlParser/commit/4763d455148bb75) Tobias *2019-06-25 12:28:29*
-
-**Update README.md**
-
-
-[334b5](https://github.com/JSQLParser/JSqlParser/commit/334b5498859733d) Tobias *2019-06-25 12:27:52*
-
-**Support KSQL's WINDOW**
-
-* Add support for KSQL&#x27;s WINDOW (HOPPING, TUMBLING and SESSION window) 
-
-[ef911](https://github.com/JSQLParser/JSqlParser/commit/ef9119806146f25) Suyash Garg *2019-06-21 12:00:06*
-
-**downgraded javacc version to allow java 7 build**
-
-
-[6e7b9](https://github.com/JSQLParser/JSqlParser/commit/6e7b976d65d7eb6) wumpz *2019-06-19 07:33:53*
-
-**downgraded checkstyle version to allow java 7 build**
-
-
-[a9c29](https://github.com/JSQLParser/JSqlParser/commit/a9c29ffceab9e58) wumpz *2019-06-19 07:29:55*
-
-**Update README.md**
-
-
-[b5915](https://github.com/JSQLParser/JSqlParser/commit/b59151eae9d2ac5) Tobias *2019-06-16 22:11:11*
-
-****
-
-
-[afcc0](https://github.com/JSQLParser/JSqlParser/commit/afcc0a9b2063ade) wumpz *2019-06-16 21:49:09*
-
-****
-
-
-[1d203](https://github.com/JSQLParser/JSqlParser/commit/1d203850be1679c) wumpz *2019-06-16 21:06:13*
-
-**fixes #789**
-
-
-[cdf80](https://github.com/JSQLParser/JSqlParser/commit/cdf805f4028b801) wumpz *2019-06-16 21:02:47*
-
-**fixes #450**
-
-
-[83dba](https://github.com/JSQLParser/JSqlParser/commit/83dbac2d9841d21) wumpz *2019-06-13 22:11:29*
-
-**support postgresql create index syntax**
-
-
-[9d74c](https://github.com/JSQLParser/JSqlParser/commit/9d74c6da03976ea) theodore johnson *2019-06-13 22:02:11*
-
-**fixes #705**
-
-
-[9ce65](https://github.com/JSQLParser/JSqlParser/commit/9ce65cde0f25ae1) wumpz *2019-06-13 21:38:14*
-
-**site update**
-
-
-[89f20](https://github.com/JSQLParser/JSqlParser/commit/89f202a3062b30a) wumpz *2019-05-29 13:40:18*
-
-**fixes #798**
-
-
-[dd806](https://github.com/JSQLParser/JSqlParser/commit/dd806991c4283d0) wumpz *2019-05-24 21:09:13*
-
-**fixes #796**
-
-
-[aecc4](https://github.com/JSQLParser/JSqlParser/commit/aecc41442a8dfd3) wumpz *2019-05-18 21:00:13*
-
-**fixes #785**
-
-
-[f59f2](https://github.com/JSQLParser/JSqlParser/commit/f59f2b5c9b8e33e) wumpz *2019-05-04 22:54:28*
-
-**Fix #786 (#787)**
-
-
-[f2aba](https://github.com/JSQLParser/JSqlParser/commit/f2aba0b4ef018a1) Ryan J Murphy *2019-04-22 22:28:38*
-
-****
-
-
-[44ff9](https://github.com/JSQLParser/JSqlParser/commit/44ff9ed6bd0d39d) wumpz *2019-04-22 22:28:10*
-
-**fixes #773 added nextval as a valid object name**
-
-
-[94a2a](https://github.com/JSQLParser/JSqlParser/commit/94a2a40fa7f93a2) wumpz *2019-04-17 08:15:50*
-
-****
-
-
-[85a3e](https://github.com/JSQLParser/JSqlParser/commit/85a3e69fed2db1a) wumpz *2019-04-17 07:05:47*
-
-****
-
-
-[8d4b3](https://github.com/JSQLParser/JSqlParser/commit/8d4b32a28e3eac1) wumpz *2019-04-17 07:00:01*
-
-****
-
-
-[703a7](https://github.com/JSQLParser/JSqlParser/commit/703a7459a529343) wumpz *2019-04-17 06:43:37*
-
-**recreated "old" javadocs (without improving it)**
-
-
-[74e2a](https://github.com/JSQLParser/JSqlParser/commit/74e2a4b4498088e) wumpz *2019-04-17 06:19:27*
-
-**recreated "old" javadocs (without improving it)**
-
-
-[4fed7](https://github.com/JSQLParser/JSqlParser/commit/4fed7536c8036ed) wumpz *2019-04-16 07:59:20*
-
-**JavaDoc for Column#getTable (#782)**
-
-
-[4f500](https://github.com/JSQLParser/JSqlParser/commit/4f500a48572234a) Andrea Arcuri *2019-04-15 12:01:37*
-
-****
-
-
-[e2168](https://github.com/JSQLParser/JSqlParser/commit/e2168407d929c77) wumpz *2019-04-13 23:57:14*
-
-**fixes #777**
-
-
-[35a1c](https://github.com/JSQLParser/JSqlParser/commit/35a1c97f3609007) wumpz *2019-04-12 22:30:00*
-
-**tests #775**
-
-* removed some not flags from some classes 
-
-[8dda4](https://github.com/JSQLParser/JSqlParser/commit/8dda4a60a8e558d) wumpz *2019-04-08 21:36:40*
-
-**tests #754**
-
-
-[97797](https://github.com/JSQLParser/JSqlParser/commit/97797425f635621) wumpz *2019-03-31 21:22:51*
-
-**fixes #770**
-
-
-[86ea6](https://github.com/JSQLParser/JSqlParser/commit/86ea6016636fe5b) wumpz *2019-03-28 22:19:33*
-
-****
-
-
-[f958f](https://github.com/JSQLParser/JSqlParser/commit/f958fa741dea3d0) wumpz *2019-03-20 22:41:16*
-
-****
-
-
-[b1da6](https://github.com/JSQLParser/JSqlParser/commit/b1da6e5225a2269) wumpz *2019-03-20 22:37:59*
-
-**fixes #766**
-
-
-[1bb5c](https://github.com/JSQLParser/JSqlParser/commit/1bb5c3d5823560d) wumpz *2019-03-20 22:05:30*
-
-**fixes #755 - corrected error introduced due to corrected ExpressionDeParser.**
-
-
-[0002c](https://github.com/JSQLParser/JSqlParser/commit/0002cb717106722) wumpz *2019-03-20 09:57:29*
-
-**fixes #755**
-
-
-[a6905](https://github.com/JSQLParser/JSqlParser/commit/a690558d1d8f19d) wumpz *2019-03-20 09:38:36*
-
-****
-
-
-[aff50](https://github.com/JSQLParser/JSqlParser/commit/aff505390efcb9c) wumpz *2019-03-20 06:46:44*
-
-****
-
-
-[7da90](https://github.com/JSQLParser/JSqlParser/commit/7da901adcb0370d) wumpz *2019-03-20 06:45:31*
-
-****
-
-
-[18a3c](https://github.com/JSQLParser/JSqlParser/commit/18a3c4acb6f84bb) wumpz *2019-03-20 06:35:17*
-
-**activated new checkstyle plugin only if used java is at least 1.8**
-
-
-[1b4e9](https://github.com/JSQLParser/JSqlParser/commit/1b4e9957ecd9daf) wumpz *2019-03-17 23:00:12*
-
-****
-
-
-[6ceb4](https://github.com/JSQLParser/JSqlParser/commit/6ceb4062d3ccb2c) wumpz *2019-03-16 22:56:17*
-
-**upgraded checkstyle due to security alert**
-
-
-[cb172](https://github.com/JSQLParser/JSqlParser/commit/cb1726e478d39e6) wumpz *2019-03-16 22:40:36*
-
-**Fixed typos in README.md (#760)**
-
-
-[67dce](https://github.com/JSQLParser/JSqlParser/commit/67dce2f40b4e484) alterdego *2019-03-14 12:20:26*
-
-**update README.md (#762)**
-
-* update latest version(1.4) 
-
-[13d6a](https://github.com/JSQLParser/JSqlParser/commit/13d6a9fe183a5ab) r548 *2019-03-14 12:19:58*
-
-****
-
-
-[46323](https://github.com/JSQLParser/JSqlParser/commit/46323b4df4119e6) wumpz *2019-03-12 07:56:12*
-
-
-## jsqlparser-2.0 (2019-03-16)
-
-### Other changes
-
-****
-
-
-[526b9](https://github.com/JSQLParser/JSqlParser/commit/526b90b8d353a01) wumpz *2019-03-16 22:16:01*
-
-**corrected test**
-
-
-[4ad79](https://github.com/JSQLParser/JSqlParser/commit/4ad79d05b5306c2) wumpz *2019-03-04 18:46:57*
-
-**fixes #17**
-
-
-[1ef39](https://github.com/JSQLParser/JSqlParser/commit/1ef39301666c3e3) wumpz *2019-03-04 00:26:21*
-
-**refactored group by expressions into separate class, first step to support grouping sets**
-
-
-[82f3d](https://github.com/JSQLParser/JSqlParser/commit/82f3da8ce946d70) wumpz *2019-03-03 22:25:31*
-
-****
-
-
-[749ad](https://github.com/JSQLParser/JSqlParser/commit/749ad556d917a01) wumpz *2019-02-26 23:09:43*
-
-**Fixes 649 to add support for HOUR, MINUTE, SECOND date literals and support for identifiers as the interval parameter. (#756)**
-
-
-[cbcf0](https://github.com/JSQLParser/JSqlParser/commit/cbcf0a73d516bfc) thebiguno *2019-02-25 22:23:16*
-
-****
-
-
-[c85e7](https://github.com/JSQLParser/JSqlParser/commit/c85e79b3cd75119) wumpz *2019-02-24 22:17:37*
-
-****
-
-
-[0f9bb](https://github.com/JSQLParser/JSqlParser/commit/0f9bb4e6272f71b) wumpz *2019-02-24 19:59:06*
-
-**fixes #649**
-
-* and implemented ! for not and extended not expression 
-
-[10e8e](https://github.com/JSQLParser/JSqlParser/commit/10e8e2568eb7711) wumpz *2019-02-23 23:32:38*
-
-****
-
-
-[15297](https://github.com/JSQLParser/JSqlParser/commit/15297868572dba9) wumpz *2019-02-20 23:30:16*
-
-****
-
-
-[12c05](https://github.com/JSQLParser/JSqlParser/commit/12c056451444678) wumpz *2019-02-20 23:20:35*
-
-****
-
-
-[14f92](https://github.com/JSQLParser/JSqlParser/commit/14f92b13cc4503f) wumpz *2019-02-20 23:05:20*
-
-**fixes #164**
-
-
-[8c057](https://github.com/JSQLParser/JSqlParser/commit/8c057ab735f0249) wumpz *2019-02-20 22:41:50*
-
-**fixes #169**
-
-
-[e1193](https://github.com/JSQLParser/JSqlParser/commit/e1193a63a6551ba) wumpz *2019-02-20 21:43:45*
-
-**fixes #479**
-
-
-[0b5f5](https://github.com/JSQLParser/JSqlParser/commit/0b5f586cf3f9250) wumpz *2019-02-19 22:29:58*
-
-**fixes #479**
-
-
-[b029b](https://github.com/JSQLParser/JSqlParser/commit/b029bb5860b3ed3) wumpz *2019-02-19 22:28:06*
-
-**Update README.md**
-
-
-[fa162](https://github.com/JSQLParser/JSqlParser/commit/fa1624165e80895) Tobias *2019-02-19 17:31:13*
-
-**Added support for DROP INDEX, ADD UNIQUE INDEX, ALGORITHM and USING (#752)**
-
-* Merge recent changes in the master from the master (#1) 
-* changed license header to represent the projects dual license 
-* changed license header to represent the projects dual license 
-* changed license header to represent the projects dual license 
-* changed license header to represent the projects dual license 
-* Added support for comment(s) for column definitions in CREATE TABLE s… (#743) 
-* Added support for comment(s) for column definitions in CREATE TABLE statements 
-* Added support for comment(s) for column definitions in CREATE TABLE statements #2 
-* To increase code coverage 
-* To increase code coverage #2 
-* Added support for &#x27;ALTER TABLE CHANGE COLUMN&#x27; (#741) 
-* Added support for &#x27;ALTER TABLE CHANGE COLUMN oldName newName columnDefinition&#x27;. Please see https://dev.mysql.com/doc/refman/8.0/en/alter-table.html for reference. 
-* Returned import ordering to avoid conflicts 
-* Improved the tests somewhat 
-* Now also test the getOptionalSpecifier() for both cases (null and not-null) 
-* Expanded tests for ALTER TABLE ... CHANGE 
-* implemented optimize for, fixes #348 
-* implemented optimize for, fixes #348 
-* Support for simple informix outer joins. (#745) 
-* added support for simple informix outer joins 
-* added some test code 
-* added support for simple informix outer joins 
-* added some test code 
-* more testing for better code coverage 
-* added support for simple informix outer joins 
-* added some test code 
-* more testing for better code coverage 
-* fixes #747 
-* fixes #733 
-* fixes #707 
-* Update README.md 
-* Update README.md 
-* Fix handles the following cases: 1) DROP INDEX 2) ADD UNIQUE INDEX 3) ALGORITHM 4) USING &lt;index type&gt; 
-
-[2830c](https://github.com/JSQLParser/JSqlParser/commit/2830c17ea226635) Prateek Gupta *2019-02-19 00:44:35*
-
-**fixes #753**
-
-
-[3209a](https://github.com/JSQLParser/JSqlParser/commit/3209a16c55c1976) wumpz *2019-02-19 00:35:14*
-
-**Update README.md**
-
-
-[4f74f](https://github.com/JSQLParser/JSqlParser/commit/4f74f6d110166a8) Tobias *2019-02-15 21:12:05*
-
-**Update README.md**
-
-
-[f9609](https://github.com/JSQLParser/JSqlParser/commit/f960991759ed604) Tobias *2019-02-15 21:07:41*
-
-**fixes #707**
-
-
-[a1c4f](https://github.com/JSQLParser/JSqlParser/commit/a1c4f4a7ddda62e) wumpz *2019-02-14 22:50:16*
-
-****
-
-
-[6c413](https://github.com/JSQLParser/JSqlParser/commit/6c413b404b1bd27) wumpz *2019-02-11 23:07:46*
-
-**fixes #733**
-
-
-[6da69](https://github.com/JSQLParser/JSqlParser/commit/6da696b496eb794) wumpz *2019-02-10 23:11:54*
-
-**fixes #747**
-
-
-[d3553](https://github.com/JSQLParser/JSqlParser/commit/d3553bc7f8c3b12) wumpz *2019-02-10 23:00:02*
-
-****
-
-
-[73305](https://github.com/JSQLParser/JSqlParser/commit/73305fe6a6efec1) wumpz *2019-02-10 22:55:01*
-
-****
-
-
-[f79f5](https://github.com/JSQLParser/JSqlParser/commit/f79f58d9f8f5c73) wumpz *2019-02-10 22:38:19*
-
-****
-
-
-[154cf](https://github.com/JSQLParser/JSqlParser/commit/154cf371d775b9b) wumpz *2019-02-10 21:54:45*
-
-****
-
-
-[80153](https://github.com/JSQLParser/JSqlParser/commit/80153dfdf60f9b4) wumpz *2019-02-10 21:14:10*
-
-****
-
-
-[04151](https://github.com/JSQLParser/JSqlParser/commit/0415140ecf58894) wumpz *2019-02-08 07:13:18*
-
-**Support for simple informix outer joins. (#745)**
-
-* added support for simple informix outer joins 
-* added some test code 
-* added support for simple informix outer joins 
-* added some test code 
-* more testing for better code coverage 
-* added support for simple informix outer joins 
-* added some test code 
-* more testing for better code coverage 
-
-[53e24](https://github.com/JSQLParser/JSqlParser/commit/53e247bffdae557) Kurt Schwitters *2019-02-08 05:52:51*
-
-****
-
-
-[1a3d2](https://github.com/JSQLParser/JSqlParser/commit/1a3d289238eec35) wumpz *2019-02-07 23:30:55*
-
-****
-
-
-[9ec7d](https://github.com/JSQLParser/JSqlParser/commit/9ec7d8572ca0424) wumpz *2019-02-07 23:30:00*
-
-****
-
-
-[63477](https://github.com/JSQLParser/JSqlParser/commit/6347776ad571d92) wumpz *2019-02-07 23:25:29*
-
-**implemented optimize for, fixes #348**
-
-
-[ff23d](https://github.com/JSQLParser/JSqlParser/commit/ff23dde74433355) wumpz *2019-02-07 23:21:22*
-
-**implemented optimize for, fixes #348**
-
-
-[4b0b5](https://github.com/JSQLParser/JSqlParser/commit/4b0b5cb044bc973) wumpz *2019-02-07 23:19:46*
-
-**Added support for 'ALTER TABLE CHANGE COLUMN' (#741)**
-
-* Added support for &#x27;ALTER TABLE CHANGE COLUMN oldName newName columnDefinition&#x27;. Please see https://dev.mysql.com/doc/refman/8.0/en/alter-table.html for reference. 
-* Returned import ordering to avoid conflicts 
-* Improved the tests somewhat 
-* Now also test the getOptionalSpecifier() for both cases (null and not-null) 
-* Expanded tests for ALTER TABLE ... CHANGE 
-
-[bfb80](https://github.com/JSQLParser/JSqlParser/commit/bfb8023318c31b2) Simon *2019-02-07 14:49:28*
-
-**Added support for comment(s) for column definitions in CREATE TABLE s… (#743)**
-
-* Added support for comment(s) for column definitions in CREATE TABLE statements 
-* Added support for comment(s) for column definitions in CREATE TABLE statements #2 
-* To increase code coverage 
-* To increase code coverage #2 
-
-[07b86](https://github.com/JSQLParser/JSqlParser/commit/07b86761d0b4aee) Prateek Gupta *2019-02-07 07:09:26*
-
-**changed license header to represent the projects dual license**
-
-
-[b9023](https://github.com/JSQLParser/JSqlParser/commit/b90234f0fc39d34) wumpz *2019-02-06 20:53:15*
-
-**changed license header to represent the projects dual license**
-
-
-[2adec](https://github.com/JSQLParser/JSqlParser/commit/2adec6ad552f770) wumpz *2019-02-06 20:48:58*
-
-**changed license header to represent the projects dual license**
-
-
-[4ad99](https://github.com/JSQLParser/JSqlParser/commit/4ad996f778f043b) wumpz *2019-02-06 20:47:19*
-
-**changed license header to represent the projects dual license**
-
-
-[373c6](https://github.com/JSQLParser/JSqlParser/commit/373c6cb59734091) wumpz *2019-02-05 23:04:45*
-
-**integrated some additional AST - Nodes for InExpression and SimpleExpressionList**
-
-
-[cb0e0](https://github.com/JSQLParser/JSqlParser/commit/cb0e0b79564258a) wumpz *2019-02-04 01:17:35*
-
-****
-
-
-[4e0a7](https://github.com/JSQLParser/JSqlParser/commit/4e0a7326a9d9e9e) wumpz *2019-02-03 23:20:03*
-
-**case else corrected to allow conditions here as well**
-
-
-[4f7a1](https://github.com/JSQLParser/JSqlParser/commit/4f7a1537e7ba368) wumpz *2019-02-03 22:53:22*
-
-**refactored outer not from sqlconditions, regularconditions to condition**
-
-
-[aae36](https://github.com/JSQLParser/JSqlParser/commit/aae36da486303f8) wumpz *2019-02-03 21:07:08*
-
-**refactored outer not from sqlconditions, regularconditions to condition**
-
-
-[1956b](https://github.com/JSQLParser/JSqlParser/commit/1956b84395fcab9) wumpz *2019-02-03 20:57:41*
-
-**strange not problem**
-
-
-[ba3bf](https://github.com/JSQLParser/JSqlParser/commit/ba3bf2241c1021b) wumpz *2019-02-03 19:57:00*
-
-**named exec procedure parameters**
-
-
-[82b28](https://github.com/JSQLParser/JSqlParser/commit/82b287dae64ac43) wumpz *2019-02-01 23:51:28*
-
-**finished multi value set**
-
-
-[479ee](https://github.com/JSQLParser/JSqlParser/commit/479ee39d6efbb6d) wumpz *2019-01-27 00:37:33*
-
-**finished multi value set**
-
-
-[ba4b0](https://github.com/JSQLParser/JSqlParser/commit/ba4b0ccee2cf20a) wumpz *2019-01-27 00:35:17*
-
-**started multivalue set**
-
-
-[d991b](https://github.com/JSQLParser/JSqlParser/commit/d991bbe377418a1) wumpz *2019-01-26 00:44:59*
-
-**corrected typing error. Both licenses could not be applied at the same time.**
-
-
-[7cd18](https://github.com/JSQLParser/JSqlParser/commit/7cd189c326d3d84) wumpz *2019-01-23 23:22:12*
-
-**allow top keyword as column / table / alias name**
-
-* implemented tests 
-
-[9e81e](https://github.com/JSQLParser/JSqlParser/commit/9e81e1592200952) wumpz *2019-01-23 23:00:12*
-
-**allow top keyword as column / table / alias name**
-
-* implemented tests 
-
-[ed95e](https://github.com/JSQLParser/JSqlParser/commit/ed95e877802f46e) wumpz *2019-01-23 22:58:39*
-
-**implemented _utf8**
-
-
-[fe28e](https://github.com/JSQLParser/JSqlParser/commit/fe28e88d948dc7e) wumpz *2019-01-23 21:36:42*
-
-**implemented explain select**
-
-
-[e5c6f](https://github.com/JSQLParser/JSqlParser/commit/e5c6ff6fdf3d4b2) wumpz *2019-01-22 23:28:33*
-
-**implemented explain select**
-
-
-[fb45d](https://github.com/JSQLParser/JSqlParser/commit/fb45dd7c77ccff0) wumpz *2019-01-22 23:06:34*
-
-**Add support for casting to signed integer (#734)**
-
-
-[5b00a](https://github.com/JSQLParser/JSqlParser/commit/5b00ace4d49b731) tomershay *2019-01-21 22:58:57*
-
-**corrected stackoverflow while tables extraction**
-
-* updated readme 
-
-[04db1](https://github.com/JSQLParser/JSqlParser/commit/04db124b85dea22) wumpz *2019-01-20 22:33:51*
-
-**implemented DescribeStatement, corrected TableNamesFinder, corrected corresponding interfaces and adapters, implemented tests.**
-
-
-[1c411](https://github.com/JSQLParser/JSqlParser/commit/1c411f490e91f16) wumpz *2019-01-20 22:24:47*
-
-**started describe**
-
-* some cleanup 
-
-[25fa3](https://github.com/JSQLParser/JSqlParser/commit/25fa31153a9a2d0) wumpz *2019-01-20 21:48:12*
-
-
-## jsqlparser-1.4 (2019-01-09)
-
-### Other changes
-
-**Support Alter Table Add Unique Constraint (#708)**
-
-
-[a54ea](https://github.com/JSQLParser/JSqlParser/commit/a54ea143e7eeffe) Robert Scholte *2018-12-30 23:37:29*
-
-**corrected some failing tests**
-
-* included a regression test for oracle files 
-
-[aa932](https://github.com/JSQLParser/JSqlParser/commit/aa932c4a28d8021) wumpz *2018-12-30 23:06:59*
-
-**Add 'SHOW COLUMNS FROM table' (#728)**
-
-
-[f1724](https://github.com/JSQLParser/JSqlParser/commit/f1724a468577935) Ohad Shai *2018-12-28 11:45:53*
-
-**Support Alter Table Drop Constraint If Exists (#709)**
-
-* Support Alter Table Drop Constraint If Exists 
-* #709 add constraintIfExists flag 
-
-[08fed](https://github.com/JSQLParser/JSqlParser/commit/08fedf752a3f99d) Robert Scholte *2018-12-13 07:14:10*
-
-**Support Alter Table Alter Column Type (#724)**
-
-
-[b3263](https://github.com/JSQLParser/JSqlParser/commit/b3263c8cbae9296) Robert Scholte *2018-12-13 07:13:12*
-
-**Support KSQL's WITHIN (#722)**
-
-* Implements WITHIN for KSQL windowed joins 
-* Clean up 
-* Improve test 
-* Implements WITHIN ( before TimeUnit, after TimeUnit ) for KSQL 
-* Also restricts TimeUnit to units accepted by KSQL 
-* WITHIN should come before ON 
-
-[ae665](https://github.com/JSQLParser/JSqlParser/commit/ae665e60655f45f) Lionel Montrieux *2018-12-11 21:53:07*
-
-**Add support for truncate table (#719)**
-
-
-[11be7](https://github.com/JSQLParser/JSqlParser/commit/11be71561824c36) Bartosz Firyn *2018-12-06 06:41:30*
-
-**fixes #718**
-
-
-[c0801](https://github.com/JSQLParser/JSqlParser/commit/c0801a742c57ea0) wumpz *2018-12-04 15:23:42*
-
-**added test for issue #716**
-
-
-[f06b1](https://github.com/JSQLParser/JSqlParser/commit/f06b19769b2eb2a) wumpz *2018-11-22 21:11:12*
-
-**REPLACE VIEW as a synonym to ALTER VIEW (#711)**
-
-
-[58d39](https://github.com/JSQLParser/JSqlParser/commit/58d3965914376bf) theodore johnson *2018-11-19 14:50:36*
-
-**Update README.md**
-
-
-[7b6cf](https://github.com/JSQLParser/JSqlParser/commit/7b6cff1222e1314) Tobias *2018-10-26 19:39:58*
-
-**Update README.md**
-
-
-[78ebf](https://github.com/JSQLParser/JSqlParser/commit/78ebf2093a98fb5) Tobias *2018-10-26 19:38:42*
-
-****
-
-
-[22c04](https://github.com/JSQLParser/JSqlParser/commit/22c04947e3834e6) wumpz *2018-10-26 11:12:37*
-
-**some cleaning up for pr #702**
-
-
-[b7754](https://github.com/JSQLParser/JSqlParser/commit/b7754e8003adec6) wumpz *2018-10-25 12:40:09*
-
-**support named parameters (#702)**
-
-
-[eacb1](https://github.com/JSQLParser/JSqlParser/commit/eacb161fe848237) theodore johnson *2018-10-25 10:52:41*
-
-**Added Oracle COMMENT statement (#685)**
-
-
-[e79cc](https://github.com/JSQLParser/JSqlParser/commit/e79ccc61b5bc658) hishidama *2018-10-25 10:40:33*
-
-**fix JSQLParser/JSqlParser #679 (#703)**
-
-
-[0e35e](https://github.com/JSQLParser/JSqlParser/commit/0e35e224766ebb7) softommy *2018-10-25 10:35:19*
-
-**fixes #694**
-
-
-[48544](https://github.com/JSQLParser/JSqlParser/commit/48544387cf2e3b5) wumpz *2018-10-18 20:50:58*
-
-**fixes #675**
-
-
-[d95e0](https://github.com/JSQLParser/JSqlParser/commit/d95e034f4c1b079) wumpz *2018-10-12 22:04:57*
-
-****
-
-
-[5aa63](https://github.com/JSQLParser/JSqlParser/commit/5aa6304559a5863) wumpz *2018-10-12 21:26:26*
-
-****
-
-
-[295c1](https://github.com/JSQLParser/JSqlParser/commit/295c1147e4ef513) wumpz *2018-10-10 21:02:12*
-
-****
-
-
-[a838f](https://github.com/JSQLParser/JSqlParser/commit/a838fec1051db27) wumpz *2018-10-06 23:43:29*
-
-**fixes #561**
-
-
-[f5982](https://github.com/JSQLParser/JSqlParser/commit/f598213f071d205) wumpz *2018-10-05 20:17:59*
-
-**fixes #561**
-
-
-[e170c](https://github.com/JSQLParser/JSqlParser/commit/e170c4f17dc9ad7) wumpz *2018-10-05 20:15:58*
-
-**integrated test for values query**
-
-
-[96499](https://github.com/JSQLParser/JSqlParser/commit/964991c4207c3bf) wumpz *2018-10-04 23:19:12*
-
-**integrated values statement**
-
-
-[c0327](https://github.com/JSQLParser/JSqlParser/commit/c032744b9e083e0) wumpz *2018-10-04 22:29:11*
-
-**fixes some lgtm alerts**
-
-
-[de8ad](https://github.com/JSQLParser/JSqlParser/commit/de8ad10a791705e) wumpz *2018-10-04 08:14:00*
-
-**fixes #684 (second)**
-
-
-[2742a](https://github.com/JSQLParser/JSqlParser/commit/2742a889c4c4f0b) wumpz *2018-10-03 19:40:47*
-
-**Update README.md**
-
-
-[77026](https://github.com/JSQLParser/JSqlParser/commit/770264da8955512) Tobias *2018-10-02 22:17:03*
-
-
-## jsqlparser-1.3 (2018-10-02)
-
-### Other changes
-
-**fixes #684**
-
-
-[a8b3e](https://github.com/JSQLParser/JSqlParser/commit/a8b3e71a88735dc) wumpz *2018-10-02 21:59:16*
-
-**fixes #682**
-
-
-[c2833](https://github.com/JSQLParser/JSqlParser/commit/c28331102e5754e) wumpz *2018-09-20 05:48:34*
-
-**Add LGTM.com code quality badges (#680)**
-
-
-[3f620](https://github.com/JSQLParser/JSqlParser/commit/3f620c9e2ddeeb4) Xavier RENE-CORAIL *2018-09-15 21:17:16*
-
-**fixes #670**
-
-* added testcase, corrected deparser 
-
-[455c5](https://github.com/JSQLParser/JSqlParser/commit/455c5f50671eed9) wumpz *2018-09-10 15:38:54*
-
-**#670 (#671)**
-
-
-[3950b](https://github.com/JSQLParser/JSqlParser/commit/3950b1962f32043) mgierw *2018-09-10 15:21:40*
-
-**testcase for #670**
-
-
-[e6b9a](https://github.com/JSQLParser/JSqlParser/commit/e6b9afdb205bf2b) wumpz *2018-09-10 15:13:58*
-
-**fixes #676**
-
-
-[1786e](https://github.com/JSQLParser/JSqlParser/commit/1786e215474e8da) wumpz *2018-09-08 23:44:37*
-
-**fixes #676**
-
-
-[e32c5](https://github.com/JSQLParser/JSqlParser/commit/e32c502f91ed04a) wumpz *2018-09-08 22:12:46*
-
-****
-
-
-[26b2c](https://github.com/JSQLParser/JSqlParser/commit/26b2c11df4c4ac5) wumpz *2018-09-07 21:59:47*
-
-****
-
-
-[0b03c](https://github.com/JSQLParser/JSqlParser/commit/0b03c858b897713) wumpz *2018-09-07 21:48:03*
-
-**Update README.md (#667)**
-
-* Fix a couple typos/grammar issues 
-
-[a822f](https://github.com/JSQLParser/JSqlParser/commit/a822fead1b21793) Kai Presler-Marshall *2018-08-29 13:11:41*
-
-**fixes #665**
-
-
-[b806e](https://github.com/JSQLParser/JSqlParser/commit/b806e9c1897a0f3) wumpz *2018-08-27 06:51:39*
-
-**fixes #367**
-
-
-[14791](https://github.com/JSQLParser/JSqlParser/commit/1479149af6a0c5c) wumpz *2018-08-25 23:12:32*
-
-**fixes #367**
-
-
-[f6abb](https://github.com/JSQLParser/JSqlParser/commit/f6abb9e7edec3f1) wumpz *2018-08-25 23:10:45*
-
-**fixes #367**
-
-
-[01bcb](https://github.com/JSQLParser/JSqlParser/commit/01bcbd5255a0ebd) wumpz *2018-08-25 23:07:14*
-
-****
-
-
-[1a90b](https://github.com/JSQLParser/JSqlParser/commit/1a90b16e215ac80) wumpz *2018-08-23 22:11:35*
-
-****
-
-
-[bfbfc](https://github.com/JSQLParser/JSqlParser/commit/bfbfc76eb006201) wumpz *2018-08-23 20:26:56*
-
-**make the CreateTable deparser use the accept/visit schema instead of the toString path (#663)**
-
-
-[68194](https://github.com/JSQLParser/JSqlParser/commit/68194bfd6bf57d1) theodore johnson *2018-08-23 04:21:10*
-
-**fixes #661**
-
-
-[44ea8](https://github.com/JSQLParser/JSqlParser/commit/44ea8bd33e01f62) wumpz *2018-08-17 06:22:30*
-
-**Parse Cloud Spanner raw string and byte prefixes (#659)**
-
-* #656 parse cloud spanner raw string and byte literals 
-* #656 fixed raw byte string prefix 
-* #656 fixed test case 
-* fixed reported codacy issue 
-
-[a57db](https://github.com/JSQLParser/JSqlParser/commit/a57db5d031a5229) Knut Olav Løite *2018-08-14 08:12:26*
-
-****
-
-
-[78ff2](https://github.com/JSQLParser/JSqlParser/commit/78ff2ad4bc7496b) wumpz *2018-08-14 08:08:17*
-
-****
-
-
-[1d138](https://github.com/JSQLParser/JSqlParser/commit/1d13897883c1448) wumpz *2018-07-26 19:58:18*
-
-****
-
-
-[62bfd](https://github.com/JSQLParser/JSqlParser/commit/62bfda765247f41) wumpz *2018-07-26 09:03:10*
-
-**fixes #643**
-
-
-[dc779](https://github.com/JSQLParser/JSqlParser/commit/dc779cae57b993e) wumpz *2018-07-23 14:57:23*
-
-**add test, fix style**
-
-
-[98f87](https://github.com/JSQLParser/JSqlParser/commit/98f873e244046ff) theodore johnson *2018-07-16 21:35:35*
-
-**added a test**
-
-
-[cfa7e](https://github.com/JSQLParser/JSqlParser/commit/cfa7e8986c98701) theodore johnson *2018-07-16 20:09:34*
-
-**support teradata sortcut for Select**
-
-
-[53c90](https://github.com/JSQLParser/JSqlParser/commit/53c90e9988aec49) theodore johnson *2018-07-11 18:46:52*
-
-**fix parsing and rendering of Truncate**
-
-
-[f126d](https://github.com/JSQLParser/JSqlParser/commit/f126d1575bc2ea5) theodore johnson *2018-07-11 17:56:14*
-
-**fixes #273**
-
-
-[6cd54](https://github.com/JSQLParser/JSqlParser/commit/6cd5481af400e20) wumpz *2018-07-06 08:44:03*
-
-**fixes #273**
-
-
-[12b4a](https://github.com/JSQLParser/JSqlParser/commit/12b4a1ecaa1090c) wumpz *2018-07-06 08:31:55*
-
-**fixes #573**
-
-
-[3a5a6](https://github.com/JSQLParser/JSqlParser/commit/3a5a625d15d7b30) wumpz *2018-07-06 07:01:12*
-
-**add support for && operator**
-
-
-[b59b4](https://github.com/JSQLParser/JSqlParser/commit/b59b48ec2e7e88a) Tomer S *2018-07-03 14:19:34*
-
-**Extract "orderBy" and "Partition" classes from AnalyticExpression.**
-
-
-[8da6e](https://github.com/JSQLParser/JSqlParser/commit/8da6e2e538ceea9) Assaf *2018-06-20 06:41:56*
-
-**Update README.md**
-
-
-[aff65](https://github.com/JSQLParser/JSqlParser/commit/aff651624e6fb48) Tobias *2018-06-18 06:22:15*
-
-**fixes #608**
-
-
-[d529c](https://github.com/JSQLParser/JSqlParser/commit/d529c82d24cbaba) wumpz *2018-06-17 09:57:15*
-
-**fixes #608**
-
-
-[3f5e3](https://github.com/JSQLParser/JSqlParser/commit/3f5e3c9805bd2fe) wumpz *2018-06-17 09:48:18*
-
-**fixes #163**
-
-
-[6d954](https://github.com/JSQLParser/JSqlParser/commit/6d95472726574cc) wumpz *2018-06-17 09:39:36*
-
-**fixes #163**
-
-
-[1db3f](https://github.com/JSQLParser/JSqlParser/commit/1db3ff5f9b5837b) wumpz *2018-06-17 09:33:54*
-
-**first try dotted**
-
-
-[2fab8](https://github.com/JSQLParser/JSqlParser/commit/2fab86081a56673) wumpz *2018-06-16 21:07:22*
-
-**fixes #620**
-
-
-[645d0](https://github.com/JSQLParser/JSqlParser/commit/645d06e0a31206b) wumpz *2018-06-08 23:22:16*
-
-**fixes #612**
-
-
-[36ee6](https://github.com/JSQLParser/JSqlParser/commit/36ee6c54c21965a) wumpz *2018-06-08 22:51:12*
-
-**fixes #612**
-
-
-[60473](https://github.com/JSQLParser/JSqlParser/commit/60473edf4efbd85) wumpz *2018-06-08 22:50:02*
-
-**Update README.md**
-
-
-[c5a0b](https://github.com/JSQLParser/JSqlParser/commit/c5a0b02b5f5c077) Tobias *2018-05-16 06:18:32*
-
-**Add javadoc badge**
-
-
-[9c2c9](https://github.com/JSQLParser/JSqlParser/commit/9c2c96772ba9b5c) Jeremy Lin *2018-05-15 20:32:26*
-
-**add maven-central badge (#616)**
-
-
-[4d67d](https://github.com/JSQLParser/JSqlParser/commit/4d67d10bbf9a033) Benedikt Waldvogel *2018-05-14 09:13:39*
-
-**fixes #614**
-
-
-[32c4d](https://github.com/JSQLParser/JSqlParser/commit/32c4d8a04244fd5) wumpz *2018-05-12 22:51:33*
-
-****
-
-
-[094cc](https://github.com/JSQLParser/JSqlParser/commit/094cc8082e40442) wumpz *2018-05-02 21:16:26*
-
-**introduced junit annotations**
-
-
-[d7c1e](https://github.com/JSQLParser/JSqlParser/commit/d7c1e438c8f0032) wumpz *2018-05-02 21:13:11*
-
-**fixes #611**
-
-
-[35cf1](https://github.com/JSQLParser/JSqlParser/commit/35cf1d8b1b80d29) wumpz *2018-05-02 21:08:22*
-
-**fixes #610**
-
-
-[5a60e](https://github.com/JSQLParser/JSqlParser/commit/5a60e1b57b7de4b) wumpz *2018-05-02 20:48:08*
-
-**fixes #610**
-
-
-[c5c26](https://github.com/JSQLParser/JSqlParser/commit/c5c26ca4d18092b) wumpz *2018-05-02 20:45:56*
-
-**Update README.md**
-
-
-[49b28](https://github.com/JSQLParser/JSqlParser/commit/49b2800bf7533e9) Tobias *2018-05-01 21:58:41*
-
-**Adding support for MySQL's SQL_NO_CACHE flag**
-
-
-[403e7](https://github.com/JSQLParser/JSqlParser/commit/403e722e6ee12b4) Tomer S *2018-03-25 09:03:23*
-
-
-## jsqlparser-1.2 (2018-05-01)
-
-### Other changes
-
-**fixes #605**
-
-
-[6e309](https://github.com/JSQLParser/JSqlParser/commit/6e3099c50352966) wumpz *2018-04-22 21:49:56*
-
-**fixes #604**
-
-
-[c8913](https://github.com/JSQLParser/JSqlParser/commit/c89139cfecb8e8d) wumpz *2018-04-20 22:38:48*
-
-**moved some jjt options from pom.xml to JSqlParserCC.jjt**
-
-
-[e9a6c](https://github.com/JSQLParser/JSqlParser/commit/e9a6cd3b79ed501) wumpz *2018-04-19 13:29:22*
-
-**fixes #603**
-
-
-[32930](https://github.com/JSQLParser/JSqlParser/commit/3293023e059de4d) wumpz *2018-04-19 08:35:31*
-
-**fixes #600**
-
-
-[e80ea](https://github.com/JSQLParser/JSqlParser/commit/e80ea6803591783) wumpz *2018-04-13 07:55:00*
-
-**change standard to jdk 8 with java 1.7 file compliance**
-
-
-[c28a5](https://github.com/JSQLParser/JSqlParser/commit/c28a549ef9895b4) wumpz *2018-04-13 07:46:19*
-
-**fixes #593**
-
-
-[65276](https://github.com/JSQLParser/JSqlParser/commit/652766264a2bb61) wumpz *2018-04-08 22:37:28*
-
-**fixes #597**
-
-
-[ac34e](https://github.com/JSQLParser/JSqlParser/commit/ac34efb0279a6af) wumpz *2018-04-08 21:17:12*
-
-****
-
-
-[4f63b](https://github.com/JSQLParser/JSqlParser/commit/4f63b1c085634f2) wumpz *2018-04-02 23:42:44*
-
-**fixes #592**
-
-
-[1b5d2](https://github.com/JSQLParser/JSqlParser/commit/1b5d24dcf7d6fc8) wumpz *2018-04-02 22:37:47*
-
-**- allow parenthesis around from item**
-
-* - allow whitespace between bars from concat 
-
-[2cea3](https://github.com/JSQLParser/JSqlParser/commit/2cea3ee94d83447) wumpz *2018-03-29 22:25:48*
-
-**- allow parenthesis around from item**
-
-* - allow whitespace between bars from concat 
-
-[dabb0](https://github.com/JSQLParser/JSqlParser/commit/dabb03f0094e4c7) wumpz *2018-03-29 22:24:33*
-
-****
-
-
-[7d366](https://github.com/JSQLParser/JSqlParser/commit/7d36615ee5b5837) wumpz *2018-03-23 07:26:30*
-
-**fixes #588**
-
-
-[a04cc](https://github.com/JSQLParser/JSqlParser/commit/a04ccb1c05204e5) wumpz *2018-03-17 00:40:36*
-
-**fixes #588**
-
-
-[801cd](https://github.com/JSQLParser/JSqlParser/commit/801cd84c8dbb33f) wumpz *2018-03-17 00:40:06*
-
-**JSQLPARSER-584: adds support for MySQL (a,b,...)OP(c,d,...) expression (#585)**
-
-* JSQLPARSER-584: adds support for MySQL (a,b,...)OP(c,d,...) expression 
-* JSQLPARSER-584: adds some tests and rename MySQLValueListExpression to ValueListExpression 
-
-[2c272](https://github.com/JSQLParser/JSqlParser/commit/2c272f440995b2c) Adrien Lesur *2018-03-05 23:08:55*
-
-**checked #266**
-
-
-[72059](https://github.com/JSQLParser/JSqlParser/commit/7205906f58be21c) wumpz *2018-02-14 08:43:51*
-
-**fixes #583**
-
-
-[76ed9](https://github.com/JSQLParser/JSqlParser/commit/76ed995ebef6bd1) wumpz *2018-02-14 08:37:38*
-
-**fixes #583**
-
-
-[3768b](https://github.com/JSQLParser/JSqlParser/commit/3768b8d10789c70) wumpz *2018-02-14 08:36:26*
-
-**tested issue 582**
-
-
-[84459](https://github.com/JSQLParser/JSqlParser/commit/84459536a13fa4b) wumpz *2018-02-09 07:18:06*
-
-**Create ISSUE_TEMPLATE.md**
-
-
-[d5ec2](https://github.com/JSQLParser/JSqlParser/commit/d5ec2fe18e8f63b) Tobias *2018-02-08 07:12:19*
-
-**removed unneeded dependencies**
-
-
-[445b1](https://github.com/JSQLParser/JSqlParser/commit/445b1a517e651de) wumpz *2018-02-07 10:46:12*
-
-****
-
-
-[feaea](https://github.com/JSQLParser/JSqlParser/commit/feaeaeb2c63b88c) wumpz *2018-02-02 12:46:17*
-
-****
-
-
-[18d01](https://github.com/JSQLParser/JSqlParser/commit/18d01811c592581) wumpz *2018-02-02 12:45:51*
-
-**Fix issue #563: subjoin allows only one inner join, this should be a … (#564)**
-
-* Fix issue #563: subjoin allows only one inner join, this should be a list 
-* Fix failing Oracle tests because of confusion between subjoin and subselect. 
-
-[8456a](https://github.com/JSQLParser/JSqlParser/commit/8456acf7f228a46) Frits Jalvingh *2018-02-02 10:40:01*
-
-**fixes #320 (#576)**
-
-* fixes #320 
-
-[e6451](https://github.com/JSQLParser/JSqlParser/commit/e645193140f4271) Taner Mansur *2018-02-01 14:55:37*
-
-****
-
-
-[21e8b](https://github.com/JSQLParser/JSqlParser/commit/21e8bc4c549ea75) wumpz *2018-02-01 14:54:12*
-
-**fixes #566,#438,#267**
-
-
-[bf951](https://github.com/JSQLParser/JSqlParser/commit/bf9515418475372) wumpz *2018-01-30 14:10:17*
-
-**fixes #566,#438,#267**
-
-
-[ccbe9](https://github.com/JSQLParser/JSqlParser/commit/ccbe9ad0be27d78) wumpz *2018-01-30 14:09:12*
-
-**tests #572**
-
-
-[5d609](https://github.com/JSQLParser/JSqlParser/commit/5d609ef208c6803) wumpz *2018-01-29 15:43:04*
-
-**corrected generics type**
-
-
-[ed1a2](https://github.com/JSQLParser/JSqlParser/commit/ed1a297094cd85c) wumpz *2018-01-22 07:34:55*
-
-**fixes #567**
-
-
-[0d4ae](https://github.com/JSQLParser/JSqlParser/commit/0d4aed3aadce638) wumpz *2018-01-12 07:36:54*
-
-**removed "removed" project bewa**
-
-
-[dec98](https://github.com/JSQLParser/JSqlParser/commit/dec98caa839b0d6) wumpz *2018-01-08 07:44:24*
-
-**fixes #338**
-
-
-[0e571](https://github.com/JSQLParser/JSqlParser/commit/0e571d14aed151c) wumpz *2018-01-05 23:29:00*
-
-**fixes #545**
-
-
-[ab7e2](https://github.com/JSQLParser/JSqlParser/commit/ab7e29bba316f0d) wumpz *2018-01-05 23:16:29*
-
-**fixes #462**
-
-
-[83844](https://github.com/JSQLParser/JSqlParser/commit/838449cb5163f19) wumpz *2017-12-28 00:50:29*
-
-**fixes #462**
-
-
-[bc005](https://github.com/JSQLParser/JSqlParser/commit/bc005f89fd7d091) wumpz *2017-12-28 00:47:37*
-
-**Update README.md**
-
-
-[5871c](https://github.com/JSQLParser/JSqlParser/commit/5871c573f69696d) Tobias *2017-12-27 20:04:29*
-
-**Update README.md**
-
-
-[dd6bb](https://github.com/JSQLParser/JSqlParser/commit/dd6bbef26420dd0) Tobias *2017-12-07 10:25:11*
-
-**fixes #554**
-
-
-[4ce98](https://github.com/JSQLParser/JSqlParser/commit/4ce98e492ce9d17) wumpz *2017-12-07 08:55:52*
-
-****
-
-
-[ee723](https://github.com/JSQLParser/JSqlParser/commit/ee723d50b08a54d) wumpz *2017-12-04 08:36:46*
-
-**fixes #543**
-
-
-[bdc20](https://github.com/JSQLParser/JSqlParser/commit/bdc20ea7688c8c4) wumpz *2017-12-04 08:35:07*
-
-**fixes #551**
-
-
-[a25fb](https://github.com/JSQLParser/JSqlParser/commit/a25fb7cb3ba02c1) wumpz *2017-12-04 08:14:06*
-
-**made some modifications to rlike fix**
-
-
-[f0ffe](https://github.com/JSQLParser/JSqlParser/commit/f0ffe4c53edbcaa) wumpz *2017-11-16 22:29:53*
-
-**Added support for RLIKE expressions (#544)**
-
-* RLIKE is a synonym of REGEXP, therefore should be treated the same. 
-
-[8a950](https://github.com/JSQLParser/JSqlParser/commit/8a950b3e09dce06) sh-tomer *2017-11-16 22:10:51*
-
-**jdk 1.7**
-
-
-[8d4f2](https://github.com/JSQLParser/JSqlParser/commit/8d4f25c49c3975d) wumpz *2017-11-07 09:43:35*
-
-**modern template included**
-
-
-[9ea8e](https://github.com/JSQLParser/JSqlParser/commit/9ea8e4c3f4e3ab7) wumpz *2017-11-07 07:31:58*
-
-**fixes #540,#526**
-
-
-[8bc23](https://github.com/JSQLParser/JSqlParser/commit/8bc236e25ddbe8d) wumpz *2017-11-03 07:21:40*
-
-**fixes #540,#526**
-
-
-[ab868](https://github.com/JSQLParser/JSqlParser/commit/ab868a627a6b72f) wumpz *2017-11-03 07:18:39*
-
-**corrected a lookahead issue**
-
-
-[a2f81](https://github.com/JSQLParser/JSqlParser/commit/a2f81f3a299145a) wumpz *2017-10-31 22:37:41*
-
-**Add ability to support "NOT LIKE ..." expressions (#539)**
-
-* The parser is able to parse expressions such as &quot;a NOT LIKE &#x27;%pattern%&#x27;&quot;, but is not able to parse expressions where the not is before the entire expression. For example: &quot;NOT a LIKE &#x27;%pattern%&#x27;. 
-* When parsing the latter, the error is: 
-* Caused by: net.sf.jsqlparser.parser.ParseException: Encountered &quot; &quot;LIKE&quot; &quot;LIKE &quot;&quot; at line 1, column 32. 
-* Was expecting one of: ... 
-* The reason this is important is both because these syntaxes are both valid, and also because the deparser uses the second method. 
-* Therefore, if you parse a query with the first type of expression, then deparse it and parse again, you&#x27;ll get the same error. 
-
-[daea3](https://github.com/JSQLParser/JSqlParser/commit/daea33e73aa05c6) sh-tomer *2017-10-31 20:27:50*
-
-****
-
-
-[452ba](https://github.com/JSQLParser/JSqlParser/commit/452baffb2af8c21) wumpz *2017-10-29 23:20:57*
-
-****
-
-
-[14523](https://github.com/JSQLParser/JSqlParser/commit/1452360f9cca7aa) wumpz *2017-10-29 23:08:39*
-
-****
-
-
-[7c90a](https://github.com/JSQLParser/JSqlParser/commit/7c90a24bdf72994) wumpz *2017-10-29 22:59:21*
-
-**Linking structures to their AST nodes to have access to their positions (#534)**
-
-* Linking several structures to their AST nodes to have access to their positions 
-* This far there were only 3 types of structures linked to their AST nodes. Now adding some more expressions and literals to their AST node to have access to their token&#x27;s position in the query. 
-* Added missing parts in JSQqlParserCC.jjt for AST linking to work 
-* Added missing parts in JSQqlParserCC.jjt to make sure all relevant code is created to generate and link AST nodes to the relevant structures. 
-
-[514f2](https://github.com/JSQLParser/JSqlParser/commit/514f2588af97345) sh-tomer *2017-10-29 12:39:56*
-
-**add debug note (#531)**
-
-* added a link to the visualize parsing section to have a visible debug mode (so users that create an issue can try to get us better output) 
-
-[b1abc](https://github.com/JSQLParser/JSqlParser/commit/b1abc6ff39e9c2a) Jan Monterrubio *2017-10-25 06:21:26*
-
-**fixes #525 (#530)**
-
-* fixes #525 
-* Simply unit test. 
-
-[1a1a1](https://github.com/JSQLParser/JSqlParser/commit/1a1a1aa53866787) Linyu Chen *2017-10-24 05:30:39*
-
-**simplified tests for SQL_CALC_FOUND_ROWS**
-
-
-[e23d4](https://github.com/JSQLParser/JSqlParser/commit/e23d4bc09e5f6e4) wumpz *2017-10-20 07:32:58*
-
-**Implements #509 (#504)**
-
-* Supporting MySql hit SQL_CALC_FOUND_ROWS for selecting row count. 
-* Supporting MySql hit SQL_CALC_FOUND_ROWS for selecting row count. - refactoring 
-* Supporting MySql hit SQL_CALC_FOUND_ROWS for selecting row count. - missing copyright.ˆ 
-* Supporting MySql hit SQL_CALC_FOUND_ROWS for selecting row count. - Modify field type to boolean for prevent memory consumption by creating object and try assertSqlCanBeParsedAndDeparsed on unit test. 
-
-[3e163](https://github.com/JSQLParser/JSqlParser/commit/3e16345815e45b5) Yoon Kyong Sik *2017-10-20 07:27:48*
-
-**fixes #522**
-
-
-[45ac8](https://github.com/JSQLParser/JSqlParser/commit/45ac8c8a2bcff54) wumpz *2017-10-12 21:27:57*
-
-**fixes #522**
-
-
-[2c69c](https://github.com/JSQLParser/JSqlParser/commit/2c69cc65f8bfd32) wumpz *2017-10-12 21:22:26*
-
-**fixes #510**
-
-
-[f64ad](https://github.com/JSQLParser/JSqlParser/commit/f64ad89eec4ea53) wumpz *2017-10-09 23:51:46*
-
-****
-
-
-[1a771](https://github.com/JSQLParser/JSqlParser/commit/1a77106df128893) wumpz *2017-10-06 08:58:01*
-
-**fixes #508 including precedence**
-
-
-[8037a](https://github.com/JSQLParser/JSqlParser/commit/8037af621f32f0a) wumpz *2017-10-06 08:36:57*
-
-**fixes #519**
-
-* fixes #520 
-
-[27217](https://github.com/JSQLParser/JSqlParser/commit/272177a37b9ee81) wumpz *2017-10-06 08:24:04*
-
-**transformed primary expression and sign parsing**
-
-
-[51fcd](https://github.com/JSQLParser/JSqlParser/commit/51fcdea9f92c1ce) wumpz *2017-10-06 07:11:58*
-
-**corrected token definition order**
-
-
-[64ce9](https://github.com/JSQLParser/JSqlParser/commit/64ce9ff2986d492) wumpz *2017-10-06 07:01:35*
-
-**waiting for https://github.com/javacc/javacc/issues/28**
-
-
-[704e6](https://github.com/JSQLParser/JSqlParser/commit/704e6c84fb66150) wumpz *2017-10-02 09:14:01*
-
-**Fix test case**
-
-
-[b2bb2](https://github.com/JSQLParser/JSqlParser/commit/b2bb2431c4dfae0) Nathaniel Camomot *2017-09-27 08:10:08*
-
-**Fix for some cases where TablNamesFinder can't find tables**
-
-
-[395c3](https://github.com/JSQLParser/JSqlParser/commit/395c3b0049cd09f) Nathaniel Camomot *2017-09-27 06:21:21*
-
-**removed oraclejdk7 travis build due to https://github.com/travis-ci/travis-ci/issues/7964**
-
-
-[812f9](https://github.com/JSQLParser/JSqlParser/commit/812f98fff951c4e) wumpz *2017-09-24 09:55:31*
-
-****
-
-
-[96b5d](https://github.com/JSQLParser/JSqlParser/commit/96b5d9f26ec7310) wumpz *2017-09-24 09:48:35*
-
-****
-
-
-[b847e](https://github.com/JSQLParser/JSqlParser/commit/b847e85c0dba19f) wumpz *2017-09-23 22:40:30*
-
-**Create LICENSE_LGPLV21**
-
-
-[d2c87](https://github.com/JSQLParser/JSqlParser/commit/d2c87dac67436af) Tobias *2017-09-23 22:29:45*
-
-**Create LICENSE_APACHEV2**
-
-
-[f9c1a](https://github.com/JSQLParser/JSqlParser/commit/f9c1a9f7fb91703) Tobias *2017-09-23 22:29:09*
-
-**fixes #515**
-
-
-[c4b36](https://github.com/JSQLParser/JSqlParser/commit/c4b360e14a06201) wumpz *2017-09-23 22:20:51*
-
-**fixes #515**
-
-
-[1afe7](https://github.com/JSQLParser/JSqlParser/commit/1afe7e6a9931f7e) wumpz *2017-09-23 22:18:35*
-
-**fixes #515**
-
-
-[8388f](https://github.com/JSQLParser/JSqlParser/commit/8388f1e48355b4f) wumpz *2017-09-23 22:17:04*
-
-**Update README.md**
-
-
-[3f734](https://github.com/JSQLParser/JSqlParser/commit/3f734f130da0a66) Tobias *2017-09-23 21:38:51*
-
-**fixes #514**
-
-
-[8a459](https://github.com/JSQLParser/JSqlParser/commit/8a459ce9894ec36) wumpz *2017-09-23 21:32:10*
-
-**fixes #514**
-
-
-[3e846](https://github.com/JSQLParser/JSqlParser/commit/3e84605a7a87948) wumpz *2017-09-23 21:29:52*
-
-**merge of within_group and analytic**
-
-
-[26fab](https://github.com/JSQLParser/JSqlParser/commit/26faba8040636e8) wumpz *2017-09-23 21:24:18*
-
-****
-
-
-[c5a47](https://github.com/JSQLParser/JSqlParser/commit/c5a471f926c1d85) wumpz *2017-09-22 12:29:44*
-
-**#fixes 480**
-
-
-[10352](https://github.com/JSQLParser/JSqlParser/commit/10352328d3d52f3) wumpz *2017-09-12 21:59:08*
-
-**#fixes 480**
-
-
-[e60fa](https://github.com/JSQLParser/JSqlParser/commit/e60fa8cd305d154) wumpz *2017-09-12 21:58:39*
-
-**fixes #512**
-
-
-[07a14](https://github.com/JSQLParser/JSqlParser/commit/07a14dc892d6003) wumpz *2017-09-07 22:20:01*
-
-**fixes #505**
-
-
-[ef55f](https://github.com/JSQLParser/JSqlParser/commit/ef55ffba8b596aa) wumpz *2017-08-28 08:13:14*
-
-**fixes #502**
-
-
-[6a440](https://github.com/JSQLParser/JSqlParser/commit/6a440ba583955b1) wumpz *2017-08-26 14:18:07*
-
-**fixes #502**
-
-
-[41ea8](https://github.com/JSQLParser/JSqlParser/commit/41ea83d2757adee) wumpz *2017-08-26 14:14:13*
-
-**fixes #484**
-
-
-[1a6f9](https://github.com/JSQLParser/JSqlParser/commit/1a6f9143ef491dd) wumpz *2017-08-23 20:41:06*
-
-**fixes #484**
-
-
-[8f9b6](https://github.com/JSQLParser/JSqlParser/commit/8f9b62705ae094e) wumpz *2017-08-23 20:40:26*
-
-**replace support multiple values**
-
-
-[93598](https://github.com/JSQLParser/JSqlParser/commit/93598bbe86aaa92) wanghai *2017-08-21 09:15:27*
-
-**fixed #491**
-
-
-[147ec](https://github.com/JSQLParser/JSqlParser/commit/147ec4887639700) wumpz *2017-08-16 15:47:01*
-
-**fixed #491**
-
-
-[24f23](https://github.com/JSQLParser/JSqlParser/commit/24f232c08edb86c) wumpz *2017-08-16 15:45:55*
-
-**checked issue #482**
-
-
-[71692](https://github.com/JSQLParser/JSqlParser/commit/71692c5c6f85f0f) wumpz *2017-08-07 13:33:12*
-
-**fixes #485**
-
-
-[64bc5](https://github.com/JSQLParser/JSqlParser/commit/64bc5e05d8086b4) wumpz *2017-08-03 05:57:10*
-
-**fix issue #424 (INSERT with SET) (#481)**
-
-* update insert with set language 
-* update insert with set 
-* update insert with set 
-* update insert test 
-* add removed lines 
-
-[ca653](https://github.com/JSQLParser/JSqlParser/commit/ca6538a04dd7969) messfish *2017-07-28 06:23:33*
-
-**fixes #456**
-
-
-[9c2cc](https://github.com/JSQLParser/JSqlParser/commit/9c2cc2c823b3d1e) wumpz *2017-07-27 11:14:26*
-
-**introduced partial / nonpartial parse for CCJSqlParserUtil methods**
-
-
-[6b452](https://github.com/JSQLParser/JSqlParser/commit/6b452183f084652) wumpz *2017-07-27 05:47:13*
-
-**fixes #473**
-
-
-[0aa22](https://github.com/JSQLParser/JSqlParser/commit/0aa229d3df996f6) wumpz *2017-07-18 06:24:20*
-
-**Update README.md**
-
-
-[58c42](https://github.com/JSQLParser/JSqlParser/commit/58c42bcfbf717ee) Tobias *2017-06-29 21:37:30*
-
-**Update README.md**
-
-
-[d235c](https://github.com/JSQLParser/JSqlParser/commit/d235ca3971a9a6e) Tobias *2017-06-29 21:34:47*
-
-
-## jsqlparser-1.1 (2017-06-29)
-
-### Other changes
-
-**fixes #468**
-
-
-[6cb45](https://github.com/JSQLParser/JSqlParser/commit/6cb459d747901ea) wumpz *2017-06-28 08:50:50*
-
-****
-
-
-[fb64e](https://github.com/JSQLParser/JSqlParser/commit/fb64e3295e91bca) wumpz *2017-06-11 21:50:53*
-
-**Add Upsert Grammer (#460)**
-
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add test for de parser 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-* Add files via upload 
-
-[aaeb8](https://github.com/JSQLParser/JSqlParser/commit/aaeb8dfeb0c2a4e) messfish *2017-06-11 18:48:53*
-
-**introduced linking between Function and ASTNode**
-
-
-[3e75c](https://github.com/JSQLParser/JSqlParser/commit/3e75c68c4bf769e) wumpz *2017-06-09 22:34:23*
-
-**introduced linking between Function and ASTNode**
-
-
-[e96f4](https://github.com/JSQLParser/JSqlParser/commit/e96f48534ca3103) wumpz *2017-06-09 22:32:16*
-
-**fixes #457**
-
-
-[2ae5e](https://github.com/JSQLParser/JSqlParser/commit/2ae5e76d69b1cbf) wumpz *2017-05-26 21:34:35*
-
-****
-
-
-[e4ef6](https://github.com/JSQLParser/JSqlParser/commit/e4ef6e231282b62) wumpz *2017-05-23 07:32:52*
-
-**Fix issue #442 (#451)**
-
-* Fix issue #442 for delete statements 
-* Fix issue #442 for insert statements 
-* Mock only when necessary 
-* E.g., interfaces, behavior needs to be verified, etc. 
-* Prefer the first style of testing 
-* As discussed in issue #442 
-* Fix issue #442 for replace statements 
-* Improve readability of issue #442 tests 
-* Inject SelectDeParser as well 
-* As discussed in issue #442. 
-* Fix issue #442 for select statements 
-* Fix issue #442 for update statements 
-* Fix issue #442 for execute statements 
-* Fix issue #442 for set statements 
-* Fix PR code review issue 
-* https://www.codacy.com/app/wumpz/JSqlParser/file/6682733346/issues/source?bid&#x3D;4162857&amp;fileBranchId&#x3D;4580866#l48 
-* Skip PMD check for asserts in tests using Mockito 
-* As agreed upon in the discussion in PR #451. 
-* Use correct PMD check name 
-
-[9d680](https://github.com/JSQLParser/JSqlParser/commit/9d680a6ec4b9f07) chrycheng *2017-05-22 07:13:41*
-
-**fixes #430**
-
-
-[585cb](https://github.com/JSQLParser/JSqlParser/commit/585cbbd1377632b) wumpz *2017-05-16 22:04:19*
-
-**Fix issue #446 (#447)**
-
-* Test current behavior of ExecuteDeParser 
-* Fix issue #446 
-
-[275fb](https://github.com/JSQLParser/JSqlParser/commit/275fbbe87fa0ada) chrycheng *2017-05-16 20:46:29*
-
-**fixes #449**
-
-
-[fe6da](https://github.com/JSQLParser/JSqlParser/commit/fe6dafea19fa236) wumpz *2017-05-16 14:12:50*
-
-**introduced test for 437**
-
-
-[3e740](https://github.com/JSQLParser/JSqlParser/commit/3e740100498aa22) wumpz *2017-05-12 19:43:14*
-
-**test issue 445**
-
-
-[fce59](https://github.com/JSQLParser/JSqlParser/commit/fce593dcf85c43e) wumpz *2017-05-11 08:37:49*
-
-****
-
-
-[1fbf6](https://github.com/JSQLParser/JSqlParser/commit/1fbf6c5bde81b41) wumpz *2017-05-08 12:32:25*
-
-**updated readme**
-
-
-[1dabc](https://github.com/JSQLParser/JSqlParser/commit/1dabcbc56f9b158) wumpz *2017-05-07 20:37:31*
-
-**some minor changes**
-
-
-[050b8](https://github.com/JSQLParser/JSqlParser/commit/050b8ba6434630d) wumpz *2017-05-07 20:35:15*
-
-**conversion to CNF (#434)**
-
-* Add files via upload 
-* Create foo 
-* All the files needed for the CNF conversion 
-* Delete foo 
-* Create foo 
-* Test cases for the CNF conversion 
-* Delete foo 
-* Add files via upload 
-* Add files via upload 
-* change some public methods to private 
-* Delete CNFConverter.java 
-* Delete CloneHelper.java 
-* Delete MultiAndExpression.java 
-* Delete MultiOrExpression.java 
-* Delete MultipleExpression.java 
-* Create foo 
-* Add files via upload 
-* Delete CNFTest.java 
-* Delete StepLastHelper.java 
-* Create foo 
-* Add files via upload 
-* Delete foo 
-* Delete foo 
-* Add files via upload 
-* Add files via upload 
-* Delete CNFConverter.java 
-* Delete CloneHelper.java 
-* Delete MultiAndExpression.java 
-* Delete MultiOrExpression.java 
-* Delete MultipleExpression.java 
-* Create foo 
-* Add files via upload 
-* Delete foo 
-* Delete CNFTest.java 
-* Create foo 
-* Add files via upload 
-* Delete foo 
-* Add files via upload 
-* Add files via upload 
-
-[afe10](https://github.com/JSQLParser/JSqlParser/commit/afe1011bdd64696) messfish *2017-05-07 20:21:00*
-
-****
-
-
-[56497](https://github.com/JSQLParser/JSqlParser/commit/56497af552c53a4) wumpz *2017-05-02 06:06:33*
-
-**corrected bug within RelObjectNameExt processing**
-
-
-[7b2b0](https://github.com/JSQLParser/JSqlParser/commit/7b2b0f649b1702a) wumpz *2017-05-02 06:00:44*
-
-**Update README.md**
-
-
-[2c0f2](https://github.com/JSQLParser/JSqlParser/commit/2c0f2ff0f6c7814) Tobias *2017-04-28 07:37:09*
-
-**Update README.md**
-
-
-[80c98](https://github.com/JSQLParser/JSqlParser/commit/80c98055bc969a0) Tobias *2017-04-28 07:35:42*
-
-****
-
-
-[59310](https://github.com/JSQLParser/JSqlParser/commit/5931045d807559e) wumpz *2017-04-24 13:25:21*
-
-**Introduce support for mysql index hints (fixing issue #374) (#429)**
-
-* Introduce support for mysql index hints (fixing issue #374) 
-* Fix checkstyle errors 
-* -Converted indent tabs to spaces 
-* -Added missing {} on single-line if statement 
-
-[6db15](https://github.com/JSQLParser/JSqlParser/commit/6db15d2c6218d06) Joey Mart *2017-04-18 06:22:25*
-
-**#425 ADD CONSTRAINT also support state such as DEFERRABLE, VALIDATE... (#426)**
-
-
-[f1113](https://github.com/JSQLParser/JSqlParser/commit/f11133c0bdd7a6b) Christophe Moine *2017-04-17 23:40:45*
-
-**Addressing #427 (#428)**
-
-* updating readme with Maven requirements 
-* removing ticks 
-
-[0fddc](https://github.com/JSQLParser/JSqlParser/commit/0fddc73e2eee1b2) AnEmortalKid *2017-04-17 23:39:05*
-
-**going back to checkstyle 6.x due to java7 incompatibilities**
-
-
-[564ac](https://github.com/JSQLParser/JSqlParser/commit/564acc288fa0294) wumpz *2017-04-17 23:27:10*
-
-**Update README.md**
-
-
-[30b09](https://github.com/JSQLParser/JSqlParser/commit/30b0924742068f0) Tobias *2017-04-17 23:09:06*
-
-**Update README.md**
-
-
-[2b5c8](https://github.com/JSQLParser/JSqlParser/commit/2b5c84552963ec3) Tobias *2017-04-17 23:05:07*
-
-**checkstyle source check included. configuration done**
-
-
-[12377](https://github.com/JSQLParser/JSqlParser/commit/12377c784a3fa53) wumpz *2017-04-17 23:01:42*
-
-**checkstyle source check included. configuration done**
-
-
-[1bdf5](https://github.com/JSQLParser/JSqlParser/commit/1bdf5b9515b5af3) wumpz *2017-04-17 22:57:12*
-
-**improved StatementVistorAdaptor to process all statements.**
-
-
-[27119](https://github.com/JSQLParser/JSqlParser/commit/2711900eb3ebf83) wumpz *2017-04-11 07:47:22*
-
-**removed linefeed check, due to multiple git checkout configurations regarding linefeeds**
-
-
-[aab56](https://github.com/JSQLParser/JSqlParser/commit/aab569bf4c6376f) wumpz *2017-03-31 08:04:24*
-
-****
-
-
-[2f5a1](https://github.com/JSQLParser/JSqlParser/commit/2f5a1eacf3e9f5a) wumpz *2017-03-29 06:07:20*
-
-**corrected source files regarding checkstyle errors**
-
-
-[0d6fa](https://github.com/JSQLParser/JSqlParser/commit/0d6faeb8b411e53) wumpz *2017-03-28 09:46:55*
-
-**introduced some more checkstyle rules**
-
-
-[c7a86](https://github.com/JSQLParser/JSqlParser/commit/c7a8601b84695e4) wumpz *2017-03-28 09:30:00*
-
-**removed problematic profile "check.sources" activation, excluded generated-sources, included test-sources**
-
-
-[e2cc2](https://github.com/JSQLParser/JSqlParser/commit/e2cc2210c364f6c) wumpz *2017-03-27 11:48:50*
-
-**removed problematic profile "check.sources" activation, excluded generated-sources, included test-sources**
-
-
-[e941f](https://github.com/JSQLParser/JSqlParser/commit/e941fd96a2caade) wumpz *2017-03-27 11:45:39*
-
-**removed problematic profile "check.sources" activation, excluded generated-sources, included test-sources**
-
-
-[dd23f](https://github.com/JSQLParser/JSqlParser/commit/dd23f27516db63b) wumpz *2017-03-27 11:14:44*
-
-**removed auto activation due to travis problems, included test sources**
-
-
-[759e7](https://github.com/JSQLParser/JSqlParser/commit/759e751b85c5a16) wumpz *2017-03-27 10:53:46*
-
-**checkstyle**
-
-
-[62505](https://github.com/JSQLParser/JSqlParser/commit/625054295a7700b) wumpz *2017-03-27 09:16:11*
-
-**Update README.md**
-
-
-[da9ac](https://github.com/JSQLParser/JSqlParser/commit/da9acf59e308d2b) Tobias *2017-03-25 22:21:59*
-
-
-## jsqlparser-1.0 (2017-03-25)
-
-### Other changes
-
-****
-
-
-[32e8f](https://github.com/JSQLParser/JSqlParser/commit/32e8fa02ecfadc4) wumpz *2017-03-25 22:00:13*
-
-****
-
-
-[a31b2](https://github.com/JSQLParser/JSqlParser/commit/a31b219baadb001) wumpz *2017-03-25 21:52:19*
-
-****
-
-
-[f731f](https://github.com/JSQLParser/JSqlParser/commit/f731fa4cf726036) wumpz *2017-03-25 21:47:42*
-
-**reformating hole sourcecode**
-
-
-[4146f](https://github.com/JSQLParser/JSqlParser/commit/4146f869cb01151) wumpz *2017-03-22 07:36:17*
-
-**Fix #407 by enhancing grammar (#410)**
-
-* Fix #407 by enhancing grammar 
-* Change LF and tabs 
-
-[5d901](https://github.com/JSQLParser/JSqlParser/commit/5d9018657df6b22) Christophe Moine *2017-03-22 07:36:14*
-
-**removed dependencies**
-
-
-[dd1b3](https://github.com/JSQLParser/JSqlParser/commit/dd1b334e3bc4675) wumpz *2017-03-20 10:22:55*
-
-**fixes #406**
-
-
-[06619](https://github.com/JSQLParser/JSqlParser/commit/066199cfeb97ea4) wumpz *2017-03-17 11:55:11*
-
-**update to JavaCC 7.0.2**
-
-
-[c12f7](https://github.com/JSQLParser/JSqlParser/commit/c12f7ac457d92c3) wumpz *2017-03-15 10:28:17*
-
-**Update README.md**
-
-
-[6312f](https://github.com/JSQLParser/JSqlParser/commit/6312f3aaf9aa46e) Tobias *2017-03-15 08:55:03*
-
-**update readme**
-
-
-[03746](https://github.com/JSQLParser/JSqlParser/commit/03746a8ddf0c14e) wumpz *2017-03-15 08:45:24*
-
-**update readme**
-
-
-[5bbfe](https://github.com/JSQLParser/JSqlParser/commit/5bbfeb76bf7deab) wumpz *2017-03-15 08:44:22*
-
-****
-
-
-[6e72b](https://github.com/JSQLParser/JSqlParser/commit/6e72b99ee4b0ba0) wumpz *2017-03-14 11:41:26*
-
-**corrected merge conflict**
-
-
-[1211d](https://github.com/JSQLParser/JSqlParser/commit/1211dcf1209f3a4) wumpz *2017-03-14 11:39:30*
-
-**corrected case when expressions**
-
-
-[12cc4](https://github.com/JSQLParser/JSqlParser/commit/12cc4059ddef291) wumpz *2017-03-14 11:12:53*
-
-**rewrote some lookaheads**
-
-
-[2a440](https://github.com/JSQLParser/JSqlParser/commit/2a4405a6a0821cc) wumpz *2017-03-14 10:33:21*
-
-**replace some junit pre 4.x artifacts**
-
-
-[7dd85](https://github.com/JSQLParser/JSqlParser/commit/7dd857e5000f09a) wumpz *2017-03-14 09:55:42*
-
-**first rewrite of SelectBody**
-
-
-[49127](https://github.com/JSQLParser/JSqlParser/commit/49127be715d029a) wumpz *2017-03-14 09:43:25*
-
-****
-
-
-[5dcef](https://github.com/JSQLParser/JSqlParser/commit/5dcefcefd07755a) wumpz *2017-03-10 22:13:02*
-
-**Support FOR UPDATE WAIT (#405)**
-
-* Adding FOR UPDATE WAIT support 
-* removing final peppered everywhere 
-* updating formatting, fixing codacy test names 
-* updating asserts to use static import 
-* reverting changes 
-* reverting line feeds 
-* adding tests and deparser code back without formatting 
-
-[45b39](https://github.com/JSQLParser/JSqlParser/commit/45b392f4b93714c) AnEmortalKid *2017-03-10 22:06:53*
-
-**add support for LIMIT with only one row count JDBC parameter (#404)**
-
-* small but powerfull change 👍 
-
-[42318](https://github.com/JSQLParser/JSqlParser/commit/42318531bb72279) zhushaoping *2017-03-03 07:06:08*
-
-**merged**
-
-
-[c3eed](https://github.com/JSQLParser/JSqlParser/commit/c3eed13096c0019) wumpz *2017-03-03 07:03:08*
-
-**fixes #401**
-
-
-[1315d](https://github.com/JSQLParser/JSqlParser/commit/1315d035dbc5008) wumpz *2017-03-01 08:20:55*
-
-**fixes #402**
-
-
-[6fb15](https://github.com/JSQLParser/JSqlParser/commit/6fb15a104debe95) wumpz *2017-03-01 07:55:25*
-
-**release 0.9.7**
-
-
-[46720](https://github.com/JSQLParser/JSqlParser/commit/46720ef029cf8aa) wumpz *2017-02-26 23:13:50*
-
-
-## jsqlparser-0.9.7 (2017-02-26)
-
-### Other changes
-
-**updated readme**
-
-
-[e2dc3](https://github.com/JSQLParser/JSqlParser/commit/e2dc36897178155) wumpz *2017-02-21 08:49:56*
-
-**commented an issue test**
-
-
-[4fe4c](https://github.com/JSQLParser/JSqlParser/commit/4fe4ce206296ea1) wumpz *2017-02-21 08:46:38*
-
-**set statemet with optional equals**
-
-
-[ec6ce](https://github.com/JSQLParser/JSqlParser/commit/ec6cef2e803d87a) wumpz *2017-02-11 23:57:32*
-
-**fixes #393**
-
-
-[320f6](https://github.com/JSQLParser/JSqlParser/commit/320f64a9a4aa687) wumpz *2017-02-10 09:34:47*
-
-****
-
-
-[42f32](https://github.com/JSQLParser/JSqlParser/commit/42f3242cc13fac6) wumpz *2017-02-08 08:17:40*
-
-**removed unused imports**
-
-
-[c66cc](https://github.com/JSQLParser/JSqlParser/commit/c66cc6973753c3a) wumpz *2017-02-08 08:15:51*
-
-**minor code improvements**
-
-
-[e3fd2](https://github.com/JSQLParser/JSqlParser/commit/e3fd2c6df3444ae) wumpz *2017-02-08 08:13:58*
-
-**Update README.md**
-
-
-[3d05e](https://github.com/JSQLParser/JSqlParser/commit/3d05e16c6c09a05) Tobias *2017-02-07 18:09:26*
-
-**fixes #390**
-
-
-[546b7](https://github.com/JSQLParser/JSqlParser/commit/546b71d84eb8b45) wumpz *2017-02-01 15:27:48*
-
-****
-
-
-[d4396](https://github.com/JSQLParser/JSqlParser/commit/d439643bbf1cd02) wumpz *2017-01-27 20:53:20*
-
-**fixes #389**
-
-
-[71c32](https://github.com/JSQLParser/JSqlParser/commit/71c32d905fbd4cb) wumpz *2017-01-27 20:39:25*
-
-**included LOOKAHEAD**
-
-
-[6776e](https://github.com/JSQLParser/JSqlParser/commit/6776eb5fd0224e4) wumpz *2017-01-20 23:12:17*
-
-**updated readme**
-
-
-[b5f6e](https://github.com/JSQLParser/JSqlParser/commit/b5f6e9efac23dca) wumpz *2017-01-20 22:10:59*
-
-**updated readme**
-
-
-[1abd2](https://github.com/JSQLParser/JSqlParser/commit/1abd224a3e2ff0f) wumpz *2017-01-20 22:00:07*
-
-**Increase test coverage on AlterExpression.java**
-
-* getOperation 
-* getFkColumns 
-* getFkSourceTable 
-* getFkSourceColumns 
-* getConstraintName 
-* tried getPkColumns but it does not behave as I expected. 
-* placed TODO in AlterTest.testAlterTablePK for this 
-* getIndex().getColumnNames 
-
-[5a799](https://github.com/JSQLParser/JSqlParser/commit/5a79964714b13f7) jthomas *2017-01-19 19:43:24*
-
-**Enhance AlterExpression grammar:**
-
-* 1. optional &quot;COLUMN&quot; keyword in ADD alter operation 
-* 2. new alter operation: MODIFY 
-* 3. add column specs to alter table column definitions 
-
-[24177](https://github.com/JSQLParser/JSqlParser/commit/241779b26973b47) jthomas *2017-01-19 17:32:21*
-
-**support to add jdbc name parameter after LIMIT and TOP keywords**
-
-
-[e25e2](https://github.com/JSQLParser/JSqlParser/commit/e25e247dd5e9131) zhushaoping *2017-01-13 02:55:52*
-
-**fixes #288**
-
-
-[091c5](https://github.com/JSQLParser/JSqlParser/commit/091c5dd5ab5ce93) zhushaoping *2017-01-12 07:09:57*
-
-**tests for issue 379 included**
-
-
-[f7c27](https://github.com/JSQLParser/JSqlParser/commit/f7c27ad6492a636) wumpz *2017-01-04 07:22:19*
-
-**tests for issue 379 included**
-
-
-[14a9b](https://github.com/JSQLParser/JSqlParser/commit/14a9b3e372b664a) wumpz *2017-01-04 06:49:43*
-
-**updated readme**
-
-
-[1899c](https://github.com/JSQLParser/JSqlParser/commit/1899cbffb915992) wumpz *2017-01-02 13:32:56*
-
-**fixes #375**
-
-* fixes #371 
-
-[957f3](https://github.com/JSQLParser/JSqlParser/commit/957f39c496a7fac) wumpz *2017-01-02 13:30:09*
-
-**fixed NPE in ExpressionVisitorAdapter when SubSelect doesn't has withItemsList**
-
-
-[28979](https://github.com/JSQLParser/JSqlParser/commit/2897935037560db) Donghang Lin *2016-12-21 07:14:48*
-
-****
-
-
-[5bc1f](https://github.com/JSQLParser/JSqlParser/commit/5bc1fc3669d52f0) wumpz *2016-12-06 22:08:00*
-
-**fixed #363**
-
-
-[66e44](https://github.com/JSQLParser/JSqlParser/commit/66e44c956be7481) wumpz *2016-12-01 06:52:45*
-
-**integrated some tests**
-
-
-[5937b](https://github.com/JSQLParser/JSqlParser/commit/5937bace81bd20c) wumpz *2016-11-14 11:47:43*
-
-**corrected fix #311 and fix #332, introduced unaliased fqn of column**
-
-
-[88804](https://github.com/JSQLParser/JSqlParser/commit/888041d1971257e) wumpz *2016-09-26 12:33:24*
-
-**fixes #341**
-
-
-[b3faf](https://github.com/JSQLParser/JSqlParser/commit/b3faf8eb8680484) wumpz *2016-09-20 21:53:32*
-
-**Update README.md**
-
-
-[98ded](https://github.com/JSQLParser/JSqlParser/commit/98ded4dfd487b7e) Tobias *2016-09-17 14:34:21*
-
-**corrected some lookaheads**
-
-
-[7c157](https://github.com/JSQLParser/JSqlParser/commit/7c1572febc89ae1) wumpz *2016-09-16 11:52:08*
-
-**Updated header and removed unused methods.**
-
-
-[2bfc9](https://github.com/JSQLParser/JSqlParser/commit/2bfc9ab124086b9) Peter Borissow *2016-09-15 15:28:59*
-
-**Added json parsing tests.**
-
-
-[7c740](https://github.com/JSQLParser/JSqlParser/commit/7c740854852d725) Peter Borissow *2016-09-15 14:59:01*
-
-**Added support for PostgreSQL JSON Functions and Operators.**
-
-
-[a5504](https://github.com/JSQLParser/JSqlParser/commit/a5504819c1d93f0) Peter Borissow *2016-09-14 02:28:01*
-
-**Add support for more Postgres Create Table options**
-
-
-[04c56](https://github.com/JSQLParser/JSqlParser/commit/04c56f283d24b44) Rob Story *2016-09-09 21:02:57*
-
-**fixes #334**
-
-
-[21a0d](https://github.com/JSQLParser/JSqlParser/commit/21a0df961b4dc70) wumpz *2016-09-01 07:45:04*
-
-****
-
-
-[8e229](https://github.com/JSQLParser/JSqlParser/commit/8e22953b3bdcf85) wumpz *2016-09-01 06:50:59*
-
-****
-
-
-[e6e7e](https://github.com/JSQLParser/JSqlParser/commit/e6e7ea7bd407e30) wumpz *2016-09-01 06:46:49*
-
-**Support additional Postgres column types for alter table statements**
-
-
-[42181](https://github.com/JSQLParser/JSqlParser/commit/42181b00cace324) Rob Story *2016-08-30 14:22:55*
-
-**fixes #330**
-
-
-[03a34](https://github.com/JSQLParser/JSqlParser/commit/03a344d221abc9b) wumpz *2016-08-29 07:13:00*
-
-**fixes #329**
-
-
-[3df49](https://github.com/JSQLParser/JSqlParser/commit/3df492bb5cadaee) wumpz *2016-08-28 21:06:08*
-
-**updated readme**
-
-
-[2acae](https://github.com/JSQLParser/JSqlParser/commit/2acaee03959f798) wumpz *2016-08-23 20:02:35*
-
-
-## jsqlparser-0.9.6 (2016-08-23)
-
-### Other changes
-
-**#modify net.sf.jsqlparser.statement.insert.Insert   Method:toString() if itemsList and useSelectBrackets together not null will error**
-
-* #modify PlainSelect.getStringList change sql append to StringBuilder 
-
-[471b9](https://github.com/JSQLParser/JSqlParser/commit/471b94495623ee2) zheng.liu@baifendian.com *2016-08-15 06:22:23*
-
-**corrected some lookaheads parsing delete statements**
-
-
-[57890](https://github.com/JSQLParser/JSqlParser/commit/578909f24136b04) wumpz *2016-08-14 12:59:27*
-
-**some cleanup**
-
-
-[d34eb](https://github.com/JSQLParser/JSqlParser/commit/d34ebcab6ac939f) wumpz *2016-08-13 22:20:27*
-
-**Update Alter and add AlterExpression class for multiple ADD/DROP expressions in a single ALTER statement**
-
-* Update .jjt file to break out the AlterExpression into its own class and for Alter to compose multiple AlterExpressions 
-* Update AlterTest for new AlterExpressions and test for multiple ADD/DROP statements in a single ALTER 
-
-[e8d1c](https://github.com/JSQLParser/JSqlParser/commit/e8d1cf2cb1db16c) Rob Story *2016-08-11 19:24:41*
-
-**Support for parse delete from table using join to another table like:**
-
-* DELETE posts 
-* FROM posts 
-* INNER JOIN projects ON projects.project_id &#x3D; posts.project_id 
-* WHERE projects.client_id &#x3D; :client_id 
-* This necessitated some changes to the DeleteTest class, 
-* specifically: 
-* JSqlParserCC.jjt - changes on grammar of Delete statements. 
-* Delete toString and DeleteDeParser. 
-
-[b6eb5](https://github.com/JSQLParser/JSqlParser/commit/b6eb57b61f7b205) Lucas Oliveira *2016-08-06 16:28:11*
-
-**fix bug of TablesNamesFinder when SubSlect has withItemsList, add corresponding test case**
-
-
-[276dd](https://github.com/JSQLParser/JSqlParser/commit/276ddc8a4dd8bf7) Xin Quan *2016-08-04 01:44:08*
-
-**fixes #309**
-
-
-[37f06](https://github.com/JSQLParser/JSqlParser/commit/37f061014e21f01) wumpz *2016-08-03 22:02:45*
-
-**fixes #309**
-
-
-[acd16](https://github.com/JSQLParser/JSqlParser/commit/acd16e59b8d8378) wumpz *2016-08-03 22:02:04*
-
-**fixes #303**
-
-
-[043a5](https://github.com/JSQLParser/JSqlParser/commit/043a5cb59727cda) wumpz *2016-08-03 21:31:11*
-
-**fixes #303**
-
-
-[76982](https://github.com/JSQLParser/JSqlParser/commit/76982f7b00b54f7) wumpz *2016-08-03 21:30:04*
-
-**intruced new test for oracle join syntax**
-
-
-[cb8dd](https://github.com/JSQLParser/JSqlParser/commit/cb8ddd71254a640) wumpz *2016-08-03 21:05:38*
-
-**fixes #246**
-
-
-[822bb](https://github.com/JSQLParser/JSqlParser/commit/822bbbe78cc8481) wumpz *2016-07-31 20:56:56*
-
-**fixes #247**
-
-
-[42636](https://github.com/JSQLParser/JSqlParser/commit/4263651d43d4c60) wumpz *2016-07-28 20:13:41*
-
-**test for issue 265**
-
-
-[59f7e](https://github.com/JSQLParser/JSqlParser/commit/59f7ec2a2a432de) wumpz *2016-07-24 22:28:08*
-
-**fixes #292**
-
-
-[f0b35](https://github.com/JSQLParser/JSqlParser/commit/f0b350d13756b1f) wumpz *2016-07-24 22:13:37*
-
-**fixes #299**
-
-
-[d2ad3](https://github.com/JSQLParser/JSqlParser/commit/d2ad3dfe936c8ce) wumpz *2016-07-24 22:05:14*
-
-**fixes #311**
-
-
-[dfd2f](https://github.com/JSQLParser/JSqlParser/commit/dfd2fe55f0ad2bb) wumpz *2016-07-22 07:25:01*
-
-****
-
-
-[84bf0](https://github.com/JSQLParser/JSqlParser/commit/84bf0650e8f7d55) wumpz *2016-07-21 14:08:19*
-
-**first try of error recovery for statement and statements**
-
-
-[a7247](https://github.com/JSQLParser/JSqlParser/commit/a7247eb48369472) wumpz *2016-07-21 07:33:49*
-
-**some refactoring**
-
-
-[1e307](https://github.com/JSQLParser/JSqlParser/commit/1e30760dce107d9) wumpz *2016-07-18 16:50:28*
-
-**The previous pull request broke the build.  Besides being a keyword, 'double' is also a function name.  Add K_DOUBLE to the RelObjectNameExt() function to pick up this distinction.**
-
-
-[8bfc1](https://github.com/JSQLParser/JSqlParser/commit/8bfc1583f12049c) Tom Moore *2016-07-11 19:14:06*
-
-**Add a double precision cast type**
-
-
-[60ad1](https://github.com/JSQLParser/JSqlParser/commit/60ad18ed1a10328) Tom Moore *2016-07-11 17:59:53*
-
-**removed one lookahead and improved parenthesis parsing**
-
-
-[84a88](https://github.com/JSQLParser/JSqlParser/commit/84a883614af908a) wumpz *2016-06-30 18:41:06*
-
-**removed one lookahead and improved parenthesis parsing**
-
-
-[51b39](https://github.com/JSQLParser/JSqlParser/commit/51b39c55aaaa58c) wumpz *2016-06-30 18:37:23*
-
-**fixes #296**
-
-* refactored getTableList method of TableNamesFinder 
-
-[3ccca](https://github.com/JSQLParser/JSqlParser/commit/3ccca01bbc85778) wumpz *2016-06-28 12:16:39*
-
-**fixes #295**
-
-
-[b877d](https://github.com/JSQLParser/JSqlParser/commit/b877da0a425c01f) wumpz *2016-06-28 08:19:36*
-
-**fixes #293**
-
-
-[c1d0b](https://github.com/JSQLParser/JSqlParser/commit/c1d0b2f5283d8bb) wumpz *2016-06-28 00:11:15*
-
-**introduced OSGi metadata**
-
-
-[89daf](https://github.com/JSQLParser/JSqlParser/commit/89dafaedeb69d6a) wumpz *2016-06-23 21:58:22*
-
-**fixes #291**
-
-
-[63fa2](https://github.com/JSQLParser/JSqlParser/commit/63fa2f66b537731) wumpz *2016-06-23 21:40:57*
-
-**fixes #291**
-
-
-[da42b](https://github.com/JSQLParser/JSqlParser/commit/da42b1dce108dd9) wumpz *2016-06-23 21:37:51*
-
-**fixes #278**
-
-
-[12341](https://github.com/JSQLParser/JSqlParser/commit/1234127a47199e6) wumpz *2016-06-21 23:02:11*
-
-**fixes #278**
-
-
-[faf8c](https://github.com/JSQLParser/JSqlParser/commit/faf8c6adea9bb28) wumpz *2016-06-21 22:58:40*
-
-**fixes #287**
-
-
-[b1bea](https://github.com/JSQLParser/JSqlParser/commit/b1bea0273c5557a) wumpz *2016-06-21 20:50:02*
-
-**fixes #270**
-
-
-[37c83](https://github.com/JSQLParser/JSqlParser/commit/37c8313e46e45a7) wumpz *2016-06-21 20:12:55*
-
-****
-
-
-[d3d66](https://github.com/JSQLParser/JSqlParser/commit/d3d66f819662698) wumpz *2016-06-20 07:08:58*
-
-****
-
-
-[0d1d1](https://github.com/JSQLParser/JSqlParser/commit/0d1d1c066d77ded) wumpz *2016-06-19 21:15:55*
-
-**fixes #284**
-
-
-[8e7ba](https://github.com/JSQLParser/JSqlParser/commit/8e7ba38a39c6f85) wumpz *2016-06-19 20:09:07*
-
-**Implemented table check constraint for named constraints.**
-
-* 1. Added named constraint to create table. 
-* 2. Added check constraint to alter table statement. 
-* 3. Added CheckConstraint type. 
-* Tests: 
-* 4. Added create table test. 
-* 5. Added alter table test. 
-
-[401d2](https://github.com/JSQLParser/JSqlParser/commit/401d279ef7e6ef9) Megan Woods *2016-06-16 14:56:01*
-
-****
-
-
-[04fc3](https://github.com/JSQLParser/JSqlParser/commit/04fc3aa9b53c8a9) wumpz *2016-06-15 20:50:52*
-
-****
-
-
-[bddbe](https://github.com/JSQLParser/JSqlParser/commit/bddbe588a759dd0) wumpz *2016-06-15 20:45:51*
-
-**Implemented:**
-
-* 1. UPDATE .. RETURNING col, col as Alias 
-* 2. UPDATE .. RETURNING * 
-* Tested: 
-* 3. UPDATE .. ORDER BY .. LIMIT .. RETURNING 
-* 4. UPDATE .. RETURNING 
-* Item 4 represents the PostgreSQL UPDATE .. RETURNING Syntax without ORDER BY and LIMIT. 
-* See: https://www.postgresql.org/docs/9.5/static/sql-update.html 
-
-[f4526](https://github.com/JSQLParser/JSqlParser/commit/f452638f0f04f99) Megan Woods *2016-06-15 09:12:14*
-
-****
-
-
-[40aba](https://github.com/JSQLParser/JSqlParser/commit/40aba736f79c495) wumpz *2016-06-12 11:12:57*
-
-**-- added scalar time functions of ANSI SQL**
-
-
-[f51df](https://github.com/JSQLParser/JSqlParser/commit/f51df4b5f7d51e2) ChrissW-R1 *2016-06-08 12:57:26*
-
-****
-
-
-[24c87](https://github.com/JSQLParser/JSqlParser/commit/24c874afad3110f) wumpz *2016-06-06 21:50:44*
-
-**updated readme**
-
-
-[3bc31](https://github.com/JSQLParser/JSqlParser/commit/3bc316df743ab09) wumpz *2016-05-24 09:45:34*
-
-**Add a test-case for Hive's LEFT SEMI JOIN**
-
-
-[e56fb](https://github.com/JSQLParser/JSqlParser/commit/e56fbe984cfab98) Vu Nhan *2016-05-19 04:53:22*
-
-**Add support for Hive's LEFT SEMI JOIN**
-
-
-[fd03a](https://github.com/JSQLParser/JSqlParser/commit/fd03ad4f6bdd06a) Vu Nhan *2016-05-19 04:05:43*
-
-**fixes #243**
-
-
-[bb978](https://github.com/JSQLParser/JSqlParser/commit/bb978c45b4d744d) wumpz *2016-05-16 20:49:58*
-
-**fixes #243**
-
-
-[780ba](https://github.com/JSQLParser/JSqlParser/commit/780ba125a5807b2) wumpz *2016-05-16 20:47:32*
-
-**fixes #261**
-
-
-[10e68](https://github.com/JSQLParser/JSqlParser/commit/10e68b5c3c58296) wumpz *2016-05-16 20:03:07*
-
-**updated readme**
-
-
-[77ba3](https://github.com/JSQLParser/JSqlParser/commit/77ba380cfb639c4) wumpz *2016-05-06 06:06:33*
-
-****
-
-
-[57145](https://github.com/JSQLParser/JSqlParser/commit/5714516d314f31d) wumpz *2016-04-28 22:15:18*
-
-**Added ability to have operators like '>=' or '<=' separated by a space.**
-
-* This includes: 
-* Modifying the JJT syntax to support the &#x27;space in the middle&#x27; versions 
-* of operators (any quantity of whitespace is supported). 
-* Modifying the various operators to inherit from a new 
-* &#x27;ComparisonOperator&#x27; class, which handles the (previously NotEqualsTo- 
-* only) logic for capturing the form of the operator. 
-* Giving each of the various operators a constructor that accepts the 
-* syntax used. 
-* Modifying TestUtils to strip comments out before comparing SQL text 
-* (necessary because condition07.sql is now passing, and has a comment). 
-* Updating SpecialOracleTest to indicate 130 tests passing now 
-* (condition7.sql now passes). 
-* Adding a new test specifically for operators into SpecialOracleTest. 
-* NOTE: Because the &quot;! &#x3D;&quot; form of the &#x27;not equals&#x27; operator means something 
-* different in PostgresSQL (factorial of previous argument + equals), we do 
-* NOT include that case. 
-
-[9886b](https://github.com/JSQLParser/JSqlParser/commit/9886b02975d1749) Dave Lindquist *2016-04-28 13:28:58*
-
-**Corrected "MERGE INTO" parsing for more complicated statements.**
-
-* Specifically: 
-* Changed &quot;Condition&quot; to &quot;Expression&quot; for the &quot;ON&quot; clause -- this is 
-* needed to handle &quot;ON&quot; clauses that have &quot;a &#x3D; y AND b &#x3D; z&quot; or other 
-* more complicated expressions (basically the same as the &quot;ON&quot; clause 
-* in a SELECT query). 
-* Also changed the &quot;WHERE&quot; and &quot;DELETE WHERE&quot; clauses in the same 
-* fashion (&#x27;Condition&#x27; becomes &#x27;Expression&#x27;), as they too support 
-* multiple conditions. 
-* Corrected the toString on the MergeUpdate clause, which was missing a 
-* comma between the fields. 
-* Added a new, more complicated MERGE INTO statement to the MergeTest 
-* class. 
-
-[7efd5](https://github.com/JSQLParser/JSqlParser/commit/7efd58f7704a0ff) Dave Lindquist *2016-04-28 13:19:34*
-
-**added for update test**
-
-
-[d54b8](https://github.com/JSQLParser/JSqlParser/commit/d54b82ba62f1133) wumpz *2016-04-27 14:23:55*
-
-**fixes #253**
-
-
-[75be4](https://github.com/JSQLParser/JSqlParser/commit/75be42659dc3a76) wumpz *2016-04-26 06:11:13*
-
-**fixed  #245**
-
-
-[01287](https://github.com/JSQLParser/JSqlParser/commit/012874f905adabe) wumpz *2016-04-15 22:01:56*
-
-**fixes #244**
-
-
-[2204a](https://github.com/JSQLParser/JSqlParser/commit/2204a5fc85fb99d) wumpz *2016-04-15 20:10:32*
-
-**Update README.md**
-
-
-[ac4a5](https://github.com/JSQLParser/JSqlParser/commit/ac4a56151b46d0b) Tobias *2016-04-14 19:30:09*
-
-**fixes #240**
-
-* fixes #241 
-
-[7f8b5](https://github.com/JSQLParser/JSqlParser/commit/7f8b59b31e44521) wumpz *2016-04-05 06:25:57*
-
-**small modifications, reduces some semantic lookaheads**
-
-
-[7f5b6](https://github.com/JSQLParser/JSqlParser/commit/7f5b61e60bf037b) wumpz *2016-03-29 11:34:17*
-
-**fixed #228**
-
-
-[3dfae](https://github.com/JSQLParser/JSqlParser/commit/3dfae9c62615711) wumpz *2016-03-17 08:40:24*
-
-**fixed #228**
-
-
-[8f9b2](https://github.com/JSQLParser/JSqlParser/commit/8f9b2b905c00c68) wumpz *2016-03-17 08:38:35*
-
-**fixed #232 without correction of order of update and insert**
-
-
-[7e2e7](https://github.com/JSQLParser/JSqlParser/commit/7e2e7200ce48672) wumpz *2016-03-17 08:28:47*
-
-**fixed some whitespace differences between deparser and toString regarding NOT expression**
-
-
-[f4b25](https://github.com/JSQLParser/JSqlParser/commit/f4b25599a8919d4) wumpz *2016-03-17 08:16:24*
-
-**Update README.md**
-
-
-[12009](https://github.com/JSQLParser/JSqlParser/commit/120096068fa4b3d) Tobias *2016-03-17 07:51:11*
-
-**update release info**
-
-
-[eccd6](https://github.com/JSQLParser/JSqlParser/commit/eccd66f01f924f8) wumpz *2016-03-14 00:27:18*
-
-**Fixing uncaught exception**
-
-
-[4fad4](https://github.com/JSQLParser/JSqlParser/commit/4fad4af810aef8d) emopers *2016-01-12 19:30:52*
-
-
-## jsqlparser-0.9.5 (2016-03-13)
-
-### Other changes
-
-**no message**
-
-
-[ffcfe](https://github.com/JSQLParser/JSqlParser/commit/ffcfe41096bca29) wumpz *2016-03-13 23:55:09*
-
-****
-
-
-[3c863](https://github.com/JSQLParser/JSqlParser/commit/3c8635280dbd959) wumpz *2016-03-13 23:35:37*
-
-**introduced boolean values within conditions**
-
-
-[36a62](https://github.com/JSQLParser/JSqlParser/commit/36a62e9de7ec65e) wumpz *2016-03-10 21:19:22*
-
-**introduced boolean values within conditions**
-
-
-[a8333](https://github.com/JSQLParser/JSqlParser/commit/a8333bf9310355b) wumpz *2016-03-10 21:16:28*
-
-**introduced boolean values within conditions**
-
-
-[68e5b](https://github.com/JSQLParser/JSqlParser/commit/68e5b53e834f02f) wumpz *2016-03-10 21:11:01*
-
-**fixes #230**
-
-
-[19915](https://github.com/JSQLParser/JSqlParser/commit/1991507179224f0) wumpz *2016-03-07 23:17:40*
-
-**multiple code improvements: squid:S1905, squid:S00122, squid:S1155, squid:S00105**
-
-
-[905b2](https://github.com/JSQLParser/JSqlParser/commit/905b28d34771d15) George Kankava *2016-03-03 11:40:31*
-
-**fixed #226**
-
-
-[67b17](https://github.com/JSQLParser/JSqlParser/commit/67b178b533128ae) wumpz *2016-02-27 13:54:58*
-
-**fixes #223**
-
-
-[04e5c](https://github.com/JSQLParser/JSqlParser/commit/04e5c8b354f149d) wumpz *2016-02-11 21:23:51*
-
-**reduces a bunch of dynamic lookaheads to fixed ones**
-
-
-[4c764](https://github.com/JSQLParser/JSqlParser/commit/4c764f54da7d820) wumpz *2016-02-11 20:51:02*
-
-**integrated changes of #225**
-
-
-[eb5d7](https://github.com/JSQLParser/JSqlParser/commit/eb5d7a29737c6c5) wumpz *2016-02-11 20:41:23*
-
-**Multiple code improvements fix 1: squid:S1199, squid:S1066, squid:S1854, squid:S1165**
-
-
-[af5d3](https://github.com/JSQLParser/JSqlParser/commit/af5d3cddf3564cf) George Kankava *2016-02-10 16:11:10*
-
-**Update README.md**
-
-
-[e455c](https://github.com/JSQLParser/JSqlParser/commit/e455ce024f53779) Tobias *2016-02-10 06:43:04*
-
-**improved parsing performance**
-
-
-[c78aa](https://github.com/JSQLParser/JSqlParser/commit/c78aa03d1af2cfe) wumpz *2016-02-09 22:30:20*
-
-**fixes #221**
-
-
-[579f0](https://github.com/JSQLParser/JSqlParser/commit/579f0bc159aa053) wumpz *2016-02-04 22:10:43*
-
-**fixes #221**
-
-
-[4a12d](https://github.com/JSQLParser/JSqlParser/commit/4a12dc10014ec51) wumpz *2016-02-04 22:07:12*
-
-**cleaned up some lookaheads**
-
-
-[0cc80](https://github.com/JSQLParser/JSqlParser/commit/0cc809ea7de5238) wumpz *2016-02-04 08:58:52*
-
-****
-
-
-[36a4a](https://github.com/JSQLParser/JSqlParser/commit/36a4a0f9918ef9e) wumpz *2016-02-02 06:45:45*
-
-**fixes #217**
-
-
-[de61c](https://github.com/JSQLParser/JSqlParser/commit/de61c0b92a25e03) wumpz *2016-02-02 06:21:59*
-
-**Added reference options foreign keys support (ON UPDATE/DELETE NO ACTION/CASCADE) and Full text indexes (FULLTEXT idx(text1))**
-
-
-[c2956](https://github.com/JSQLParser/JSqlParser/commit/c29565bcaed42b1) pabloa *2016-02-01 21:57:27*
-
-**multiple code improvements 1**
-
-
-[e6bec](https://github.com/JSQLParser/JSqlParser/commit/e6becde1df91db5) George Kankava *2016-02-01 07:35:08*
-
-**Support of mysql create statements with timestamp column with ON UPDATE. Example: CREATE TABLE test (applied timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)**
-
-
-[9dcaa](https://github.com/JSQLParser/JSqlParser/commit/9dcaaee63e4b2b3) pabloa98@gmail.com *2016-01-24 08:37:38*
-
-**fixes #151**
-
-
-[f5b51](https://github.com/JSQLParser/JSqlParser/commit/f5b515be9351c77) wumpz *2016-01-06 09:12:54*
-
-**corrected lookahead for tablefunctions**
-
-
-[8036e](https://github.com/JSQLParser/JSqlParser/commit/8036edd80628410) wumpz *2015-12-09 22:01:02*
-
-**TableFunction extends FunctionItem**
-
-
-[17371](https://github.com/JSQLParser/JSqlParser/commit/17371ae38e0384e) tfedkiv *2015-12-08 08:39:07*
-
-**added TableFunction alias suppurt**
-
-* added TableFunction unit tests 
-
-[88edd](https://github.com/JSQLParser/JSqlParser/commit/88eddaf50dada22) tfedkiv *2015-12-07 15:27:02*
-
-**fixed verion**
-
-
-[a5a5f](https://github.com/JSQLParser/JSqlParser/commit/a5a5f9ee5b0d28d) ftaras *2015-12-07 14:25:07*
-
-**added support of SELECT FROM table function (h2)**
-
-
-[0403f](https://github.com/JSQLParser/JSqlParser/commit/0403fdda2918311) tfedkiv *2015-12-07 14:23:39*
-
-**replaced size() with isEmpty()**
-
-
-[1d634](https://github.com/JSQLParser/JSqlParser/commit/1d6348126dceec7) wumpz *2015-12-06 22:03:20*
-
-**jdk 8 build included into travis**
-
-
-[830be](https://github.com/JSQLParser/JSqlParser/commit/830be49c4de1311) wumpz *2015-11-27 22:12:36*
-
-**increased version of maven-javadoc-plugin**
-
-
-[1b842](https://github.com/JSQLParser/JSqlParser/commit/1b842f891e8b370) wumpz *2015-11-26 07:34:47*
-
-****
-
-
-[01d25](https://github.com/JSQLParser/JSqlParser/commit/01d25deaae72ba2) wumpz *2015-11-26 07:24:43*
-
-**Issue 198: add profile to ensure doclint is turned off with Java 8+. Without this, the project won't build on Java 8. (You can run mvn test successfully, but not mvn package.)**
-
-
-[bb3ef](https://github.com/JSQLParser/JSqlParser/commit/bb3ef6188982b9b) James Heather *2015-11-25 13:43:57*
-
-**fixes #193**
-
-
-[5d7bd](https://github.com/JSQLParser/JSqlParser/commit/5d7bdb9b254bc19) wumpz *2015-11-25 06:37:36*
-
-**fixes #195**
-
-
-[ab1ad](https://github.com/JSQLParser/JSqlParser/commit/ab1ad25b6862e08) wumpz *2015-11-25 06:22:12*
-
-**Issue 195:**
-
-* Add support for ORDER BY and LIMIT in UPDATE and DELETE statements (as supported by MySQL). 
-* LimitDeparser and OrderByDeParser have been pulled out into separate classes to avoid code duplication from SelectDeParser. 
-
-[a3133](https://github.com/JSQLParser/JSqlParser/commit/a31333a65141e27) James Heather *2015-11-24 14:57:04*
-
-**corrects parsing error**
-
-
-[975cd](https://github.com/JSQLParser/JSqlParser/commit/975cddfb85bd0b3) wumpz *2015-11-20 22:44:01*
-
-****
-
-
-[f1d21](https://github.com/JSQLParser/JSqlParser/commit/f1d213636786e0a) wumpz *2015-11-20 14:27:19*
-
-**fixes #194**
-
-
-[f1c98](https://github.com/JSQLParser/JSqlParser/commit/f1c9835bd34d3f1) wumpz *2015-11-18 21:17:49*
-
-**support INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] ...**
-
-
-[00c18](https://github.com/JSQLParser/JSqlParser/commit/00c18698acb0316) wanghai *2015-11-18 09:10:31*
-
-**corrected lookahead**
-
-
-[a97e9](https://github.com/JSQLParser/JSqlParser/commit/a97e9c94fef03c6) wumpz *2015-11-17 22:24:57*
-
-**fixes #192, fixes #191**
-
-
-[2fddf](https://github.com/JSQLParser/JSqlParser/commit/2fddf8c8bf4072c) wumpz *2015-11-14 23:56:53*
-
-**replaceDeParser parser itemList**
-
-
-[3c605](https://github.com/JSQLParser/JSqlParser/commit/3c6057b1f8d6311) wanghai *2015-11-13 08:45:21*
-
-**support insert ... on duplicate key update...**
-
-
-[7d7fa](https://github.com/JSQLParser/JSqlParser/commit/7d7fae8a31abc3c) wanghai *2015-11-13 08:43:57*
-
-**fixes #181, added drop deparser**
-
-
-[44091](https://github.com/JSQLParser/JSqlParser/commit/44091c622316769) wumpz *2015-11-09 22:33:56*
-
-**alter table support improved**
-
-
-[ad0dd](https://github.com/JSQLParser/JSqlParser/commit/ad0dd23e8951e27) wumpz *2015-10-27 22:37:56*
-
-**fixes #180**
-
-
-[0bb23](https://github.com/JSQLParser/JSqlParser/commit/0bb2358eaff8956) wumpz *2015-10-21 06:44:00*
-
-**#182**
-
-
-[a3695](https://github.com/JSQLParser/JSqlParser/commit/a369537d0d3f51c) wumpz *2015-10-21 05:56:19*
-
-**Support for alter table drop column/constraint**
-
-* Fix for Issue #184 
-
-[58dd2](https://github.com/JSQLParser/JSqlParser/commit/58dd28aaf9b9273) schweighart *2015-10-20 21:34:51*
-
-**updated readme**
-
-
-[e570a](https://github.com/JSQLParser/JSqlParser/commit/e570a919f24d385) wumpz *2015-10-19 13:16:54*
-
-**Improved required coverage**
-
-
-[41cbd](https://github.com/JSQLParser/JSqlParser/commit/41cbd7f96ab9139) Rapševičius Valdas *2015-10-14 11:05:36*
-
-**Refactored Oracle Hint tests, added set selects**
-
-
-[7b4fe](https://github.com/JSQLParser/JSqlParser/commit/7b4feb00cd4d312) Rapševičius Valdas *2015-10-13 22:37:29*
-
-**Added OracleHint class, grammar and model support, tests**
-
-
-[f7f8d](https://github.com/JSQLParser/JSqlParser/commit/f7f8d03bfac9e09) Rapševičius Valdas *2015-10-13 22:06:16*
-
-**resolved choice conflict**
-
-
-[b6f71](https://github.com/JSQLParser/JSqlParser/commit/b6f71e619c1a24d) wumpz *2015-10-08 11:11:42*
-
-**fixes #178, merged upstream**
-
-
-[11dbd](https://github.com/JSQLParser/JSqlParser/commit/11dbda3b999d82b) Gabor Bota *2015-10-08 09:20:15*
-
-**added restrict and set null for alter statement**
-
-
-[36379](https://github.com/JSQLParser/JSqlParser/commit/36379b2f646326c) wumpz *2015-10-07 21:38:53*
-
-**fixes #178**
-
-
-[cb267](https://github.com/JSQLParser/JSqlParser/commit/cb2674e2b94ee95) Gabor Bota *2015-10-07 13:00:53*
-
-**fixes #174**
-
-
-[da1e0](https://github.com/JSQLParser/JSqlParser/commit/da1e074b308d74a) wumpz *2015-10-06 21:18:27*
-
-**fixes #174**
-
-
-[8d419](https://github.com/JSQLParser/JSqlParser/commit/8d419d31bb8be29) wumpz *2015-10-06 21:15:40*
-
-**simple merge implementation**
-
-
-[bc4bc](https://github.com/JSQLParser/JSqlParser/commit/bc4bc9e52192b21) wumpz *2015-10-01 22:52:36*
-
-**simple merge implementation**
-
-
-[af5a0](https://github.com/JSQLParser/JSqlParser/commit/af5a09078134f6c) wumpz *2015-10-01 22:44:50*
-
-**fixes  #176**
-
-
-[c6e93](https://github.com/JSQLParser/JSqlParser/commit/c6e9389599ed161) wumpz *2015-10-01 21:50:13*
-
-**fixes  #176**
-
-
-[fb4d4](https://github.com/JSQLParser/JSqlParser/commit/fb4d43b5a41d66b) wumpz *2015-10-01 21:45:44*
-
-**fixes  #177**
-
-
-[9999c](https://github.com/JSQLParser/JSqlParser/commit/9999c50ef3908a3) wumpz *2015-10-01 21:11:43*
-
-****
-
-
-[1fb42](https://github.com/JSQLParser/JSqlParser/commit/1fb426e08300adf) wumpz *2015-10-01 20:24:27*
-
-**merge impl started**
-
-
-[8d8c0](https://github.com/JSQLParser/JSqlParser/commit/8d8c0e4ce70d944) wumpz *2015-09-24 22:23:11*
-
-**fixes #172**
-
-
-[c690f](https://github.com/JSQLParser/JSqlParser/commit/c690f7f1efa5815) wumpz *2015-09-22 05:33:16*
-
-****
-
-
-[ae2c8](https://github.com/JSQLParser/JSqlParser/commit/ae2c87f5a19d9b0) wumpz *2015-09-16 18:55:58*
-
-****
-
-
-[03a4f](https://github.com/JSQLParser/JSqlParser/commit/03a4fc7d339cbb0) wumpz *2015-09-16 05:53:18*
-
-**fixes #167**
-
-
-[57f30](https://github.com/JSQLParser/JSqlParser/commit/57f3099b869cc43) wumpz *2015-09-16 05:52:27*
-
-**fixes #167**
-
-
-[71d9f](https://github.com/JSQLParser/JSqlParser/commit/71d9fd97fd92fbc) wumpz *2015-09-16 05:49:45*
-
-**fixes #77**
-
-
-[0e51d](https://github.com/JSQLParser/JSqlParser/commit/0e51dacc2a0df3a) wumpz *2015-09-16 05:46:49*
-
-**fixes #170**
-
-
-[cf9bf](https://github.com/JSQLParser/JSqlParser/commit/cf9bf8453791662) wumpz *2015-09-13 21:26:48*
-
-
-## jsqlparser-0.9.4 (2015-09-13)
-
-### Other changes
-
-****
-
-
-[e9024](https://github.com/JSQLParser/JSqlParser/commit/e9024106aa5d994) wumpz *2015-09-07 19:26:26*
-
-**fixes #165**
-
-
-[28101](https://github.com/JSQLParser/JSqlParser/commit/28101309a3502db) wumpz *2015-09-03 20:03:48*
-
-**fixes #165**
-
-
-[bf06e](https://github.com/JSQLParser/JSqlParser/commit/bf06e6ccc269efa) wumpz *2015-09-03 20:02:25*
-
-**fixes #166**
-
-
-[c244c](https://github.com/JSQLParser/JSqlParser/commit/c244ccb5cd00d0d) wumpz *2015-09-03 14:02:17*
-
-**fixed #162**
-
-
-[46381](https://github.com/JSQLParser/JSqlParser/commit/463817b435ffdd5) wumpz *2015-08-07 20:48:55*
-
-**fixed #162**
-
-
-[e3b73](https://github.com/JSQLParser/JSqlParser/commit/e3b73a35afbcb74) wumpz *2015-08-07 20:48:00*
-
-**fixed #160**
-
-
-[432c0](https://github.com/JSQLParser/JSqlParser/commit/432c0ef9a7d462d) wumpz *2015-08-07 20:24:40*
-
-**no message**
-
-
-[e91e0](https://github.com/JSQLParser/JSqlParser/commit/e91e074d8c773a6) wumpz *2015-08-05 20:44:25*
-
-**Add support for variable support to "SELECT SKIP <ROWCOUNT> FIRST <ROWCOUNT>..." construct**
-
-* The grammar for the construct in informix [1] mentions the possibility, that &lt;ROWCOUNT&gt; can be either 
-* an integer or a host variable or local SPL variable storing the value of max. The case for plain integers and 
-* jdbc variables is covered by the first commit While this commit adds support for constructs using SPL 
-* variables. SPL variables must follow identifier rules [2][3]. 
-* [1] http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0156.htm 
-* [2] http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_1306.htm?lang&#x3D;de 
-* [3] http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_1660.htm%23ids_sqs_1660?lang&#x3D;de 
-
-[9e77b](https://github.com/JSQLParser/JSqlParser/commit/9e77b6bd55ce242) Matthias Bläsing *2015-08-02 14:03:23*
-
-**simplified lookahead**
-
-
-[a44ac](https://github.com/JSQLParser/JSqlParser/commit/a44acb7a785394b) wumpz *2015-08-01 21:42:46*
-
-**simplified lookahead**
-
-
-[0fc8e](https://github.com/JSQLParser/JSqlParser/commit/0fc8e29a3a5df3d) wumpz *2015-08-01 21:33:31*
-
-**Update README.md**
-
-
-[b3d76](https://github.com/JSQLParser/JSqlParser/commit/b3d76e7847c6f90) Tobias *2015-07-31 05:27:21*
-
-****
-
-
-[6f2a1](https://github.com/JSQLParser/JSqlParser/commit/6f2a1323d03ae00) wumpz *2015-07-30 21:35:13*
-
-**added another testcase for #154**
-
-
-[e889c](https://github.com/JSQLParser/JSqlParser/commit/e889cf345a84b8d) wumpz *2015-07-29 10:50:10*
-
-**Implement support for "SELECT SKIP <ROWCOUNT> FIRST <ROWCOUNT>..." construct**
-
-
-[4a33d](https://github.com/JSQLParser/JSqlParser/commit/4a33d8c380260d2) Matthias Bläsing *2015-07-25 19:16:23*
-
-**test for #154 included**
-
-
-[001d6](https://github.com/JSQLParser/JSqlParser/commit/001d665d32c6df5) wumpz *2015-07-23 09:49:24*
-
-****
-
-
-[157ee](https://github.com/JSQLParser/JSqlParser/commit/157eebf7a07e23c) wumpz *2015-07-15 20:55:25*
-
-**fixes #150**
-
-
-[5b3ec](https://github.com/JSQLParser/JSqlParser/commit/5b3ec5ac9f502d4) wumpz *2015-07-15 20:42:54*
-
-**fixes #149**
-
-
-[d2b07](https://github.com/JSQLParser/JSqlParser/commit/d2b0706e6f175db) wumpz *2015-07-15 20:20:14*
-
-**Fix inline usage of foreign keys in CREATE TABLE statements**
-
-
-[23c19](https://github.com/JSQLParser/JSqlParser/commit/23c19a53fd72c26) Georg Semmler *2015-07-09 15:41:39*
-
-**fixes #146**
-
-
-[978b6](https://github.com/JSQLParser/JSqlParser/commit/978b60ebd0ffbbd) wumpz *2015-07-03 13:19:54*
-
-**reincluded Apache 2.0 license**
-
-
-[83899](https://github.com/JSQLParser/JSqlParser/commit/83899f824659012) wumpz *2015-07-02 20:54:03*
-
-**reincluded Apache 2.0 license**
-
-
-[7e52d](https://github.com/JSQLParser/JSqlParser/commit/7e52dd7cb474bc3) wumpz *2015-07-02 20:52:04*
-
-**corrected deparser**
-
-
-[cc4a5](https://github.com/JSQLParser/JSqlParser/commit/cc4a5fa149aeac4) wumpz *2015-07-01 20:51:03*
-
-**updated readme**
-
-
-[44716](https://github.com/JSQLParser/JSqlParser/commit/4471653646f286e) wumpz *2015-07-01 20:04:46*
-
-**fixes #138 and AnyComparisionExpression**
-
-
-[ab2b2](https://github.com/JSQLParser/JSqlParser/commit/ab2b2c07759af48) wumpz *2015-07-01 19:55:02*
-
-**null toString used**
-
-
-[e425d](https://github.com/JSQLParser/JSqlParser/commit/e425dc2528cc4d3) wumpz *2015-06-24 21:20:29*
-
-**completed any and all comparisions**
-
-
-[fc076](https://github.com/JSQLParser/JSqlParser/commit/fc076e89580ca78) wumpz *2015-06-24 20:59:45*
-
-**Exceptions skiped during coverage tests**
-
-
-[1849c](https://github.com/JSQLParser/JSqlParser/commit/1849c5b3f5ca03f) wumpz *2015-06-10 05:50:43*
-
-**Update README.md**
-
-
-[d561d](https://github.com/JSQLParser/JSqlParser/commit/d561d8ad60b84fc) Tobias *2015-06-09 21:39:04*
-
-****
-
-
-[a17d6](https://github.com/JSQLParser/JSqlParser/commit/a17d6280b1ecdf6) wumpz *2015-06-09 21:29:55*
-
-**coveralls**
-
-
-[5858a](https://github.com/JSQLParser/JSqlParser/commit/5858aa7a2215300) wumpz *2015-06-09 21:03:49*
-
-****
-
-
-[1d71c](https://github.com/JSQLParser/JSqlParser/commit/1d71c51a934dd1e) wumpz *2015-06-08 20:14:29*
-
-**completed ExpressionVisitorAdapter**
-
-
-[8ec0b](https://github.com/JSQLParser/JSqlParser/commit/8ec0b195ba8da00) wumpz *2015-06-07 22:37:50*
-
-**completed ExpressionVisitorAdapter**
-
-
-[cf703](https://github.com/JSQLParser/JSqlParser/commit/cf703d8225908d9) wumpz *2015-06-05 22:32:50*
-
-**completed ExpressionVisitorAdapter**
-
-
-[348fd](https://github.com/JSQLParser/JSqlParser/commit/348fd7ffce92125) wumpz *2015-06-05 22:29:30*
-
-**updated some plugin versions**
-
-
-[94c63](https://github.com/JSQLParser/JSqlParser/commit/94c63556b9d92a1) wumpz *2015-06-05 21:08:48*
-
-**fixes #143**
-
-* some refactorings done 
-
-[4d2a0](https://github.com/JSQLParser/JSqlParser/commit/4d2a0a1151faff1) wumpz *2015-06-05 20:50:28*
-
-**fixes #143**
-
-* some refactorings done 
-
-[f71c3](https://github.com/JSQLParser/JSqlParser/commit/f71c307f15c4cde) wumpz *2015-06-05 20:48:45*
-
-**fixes #142**
-
-
-[3d340](https://github.com/JSQLParser/JSqlParser/commit/3d340377b37ddd9) wumpz *2015-06-05 20:28:28*
-
-**fixes #141**
-
-
-[b78ed](https://github.com/JSQLParser/JSqlParser/commit/b78ed4b46472902) wumpz *2015-06-05 20:09:32*
-
-****
-
-
-[5123f](https://github.com/JSQLParser/JSqlParser/commit/5123fe295a4142b) wumpz *2015-06-05 20:07:12*
-
-**root nodes established but not linked**
-
-
-[71305](https://github.com/JSQLParser/JSqlParser/commit/71305d9cbdc0e5b) wumpz *2015-05-31 20:39:43*
-
-**root nodes established but not linked**
-
-
-[edd0c](https://github.com/JSQLParser/JSqlParser/commit/edd0c765ea34898) wumpz *2015-05-31 19:54:52*
-
-**astnodes for columns and tables**
-
-
-[d66a9](https://github.com/JSQLParser/JSqlParser/commit/d66a93a4066ccff) wumpz *2015-05-29 22:49:13*
-
-**simple jjtree start**
-
-
-[e594e](https://github.com/JSQLParser/JSqlParser/commit/e594e591e79f555) wumpz *2015-05-27 22:34:35*
-
-**simple jjtree start**
-
-
-[d9f5f](https://github.com/JSQLParser/JSqlParser/commit/d9f5fef5f9d43e1) wumpz *2015-05-24 21:08:32*
-
-**fixes   #134 - preserve order of query**
-
-
-[59470](https://github.com/JSQLParser/JSqlParser/commit/594705ae61fd1b5) wumpz *2015-05-24 20:28:51*
-
-**fixes #136**
-
-
-[5adeb](https://github.com/JSQLParser/JSqlParser/commit/5adebeee953bd2a) tejksat *2015-05-24 10:00:31*
-
-**fixes   #134**
-
-
-[d99e6](https://github.com/JSQLParser/JSqlParser/commit/d99e603e0e968f8) wumpz *2015-05-21 21:10:44*
-
-**fixes  #72**
-
-
-[8b540](https://github.com/JSQLParser/JSqlParser/commit/8b540614d7dbe9e) wumpz *2015-05-21 20:28:50*
-
-**fixes  #72**
-
-
-[3aaf1](https://github.com/JSQLParser/JSqlParser/commit/3aaf11d348e0b16) wumpz *2015-05-21 20:26:15*
-
-**group_concat started**
-
-
-[adca3](https://github.com/JSQLParser/JSqlParser/commit/adca3efe84aaeb3) wumpz *2015-05-20 21:48:36*
-
-****
-
-
-[3563c](https://github.com/JSQLParser/JSqlParser/commit/3563c2188f4ffde) wumpz *2015-05-12 22:32:17*
-
-
-## jsqlparser-0.9.3 (2015-05-12)
-
-### Other changes
-
-**fixes  #69**
-
-
-[16034](https://github.com/JSQLParser/JSqlParser/commit/16034878352a0fe) wumpz *2015-05-10 22:11:41*
-
-**fixes  #69**
-
-
-[35164](https://github.com/JSQLParser/JSqlParser/commit/35164e58c437fdc) wumpz *2015-05-10 22:02:24*
-
-**fixes #90**
-
-
-[536ba](https://github.com/JSQLParser/JSqlParser/commit/536ba9d091fbe75) wumpz *2015-05-07 22:53:42*
-
-**fixes #90**
-
-
-[db4a2](https://github.com/JSQLParser/JSqlParser/commit/db4a27e284ace55) wumpz *2015-05-07 22:50:35*
-
-****
-
-
-[55b8e](https://github.com/JSQLParser/JSqlParser/commit/55b8e7a4c9c947b) wumpz *2015-05-07 18:41:22*
-
-**fixes #129**
-
-
-[45132](https://github.com/JSQLParser/JSqlParser/commit/45132a7e3d57b15) wumpz *2015-04-30 19:07:21*
-
-**fixes #128**
-
-
-[aa291](https://github.com/JSQLParser/JSqlParser/commit/aa2913da90a4a05) wumpz *2015-04-27 21:59:00*
-
-**Update README.md**
-
-
-[c4f24](https://github.com/JSQLParser/JSqlParser/commit/c4f24e6a30b0b9d) Tobias *2015-04-23 08:56:37*
-
-**fixes #126 - allows brackets around select**
-
-
-[64b22](https://github.com/JSQLParser/JSqlParser/commit/64b22e45987284e) wumpz *2015-04-22 22:03:21*
-
-**fixes #125 - added values as a column name**
-
-
-[ac785](https://github.com/JSQLParser/JSqlParser/commit/ac785a405697df4) wumpz *2015-04-16 21:01:18*
-
-**fixes #110 - first implementation**
-
-
-[94195](https://github.com/JSQLParser/JSqlParser/commit/941952f58f5b5be) wumpz *2015-04-11 17:32:48*
-
-**updated readme**
-
-
-[f2d48](https://github.com/JSQLParser/JSqlParser/commit/f2d48cf28f452d4) wumpz *2015-04-09 21:52:40*
-
-**solved some oracle test sql parsings**
-
-
-[b76ba](https://github.com/JSQLParser/JSqlParser/commit/b76baa31439f841) wumpz *2015-04-09 21:45:16*
-
-**fixes  #122**
-
-
-[46f51](https://github.com/JSQLParser/JSqlParser/commit/46f51972cf47885) wumpz *2015-04-09 21:02:10*
-
-**fixes  #123**
-
-
-[68f47](https://github.com/JSQLParser/JSqlParser/commit/68f47dc7c49c1b2) wumpz *2015-04-09 20:23:50*
-
-**refactoring**
-
-
-[26e1c](https://github.com/JSQLParser/JSqlParser/commit/26e1c0ac1c9221f) wumpz *2015-04-08 21:20:40*
-
-**refactoring**
-
-
-[a9768](https://github.com/JSQLParser/JSqlParser/commit/a97686797e77480) wumpz *2015-04-08 21:17:30*
-
-**fixes #120**
-
-
-[c3995](https://github.com/JSQLParser/JSqlParser/commit/c39954916a0ab71) wumpz *2015-04-08 06:11:06*
-
-**first try to fix  #114**
-
-
-[a0d87](https://github.com/JSQLParser/JSqlParser/commit/a0d8733b6c57055) wumpz *2015-04-07 00:48:55*
-
-****
-
-
-[73822](https://github.com/JSQLParser/JSqlParser/commit/738226709622311) wumpz *2015-04-06 20:53:58*
-
-**Update README.md**
-
-
-[ad91b](https://github.com/JSQLParser/JSqlParser/commit/ad91b733c8b495c) Tobias *2015-04-06 20:34:30*
-
-**travis**
-
-
-[ade82](https://github.com/JSQLParser/JSqlParser/commit/ade827e1eda7248) wumpz *2015-04-06 20:04:47*
-
-****
-
-
-[673e0](https://github.com/JSQLParser/JSqlParser/commit/673e00b1996eaac) wumpz *2015-04-06 19:08:34*
-
-**fixes  #109**
-
-
-[a3285](https://github.com/JSQLParser/JSqlParser/commit/a32854822885741) wumpz *2015-04-02 23:08:59*
-
-**fixes #119**
-
-
-[c9b58](https://github.com/JSQLParser/JSqlParser/commit/c9b58b2b2dfba67) wumpz *2015-04-01 20:31:03*
-
-**fixes #117**
-
-
-[a3fc1](https://github.com/JSQLParser/JSqlParser/commit/a3fc1f23701d6d6) wumpz *2015-03-28 20:02:28*
-
-**fixes #117**
-
-
-[b3d91](https://github.com/JSQLParser/JSqlParser/commit/b3d91de4d54153f) wumpz *2015-03-28 19:50:20*
-
-****
-
-
-[f194b](https://github.com/JSQLParser/JSqlParser/commit/f194b7cb7cc810d) wumpz *2015-03-04 23:26:13*
-
-**corrected lookup**
-
-
-[8598d](https://github.com/JSQLParser/JSqlParser/commit/8598da5760028d6) wumpz *2015-03-04 22:33:16*
-
-**updated readme**
-
-
-[5472e](https://github.com/JSQLParser/JSqlParser/commit/5472e2d60e95590) wumpz *2015-03-04 22:28:45*
-
-**fixes #115**
-
-
-[a3e02](https://github.com/JSQLParser/JSqlParser/commit/a3e024a0b002ad0) wumpz *2015-03-04 22:18:59*
-
-**fixes  #116**
-
-
-[c916f](https://github.com/JSQLParser/JSqlParser/commit/c916f14c1e5f82c) wumpz *2015-03-04 21:55:29*
-
-**Update README.md**
-
-
-[18089](https://github.com/JSQLParser/JSqlParser/commit/18089564f2b9efb) Tobias *2015-02-12 22:54:15*
-
-
-## jsqlparser-0.9.2 (2015-02-12)
-
-### Other changes
-
-**updated readme**
-
-
-[13d29](https://github.com/JSQLParser/JSqlParser/commit/13d29e0d545bbaa) wumpz *2015-02-12 21:43:13*
-
-**introduced user variables: fixes #107**
-
-
-[0c288](https://github.com/JSQLParser/JSqlParser/commit/0c2889ca34c88fd) wumpz *2015-02-11 21:21:24*
-
-**maybe not correct alter statement**
-
-
-[ab001](https://github.com/JSQLParser/JSqlParser/commit/ab00181f492820a) wumpz *2015-02-04 22:53:06*
-
-**fixes #102**
-
-
-[d603e](https://github.com/JSQLParser/JSqlParser/commit/d603e41768a49fd) wumpz *2015-02-04 21:16:18*
-
-**Update README.md**
-
-
-[66517](https://github.com/JSQLParser/JSqlParser/commit/6651771afb0754f) Tobias *2015-02-01 20:03:21*
-
-**fixes #91**
-
-
-[495a7](https://github.com/JSQLParser/JSqlParser/commit/495a7f2590703db) wumpz *2015-02-01 00:07:07*
-
-**Update README.md**
-
-
-[d0ce4](https://github.com/JSQLParser/JSqlParser/commit/d0ce413581ace0d) Tobias *2015-01-30 21:30:28*
-
-**fixes #89**
-
-
-[4ac85](https://github.com/JSQLParser/JSqlParser/commit/4ac85f0b27c21ba) wumpz *2015-01-21 20:15:55*
-
-**pivot function test**
-
-
-[3cc5a](https://github.com/JSQLParser/JSqlParser/commit/3cc5acd2ee83f76) wumpz *2015-01-16 23:33:19*
-
-**Update README.md**
-
-
-[3bec5](https://github.com/JSQLParser/JSqlParser/commit/3bec524f829975b) Tobias *2015-01-11 10:37:55*
-
-**fixes #99**
-
-
-[d4bc7](https://github.com/JSQLParser/JSqlParser/commit/d4bc726944700c1) wumpz *2015-01-10 23:10:04*
-
-**fixes #99**
-
-
-[5ac27](https://github.com/JSQLParser/JSqlParser/commit/5ac27a7ceb6166d) wumpz *2015-01-10 23:08:28*
-
-**small grammar cleanup**
-
-
-[e4756](https://github.com/JSQLParser/JSqlParser/commit/e47566636b7fd83) wumpz *2014-12-18 21:24:23*
-
-**fixes #93**
-
-
-[02be9](https://github.com/JSQLParser/JSqlParser/commit/02be9cdbca314f6) wumpz *2014-12-10 23:33:19*
-
-**fixes #92**
-
-
-[e902a](https://github.com/JSQLParser/JSqlParser/commit/e902a41c71e1b44) wumpz *2014-12-10 23:17:40*
-
-**updated readme**
-
-
-[32bf3](https://github.com/JSQLParser/JSqlParser/commit/32bf3a2f1798270) wumpz *2014-12-10 21:56:12*
-
-**add group ba additions to SelectUtils**
-
-
-[dd77b](https://github.com/JSQLParser/JSqlParser/commit/dd77b6c4f2a1f24) wumpz *2014-12-08 22:51:59*
-
-****
-
-
-[adcaf](https://github.com/JSQLParser/JSqlParser/commit/adcaf0fe83dad8c) wumpz *2014-12-07 21:54:35*
-
-**fixes #88**
-
-
-[0d5cc](https://github.com/JSQLParser/JSqlParser/commit/0d5cc58237dbaae) wumpz *2014-12-03 23:45:07*
-
-**oracle colls started**
-
-
-[e8a18](https://github.com/JSQLParser/JSqlParser/commit/e8a18cc8b76c6bd) wumpz *2014-11-30 20:41:53*
-
-**options**
-
-
-[2e85a](https://github.com/JSQLParser/JSqlParser/commit/2e85a16ebf7bfe3) wumpz *2014-11-25 00:11:17*
-
-**updated readme**
-
-
-[72340](https://github.com/JSQLParser/JSqlParser/commit/72340e55d94f68e) wumpz *2014-11-24 20:17:52*
-
-**added create table parameters to deparser**
-
-
-[05967](https://github.com/JSQLParser/JSqlParser/commit/05967cce8c528db) wumpz *2014-11-24 20:10:48*
-
-**added create parameters to include into deparser**
-
-
-[6f89e](https://github.com/JSQLParser/JSqlParser/commit/6f89e35e4544112) wumpz *2014-11-23 23:36:35*
-
-**added commit keyword**
-
-
-[f276b](https://github.com/JSQLParser/JSqlParser/commit/f276b33528821ad) wumpz *2014-11-23 23:26:40*
-
-**fixes #87**
-
-
-[2056c](https://github.com/JSQLParser/JSqlParser/commit/2056cb064dffb3f) wumpz *2014-11-22 00:27:01*
-
-**simple cleanup**
-
-
-[6a98d](https://github.com/JSQLParser/JSqlParser/commit/6a98d2bd8dd504b) wumpz *2014-11-20 20:42:39*
-
-**withitem - deparsing merged and modified**
-
-
-[20e0f](https://github.com/JSQLParser/JSqlParser/commit/20e0f48c1a56da4) wumpz *2014-11-03 22:54:58*
-
-**use accept() instead of toString() on StatementDeParser**
-
-
-[67497](https://github.com/JSQLParser/JSqlParser/commit/674974ac08f822d) reed1 *2014-11-02 06:53:07*
-
-**fixes #84**
-
-
-[a5031](https://github.com/JSQLParser/JSqlParser/commit/a5031b403af80e4) wumpz *2014-10-31 22:57:23*
-
-**for update selects implemented**
-
-
-[92efe](https://github.com/JSQLParser/JSqlParser/commit/92efe5b962ede77) wumpz *2014-10-30 23:59:42*
-
-**allow 'key' as object name**
-
-
-[32b0a](https://github.com/JSQLParser/JSqlParser/commit/32b0a67999cf9ca) wumpz *2014-10-30 23:19:30*
-
-**update readme**
-
-
-[d9951](https://github.com/JSQLParser/JSqlParser/commit/d9951d7bc5129da) wumpz *2014-10-22 22:03:20*
-
-**little housekeeping**
-
-
-[5fb21](https://github.com/JSQLParser/JSqlParser/commit/5fb21dc2f605f81) wumpz *2014-10-22 21:51:37*
-
-**Manage OFFSET and FETCH clauses in dedicated classes and rules in**
-
-* jsqlparsercc.jj 
-* Manage also jdbc parameter in these clauses. 
-
-[26524](https://github.com/JSQLParser/JSqlParser/commit/26524ac850461cb) LionelNirva *2014-10-10 14:38:20*
-
-**added test for wrong top distinct order.**
-
-
-[ccefb](https://github.com/JSQLParser/JSqlParser/commit/ccefbeb29ac6693) wumpz *2014-10-09 19:23:52*
-
-**Add support for new SQL Server 2012 and Oracle 12c versions of LIMIT**
-
-* (equivalent to MySql and PostgreSQL LIMIT ... OFFSET ... clauses) for 
-* parsing and deparsing. 
-
-[dc215](https://github.com/JSQLParser/JSqlParser/commit/dc215bb6b8cf70b) LionelNirva *2014-10-08 12:38:04*
-
-**Unit test for the fix Bug when Deparsing SQL Server request having TOP**
-
-* and DISTINCT clauses. 
-
-[c2ad9](https://github.com/JSQLParser/JSqlParser/commit/c2ad9d2b2c2ee9f) LionelNirva *2014-10-07 14:31:43*
-
-**little housekeeping**
-
-
-[fd25a](https://github.com/JSQLParser/JSqlParser/commit/fd25ab4b9279003) wumpz *2014-10-05 21:44:57*
-
-**little housekeeping**
-
-
-[c3ec6](https://github.com/JSQLParser/JSqlParser/commit/c3ec64d426102cc) wumpz *2014-10-05 21:38:24*
-
-**compile error corrected**
-
-
-[8ae4b](https://github.com/JSQLParser/JSqlParser/commit/8ae4bead1868ac7) wumpz *2014-10-05 21:15:34*
-
-**Fix Bug when Deparsing SQL Server request having TOP and DISTINCT**
-
-* clauses. SQL Server requires the DISTINCT clause to be the first. 
-
-[7ac70](https://github.com/JSQLParser/JSqlParser/commit/7ac7002d1276f01) LionelNirva *2014-10-03 16:34:49*
-
-**Update UpdateTest.java**
-
-* Add an SQL test for Update with Select 
-
-[aec82](https://github.com/JSQLParser/JSqlParser/commit/aec82516c9d0db6) CeeKayGit *2014-10-01 21:34:51*
-
-**Update UpdateDeParser.java**
-
-
-[f2fec](https://github.com/JSQLParser/JSqlParser/commit/f2fecb7b62f5882) CeeKayGit *2014-10-01 21:18:33*
-
-**Update UpdateDeParser.java**
-
-
-[e31ac](https://github.com/JSQLParser/JSqlParser/commit/e31ac1ad7090fc2) CeeKayGit *2014-10-01 20:51:26*
-
-**Update Update.java**
-
-* Add necessary Select import for Update with Select 
-
-[8321a](https://github.com/JSQLParser/JSqlParser/commit/8321aae44a6adce) CeeKayGit *2014-10-01 20:37:42*
-
-**Update UpdateDeParser.java**
-
-* Extend the deparser to support DB2 Updates with Select clause 
-
-[3a7bf](https://github.com/JSQLParser/JSqlParser/commit/3a7bf9d520ead88) CeeKayGit *2014-10-01 20:12:14*
-
-**Update JSqlParserCC.jj**
-
-* For DB2 &quot;$&quot; is also a standard letter, so handle &quot;$&quot; as #LETTER. 
-
-[a6383](https://github.com/JSQLParser/JSqlParser/commit/a6383a52ccee448) CeeKayGit *2014-09-30 20:56:13*
-
-**Update Update.java**
-
-* Add support for DB2 Updates with Select clause 
-
-[1bdb6](https://github.com/JSQLParser/JSqlParser/commit/1bdb69b8891ee26) CeeKayGit *2014-09-30 20:52:21*
-
-**Update JSqlParserCC.jj**
-
-* Add support for DB2 Updates with Select clause 
-
-[17e3d](https://github.com/JSQLParser/JSqlParser/commit/17e3d539a4ce6bd) CeeKayGit *2014-09-30 20:47:54*
-
-**Update README.md**
-
-
-[23279](https://github.com/JSQLParser/JSqlParser/commit/232795fc575cdf1) Tobias *2014-09-23 20:32:34*
-
-
-## jsqlparser-0.9.1 (2014-09-23)
-
-### Other changes
-
-**Update README.md**
-
-
-[267b4](https://github.com/JSQLParser/JSqlParser/commit/267b443e23b95a2) Tobias *2014-09-22 07:25:49*
-
-**corrected typo**
-
-
-[90c93](https://github.com/JSQLParser/JSqlParser/commit/90c932332a6b8ed) wumpz *2014-09-07 20:28:38*
-
-**refactored join processor to be more restrictive**
-
-
-[f1544](https://github.com/JSQLParser/JSqlParser/commit/f154446364fd5db) wumpz *2014-09-06 20:24:16*
-
-**simple execute clause support**
-
-
-[531d6](https://github.com/JSQLParser/JSqlParser/commit/531d6177dfc03d1) wumpz *2014-08-14 21:46:11*
-
-**simple start for execute**
-
-
-[d6f01](https://github.com/JSQLParser/JSqlParser/commit/d6f0101b9a3d2e4) wumpz *2014-08-13 23:17:08*
-
-**simple start for execute**
-
-
-[406a1](https://github.com/JSQLParser/JSqlParser/commit/406a138cf3af9f7) wumpz *2014-08-13 23:08:35*
-
-**updated readme**
-
-
-[1532d](https://github.com/JSQLParser/JSqlParser/commit/1532d15c3dad9ff) wumpz *2014-08-12 14:33:26*
-
-**correced select into parsing and deparsing**
-
-
-[0b7f3](https://github.com/JSQLParser/JSqlParser/commit/0b7f3007dac51cb) wumpz *2014-08-12 14:29:46*
-
-**refactored grammar a bit**
-
-
-[096e8](https://github.com/JSQLParser/JSqlParser/commit/096e8742b6fff86) wumpz *2014-08-05 20:58:15*
-
-**improved insert clause**
-
-
-[a4de6](https://github.com/JSQLParser/JSqlParser/commit/a4de602442a73da) wumpz *2014-08-04 22:09:19*
-
-**corrected a failing test**
-
-
-[24dc0](https://github.com/JSQLParser/JSqlParser/commit/24dc08db8b9f536) wumpz *2014-07-30 20:47:49*
-
-**updated readme**
-
-
-[fc0ba](https://github.com/JSQLParser/JSqlParser/commit/fc0ba6a535c3f30) wumpz *2014-07-30 20:43:23*
-
-**limit 0 and limit null included**
-
-
-[50d3e](https://github.com/JSQLParser/JSqlParser/commit/50d3e8b4224bbaf) wumpz *2014-07-30 20:41:40*
-
-**Add support for LIMIT 0 and LIMIT NULL statements**
-
-
-[6db00](https://github.com/JSQLParser/JSqlParser/commit/6db009418e925ca) Michaël Cervera *2014-07-29 21:58:29*
-
-**unlogged inlucded in deparser**
-
-
-[e9939](https://github.com/JSQLParser/JSqlParser/commit/e9939fdfdfca726) wumpz *2014-07-27 21:42:18*
-
-**Add support for 'UNLOGGED' tables**
-
-* Support the PostgreSQL 9.1+ ‘UNLOGGED’ table feature 
-
-[eb05c](https://github.com/JSQLParser/JSqlParser/commit/eb05ce30cb90b93) Michaël Cervera *2014-07-27 20:49:00*
-
-**create table implemented version 2**
-
-
-[98903](https://github.com/JSQLParser/JSqlParser/commit/989033d24e9b3a9) wumpz *2014-07-26 19:56:53*
-
-**recent changes made more oracle tests succeed**
-
-
-[bbf36](https://github.com/JSQLParser/JSqlParser/commit/bbf360e5620b073) wumpz *2014-07-24 20:04:01*
-
-**updated readme**
-
-
-[262d4](https://github.com/JSQLParser/JSqlParser/commit/262d48922d66d0f) wumpz *2014-07-24 19:59:25*
-
-**replaced column list in expression list for partition by of analytic expressions**
-
-
-[2ebaa](https://github.com/JSQLParser/JSqlParser/commit/2ebaaf03602a13b) wumpz *2014-07-24 19:53:17*
-
-**updated readme**
-
-
-[55e68](https://github.com/JSQLParser/JSqlParser/commit/55e68bfb4f84fa5) wumpz *2014-07-22 20:49:45*
-
-**implemented create table .. as select ..**
-
-
-[23b93](https://github.com/JSQLParser/JSqlParser/commit/23b938c096eaf67) wumpz *2014-07-22 20:48:00*
-
-**simple improvements**
-
-
-[5b3ea](https://github.com/JSQLParser/JSqlParser/commit/5b3ea032ff50712) wumpz *2014-07-16 20:27:54*
-
-**added lookahead for regexp binary**
-
-
-[75aed](https://github.com/JSQLParser/JSqlParser/commit/75aeded181a6f88) Sarah Komla-Ebri *2014-07-16 15:05:30*
-
-**Added support for MySQL REGEXP BINARY (for case insensitivity)**
-
-
-[ec0dc](https://github.com/JSQLParser/JSqlParser/commit/ec0dc88bc9b4280) Sarah Komla-Ebri *2014-07-16 13:50:37*
-
-**Added support for MySQL REGEXP insensitivity case**
-
-
-[4d9e4](https://github.com/JSQLParser/JSqlParser/commit/4d9e46198e0a679) Sarah Komla-Ebri *2014-07-16 13:27:25*
-
-**simple first json syntax**
-
-
-[cb674](https://github.com/JSQLParser/JSqlParser/commit/cb674bfa5937757) wumpz *2014-06-24 21:20:58*
-
-**simple first json syntax**
-
-
-[45ce9](https://github.com/JSQLParser/JSqlParser/commit/45ce94eb9c0c62a) wumpz *2014-06-24 21:19:04*
-
-**returning implemented, column as identifier allowed**
-
-
-[0020c](https://github.com/JSQLParser/JSqlParser/commit/0020c798f32c586) wumpz *2014-06-20 23:04:02*
-
-**returning implemented, column as identifier allowed**
-
-
-[733ff](https://github.com/JSQLParser/JSqlParser/commit/733ff6da5d59ac1) wumpz *2014-06-20 22:58:28*
-
-**Update README.md**
-
-
-[e12b8](https://github.com/JSQLParser/JSqlParser/commit/e12b8644326d3d2) Tobias *2014-06-04 20:50:35*
-
-**Update README.md**
-
-
-[e8927](https://github.com/JSQLParser/JSqlParser/commit/e8927d40ab55bdd) Tobias *2014-06-04 20:47:38*
-
-**Update README.md**
-
-
-[fb8ad](https://github.com/JSQLParser/JSqlParser/commit/fb8add01cb28b85) Tobias *2014-06-04 20:46:03*
-
-**Update README.md**
-
-
-[08c6a](https://github.com/JSQLParser/JSqlParser/commit/08c6a48b3180db4) Tobias *2014-06-04 20:45:22*
-
-**fixes #56 : multitable updates**
-
-
-[dfda1](https://github.com/JSQLParser/JSqlParser/commit/dfda1395c4275f6) wumpz *2014-05-25 20:16:31*
-
-**fixes #56 : multitable updates**
-
-
-[9c183](https://github.com/JSQLParser/JSqlParser/commit/9c183ed34760126) wumpz *2014-05-25 20:06:04*
-
-**fixes #57: brackets were not handled properly**
-
-
-[00367](https://github.com/JSQLParser/JSqlParser/commit/003674787cfa982) wumpz *2014-05-25 19:10:28*
-
-**readme updated**
-
-
-[55634](https://github.com/JSQLParser/JSqlParser/commit/5563419fd15e430) wumpz *2014-05-22 22:08:32*
-
-**junit annotations**
-
-
-[57154](https://github.com/JSQLParser/JSqlParser/commit/57154b37c22abfb) wumpz *2014-05-22 21:05:22*
-
-**Unit test**
-
-
-[8cc03](https://github.com/JSQLParser/JSqlParser/commit/8cc036b4a99117a) shuyangzhou *2014-05-20 21:52:29*
-
-**TablesNamesFinder.getTableList(Delete) throws NPE when the sql does not have a where clause**
-
-
-[6d828](https://github.com/JSQLParser/JSqlParser/commit/6d8287fcf9dd1ee) shuyangzhou *2014-05-20 21:52:24*
-
-**upgrade to JavaCC 6.1.2**
-
-
-[c3404](https://github.com/JSQLParser/JSqlParser/commit/c3404e01e59b8d5) wumpz *2014-05-16 06:49:21*
-
-**Update README.md**
-
-
-[67af4](https://github.com/JSQLParser/JSqlParser/commit/67af4cd64bf0af0) Tobias *2014-05-08 19:35:00*
-
-
-## jsqlparser-0.9 (2014-05-08)
-
-### Other changes
-
-**support for some keywords as objectnames**
-
-
-[60f2b](https://github.com/JSQLParser/JSqlParser/commit/60f2bc4345ad0c8) wumpz *2014-05-07 21:19:09*
-
-**support for some keywords as objectnames**
-
-
-[c126e](https://github.com/JSQLParser/JSqlParser/commit/c126e1e511d2deb) wumpz *2014-05-07 20:57:32*
-
-**support for named pks included**
-
-
-[3aabf](https://github.com/JSQLParser/JSqlParser/commit/3aabff2d744315e) wumpz *2014-04-20 23:56:06*
-
-**support for named pks included**
-
-
-[9e683](https://github.com/JSQLParser/JSqlParser/commit/9e683d3662350ce) wumpz *2014-04-20 23:51:10*
-
-**util for conditional expression parsing included**
-
-
-[ffeb7](https://github.com/JSQLParser/JSqlParser/commit/ffeb7b7013afaf4) wumpz *2014-04-07 21:29:42*
-
-**util for conditional expression parsing included**
-
-
-[bc5a6](https://github.com/JSQLParser/JSqlParser/commit/bc5a6a459533b4e) wumpz *2014-04-07 21:21:58*
-
-**updated readme**
-
-
-[01a82](https://github.com/JSQLParser/JSqlParser/commit/01a82c2e2da9ffb) wumpz *2014-03-23 21:21:41*
-
-**updated readme**
-
-
-[84979](https://github.com/JSQLParser/JSqlParser/commit/849796360b04aa1) wumpz *2014-03-22 22:43:53*
-
-**changed configuration**
-
-
-[96be5](https://github.com/JSQLParser/JSqlParser/commit/96be5d779bbf0bb) wumpz *2014-03-22 21:42:11*
-
-**readme updated**
-
-
-[986c8](https://github.com/JSQLParser/JSqlParser/commit/986c87e1c61f332) wumpz *2014-03-18 21:35:28*
-
-**removed stachtrace printing for problematic sql scripts**
-
-
-[7ff12](https://github.com/JSQLParser/JSqlParser/commit/7ff12fb4fded358) wumpz *2014-03-18 20:52:15*
-
-**corrected some sql test scripts to be deparseable**
-
-* corrected pivot handling in SelectDeParser 
-
-[8ac25](https://github.com/JSQLParser/JSqlParser/commit/8ac250d9f90144d) wumpz *2014-03-12 23:24:47*
-
-**site descriptor**
-
-
-[a6265](https://github.com/JSQLParser/JSqlParser/commit/a626532c854c35b) wumpz *2014-03-12 19:56:37*
-
-**pivot test sqls a little tweaked so parseing deparsing will work**
-
-
-[dcd97](https://github.com/JSQLParser/JSqlParser/commit/dcd97c16a007c31) wumpz *2014-03-08 00:00:29*
-
-**pivot for subquery corrected**
-
-
-[eb480](https://github.com/JSQLParser/JSqlParser/commit/eb480d73dc02c5c) wumpz *2014-03-07 23:48:52*
-
-**!= usage corrected**
-
-* deparser for oracle hierarchical expressions corrected 
-* order by asc/desc corrected 
-
-[d4f74](https://github.com/JSQLParser/JSqlParser/commit/d4f744c761fffe9) wumpz *2014-03-06 22:27:11*
-
-**ALL processing corrected**
-
-
-[68938](https://github.com/JSQLParser/JSqlParser/commit/68938c79b0394e0) wumpz *2014-03-06 20:46:49*
-
-**lax tests improved**
-
-
-[ab578](https://github.com/JSQLParser/JSqlParser/commit/ab578af86ca2c26) wumpz *2014-03-05 23:17:40*
-
-**toString for windowing elements corrected**
-
-* lax equality test implemented 
-* included oracle test sqls 
-* included @ and # for identifiers 
-
-[884dc](https://github.com/JSQLParser/JSqlParser/commit/884dcafa73ecfd2) wumpz *2014-03-05 23:01:03*
-
-**First version of all *Visitor adapters + simple test**
-
-
-[cdc42](https://github.com/JSQLParser/JSqlParser/commit/cdc42110478506b) aalmiray *2014-03-05 20:45:57*
-
-**character set implemented**
-
-
-[90048](https://github.com/JSQLParser/JSqlParser/commit/90048e535baa2f0) wumpz *2014-03-01 00:11:04*
-
-**character set implemented**
-
-
-[e7114](https://github.com/JSQLParser/JSqlParser/commit/e7114e3c53230c6) wumpz *2014-03-01 00:05:59*
-
-**Update README.md**
-
-
-[2c22b](https://github.com/JSQLParser/JSqlParser/commit/2c22b60433c9a51) Tobias *2014-02-20 22:51:32*
-
-
-## jsqlparser-0.8.9 (2014-02-20)
-
-### Other changes
-
-**Update README.md**
-
-
-[d6edd](https://github.com/JSQLParser/JSqlParser/commit/d6eddfd7e5d8a6b) Tobias *2014-02-15 22:11:51*
-
-**readme**
-
-
-[f82d8](https://github.com/JSQLParser/JSqlParser/commit/f82d8316f00c581) wumpz *2014-02-14 22:01:31*
-
-**first statements version**
-
-
-[4be27](https://github.com/JSQLParser/JSqlParser/commit/4be2700c2b5e0cd) wumpz *2014-02-14 21:56:27*
-
-**update readme**
-
-
-[ff94a](https://github.com/JSQLParser/JSqlParser/commit/ff94a3ded2c295c) wumpz *2014-02-11 00:13:16*
-
-****
-
-
-[c91d1](https://github.com/JSQLParser/JSqlParser/commit/c91d153020b588c) wumpz *2014-02-11 00:08:31*
-
-**update readme**
-
-
-[3b219](https://github.com/JSQLParser/JSqlParser/commit/3b21988a4857273) wumpz *2014-02-11 00:01:11*
-
-**corrected some styling issues**
-
-
-[a3a7f](https://github.com/JSQLParser/JSqlParser/commit/a3a7ff934980b41) wumpz *2014-02-10 23:44:22*
-
-**backported analytic expressions from fork**
-
-
-[43d97](https://github.com/JSQLParser/JSqlParser/commit/43d97ea79f1e48a) wumpz *2014-02-10 23:36:24*
-
-**order by clause improved nulls first last**
-
-
-[ce45f](https://github.com/JSQLParser/JSqlParser/commit/ce45fbcf7f2d3e3) wumpz *2014-02-09 23:59:29*
-
-**added versions to pom**
-
-
-[06bbd](https://github.com/JSQLParser/JSqlParser/commit/06bbda82b813e7b) wumpz *2014-02-08 11:01:56*
-
-****
-
-
-[9b2c2](https://github.com/JSQLParser/JSqlParser/commit/9b2c295a8552cf6) wumpz *2014-02-07 22:25:13*
-
-**Updated most of the Maven dependencies;**
-
-
-[e6aaf](https://github.com/JSQLParser/JSqlParser/commit/e6aaf8b260fadd7) Pap Lőrinc *2014-02-07 07:59:11*
-
-**Added PERCENT support for the TOP statement;**
-
-
-[5e127](https://github.com/JSQLParser/JSqlParser/commit/5e127196a96ced3) Pap Lőrinc *2014-02-07 07:58:51*
-
-**Update README.md**
-
-
-[53aab](https://github.com/JSQLParser/JSqlParser/commit/53aab5737c61d1e) Tobias *2014-02-06 21:18:20*
-
-**readme updated**
-
-
-[96654](https://github.com/JSQLParser/JSqlParser/commit/966541e5b90dbb8) wumpz *2014-02-06 21:14:04*
-
-**added testcase, little refactoring**
-
-
-[4f766](https://github.com/JSQLParser/JSqlParser/commit/4f76615cf3bbd9b) wumpz *2014-02-06 21:08:18*
-
-**Modified the TOP expression to accept parentheses also;**
-
-
-[b5849](https://github.com/JSQLParser/JSqlParser/commit/b5849b63d24bef3) Pap Lőrinc *2014-02-06 09:39:31*
-
-**updated readme**
-
-
-[e143a](https://github.com/JSQLParser/JSqlParser/commit/e143abbd6c6374f) wumpz *2014-02-04 22:57:24*
-
-**removed Exception logging for false multipart name test**
-
-
-[7a94f](https://github.com/JSQLParser/JSqlParser/commit/7a94fa7b57a085b) wumpz *2014-02-04 22:48:24*
-
-****
-
-
-[e1f06](https://github.com/JSQLParser/JSqlParser/commit/e1f06bb0204fe43) wumpz *2014-02-04 22:14:12*
-
-**included maven site generation**
-
-
-[fc016](https://github.com/JSQLParser/JSqlParser/commit/fc016126850b1ac) wumpz *2014-02-02 23:47:06*
-
-**extended multipart identifier tests**
-
-
-[a3e0f](https://github.com/JSQLParser/JSqlParser/commit/a3e0f9de56c4441) wumpz *2014-02-02 00:04:28*
-
-****
-
-
-[13f3c](https://github.com/JSQLParser/JSqlParser/commit/13f3c0c64f785fb) wumpz *2014-02-01 23:23:43*
-
-**removed possibility of empty tablename**
-
-
-[9a819](https://github.com/JSQLParser/JSqlParser/commit/9a819eb5ceae1f9) wumpz *2014-02-01 23:17:35*
-
-**removed some changes**
-
-
-[7fa4f](https://github.com/JSQLParser/JSqlParser/commit/7fa4f8501cc4453) wumpz *2014-02-01 22:55:57*
-
-**signed expressions tests improved**
-
-
-[a78ab](https://github.com/JSQLParser/JSqlParser/commit/a78ab94cd60353f) wumpz *2014-02-01 22:18:32*
-
-**Replaced a leftover StringBuffer with StringBuilder;**
-
-
-[9b8d7](https://github.com/JSQLParser/JSqlParser/commit/9b8d72739d464cc) Pap Lőrinc *2014-01-28 17:26:00*
-
-**Corrected Sql Server multi-part table and column names (database.schema.table.column) in the select statement to accept 4 levels with empty inner parts;**
-
-
-[ba6c5](https://github.com/JSQLParser/JSqlParser/commit/ba6c54de7da2efa) Pap Lőrinc *2014-01-28 17:23:37*
-
-**Renamed getWholeColumnName and getWholeTableName to getFullyQualifiedName;**
-
-
-[b4d54](https://github.com/JSQLParser/JSqlParser/commit/b4d547eeb04cb9a) Pap Lőrinc *2014-01-28 17:14:09*
-
-**Corrected the signed expression behaviors and renamed InverseExpression to SignedExpression;**
-
-
-[d1e71](https://github.com/JSQLParser/JSqlParser/commit/d1e7185633bf840) Pap Lőrinc *2014-01-28 08:36:06*
-
-**Removed the leading and trailing whitespaces in the JavaCC parser file;**
-
-* Organized the declared imports in order to ease further changes in the file and to remove unused ones; 
-* Renamed the S_INTEGER token to S_LONG to be in sync with the S_DOUBLE token; 
-
-[5d151](https://github.com/JSQLParser/JSqlParser/commit/5d151c7bdbe08fd) Pap Lőrinc *2014-01-28 08:24:04*
-
-**fixes #34**
-
-
-[144ca](https://github.com/JSQLParser/JSqlParser/commit/144ca3a140d1024) wumpz *2014-01-23 22:14:58*
-
-**Update README.md**
-
-
-[7024b](https://github.com/JSQLParser/JSqlParser/commit/7024bc7c1d1f553) Tobias *2014-01-22 23:23:54*
-
-
-## jsqlparser-0.8.8 (2014-01-22)
-
-### Other changes
-
-**problem with git v1.8.5 adressed**
-
-
-[9b12d](https://github.com/JSQLParser/JSqlParser/commit/9b12d17a4cb9744) wumpz *2014-01-22 23:05:23*
-
-**version 0.8.8-SNAPSHOT**
-
-
-[810ca](https://github.com/JSQLParser/JSqlParser/commit/810cabdafe2012a) wumpz *2014-01-22 22:41:41*
-
-**version 0.8.8-SNAPSHOT**
-
-
-[fdd3a](https://github.com/JSQLParser/JSqlParser/commit/fdd3a71426e473a) wumpz *2014-01-22 22:29:11*
-
-**Update README.md**
-
-
-[d4083](https://github.com/JSQLParser/JSqlParser/commit/d40837361354a27) Tobias *2014-01-21 23:37:41*
-
-**addJoin introduced**
-
-
-[c19f8](https://github.com/JSQLParser/JSqlParser/commit/c19f83f768a5e4a) wumpz *2014-01-21 23:35:34*
-
-**readme updated**
-
-
-[d3675](https://github.com/JSQLParser/JSqlParser/commit/d367559442a98ab) wumpz *2014-01-14 22:29:07*
-
-**started simple utility function for select statement modification**
-
-
-[bf454](https://github.com/JSQLParser/JSqlParser/commit/bf454e9a261cd4d) wumpz *2014-01-14 22:18:43*
-
-**started simple utility function for select statement modification**
-
-
-[6b5e2](https://github.com/JSQLParser/JSqlParser/commit/6b5e29af117e04e) wumpz *2014-01-14 22:11:13*
-
-**update readme**
-
-
-[311d6](https://github.com/JSQLParser/JSqlParser/commit/311d63639bda4a4) wumpz *2014-01-14 21:07:21*
-
-**little housekeeping**
-
-
-[1c927](https://github.com/JSQLParser/JSqlParser/commit/1c927884749b032) wumpz *2014-01-14 21:01:05*
-
-**Alias class implemented and integrated**
-
-
-[ce339](https://github.com/JSQLParser/JSqlParser/commit/ce3390677746faf) wumpz *2014-01-14 20:58:03*
-
-**Added one simple insert SQL to test**
-
-
-[2db02](https://github.com/JSQLParser/JSqlParser/commit/2db02ada400cd99) wumpz *2014-01-11 15:05:50*
-
-****
-
-
-[f58ca](https://github.com/JSQLParser/JSqlParser/commit/f58ca061b25ba5b) wumpz *2013-12-08 20:13:04*
-
-**update readme**
-
-
-[068b1](https://github.com/JSQLParser/JSqlParser/commit/068b19d17d9dba4) wumpz *2013-12-07 23:59:34*
-
-**start alter statement**
-
-
-[75575](https://github.com/JSQLParser/JSqlParser/commit/7557524708d0ce0) wumpz *2013-12-07 23:57:27*
-
-**PostgresSQL regular expression match operators**
-
-
-[e5e48](https://github.com/JSQLParser/JSqlParser/commit/e5e488d60c316f3) wumpz *2013-11-12 21:37:43*
-
-**Update README.md**
-
-
-[259dd](https://github.com/JSQLParser/JSqlParser/commit/259dd566a55a9b6) Tobias *2013-11-08 23:38:09*
-
-**PostgresSQL regular expression case sensitive match**
-
-
-[db923](https://github.com/JSQLParser/JSqlParser/commit/db923d53c5ceee7) wumpz *2013-11-08 23:33:46*
-
-**PostgresSQL regular expression case sensitive match**
-
-
-[88b5a](https://github.com/JSQLParser/JSqlParser/commit/88b5aa81b405d45) wumpz *2013-11-08 23:27:30*
-
-**simple modifier cleanup**
-
-
-[0528e](https://github.com/JSQLParser/JSqlParser/commit/0528ecca9768cf7) wumpz *2013-11-06 21:11:27*
-
-**Update README.md**
-
-
-[2a4bb](https://github.com/JSQLParser/JSqlParser/commit/2a4bbe5391e4dfd) Tobias *2013-10-30 22:37:09*
-
-**update readme**
-
-
-[e3b0e](https://github.com/JSQLParser/JSqlParser/commit/e3b0e6c4b5b7e48) wumpz *2013-10-30 22:31:03*
-
-
-## jsqlparser-0.8.6 (2013-10-30)
-
-### Other changes
-
-**a little cleanup**
-
-
-[bdc81](https://github.com/JSQLParser/JSqlParser/commit/bdc81933ab76b01) wumpz *2013-10-24 21:46:52*
-
-**version not needed anymore**
-
-
-[7a737](https://github.com/JSQLParser/JSqlParser/commit/7a737e70a76616d) wumpz *2013-10-24 21:34:14*
-
-**Update README.md**
-
-
-[f14e3](https://github.com/JSQLParser/JSqlParser/commit/f14e3c98917bc24) Tobias *2013-10-08 22:42:11*
-
-**Update README.md**
-
-
-[22c3e](https://github.com/JSQLParser/JSqlParser/commit/22c3ee9379b4f7c) Tobias *2013-10-08 22:37:23*
-
-**update readme.md**
-
-
-[d2dcf](https://github.com/JSQLParser/JSqlParser/commit/d2dcfaece51ceda) wumpz *2013-10-08 22:35:21*
-
-**merge oracle hierarchical syntax into main**
-
-
-[a0b21](https://github.com/JSQLParser/JSqlParser/commit/a0b21c36e5d2008) wumpz *2013-10-08 22:23:30*
-
-**merge oracle hierarchical syntax into main**
-
-
-[6c300](https://github.com/JSQLParser/JSqlParser/commit/6c30062bd7e9a59) wumpz *2013-10-08 22:22:19*
-
-**OracleHierarchicalExpression implemented**
-
-
-[b48f2](https://github.com/JSQLParser/JSqlParser/commit/b48f26e48a00f03) wumpz *2013-10-08 22:07:03*
-
-**OracleHierarchicalExpression implemented**
-
-
-[afa6e](https://github.com/JSQLParser/JSqlParser/commit/afa6e2d73d237f0) wumpz *2013-10-08 00:15:32*
-
-**Update README.md**
-
-
-[3901b](https://github.com/JSQLParser/JSqlParser/commit/3901bc6bf380099) Tobias *2013-10-07 12:09:23*
-
-**Update README.md**
-
-
-[9eb5f](https://github.com/JSQLParser/JSqlParser/commit/9eb5fa11dad1733) Tobias *2013-10-06 14:12:55*
-
-**parser updated oracle recursives**
-
-
-[aff53](https://github.com/JSQLParser/JSqlParser/commit/aff53603149d42c) wumpz *2013-10-01 19:07:16*
-
-**begin implementation of oracle recursive queries**
-
-
-[a7566](https://github.com/JSQLParser/JSqlParser/commit/a7566a7371bdca0) wumpz *2013-09-19 20:33:18*
-
-
-## jsqlparser-0.8.5 (2013-10-06)
-
-### Other changes
-
-**preparing release of 0.8.5**
-
-
-[7abce](https://github.com/JSQLParser/JSqlParser/commit/7abce433ce56bab) wumpz *2013-10-06 13:23:53*
-
-**preparing release of 0.8.5**
-
-
-[0e13b](https://github.com/JSQLParser/JSqlParser/commit/0e13b77a827dfb5) wumpz *2013-10-06 12:55:48*
-
-**readme updated**
-
-
-[3e68f](https://github.com/JSQLParser/JSqlParser/commit/3e68fa4928d5115) wumpz *2013-09-19 21:08:23*
-
-**problems solved with postgresqls data type "character varying"**
-
-
-[c84e5](https://github.com/JSQLParser/JSqlParser/commit/c84e59eadd380e0) wumpz *2013-09-19 21:05:18*
-
-**problems solved with postgresqls data type "character varying"**
-
-
-[f5af3](https://github.com/JSQLParser/JSqlParser/commit/f5af3053102af19) wumpz *2013-09-19 21:00:19*
-
-**corrected version infos**
-
-
-[9da72](https://github.com/JSQLParser/JSqlParser/commit/9da728241feb44b) wumpz *2013-09-17 21:49:19*
-
-**Update README.md**
-
-
-[da809](https://github.com/JSQLParser/JSqlParser/commit/da809493f5d6dbb) Tobias *2013-09-17 21:36:47*
-
-**first snapshot deployed to sonatype**
-
-
-[62970](https://github.com/JSQLParser/JSqlParser/commit/629705cc0a3d758) wumpz *2013-09-17 21:27:05*
-
-**pom modification to publish to public repository**
-
-
-[e60bc](https://github.com/JSQLParser/JSqlParser/commit/e60bc0e9fac79ee) wumpz *2013-09-17 12:14:43*
-
-**pom modification to publish to public repository**
-
-
-[085d4](https://github.com/JSQLParser/JSqlParser/commit/085d4970d2a56c8) wumpz *2013-09-17 09:11:36*
-
-**CastExpression favours cast keyword instead of ::**
-
-
-[68d12](https://github.com/JSQLParser/JSqlParser/commit/68d12944d835777) wumpz *2013-09-17 07:17:39*
-
-**CastExpression favours cast keyword instead of ::**
-
-
-[8cf8b](https://github.com/JSQLParser/JSqlParser/commit/8cf8b4b7733dbd4) wumpz *2013-09-17 07:16:27*
-
-**removed unused modifiers**
-
-
-[b3ee7](https://github.com/JSQLParser/JSqlParser/commit/b3ee75103cba4ec) wumpz *2013-08-29 20:22:48*
-
-**improved function test**
-
-
-[35608](https://github.com/JSQLParser/JSqlParser/commit/35608babd2caae1) wumpz *2013-08-29 19:32:20*
-
-**workaround for mySql truncate function**
-
-
-[c3b40](https://github.com/JSQLParser/JSqlParser/commit/c3b4046f8833357) wumpz *2013-08-29 19:22:57*
-
-
-## jsqlparser-0.8.4 (2013-08-27)
-
-### Other changes
-
-**JJDoc output included in site configuration**
-
-
-[b2688](https://github.com/JSQLParser/JSqlParser/commit/b2688799ada5918) wumpz *2013-08-25 19:30:45*
-
-**Update README.md**
-
-
-[891dd](https://github.com/JSQLParser/JSqlParser/commit/891dd0a8e7e3086) Tobias *2013-08-22 20:29:48*
-
-**update readme**
-
-
-[d375a](https://github.com/JSQLParser/JSqlParser/commit/d375ac9a51bc51e) wumpz *2013-08-22 20:20:29*
-
-**update readme**
-
-
-[e25d0](https://github.com/JSQLParser/JSqlParser/commit/e25d0be44a8223a) wumpz *2013-08-22 20:13:19*
-
-**some minor additions to named parameters**
-
-
-[8bff2](https://github.com/JSQLParser/JSqlParser/commit/8bff2c911467e84) wumpz *2013-08-22 20:11:19*
-
-**added ability to parse named parameters**
-
-
-[284ec](https://github.com/JSQLParser/JSqlParser/commit/284ec72cd00a574) audrium *2013-08-22 13:47:39*
-
-**added changes to readme**
-
-
-[6ab75](https://github.com/JSQLParser/JSqlParser/commit/6ab75599642eb23) wumpz *2013-08-14 21:34:21*
-
-**added some test cases**
-
-
-[00f76](https://github.com/JSQLParser/JSqlParser/commit/00f76fe1a853843) wumpz *2013-08-14 21:25:47*
-
-**removed PivotForColumn**
-
-
-[18904](https://github.com/JSQLParser/JSqlParser/commit/18904dd44c915d2) wumpz *2013-08-11 23:43:07*
-
-**regexp_like transfered into a general boolean function**
-
-
-[410a2](https://github.com/JSQLParser/JSqlParser/commit/410a2d125db963e) wumpz *2013-08-11 21:26:33*
-
-**Add support old oracle join syntax to more expressions (simple comparisons and IN)**
-
-
-[55f42](https://github.com/JSQLParser/JSqlParser/commit/55f42ea3712cf4d) Jonathan Burnhams *2013-08-02 07:52:05*
-
-**Add support for lag and lead with offset and default value parameters**
-
-
-[99b46](https://github.com/JSQLParser/JSqlParser/commit/99b46bf1e7b18ec) Jonathan Burnhams *2013-08-01 14:00:15*
-
-**Added regexp_like support**
-
-
-[33f4f](https://github.com/JSQLParser/JSqlParser/commit/33f4f66dbdd693d) Jonathan Burnhams *2013-08-01 13:26:05*
-
-**Finished adding pivot support**
-
-
-[43fe8](https://github.com/JSQLParser/JSqlParser/commit/43fe8ca9c71afff) Jonathan Burnhams *2013-08-01 08:56:50*
-
-**Started to add pivot support**
-
-
-[a9716](https://github.com/JSQLParser/JSqlParser/commit/a97160a801585fa) Jonathan Burnhams *2013-07-31 15:15:42*
-
-**Ignore intellij**
-
-
-[51783](https://github.com/JSQLParser/JSqlParser/commit/517839aa4734e24) Jonathan Burnhams *2013-07-31 13:25:20*
-
-**Update README.md**
-
-
-[3a8ea](https://github.com/JSQLParser/JSqlParser/commit/3a8eacabad85274) Tobias *2013-07-18 13:06:09*
-
-**removed release plugin dryrun**
-
-
-[6e45a](https://github.com/JSQLParser/JSqlParser/commit/6e45a4fb22fe72a) wumpz *2013-07-05 20:55:50*
-
-**Update README.md**
-
-
-[b53e7](https://github.com/JSQLParser/JSqlParser/commit/b53e74d3b50c5d5) Tobias *2013-07-05 05:58:12*
-
-**maven release plugin for local git repository**
-
-
-[bd05e](https://github.com/JSQLParser/JSqlParser/commit/bd05eab93f7303b) wumpz *2013-07-04 19:54:39*
-
-**more sonar issues corrected**
-
-
-[7fea9](https://github.com/JSQLParser/JSqlParser/commit/7fea946f0ea664e) wumpz *2013-07-04 19:23:29*
-
-**Update README.md**
-
-
-[79f32](https://github.com/JSQLParser/JSqlParser/commit/79f322aca2246bc) Tobias *2013-07-04 19:04:02*
-
-**create table can now have foreign key definitions**
-
-* fixes #14 
-
-[0c41f](https://github.com/JSQLParser/JSqlParser/commit/0c41f27165a2f41) wumpz *2013-06-24 23:28:29*
-
-**removed some unused imports**
-
-
-[8c37c](https://github.com/JSQLParser/JSqlParser/commit/8c37ca2628188ac) wumpz *2013-06-20 21:59:24*
-
-**more sonar identified stuff cleaned**
-
-
-[51791](https://github.com/JSQLParser/JSqlParser/commit/5179164dc6d54b5) wumpz *2013-06-20 21:12:48*
-
-**cleanup violations found by sonar**
-
-
-[51d0b](https://github.com/JSQLParser/JSqlParser/commit/51d0ba3b1eec349) Ivan Vasyliev *2013-06-14 14:44:01*
-
-**more sonar identified stuff cleaned**
-
-
-[c84ed](https://github.com/JSQLParser/JSqlParser/commit/c84ed36f9555aa0) wumpz *2013-06-13 20:53:57*
-
-**corrected Method names mentioned by Sonar**
-
-
-[16e2d](https://github.com/JSQLParser/JSqlParser/commit/16e2d8dd4a3e7ac) wumpz *2013-06-13 20:46:02*
-
-**cleaned up more critical points (sonar)**
-
-
-[ad96c](https://github.com/JSQLParser/JSqlParser/commit/ad96cbb9c65e39f) wumpz *2013-06-13 20:42:40*
-
-**solved critical "Performance - Method concatenates strings using + in a loop"**
-
-
-[9b86e](https://github.com/JSQLParser/JSqlParser/commit/9b86e368e4b3b67) wumpz *2013-06-09 23:40:10*
-
-**Update README.md**
-
-
-[5c36d](https://github.com/JSQLParser/JSqlParser/commit/5c36da78eb4cc3d) Tobias *2013-06-08 22:14:15*
-
-**Update README.md**
-
-
-[cdbec](https://github.com/JSQLParser/JSqlParser/commit/cdbec9bc2194147) Tobias *2013-06-08 21:55:29*
-
-**fixes #30**
-
-
-[22f83](https://github.com/JSQLParser/JSqlParser/commit/22f839045489e20) wumpz *2013-05-30 20:11:44*
-
-****
-
-
-[4ebb5](https://github.com/JSQLParser/JSqlParser/commit/4ebb568f83de703) wumpz *2013-05-26 22:47:27*
-
-**added readme entry**
-
-
-[afc0e](https://github.com/JSQLParser/JSqlParser/commit/afc0e2957c5c52c) wumpz *2013-05-26 22:21:36*
-
-**multi value IN expression introduced (a,b,c) in ...**
-
-* fixes #30 
-
-[3c443](https://github.com/JSQLParser/JSqlParser/commit/3c44391bf5f168f) wumpz *2013-05-26 22:19:03*
-
-**introduces Interval expression**
-
-
-[fc5e6](https://github.com/JSQLParser/JSqlParser/commit/fc5e6050533e34d) wumpz *2013-05-26 20:44:44*
-
-**new version**
-
-
-[f97c5](https://github.com/JSQLParser/JSqlParser/commit/f97c5a27faecc7b) wumpz *2013-05-23 22:03:06*
-
-**new version**
-
-
-[a470a](https://github.com/JSQLParser/JSqlParser/commit/a470ae965d06ab4) wumpz *2013-05-22 19:57:51*
-
-**release**
-
-
-[1366c](https://github.com/JSQLParser/JSqlParser/commit/1366caba4b4d087) wumpz *2013-05-22 19:57:21*
-
-**readme**
-
-
-[4a620](https://github.com/JSQLParser/JSqlParser/commit/4a620031bcbef1e) wumpz *2013-05-22 19:49:11*
-
-**introduced generic list**
-
-
-[8af04](https://github.com/JSQLParser/JSqlParser/commit/8af04647982fc78) wumpz *2013-05-22 19:38:36*
-
-**refactored some test utility methods out into a new class**
-
-
-[c6bc4](https://github.com/JSQLParser/JSqlParser/commit/c6bc4c3ae5fad83) wumpz *2013-05-22 19:33:05*
-
-**improved test**
-
-
-[5e106](https://github.com/JSQLParser/JSqlParser/commit/5e1069523441f0f) wumpz *2013-05-22 19:16:18*
-
-**- corrected S_DOUBLE parsing**
-
-
-[6e3dc](https://github.com/JSQLParser/JSqlParser/commit/6e3dce2af7f2edd) wumpz *2013-05-16 22:22:01*
-
-**- solved critical grammar bug regarding concat expressions and parenthesis parsing**
-
-* - introduced some tests to cover the above 
-* - corrected ExpressionDeparser to deliver same result as toString for substractions 
-
-[51365](https://github.com/JSQLParser/JSqlParser/commit/51365239ead790b) wumpz *2013-05-16 21:53:04*
-
-**added simple delete sql check**
-
-
-[45fad](https://github.com/JSQLParser/JSqlParser/commit/45fad04b620704c) wumpz *2013-05-03 20:36:31*
-
-**add simple materialized view parsing without additional parameters**
-
-
-[6b339](https://github.com/JSQLParser/JSqlParser/commit/6b339fc1e6478cc) wumpz *2013-04-24 20:48:16*
-
-**add simple materialized view parsing without additional parameters**
-
-
-[fa5da](https://github.com/JSQLParser/JSqlParser/commit/fa5daaa3cd8430b) wumpz *2013-04-24 20:45:22*
-
-**Update README.md**
-
-
-[1d923](https://github.com/JSQLParser/JSqlParser/commit/1d92374962fc745) Tobias *2013-04-24 06:03:14*
-
-****
-
-
-[a6615](https://github.com/JSQLParser/JSqlParser/commit/a661593121f07ac) wumpz *2013-04-23 21:14:24*
-
-**- corrected TableNamesFinder to work properly on update statements**
-
-
-[eab74](https://github.com/JSQLParser/JSqlParser/commit/eab747b7891cbd8) wumpz *2013-04-23 21:07:32*
-
-**- Create View corrected in using set operations**
-
-
-[97c03](https://github.com/JSQLParser/JSqlParser/commit/97c03337c1a2deb) wumpz *2013-04-23 20:42:51*
-
-**- from clause can now be used in update statements**
-
-
-[b24c1](https://github.com/JSQLParser/JSqlParser/commit/b24c1c727cd1f81) wumpz *2013-04-21 21:34:26*
-
-**- from clause can now be used in update statements**
-
-
-[b5c4c](https://github.com/JSQLParser/JSqlParser/commit/b5c4ce66d751579) wumpz *2013-04-21 21:31:30*
-
-**- insertet toString in Update**
-
-* - modified Update deparser to deliver better results 
-
-[e2e4d](https://github.com/JSQLParser/JSqlParser/commit/e2e4d80675d525d) wumpz *2013-04-21 21:18:48*
-
-**added cross join syntax support**
-
-
-[777a0](https://github.com/JSQLParser/JSqlParser/commit/777a08b2afeb495) wumpz *2013-04-18 22:28:32*
-
-**allow more complex expressions in extract clause**
-
-
-[e551a](https://github.com/JSQLParser/JSqlParser/commit/e551a1603b1e2e6) wumpz *2013-04-18 21:49:45*
-
-**allow more complex expressions in extract clause**
-
-
-[ab2ab](https://github.com/JSQLParser/JSqlParser/commit/ab2ab73f08d4fc8) wumpz *2013-04-18 21:46:29*
-
-**allow complete type in cast expression**
-
-
-[8562d](https://github.com/JSQLParser/JSqlParser/commit/8562d7870a1c8c7) wumpz *2013-04-18 20:47:12*
-
-**allow complete type in cast expression**
-
-
-[905a6](https://github.com/JSQLParser/JSqlParser/commit/905a62377b3bedd) wumpz *2013-04-18 20:40:49*
-
-**create view .. as (select ..) implemented**
-
-
-[1b3c5](https://github.com/JSQLParser/JSqlParser/commit/1b3c507c922dd3a) wumpz *2013-04-18 20:23:19*
-
-**corrected comma list to partition by**
-
-
-[d82c7](https://github.com/JSQLParser/JSqlParser/commit/d82c7a189f1b579) wumpz *2013-04-18 20:01:55*
-
-**corrected comma list to partition by**
-
-
-[eafea](https://github.com/JSQLParser/JSqlParser/commit/eafea98e54e9b2e) wumpz *2013-04-18 19:59:20*
-
-**corrected comma list to partition by**
-
-
-[5d40d](https://github.com/JSQLParser/JSqlParser/commit/5d40d7f384935ee) wumpz *2013-04-18 19:55:03*
-
-**added column names list to create view statement**
-
-
-[b3a63](https://github.com/JSQLParser/JSqlParser/commit/b3a6354b5248884) wumpz *2013-04-17 22:15:38*
-
-**added column names list to create view statement**
-
-
-[b7e73](https://github.com/JSQLParser/JSqlParser/commit/b7e738a071c28d8) wumpz *2013-04-17 22:11:15*
-
-**added more testcases**
-
-
-[eae84](https://github.com/JSQLParser/JSqlParser/commit/eae84f640ba9619) wumpz *2013-04-07 21:08:13*
-
-**Update README.md**
-
-
-[f2765](https://github.com/JSQLParser/JSqlParser/commit/f27659d74fad122) Tobias *2013-04-05 19:34:33*
-
-**support listing tables from other operations**
-
-
-[1d09b](https://github.com/JSQLParser/JSqlParser/commit/1d09b0cd2a68fc5) Raymond Auge *2013-04-05 15:39:59*
-
-**support for create index**
-
-
-[dca7d](https://github.com/JSQLParser/JSqlParser/commit/dca7d9be7a6d63f) Raymond Auge *2013-04-05 13:54:56*
-
-**added more tool functions to new tool class CCJSqlParserUtil**
-
-
-[83a1e](https://github.com/JSQLParser/JSqlParser/commit/83a1e9590471581) wumpz *2013-03-23 22:31:09*
-
-**added more tool functions to new tool class CCJSqlParserUtil**
-
-
-[90341](https://github.com/JSQLParser/JSqlParser/commit/90341f89642659e) wumpz *2013-03-23 22:28:35*
-
-**added more tool functions to new tool class CCJSqlParserUtil**
-
-
-[56fe6](https://github.com/JSQLParser/JSqlParser/commit/56fe6558e978d8f) wumpz *2013-03-23 22:27:32*
-
-**added more tool functions**
-
-
-[71daa](https://github.com/JSQLParser/JSqlParser/commit/71daa4ceee100c0) wumpz *2013-03-23 22:20:20*
-
-**switch to unicode parsing**
-
-
-[886b7](https://github.com/JSQLParser/JSqlParser/commit/886b72c16d95a5a) wumpz *2013-03-21 22:58:37*
-
-**ignoring jedit backup files**
-
-
-[da1e3](https://github.com/JSQLParser/JSqlParser/commit/da1e319210c431b) Tobias Warneke *2013-03-20 20:33:35*
-
-**Added automatic license header generation. The link to the original project was moved to the poms description.**
-
-* Format of all sources done. 
-
-[01f7a](https://github.com/JSQLParser/JSqlParser/commit/01f7a4c92670794) wumpz *2013-03-19 21:30:50*
-
-**automatically create license header**
-
-
-[8206d](https://github.com/JSQLParser/JSqlParser/commit/8206dea9caf33f9) wumpz *2013-03-19 21:05:27*
-
-****
-
-
-[26e3a](https://github.com/JSQLParser/JSqlParser/commit/26e3a8334563108) wumpz *2013-03-19 20:50:59*
-
-****
-
-
-[f37b7](https://github.com/JSQLParser/JSqlParser/commit/f37b7285295ec0a) wumpz *2013-03-19 20:38:04*
-
-**wildcard extension for analytic expression**
-
-
-[d36fd](https://github.com/JSQLParser/JSqlParser/commit/d36fd2bd7f17dba) wumpz *2013-03-19 20:18:46*
-
-**readme updated**
-
-
-[27be9](https://github.com/JSQLParser/JSqlParser/commit/27be9c57d64a2d3) wumpz *2013-03-19 00:16:05*
-
-**analytic expressions updated**
-
-
-[9d62c](https://github.com/JSQLParser/JSqlParser/commit/9d62c21b2553b9c) wumpz *2013-03-19 00:12:06*
-
-**- additional test case for values**
-
-* - additional test cases for analytical expressions 
-
-[15fc8](https://github.com/JSQLParser/JSqlParser/commit/15fc834bf78ae91) wumpz *2013-03-18 23:59:07*
-
-**Update README.md**
-
-
-[d7f9f](https://github.com/JSQLParser/JSqlParser/commit/d7f9f39ab2b5e3c) Tobias *2013-03-17 00:32:02*
-
-**additional test case**
-
-
-[e7dc8](https://github.com/JSQLParser/JSqlParser/commit/e7dc8d0cb5bb192) wumpz *2013-03-17 00:26:21*
-
-**multi value expression for select included**
-
-
-[6b51f](https://github.com/JSQLParser/JSqlParser/commit/6b51f26b6025532) wumpz *2013-03-17 00:21:17*
-
-**Update README.md**
-
-
-[15a8d](https://github.com/JSQLParser/JSqlParser/commit/15a8d0dd8053881) Tobias *2013-03-14 21:43:12*
-
-**multi value expression for insert included**
-
-
-[898f3](https://github.com/JSQLParser/JSqlParser/commit/898f36937a9ad05) wumpz *2013-03-14 21:40:42*
-
-**multi value expression for insert included**
-
-
-[8f21c](https://github.com/JSQLParser/JSqlParser/commit/8f21c6608eacd56) wumpz *2013-03-14 21:36:44*
-
-**corrected InsertDeParser to deliver same results like toString**
-
-
-[95527](https://github.com/JSQLParser/JSqlParser/commit/955274b969983f6) wumpz *2013-03-12 22:15:07*
-
-**test for lateral and TableNamesFinder**
-
-
-[a3ec5](https://github.com/JSQLParser/JSqlParser/commit/a3ec55aa297eade) wumpz *2013-03-03 00:46:19*
-
-**corrected readme**
-
-
-[966d8](https://github.com/JSQLParser/JSqlParser/commit/966d8a7747becd1) wumpz *2013-02-27 23:27:02*
-
-**corrected readme**
-
-
-[20275](https://github.com/JSQLParser/JSqlParser/commit/202756d18453b25) wumpz *2013-02-27 23:13:22*
-
-****
-
-
-[3d72a](https://github.com/JSQLParser/JSqlParser/commit/3d72a4f45f7cdad) wumpz *2013-02-27 23:08:50*
-
-**implemented lateral keyword**
-
-
-[5bc39](https://github.com/JSQLParser/JSqlParser/commit/5bc39d3aaa74c24) wumpz *2013-02-27 23:05:01*
-
-**add WithItem to visitor interface**
-
-
-[10e8f](https://github.com/JSQLParser/JSqlParser/commit/10e8f7ffd9a3b07) wumpz *2013-02-20 23:06:07*
-
-**some clean up**
-
-
-[00799](https://github.com/JSQLParser/JSqlParser/commit/00799709a45f68c) wumpz *2013-02-20 22:47:14*
-
-****
-
-
-[35a17](https://github.com/JSQLParser/JSqlParser/commit/35a17b5a0190992) wumpz *2013-02-16 14:01:45*
-
-**0.8.2-SNAPSHOT**
-
-
-[e8ed7](https://github.com/JSQLParser/JSqlParser/commit/e8ed7c70fac2cd3) wumpz *2013-02-15 22:42:47*
-
-**Release 0.8.1 to include in my maven repo**
-
-
-[e41b3](https://github.com/JSQLParser/JSqlParser/commit/e41b333a4635c61) wumpz *2013-02-15 22:41:44*
-
-**- problem with TablesNamesFinder: finds with - alias instead of tablenames**
-
-
-[08236](https://github.com/JSQLParser/JSqlParser/commit/082362b174d3faf) wumpz *2013-02-15 22:41:07*
-
-**- problem with TablesNamesFinder: finds with - alias instead of tablenames**
-
-
-[43699](https://github.com/JSQLParser/JSqlParser/commit/436992983926da2) wumpz *2013-02-15 22:14:13*
-
-**Update README.md**
-
-
-[c438f](https://github.com/JSQLParser/JSqlParser/commit/c438fdd520ede8e) Tobias *2013-02-14 07:45:00*
-
-**Update README.md**
-
-
-[7beeb](https://github.com/JSQLParser/JSqlParser/commit/7beebabfe7eba67) Tobias *2013-02-14 00:11:32*
-
-**deployment to github maven repository**
-
-
-[d9fe3](https://github.com/JSQLParser/JSqlParser/commit/d9fe37ad578a0e2) wumpz *2013-02-14 00:04:46*
-
-**Update README.md**
-
-
-[5f306](https://github.com/JSQLParser/JSqlParser/commit/5f306a889b11754) Tobias *2013-01-04 09:39:02*
-
-**CreateView merged in**
-
-
-[0ba65](https://github.com/JSQLParser/JSqlParser/commit/0ba65276f0a67e0) wumpz *2013-01-04 09:32:08*
-
-**CreateView merged in**
-
-
-[b2eff](https://github.com/JSQLParser/JSqlParser/commit/b2eff8b0e0e7976) wumpz *2013-01-04 09:31:12*
-
-**Add CREATE VIEW support**
-
-
-[101ef](https://github.com/JSQLParser/JSqlParser/commit/101ef1d9e10e7d2) Jeffrey Gerard *2012-12-26 17:52:30*
-
-**some housekeeping: replace string concats**
-
-
-[db49b](https://github.com/JSQLParser/JSqlParser/commit/db49b43c2d7bace) wumpz *2012-11-15 22:38:04*
-
-**some housekeeping: adding missing braces**
-
-
-[5dabd](https://github.com/JSQLParser/JSqlParser/commit/5dabda1deca055a) wumpz *2012-11-15 22:33:05*
-
-**some housekeeping: adding override annotations**
-
-
-[5302b](https://github.com/JSQLParser/JSqlParser/commit/5302b4562af8bd0) wumpz *2012-11-15 22:21:05*
-
-**changed source encoding to utf8 from win-1252**
-
-
-[af7fc](https://github.com/JSQLParser/JSqlParser/commit/af7fc5c63a08f96) wumpz *2012-10-31 23:38:33*
-
-**additional letters token rule included, to expand range of acceptable identifiers**
-
-
-[86423](https://github.com/JSQLParser/JSqlParser/commit/86423b0ea8e9875) wumpz *2012-10-31 22:40:42*
-
-**additional letters token rule included, to expand range of acceptable identifiers**
-
-
-[aa8e1](https://github.com/JSQLParser/JSqlParser/commit/aa8e15a1923c0a1) wumpz *2012-10-31 19:16:02*
-
-**Update README.md**
-
-
-[50a56](https://github.com/JSQLParser/JSqlParser/commit/50a56b02c70dac2) Tobias *2012-10-27 22:42:10*
-
-**initial import**
-
-
-[be85e](https://github.com/JSQLParser/JSqlParser/commit/be85e2dd312821a) wumpz *2012-10-27 22:23:51*
-
-**initial import**
-
-
-[3331f](https://github.com/JSQLParser/JSqlParser/commit/3331fc415a20832) wumpz *2012-10-27 22:21:08*
-
-**initial import**
-
-
-[52ffc](https://github.com/JSQLParser/JSqlParser/commit/52ffcf6d42d673c) wumpz *2012-10-27 22:17:53*
-
-**- introduced more generics in parser definition**
-
-
-[4a89f](https://github.com/JSQLParser/JSqlParser/commit/4a89f9b93e3d4ff) wumpz *2012-10-26 22:23:16*
-
-**- introduced more generics in parser definition**
-
-
-[b0e4a](https://github.com/JSQLParser/JSqlParser/commit/b0e4a4712432492) wumpz *2012-10-26 22:16:59*
-
-**- introduced more generics in parser definition**
-
-
-[07317](https://github.com/JSQLParser/JSqlParser/commit/07317edca9c8f89) wumpz *2012-10-26 22:13:12*
-
-**- introduced more generics in parser definition**
-
-
-[fde24](https://github.com/JSQLParser/JSqlParser/commit/fde24683e0c9930) wumpz *2012-10-12 20:55:17*
-
-**- clean up merge conflicts**
-
-
-[e838d](https://github.com/JSQLParser/JSqlParser/commit/e838d9778060478) wumpz *2012-10-12 20:13:43*
-
-**- clean up merge conflicts**
-
-
-[bf5d1](https://github.com/JSQLParser/JSqlParser/commit/bf5d17f1594c7ca) wumpz *2012-10-12 20:11:30*
-
-**Added SELECT parsing and JUnit test**
-
-
-[e9766](https://github.com/JSQLParser/JSqlParser/commit/e9766966ccd7809) Christian Bockermann *2012-10-01 09:21:38*
-
-**- corrected changelog**
-
-
-[1047b](https://github.com/JSQLParser/JSqlParser/commit/1047bb1877cc1ac) wumpz *2012-09-16 21:14:25*
-
-**- difference problem between deparser and tostring for function without parameters resolved**
-
-
-[aee0f](https://github.com/JSQLParser/JSqlParser/commit/aee0fa79d5eb085) wumpz *2012-09-16 21:13:08*
-
-**- difference problem between deparser and tostring for function without parameters resolved**
-
-
-[90f48](https://github.com/JSQLParser/JSqlParser/commit/90f48ff7b87767a) wumpz *2012-09-16 21:11:10*
-
-**- ExtractExpression integrated**
-
-* - Tests ExtractExpression started 
-* - Function problem found 
-
-[7ea63](https://github.com/JSQLParser/JSqlParser/commit/7ea63d17c1ef299) wumpz *2012-09-16 21:01:53*
-
-**- extract syntax integrated into jj file**
-
-
-[7a50b](https://github.com/JSQLParser/JSqlParser/commit/7a50b960e974183) wumpz *2012-09-15 21:26:39*
-
-**- expansion warnings removed by introducing lookaheads**
-
-
-[db904](https://github.com/JSQLParser/JSqlParser/commit/db90438f3daab6f) wumpz *2012-09-15 21:04:18*
-
-****
-
-
-[3da19](https://github.com/JSQLParser/JSqlParser/commit/3da190b0b31a30d) wumpz *2012-09-11 19:33:24*
-
-****
-
-
-[ab60c](https://github.com/JSQLParser/JSqlParser/commit/ab60cfe02940fb8) wumpz *2012-09-08 20:58:20*
-
-**- moved tables names finder to utils package of source package. it is a too useful tool to live only in the test packages**
-
-
-[57025](https://github.com/JSQLParser/JSqlParser/commit/5702587ce4abae9) wumpz *2012-09-08 19:59:35*
-
-**- moved tables names finder to utils package of source package. it is a too useful tool to live only in the test packages**
-
-
-[4d33d](https://github.com/JSQLParser/JSqlParser/commit/4d33ded5322ca3b) wumpz *2012-09-08 19:57:25*
-
-**- Tool expression connector included**
-
-
-[bb726](https://github.com/JSQLParser/JSqlParser/commit/bb726681905a11b) wumpz *2012-09-08 19:46:28*
-
-**- Tool alias adder implemented**
-
-
-[2ee7a](https://github.com/JSQLParser/JSqlParser/commit/2ee7aa9688f8775) wumpz *2012-09-03 23:32:15*
-
-**imports corrected**
-
-
-[147e8](https://github.com/JSQLParser/JSqlParser/commit/147e8b70ef75e81) wumpz *2012-09-01 22:05:02*
-
-**Fix some obvious compiler warnings**
-
-
-[ea7a1](https://github.com/JSQLParser/JSqlParser/commit/ea7a174bf86f0bf) Ian Bacher *2012-06-13 20:35:48*
-
-****
-
-
-[99b92](https://github.com/JSQLParser/JSqlParser/commit/99b92b3e4e57860) wumpz *2012-06-12 21:49:05*
-
-**quoted columns in create table statement included**
-
-* CreateTableDeParser corrected (NPE with no indexes, toString delivers now same) 
-* CreateTableTest expanded 
-
-[69287](https://github.com/JSQLParser/JSqlParser/commit/69287d7b2e8b278) wumpz *2012-05-26 19:58:14*
-
-**complex with tests included**
-
-* exists formatting included from fork 
-
-[7e39e](https://github.com/JSQLParser/JSqlParser/commit/7e39e9ec4f48448) wumpz *2012-05-23 19:57:10*
-
-**changed version number due to visitor incombatibilities**
-
-
-[87315](https://github.com/JSQLParser/JSqlParser/commit/87315094501ffbc) wumpz *2012-05-23 19:08:39*
-
-****
-
-
-[877ea](https://github.com/JSQLParser/JSqlParser/commit/877ea2c6783bf79) wumpz *2012-05-19 23:04:42*
-
-**- removed deprecated union class (replaced by SetOperationList)**
-
-
-[bce12](https://github.com/JSQLParser/JSqlParser/commit/bce1290bea487cf) wumpz *2012-05-19 22:09:03*
-
-**set operation handling done**
-
-
-[673eb](https://github.com/JSQLParser/JSqlParser/commit/673eb25f97c04d8) wumpz *2012-05-19 21:42:21*
-
-**start implementing union intersection etc. set operation handling**
-
-
-[e980b](https://github.com/JSQLParser/JSqlParser/commit/e980bf3ac12a6b3) wumpz *2012-05-18 21:17:50*
-
-****
-
-
-[37ecf](https://github.com/JSQLParser/JSqlParser/commit/37ecf0a5a7e26ab) wumpz *2012-05-18 20:11:59*
-
-**- Added Oracle (+) join Syntax (instead of taba left join tabn on a=b oracle allows taba,tabn where a=b(+)  )**
-
-
-[31e94](https://github.com/JSQLParser/JSqlParser/commit/31e9435776bebaa) wumpz *2012-05-18 20:10:14*
-
-**- Analytic functions added: corrected PARTITION BY**
-
-
-[4f2cb](https://github.com/JSQLParser/JSqlParser/commit/4f2cbb3eff61683) wumpz *2012-05-17 13:44:50*
-
-**- Analytic functions added: row_number() over (order by a,c)**
-
-
-[b8543](https://github.com/JSQLParser/JSqlParser/commit/b8543ac725fe773) wumpz *2012-05-17 12:46:52*
-
-**Added support for modulo expression (5 % 4)**
-
-
-[ae513](https://github.com/JSQLParser/JSqlParser/commit/ae51331f7c82d04) wumpz *2012-05-17 12:19:50*
-
-**Added support for modulo expression (5 % 4)**
-
-
-[4ef84](https://github.com/JSQLParser/JSqlParser/commit/4ef842925b27438) wumpz *2012-05-16 21:30:14*
-
-**Include bracket quotation of columns and aliases. For example MSAccess supports this.**
-
-
-[e6d5a](https://github.com/JSQLParser/JSqlParser/commit/e6d5accd0db8e1f) wumpz *2012-05-16 20:33:44*
-
-****
-
-
-[d6a22](https://github.com/JSQLParser/JSqlParser/commit/d6a22d1076b95f0) wumpz *2012-05-15 21:50:56*
-
-**- allowed simple expressions in case else**
-
-
-[54d2c](https://github.com/JSQLParser/JSqlParser/commit/54d2c54658d1644) wumpz *2012-05-15 21:36:59*
-
-**- make "select function" pass assertSqlCanBeParsedAndDeparsed**
-
-
-[21296](https://github.com/JSQLParser/JSqlParser/commit/21296032a0ef7db) wumpz *2012-05-15 21:00:51*
-
-**- make "select function" pass assertSqlCanBeParsedAndDeparsed**
-
-
-[f769e](https://github.com/JSQLParser/JSqlParser/commit/f769ef2e562f485) wumpz *2012-05-15 20:57:07*
-
-**- make "select function" pass assertSqlCanBeParsedAndDeparsed**
-
-
-[e5853](https://github.com/JSQLParser/JSqlParser/commit/e5853695b96ac0f) wumpz *2012-05-15 20:55:23*
-
-**- make "select function" pass assertSqlCanBeParsedAndDeparsed**
-
-
-[7a8bb](https://github.com/JSQLParser/JSqlParser/commit/7a8bbbe8abf9681) toben *2012-05-13 22:21:38*
-
-**- CAST - statement included**
-
-
-[e22f5](https://github.com/JSQLParser/JSqlParser/commit/e22f5a3b6fe70aa) toben *2012-05-13 22:09:34*
-
-**removed main and junit 3 only artifacts from source code**
-
-
-[3f854](https://github.com/JSQLParser/JSqlParser/commit/3f854eb7cbe63d9) toben *2012-05-13 12:39:52*
-
-**junit upgrade to 4.10**
-
-
-[44b0d](https://github.com/JSQLParser/JSqlParser/commit/44b0d01d19571d0) toben *2012-05-13 12:35:33*
-
-**Refactoring of SelectTest**
-
-
-[e1c80](https://github.com/JSQLParser/JSqlParser/commit/e1c80a0434df739) Florent Bécart *2011-12-02 07:20:18*
-
-**Removal of tests that are not able to pass**
-
-* - Functions do not accept conditions as arguments 
-
-[aa5f0](https://github.com/JSQLParser/JSqlParser/commit/aa5f044c5bebc78) Florent Bécart *2011-12-02 07:20:18*
-
-**Code reformat**
-
-
-[272bf](https://github.com/JSQLParser/JSqlParser/commit/272bf237eddcdc2) Florent Bécart *2011-12-02 07:20:18*
-
-**Modify DeParsers to output the same result as statement.toString();**
-
-
-[2a35e](https://github.com/JSQLParser/JSqlParser/commit/2a35efd003ca5b5) Alice Rapunzel *2011-11-21 08:53:24*
-
-**Changed DeParsers to generic list types.**
-
-
-[666ca](https://github.com/JSQLParser/JSqlParser/commit/666cac2edecc8d7) Christian Bockermann *2011-09-17 07:58:43*
-
-**Changed all lists to their appropriate generics type.**
-
-
-[0dd60](https://github.com/JSQLParser/JSqlParser/commit/0dd60b143eae3f1) Christian Bockermann *2011-09-17 07:53:14*
-
-**.gitignore update**
-
-
-[dd2a7](https://github.com/JSQLParser/JSqlParser/commit/dd2a75bd7fde3fb) Florent Bécart *2011-09-16 22:41:36*
-
-**Add the sources generated by javacc-maven-plugin to eclipse classpath**
-
-
-[66556](https://github.com/JSQLParser/JSqlParser/commit/6655673c1531cac) Florent Bécart *2011-09-16 22:41:36*
-
-**Set the version of javacc-maven-plugin in pom.xml as recommended by maven**
-
-
-[3f9c4](https://github.com/JSQLParser/JSqlParser/commit/3f9c4cc36c1a628) Florent Bécart *2011-09-16 22:41:36*
-
-**Project cleanup**
-
-
-[0cb63](https://github.com/JSQLParser/JSqlParser/commit/0cb637199c9cd95) Florent Bécart *2011-09-16 22:41:36*
-
-**README update**
-
-
-[00b8c](https://github.com/JSQLParser/JSqlParser/commit/00b8ca8dbb2ca6b) Florent Bécart *2011-09-16 22:41:36*
-
-**Added README**
-
-
-[2005d](https://github.com/JSQLParser/JSqlParser/commit/2005d6db8594102) Christian Bockermann *2011-09-16 20:22:29*
-
-**Removed javcc-5.0 directory (no covered by Maven plugin)**
-
-
-[61fb4](https://github.com/JSQLParser/JSqlParser/commit/61fb4a16876f9e4) Christian Bockermann *2011-09-16 20:13:28*
-
-**Added support for select without from-list ( SELECT 1 + 2 )**
-
-* Modified test cases for test resources in src/test/resources 
-
-[0e5d7](https://github.com/JSQLParser/JSqlParser/commit/0e5d732e65bf622) Christian Bockermann *2011-09-16 20:06:07*
-
-**Moved classes to match Maven directory layout.**
-
-
-[a8d70](https://github.com/JSQLParser/JSqlParser/commit/a8d70350729d085) Christian Bockermann *2011-09-16 19:48:54*
-
-**Use of StringBuilders instead of StringBuffers**
-
-
-[ef03d](https://github.com/JSQLParser/JSqlParser/commit/ef03d68f8a365fc) Florent Bécart *2011-06-23 00:50:08*
-
-**Files generated by JavaCC should be ignored by Git**
-
-
-[b5aff](https://github.com/JSQLParser/JSqlParser/commit/b5affcc84aaf6d7) Florent Bécart *2011-06-23 00:49:59*
-
-**Removal of files generated by JavaCC**
-
-
-[767e3](https://github.com/JSQLParser/JSqlParser/commit/767e3c4e257512e) Florent Bécart *2011-06-23 00:05:33*
-
-**Bug Fix: the column deparser should use the table alias if any**
-
-
-[bc8dc](https://github.com/JSQLParser/JSqlParser/commit/bc8dcbbe1fdae50) Florent Bécart *2011-06-23 00:01:57*
-
-**Use of generics**
-
-* - List of expressions in ItemsList 
-* - List of columns in Statement 
-* - List of joins in PlainSelect 
-* - List of withItems in Select 
-* - List of plainSelects in Union 
-* - List of orderByElements in Union 
-* - List of columns in Update 
-* - List of expressions in Update 
-
-[8b0b8](https://github.com/JSQLParser/JSqlParser/commit/8b0b865780ee962) Florent Bécart *2011-06-22 20:00:44*
-
-**Insert statements accept both keywords "value" and "values"**
-
-
-[1db31](https://github.com/JSQLParser/JSqlParser/commit/1db31a4491b01f1) Florent Bécart *2011-06-20 23:14:11*
-
-**Organize imports**
-
-
-[db5e2](https://github.com/JSQLParser/JSqlParser/commit/db5e2501d8eefd5) Florent Bécart *2011-06-20 22:49:36*
-
-**Code reformat**
-
-
-[fed74](https://github.com/JSQLParser/JSqlParser/commit/fed74aec2acf3db) Florent Bécart *2011-06-20 22:48:00*
-
-**Fixes a compilation error by removing an unused import**
-
-
-[b9ce3](https://github.com/JSQLParser/JSqlParser/commit/b9ce35c945ffdab) Florent Bécart *2011-06-20 22:35:16*
-
-**Eclipse configuration files**
-
-* Makes development environment installation easier 
-
-[b93af](https://github.com/JSQLParser/JSqlParser/commit/b93af3e4f333cdc) Florent Bécart *2011-06-20 22:33:30*
-
-**Add .gitignore file**
-
-* Auto-generated files that won&#x27;t be pushed to the repo are: 
-* - classes: compiled main code 
-* - docs: project javadoc 
-* - *.jar: distribution jar (sources and documentation) 
-* - lib: library jar (.class files) 
-* - testclasses: compiled unit tests 
-
-[55197](https://github.com/JSQLParser/JSqlParser/commit/5519799ce41c45b) Florent Bécart *2011-06-20 22:08:46*
-
-**Remove auto-generated folders docs and lib**
-
-
-[d2f54](https://github.com/JSQLParser/JSqlParser/commit/d2f5416986e5c9b) Florent Bécart *2011-06-20 22:06:36*
-
-**Add junit library (required for ant build)**
-
-
-[e0ad5](https://github.com/JSQLParser/JSqlParser/commit/e0ad59290667fc2) Florent Bécart *2011-06-20 21:50:19*
-
-**Add javacc-5.0 folder (required for ant build)**
-
-
-[36ddc](https://github.com/JSQLParser/JSqlParser/commit/36ddcb236313093) Florent Bécart *2011-06-20 21:48:21*
-
-**Initial commit (base version: 0.7.0)**
-
-* Source: http://sourceforge.net/projects/jsqlparser/files/jsqlparser/jsqlparser-0.7.0.jar/download 
-
-[67c91](https://github.com/JSQLParser/JSqlParser/commit/67c9150f5d93ced) Florent Bécart *2011-06-20 21:44:37*
-
-
diff --git a/README.md b/README.md
index a64404aa0..999f043e2 100644
--- a/README.md
+++ b/README.md
@@ -1,21 +1,22 @@
-# [JSqlParser 5.0 Website](https://jsqlparser.github.io/JSqlParser) <img src="src/site/sphinx/_images/logo-no-background.svg" alt="drawing" width="200" align="right"/>
+# [JSqlParser 5.3 Website](https://jsqlparser.github.io/JSqlParser) <img src="src/site/sphinx/_images/logo-no-background.svg" alt="drawing" width="200" align="right"/>
 
-[![Maven deploy snapshot](https://github.com/JSQLParser/JSqlParser/actions/workflows/maven_deploy.yml/badge.svg)](https://github.com/JSQLParser/JSqlParser/actions/workflows/maven_deploy.yml)
-[![Gradle CI](https://github.com/JSQLParser/JSqlParser/actions/workflows/gradle.yml/badge.svg)](https://github.com/JSQLParser/JSqlParser/actions/workflows/gradle.yml)
+[![CI](https://github.com/JSQLParser/JSqlParser/actions/workflows/ci.yml/badge.svg)](https://github.com/JSQLParser/JSqlParser/actions/workflows/ci.yml)
 [![Coverage Status](https://coveralls.io/repos/JSQLParser/JSqlParser/badge.svg?branch=master)](https://coveralls.io/r/JSQLParser/JSqlParser?branch=master)
 [![Codacy Badge](https://app.codacy.com/project/badge/Grade/6f9a2d7eb98f45969749e101322634a1)](https://www.codacy.com/gh/JSQLParser/JSqlParser/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=JSQLParser/JSqlParser&amp;utm_campaign=Badge_Grade)
 [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.jsqlparser/jsqlparser/badge.svg)](http://maven-badges.herokuapp.com/maven-central/com.github.jsqlparser/jsqlparser) [![Javadocs](https://www.javadoc.io/badge/com.github.jsqlparser/jsqlparser.svg)](https://www.javadoc.io/doc/com.github.jsqlparser/jsqlparser)
 [![Gitter](https://badges.gitter.im/JSQLParser/JSqlParser.svg)](https://gitter.im/JSQLParser/JSqlParser?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
 
+A huge thank you to our sponsor, [Starlake.ai](https://starlake.ai/) who simplifies data ingestion, transformation, and orchestration, enabling faster delivery of high-quality data. Starlake has been instrumental in providing Piped SQL and numerous test cases for BigQuery, Redshift, DataBricks, and DuckDB. Show your support for ongoing development by visiting Starlake.ai and giving us a star!
+
 ## Summary
 
-Please visit the [WebSite](https://jsqlparser.github.io/JSqlParser). **JSqlParser** is a RDBMS agnostic SQL statement parser. It translates SQL statements into a traversable hierarchy of Java classes (see [Samples](https://jsqlparser.github.io/JSqlParser/usage.html#parse-a-sql-statements)):
+Please visit our [WebSite](https://jsqlparser.github.io/JSqlParser) for detailed information. **JSqlParser** is a RDBMS agnostic SQL statement parser. It translates SQL statements into a traversable hierarchy of Java classes (see [Samples](https://jsqlparser.github.io/JSqlParser/usage.html#parse-a-sql-statements)):
 
 ```sql
 SELECT 1 FROM dual WHERE a = b
-```
 
-```text
+/* produces the following AST
+
 SQL Text
  └─Statements: statement.select.PlainSelect
     ├─selectItems: statement.select.SelectItem
@@ -24,6 +25,7 @@ SQL Text
     └─where: expression.operators.relational.EqualsTo
        ├─Column: a
        └─Column: b
+*/
 ```
 
 ```java
@@ -45,7 +47,6 @@ Column a = (Column) equalsTo.getLeftExpression();
 Column b = (Column) equalsTo.getRightExpression();
 Assertions.assertEquals("a", a.getColumnName());
 Assertions.assertEquals("b", b.getColumnName());
-}
 ```
 ## Support for `Piped SQL`
 
@@ -64,16 +65,33 @@ For details, please see https://storage.googleapis.com/gweb-research2023-media/p
 
 ## Java Version
 
-JSQLParser-4.9 was the last JDK8 compatible version. The recent JSQLParser-5.0 depends on JDK11 and introduces API breaking changes to the AST Visitors. Please see the Migration Guide for the details.
+JSQLParser-4.9 was the last JDK8 compatible version. JSQLParser-5.0 and later depend on JDK11 and introduce API breaking changes to the AST Visitors. Please see the Migration Guide for the details.
+
+Building JSQLParser-5.1 and newer with Gradle will depend on a JDK17 toolchain due to the used plugins.
+
+JSQLParser-5.4 Snapshot and later use JavaCC-8 Snapshots for generating the parser.
+
+## Performance
+
+Unfortunately the released JSQLParser-5.2 shows a performance deterioration caused by commit [30cf5d7](https://github.com/JSQLParser/JSqlParser/commit/30cf5d7b930ae0a076f49deb5cc841d39e62b3dc) related to `FunctionAllColumns()`.
+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.
+
+```text
+Benchmark                               (version)  Mode  Cnt   Score   Error  Units
+JSQLParserBenchmark.parseSQLStatements     latest  avgt   15  82.695 ± 2.841  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.3  avgt   15  84.687 ± 3.321  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.1  avgt   15  86.592 ± 5.781  ms/op
+```
 
 ## [Supported Grammar and Syntax](https://jsqlparser.github.io/JSqlParser/syntax.html)
 
 **JSqlParser** aims to support the SQL standard as well as all major RDBMS. Any missing syntax or features can be added on demand.
 
-| RDBMS                                                                                                           | Statements                                                                                                                                      |
-|-----------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|
-| Oracle<br>MS SQL Server and Sybase<br>Postgres<br>MySQL and MariaDB<br>DB2<br>H2 and HSQLDB and Derby<br>SQLite | `SELECT`<br>`INSERT`, `UPDATE`, `UPSERT`, `MERGE`<br>`DELETE`, `TRUNCATE TABLE`<br>`CREATE ...`, `ALTER ....`, `DROP ...`<br>`WITH ...`         |
-| Salesforce SOQL                                                                                                 | `INCLUDES`, `EXCLUDES` |
+| RDBMS                                                                                                           | Statements                                                                                                                              |
+|-----------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------|
+| Oracle<br>MS SQL Server and Sybase<br>Postgres<br>MySQL and MariaDB<br>DB2<br>H2 and HSQLDB and Derby<br>SQLite | `SELECT`<br>`INSERT`, `UPDATE`, `UPSERT`, `MERGE`<br>`DELETE`, `TRUNCATE TABLE`<br>`CREATE ...`, `ALTER ....`, `DROP ...`<br>`WITH ...` |
+| Salesforce SOQL                                                                                                 | `INCLUDES`, `EXCLUDES`                                                                                                                  |
+| Piped SQL (also known as FROM SQL)                                                                              |                                                                                                                                         |
 
 **JSqlParser** can also be used to create SQL Statements from Java Code with a fluent API (see [Samples](https://jsqlparser.github.io/JSqlParser/usage.html#build-a-sql-statements)).
 
@@ -83,7 +101,7 @@ If you like JSqlParser then please check out its related projects:
 
 * [JSQLFormatter](https://manticore-projects.com/JSQLFormatter/index.html) for pretty printing and formatting SQL Text
 
-* [JSQLTranspiler](https://manticore-projects.com/JSQLTranspiler/index.html) for dialect specific rewriting, SQL Column resolution and Lineage
+* [JSQLTranspiler](https://manticore-projects.com/JSQLTranspiler/index.html) for dialect specific rewriting, SQL Column resolution and Lineage, provided by [Starlake.ai](https://starlake.ai/)
 
 ## Alternatives to JSqlParser?
 [**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.
diff --git a/build.gradle b/build.gradle
index 49c22c867..843119600 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,4 +1,11 @@
 import se.bjurr.gitchangelog.plugin.gradle.GitChangelogTask
+import com.nwalsh.gradle.saxon.SaxonXsltTask
+
+buildscript {
+    dependencies {
+        classpath group: 'net.sf.saxon', name: 'Saxon-HE', version: 'latest.release'
+    }
+}
 
 plugins {
     id 'java'
@@ -12,14 +19,16 @@ plugins {
     id "com.diffplug.spotless" version "latest.release"
     id 'pmd'
     id 'checkstyle'
+    id 'eclipse'
 
     // download the RR tools which have no Maven Repository
     id "de.undercouch.download" version "latest.release"
     id 'org.hidetake.ssh' version "latest.release"
 
-    id "se.bjurr.gitchangelog.git-changelog-gradle-plugin" version "2.0.0" //later depends on JDK 17
+    id "se.bjurr.gitchangelog.git-changelog-gradle-plugin" version "latest.release"
     id "me.champeau.jmh" version "latest.release"
-    id "com.nwalsh.gradle.saxon.saxon-gradle" version "0.9.6"
+    id "com.nwalsh.gradle.saxon.saxon-gradle" version "latest.release"
+    id 'biz.aQute.bnd.builder' version "latest.release"
 }
 
 def getVersion = { boolean considerSnapshot ->
@@ -27,58 +36,52 @@ def getVersion = { boolean considerSnapshot ->
     Integer minor = 0
     Integer patch = null
     Integer build = null
-    def commit = null
-    def snapshot = ""
-    new ByteArrayOutputStream().withStream { os ->
-        exec {
-            args = [
-                    "--no-pager"
-                    , "describe"
-                    , "--tags"
-                    , "--always"
-                    , "--dirty=-SNAPSHOT"
-            ]
-            executable "git"
-            standardOutput = os
-        }
-        def versionStr = os.toString().trim()
-        def pattern = /(?<major>\d*)\.(?<minor>\d*)(\.(?<patch>\d*))?(-(?<build>\d*)-(?<commit>[a-zA-Z\d]*))?/
-        def matcher = versionStr =~ pattern
-        if (matcher.find()) {
-            major = matcher.group('major') as Integer
-            minor = matcher.group('minor') as Integer
-            patch = matcher.group('patch') as Integer
-            build = matcher.group('build') as Integer
-            commit = matcher.group('commit')
-        }
+    String commit = null
+    String snapshot = ""
+
+    def versionStr = providers.exec {
+        commandLine "git", "--no-pager", "-C", project.projectDir,  "describe", "--tags", "--always", "--dirty=-SNAPSHOT"
+    }.standardOutput.asText.get().trim()
+
+    def pattern = /jsqlparser-(?<major>\d*)\.(?<minor>\d*)(\.(?<patch>\d*))?(-(?<build>\d*)-(?<commit>[a-zA-Z\d]*))?/
+    def matcher = versionStr =~ pattern
+
+    if (matcher.find()) {
+        major = matcher.group('major') as Integer ?: 0
+        minor = matcher.group('minor') as Integer ?: 0
+        patch = matcher.group('patch') as Integer ?: null
+        build = matcher.group('build') as Integer ?: null
+        commit = matcher.group('commit') ?: null
+    }
 
-        if (considerSnapshot && ( versionStr.endsWith('SNAPSHOT') || build!=null) ) {
-            minor++
-            if (patch!=null) patch = 0
-            snapshot = "-SNAPSHOT"
-        }
+    if (considerSnapshot && (versionStr.endsWith('SNAPSHOT') || build != null)) {
+        minor++
+        if (patch != null) patch = 0
+        snapshot = "-SNAPSHOT"
     }
-    return patch!=null
+
+    return patch != null
             ? "${major}.${minor}.${patch}${snapshot}"
-            :  "${major}.${minor}${snapshot}"
+            : "${major}.${minor}${snapshot}"
 }
 
+
 // for publishing a release, call Gradle with Environment Variable RELEASE:
 // RELEASE=true gradle JSQLParser:publish
 version = getVersion( !System.getenv("RELEASE") )
 group = 'com.github.jsqlparser'
 description = 'JSQLParser library'
-archivesBaseName = "JSQLParser"
 
 repositories {
     gradlePluginPortal()
-    mavenLocal()
     mavenCentral()
 
-    // Sonatype OSSRH
+    // JavaCC 8 Snapshots
     maven {
-        url = uri('https://s01.oss.sonatype.org/content/repositories/snapshots/')
+        url = uri('https://central.sonatype.com/repository/maven-snapshots/')
     }
+
+    maven { url "https://dev.saxonica.com/maven" }
 }
 
 configurations {
@@ -95,23 +98,36 @@ dependencies {
     testImplementation 'com.h2database:h2:+'
 
     // for JaCoCo Reports
-    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.+'
-    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.+'
-    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.+'
+    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.4'
+    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.4'
+    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.4'
 
     // https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter
-    testImplementation 'org.mockito:mockito-junit-jupiter:+'
+    testImplementation 'org.mockito:mockito-junit-jupiter:5.18.0'
 
     // Performance Benchmark
     testImplementation 'org.openjdk.jmh:jmh-core:+'
     testImplementation 'org.openjdk.jmh:jmh-generator-annprocess:+'
 
     // Java Doc in XML Format
-    xmlDoclet 'com.manticore-projects.tools:xml-doclet:1.+'
+    xmlDoclet ('com.manticore-projects.tools:xml-doclet:+'){ changing = true }
 
     // enforce latest version of JavaCC
-    testImplementation 'net.java.dev.javacc:javacc:+'
-    javacc 'net.java.dev.javacc:javacc:+'
+    testImplementation('org.javacc:core:8.1.0-SNAPSHOT') { changing = true }
+    testImplementation('org.javacc.generator:java:8.1.0-SNAPSHOT') { changing = true }
+
+    jmh 'org.openjdk.jmh:jmh-core:1.37'
+    jmh 'org.openjdk.jmh:jmh-generator-annprocess:1.37'
+    javacc('org.javacc:core:8.1.0-SNAPSHOT') { changing = true }
+    javacc('org.javacc.generator:java:8.1.0-SNAPSHOT') { changing = true }
+}
+configurations.configureEach {
+    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
+        if (details.requested.group in ['org.javacc:core', 'org.javacc.generator']) {
+            // Check for updates every build
+            resolutionStrategy.cacheChangingModulesFor 30, 'seconds'
+        }
+    }
 }
 
 compileJavacc {
@@ -124,9 +140,10 @@ java {
 
     sourceCompatibility = '11'
     targetCompatibility = '11'
+
     // needed for XML-Doclet to work (since Doclet changed again with Java 13)
     toolchain {
-        languageVersion.set(JavaLanguageVersion.of(11))
+        languageVersion.set(JavaLanguageVersion.of(17))
     }
 }
 
@@ -144,9 +161,22 @@ jar {
             "Automatic-Module-Name": "net.sf.jsqlparser"
         )
     }
+
+    bundle {
+        properties.empty()
+        bnd(
+            "Created-By": System.properties.get('user.name'),
+            "Bundle-SymbolicName": "net.sf.jsqlparser",
+            "Import-Package": "*",
+            "Export-Package": "net.sf.jsqlparser.*",
+            "Automatic-Module-Name": "net.sf.jsqlparser"
+        )
+    }
 }
 
 tasks.register('xmldoc', Javadoc) {
+    dependsOn(compileJavacc)
+
     def outFile =  reporting.file(
             version.endsWith("-SNAPSHOT")
                     ? "xmlDoclet/javadoc_snapshot.xml"
@@ -160,21 +190,32 @@ tasks.register('xmldoc', Javadoc) {
     )
 
     source = sourceSets.main.allJava
-    // beware: Gradle deletes this folder automatically and there is no switch-off
+    // add any generated Java sources
+    source += fileTree(layout.buildDirectory.dir("generated/javacc").get().asFile) {
+        include '**/*.java'
+    }
+    source += fileTree(layout.buildDirectory.dir("generated/jjtree").get().asFile) {
+        include '**/*.java'
+    }
+
+    classpath = sourceSets.main.runtimeClasspath
+
     destinationDir = reporting.file("xmlDoclet")
     options.docletpath = configurations.xmlDoclet.files as List
-    options.doclet = "com.github.markusbernhardt.xmldoclet.XmlDoclet"
+    options.doclet = "com.manticore.tools.xmldoclet.XmlDoclet"
     title = "API $version"
+
     options.addBooleanOption("rst", true)
-    options.addBooleanOption("withFloatingToc", Boolean.parseBoolean(System.getenv().getOrDefault("FLOATING_TOC", "true")))
+    if (Boolean.parseBoolean(System.getProperty("FLOATING_TOC", "true"))) {
+        options.addBooleanOption("withFloatingToc", true)
+    }
     options.addStringOption("basePackage", "net.sf.jsqlparser")
     options.addStringOption("filename", outFile.getName())
 
-    dependsOn(compileJava)
     doLast {
         copy {
             from rstFile
-            into "${projectDir}/src/site/sphinx/"
+            into layout.projectDirectory.dir("src/site/sphinx/").asFile
         }
     }
 }
@@ -184,11 +225,11 @@ test {
     useJUnitPlatform()
 
     // set heap size for the test JVM(s)
-    minHeapSize = "128m"
+    minHeapSize = "1G"
     maxHeapSize = "4G"
 
     // set JVM stack size
-    jvmArgs = ['-Xss2m']
+    jvmArgs = ['-Xss2m', '--add-opens=java.base/java.lang=ALL-UNNAMED']
 
     jacoco {
         excludes = ['net/sf/jsqlparser/parser/CCJSqlParserTokenManager']
@@ -262,14 +303,13 @@ jacocoTestCoverageVerification {
 
 spotbugsMain {
     reports {
-        html {
-            enabled = true
-            destination = file("build/reports/spotbugs/main/spotbugs.html")
-            stylesheet = 'fancy-hist.xsl'
-        }
+        html.required.set(true)
+        html.outputLocation.set( layout.buildDirectory.file("reports/spotbugs/main/spotbugs.html").get().asFile )
+        html.stylesheet="fancy-hist.xsl"
     }
 }
 
+
 spotbugs {
     // fail only on P1 and without the net.sf.jsqlparser.parser.*
     excludeFilter = file("config/spotbugs/spotBugsExcludeFilter.xml")
@@ -291,6 +331,7 @@ pmd {
     pmdMain {
         excludes = [
                 "build/generated/*"
+                , "**/net/sf/jsqlparser/parser/SimpleCharStream.java"
         ]
     }
 }
@@ -300,6 +341,17 @@ checkstyle {
     configFile = rootProject.file('config/checkstyle/checkstyle.xml')
 }
 
+tasks.withType(Checkstyle).configureEach {
+    reports {
+        xml.required = false
+        html.required = true
+    }
+    excludes = [
+            "**/module-info.java"
+            , "net/sf/jsqlparser/parser/SimpleCharStream.java"
+    ]
+}
+
 spotless {
     // optional: limit format enforcement to just the files changed by this feature branch
     ratchetFrom 'origin/master'
@@ -310,82 +362,75 @@ spotless {
 
         // define the steps to apply to those files
         trimTrailingWhitespace()
-        indentWithSpaces(4) // or spaces. Takes an integer argument if you don't like 4
+        leadingTabsToSpaces(4)
         endWithNewline()
     }
     java {
-        indentWithSpaces(4)
+        leadingTabsToSpaces(4)
         eclipse().configFile('config/formatter/eclipse-java-google-style.xml')
     }
 }
 
-tasks.withType(Checkstyle).configureEach {
-    reports {
-        xml.required = false
-        html.required = true
-    }
-    excludes = [ "**/module-info.java" ]
-}
 
 tasks.register('renderRR') {
     dependsOn(compileJavacc)
+
     doLast {
-        // these WAR files have been provided as a courtesy by Gunther Rademacher
-        // and belong to the RR - Railroad Diagram Generator Project
-        // https://github.com/GuntherRademacher/rr
-        //
-        // Hosting at manticore-projects.com is temporary until a better solution is found
-        // Please do not use these files without Gunther's permission
+        def rrDir = layout.buildDirectory.dir("rr").get().asFile
+
+        // Download convert.war
         download.run {
             src 'http://manticore-projects.com/download/convert.war'
-            dest "$buildDir/rr/convert.war"
+            dest new File(rrDir, "convert.war")
             overwrite false
             onlyIfModified true
         }
 
+        // Download rr.war
         download.run {
             src 'http://manticore-projects.com/download/rr.war'
-            dest "$buildDir/rr/rr.war"
+            dest new File(rrDir, "rr.war")
             overwrite false
             onlyIfModified true
             tempAndMove true
         }
 
-        javaexec {
-            standardOutput = new FileOutputStream("${buildDir}/rr/JSqlParserCC.ebnf")
-            main = "-jar"
+        // Convert JJ file to EBNF
+        tasks.register("convertJJ", JavaExec) {
+            standardOutput = new FileOutputStream(new File(rrDir, "JSqlParserCC.ebnf"))
+            mainClass = "-jar"
             args = [
-                    "$buildDir/rr/convert.war",
-                    "$buildDir/generated/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jj"
+                    new File(rrDir, "convert.war").absolutePath,
+                    layout.buildDirectory.dir("generated/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jj").get().asFile.absolutePath
             ]
-        }
+        }.get().exec()
 
-        javaexec {
-            main = "-jar"
+        // Generate RR diagrams
+        tasks.register("generateRR", JavaExec) {
+            mainClass = "-jar"
             args = [
-                    "$buildDir/rr/rr.war",
+                    new File(rrDir, "rr.war").absolutePath,
                     "-noepsilon",
                     "-color:#4D88FF",
                     "-offset:0",
                     "-width:800",
-                    //"-png",
-                    //"-out:${buildDir}/rr/JSqlParserCC.zip",
-                    "-out:${buildDir}/rr/JSqlParserCC.xhtml",
-                    "${buildDir}/rr/JSqlParserCC.ebnf"
+                    "-out:${new File(rrDir, "JSqlParserCC.xhtml")}",
+                    new File(rrDir, "JSqlParserCC.ebnf").absolutePath
             ]
-        }
+        }.get().exec()
     }
 }
 
+
 tasks.register('gitChangelogTask', GitChangelogTask) {
-    fromRepo = file("$projectDir")
-    file = new File("${projectDir}/src/site/sphinx/changelog.rst")
-    fromRef = "4.0"
+    fromRepo.set( file("$projectDir").toString() )
+    file.set( new File("${projectDir}/src/site/sphinx/changelog.rst") )
+    fromRevision.set( "4.0")
     //toRef = "1.1";
 
     // switch off the formatter since the indentation matters for Mark-down
     // @formatter:off
-    templateContent ="""
+    templateContent.set ("""
 ************************
 Changelog
 ************************
@@ -412,7 +457,7 @@ Version {{name}}
 
  {{/issues}}
 {{/tags}}
-"""
+""")
     // @formatter:on
 }
 
@@ -429,21 +474,21 @@ tasks.register('updateKeywords', JavaExec) {
     dependsOn(compileJava)
 }
 
-xslt  {
+tasks.register('xslt', SaxonXsltTask) {
     def outFile = version.endsWith("-SNAPSHOT")
-            ?   file("src/site/sphinx/syntax_snapshot.rst")
-            :   file("src/site/sphinx/syntax_stable.rst")
+            ? file("src/site/sphinx/syntax_snapshot.rst")
+            : file("src/site/sphinx/syntax_stable.rst")
 
     dependsOn(renderRR)
-    stylesheet 'src/main/resources/rr/xhtml2rst.xsl'
+    stylesheet file('src/main/resources/rr/xhtml2rst.xsl')
 
-    parameters (
-            "withFloatingToc": System.getenv().getOrDefault("FLOATING_TOC", "true"),
+    parameters(
+            "withFloatingToc": System.getProperty("FLOATING_TOC", "true"),
             "isSnapshot": Boolean.toString(version.endsWith("-SNAPSHOT"))
     )
 
     // Transform every .xml file in the "input" directory.
-    input "$buildDir/rr/JSqlParserCC.xhtml"
+    input layout.buildDirectory.file("rr/JSqlParserCC.xhtml").get()
     output outFile
 }
 
@@ -474,7 +519,7 @@ tasks.register('sphinx', Exec) {
             , "-Drelease=${getVersion(false)}"
             , "-Drst_prolog=$PROLOG"
             , "${projectDir}/src/site/sphinx"
-            , "${project.buildDir}/sphinx"
+            , layout.buildDirectory.file("sphinx").get().asFile
     ]
 
     executable "sphinx-build"
@@ -498,6 +543,7 @@ publishing {
             artifactId = 'jsqlparser'
 
             from components.java
+
             versionMapping {
                 usage('java-api') {
                     fromResolutionOf('runtimeClasspath')
@@ -506,54 +552,61 @@ publishing {
                     fromResolutionResult()
                 }
             }
+
             pom {
-                name = 'JSQLParser library'
-                description = 'Parse SQL Statements into Abstract Syntax Trees (AST)'
-                url = 'https://github.com/JSQLParser/JSqlParser'
+                name.set('JSQLParser library')
+                description.set('Parse SQL Statements into Abstract Syntax Trees (AST)')
+                url.set('https://github.com/JSQLParser/JSqlParser')
+
                 licenses {
                     license {
-                        name = 'GNU Library or Lesser General Public License (LGPL) V2.1'
-                        url = 'http://www.gnu.org/licenses/lgpl-2.1.html'
+                        name.set('GNU Library or Lesser General Public License (LGPL) V2.1')
+                        url.set('http://www.gnu.org/licenses/lgpl-2.1.html')
                     }
                     license {
-                        name = 'The Apache Software License, Version 2.0'
-                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                        name.set('The Apache Software License, Version 2.0')
+                        url.set('http://www.apache.org/licenses/LICENSE-2.0.txt')
                     }
                 }
+
                 developers {
                     developer {
-                        id = 'twa'
-                        name = 'Tobias Warneke'
-                        email = 't.warneke@gmx.net'
+                        id.set('twa')
+                        name.set('Tobias Warneke')
+                        email.set('t.warneke@gmx.net')
                     }
                     developer {
-                        id = 'are'
-                        name = 'Andreas Reichel'
-                        email = 'andreas@manticore-projects.com'
+                        id.set('are')
+                        name.set('Andreas Reichel')
+                        email.set('andreas@manticore-projects.com')
                     }
                 }
+
                 scm {
-                    connection = 'scm:git:https://github.com/JSQLParser/JSqlParser.git'
-                    developerConnection = 'scm:git:ssh://git@github.com:JSQLParser/JSqlParser.git'
-                    url = 'https://github.com/JSQLParser/JSqlParser.git'
+                    connection.set('scm:git:https://github.com/JSQLParser/JSqlParser.git')
+                    developerConnection.set('scm:git:ssh://git@github.com:JSQLParser/JSqlParser.git')
+                    url.set('https://github.com/JSQLParser/JSqlParser.git')
                 }
             }
         }
     }
+
     repositories {
         maven {
-            name "ossrh"
-            def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
-            def snapshotsRepoUrl= "https://oss.sonatype.org/content/repositories/snapshots/"
-            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
+            name = "ossrh"
+            def releasesRepoUrl = "https://central.sonatype.com/repository/maven-releases"
+            def snapshotsRepoUrl = "https://central.sonatype.com/repository/maven-snapshots/"
+            url(version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl)
+
             credentials {
-                username = System.getenv("ossrhUsername")
-                password = System.getenv("ossrhPassword")
+                username = providers.environmentVariable("ossrhUsername").orNull
+                password = providers.environmentVariable("ossrhPassword").orNull
             }
         }
     }
 }
 
+
 signing {
     //def signingKey = findProperty("signingKey")
     //def signingPassword = findProperty("signingPassword")
@@ -571,12 +624,13 @@ tasks.withType(JavaCompile).configureEach {
 
 remotes {
     webServer {
-        host = findProperty("${project.name}.host")
-        user = findProperty("${project.name}.username")
-        identity = new File("${System.properties['user.home']}/.ssh/id_rsa")
+        host = findProperty("${project.name}.host") ?: "defaultHost" // Provide default if not found
+        user = findProperty("${project.name}.username") ?: "defaultUsername" // Provide default if not found
+        identity = file("${System.getProperty('user.home')}/.ssh/id_rsa")
     }
 }
 
+
 tasks.register('upload') {
     doFirst {
         if (findProperty("${project.name}.host") == null) {
@@ -593,13 +647,24 @@ tasks.register('upload') {
             session(remotes.webServer) {
                 def versionStable = getVersion(false)
                 execute "mkdir -p download/${project.name}-${versionStable}"
-                for (File file: fileTree(include:['*.jar'], dir:"${project.buildDir}/libs").collect()) {
+                for (File file: fileTree(include:['*.jar'], dir: layout.buildDirectory.dir("libs").get()).collect()) {
                     put from: file, into: "download/${project.name}-${versionStable}"
                 }
             }
         }
     }
+
+    dependsOn(check, assemble, gitChangelogTask, renderRR, xslt, xmldoc)
+}
+
+check {
+    dependsOn jacocoTestCoverageVerification
 }
-check.dependsOn jacocoTestCoverageVerification
-upload.dependsOn(check, assemble, gitChangelogTask, renderRR, xslt, xmldoc)
 
+jmh {
+    includes = ['.*JSQLParserBenchmark.*']
+    warmupIterations = 2
+    fork = 3
+    iterations = 5
+    timeOnIteration = '1s'
+}
diff --git a/gradle.properties b/gradle.properties
index 1ca3951da..8b590d14c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,6 +1,6 @@
 # Specifies the JVM arguments used for the daemon process.
 # The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx4G -Xss2m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError
+org.gradle.jvmargs=-Xmx8G -Xss8m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError
 
 org.gradle.caching=true
 
diff --git a/pom.xml b/pom.xml
index 6b6b68678..ed03f5feb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.github.jsqlparser</groupId>
     <artifactId>jsqlparser</artifactId>
-    <version>5.2-SNAPSHOT</version>
+    <version>5.4-SNAPSHOT</version>
     <name>JSQLParser library</name> 
     <inceptionYear>2004</inceptionYear>
     <organization>
@@ -24,12 +24,52 @@
         </license>
     </licenses>
 
+    <repositories>
+        <repository>
+            <id>javacc8-snapshots</id>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases><enabled>false</enabled></releases>
+            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
+        </repository>
+        <repository>
+            <id>ossrh-snapshots</id>
+            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
+            <snapshots><enabled>true</enabled></snapshots>
+            <releases><enabled>false</enabled></releases>
+        </repository>
+    </repositories>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>javacc8-snapshots</id>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases><enabled>false</enabled></releases>
+            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
+        </pluginRepository>
+        <pluginRepository>
+            <id>ossrh-snapshots</id>
+            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
+            <snapshots><enabled>true</enabled></snapshots>
+            <releases><enabled>false</enabled></releases>
+        </pluginRepository>
+    </pluginRepositories>
+
     <dependencies>
         <!-- needed for parsing the Keywords via JTree in ParserKeywordsUtils -->
         <dependency>
-            <groupId>net.java.dev.javacc</groupId>
-            <artifactId>javacc</artifactId>
-            <version>[7.0.13,)</version>
+            <groupId>org.javacc</groupId>
+            <artifactId>core</artifactId>
+            <version>8.1.0-SNAPSHOT</version>
+            <type>pom</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.javacc.generator</groupId>
+            <artifactId>java</artifactId>
+            <version>8.1.0-SNAPSHOT</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -41,31 +81,31 @@
         <dependency>
         	<groupId>org.junit.jupiter</groupId>
         	<artifactId>junit-jupiter</artifactId>
-        	<version>[5.10.2,)</version>
+        	<version>5.11.4</version>
         	<scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
-            <version>[5.11.0,)</version>
+            <version>5.15.2</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-junit-jupiter</artifactId>
-            <version>[5.11.0,)</version>
+            <version>5.15.2</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
-            <version>[3.25.3,)</version>
+            <version>3.27.3</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
-            <version>[3.14.0,)</version>
+            <version>[3.18.0,)</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -82,6 +122,22 @@
             <version>1.3</version>
             <scope>test</scope>
         </dependency>
+
+        <!-- JMH core API -->
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-core</artifactId>
+            <version>1.37</version>
+        </dependency>
+
+        <!-- JMH annotation processor -->
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-generator-annprocess</artifactId>
+            <version>1.37</version>
+            <scope>provided</scope>
+        </dependency>
+
     </dependencies>
 
     <developers>
@@ -94,11 +150,13 @@
     <distributionManagement>
         <repository>
             <id>sonatype-nexus-staging</id>
-            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+            <url>https://central.sonatype.com/repository/maven-releases</url>
         </repository>
         <snapshotRepository>
-            <id>sonatype-nexus-snapshots</id> 
-            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+            <id>sonatype-nexus-snapshots</id>
+            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
+            <releases><enabled>false</enabled></releases>
+            <snapshots><enabled>true</enabled></snapshots>
         </snapshotRepository>
     </distributionManagement>
 
@@ -141,6 +199,7 @@
                     <excludes>
                         <exclude>**/*Bean.java</exclude>
                         <exclude>**/generated/*.java</exclude>
+                        <exclude>**/net/sf/jsqlparser/parser/SimpleCharStream.java</exclude>
                     </excludes>
                     <excludeRoots>
                         <excludeRoot>target/generated-sources</excludeRoot>
@@ -173,7 +232,7 @@
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>build-helper-maven-plugin</artifactId>
-                <version>3.2.0</version>
+                <version>3.6.0</version>
                 <executions>
                     <execution>
                         <id>add-source</id>
@@ -192,16 +251,25 @@
             </plugin>
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.10.1</version>
+                <version>3.14.0</version>
                 <configuration>
                     <source>11</source>
                     <target>11</target>
                     <showWarnings>true</showWarnings>
                     <encoding>${project.build.sourceEncoding}</encoding>
                     <showDeprecation>true</showDeprecation>
+                    <maxmem>2000m</maxmem>
+                    <compilerArgs>
+                        <arg>-J-Xss4M</arg>
+                    </compilerArgs>
                     <fork>true</fork>
-                    <meminitial>128m</meminitial>
-                    <maxmem>2g</maxmem>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.openjdk.jmh</groupId>
+                            <artifactId>jmh-generator-annprocess</artifactId>
+                            <version>1.37</version>
+                        </path>
+                    </annotationProcessorPaths>
                 </configuration>
             </plugin>
             <plugin>
@@ -216,17 +284,20 @@
                             <goal>jjtree-javacc</goal>
                         </goals>
                         <configuration>
-                            <grammarEncoding>UTF-8</grammarEncoding>
-                            <isStatic>false</isStatic>
-                            <jdkVersion>1.8</jdkVersion>
+                            <codeGenerator>java</codeGenerator>
                         </configuration>
                     </execution>
                 </executions>
                 <dependencies>
                     <dependency>
-                        <groupId>net.java.dev.javacc</groupId>
-                        <artifactId>javacc</artifactId>
-                        <version>[7.0.13,)</version>
+                        <groupId>org.javacc.generator</groupId>
+                        <artifactId>java</artifactId>
+                        <version>8.1.0-SNAPSHOT</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.javacc</groupId>
+                        <artifactId>core</artifactId>
+                        <version>8.1.0-SNAPSHOT</version>
                     </dependency>
                 </dependencies>
             </plugin>
@@ -304,7 +375,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-javadoc-plugin</artifactId>
-                <version>3.4.1</version>
+                <version>3.11.2</version>
                 <executions>
                     <execution>
                         <id>attach-javadocs</id>
@@ -315,7 +386,7 @@
                             <useStandardDocletOptions>true</useStandardDocletOptions>
                             <maxmemory>2g</maxmemory>
                             <minmemory>800m</minmemory>
-                            <additionalJOptions>-J-Xss2m</additionalJOptions>
+                            <additionalJOptions>-J-Xss4m</additionalJOptions>
                         </configuration>
                         <goals>
                             <goal>jar</goal>
@@ -326,7 +397,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
-                <version>3.3.0</version>
+                <version>3.4.2</version>
                 <configuration>
                     <archive>
                         <manifestEntries>
@@ -349,7 +420,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
-                <version>3.2.5</version>
+                <version>3.5.2</version>
                 <configuration>
                     <trimStackTrace>false</trimStackTrace>
                     <!-- AlterViewTest does deep reflection -->
@@ -357,14 +428,14 @@
                     <argLine>
                         --add-opens=java.base/java.lang=ALL-UNNAMED
                         --add-opens=java.base/java.util=ALL-UNNAMED
-                        -Xmx2G -Xms512m -Xss2m
+                        -Xmx2G -Xms800m -Xss4m
                     </argLine>
                 </configuration>
             </plugin>
             <plugin>
                 <groupId>org.jacoco</groupId>
                 <artifactId>jacoco-maven-plugin</artifactId>
-                <version>0.8.10</version>
+                <version>0.8.11</version>
                 <executions>
                     <execution>
                         <goals>
@@ -383,7 +454,7 @@
             <plugin>
                 <groupId>com.diffplug.spotless</groupId>
                 <artifactId>spotless-maven-plugin</artifactId>
-                <version>2.28.0</version>
+                <version>2.43.0</version>
                 <configuration>
                     <!-- optional: limit format enforcement to just the files changed by this feature branch -->
                     <ratchetFrom>origin/master</ratchetFrom>
@@ -424,6 +495,15 @@
                     </java>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.sonatype.central</groupId>
+                <artifactId>central-publishing-maven-plugin</artifactId>
+                <version>0.8.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                  <publishingServerId>sonatype-nexus</publishingServerId>
+                </configuration>
+              </plugin>
         </plugins>
     </build>
     
@@ -435,7 +515,7 @@
                 <version>3.0.0-M7</version>
                 <configuration>
                     <outputDirectory>${project.reporting.outputDirectory}/testresults</outputDirectory>
-                    <argLine>-Xmx2G -Xms512m -Xss2m</argLine>
+                    <argLine>-Xmx2G -Xms800m -Xss4m</argLine>
                 </configuration>
             </plugin>
             <plugin>
@@ -444,11 +524,10 @@
                 <version>3.4.1</version>
                 <configuration>
                     <useStandardDocletOptions>true</useStandardDocletOptions>
+                    <doclint>none</doclint>
                     <maxmemory>2g</maxmemory>
                     <minmemory>800m</minmemory>
-                    <doclint>none</doclint>
-
-                    <additionalJOptions>-Xss2m</additionalJOptions>
+                    <additionalJOptions>-J-Xss2m</additionalJOptions>
 
                     <!-- Doclint does not work on the Test Sources
                     <doclint>all,-missing</doclint>
@@ -537,7 +616,7 @@
                             <logViolationsToConsole>true</logViolationsToConsole>
                             <includeTestSourceDirectory>true</includeTestSourceDirectory>
                             <sourceDirectories>${project.build.sourceDirectory}</sourceDirectories>
-                            <excludes>**/module-info.java</excludes>
+                            <excludes>**/module-info.java,**/net/sf/jsqlparser/parser/SimpleCharStream.java</excludes>
                             <checkstyleRules>
                                 <module name="Checker">
                                     <module name="SuppressWarningsFilter" />
diff --git a/settings.gradle b/settings.gradle
deleted file mode 100644
index 78feb00f5..000000000
--- a/settings.gradle
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
- * This file was generated by the Gradle 'init' task.
- */
-
-rootProject.name = 'JSQLFormatter'
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index aec008326..6765fe187 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -10,6 +10,7 @@
 module net.sf.jsqlparser {
     requires java.sql;
     requires java.logging;
+    requires java.desktop;
 
     exports net.sf.jsqlparser;
     exports net.sf.jsqlparser.expression;
@@ -35,7 +36,9 @@
     exports net.sf.jsqlparser.statement.delete;
     exports net.sf.jsqlparser.statement.drop;
     exports net.sf.jsqlparser.statement.execute;
+    exports net.sf.jsqlparser.statement.export;
     exports net.sf.jsqlparser.statement.grant;
+    exports net.sf.jsqlparser.statement.imprt;
     exports net.sf.jsqlparser.statement.insert;
     exports net.sf.jsqlparser.statement.merge;
     exports net.sf.jsqlparser.statement.piped;
diff --git a/src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java b/src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java
index f2a531ab6..0c0d11146 100644
--- a/src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java
@@ -60,7 +60,6 @@ public AnalyticExpression(Function function) {
         this.distinct = function.isDistinct();
         this.unique = function.isUnique();
 
-
         ExpressionList<? extends Expression> list = function.getParameters();
         if (list != null) {
             if (list.size() > 3) {
@@ -117,16 +116,16 @@ public void setKeep(KeepExpression keep) {
     }
 
     public ExpressionList<?> getPartitionExpressionList() {
-        return windowDef.partitionBy.getPartitionExpressionList();
+        return windowDef.partitionBy;
     }
 
-    public void setPartitionExpressionList(ExpressionList<?> partitionExpressionList) {
+    public void setPartitionExpressionList(ExpressionList<Expression> partitionExpressionList) {
         setPartitionExpressionList(partitionExpressionList, false);
     }
 
-    public void setPartitionExpressionList(ExpressionList<?> partitionExpressionList,
+    public void setPartitionExpressionList(ExpressionList<Expression> partitionExpressionList,
             boolean brackets) {
-        windowDef.partitionBy.setPartitionExpressionList(partitionExpressionList, brackets);
+        windowDef.partitionBy.setExpressions(partitionExpressionList, brackets);
     }
 
     public boolean isPartitionByBrackets() {
diff --git a/src/main/java/net/sf/jsqlparser/expression/ArrayConstructor.java b/src/main/java/net/sf/jsqlparser/expression/ArrayConstructor.java
index c7fe031ab..5e1c8d0e6 100644
--- a/src/main/java/net/sf/jsqlparser/expression/ArrayConstructor.java
+++ b/src/main/java/net/sf/jsqlparser/expression/ArrayConstructor.java
@@ -11,10 +11,12 @@
 
 import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
 import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
+import net.sf.jsqlparser.statement.create.table.ColDataType;
 
 public class ArrayConstructor extends ASTNodeAccessImpl implements Expression {
     private ExpressionList<?> expressions;
     private boolean arrayKeyword;
+    private ColDataType dataType;
 
     public ArrayConstructor(ExpressionList<?> expressions, boolean arrayKeyword) {
         this.expressions = expressions;
@@ -41,6 +43,15 @@ public void setArrayKeyword(boolean arrayKeyword) {
         this.arrayKeyword = arrayKeyword;
     }
 
+    public ColDataType getDataType() {
+        return dataType;
+    }
+
+    public ArrayConstructor setDataType(ColDataType dataType) {
+        this.dataType = dataType;
+        return this;
+    }
+
     @Override
     public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
         return expressionVisitor.visit(this, context);
@@ -51,6 +62,10 @@ public String toString() {
         StringBuilder sb = new StringBuilder();
         if (arrayKeyword) {
             sb.append("ARRAY");
+
+            if (dataType != null) {
+                sb.append("<").append(dataType).append(">");
+            }
         }
         sb.append("[");
         sb.append(expressions.toString());
diff --git a/src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java b/src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java
index 3510fe6d3..ccb15db4b 100644
--- a/src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java
@@ -39,7 +39,7 @@ public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
 
     @Override
     public String toString() {
-        return type.name() + " " + value;
+        return type != null ? type.name() + " " + value : value;
     }
 
     public DateTimeLiteralExpression withValue(String value) {
diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java
index ff7887f94..8b5ade13d 100644
--- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java
@@ -42,6 +42,7 @@
 import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
+import net.sf.jsqlparser.expression.operators.relational.IsUnknownExpression;
 import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
 import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
 import net.sf.jsqlparser.expression.operators.relational.Matches;
@@ -59,11 +60,98 @@
 import net.sf.jsqlparser.statement.piped.FromQuery;
 import net.sf.jsqlparser.statement.select.AllColumns;
 import net.sf.jsqlparser.statement.select.AllTableColumns;
+import net.sf.jsqlparser.statement.select.FunctionAllColumns;
+import net.sf.jsqlparser.statement.select.GroupByElement;
+import net.sf.jsqlparser.statement.select.Limit;
+import net.sf.jsqlparser.statement.select.OrderByElement;
 import net.sf.jsqlparser.statement.select.ParenthesedSelect;
 import net.sf.jsqlparser.statement.select.Select;
+import net.sf.jsqlparser.statement.update.UpdateSet;
+
+import java.util.List;
 
 public interface ExpressionVisitor<T> {
 
+    default <S> T visitExpressions(ExpressionList<? extends Expression> expressions, S context) {
+        if (expressions != null) {
+            expressions.forEach(expression -> expression.accept(this, context));
+        }
+        return null;
+    };
+
+    default <S> T visitExpression(Expression expression, S context) {
+        if (expression != null) {
+            expression.accept(this, context);
+        }
+        return null;
+    }
+
+    default <S> T visitOrderBy(List<OrderByElement> orderByElements, S context) {
+        if (orderByElements != null) {
+            for (OrderByElement orderByElement : orderByElements) {
+                orderByElement.getExpression().accept(this, context);
+            }
+        }
+        return null;
+    }
+
+    default <S> T visitLimit(Limit limit, S context) {
+        if (limit != null && !limit.isLimitNull() && !limit.isLimitAll()) {
+            if (limit.getOffset() != null) {
+                limit.getOffset().accept(this, context);
+            }
+            if (limit.getRowCount() != null) {
+                limit.getRowCount().accept(this, context);
+            }
+            if (limit.getByExpressions() != null) {
+                limit.getByExpressions().accept(this, context);
+            }
+        }
+        return null;
+    }
+
+    default <S> T visitPreferringClause(PreferringClause preferringClause, S context) {
+        if (preferringClause != null) {
+            if (preferringClause.getPreferring() != null) {
+                preferringClause.getPreferring().accept(this, context);
+            }
+            if (preferringClause.getPartitionBy() != null) {
+                for (Expression expression : preferringClause.getPartitionBy()) {
+                    expression.accept(this, context);
+                }
+            }
+        }
+        return null;
+    }
+
+    default <S> T visitUpdateSets(List<UpdateSet> updateSets, S context) {
+        if (updateSets != null) {
+            for (UpdateSet updateSet : updateSets) {
+                for (Column column : updateSet.getColumns()) {
+                    column.accept(this, context);
+                }
+                for (Expression value : updateSet.getValues()) {
+                    value.accept(this, context);
+                }
+            }
+        }
+        return null;
+    }
+
+    default <S> T visit(GroupByElement groupBy, S context) {
+        if (groupBy != null) {
+            for (Expression expression : groupBy.getGroupByExpressionList()) {
+                expression.accept(this, context);
+            }
+            if (!groupBy.getGroupingSets().isEmpty()) {
+                for (ExpressionList<?> expressionList : groupBy.getGroupingSets()) {
+                    expressionList.accept(this, context);
+                }
+            }
+        }
+        return null;
+    }
+
     <S> T visit(BitwiseRightShift bitwiseRightShift, S context);
 
     default void visit(BitwiseRightShift bitwiseRightShift) {
@@ -268,6 +356,12 @@ default void visit(IsBooleanExpression isBooleanExpression) {
         this.visit(isBooleanExpression, null);
     }
 
+    <S> T visit(IsUnknownExpression isUnknownExpression, S context);
+
+    default void visit(IsUnknownExpression isUnknownExpression) {
+        this.visit(isUnknownExpression, null);
+    }
+
     <S> T visit(LikeExpression likeExpression, S context);
 
     default void visit(LikeExpression likeExpression) {
@@ -578,6 +672,8 @@ default void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) {
 
     <S> T visit(AllColumns allColumns, S context);
 
+    <S> T visit(FunctionAllColumns functionColumns, S context);
+
     default void visit(AllColumns allColumns) {
         this.visit(allColumns, null);
     }
diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java
index dd97ccad2..96d80d514 100644
--- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java
@@ -42,6 +42,7 @@
 import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
+import net.sf.jsqlparser.expression.operators.relational.IsUnknownExpression;
 import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
 import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
 import net.sf.jsqlparser.expression.operators.relational.Matches;
@@ -59,6 +60,7 @@
 import net.sf.jsqlparser.statement.piped.FromQuery;
 import net.sf.jsqlparser.statement.select.AllColumns;
 import net.sf.jsqlparser.statement.select.AllTableColumns;
+import net.sf.jsqlparser.statement.select.FunctionAllColumns;
 import net.sf.jsqlparser.statement.select.OrderByElement;
 import net.sf.jsqlparser.statement.select.ParenthesedSelect;
 import net.sf.jsqlparser.statement.select.Pivot;
@@ -82,17 +84,26 @@ public class ExpressionVisitorAdapter<T>
 
     private SelectVisitor<T> selectVisitor;
 
+    public ExpressionVisitorAdapter(SelectVisitor<T> selectVisitor) {
+        this.selectVisitor = selectVisitor;
+    }
+
+    public ExpressionVisitorAdapter() {
+        this.selectVisitor = null;
+    }
+
     public SelectVisitor<T> getSelectVisitor() {
         return selectVisitor;
     }
 
-    public void setSelectVisitor(SelectVisitor<T> selectVisitor) {
+    public ExpressionVisitorAdapter<T> setSelectVisitor(SelectVisitor<T> selectVisitor) {
         this.selectVisitor = selectVisitor;
+        return this;
     }
 
     @Override
     public <S> T visit(NullValue nullValue, S context) {
-        return visitExpression(nullValue, context);
+        return applyExpression(nullValue, context);
     }
 
     @Override
@@ -119,47 +130,47 @@ public <S> T visit(SignedExpression signedExpression, S context) {
 
     @Override
     public <S> T visit(JdbcParameter jdbcParameter, S context) {
-        return visitExpression(jdbcParameter, context);
+        return applyExpression(jdbcParameter, context);
     }
 
     @Override
     public <S> T visit(JdbcNamedParameter jdbcNamedParameter, S context) {
-        return visitExpression(jdbcNamedParameter, context);
+        return applyExpression(jdbcNamedParameter, context);
     }
 
     @Override
     public <S> T visit(DoubleValue doubleValue, S context) {
-        return visitExpression(doubleValue, context);
+        return applyExpression(doubleValue, context);
     }
 
     @Override
     public <S> T visit(LongValue longValue, S context) {
-        return visitExpression(longValue, context);
+        return applyExpression(longValue, context);
     }
 
     @Override
     public <S> T visit(DateValue dateValue, S context) {
-        return visitExpression(dateValue, context);
+        return applyExpression(dateValue, context);
     }
 
     @Override
     public <S> T visit(TimeValue timeValue, S context) {
-        return visitExpression(timeValue, context);
+        return applyExpression(timeValue, context);
     }
 
     @Override
     public <S> T visit(TimestampValue timestampValue, S context) {
-        return visitExpression(timestampValue, context);
+        return applyExpression(timestampValue, context);
     }
 
     @Override
     public <S> T visit(StringValue stringValue, S context) {
-        return visitExpression(stringValue, context);
+        return applyExpression(stringValue, context);
     }
 
     @Override
     public <S> T visit(BooleanValue booleanValue, S context) {
-        return visitExpression(booleanValue, context);
+        return applyExpression(booleanValue, context);
     }
 
     @Override
@@ -264,6 +275,11 @@ public <S> T visit(IsBooleanExpression isBooleanExpression, S context) {
         return isBooleanExpression.getLeftExpression().accept(this, context);
     }
 
+    @Override
+    public <S> T visit(IsUnknownExpression isUnknownExpression, S context) {
+        return isUnknownExpression.getLeftExpression().accept(this, context);
+    }
+
     @Override
     public <S> T visit(LikeExpression likeExpression, S context) {
         return visitBinaryExpression(likeExpression, context);
@@ -301,7 +317,7 @@ public <S> T visit(ContainedBy containedBy, S context) {
 
     @Override
     public <S> T visit(Column column, S context) {
-        return visitExpression(column, context);
+        return applyExpression(column, context);
     }
 
     @Override
@@ -345,7 +361,7 @@ public <S> T visit(MemberOfExpression memberOfExpression, S context) {
 
     @Override
     public <S> T visit(AnyComparisonExpression anyComparisonExpression, S context) {
-        return visitExpression(anyComparisonExpression, context);
+        return applyExpression(anyComparisonExpression, context);
     }
 
     @Override
@@ -474,7 +490,7 @@ public <S> T visit(BitwiseLeftShift bitwiseLeftShift, S context) {
         return visitBinaryExpression(bitwiseLeftShift, context);
     }
 
-    protected <S> T visitExpression(Expression expression, S context) {
+    protected <S> T applyExpression(Expression expression, S context) {
         return null;
     }
 
@@ -515,12 +531,12 @@ public <S> T visit(JsonOperator jsonOperator, S context) {
 
     @Override
     public <S> T visit(UserVariable userVariable, S context) {
-        return visitExpression(userVariable, context);
+        return applyExpression(userVariable, context);
     }
 
     @Override
     public <S> T visit(NumericBind numericBind, S context) {
-        return visitExpression(numericBind, context);
+        return applyExpression(numericBind, context);
     }
 
     @Override
@@ -585,17 +601,22 @@ public <S> T visit(UnPivot unpivot, S context) {
 
     @Override
     public <S> T visit(AllColumns allColumns, S context) {
-        return visitExpression(allColumns, context);
+        return applyExpression(allColumns, context);
     }
 
     @Override
     public <S> T visit(AllTableColumns allTableColumns, S context) {
-        return visitExpression(allTableColumns, context);
+        return applyExpression(allTableColumns, context);
+    }
+
+    @Override
+    public <S> T visit(FunctionAllColumns functionAllColumns, S context) {
+        return applyExpression(functionAllColumns, context);
     }
 
     @Override
     public <S> T visit(AllValue allValue, S context) {
-        return visitExpression(allValue, context);
+        return applyExpression(allValue, context);
     }
 
     @Override
@@ -615,27 +636,27 @@ public <S> T visit(RowGetExpression rowGetExpression, S context) {
 
     @Override
     public <S> T visit(HexValue hexValue, S context) {
-        return visitExpression(hexValue, context);
+        return applyExpression(hexValue, context);
     }
 
     @Override
     public <S> T visit(OracleHint hint, S context) {
-        return visitExpression(hint, context);
+        return applyExpression(hint, context);
     }
 
     @Override
     public <S> T visit(TimeKeyExpression timeKeyExpression, S context) {
-        return visitExpression(timeKeyExpression, context);
+        return applyExpression(timeKeyExpression, context);
     }
 
     @Override
     public <S> T visit(DateTimeLiteralExpression dateTimeLiteralExpression, S context) {
-        return visitExpression(dateTimeLiteralExpression, context);
+        return applyExpression(dateTimeLiteralExpression, context);
     }
 
     @Override
     public <S> T visit(NextValExpression nextValExpression, S context) {
-        return visitExpression(nextValExpression, context);
+        return applyExpression(nextValExpression, context);
     }
 
     @Override
diff --git a/src/main/java/net/sf/jsqlparser/expression/FilterOverImpl.java b/src/main/java/net/sf/jsqlparser/expression/FilterOverImpl.java
index 50e557933..a64d8eb27 100644
--- a/src/main/java/net/sf/jsqlparser/expression/FilterOverImpl.java
+++ b/src/main/java/net/sf/jsqlparser/expression/FilterOverImpl.java
@@ -51,17 +51,17 @@ public FilterOverImpl withOrderByElements(List<OrderByElement> orderByElements)
         return this;
     }
 
-    public ExpressionList getPartitionExpressionList() {
-        return partitionBy.getPartitionExpressionList();
+    public ExpressionList<Expression> getPartitionExpressionList() {
+        return partitionBy;
     }
 
-    public void setPartitionExpressionList(ExpressionList partitionExpressionList) {
+    public void setPartitionExpressionList(ExpressionList<Expression> partitionExpressionList) {
         setPartitionExpressionList(partitionExpressionList, false);
     }
 
-    public void setPartitionExpressionList(ExpressionList partitionExpressionList,
+    public void setPartitionExpressionList(ExpressionList<Expression> partitionExpressionList,
             boolean brackets) {
-        partitionBy.setPartitionExpressionList(partitionExpressionList, brackets);
+        partitionBy.setExpressions(partitionExpressionList, brackets);
     }
 
     public boolean isPartitionByBrackets() {
diff --git a/src/main/java/net/sf/jsqlparser/expression/OracleHierarchicalExpression.java b/src/main/java/net/sf/jsqlparser/expression/OracleHierarchicalExpression.java
index 6ec4c6a8b..693128d03 100644
--- a/src/main/java/net/sf/jsqlparser/expression/OracleHierarchicalExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/OracleHierarchicalExpression.java
@@ -65,11 +65,11 @@ public String toString() {
             }
             b.append(connectExpression.toString());
             if (startExpression != null) {
-                b.append(" START WITH ").append(startExpression.toString());
+                b.append(" START WITH ").append(startExpression);
             }
         } else {
             if (startExpression != null) {
-                b.append(" START WITH ").append(startExpression.toString());
+                b.append(" START WITH ").append(startExpression);
             }
             b.append(" CONNECT BY ");
             if (isNoCycle()) {
diff --git a/src/main/java/net/sf/jsqlparser/expression/PartitionByClause.java b/src/main/java/net/sf/jsqlparser/expression/PartitionByClause.java
index 243975029..6ad41e994 100644
--- a/src/main/java/net/sf/jsqlparser/expression/PartitionByClause.java
+++ b/src/main/java/net/sf/jsqlparser/expression/PartitionByClause.java
@@ -14,29 +14,39 @@
 
 import java.io.Serializable;
 
-public class PartitionByClause implements Serializable {
-    ExpressionList partitionExpressionList;
+public class PartitionByClause extends ExpressionList<Expression> implements Serializable {
     boolean brackets = false;
 
-    public ExpressionList getPartitionExpressionList() {
-        return partitionExpressionList;
+    @Deprecated
+    public ExpressionList<Expression> getPartitionExpressionList() {
+        return this;
     }
 
-    public void setPartitionExpressionList(ExpressionList partitionExpressionList) {
+    @Deprecated
+    public void setPartitionExpressionList(ExpressionList<Expression> partitionExpressionList) {
         setPartitionExpressionList(partitionExpressionList, false);
     }
 
-    public void setPartitionExpressionList(ExpressionList partitionExpressionList,
+    @Deprecated
+    public void setPartitionExpressionList(ExpressionList<Expression> partitionExpressionList,
+            boolean brackets) {
+        setExpressions(partitionExpressionList, brackets);
+    }
+
+    public PartitionByClause setExpressions(ExpressionList<Expression> partitionExpressionList,
             boolean brackets) {
-        this.partitionExpressionList = partitionExpressionList;
+        clear();
+        if (partitionExpressionList != null) {
+            addAll(partitionExpressionList);
+        }
         this.brackets = brackets;
+        return this;
     }
 
     public void toStringPartitionBy(StringBuilder b) {
-        if (partitionExpressionList != null
-                && !partitionExpressionList.getExpressions().isEmpty()) {
+        if (!isEmpty()) {
             b.append("PARTITION BY ");
-            b.append(PlainSelect.getStringList(partitionExpressionList.getExpressions(), true,
+            b.append(PlainSelect.getStringList(this, true,
                     brackets));
             b.append(" ");
         }
@@ -46,7 +56,9 @@ public boolean isBrackets() {
         return brackets;
     }
 
-    public PartitionByClause withPartitionExpressionList(ExpressionList partitionExpressionList) {
+    @Deprecated
+    public PartitionByClause withPartitionExpressionList(
+            ExpressionList<Expression> partitionExpressionList) {
         this.setPartitionExpressionList(partitionExpressionList);
         return this;
     }
diff --git a/src/main/java/net/sf/jsqlparser/expression/PreferringClause.java b/src/main/java/net/sf/jsqlparser/expression/PreferringClause.java
index 00cf086fd..2db468dbb 100644
--- a/src/main/java/net/sf/jsqlparser/expression/PreferringClause.java
+++ b/src/main/java/net/sf/jsqlparser/expression/PreferringClause.java
@@ -21,12 +21,12 @@ public PreferringClause(Expression preferring) {
         this.preferring = preferring;
     }
 
-    public void setPartitionExpressionList(ExpressionList expressionList,
+    public void setPartitionExpressionList(ExpressionList<Expression> expressionList,
             boolean brackets) {
         if (this.partitionBy == null) {
             this.partitionBy = new PartitionByClause();
         }
-        partitionBy.setPartitionExpressionList(expressionList, brackets);
+        partitionBy.setExpressions(expressionList, brackets);
     }
 
     public void toStringPreferring(StringBuilder b) {
@@ -39,6 +39,24 @@ public void toStringPreferring(StringBuilder b) {
         }
     }
 
+    public Expression getPreferring() {
+        return preferring;
+    }
+
+    public PreferringClause setPreferring(Expression preferring) {
+        this.preferring = preferring;
+        return this;
+    }
+
+    public PartitionByClause getPartitionBy() {
+        return partitionBy;
+    }
+
+    public PreferringClause setPartitionBy(PartitionByClause partitionBy) {
+        this.partitionBy = partitionBy;
+        return this;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
diff --git a/src/main/java/net/sf/jsqlparser/expression/StringValue.java b/src/main/java/net/sf/jsqlparser/expression/StringValue.java
index ec77f54a9..a16536fab 100644
--- a/src/main/java/net/sf/jsqlparser/expression/StringValue.java
+++ b/src/main/java/net/sf/jsqlparser/expression/StringValue.java
@@ -24,6 +24,7 @@ public final class StringValue extends ASTNodeAccessImpl implements Expression {
             Arrays.asList("N", "U", "E", "R", "B", "RB", "_utf8", "Q");
     private String value = "";
     private String prefix = null;
+    private String quoteStr = "'";
 
     public StringValue() {
         // empty constructor
@@ -35,6 +36,11 @@ public StringValue(String escapedValue) {
                 && escapedValue.endsWith("'")) {
             value = escapedValue.substring(1, escapedValue.length() - 1);
             return;
+        } else if (escapedValue.length() >= 4 && escapedValue.startsWith("$$")
+                && escapedValue.endsWith("$$")) {
+            value = escapedValue.substring(2, escapedValue.length() - 2);
+            quoteStr = "$$";
+            return;
         }
 
         if (escapedValue.length() > 2) {
@@ -68,6 +74,15 @@ public void setPrefix(String prefix) {
         this.prefix = prefix;
     }
 
+    public String getQuoteStr() {
+        return quoteStr;
+    }
+
+    public StringValue setQuoteStr(String quoteStr) {
+        this.quoteStr = quoteStr;
+        return this;
+    }
+
     public String getNotExcapedValue() {
         StringBuilder buffer = new StringBuilder(value);
         int index = 0;
@@ -87,7 +102,7 @@ public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
 
     @Override
     public String toString() {
-        return (prefix != null ? prefix : "") + "'" + value + "'";
+        return (prefix != null ? prefix : "") + quoteStr + value + quoteStr;
     }
 
     public StringValue withPrefix(String prefix) {
diff --git a/src/main/java/net/sf/jsqlparser/expression/UserVariable.java b/src/main/java/net/sf/jsqlparser/expression/UserVariable.java
index ece2bd13a..b0599a3c5 100644
--- a/src/main/java/net/sf/jsqlparser/expression/UserVariable.java
+++ b/src/main/java/net/sf/jsqlparser/expression/UserVariable.java
@@ -24,7 +24,7 @@ public UserVariable() {
     }
 
     public UserVariable(String name) {
-        this.name = name;
+        setName(name);
     }
 
     public String getName() {
@@ -32,7 +32,15 @@ public String getName() {
     }
 
     public void setName(String name) {
-        this.name = name;
+        if (name.startsWith("@@")) {
+            this.name = name.substring(2);
+            doubleAdd = true;
+        } else if (name.startsWith("@")) {
+            this.name = name.substring(1);
+            doubleAdd = false;
+        } else {
+            this.name = name;
+        }
     }
 
     @Override
diff --git a/src/main/java/net/sf/jsqlparser/expression/WindowDefinition.java b/src/main/java/net/sf/jsqlparser/expression/WindowDefinition.java
index a5df35aa6..60760baee 100644
--- a/src/main/java/net/sf/jsqlparser/expression/WindowDefinition.java
+++ b/src/main/java/net/sf/jsqlparser/expression/WindowDefinition.java
@@ -51,13 +51,13 @@ public ExpressionList getPartitionExpressionList() {
         return partitionBy.getPartitionExpressionList();
     }
 
-    public void setPartitionExpressionList(ExpressionList partitionExpressionList) {
+    public void setPartitionExpressionList(ExpressionList<Expression> partitionExpressionList) {
         setPartitionExpressionList(partitionExpressionList, false);
     }
 
-    public void setPartitionExpressionList(ExpressionList partitionExpressionList,
+    public void setPartitionExpressionList(ExpressionList<Expression> partitionExpressionList,
             boolean brackets) {
-        partitionBy.setPartitionExpressionList(partitionExpressionList, brackets);
+        partitionBy.setExpressions(partitionExpressionList, brackets);
     }
 
     public String getWindowName() {
diff --git a/src/main/java/net/sf/jsqlparser/expression/operators/relational/Between.java b/src/main/java/net/sf/jsqlparser/expression/operators/relational/Between.java
index 1cd997216..8998863ef 100644
--- a/src/main/java/net/sf/jsqlparser/expression/operators/relational/Between.java
+++ b/src/main/java/net/sf/jsqlparser/expression/operators/relational/Between.java
@@ -22,6 +22,8 @@ public class Between extends ASTNodeAccessImpl implements Expression {
     private boolean not = false;
     private Expression betweenExpressionStart;
     private Expression betweenExpressionEnd;
+    private boolean usingSymmetric = false;
+    private boolean usingAsymmetric = false;
 
     public Expression getBetweenExpressionEnd() {
         return betweenExpressionEnd;
@@ -55,6 +57,24 @@ public void setNot(boolean b) {
         not = b;
     }
 
+    public boolean isUsingSymmetric() {
+        return usingSymmetric;
+    }
+
+    public Between setUsingSymmetric(boolean usingSymmetric) {
+        this.usingSymmetric = usingSymmetric;
+        return this;
+    }
+
+    public boolean isUsingAsymmetric() {
+        return usingAsymmetric;
+    }
+
+    public Between setUsingAsymmetric(boolean usingAsymmetric) {
+        this.usingAsymmetric = usingAsymmetric;
+        return this;
+    }
+
     @Override
     public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
         return expressionVisitor.visit(this, context);
@@ -62,7 +82,9 @@ public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
 
     @Override
     public String toString() {
-        return leftExpression + " " + (not ? "NOT " : "") + "BETWEEN " + betweenExpressionStart
+        return leftExpression + " " + (not ? "NOT " : "") + "BETWEEN "
+                + (usingSymmetric ? "SYMMETRIC " : "") + (usingAsymmetric ? "ASYMMETRIC " : "")
+                + betweenExpressionStart
                 + " AND "
                 + betweenExpressionEnd;
     }
diff --git a/src/main/java/net/sf/jsqlparser/expression/operators/relational/ExpressionList.java b/src/main/java/net/sf/jsqlparser/expression/operators/relational/ExpressionList.java
index 2abbae1db..5efb04359 100644
--- a/src/main/java/net/sf/jsqlparser/expression/operators/relational/ExpressionList.java
+++ b/src/main/java/net/sf/jsqlparser/expression/operators/relational/ExpressionList.java
@@ -11,7 +11,7 @@
 
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.ExpressionVisitor;
-import net.sf.jsqlparser.parser.SimpleNode;
+import net.sf.jsqlparser.parser.Node;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -24,7 +24,7 @@
  */
 public class ExpressionList<T extends Expression> extends ArrayList<T>
         implements Expression, Serializable {
-    private transient SimpleNode node;
+    private transient Node node;
 
     public ExpressionList(Collection<? extends T> expressions) {
         addAll(expressions);
@@ -96,12 +96,12 @@ public String toString() {
 
 
     @Override
-    public SimpleNode getASTNode() {
+    public Node getASTNode() {
         return node;
     }
 
     @Override
-    public void setASTNode(SimpleNode node) {
+    public void setASTNode(Node node) {
         this.node = node;
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/expression/operators/relational/IsUnknownExpression.java b/src/main/java/net/sf/jsqlparser/expression/operators/relational/IsUnknownExpression.java
new file mode 100644
index 000000000..506d6e246
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/expression/operators/relational/IsUnknownExpression.java
@@ -0,0 +1,60 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.expression.operators.relational;
+
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
+
+public class IsUnknownExpression extends ASTNodeAccessImpl implements Expression {
+
+    private Expression leftExpression;
+    private boolean isNot = false;
+
+    public Expression getLeftExpression() {
+        return leftExpression;
+    }
+
+    public void setLeftExpression(Expression expression) {
+        leftExpression = expression;
+    }
+
+    public boolean isNot() {
+        return isNot;
+    }
+
+    public void setNot(boolean isNot) {
+        this.isNot = isNot;
+    }
+
+    @Override
+    public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
+        return expressionVisitor.visit(this, context);
+    }
+
+    @Override
+    public String toString() {
+        return leftExpression + " IS" + (isNot ? " NOT" : "") + " UNKNOWN";
+    }
+
+    public IsUnknownExpression withLeftExpression(Expression leftExpression) {
+        this.setLeftExpression(leftExpression);
+        return this;
+    }
+
+    public IsUnknownExpression withNot(boolean isNot) {
+        this.setNot(isNot);
+        return this;
+    }
+
+    public <E extends Expression> E getLeftExpression(Class<E> type) {
+        return type.cast(getLeftExpression());
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/parser/ASTNodeAccess.java b/src/main/java/net/sf/jsqlparser/parser/ASTNodeAccess.java
index 6b4993ed9..53eb89bb7 100644
--- a/src/main/java/net/sf/jsqlparser/parser/ASTNodeAccess.java
+++ b/src/main/java/net/sf/jsqlparser/parser/ASTNodeAccess.java
@@ -13,7 +13,7 @@
 
 public interface ASTNodeAccess extends Serializable {
 
-    SimpleNode getASTNode();
+    Node getASTNode();
 
-    void setASTNode(SimpleNode node);
+    void setASTNode(Node node);
 }
diff --git a/src/main/java/net/sf/jsqlparser/parser/ASTNodeAccessImpl.java b/src/main/java/net/sf/jsqlparser/parser/ASTNodeAccessImpl.java
index fb26ff2c2..6ef61996b 100644
--- a/src/main/java/net/sf/jsqlparser/parser/ASTNodeAccessImpl.java
+++ b/src/main/java/net/sf/jsqlparser/parser/ASTNodeAccessImpl.java
@@ -14,15 +14,15 @@
 
 public class ASTNodeAccessImpl implements ASTNodeAccess {
 
-    private transient SimpleNode node;
+    private transient Node node;
 
     @Override
-    public SimpleNode getASTNode() {
+    public Node getASTNode() {
         return node;
     }
 
     @Override
-    public void setASTNode(SimpleNode node) {
+    public void setASTNode(Node node) {
         this.node = node;
     }
 
@@ -30,10 +30,10 @@ public StringBuilder appendTo(StringBuilder builder) {
         // don't add spaces around the following punctuation
         final Set<String> punctuation = new TreeSet<>(Set.of(".", "[", "]"));
 
-        SimpleNode simpleNode = getASTNode();
-        if (simpleNode != null) {
-            Token token = simpleNode.jjtGetFirstToken();
-            Token lastToken = simpleNode.jjtGetLastToken();
+        Node Node = getASTNode();
+        if (Node != null) {
+            Token token = Node.jjtGetFirstToken();
+            Token lastToken = Node.jjtGetLastToken();
             Token prevToken = null;
             while (token.next != null && token.absoluteEnd <= lastToken.absoluteEnd) {
                 if (!punctuation.contains(token.image)
@@ -49,18 +49,18 @@ public StringBuilder appendTo(StringBuilder builder) {
     }
 
     public ASTNodeAccess getParent() {
-        SimpleNode parent = (SimpleNode) node.jjtGetParent();
+        Node parent = (Node) node.jjtGetParent();
         while (parent.jjtGetValue() == null) {
-            parent = (SimpleNode) parent.jjtGetParent();
+            parent = (Node) parent.jjtGetParent();
         }
 
         return ASTNodeAccess.class.cast(parent.jjtGetValue());
     }
 
     public <T extends ASTNodeAccess> T getParent(Class<T> clazz) {
-        SimpleNode parent = (SimpleNode) node.jjtGetParent();
+        Node parent = (Node) node.jjtGetParent();
         while (parent.jjtGetValue() == null || !clazz.isInstance(parent.jjtGetValue())) {
-            parent = (SimpleNode) parent.jjtGetParent();
+            parent = (Node) parent.jjtGetParent();
         }
 
         return clazz.cast(parent.jjtGetValue());
diff --git a/src/main/java/net/sf/jsqlparser/parser/AbstractJSqlParser.java b/src/main/java/net/sf/jsqlparser/parser/AbstractJSqlParser.java
index a39ac7e32..45580cb5e 100644
--- a/src/main/java/net/sf/jsqlparser/parser/AbstractJSqlParser.java
+++ b/src/main/java/net/sf/jsqlparser/parser/AbstractJSqlParser.java
@@ -21,6 +21,10 @@ public abstract class AbstractJSqlParser<P> {
     protected boolean errorRecovery = false;
     protected List<ParseException> parseErrors = new ArrayList<>();
 
+    public enum Dialect {
+        ORACLE, EXASOL
+    }
+
     public P withSquareBracketQuotation() {
         return withFeature(Feature.allowSquareBracketQuotation, true);
     }
@@ -57,6 +61,14 @@ public P withTimeOut(long timeOutMillSeconds) {
         return withFeature(Feature.timeOut, timeOutMillSeconds);
     }
 
+    public P withDialect(Dialect dialect) {
+        return withFeature(Feature.dialect, dialect.name());
+    }
+
+    public P withAllowedNestingDepth(int allowedNestingDepth) {
+        return withFeature(Feature.allowedNestingDepth, allowedNestingDepth);
+    }
+
     public P withBackslashEscapeCharacter() {
         return withFeature(Feature.allowBackslashEscapeCharacter, true);
     }
@@ -83,8 +95,21 @@ public P withFeature(Feature f, long value) {
         return me();
     }
 
+    public P withFeature(Feature f, String value) {
+        getConfiguration().setValue(f, value);
+        return me();
+    }
+
     public abstract FeatureConfiguration getConfiguration();
 
+    public FeatureConfiguration setValue(Feature feature, Object value) {
+        return getConfiguration().setValue(feature, value);
+    }
+
+    public Object getValue(Feature feature) {
+        return getConfiguration().getValue(feature);
+    }
+
     public abstract P me();
 
     public boolean getAsBoolean(Feature f) {
@@ -95,6 +120,18 @@ public Long getAsLong(Feature f) {
         return getConfiguration().getAsLong(f);
     }
 
+    public int getAsInt(Feature f) {
+        return getConfiguration().getAsInt(f);
+    }
+
+    public Integer getAsInteger(Feature f) {
+        return getConfiguration().getAsInteger(f);
+    }
+
+    public String getAsString(Feature f) {
+        return getConfiguration().getAsString(f);
+    }
+
     public void setErrorRecovery(boolean errorRecovery) {
         this.errorRecovery = errorRecovery;
     }
diff --git a/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java b/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java
index 50d583194..bdb25eeb4 100644
--- a/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java
+++ b/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java
@@ -40,7 +40,6 @@
 @SuppressWarnings("PMD.CyclomaticComplexity")
 public final class CCJSqlParserUtil {
     public final static Logger LOGGER = Logger.getLogger(CCJSqlParserUtil.class.getName());
-    public final static int ALLOWED_NESTING_DEPTH = 10;
 
     static {
         LOGGER.setLevel(Level.OFF);
@@ -50,7 +49,7 @@ private CCJSqlParserUtil() {}
 
     public static Statement parse(Reader statementReader) throws JSQLParserException {
         ExecutorService executorService = Executors.newSingleThreadExecutor();
-        Statement statement = null;
+        Statement statement;
         CCJSqlParser parser = new CCJSqlParser(new StreamProvider(statementReader));
         try {
             statement = parseStatement(parser, executorService);
@@ -86,7 +85,7 @@ public static Statement parse(String sql, Consumer<CCJSqlParser> consumer)
         }
 
         ExecutorService executorService = Executors.newSingleThreadExecutor();
-        Statement statement = null;
+        Statement statement;
         try {
             statement = parse(sql, executorService, consumer);
         } finally {
@@ -102,20 +101,22 @@ public static Statement parse(String sql, ExecutorService executorService,
             return null;
         }
 
-        Statement statement = null;
+        Statement statement;
         // first, try to parse fast and simple
         CCJSqlParser parser = newParser(sql);
         if (consumer != null) {
             consumer.accept(parser);
         }
-        boolean allowComplex = parser.getConfiguration().getAsBoolean(Feature.allowComplexParsing);
+        boolean allowComplex = parser.getAsBoolean(Feature.allowComplexParsing);
+        int allowedNestingDepth = parser.getAsInt(Feature.allowedNestingDepth);
         LOGGER.info("Allowed Complex Parsing: " + allowComplex);
         try {
             LOGGER.info("Trying SIMPLE parsing " + (allowComplex ? "first" : "only"));
             statement = parseStatement(parser.withAllowComplexParsing(false), executorService);
         } catch (JSQLParserException ex) {
             LOGGER.info("Nesting Depth" + getNestingDepth(sql));
-            if (allowComplex && getNestingDepth(sql) <= ALLOWED_NESTING_DEPTH) {
+            if (allowComplex
+                    && (allowedNestingDepth < 0 || getNestingDepth(sql) <= allowedNestingDepth)) {
                 LOGGER.info("Trying COMPLEX parsing when SIMPLE parsing failed");
                 // beware: the parser must not be reused, but needs to be re-initiated
                 parser = newParser(sql);
@@ -222,23 +223,21 @@ public static Expression parseExpression(String expressionStr, boolean allowPart
         } catch (JSQLParserException ex1) {
             // when fast simple parsing fails, try complex parsing but only if it has a chance to
             // succeed
-            if (getNestingDepth(expressionStr) <= ALLOWED_NESTING_DEPTH) {
-                CCJSqlParser parser = newParser(expressionStr).withAllowComplexParsing(true);
-                if (consumer != null) {
-                    consumer.accept(parser);
-                }
-                try {
-                    expression = parser.Expression();
-                    if (!allowPartialParse
-                            && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) {
-                        throw new JSQLParserException(
-                                "could only parse partial expression " + expression.toString());
-                    }
-                } catch (JSQLParserException ex) {
-                    throw ex;
-                } catch (ParseException ex) {
-                    throw new JSQLParserException(ex);
+            CCJSqlParser parser = newParser(expressionStr).withAllowComplexParsing(true);
+            if (consumer != null) {
+                consumer.accept(parser);
+            }
+            try {
+                expression = parser.Expression();
+                if (!allowPartialParse
+                        && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) {
+                    throw new JSQLParserException(
+                            "could only parse partial expression " + expression.toString());
                 }
+            } catch (JSQLParserException ex) {
+                throw ex;
+            } catch (ParseException ex) {
+                throw new JSQLParserException(ex);
             }
         }
         return expression;
@@ -301,24 +300,22 @@ public static Expression parseCondExpression(String conditionalExpressionStr,
                 throw new JSQLParserException(ex);
             }
         } catch (JSQLParserException ex1) {
-            if (getNestingDepth(conditionalExpressionStr) <= ALLOWED_NESTING_DEPTH) {
-                CCJSqlParser parser =
-                        newParser(conditionalExpressionStr).withAllowComplexParsing(true);
-                if (consumer != null) {
-                    consumer.accept(parser);
-                }
-                try {
-                    expression = parser.Expression();
-                    if (!allowPartialParse
-                            && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) {
-                        throw new JSQLParserException(
-                                "could only parse partial expression " + expression.toString());
-                    }
-                } catch (JSQLParserException ex) {
-                    throw ex;
-                } catch (ParseException ex) {
-                    throw new JSQLParserException(ex);
+            CCJSqlParser parser =
+                    newParser(conditionalExpressionStr).withAllowComplexParsing(true);
+            if (consumer != null) {
+                consumer.accept(parser);
+            }
+            try {
+                expression = parser.Expression();
+                if (!allowPartialParse
+                        && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) {
+                    throw new JSQLParserException(
+                            "could only parse partial expression " + expression.toString());
                 }
+            } catch (JSQLParserException ex) {
+                throw ex;
+            } catch (ParseException ex) {
+                throw new JSQLParserException(ex);
             }
         }
         return expression;
@@ -334,7 +331,7 @@ public static Expression parseCondExpression(String conditionalExpressionStr,
 
     public static Statement parseStatement(CCJSqlParser parser, ExecutorService executorService)
             throws JSQLParserException {
-        Statement statement = null;
+        Statement statement;
         Future<Statement> future = executorService.submit(new Callable<Statement>() {
             @Override
             public Statement call() throws ParseException {
@@ -342,7 +339,7 @@ public Statement call() throws ParseException {
             }
         });
         try {
-            statement = future.get(parser.getConfiguration().getAsLong(Feature.timeOut),
+            statement = future.get(parser.getAsLong(Feature.timeOut),
                     TimeUnit.MILLISECONDS);
         } catch (TimeoutException ex) {
             parser.interrupted = true;
@@ -397,7 +394,8 @@ public static Statements parseStatements(String sqls, ExecutorService executorSe
         if (consumer != null) {
             consumer.accept(parser);
         }
-        boolean allowComplex = parser.getConfiguration().getAsBoolean(Feature.allowComplexParsing);
+        boolean allowComplex = parser.getAsBoolean(Feature.allowComplexParsing);
+        int allowedNestingDepth = parser.getAsInt(Feature.allowedNestingDepth);
 
         // first, try to parse fast and simple
         try {
@@ -405,7 +403,8 @@ public static Statements parseStatements(String sqls, ExecutorService executorSe
         } catch (JSQLParserException ex) {
             // when fast simple parsing fails, try complex parsing but only if it has a chance to
             // succeed
-            if (allowComplex && getNestingDepth(sqls) <= ALLOWED_NESTING_DEPTH) {
+            if (allowComplex
+                    && (allowedNestingDepth < 0 || getNestingDepth(sqls) <= allowedNestingDepth)) {
                 // beware: parser must not be re-used but needs to be re-initiated
                 parser = newParser(sqls);
                 if (consumer != null) {
@@ -434,7 +433,7 @@ public Statements call() throws ParseException {
             }
         });
         try {
-            statements = future.get(parser.getConfiguration().getAsLong(Feature.timeOut),
+            statements = future.get(parser.getAsLong(Feature.timeOut),
                     TimeUnit.MILLISECONDS);
         } catch (TimeoutException ex) {
             parser.interrupted = true;
@@ -450,17 +449,14 @@ public static void streamStatements(StatementListener listener, InputStream is,
             throws JSQLParserException {
         try {
             CCJSqlParser parser = newParser(is, encoding);
-            while (true) {
+            do {
                 Statement stmt = parser.SingleStatement();
                 listener.accept(stmt);
                 if (parser.getToken(1).kind == CCJSqlParserTokenManager.ST_SEMICOLON) {
                     parser.getNextToken();
                 }
 
-                if (parser.getToken(1).kind == CCJSqlParserTokenManager.EOF) {
-                    break;
-                }
-            }
+            } while (parser.getToken(1).kind != CCJSqlParserTokenManager.EOF);
         } catch (Exception ex) {
             throw new JSQLParserException(ex);
         }
diff --git a/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java b/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java
index e8e3c39b7..bfaa4a647 100644
--- a/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java
+++ b/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java
@@ -56,6 +56,7 @@ public class ParserKeywordsUtils {
             {"CHECK", RESTRICTED_SQL2016},
             {"CONNECT", RESTRICTED_ALIAS},
             {"CONNECT_BY_ROOT", RESTRICTED_JSQLPARSER},
+            {"CSV", RESTRICTED_JSQLPARSER},
             {"PRIOR", RESTRICTED_JSQLPARSER},
             {"CONSTRAINT", RESTRICTED_SQL2016},
             {"CREATE", RESTRICTED_ALIAS},
@@ -63,14 +64,18 @@ public class ParserKeywordsUtils {
             {"CURRENT", RESTRICTED_JSQLPARSER},
             {"DEFAULT", RESTRICTED_ALIAS},
             {"DISTINCT", RESTRICTED_SQL2016},
+            {"DISTINCTROW", RESTRICTED_SQL2016},
             {"DOUBLE", RESTRICTED_ALIAS},
             {"ELSE", RESTRICTED_JSQLPARSER},
+            {"ERRORS", RESTRICTED_JSQLPARSER},
             {"EXCEPT", RESTRICTED_SQL2016},
             {"EXCLUDES", RESTRICTED_JSQLPARSER},
             {"EXISTS", RESTRICTED_SQL2016},
             {"EXTEND", RESTRICTED_JSQLPARSER},
             {"FALSE", RESTRICTED_SQL2016},
+            {"FBV", RESTRICTED_JSQLPARSER},
             {"FETCH", RESTRICTED_SQL2016},
+            {"FILE", RESTRICTED_JSQLPARSER},
             {"FINAL", RESTRICTED_JSQLPARSER},
             {"FOR", RESTRICTED_SQL2016},
             {"FORCE", RESTRICTED_SQL2016},
@@ -86,6 +91,7 @@ public class ParserKeywordsUtils {
             {"IIF", RESTRICTED_ALIAS},
             {"IGNORE", RESTRICTED_ALIAS},
             {"ILIKE", RESTRICTED_SQL2016},
+            {"IMPORT", RESTRICTED_JSQLPARSER},
             {"IN", RESTRICTED_SQL2016},
             {"INCLUDES", RESTRICTED_JSQLPARSER},
             {"INNER", RESTRICTED_SQL2016},
@@ -121,12 +127,14 @@ public class ParserKeywordsUtils {
             {"RETURNING", RESTRICTED_JSQLPARSER},
             {"RIGHT", RESTRICTED_SQL2016},
             {"SAMPLE", RESTRICTED_ALIAS},
+            {"SCRIPT", RESTRICTED_JSQLPARSER},
             {"SEL", RESTRICTED_ALIAS},
             {"SELECT", RESTRICTED_ALIAS},
             {"SEMI", RESTRICTED_JSQLPARSER},
             {"SET", RESTRICTED_JSQLPARSER},
             {"SOME", RESTRICTED_JSQLPARSER},
             {"START", RESTRICTED_JSQLPARSER},
+            {"STATEMENT", RESTRICTED_JSQLPARSER},
             {"TABLES", RESTRICTED_ALIAS},
             {"TOP", RESTRICTED_SQL2016},
             {"TRAILING", RESTRICTED_SQL2016},
@@ -134,6 +142,7 @@ public class ParserKeywordsUtils {
             {"UNBOUNDED", RESTRICTED_JSQLPARSER},
             {"UNION", RESTRICTED_SQL2016},
             {"UNIQUE", RESTRICTED_SQL2016},
+            {"UNKNOWN", RESTRICTED_SQL2016},
             {"UNPIVOT", RESTRICTED_JSQLPARSER},
             {"USE", RESTRICTED_JSQLPARSER},
             {"USING", RESTRICTED_SQL2016},
@@ -145,6 +154,7 @@ public class ParserKeywordsUtils {
             {"VALUE", RESTRICTED_JSQLPARSER},
             {"VALUES", RESTRICTED_SQL2016},
             {"VARYING", RESTRICTED_JSQLPARSER},
+            {"VERIFY", RESTRICTED_JSQLPARSER},
             {"WHEN", RESTRICTED_SQL2016},
             {"WHERE", RESTRICTED_SQL2016},
             {"WINDOW", RESTRICTED_SQL2016},
diff --git a/src/main/java/net/sf/jsqlparser/parser/SimpleCharStream.java b/src/main/java/net/sf/jsqlparser/parser/SimpleCharStream.java
index b96578e01..c10c568a6 100644
--- a/src/main/java/net/sf/jsqlparser/parser/SimpleCharStream.java
+++ b/src/main/java/net/sf/jsqlparser/parser/SimpleCharStream.java
@@ -2,29 +2,30 @@
  * #%L
  * JSQLParser library
  * %%
- * Copyright (C) 2004 - 2019 JSQLParser
+ * Copyright (C) 2004 - 2025 JSQLParser
  * %%
  * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
  * #L%
  */
+/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 8.0.0 */
 package net.sf.jsqlparser.parser;
 
-import java.io.IOException;
+/**
+ * An implementation of interface CharStream, where the stream is assumed to contain only ASCII
+ * characters (without unicode processing).
+ */
 
-@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.CyclomaticComplexity"})
 public class SimpleCharStream {
-
     /**
      * Whether parser is static.
      */
-    @SuppressWarnings("checkstyle:constantname")
     public static final boolean staticFlag = false;
     /**
      * Position in buffer.
      */
     public int bufpos = -1;
-    protected int bufline[];
-    protected int bufcolumn[];
+    protected int[] bufline;
+    protected int[] bufcolumn;
     protected int column = 0;
     protected int line = 1;
     protected boolean prevCharIsCR = false;
@@ -40,52 +41,30 @@ public class SimpleCharStream {
     int bufsize;
     int available;
     int tokenBegin;
-    private boolean isStringProvider;
 
     /**
-     * Constructor
-     *
-     * @param dstream
-     * @param startline
-     * @param startcolumn
-     * @param buffersize
+     * Constructor.
      */
-    public SimpleCharStream(Provider dstream, int startline,
-            int startcolumn, int buffersize) {
+    public SimpleCharStream(Provider dstream, int startline, int startcolumn, int buffersize) {
         inputStream = dstream;
-        isStringProvider = dstream instanceof StringProvider;
         line = startline;
         column = startcolumn - 1;
 
-        if (isStringProvider) {
-            int bs = ((StringProvider) inputStream)._string.length();
-            available = bufsize = bs;
-            bufline = new int[bs];
-            bufcolumn = new int[bs];
-        } else {
-            available = bufsize = buffersize;
-            buffer = new char[buffersize];
-            bufline = new int[buffersize];
-            bufcolumn = new int[buffersize];
-        }
+        available = bufsize = buffersize;
+        buffer = new char[buffersize];
+        bufline = new int[buffersize];
+        bufcolumn = new int[buffersize];
     }
 
     /**
-     * Constructor
-     *
-     * @param dstream
-     * @param startline
-     * @param startcolumn
+     * Constructor.
      */
-    public SimpleCharStream(Provider dstream, int startline,
-            int startcolumn) {
+    public SimpleCharStream(Provider dstream, int startline, int startcolumn) {
         this(dstream, startline, startcolumn, 4096);
     }
 
     /**
-     * Constructor
-     *
-     * @param dstream
+     * Constructor.
      */
     public SimpleCharStream(Provider dstream) {
         this(dstream, 1, 1, 4096);
@@ -103,10 +82,10 @@ public final int getAbsoluteTokenBegin() {
         return absoluteTokenBegin;
     }
 
-    protected void ExpandBuff(boolean wrapAround) throws IOException {
+    protected void ExpandBuff(boolean wrapAround) {
         char[] newbuffer = new char[bufsize + 2048];
-        int newbufline[] = new int[bufsize + 2048];
-        int newbufcolumn[] = new int[bufsize + 2048];
+        int[] newbufline = new int[bufsize + 2048];
+        int[] newbufcolumn = new int[bufsize + 2048];
 
         try {
             if (wrapAround) {
@@ -136,16 +115,17 @@ protected void ExpandBuff(boolean wrapAround) throws IOException {
                 maxNextCharInd = bufpos -= tokenBegin;
             }
         } catch (Throwable t) {
-            throw new IOException("Errow expanding the buffer.", t);
+            throw new Error(t.getMessage());
         }
 
+
         bufsize += 2048;
         available = bufsize;
         tokenBegin = 0;
     }
 
-    protected void FillBuff() throws IOException {
-        if (!isStringProvider && maxNextCharInd == available) {
+    protected void FillBuff() throws java.io.IOException {
+        if (maxNextCharInd == available) {
             if (available == bufsize) {
                 if (tokenBegin > 2048) {
                     bufpos = maxNextCharInd = 0;
@@ -166,23 +146,13 @@ protected void FillBuff() throws IOException {
 
         int i;
         try {
-            if (inputStream instanceof StringProvider) {
-                i = ((StringProvider) inputStream)._string.length();
-                if (maxNextCharInd == i) {
-                    throw new IOException();
-                }
-                maxNextCharInd = i;
+            if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1) {
+                inputStream.close();
+                throw new java.io.IOException();
             } else {
-                if ((i = inputStream.read(buffer, maxNextCharInd,
-                        available - maxNextCharInd)) == -1) {
-                    inputStream.close();
-                    throw new IOException();
-                } else {
-                    maxNextCharInd += i;
-                }
+                maxNextCharInd += i;
             }
-            return;
-        } catch (IOException e) {
+        } catch (java.io.IOException e) {
             --bufpos;
             backup(0);
             if (tokenBegin == -1) {
@@ -194,15 +164,14 @@ protected void FillBuff() throws IOException {
 
     /**
      * Start.
-     *
-     * @return the character read
-     * @throws IOException
      */
-    public char BeginToken() throws IOException {
+    public char BeginToken() throws java.io.IOException {
         tokenBegin = -1;
         char c = readChar();
         tokenBegin = bufpos;
+
         absoluteTokenBegin = totalCharsRead;
+
         return c;
     }
 
@@ -230,7 +199,7 @@ protected void UpdateLineColumn(char c) {
                 break;
             case '\t':
                 column--;
-                column += tabSize - (column % tabSize);
+                column += tabSize - column % tabSize;
                 break;
             default:
                 break;
@@ -240,21 +209,10 @@ protected void UpdateLineColumn(char c) {
         bufcolumn[bufpos] = column;
     }
 
-    private char readChar(int pos) {
-        if (this.inputStream instanceof StringProvider) {
-            return ((StringProvider) inputStream)._string.charAt(pos);
-        } else {
-            return buffer[pos];
-        }
-    }
-
     /**
      * Read a character.
-     *
-     * @return the character read
-     * @throws IOException
      */
-    public char readChar() throws IOException {
+    public char readChar() throws java.io.IOException {
         if (inBuf > 0) {
             --inBuf;
 
@@ -263,7 +221,8 @@ public char readChar() throws IOException {
             }
 
             totalCharsRead++;
-            return readChar(bufpos);
+
+            return buffer[bufpos];
         }
 
         if (++bufpos >= maxNextCharInd) {
@@ -272,53 +231,55 @@ public char readChar() throws IOException {
 
         totalCharsRead++;
 
-        char c = readChar(bufpos);
+        char c = buffer[bufpos];
 
         UpdateLineColumn(c);
         return c;
     }
 
+    @Deprecated
     /**
-     * @return the column
-     * @deprecated @see #getEndColumn
+     * @deprecated
+     * @see #getEndColumn
      */
-    @Deprecated
+
     public int getColumn() {
         return bufcolumn[bufpos];
     }
 
+    @Deprecated
     /**
-     * @return the line
-     * @deprecated @see #getEndLine
+     * @deprecated
+     * @see #getEndLine
      */
-    @Deprecated
+
     public int getLine() {
         return bufline[bufpos];
     }
 
     /**
-     * @return get token end column number.
+     * Get token end column number.
      */
     public int getEndColumn() {
         return bufcolumn[bufpos];
     }
 
     /**
-     * @return get token end line number.
+     * Get token end line number.
      */
     public int getEndLine() {
         return bufline[bufpos];
     }
 
     /**
-     * @return get token beginning column number.
+     * Get token beginning column number.
      */
     public int getBeginColumn() {
         return bufcolumn[tokenBegin];
     }
 
     /**
-     * @return get token beginning line number.
+     * Get token beginning line number.
      */
     public int getBeginLine() {
         return bufline[tokenBegin];
@@ -326,8 +287,6 @@ public int getBeginLine() {
 
     /**
      * Backup a number of characters.
-     *
-     * @param amount
      */
     public void backup(int amount) {
 
@@ -340,30 +299,17 @@ public void backup(int amount) {
 
     /**
      * Reinitialise.
-     *
-     * @param dstream
-     * @param startline
-     * @param startcolumn
-     * @param buffersize
      */
-    public void ReInit(Provider dstream, int startline,
-            int startcolumn, int buffersize) {
+    public void ReInit(Provider dstream, int startline, int startcolumn, int buffersize) {
         inputStream = dstream;
-        isStringProvider = dstream instanceof StringProvider;
         line = startline;
         column = startcolumn - 1;
-        if (isStringProvider) {
-            int bs = ((StringProvider) inputStream)._string.length();
-            available = bufsize = bs;
-            bufline = new int[bs];
-            bufcolumn = new int[bs];
-        } else {
-            if (buffer == null || buffersize != buffer.length) {
-                available = bufsize = buffersize;
-                buffer = new char[buffersize];
-                bufline = new int[buffersize];
-                bufcolumn = new int[buffersize];
-            }
+
+        if (buffer == null || buffersize != buffer.length) {
+            available = bufsize = buffersize;
+            buffer = new char[buffersize];
+            bufline = new int[buffersize];
+            bufcolumn = new int[buffersize];
         }
         prevCharIsLF = prevCharIsCR = false;
         tokenBegin = inBuf = maxNextCharInd = 0;
@@ -372,72 +318,42 @@ public void ReInit(Provider dstream, int startline,
 
     /**
      * Reinitialise.
-     *
-     * @param dstream
-     * @param startline
-     * @param startcolumn
      */
-    public void ReInit(Provider dstream, int startline,
-            int startcolumn) {
+    public void ReInit(Provider dstream, int startline, int startcolumn) {
         ReInit(dstream, startline, startcolumn, 4096);
     }
 
     /**
      * Reinitialise.
-     *
-     * @param dstream
      */
     public void ReInit(Provider dstream) {
         ReInit(dstream, 1, 1, 4096);
     }
 
+
     /**
-     * @return get token literal value.
+     * Get token literal value.
      */
     public String GetImage() {
-        if (isStringProvider) {
-            String data = ((StringProvider) inputStream)._string;
-            if (bufpos >= tokenBegin) {
-                return data.substring(tokenBegin, bufpos + 1);
-            } else {
-                return data.substring(tokenBegin, bufsize)
-                        + data.substring(0, bufpos + 1);
-            }
+        if (bufpos >= tokenBegin) {
+            return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
         } else {
-            if (bufpos >= tokenBegin) {
-                return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-            } else {
-                return new String(buffer, tokenBegin, bufsize - tokenBegin)
-                        + new String(buffer, 0, bufpos + 1);
-            }
+            return new String(buffer, tokenBegin, bufsize - tokenBegin)
+                    + new String(buffer, 0, bufpos + 1);
         }
     }
 
     /**
-     * @param len
-     * @return get the suffix.
+     * Get the suffix.
      */
     public char[] GetSuffix(int len) {
-
         char[] ret = new char[len];
 
-        if (isStringProvider) {
-            String str = ((StringProvider) inputStream)._string;
-            if ((bufpos + 1) >= len) {
-                str.getChars(bufpos - len + 1, bufpos - len + 1 + len, ret, 0);
-            } else {
-                str.getChars(bufsize - (len - bufpos - 1),
-                        bufsize - (len - bufpos - 1) + len - bufpos - 1, ret, 0);
-                str.getChars(0, bufpos + 1, ret, len - bufpos - 1);
-            }
+        if ((bufpos + 1) >= len) {
+            System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
         } else {
-            if ((bufpos + 1) >= len) {
-                System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-            } else {
-                System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                        len - bufpos - 1);
-                System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-            }
+            System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, len - bufpos - 1);
+            System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
         }
 
         return ret;
@@ -454,12 +370,8 @@ public void Done() {
 
     /**
      * Method to adjust line and column numbers for the start of a token.
-     *
-     * @param newLine
-     * @param newCol
      */
     public void adjustBeginLineColumn(int newLine, int newCol) {
-        int nl = newLine;
         int start = tokenBegin;
         int len;
 
@@ -471,12 +383,12 @@ public void adjustBeginLineColumn(int newLine, int newCol) {
 
         int i = 0;
         int j = 0;
-        int k = 0;
-        int nextColDiff = 0;
+        int k;
+        int nextColDiff;
         int columnDiff = 0;
 
         while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) {
-            bufline[j] = nl;
+            bufline[j] = newLine;
             nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
             bufcolumn[j] = newCol + columnDiff;
             columnDiff = nextColDiff;
@@ -484,14 +396,14 @@ public void adjustBeginLineColumn(int newLine, int newCol) {
         }
 
         if (i < len) {
-            bufline[j] = nl++;
+            bufline[j] = newLine++;
             bufcolumn[j] = newCol + columnDiff;
 
             while (i++ < len) {
                 if (bufline[j = start % bufsize] != bufline[++start % bufsize]) {
-                    bufline[j] = nl++;
+                    bufline[j] = newLine++;
                 } else {
-                    bufline[j] = nl;
+                    bufline[j] = newLine;
                 }
             }
         }
@@ -508,4 +420,4 @@ void setTrackLineColumn(boolean tlc) {
         trackLineColumn = tlc;
     }
 }
-/* JavaCC - OriginalChecksum=47e65cd0a1ed785f7a51c9e0c60893c9 (do not edit this line) */
+/* JavaCC - OriginalChecksum=0cd74e5ad7a4ccb9188541ab8f8b35eb (do not edit this line) */
diff --git a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
index 75b5c78a5..7f4cf2af0 100644
--- a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
+++ b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
@@ -792,6 +792,23 @@ public enum Feature {
      * allows sub selects without parentheses, e.g. `select * from dual where 1 = select 1`
      */
     allowUnparenthesizedSubSelects(false),
+
+    /**
+     * maximum nesting depth for trying complex parsing, can bet set to -1 to ignore
+     */
+    allowedNestingDepth(10),
+
+    dialect(null),
+
+    /**
+     * "IMPORT"
+     */
+    imprt,
+
+    /**
+     * "EXPORT"
+     */
+    export,
     ;
 
     private final Object value;
diff --git a/src/main/java/net/sf/jsqlparser/parser/feature/FeatureConfiguration.java b/src/main/java/net/sf/jsqlparser/parser/feature/FeatureConfiguration.java
index da5ddd2b0..0106431cc 100644
--- a/src/main/java/net/sf/jsqlparser/parser/feature/FeatureConfiguration.java
+++ b/src/main/java/net/sf/jsqlparser/parser/feature/FeatureConfiguration.java
@@ -19,7 +19,7 @@ public class FeatureConfiguration {
 
     private static final Logger LOG = Logger.getLogger(FeatureConfiguration.class.getName());
 
-    private Map<Feature, Object> featureEnabled = new EnumMap<>(Feature.class);
+    private final Map<Feature, Object> featureEnabled = new EnumMap<>(Feature.class);
 
     public FeatureConfiguration() {
         // set default-value for all switchable features
@@ -64,6 +64,14 @@ public Long getAsLong(Feature f) {
         return Long.valueOf(String.valueOf(getValue(f)));
     }
 
+    public int getAsInt(Feature f) {
+        return Integer.parseInt(String.valueOf(getValue(f)));
+    }
+
+    public Integer getAsInteger(Feature f) {
+        return Integer.parseInt(String.valueOf(getValue(f)));
+    }
+
     public String getAsString(Feature f) {
         Object value = getValue(f);
         return value == null ? null : String.valueOf(value);
diff --git a/src/main/java/net/sf/jsqlparser/schema/Column.java b/src/main/java/net/sf/jsqlparser/schema/Column.java
index 2aa0994cd..400d34c3a 100644
--- a/src/main/java/net/sf/jsqlparser/schema/Column.java
+++ b/src/main/java/net/sf/jsqlparser/schema/Column.java
@@ -29,6 +29,9 @@ public class Column extends ASTNodeAccessImpl implements Expression, MultiPartNa
     private ArrayConstructor arrayConstructor;
     private String tableDelimiter = ".";
 
+    // holds the physical table when resolved against an actual schema information
+    private Table resolvedTable = null;
+
     public Column() {}
 
     public Column(Table table, String columnName) {
@@ -223,4 +226,26 @@ public String getCommentText() {
     public void setCommentText(String commentText) {
         this.commentText = commentText;
     }
+
+    /**
+     * Gets the actual table when resolved against a physical schema information.
+     *
+     * @return the actual table when resolved against a physical schema information
+     */
+    public Table getResolvedTable() {
+        return resolvedTable;
+    }
+
+    /**
+     * Sets resolved table.
+     *
+     * @param resolvedTable the resolved table
+     * @return this column
+     */
+    public Column setResolvedTable(Table resolvedTable) {
+        // clone, not reference
+        this.resolvedTable =
+                resolvedTable != null ? new Table(resolvedTable.getFullyQualifiedName()) : null;
+        return this;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/schema/Table.java b/src/main/java/net/sf/jsqlparser/schema/Table.java
index 62580a642..cd0aa679d 100644
--- a/src/main/java/net/sf/jsqlparser/schema/Table.java
+++ b/src/main/java/net/sf/jsqlparser/schema/Table.java
@@ -10,6 +10,7 @@
 package net.sf.jsqlparser.schema;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -17,6 +18,7 @@
 import net.sf.jsqlparser.expression.MySQLIndexHint;
 import net.sf.jsqlparser.expression.SQLServerHints;
 import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
+import net.sf.jsqlparser.statement.ErrorDestination;
 import net.sf.jsqlparser.statement.select.FromItem;
 import net.sf.jsqlparser.statement.select.FromItemVisitor;
 import net.sf.jsqlparser.statement.select.IntoTableVisitor;
@@ -27,11 +29,9 @@
 /**
  * A table. It can have an alias and the schema name it belongs to.
  */
-public class Table extends ASTNodeAccessImpl implements FromItem, MultiPartName {
+public class Table extends ASTNodeAccessImpl
+        implements ErrorDestination, FromItem, MultiPartName, Cloneable {
 
-    // private Database database;
-    // private String schemaName;
-    // private String name;
     private static final int NAME_IDX = 0;
 
     private static final int SCHEMA_IDX = 1;
@@ -44,8 +44,14 @@ public class Table extends ASTNodeAccessImpl implements FromItem, MultiPartName
 
     private List<String> partDelimiters = new ArrayList<>();
 
+    // holds the various `time travel` syntax for BigQuery, RedShift, Snowflake or RedShift
+    private String timeTravelStr = null;
+
     private Alias alias;
 
+    // thank you, Google!
+    private String timeTravelStrAfterAlias = null;
+
     private SampleClause sampleClause;
 
     private Pivot pivot;
@@ -56,12 +62,27 @@ public class Table extends ASTNodeAccessImpl implements FromItem, MultiPartName
 
     private SQLServerHints sqlServerHints;
 
+    // holds the physical table when resolved against an actual schema information
+    private Table resolvedTable = null;
+
     public Table() {}
 
+    /**
+     * Instantiates a new Table.
+     *
+     * Sets the table name, splitting it into parts (catalog, schema, name) on `.` dots when quoted
+     * unless the system property `SPLIT_NAMES_ON_DELIMITER` points to `FALSE`
+     *
+     * @param name the table name, optionally quoted
+     */
     public Table(String name) {
         setName(name);
     }
 
+    public Table(String name, boolean splitNamesOnDelimiter) {
+        setName(name, splitNamesOnDelimiter);
+    }
+
     public Table(String schemaName, String name) {
         setSchemaName(schemaName);
         setName(name);
@@ -170,15 +191,35 @@ public String getName() {
     }
 
 
+    /**
+     * Sets the table name, splitting it into parts (catalog, schema, name) on `.` dots when quoted
+     * unless the system property `SPLIT_NAMES_ON_DELIMITER` points to `FALSE`
+     *
+     * @param name the table name, optionally quoted
+     */
     public void setName(String name) {
         // BigQuery seems to allow things like: `catalogName.schemaName.tableName` in only one pair
         // of quotes
-        if (MultiPartName.isQuoted(name) && name.contains(".")) {
+        // however, some people believe that Dots in Names are a good idea, so provide a switch-off
+        boolean splitNamesOnDelimiter = System.getProperty("SPLIT_NAMES_ON_DELIMITER") == null ||
+                !List
+                        .of("0", "N", "n", "FALSE", "false", "OFF", "off")
+                        .contains(System.getProperty("SPLIT_NAMES_ON_DELIMITER"));
+
+        setName(name, splitNamesOnDelimiter);
+    }
+
+    public void setName(String name, boolean splitNamesOnDelimiter) {
+        if (MultiPartName.isQuoted(name) && name.contains(".") && splitNamesOnDelimiter) {
             partItems.clear();
             for (String unquotedIdentifier : MultiPartName.unquote(name).split("\\.")) {
                 partItems.add("\"" + unquotedIdentifier + "\"");
             }
             Collections.reverse(partItems);
+        } else if (name.contains(".") && splitNamesOnDelimiter) {
+            partItems.clear();
+            partItems.addAll(Arrays.asList(MultiPartName.unquote(name).split("\\.")));
+            Collections.reverse(partItems);
         } else {
             setIndex(NAME_IDX, name);
         }
@@ -210,6 +251,15 @@ public void setAlias(Alias alias) {
         this.alias = alias;
     }
 
+    public String getTimeTravelStrAfterAlias() {
+        return timeTravelStrAfterAlias;
+    }
+
+    public Table setTimeTravelStrAfterAlias(String timeTravelStrAfterAlias) {
+        this.timeTravelStrAfterAlias = timeTravelStrAfterAlias;
+        return this;
+    }
+
     private void setIndex(int idx, String value) {
         int size = partItems.size();
         for (int i = 0; i < idx - size + 1; i++) {
@@ -270,6 +320,15 @@ public <T, S> T accept(IntoTableVisitor<T> intoTableVisitor, S context) {
         return intoTableVisitor.visit(this, context);
     }
 
+    public String getTimeTravel() {
+        return timeTravelStr;
+    }
+
+    public Table setTimeTravel(String timeTravelStr) {
+        this.timeTravelStr = timeTravelStr;
+        return this;
+    }
+
     @Override
     public Pivot getPivot() {
         return pivot;
@@ -322,10 +381,19 @@ public Table setSampleClause(SampleClause sampleClause) {
 
     public StringBuilder appendTo(StringBuilder builder) {
         builder.append(getFullyQualifiedName());
+
+        if (timeTravelStr != null) {
+            builder.append(" ").append(timeTravelStr);
+        }
+
         if (alias != null) {
             builder.append(alias);
         }
 
+        if (timeTravelStrAfterAlias != null) {
+            builder.append(" ").append(timeTravelStrAfterAlias);
+        }
+
         if (sampleClause != null) {
             sampleClause.appendTo(builder);
         }
@@ -380,4 +448,74 @@ public List<String> getNameParts() {
     public List<String> getNamePartDelimiters() {
         return partDelimiters;
     }
+
+    /**
+     * Gets the actual table when resolved against a physical schema information.
+     *
+     * @return the actual table when resolved against a physical schema information
+     */
+    public Table getResolvedTable() {
+        return resolvedTable;
+    }
+
+    /**
+     * Sets resolved table.
+     *
+     * @param resolvedTable the resolved table
+     * @return this table
+     */
+    public Table setResolvedTable(Table resolvedTable) {
+        // clone, not reference
+        if (resolvedTable != null) {
+            this.resolvedTable = new Table(resolvedTable.getFullyQualifiedName());
+        }
+        return this;
+    }
+
+    /**
+     * Sets a table's catalog and schema only when not set. Useful for setting CURRENT_SCHEMA() and
+     * CURRENT_DATABASE()
+     *
+     * @param currentCatalogName the catalog name
+     * @param currentSchemaName the schema name
+     * @return the provided table
+     */
+    public Table setUnsetCatalogAndSchema(String currentCatalogName, String currentSchemaName) {
+        String databaseName = getDatabaseName();
+        if (databaseName == null || databaseName.isEmpty()) {
+            setDatabaseName(currentCatalogName);
+        }
+
+        String schemaName = getSchemaName();
+        if (schemaName == null || schemaName.isEmpty()) {
+            setSchemaName(currentSchemaName);
+        }
+        return this;
+    }
+
+    /**
+     * Sets a tables' catalog and schema only when not set. Useful for setting CURRENT_SCHEMA() and
+     * CURRENT_DATABASE()
+     *
+     * @param currentCatalogName the current catalog name
+     * @param currentSchemaName the current schema name
+     * @param tables the tables
+     * @return the tables
+     */
+    public static Table[] setUnsetCatalogAndSchema(String currentCatalogName,
+            String currentSchemaName, Table... tables) {
+        for (Table t : tables) {
+            if (t != null) {
+                t.setUnsetCatalogAndSchema(currentCatalogName, currentSchemaName);
+            }
+        }
+        return tables;
+    }
+
+    @Override
+    public Table clone() {
+        Table clone = new Table(this.getFullyQualifiedName());
+        clone.setResolvedTable(this.resolvedTable != null ? this.resolvedTable.clone() : null);
+        return clone;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java
new file mode 100644
index 000000000..08c7f4d1d
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java
@@ -0,0 +1,91 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.StringValue;
+
+public class CSVColumn {
+    private Long startIndex;
+    private Long endIndex;
+    private StringValue format;
+    private String delimit;
+
+    public CSVColumn(Long startIndex, Long endIndex) {
+        this.startIndex = startIndex;
+        this.endIndex = endIndex;
+    }
+
+    public CSVColumn(Long index) {
+        this(index, null);
+    }
+
+    public Long getStartIndex() {
+        return startIndex;
+    }
+
+    public void setStartIndex(Long startIndex) {
+        this.startIndex = startIndex;
+    }
+
+    public Long getIndex() {
+        return getStartIndex();
+    }
+
+    public void setIndex(Long index) {
+        setStartIndex(index);
+    }
+
+    public Long getEndIndex() {
+        return endIndex;
+    }
+
+    public void setEndIndex(Long endIndex) {
+        this.endIndex = endIndex;
+    }
+
+    public StringValue getFormat() {
+        return format;
+    }
+
+    public void setFormat(StringValue format) {
+        this.format = format;
+    }
+
+    public String getDelimit() {
+        return delimit;
+    }
+
+    public void setDelimit(String delimit) {
+        this.delimit = delimit;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append(startIndex);
+        if (endIndex != null) {
+            sql.append(" .. ");
+            sql.append(endIndex);
+        } else if (format != null || delimit != null) {
+            if (format != null) {
+                sql.append(" FORMAT = ");
+                sql.append(format);
+            }
+
+            if (delimit != null) {
+                sql.append(" DELIMIT = ");
+                sql.append(delimit);
+            }
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java b/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java
new file mode 100644
index 000000000..697368f83
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java
@@ -0,0 +1,75 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.StringValue;
+
+public class CSVFileDestination implements ErrorDestination {
+    private ConnectionDefinition connectionDefinition;
+    private boolean local;
+    private boolean secure;
+    private StringValue file;
+
+    public ConnectionDefinition getConnectionDefinition() {
+        return connectionDefinition;
+    }
+
+    public void setConnectionDefinition(ConnectionDefinition connectionDefinition) {
+        this.connectionDefinition = connectionDefinition;
+    }
+
+    public boolean isLocal() {
+        return local;
+    }
+
+    public void setLocal(boolean local) {
+        this.local = local;
+    }
+
+    public boolean isSecure() {
+        return secure;
+    }
+
+    public void setSecure(boolean secure) {
+        this.secure = secure;
+    }
+
+    public StringValue getFile() {
+        return file;
+    }
+
+    public void setFile(StringValue file) {
+        this.file = file;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        if (local) {
+            sql.append("LOCAL ");
+            if (secure) {
+                sql.append("SECURE ");
+            }
+        }
+
+        sql.append("CSV");
+
+        if (connectionDefinition != null) {
+            sql.append(" ");
+            sql.append(connectionDefinition);
+        }
+
+        sql.append(" FILE ");
+        sql.append(file);
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java
new file mode 100644
index 000000000..7aabbb060
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java
@@ -0,0 +1,67 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.StringValue;
+
+import java.io.Serializable;
+
+public class CertificateVerification implements Serializable {
+    private Boolean ignoreCertificate;
+    private StringValue publicKey;
+
+    public StringValue getPublicKey() {
+        return publicKey;
+    }
+
+    public void setPublicKey(StringValue publicKey) {
+        this.publicKey = publicKey;
+    }
+
+    public Boolean getIgnoreCertificate() {
+        return ignoreCertificate;
+    }
+
+    public void setIgnoreCertificate(Boolean ignoreCertificate) {
+        this.ignoreCertificate = ignoreCertificate;
+    }
+
+    public Boolean getVerifyCertificate() {
+        return !ignoreCertificate;
+    }
+
+    public void setVerifyCertificate(Boolean verifyCertificate) {
+        this.ignoreCertificate = !verifyCertificate;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        if (ignoreCertificate != null) {
+            if (ignoreCertificate) {
+                sql.append("IGNORE ");
+            } else {
+                sql.append("VERIFY ");
+            }
+            sql.append("CERTIFICATE");
+        }
+
+        if (publicKey != null) {
+            if (ignoreCertificate != null) {
+                sql.append(" ");
+            }
+            sql.append("PUBLIC KEY ");
+            sql.append(publicKey);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java
new file mode 100644
index 000000000..82b65fbd7
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java
@@ -0,0 +1,37 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+public class CloudConnectionDefinition extends ConnectionDefinition {
+    private String storage;
+
+    public String getStorage() {
+        return storage;
+    }
+
+    public void setStorage(String storage) {
+        this.storage = storage;
+    }
+
+    @Override
+    public void setCertificateVerification(CertificateVerification certificateVerification) {}
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("AT CLOUD ");
+        sql.append(storage);
+        sql.append(" ");
+        appendConnectionDefinition(sql);
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java
new file mode 100644
index 000000000..f2887cf82
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java
@@ -0,0 +1,91 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.StringValue;
+
+import java.io.Serializable;
+
+public class ConnectionDefinition implements Serializable {
+    private String connectionObjectName;
+    private StringValue connectionDefinition;
+    private UserIdentification userIdentification;
+    private CertificateVerification certificateVerification;
+
+    public String getConnectionObjectName() {
+        return connectionObjectName;
+    }
+
+    public void setConnectionObjectName(String connectionObjectName) {
+        this.connectionObjectName = connectionObjectName;
+    }
+
+    public StringValue getConnectionDefinition() {
+        return connectionDefinition;
+    }
+
+    public void setConnectionDefinition(StringValue connectionDefinition) {
+        this.connectionDefinition = connectionDefinition;
+    }
+
+    public void setConnection(String connectionObjectName) {
+        this.connectionObjectName = connectionObjectName;
+    }
+
+    public void setConnection(StringValue connectionDefinition) {
+        this.connectionDefinition = connectionDefinition;
+    }
+
+    public UserIdentification getUserIdentification() {
+        return userIdentification;
+    }
+
+    public void setUserIdentification(UserIdentification userIdentification) {
+        this.userIdentification = userIdentification;
+    }
+
+    public CertificateVerification getCertificateVerification() {
+        return certificateVerification;
+    }
+
+    public void setCertificateVerification(CertificateVerification certificateVerification) {
+        this.certificateVerification = certificateVerification;
+    }
+
+    protected StringBuilder appendConnectionDefinition(StringBuilder sql) {
+        if (connectionObjectName != null) {
+            sql.append(connectionObjectName);
+        } else if (connectionDefinition != null) {
+            sql.append(connectionDefinition);
+        }
+
+        if (userIdentification != null) {
+            sql.append(" ");
+            sql.append(userIdentification);
+        }
+
+        if (certificateVerification != null) {
+            sql.append(" ");
+            sql.append(certificateVerification);
+        }
+
+        return sql;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("AT ");
+        appendConnectionDefinition(sql);
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java
new file mode 100644
index 000000000..f0e0d0cf1
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java
@@ -0,0 +1,60 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.StringValue;
+
+import java.util.List;
+
+public class ConnectionFileDefinition {
+    private ConnectionDefinition connectionDefinition;
+    private List<StringValue> filePaths;
+
+    public ConnectionFileDefinition(List<StringValue> filePaths) {
+        this(null, filePaths);
+    }
+
+    public ConnectionFileDefinition(ConnectionDefinition connectionDefinition,
+            List<StringValue> filePaths) {
+        this.connectionDefinition = connectionDefinition;
+        this.filePaths = filePaths;
+    }
+
+    public ConnectionDefinition getConnectionDefinition() {
+        return connectionDefinition;
+    }
+
+    public void setConnectionDefinition(ConnectionDefinition connectionDefinition) {
+        this.connectionDefinition = connectionDefinition;
+    }
+
+    public List<StringValue> getFilePaths() {
+        return filePaths;
+    }
+
+    public void setFilePaths(List<StringValue> filePaths) {
+        this.filePaths = filePaths;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        if (connectionDefinition != null) {
+            sql.append(connectionDefinition);
+        }
+
+        for (StringValue filePath : filePaths) {
+            sql.append(" FILE ").append(filePath);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/DBMSType.java b/src/main/java/net/sf/jsqlparser/statement/DBMSType.java
new file mode 100644
index 000000000..4b3d667da
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/DBMSType.java
@@ -0,0 +1,52 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.StringValue;
+
+public class DBMSType implements SourceDestinationType {
+    private final Kind dbmsType;
+    private StringValue jdbcDriverDefinition;
+
+    public DBMSType(String dbmsType) {
+        this(dbmsType, null);
+    }
+
+    public DBMSType(String dbmsType, String jdbcDriverDefinition) {
+        this.dbmsType = Kind.valueOf(dbmsType.toUpperCase());
+        if (jdbcDriverDefinition != null) {
+            this.jdbcDriverDefinition = new StringValue(jdbcDriverDefinition);
+        }
+    }
+
+    private enum Kind {
+        EXA, ORA, JDBC
+    }
+
+    public StringValue getJDBCDriverDefinition() {
+        return jdbcDriverDefinition;
+    }
+
+    public void setJDBCDriverDefinition(StringValue jdbcDriverDefinition) {
+        this.jdbcDriverDefinition = jdbcDriverDefinition;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append(dbmsType);
+        if (jdbcDriverDefinition != null) {
+            sql.append(" DRIVER = ").append(jdbcDriverDefinition);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/DeclareStatement.java b/src/main/java/net/sf/jsqlparser/statement/DeclareStatement.java
index d015dc561..27537bc5f 100644
--- a/src/main/java/net/sf/jsqlparser/statement/DeclareStatement.java
+++ b/src/main/java/net/sf/jsqlparser/statement/DeclareStatement.java
@@ -120,6 +120,8 @@ public List<TypeDefExpr> getTypeDefinitions() {
         return typeDefExprList;
     }
 
+
+
     @Override
     public String toString() {
         StringBuilder b = new StringBuilder("DECLARE ");
@@ -213,5 +215,17 @@ public TypeDefExpr(UserVariable userVariable, ColDataType colDataType,
             this.colDataType = colDataType;
             this.defaultExpr = defaultExpr;
         }
+
+        public UserVariable getUserVariable() {
+            return userVariable;
+        }
+
+        public ColDataType getColDataType() {
+            return colDataType;
+        }
+
+        public Expression getDefaultExpr() {
+            return defaultExpr;
+        }
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java b/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java
new file mode 100644
index 000000000..92db1a3dc
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java
@@ -0,0 +1,90 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.Expression;
+
+import java.io.Serializable;
+
+public class ErrorClause implements Serializable {
+    private ErrorDestination errorDestination;
+    private Expression expression;
+    private RejectClause rejectClause;
+    private boolean replace;
+    private boolean truncate;
+
+    public ErrorDestination getErrorDestination() {
+        return errorDestination;
+    }
+
+    public void setErrorDestination(ErrorDestination errorDestination) {
+        this.errorDestination = errorDestination;
+    }
+
+    public Expression getExpression() {
+        return expression;
+    }
+
+    public void setExpression(Expression expression) {
+        this.expression = expression;
+    }
+
+    public RejectClause getRejectClause() {
+        return rejectClause;
+    }
+
+    public void setRejectClause(RejectClause rejectClause) {
+        this.rejectClause = rejectClause;
+    }
+
+    public boolean isReplace() {
+        return replace;
+    }
+
+    public void setReplace(boolean replace) {
+        this.replace = replace;
+    }
+
+    public boolean isTruncate() {
+        return truncate;
+    }
+
+    public void setTruncate(boolean truncate) {
+        this.truncate = truncate;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        if (errorDestination != null) {
+            sql.append("ERRORS INTO ");
+            sql.append(errorDestination);
+            if (expression != null) {
+                sql.append(" (");
+                sql.append(expression);
+                sql.append(")");
+            }
+
+            if (replace) {
+                sql.append(" REPLACE");
+            } else if (truncate) {
+                sql.append(" TRUNCATE");
+            }
+        }
+
+        if (rejectClause != null) {
+            sql.append(" ");
+            sql.append(rejectClause);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java b/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java
new file mode 100644
index 000000000..258a39ebb
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java
@@ -0,0 +1,13 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+public interface ErrorDestination {
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java b/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java
new file mode 100644
index 000000000..a1846efd9
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java
@@ -0,0 +1,98 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+import net.sf.jsqlparser.expression.StringValue;
+
+public class FBVColumn {
+    private boolean precedesComma;
+    private String key;
+    private Expression value;
+    private String stringValue;
+
+    private FBVColumn(String key, Expression value) {
+        this.key = key;
+        this.value = value;
+        this.stringValue = null;
+    }
+
+    public FBVColumn(String key, String value) {
+        this.key = key;
+        this.value = null;
+        this.stringValue = value;
+    }
+
+    public FBVColumn(String key, StringValue value) {
+        this(key, (Expression) value);
+    }
+
+    public FBVColumn(String key, LongValue value) {
+        this(key, (Expression) value);
+    }
+
+    public boolean precedesComma() {
+        return precedesComma;
+    }
+
+    public void setPrecedesComma(boolean precedesComma) {
+        this.precedesComma = precedesComma;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public Expression getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.stringValue = value;
+        this.value = null;
+    }
+
+    private void setValue(Expression value) {
+        this.value = value;
+        this.stringValue = null;
+    }
+
+    public void setValue(StringValue value) {
+        setValue((Expression) value);
+    }
+
+    public void setValue(LongValue value) {
+        setValue((Expression) value);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        if (precedesComma) {
+            sql.append(", ");
+        }
+
+        sql.append(key);
+        sql.append(" = ");
+        if (stringValue != null) {
+            sql.append(stringValue);
+        } else {
+            sql.append(value);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/FileOption.java b/src/main/java/net/sf/jsqlparser/statement/FileOption.java
new file mode 100644
index 000000000..ff91f571b
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/FileOption.java
@@ -0,0 +1,85 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+import net.sf.jsqlparser.expression.StringValue;
+
+public class FileOption {
+    private String key;
+    private Expression value;
+    private String stringValue;
+
+    private FileOption(String key, Expression value) {
+        this.key = key;
+        this.value = value;
+        this.stringValue = null;
+    }
+
+    public FileOption(String key, String value) {
+        this.key = key;
+        this.value = null;
+        this.stringValue = value;
+    }
+
+    public FileOption(String key) {
+        this(key, (Expression) null);
+    }
+
+    public FileOption(String key, StringValue value) {
+        this(key, (Expression) value);
+    }
+
+    public FileOption(String key, LongValue value) {
+        this(key, (Expression) value);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public Expression getValue() {
+        return value;
+    }
+
+    public void setValue(StringValue value) {
+        this.value = value;
+    }
+
+    public void setValue(LongValue value) {
+        this.value = value;
+    }
+
+    public void setValue(String value) {
+        this.stringValue = value;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append(key);
+        if (value != null || stringValue != null) {
+            sql.append(" = ");
+            if (stringValue != null) {
+                sql.append(stringValue);
+            } else {
+                sql.append(value);
+            }
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java b/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java
new file mode 100644
index 000000000..d5a79ed8f
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java
@@ -0,0 +1,133 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.statement.select.PlainSelect;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
+
+public abstract class FileSourceDestination implements Serializable {
+    private SourceDestinationType type;
+    private List<ConnectionFileDefinition> connectionFileDefinitions;
+    private Boolean local;
+    private Boolean secure;
+    private List<CSVColumn> csvColumns;
+    private List<FBVColumn> fbvColumns;
+    private List<FileOption> fileOptions;
+    private CertificateVerification certificateVerification;
+
+    protected SourceDestinationType getType() {
+        return type;
+    }
+
+    protected void setType(SourceDestinationType type) {
+        this.type = type;
+    }
+
+    public List<ConnectionFileDefinition> getConnectionFileDefinitions() {
+        return connectionFileDefinitions;
+    }
+
+    public void setConnectionFileDefinitions(
+            List<ConnectionFileDefinition> connectionFileDefinitions) {
+        this.connectionFileDefinitions = connectionFileDefinitions;
+    }
+
+    public Boolean isLocal() {
+        return local;
+    }
+
+    public void setLocal(Boolean local) {
+        this.local = local;
+    }
+
+    public Boolean isSecure() {
+        return secure;
+    }
+
+    public void setSecure(Boolean secure) {
+        this.secure = secure;
+    }
+
+    public List<CSVColumn> getCSVColumns() {
+        return csvColumns;
+    }
+
+    public void setCSVColumns(List<CSVColumn> csvColumns) {
+        this.csvColumns = csvColumns;
+    }
+
+    public List<FBVColumn> getFBVColumns() {
+        return fbvColumns;
+    }
+
+    public void setFBVColumns(List<FBVColumn> fbvColumns) {
+        this.fbvColumns = fbvColumns;
+    }
+
+    public List<FileOption> getFileOptions() {
+        return fileOptions;
+    }
+
+    public void setFileOptions(List<FileOption> fileOptions) {
+        this.fileOptions = fileOptions;
+    }
+
+    public CertificateVerification getCertificateVerification() {
+        return certificateVerification;
+    }
+
+    public void setCertificateVerification(CertificateVerification certificateVerification) {
+        this.certificateVerification = certificateVerification;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        if (local != null) {
+            if (local) {
+                sql.append("LOCAL ");
+            }
+
+            if (Objects.requireNonNullElse(secure, false)) {
+                sql.append("SECURE ");
+            }
+        }
+
+        sql.append(type);
+        if (connectionFileDefinitions != null) {
+            sql.append(" ");
+            PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false);
+        }
+
+        if (csvColumns != null) {
+            sql.append(" ");
+            PlainSelect.appendStringListTo(sql, csvColumns, true, true);
+        } else if (fbvColumns != null) {
+            sql.append(" ");
+            PlainSelect.appendStringListTo(sql, fbvColumns, false, true);
+        }
+
+        if (fileOptions != null) {
+            sql.append(" ");
+            PlainSelect.appendStringListTo(sql, fileOptions, false, false);
+        }
+
+        if (certificateVerification != null) {
+            sql.append(" ");
+            sql.append(certificateVerification);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/FileType.java b/src/main/java/net/sf/jsqlparser/statement/FileType.java
new file mode 100644
index 000000000..7ea1535f9
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/FileType.java
@@ -0,0 +1,27 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+public class FileType implements SourceDestinationType {
+    private final Kind fileType;
+
+    public FileType(String fileType) {
+        this.fileType = Kind.valueOf(fileType.toUpperCase());
+    }
+
+    private enum Kind {
+        CSV, FBV
+    }
+
+    @Override
+    public String toString() {
+        return fileType.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java
new file mode 100644
index 000000000..448b4de72
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java
@@ -0,0 +1,142 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.imprt.ImportColumn;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SelectItem;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Exasol Like Clause
+ *
+ * @see <a href="https://docs.exasol.com/db/latest/sql/create_table.htm">Like Clause in CREATE
+ *      TABLE</a>
+ * @see <a href="https://docs.exasol.com/db/latest/sql/import.htm">Like Clause in IMPORT</a>
+ */
+public class LikeClause implements ImportColumn, Serializable {
+    private Table table;
+    private List<SelectItem<Column>> columnsList;
+
+    private Boolean includingDefaults;
+    private Boolean includingIdentity;
+    private Boolean includingComments;
+
+    public Table getTable() {
+        return table;
+    }
+
+    public void setTable(Table table) {
+        this.table = table;
+    }
+
+    public List<SelectItem<Column>> getColumnsList() {
+        return columnsList;
+    }
+
+    public void setColumnsList(List<SelectItem<Column>> columnsList) {
+        this.columnsList = columnsList;
+    }
+
+    public Boolean isIncludingDefaults() {
+        return includingDefaults;
+    }
+
+    public void setIncludingDefaults(Boolean includingDefaults) {
+        this.includingDefaults = includingDefaults;
+    }
+
+    public Boolean isExcludingDefaults() {
+        return includingDefaults == null ? null : !includingDefaults;
+    }
+
+    public void setExcludingDefaults(Boolean excludingDefaults) {
+        this.includingDefaults = !excludingDefaults;
+    }
+
+    public Boolean isIncludingIdentity() {
+        return includingIdentity;
+    }
+
+    public void setIncludingIdentity(Boolean includingIdentity) {
+        this.includingIdentity = includingIdentity;
+    }
+
+    public Boolean isExcludingIdentity() {
+        return includingIdentity == null ? null : !includingIdentity;
+    }
+
+    public void setExcludingIdentity(Boolean excludingIdentity) {
+        this.includingIdentity = !excludingIdentity;
+    }
+
+    public Boolean isIncludingComments() {
+        return includingComments;
+    }
+
+    public void setIncludingComments(Boolean includingComments) {
+        this.includingComments = includingComments;
+    }
+
+    public Boolean isExcludingComments() {
+        return includingComments == null ? null : !includingComments;
+    }
+
+    public void setExcludingComments(Boolean excludingComments) {
+        this.includingComments = !excludingComments;
+    }
+
+    public StringBuilder appendTo(StringBuilder builder) {
+        builder.append(" LIKE ");
+        builder.append(table);
+        if (columnsList != null) {
+            builder.append(" ");
+            PlainSelect.appendStringListTo(builder, columnsList, true, true);
+        }
+
+        if (includingDefaults != null) {
+            if (includingDefaults) {
+                builder.append(" INCLUDING ");
+            } else {
+                builder.append(" EXCLUDING ");
+            }
+            builder.append(" DEFAULTS ");
+        }
+
+        if (includingIdentity != null) {
+            if (includingIdentity) {
+                builder.append(" INCLUDING ");
+            } else {
+                builder.append(" EXCLUDING ");
+            }
+            builder.append(" IDENTITY ");
+        }
+
+        if (includingComments != null) {
+            if (includingComments) {
+                builder.append(" INCLUDING ");
+            } else {
+                builder.append(" EXCLUDING ");
+            }
+            builder.append(" COMMENTS ");
+        }
+
+        return builder;
+    }
+
+    @Override
+    public String toString() {
+        return appendTo(new StringBuilder()).toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/RejectClause.java b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java
new file mode 100644
index 000000000..5ca9f9714
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java
@@ -0,0 +1,53 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.LongValue;
+
+import java.io.Serializable;
+
+public class RejectClause implements Serializable {
+    private LongValue limit;
+    private boolean errors;
+
+    public LongValue getLimit() {
+        return limit;
+    }
+
+    public void setLimit(LongValue limit) {
+        this.limit = limit;
+    }
+
+    public boolean isErrors() {
+        return errors;
+    }
+
+    public void setErrors(boolean errors) {
+        this.errors = errors;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("REJECT LIMIT ");
+        if (limit != null) {
+            sql.append(limit);
+        } else {
+            sql.append("UNLIMITED");
+        }
+
+        if (errors) {
+            sql.append(" ERRORS");
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java b/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java
new file mode 100644
index 000000000..c1193b037
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java
@@ -0,0 +1,99 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.StringValue;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.export.ExportIntoItem;
+import net.sf.jsqlparser.statement.imprt.ImportFromItem;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class ScriptSourceDestination implements ImportFromItem, ExportIntoItem, Serializable {
+    private Table script;
+    private ConnectionDefinition connectionDefinition;
+    private List<String> properties;
+    private List<StringValue> values;
+    private ErrorClause errorClause;
+
+    public Table getScript() {
+        return script;
+    }
+
+    public void setScript(Table script) {
+        this.script = script;
+    }
+
+    public ConnectionDefinition getConnectionDefinition() {
+        return connectionDefinition;
+    }
+
+    public void setConnectionDefinition(ConnectionDefinition connectionDefinition) {
+        this.connectionDefinition = connectionDefinition;
+    }
+
+    public List<String> getProperties() {
+        return properties;
+    }
+
+    public void setProperties(List<String> properties) {
+        this.properties = properties;
+    }
+
+    public List<StringValue> getValues() {
+        return values;
+    }
+
+    public void setValues(List<StringValue> values) {
+        this.values = values;
+    }
+
+    @Override
+    public ErrorClause getErrorClause() {
+        return errorClause;
+    }
+
+    @Override
+    public void setErrorClause(ErrorClause errorClause) {
+        this.errorClause = errorClause;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("SCRIPT ");
+        sql.append(script);
+
+        if (connectionDefinition != null) {
+            sql.append(" ");
+            sql.append(connectionDefinition);
+        }
+
+        if (properties != null && values != null) {
+            sql.append(" WITH");
+
+            int max = Math.min(properties.size(), values.size());
+            for (int i = 0; i < max; i++) {
+                sql.append(" ");
+                sql.append(properties.get(i));
+                sql.append(" = ");
+                sql.append(values.get(i));
+            }
+        }
+
+        if (errorClause != null) {
+            sql.append(errorClause);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/SessionStatement.java b/src/main/java/net/sf/jsqlparser/statement/SessionStatement.java
new file mode 100644
index 000000000..873c18245
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/SessionStatement.java
@@ -0,0 +1,60 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+public class SessionStatement implements Statement {
+    public enum Action {
+        START, APPLY, DROP, SHOW, DESCRIBE;
+
+        public static Action from(String flag) {
+            return Enum.valueOf(Action.class, flag.toUpperCase());
+        }
+    }
+
+    final private Action action;
+    final private String id;
+
+    public SessionStatement(Action action, String id) {
+        this.action = action;
+        this.id = id;
+    }
+
+    public SessionStatement(String action, String id) {
+        this(Action.from(action), id);
+    }
+
+    public SessionStatement(String action) {
+        this(action, null);
+    }
+
+
+    public Action getAction() {
+        return action;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
+        return statementVisitor.visit(this, context);
+    }
+
+    @Override
+    public void accept(StatementVisitor<?> statementVisitor) {
+        Statement.super.accept(statementVisitor);
+    }
+
+    @Override
+    public String toString() {
+        return "SESSION " + action + " " + (id != null ? id : "") + ";";
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java b/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java
new file mode 100644
index 000000000..743d21378
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java
@@ -0,0 +1,13 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+public interface SourceDestinationType {
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java
index e8be0a5cb..0068e0cf6 100644
--- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java
@@ -27,7 +27,9 @@
 import net.sf.jsqlparser.statement.delete.ParenthesedDelete;
 import net.sf.jsqlparser.statement.drop.Drop;
 import net.sf.jsqlparser.statement.execute.Execute;
+import net.sf.jsqlparser.statement.export.Export;
 import net.sf.jsqlparser.statement.grant.Grant;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
 import net.sf.jsqlparser.statement.merge.Merge;
@@ -323,4 +325,22 @@ default void visit(ParenthesedUpdate parenthesedUpdate) {
     default void visit(ParenthesedDelete parenthesedDelete) {
         this.visit(parenthesedDelete, null);
     }
+
+    <S> T visit(SessionStatement sessionStatement, S context);
+
+    default void visit(SessionStatement sessionStatement) {
+        this.visit(sessionStatement, null);
+    }
+
+    <S> T visit(Import imprt, S context);
+
+    default void visit(Import imprt) {
+        this.visit(imprt, null);
+    }
+
+    <S> T visit(Export export, S context);
+
+    default void visit(Export export) {
+        this.visit(export, null);
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java
index 0e6ab8698..012abff28 100644
--- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java
@@ -9,6 +9,10 @@
  */
 package net.sf.jsqlparser.statement;
 
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Partition;
 import net.sf.jsqlparser.statement.alter.Alter;
 import net.sf.jsqlparser.statement.alter.AlterSession;
 import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
@@ -27,12 +31,26 @@
 import net.sf.jsqlparser.statement.delete.ParenthesedDelete;
 import net.sf.jsqlparser.statement.drop.Drop;
 import net.sf.jsqlparser.statement.execute.Execute;
+import net.sf.jsqlparser.statement.export.Export;
 import net.sf.jsqlparser.statement.grant.Grant;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.insert.Insert;
+import net.sf.jsqlparser.statement.insert.InsertConflictAction;
 import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
 import net.sf.jsqlparser.statement.merge.Merge;
+import net.sf.jsqlparser.statement.merge.MergeOperationVisitor;
+import net.sf.jsqlparser.statement.merge.MergeOperationVisitorAdapter;
 import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
+import net.sf.jsqlparser.statement.select.FromItemVisitor;
+import net.sf.jsqlparser.statement.select.FromItemVisitorAdapter;
+import net.sf.jsqlparser.statement.select.PivotVisitor;
+import net.sf.jsqlparser.statement.select.PivotVisitorAdapter;
 import net.sf.jsqlparser.statement.select.Select;
+import net.sf.jsqlparser.statement.select.SelectItemVisitor;
+import net.sf.jsqlparser.statement.select.SelectItemVisitorAdapter;
+import net.sf.jsqlparser.statement.select.SelectVisitor;
+import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
+import net.sf.jsqlparser.statement.select.WithItem;
 import net.sf.jsqlparser.statement.show.ShowIndexStatement;
 import net.sf.jsqlparser.statement.show.ShowTablesStatement;
 import net.sf.jsqlparser.statement.truncate.Truncate;
@@ -40,8 +58,48 @@
 import net.sf.jsqlparser.statement.update.Update;
 import net.sf.jsqlparser.statement.upsert.Upsert;
 
+import java.util.List;
+
 @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
 public class StatementVisitorAdapter<T> implements StatementVisitor<T> {
+    private final ExpressionVisitor<T> expressionVisitor;
+    private final PivotVisitor<T> pivotVisitor;
+    private final SelectItemVisitor<T> selectItemVisitor;
+    private final FromItemVisitor<T> fromItemVisitor;
+    private final SelectVisitor<T> selectVisitor;
+    private final MergeOperationVisitor<T> mergeOperationVisitor;
+
+    public StatementVisitorAdapter() {
+        this.expressionVisitor = new ExpressionVisitorAdapter<>();
+        this.pivotVisitor = new PivotVisitorAdapter<>(this.expressionVisitor);
+        this.selectItemVisitor = new SelectItemVisitorAdapter<>(this.expressionVisitor);
+        this.fromItemVisitor = new FromItemVisitorAdapter<>();
+
+        this.selectVisitor = new SelectVisitorAdapter<>(this.expressionVisitor, this.pivotVisitor,
+                this.selectItemVisitor, this.fromItemVisitor);
+        this.mergeOperationVisitor = new MergeOperationVisitorAdapter<>();
+    }
+
+    public StatementVisitorAdapter(ExpressionVisitor<T> expressionVisitor,
+            PivotVisitor<T> pivotVisitor, SelectItemVisitor<T> selectItemVisitor,
+            FromItemVisitor<T> fromItemVisitor, SelectVisitor<T> selectVisitor,
+            MergeOperationVisitor<T> mergeOperationVisitor) {
+        this.expressionVisitor = expressionVisitor;
+        this.pivotVisitor = pivotVisitor;
+        this.selectItemVisitor = selectItemVisitor;
+        this.fromItemVisitor = fromItemVisitor;
+        this.selectVisitor = selectVisitor;
+        this.mergeOperationVisitor = mergeOperationVisitor;
+    }
+
+    public StatementVisitorAdapter(SelectVisitorAdapter<T> selectVisitor) {
+        this.selectVisitor = selectVisitor;
+        this.expressionVisitor = selectVisitor.getExpressionVisitor();
+        this.pivotVisitor = selectVisitor.getPivotVisitor();
+        this.selectItemVisitor = selectVisitor.getSelectItemVisitor();
+        this.fromItemVisitor = selectVisitor.getFromItemVisitor();
+        this.mergeOperationVisitor = new MergeOperationVisitorAdapter<>();
+    }
 
     @Override
     public <S> T visit(Comment comment, S context) {
@@ -57,56 +115,138 @@ public <S> T visit(Commit commit, S context) {
 
     @Override
     public <S> T visit(Select select, S context) {
-
-        return null;
+        return select.accept(selectVisitor, context);
     }
 
     @Override
     public <S> T visit(Delete delete, S context) {
+        visitWithItems(delete.getWithItemsList(), context);
+        fromItemVisitor.visitTables(delete.getTables(), context);
+        selectVisitor.visitOutputClause(delete.getOutputClause(), context);
+        fromItemVisitor.visitFromItem(delete.getTable(), context);
+        fromItemVisitor.visitTables(delete.getUsingList(), context);
+        fromItemVisitor.visitJoins(delete.getJoins(), context);
+        expressionVisitor.visitExpression(delete.getWhere(), context);
+
+        expressionVisitor.visitPreferringClause(delete.getPreferringClause(), context);
+
+        expressionVisitor.visitOrderBy(delete.getOrderByElements(), context);
+
+        expressionVisitor.visitLimit(delete.getLimit(), context);
 
         return null;
     }
 
+    private <S> void visitWithItems(List<WithItem<?>> withItemsList, S context) {
+        if (withItemsList != null) {
+            for (WithItem<?> item : withItemsList) {
+                item.accept(this, context);
+            }
+        }
+    }
+
     @Override
     public <S> T visit(ParenthesedDelete delete, S context) {
+        delete.getDelete().accept(this, context);
+        return null;
+    }
 
+    @Override
+    public <S> T visit(SessionStatement sessionStatement, S context) {
         return null;
     }
 
     @Override
     public <S> T visit(Update update, S context) {
-
+        visitWithItems(update.getWithItemsList(), context);
+        fromItemVisitor.visitFromItem(update.getTable(), context);
+        fromItemVisitor.visitJoins(update.getStartJoins(), context);
+        expressionVisitor.visitUpdateSets(update.getUpdateSets(), context);
+        selectVisitor.visitOutputClause(update.getOutputClause(), context);
+        fromItemVisitor.visitFromItem(update.getFromItem(), context);
+        fromItemVisitor.visitJoins(update.getJoins(), context);
+        expressionVisitor.visitExpression(update.getWhere(), context);
+        expressionVisitor.visitPreferringClause(update.getPreferringClause(), context);
+        expressionVisitor.visitOrderBy(update.getOrderByElements(), context);
+        expressionVisitor.visitLimit(update.getLimit(), context);
+        visitReturningClause(update.getReturningClause(), context);
         return null;
     }
 
     @Override
     public <S> T visit(ParenthesedUpdate update, S context) {
-
-        return null;
+        return update.getUpdate().accept(this, context);
     }
 
     @Override
     public <S> T visit(Insert insert, S context) {
+        visitWithItems(insert.getWithItemsList(), context);
+
+        insert.getTable().accept(fromItemVisitor, context);
+        fromItemVisitor.visitFromItem(insert.getTable(), context);
+
+        if (insert.getColumns() != null) {
+            for (Column column : insert.getColumns()) {
+                column.accept(expressionVisitor, context);
+            }
+        }
+
+        if (insert.getPartitions() != null) {
+            for (Partition partition : insert.getPartitions()) {
+                partition.getColumn().accept(expressionVisitor, context);
+                if (partition.getValue() != null) {
+                    partition.getValue().accept(expressionVisitor, context);
+                }
+            }
+        }
+
+        selectVisitor.visitOutputClause(insert.getOutputClause(), context);
+
+        if (insert.getSelect() != null) {
+            insert.getSelect().accept(selectVisitor, null);
+        }
 
+        expressionVisitor.visitUpdateSets(insert.getSetUpdateSets(), context);
+
+        expressionVisitor.visitUpdateSets(insert.getDuplicateUpdateSets(), context);
+
+        final InsertConflictAction conflictAction = insert.getConflictAction();
+        if (conflictAction != null) {
+            expressionVisitor.visitExpression(conflictAction.getWhereExpression(), context);
+            expressionVisitor.visitUpdateSets(conflictAction.getUpdateSets(), context);
+        }
+
+        visitReturningClause(insert.getReturningClause(), context);
+        return null;
+    }
+
+    private <S> T visitReturningClause(ReturningClause returningClause, S context) {
+        if (returningClause!=null) {
+            returningClause.forEach(selectItem -> selectItem.accept(selectItemVisitor, context));
+            // @todo: verify why this is a list of strings and not columns
+        }
         return null;
     }
 
     @Override
     public <S> T visit(ParenthesedInsert insert, S context) {
-
+        insert.getInsert().accept(this, context);
         return null;
     }
 
     @Override
     public <S> T visit(Drop drop, S context) {
+        if (drop.getType().equalsIgnoreCase("table")) {
+            fromItemVisitor.visitFromItem(drop.getName(), context);
+        }
+        // @todo: handle schemas
 
         return null;
     }
 
     @Override
     public <S> T visit(Truncate truncate, S context) {
-
-        return null;
+        return truncate.getTable().accept(fromItemVisitor, context);
     }
 
     @Override
@@ -122,13 +262,11 @@ public <S> T visit(CreateSchema createSchema, S context) {
 
     @Override
     public <S> T visit(CreateTable createTable, S context) {
-
-        return null;
+        return createTable.getTable().accept(fromItemVisitor, context);
     }
 
     @Override
     public <S> T visit(CreateView createView, S context) {
-
         return null;
     }
 
@@ -166,7 +304,12 @@ public <S> T visit(ResetStatement reset, S context) {
 
     @Override
     public <S> T visit(Merge merge, S context) {
-
+        visitWithItems(merge.getWithItemsList(), context);
+        fromItemVisitor.visitFromItem(merge.getTable(), context);
+        fromItemVisitor.visitFromItem(merge.getFromItem(), context);
+        expressionVisitor.visitExpression(merge.getOnCondition(), context);
+        mergeOperationVisitor.visit(merge.getOperations(), context);
+        selectVisitor.visitOutputClause(merge.getOutputClause(), context);
         return null;
     }
 
@@ -308,4 +451,14 @@ public <S> T visit(UnsupportedStatement unsupportedStatement, S context) {
     public <S> T visit(RefreshMaterializedViewStatement materializedView, S context) {
         return null;
     }
+
+    @Override
+    public <S> T visit(Import imprt, S context) {
+        return null;
+    }
+
+    @Override
+    public <S> T visit(Export export, S context) {
+        return null;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java b/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java
new file mode 100644
index 000000000..d951931d9
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java
@@ -0,0 +1,48 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.expression.StringValue;
+
+import java.io.Serializable;
+
+public class UserIdentification implements Serializable {
+    private StringValue user;
+    private StringValue password;
+
+    public StringValue getUser() {
+        return user;
+    }
+
+    public void setUser(StringValue user) {
+        this.user = user;
+    }
+
+    public StringValue getPassword() {
+        return password;
+    }
+
+    public void setPassword(StringValue password) {
+        this.password = password;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("USER ");
+        sql.append(user);
+
+        sql.append(" IDENTIFIED BY ");
+        sql.append(password);
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java
index 3a8f25910..372d9c790 100644
--- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java
+++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java
@@ -9,6 +9,18 @@
  */
 package net.sf.jsqlparser.statement.alter;
 
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.statement.ReferentialAction;
 import net.sf.jsqlparser.statement.ReferentialAction.Action;
 import net.sf.jsqlparser.statement.ReferentialAction.Type;
@@ -18,9 +30,6 @@
 import net.sf.jsqlparser.statement.create.table.PartitionDefinition;
 import net.sf.jsqlparser.statement.select.PlainSelect;
 
-import java.io.Serializable;
-import java.util.*;
-
 @SuppressWarnings({"PMD.CyclomaticComplexity"})
 public class AlterExpression implements Serializable {
 
@@ -34,6 +43,9 @@ public class AlterExpression implements Serializable {
     private List<ColumnDataType> colDataTypeList;
     private List<ColumnDropNotNull> columnDropNotNullList;
     private List<ColumnDropDefault> columnDropDefaultList;
+    private List<ColumnSetDefault> columnSetDefaultList;
+    private List<ColumnSetVisibility> columnSetVisibilityList;
+
     private List<String> pkColumns;
     private List<String> ukColumns;
     private String ukName;
@@ -60,6 +72,7 @@ public class AlterExpression implements Serializable {
 
     private String characterSet;
     private String collation;
+    private boolean defaultCollateSpecified;
     private String lockOption;
     private String algorithmOption;
     private String engineOption;
@@ -74,6 +87,22 @@ public class AlterExpression implements Serializable {
 
     private boolean useIfNotExists = false;
 
+    private String partitionType;
+    private Expression partitionExpression;
+    private List<String> partitionColumns;
+    private int coalescePartitionNumber;
+
+    private String exchangePartitionTableName;
+    private boolean exchangePartitionWithValidation;
+    private boolean exchangePartitionWithoutValidation;
+
+    private int keyBlockSize;
+
+    private String constraintSymbol;
+    private boolean enforced;
+    private String constraintType;
+    private boolean invisible;
+
     public Index getOldIndex() {
         return oldIndex;
     }
@@ -288,6 +317,10 @@ public void addColDropNotNull(ColumnDropNotNull columnDropNotNull) {
         columnDropNotNullList.add(columnDropNotNull);
     }
 
+    public List<ColumnDropDefault> getColumnDropDefaultList() {
+        return columnDropDefaultList;
+    }
+
     public void addColDropDefault(ColumnDropDefault columnDropDefault) {
         if (columnDropDefaultList == null) {
             columnDropDefaultList = new ArrayList<>();
@@ -295,6 +328,28 @@ public void addColDropDefault(ColumnDropDefault columnDropDefault) {
         columnDropDefaultList.add(columnDropDefault);
     }
 
+    public void addColSetDefault(ColumnSetDefault columnSetDefault) {
+        if (columnSetDefaultList == null) {
+            columnSetDefaultList = new ArrayList<>();
+        }
+        columnSetDefaultList.add(columnSetDefault);
+    }
+
+    public List<ColumnSetDefault> getColumnSetDefaultList() {
+        return columnSetDefaultList;
+    }
+
+    public void addColSetVisibility(ColumnSetVisibility columnSetVisibility) {
+        if (columnSetVisibilityList == null) {
+            columnSetVisibilityList = new ArrayList<>();
+        }
+        columnSetVisibilityList.add(columnSetVisibility);
+    }
+
+    public List<ColumnSetVisibility> getColumnSetVisibilityList() {
+        return columnSetVisibilityList;
+    }
+
     public List<String> getFkSourceColumns() {
         return fkSourceColumns;
     }
@@ -432,6 +487,14 @@ public void setCollation(String collation) {
         this.collation = collation;
     }
 
+    public void setDefaultCollateSpecified(boolean value) {
+        this.defaultCollateSpecified = value;
+    }
+
+    public boolean isDefaultCollateSpecified() {
+        return defaultCollateSpecified;
+    }
+
     public String getLockOption() {
         return lockOption;
     }
@@ -485,6 +548,102 @@ public AlterExpression withUserIfNotExists(boolean userIfNotExists) {
         return this;
     }
 
+    public void setPartitionType(String partitionType) {
+        this.partitionType = partitionType;
+    }
+
+    public String getPartitionType() {
+        return partitionType;
+    }
+
+    public void setPartitionExpression(Expression partitionExpression) {
+        this.partitionExpression = partitionExpression;
+    }
+
+    public Expression getPartitionExpression() {
+        return partitionExpression;
+    }
+
+    public void setPartitionColumns(List<String> partitionColumns) {
+        this.partitionColumns = partitionColumns;
+    }
+
+    public List<String> getPartitionColumns() {
+        return partitionColumns;
+    }
+
+    public void setExchangePartitionTableName(String exchangePartitionTableName) {
+        this.exchangePartitionTableName = exchangePartitionTableName;
+    }
+
+    public String getExchangePartitionTableName() {
+        return exchangePartitionTableName;
+    }
+
+    public void setCoalescePartitionNumber(int coalescePartitionNumber) {
+        this.coalescePartitionNumber = coalescePartitionNumber;
+    }
+
+    public int getCoalescePartitionNumber() {
+        return coalescePartitionNumber;
+    }
+
+    public void setExchangePartitionWithValidation(boolean exchangePartitionWithValidation) {
+        this.exchangePartitionWithValidation = exchangePartitionWithValidation;
+    }
+
+    public boolean isExchangePartitionWithValidation() {
+        return exchangePartitionWithValidation;
+    }
+
+    public void setExchangePartitionWithoutValidation(boolean exchangePartitionWithoutValidation) {
+        this.exchangePartitionWithoutValidation = exchangePartitionWithoutValidation;
+    }
+
+    public boolean isExchangePartitionWithoutValidation() {
+        return exchangePartitionWithoutValidation;
+    }
+
+    public void setKeyBlockSize(int keyBlockSize) {
+        this.keyBlockSize = keyBlockSize;
+    }
+
+    public int getKeyBlockSize() {
+        return keyBlockSize;
+    }
+
+    public String getConstraintSymbol() {
+        return constraintSymbol;
+    }
+
+    public void setConstraintSymbol(String constraintSymbol) {
+        this.constraintSymbol = constraintSymbol;
+    }
+
+    public boolean isEnforced() {
+        return enforced;
+    }
+
+    public void setEnforced(boolean enforced) {
+        this.enforced = enforced;
+    }
+
+    public String getConstraintType() {
+        return constraintType;
+    }
+
+    public void setConstraintType(String constraintType) {
+        this.constraintType = constraintType;
+    }
+
+    public boolean isInvisible() {
+        return invisible;
+    }
+
+    public void setInvisible(boolean invisible) {
+        this.invisible = invisible;
+    }
+
     @Override
     @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity",
             "PMD.ExcessiveMethodLength", "PMD.SwitchStmtsShouldHaveDefault"})
@@ -494,8 +653,58 @@ public String toString() {
 
         if (operation == AlterOperation.UNSPECIFIC) {
             b.append(optionalSpecifier);
+        } else if (operation == AlterOperation.ALTER && constraintType != null
+                && constraintSymbol != null) {
+            // This is for ALTER INDEX ... INVISIBLE
+            b.append("ALTER ").append(constraintType).append(" ").append(constraintSymbol);
+
+            if (invisible) {
+                b.append(" INVISIBLE");
+            } else if (!isEnforced()) {
+                b.append(" NOT ENFORCED");
+            } else if (enforced) {
+                b.append(" ENFORCED");
+            }
+        } else if (operation == AlterOperation.ADD && constraintType != null
+                && constraintSymbol != null) {
+            b.append("ADD CONSTRAINT ").append(constraintType).append(" ").append(constraintSymbol)
+                    .append(" ");
+
+            if (index != null && index.getColumnsNames() != null) {
+                b.append(" ")
+                        .append(PlainSelect.getStringList(index.getColumnsNames(), true, true));
+            }
+        } else if (operation == AlterOperation.ALTER
+                && columnDropDefaultList != null && !columnDropDefaultList.isEmpty()) {
+            b.append("ALTER ");
+            if (hasColumn) {
+                b.append("COLUMN ");
+            }
+            b.append(PlainSelect.getStringList(columnDropDefaultList));
+        } else if (operation == AlterOperation.ALTER
+                && columnSetDefaultList != null && !columnSetDefaultList.isEmpty()) {
+            b.append("ALTER ");
+            if (hasColumn) {
+                b.append("COLUMN ");
+            }
+            b.append(PlainSelect.getStringList(columnSetDefaultList));
+        } else if (operation == AlterOperation.ALTER
+                && columnSetVisibilityList != null && !columnSetVisibilityList.isEmpty()) {
+            b.append("ALTER ");
+            if (hasColumn) {
+                b.append("COLUMN ");
+            }
+            b.append(PlainSelect.getStringList(columnSetVisibilityList));
         } else if (operation == AlterOperation.SET_TABLE_OPTION) {
             b.append(tableOption);
+        } else if (operation == AlterOperation.DISCARD_TABLESPACE) {
+            b.append("DISCARD TABLESPACE");
+        } else if (operation == AlterOperation.IMPORT_TABLESPACE) {
+            b.append("IMPORT TABLESPACE");
+        } else if (operation == AlterOperation.DISABLE_KEYS) {
+            b.append("DISABLE KEYS");
+        } else if (operation == AlterOperation.ENABLE_KEYS) {
+            b.append("ENABLE KEYS");
         } else if (operation == AlterOperation.ENGINE) {
             b.append("ENGINE ");
             if (useEqual) {
@@ -508,6 +717,12 @@ public String toString() {
                 b.append("= ");
             }
             b.append(algorithmOption);
+        } else if (operation == AlterOperation.KEY_BLOCK_SIZE) {
+            b.append("KEY_BLOCK_SIZE ");
+            if (useEqual) {
+                b.append("= ");
+            }
+            b.append(keyBlockSize);
         } else if (operation == AlterOperation.LOCK) {
             b.append("LOCK ");
             if (useEqual) {
@@ -560,6 +775,17 @@ public String toString() {
                 }
                 b.append(getCollation());
             }
+        } else if (operation == AlterOperation.COLLATE) {
+            if (isDefaultCollateSpecified()) {
+                b.append("DEFAULT ");
+            }
+            b.append("COLLATE ");
+            if (hasEqualForCollate) {
+                b.append("= ");
+            }
+            if (getCollation() != null) {
+                b.append(getCollation());
+            }
         } else if (operation == AlterOperation.DROP_UNIQUE) {
 
             b.append("DROP UNIQUE (").append(PlainSelect.getStringList(pkColumns)).append(')');
@@ -570,9 +796,63 @@ public String toString() {
                 && !pkColumns.isEmpty()) {
             // Oracle Multi Column Drop
             b.append("DROP (").append(PlainSelect.getStringList(pkColumns)).append(')');
+        } else if (operation == AlterOperation.DISCARD_PARTITION && partitions != null) {
+            b.append("DISCARD PARTITION ").append(PlainSelect.getStringList(partitions));
+            if (tableOption != null) {
+                b.append(" ").append(tableOption);
+            }
+        } else if (operation == AlterOperation.IMPORT_PARTITION) {
+            b.append("IMPORT PARTITION ").append(PlainSelect.getStringList(partitions));
+            if (tableOption != null) {
+                b.append(" ").append(tableOption);
+            }
         } else if (operation == AlterOperation.TRUNCATE_PARTITION
                 && partitions != null) {
             b.append("TRUNCATE PARTITION ").append(PlainSelect.getStringList(partitions));
+        } else if (operation == AlterOperation.COALESCE_PARTITION) {
+            b.append("COALESCE PARTITION ").append(coalescePartitionNumber);
+        } else if (operation == AlterOperation.REORGANIZE_PARTITION
+                && partitions != null
+                && partitionDefinitions != null) {
+            b.append("REORGANIZE PARTITION ")
+                    .append(PlainSelect.getStringList(partitions))
+                    .append(" INTO (")
+                    .append(partitionDefinitions.stream()
+                            .map(PartitionDefinition::toString)
+                            .collect(Collectors.joining(", ")))
+                    .append(")");
+        } else if (operation == AlterOperation.EXCHANGE_PARTITION) {
+            b.append("EXCHANGE PARTITION ");
+            b.append(partitions.get(0)).append(" WITH TABLE ").append(exchangePartitionTableName);
+            if (exchangePartitionWithValidation) {
+                b.append(" WITH VALIDATION ");
+            } else if (exchangePartitionWithoutValidation) {
+                b.append(" WITHOUT VALIDATION ");
+            }
+        } else if (operation == AlterOperation.ANALYZE_PARTITION && partitions != null) {
+            b.append("ANALYZE PARTITION ").append(PlainSelect.getStringList(partitions));
+        } else if (operation == AlterOperation.CHECK_PARTITION && partitions != null) {
+            b.append("CHECK PARTITION ").append(PlainSelect.getStringList(partitions));
+        } else if (operation == AlterOperation.OPTIMIZE_PARTITION && partitions != null) {
+            b.append("OPTIMIZE PARTITION ").append(PlainSelect.getStringList(partitions));
+        } else if (operation == AlterOperation.REBUILD_PARTITION && partitions != null) {
+            b.append("REBUILD PARTITION ").append(PlainSelect.getStringList(partitions));
+        } else if (operation == AlterOperation.REPAIR_PARTITION && partitions != null) {
+            b.append("REPAIR PARTITION ").append(PlainSelect.getStringList(partitions));
+        } else if (operation == AlterOperation.REMOVE_PARTITIONING) {
+            b.append("REMOVE PARTITIONING");
+        } else if (operation == AlterOperation.PARTITION_BY) {
+            b.append("PARTITION BY ").append(partitionType).append(" ");
+            if (partitionExpression != null) {
+                b.append("(").append(partitionExpression).append(") ");
+            } else if (partitionColumns != null && !partitionColumns.isEmpty()) {
+                b.append("COLUMNS(").append(String.join(", ", partitionColumns)).append(") ");
+            }
+
+            b.append("(").append(partitionDefinitions.stream()
+                    .map(PartitionDefinition::toString)
+                    .collect(Collectors.joining(", ")))
+                    .append(")");
         } else {
             if (operation == AlterOperation.COMMENT_WITH_EQUAL_SIGN) {
                 b.append("COMMENT =").append(" ");
@@ -974,6 +1254,52 @@ public String toString() {
         }
     }
 
+    public static final class ColumnSetDefault implements Serializable {
+        private final String columnName;
+        private final String defaultValue;
+
+        public ColumnSetDefault(String columnName, String defaultValue) {
+            this.columnName = columnName;
+            this.defaultValue = defaultValue;
+        }
+
+        public String getColumnName() {
+            return columnName;
+        }
+
+        public String getDefaultValue() {
+            return defaultValue;
+        }
+
+        @Override
+        public String toString() {
+            return columnName + " SET DEFAULT " + defaultValue;
+        }
+    }
+
+    public static final class ColumnSetVisibility implements Serializable {
+        private final String columnName;
+        private final boolean visible;
+
+        public ColumnSetVisibility(String columnName, boolean visible) {
+            this.columnName = columnName;
+            this.visible = visible;
+        }
+
+        public String getColumnName() {
+            return columnName;
+        }
+
+        public boolean isVisible() {
+            return visible;
+        }
+
+        @Override
+        public String toString() {
+            return columnName + " SET " + (visible ? " VISIBLE" : " INVISIBLE");
+        }
+    }
+
     public enum ConvertType {
         CONVERT_TO, DEFAULT_CHARACTER_SET, CHARACTER_SET
     }
diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java
index 053f6892a..839685b1a 100644
--- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java
+++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java
@@ -10,7 +10,7 @@
 package net.sf.jsqlparser.statement.alter;
 
 public enum AlterOperation {
-    ADD, ALTER, DROP, DROP_PRIMARY_KEY, DROP_UNIQUE, DROP_FOREIGN_KEY, MODIFY, CHANGE, CONVERT, ALGORITHM, RENAME, RENAME_TABLE, RENAME_INDEX, RENAME_KEY, RENAME_CONSTRAINT, COMMENT, COMMENT_WITH_EQUAL_SIGN, UNSPECIFIC, ADD_PARTITION, DROP_PARTITION, TRUNCATE_PARTITION, SET_TABLE_OPTION, ENGINE, FORCE, LOCK;
+    ADD, ALTER, DROP, DROP_PRIMARY_KEY, DROP_UNIQUE, DROP_FOREIGN_KEY, MODIFY, CHANGE, CONVERT, COLLATE, ALGORITHM, RENAME, RENAME_TABLE, RENAME_INDEX, RENAME_KEY, RENAME_CONSTRAINT, COMMENT, COMMENT_WITH_EQUAL_SIGN, UNSPECIFIC, ADD_PARTITION, DROP_PARTITION, DISCARD_PARTITION, IMPORT_PARTITION, TRUNCATE_PARTITION, COALESCE_PARTITION, REORGANIZE_PARTITION, EXCHANGE_PARTITION, ANALYZE_PARTITION, CHECK_PARTITION, OPTIMIZE_PARTITION, REBUILD_PARTITION, REPAIR_PARTITION, REMOVE_PARTITIONING, PARTITION_BY, SET_TABLE_OPTION, ENGINE, FORCE, KEY_BLOCK_SIZE, LOCK, DISCARD_TABLESPACE, IMPORT_TABLESPACE, DISABLE_KEYS, ENABLE_KEYS;
 
     public static AlterOperation from(String operation) {
         return Enum.valueOf(AlterOperation.class, operation.toUpperCase());
diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/CheckConstraint.java b/src/main/java/net/sf/jsqlparser/statement/create/table/CheckConstraint.java
index b81f7132d..b803a1f7b 100644
--- a/src/main/java/net/sf/jsqlparser/statement/create/table/CheckConstraint.java
+++ b/src/main/java/net/sf/jsqlparser/statement/create/table/CheckConstraint.java
@@ -101,4 +101,8 @@ public CheckConstraint withIndexSpec(List<String> idxSpec) {
         return (CheckConstraint) super.withIndexSpec(idxSpec);
     }
 
+    @Override
+    public CheckConstraint withIndexKeyword(String indexKeyword) {
+        return (CheckConstraint) super.withIndexKeyword(indexKeyword);
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java b/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java
index 90a0e0e40..a7f47104c 100644
--- a/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java
+++ b/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java
@@ -9,6 +9,7 @@
  */
 package net.sf.jsqlparser.statement.create.table;
 
+import net.sf.jsqlparser.statement.imprt.ImportColumn;
 import net.sf.jsqlparser.statement.select.PlainSelect;
 
 import java.io.Serializable;
@@ -21,7 +22,7 @@
 /**
  * Globally used definition class for columns.
  */
-public class ColumnDefinition implements Serializable {
+public class ColumnDefinition implements ImportColumn, Serializable {
 
     private String columnName;
     private ColDataType colDataType;
diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/ExcludeConstraint.java b/src/main/java/net/sf/jsqlparser/statement/create/table/ExcludeConstraint.java
index 0ec34dd24..4cdc37bc4 100644
--- a/src/main/java/net/sf/jsqlparser/statement/create/table/ExcludeConstraint.java
+++ b/src/main/java/net/sf/jsqlparser/statement/create/table/ExcludeConstraint.java
@@ -90,4 +90,8 @@ public ExcludeConstraint withName(String name) {
         return (ExcludeConstraint) super.withName(name);
     }
 
+    @Override
+    public ExcludeConstraint withIndexKeyword(String indexKeyword) {
+        return (ExcludeConstraint) super.withIndexKeyword(indexKeyword);
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java b/src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java
index eb9f20c4b..c877a1ad9 100644
--- a/src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java
+++ b/src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java
@@ -204,4 +204,8 @@ public ForeignKeyIndex withIndexSpec(List<String> idxSpec) {
         return (ForeignKeyIndex) super.withIndexSpec(idxSpec);
     }
 
+    @Override
+    public ForeignKeyIndex withIndexKeyword(String indexKeyword) {
+        return (ForeignKeyIndex) super.withIndexKeyword(indexKeyword);
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/Index.java b/src/main/java/net/sf/jsqlparser/statement/create/table/Index.java
index ec7a2d606..b39a3014e 100644
--- a/src/main/java/net/sf/jsqlparser/statement/create/table/Index.java
+++ b/src/main/java/net/sf/jsqlparser/statement/create/table/Index.java
@@ -28,6 +28,7 @@ public class Index implements Serializable {
     private List<ColumnParams> columns;
     private List<String> idxSpec;
     private String commentText;
+    private String indexKeyword;
 
     public List<String> getColumnsNames() {
         return columns.stream()
@@ -36,7 +37,11 @@ public List<String> getColumnsNames() {
     }
 
     public void setColumnsNames(List<String> list) {
-        columns = list.stream().map(ColumnParams::new).collect(toList());
+        if (list == null) {
+            this.columns = Collections.emptyList();
+        } else {
+            this.columns = list.stream().map(ColumnParams::new).collect(toList());
+        }
     }
 
     @Deprecated
@@ -80,7 +85,9 @@ public String getName() {
 
     public void setName(String name) {
         this.name.clear();
-        this.name.add(name);
+        if (name != null) {
+            this.name.add(name);
+        }
     }
 
     public void setName(List<String> name) {
@@ -133,18 +140,35 @@ public Index withIndexSpec(List<String> idxSpec) {
         return this;
     }
 
+    public void setIndexKeyword(String indexKeyword) {
+        this.indexKeyword = indexKeyword;
+    }
+
+    public String getIndexKeyword() {
+        return indexKeyword;
+    }
+
+    public Index withIndexKeyword(String indexKeyword) {
+        this.setIndexKeyword(indexKeyword);
+        return this;
+    }
+
     @Override
     public String toString() {
         String idxSpecText = PlainSelect.getStringList(idxSpec, false, false);
-        String head = (type != null ? type : "") + (!name.isEmpty() ? " " + getName() : "");
-        String tail = PlainSelect.getStringList(columns, true, true)
-                + (!"".equals(idxSpecText) ? " " + idxSpecText : "");
-
-        if ("".equals(tail)) {
-            return head;
-        }
-
-        return head + " " + tail;
+        String keyword = (indexKeyword != null) ? " " + indexKeyword : "";
+        String head =
+                (type != null ? type : "") +
+                        keyword +
+                        (!name.isEmpty() ? " " + getName() : "") +
+                        (using != null ? " USING " + using : "");
+
+        String tail = (columns != null && !columns.isEmpty()
+                ? PlainSelect.getStringList(columns, true, true)
+                : "")
+                + (!idxSpecText.isEmpty() ? " " + idxSpecText : "");
+
+        return tail.isEmpty() ? head : head + " " + tail;
     }
 
     public Index withType(String type) {
diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/NamedConstraint.java b/src/main/java/net/sf/jsqlparser/statement/create/table/NamedConstraint.java
index 026d56631..ee2cce33b 100644
--- a/src/main/java/net/sf/jsqlparser/statement/create/table/NamedConstraint.java
+++ b/src/main/java/net/sf/jsqlparser/statement/create/table/NamedConstraint.java
@@ -70,4 +70,8 @@ public NamedConstraint withIndexSpec(List<String> idxSpec) {
         return (NamedConstraint) super.withIndexSpec(idxSpec);
     }
 
+    @Override
+    public NamedConstraint withIndexKeyword(String indexKeyword) {
+        return (NamedConstraint) super.withIndexKeyword(indexKeyword);
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/PartitionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/create/table/PartitionDefinition.java
index a79f242ed..24d15dfd0 100644
--- a/src/main/java/net/sf/jsqlparser/statement/create/table/PartitionDefinition.java
+++ b/src/main/java/net/sf/jsqlparser/statement/create/table/PartitionDefinition.java
@@ -11,6 +11,7 @@
 
 import java.io.Serializable;
 import java.util.List;
+import net.sf.jsqlparser.statement.select.PlainSelect;
 
 public class PartitionDefinition implements Serializable {
     private String partitionName;
@@ -57,4 +58,17 @@ public String getStorageEngine() {
     public void setStorageEngine(String storageEngine) {
         this.storageEngine = storageEngine;
     }
+
+    @Override
+    public String toString() {
+        StringBuilder b = new StringBuilder();
+        b.append("PARTITION ").append(partitionName)
+                .append(" ").append(partitionOperation)
+                .append(" (").append(PlainSelect.getStringList(values))
+                .append(")");
+        if (storageEngine != null) {
+            b.append(" ENGINE = ").append(storageEngine);
+        }
+        return b.toString();
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java b/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java
new file mode 100644
index 000000000..38774023a
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java
@@ -0,0 +1,118 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.export;
+
+import net.sf.jsqlparser.expression.StringValue;
+import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.ConnectionDefinition;
+import net.sf.jsqlparser.statement.ErrorClause;
+import net.sf.jsqlparser.statement.SourceDestinationType;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class DBMSDestination implements ExportIntoItem, Serializable {
+    private SourceDestinationType destinationType;
+    private ConnectionDefinition connectionDefinition;
+    private Table table;
+    private ExpressionList<Column> columns;
+    private List<DBMSTableDestinationOption> dbmsTableDestinationOptions;
+    private StringValue statement;
+    private ErrorClause errorClause;
+
+    public SourceDestinationType getDestinationType() {
+        return destinationType;
+    }
+
+    public void setDestinationType(SourceDestinationType destinationType) {
+        this.destinationType = destinationType;
+    }
+
+    public ConnectionDefinition getConnectionDefinition() {
+        return connectionDefinition;
+    }
+
+    public void setConnectionDefinition(ConnectionDefinition connectionDefinition) {
+        this.connectionDefinition = connectionDefinition;
+    }
+
+    public Table getTable() {
+        return table;
+    }
+
+    public void setTable(Table table) {
+        this.table = table;
+    }
+
+    public ExpressionList<Column> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(ExpressionList<Column> columns) {
+        this.columns = columns;
+    }
+
+    public List<DBMSTableDestinationOption> getDBMSTableDestinationOptions() {
+        return dbmsTableDestinationOptions;
+    }
+
+    public void setDBMSTableDestinationOptions(
+            List<DBMSTableDestinationOption> dbmsTableDestinationOptions) {
+        this.dbmsTableDestinationOptions = dbmsTableDestinationOptions;
+    }
+
+    public StringValue getStatement() {
+        return statement;
+    }
+
+    public void setStatement(StringValue statement) {
+        this.statement = statement;
+    }
+
+    @Override
+    public ErrorClause getErrorClause() {
+        return errorClause;
+    }
+
+    @Override
+    public void setErrorClause(ErrorClause errorClause) {
+        this.errorClause = errorClause;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append(destinationType);
+
+        sql.append(" ");
+        sql.append(connectionDefinition);
+
+        if (table != null) {
+            sql.append(" TABLE ").append(table);
+            PlainSelect.appendStringListTo(sql, columns, true, true);
+            if (dbmsTableDestinationOptions != null) {
+                sql.append(" ");
+                PlainSelect.appendStringListTo(sql, dbmsTableDestinationOptions, false, false);
+            }
+        } else if (statement != null) {
+            sql.append(" STATEMENT ").append(statement);
+        }
+
+        if (errorClause != null) {
+            sql.append(errorClause);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java
new file mode 100644
index 000000000..904acea95
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java
@@ -0,0 +1,67 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.export;
+
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+import net.sf.jsqlparser.expression.StringValue;
+
+import java.io.Serializable;
+
+public class DBMSTableDestinationOption implements Serializable {
+    private String key;
+    private Expression value;
+
+    private DBMSTableDestinationOption(String key, Expression value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public DBMSTableDestinationOption(String key) {
+        this(key, (Expression) null);
+    }
+
+    public DBMSTableDestinationOption(String key, StringValue value) {
+        this(key, (Expression) value);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public Expression getValue() {
+        return value;
+    }
+
+    public void setValue(StringValue value) {
+        this.value = value;
+    }
+
+    public void setValue(LongValue value) {
+        this.value = value;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append(key);
+        if (value != null) {
+            sql.append(" ");
+            sql.append(value);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/export/Export.java b/src/main/java/net/sf/jsqlparser/statement/export/Export.java
new file mode 100644
index 000000000..dd6628a20
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/export/Export.java
@@ -0,0 +1,81 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.export;
+
+import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.StatementVisitor;
+import net.sf.jsqlparser.statement.select.*;
+
+public class Export implements Statement {
+    private Table table;
+    private ExpressionList<Column> columns;
+    private Select select;
+    private ExportIntoItem exportIntoItem;
+
+    public Table getTable() {
+        return table;
+    }
+
+    public void setTable(Table table) {
+        this.table = table;
+    }
+
+    public ExpressionList<Column> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(ExpressionList<Column> columns) {
+        this.columns = columns;
+    }
+
+    public Select getSelect() {
+        return select;
+    }
+
+    public void setSelect(Select select) {
+        this.select = select;
+    }
+
+    public ExportIntoItem getExportIntoItem() {
+        return exportIntoItem;
+    }
+
+    public void setExportIntoItem(ExportIntoItem exportIntoItem) {
+        this.exportIntoItem = exportIntoItem;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+        sql.append("EXPORT ");
+        if (table != null || select != null) {
+            if (table != null) {
+                sql.append(table);
+                PlainSelect.appendStringListTo(sql, columns, true, true);
+            } else {
+                sql.append(select);
+            }
+            sql.append(" ");
+        }
+
+        sql.append("INTO ");
+        sql.append(exportIntoItem);
+
+        return sql.toString();
+    }
+
+    @Override
+    public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
+        return statementVisitor.visit(this, context);
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java b/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java
new file mode 100644
index 000000000..4558b67e9
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java
@@ -0,0 +1,18 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.export;
+
+import net.sf.jsqlparser.statement.ErrorClause;
+
+public interface ExportIntoItem {
+    ErrorClause getErrorClause();
+
+    void setErrorClause(ErrorClause errorClause);
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java b/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java
new file mode 100644
index 000000000..6ff364075
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java
@@ -0,0 +1,50 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.export;
+
+import net.sf.jsqlparser.statement.*;
+
+import java.io.Serializable;
+
+public class FileDestination extends FileSourceDestination implements ExportIntoItem, Serializable {
+    private ErrorClause errorClause;
+
+    public SourceDestinationType getDestinationType() {
+        return getType();
+    }
+
+    public void setDestinationType(SourceDestinationType destinationType) {
+        setType(destinationType);
+    }
+
+    @Override
+    public ErrorClause getErrorClause() {
+        return errorClause;
+    }
+
+    @Override
+    public void setErrorClause(ErrorClause errorClause) {
+        this.errorClause = errorClause;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append(super.toString());
+
+        if (errorClause != null) {
+            sql.append(" ");
+            sql.append(errorClause);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/grant/Grant.java b/src/main/java/net/sf/jsqlparser/statement/grant/Grant.java
index ba46cb365..191e66c0c 100644
--- a/src/main/java/net/sf/jsqlparser/statement/grant/Grant.java
+++ b/src/main/java/net/sf/jsqlparser/statement/grant/Grant.java
@@ -24,7 +24,7 @@ public class Grant implements Statement {
 
     private String role;
     private List<String> privileges;
-    private List<String> objectName = new ArrayList<>();
+    private final List<String> objectName = new ArrayList<>();
     private List<String> users;
 
     @Override
diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java
new file mode 100644
index 000000000..0845af338
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java
@@ -0,0 +1,106 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.imprt;
+
+import net.sf.jsqlparser.expression.StringValue;
+import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.ConnectionDefinition;
+import net.sf.jsqlparser.statement.ErrorClause;
+import net.sf.jsqlparser.statement.SourceDestinationType;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class DBMSSource implements ImportFromItem, Serializable {
+    private SourceDestinationType sourceType;
+    private ConnectionDefinition connectionDefinition;
+    private Table table;
+    private ExpressionList<Column> columns;
+    private List<StringValue> statements;
+    private ErrorClause errorClause;
+
+    public SourceDestinationType getSourceType() {
+        return sourceType;
+    }
+
+    public void setSourceType(SourceDestinationType sourceType) {
+        this.sourceType = sourceType;
+    }
+
+    public ConnectionDefinition getConnectionDefinition() {
+        return connectionDefinition;
+    }
+
+    public void setConnectionDefinition(ConnectionDefinition connectionDefinition) {
+        this.connectionDefinition = connectionDefinition;
+    }
+
+    public Table getTable() {
+        return table;
+    }
+
+    public void setTable(Table table) {
+        this.table = table;
+    }
+
+    public ExpressionList<Column> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(ExpressionList<Column> columns) {
+        this.columns = columns;
+    }
+
+    public List<StringValue> getStatements() {
+        return statements;
+    }
+
+    public void setStatements(List<StringValue> statements) {
+        this.statements = statements;
+    }
+
+    @Override
+    public ErrorClause getErrorClause() {
+        return errorClause;
+    }
+
+    @Override
+    public void setErrorClause(ErrorClause errorClause) {
+        this.errorClause = errorClause;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append(sourceType);
+
+        sql.append(" ");
+        sql.append(connectionDefinition);
+
+        if (table != null) {
+            sql.append(" TABLE ").append(table);
+            PlainSelect.appendStringListTo(sql, columns, true, true);
+        } else if (statements != null) {
+            for (StringValue statement : statements) {
+                sql.append(" STATEMENT ").append(statement);
+            }
+        }
+
+        if (errorClause != null) {
+            sql.append(errorClause);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java
new file mode 100644
index 000000000..0be5bbab6
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java
@@ -0,0 +1,50 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.imprt;
+
+import net.sf.jsqlparser.statement.*;
+
+import java.io.Serializable;
+
+public class FileSource extends FileSourceDestination implements ImportFromItem, Serializable {
+    private ErrorClause errorClause;
+
+    public SourceDestinationType getSourceType() {
+        return getType();
+    }
+
+    public void setSourceType(SourceDestinationType sourceType) {
+        setType(sourceType);
+    }
+
+    @Override
+    public ErrorClause getErrorClause() {
+        return errorClause;
+    }
+
+    @Override
+    public void setErrorClause(ErrorClause errorClause) {
+        this.errorClause = errorClause;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append(super.toString());
+
+        if (errorClause != null) {
+            sql.append(" ");
+            sql.append(errorClause);
+        }
+
+        return sql.toString();
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java
new file mode 100644
index 000000000..e71799a3d
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java
@@ -0,0 +1,128 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.imprt;
+
+import net.sf.jsqlparser.expression.Alias;
+import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
+import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.StatementVisitor;
+import net.sf.jsqlparser.statement.select.*;
+
+import java.util.List;
+
+public class Import extends ASTNodeAccessImpl implements FromItem, Statement {
+    private Table table;
+    private ExpressionList<Column> columns;
+    private List<ImportColumn> importColumns;
+    private ImportFromItem fromItem;
+    private Alias alias;
+
+    public Table getTable() {
+        return table;
+    }
+
+    public void setTable(Table table) {
+        this.table = table;
+    }
+
+    public ExpressionList<Column> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(ExpressionList<Column> columns) {
+        this.columns = columns;
+    }
+
+    public List<ImportColumn> getImportColumns() {
+        return importColumns;
+    }
+
+    public void setImportColumns(List<ImportColumn> importColumns) {
+        this.importColumns = importColumns;
+    }
+
+    public ImportFromItem getFromItem() {
+        return fromItem;
+    }
+
+    public void setFromItem(ImportFromItem fromItem) {
+        this.fromItem = fromItem;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sql = new StringBuilder();
+        sql.append("IMPORT ");
+        if (table != null || importColumns != null) {
+            sql.append("INTO ");
+            if (table != null) {
+                sql.append(table);
+                PlainSelect.appendStringListTo(sql, columns, true, true);
+            } else {
+                PlainSelect.appendStringListTo(sql, importColumns, true, true);
+            }
+            sql.append(" ");
+        }
+
+        sql.append("FROM ");
+        sql.append(fromItem);
+
+        return sql.toString();
+    }
+
+    @Override
+    public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
+        return statementVisitor.visit(this, context);
+    }
+
+    @Override
+    public <T, S> T accept(FromItemVisitor<T> fromItemVisitor, S context) {
+        return fromItemVisitor.visit(this, context);
+    }
+
+    @Override
+    public Alias getAlias() {
+        return alias;
+    }
+
+    @Override
+    public void setAlias(Alias alias) {
+        this.alias = alias;
+    }
+
+    @Override
+    public Pivot getPivot() {
+        return null;
+    }
+
+    @Override
+    public void setPivot(Pivot pivot) {}
+
+    @Override
+    public UnPivot getUnPivot() {
+        return null;
+    }
+
+    @Override
+    public void setUnPivot(UnPivot unpivot) {}
+
+    @Override
+    public SampleClause getSampleClause() {
+        return null;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        return null;
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java
new file mode 100644
index 000000000..7d3f719dd
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java
@@ -0,0 +1,13 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.imprt;
+
+public interface ImportColumn {
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java
new file mode 100644
index 000000000..86e736cca
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java
@@ -0,0 +1,18 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.imprt;
+
+import net.sf.jsqlparser.statement.ErrorClause;
+
+public interface ImportFromItem {
+    ErrorClause getErrorClause();
+
+    void setErrorClause(ErrorClause errorClause);
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/merge/MergeInsert.java b/src/main/java/net/sf/jsqlparser/statement/merge/MergeInsert.java
index be0d4bb2f..7e33db8b0 100644
--- a/src/main/java/net/sf/jsqlparser/statement/merge/MergeInsert.java
+++ b/src/main/java/net/sf/jsqlparser/statement/merge/MergeInsert.java
@@ -67,15 +67,15 @@ public String toString() {
         StringBuilder b = new StringBuilder();
         b.append(" WHEN NOT MATCHED");
         if (andPredicate != null) {
-            b.append(" AND ").append(andPredicate.toString());
+            b.append(" AND ").append(andPredicate);
         }
         b.append(" THEN INSERT ");
         if (columns != null) {
-            b.append(columns.toString());
+            b.append(columns);
         }
         b.append(" VALUES ").append(values.toString());
         if (whereCondition != null) {
-            b.append(" WHERE ").append(whereCondition.toString());
+            b.append(" WHERE ").append(whereCondition);
         }
         return b.toString();
     }
diff --git a/src/main/java/net/sf/jsqlparser/statement/merge/MergeOperationVisitor.java b/src/main/java/net/sf/jsqlparser/statement/merge/MergeOperationVisitor.java
index fef9682fe..d2439fbd8 100644
--- a/src/main/java/net/sf/jsqlparser/statement/merge/MergeOperationVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/statement/merge/MergeOperationVisitor.java
@@ -9,6 +9,8 @@
  */
 package net.sf.jsqlparser.statement.merge;
 
+import java.util.Collection;
+
 public interface MergeOperationVisitor<T> {
 
     <S> T visit(MergeDelete mergeDelete, S context);
@@ -16,4 +18,11 @@ public interface MergeOperationVisitor<T> {
     <S> T visit(MergeUpdate mergeUpdate, S context);
 
     <S> T visit(MergeInsert mergeInsert, S context);
+
+    default <S> T visit(Collection<MergeOperation> mergeOperations, S context) {
+        if (mergeOperations != null) {
+            mergeOperations.forEach(operation -> operation.accept(this, context));
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/merge/MergeOperationVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/merge/MergeOperationVisitorAdapter.java
index 546b44604..61ff7a45a 100644
--- a/src/main/java/net/sf/jsqlparser/statement/merge/MergeOperationVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/statement/merge/MergeOperationVisitorAdapter.java
@@ -9,20 +9,47 @@
  */
 package net.sf.jsqlparser.statement.merge;
 
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
+import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
+
 @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
 public class MergeOperationVisitorAdapter<T> implements MergeOperationVisitor<T> {
+    private ExpressionVisitor<T> expressionVisitor;
+
+    public MergeOperationVisitorAdapter() {
+        this.expressionVisitor = new ExpressionVisitorAdapter<>();
+    }
+
+    public MergeOperationVisitorAdapter(ExpressionVisitor<T> expressionVisitor) {
+        this.expressionVisitor = expressionVisitor;
+    }
+
+    public MergeOperationVisitorAdapter(SelectVisitorAdapter<T> selectVisitorAdapter) {
+        this.expressionVisitor = selectVisitorAdapter.getExpressionVisitor();
+    }
+
     @Override
     public <S> T visit(MergeDelete mergeDelete, S context) {
+        expressionVisitor.visitExpression(mergeDelete.getAndPredicate(), context);
         return null;
     }
 
     @Override
     public <S> T visit(MergeUpdate mergeUpdate, S context) {
+        expressionVisitor.visitExpression(mergeUpdate.getAndPredicate(), context);
+        expressionVisitor.visitUpdateSets(mergeUpdate.getUpdateSets(), context);
+        expressionVisitor.visitExpression(mergeUpdate.getWhereCondition(), context);
+        expressionVisitor.visitExpression(mergeUpdate.getDeleteWhereCondition(), context);
         return null;
     }
 
     @Override
     public <S> T visit(MergeInsert mergeInsert, S context) {
+        expressionVisitor.visitExpression(mergeInsert.getAndPredicate(), context);
+        expressionVisitor.visitExpressions(mergeInsert.getColumns(), context);
+        expressionVisitor.visitExpressions(mergeInsert.getValues(), context);
+        expressionVisitor.visitExpression(mergeInsert.getWhereCondition(), context);
         return null;
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/AggregatePipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/AggregatePipeOperator.java
index a053c19dd..552ac662d 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/AggregatePipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/AggregatePipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.statement.select.SelectItem;
@@ -6,11 +15,15 @@
 
 public class AggregatePipeOperator extends PipeOperator {
     private final ArrayList<SelectItem<?>> selectItems = new ArrayList<>();
+    private final ArrayList<String> selectItemsOrderSuffices = new ArrayList<>();
+
     private final ArrayList<SelectItem<?>> groupItems = new ArrayList<>();
+    private final ArrayList<String> groupItemsOrderSuffices = new ArrayList<>();
     private boolean usingShortHandOrdering = false;
 
-    public AggregatePipeOperator(SelectItem<?> selectItem) {
+    public AggregatePipeOperator(SelectItem<?> selectItem, String orderSuffix) {
         selectItems.add(selectItem);
+        selectItemsOrderSuffices.add(orderSuffix);
     }
 
     public ArrayList<SelectItem<?>> getSelectItems() {
@@ -21,22 +34,31 @@ public ArrayList<SelectItem<?>> getGroupItems() {
         return groupItems;
     }
 
-    public AggregatePipeOperator add(SelectItem<?> selectItem) {
+    public ArrayList<String> getSelectItemsOrderSuffices() {
+        return selectItemsOrderSuffices;
+    }
+
+    public ArrayList<String> getGroupItemsOrderSuffices() {
+        return groupItemsOrderSuffices;
+    }
+
+    public AggregatePipeOperator add(SelectItem<?> selectItem, String orderSuffix) {
         selectItems.add(selectItem);
         return this;
     }
 
-    public AggregatePipeOperator with(SelectItem<?> selectItem) {
-        return this.add(selectItem);
+    public AggregatePipeOperator with(SelectItem<?> selectItem, String orderSuffix) {
+        return this.add(selectItem, orderSuffix);
     }
 
-    public AggregatePipeOperator addGroupItem(SelectItem<?> selectItem) {
+    public AggregatePipeOperator addGroupItem(SelectItem<?> selectItem, String orderSuffix) {
         groupItems.add(selectItem);
+        groupItemsOrderSuffices.add(orderSuffix);
         return this;
     }
 
-    public AggregatePipeOperator withGroupItem(SelectItem<?> selectItem) {
-        return this.addGroupItem(selectItem);
+    public AggregatePipeOperator withGroupItem(SelectItem<?> selectItem, String orderSuffix) {
+        return this.addGroupItem(selectItem, orderSuffix);
     }
 
     public boolean isUsingShortHandOrdering() {
@@ -49,7 +71,7 @@ public AggregatePipeOperator setShorthandOrdering(boolean usingShortHandOrdering
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 
@@ -58,7 +80,12 @@ public StringBuilder appendTo(StringBuilder builder) {
         builder.append("|> ").append("AGGREGATE");
         int i = 0;
         for (SelectItem<?> selectItem : selectItems) {
-            builder.append(i++ > 0 ? ", " : " ").append(selectItem);
+            builder.append(i > 0 ? ", " : " ").append(selectItem);
+            if (i < selectItemsOrderSuffices.size() && selectItemsOrderSuffices.get(i) != null
+                    && !selectItemsOrderSuffices.get(i).isEmpty()) {
+                builder.append(" ").append(selectItemsOrderSuffices.get(i));
+            }
+            i++;
         }
         builder.append("\n");
 
@@ -70,7 +97,12 @@ public StringBuilder appendTo(StringBuilder builder) {
             builder.append(" BY");
             i = 0;
             for (SelectItem<?> selectItem : groupItems) {
-                builder.append(i++ > 0 ? ", " : " ").append(selectItem);
+                builder.append(i > 0 ? ", " : " ").append(selectItem);
+                if (i < groupItemsOrderSuffices.size() && groupItemsOrderSuffices.get(i) != null
+                        && !groupItemsOrderSuffices.get(i).isEmpty()) {
+                    builder.append(" ").append(groupItemsOrderSuffices.get(i));
+                }
+                i++;
             }
             builder.append("\n");
         }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/AsPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/AsPipeOperator.java
index c0fb258c7..0f1bf8bc1 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/AsPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/AsPipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.expression.Alias;
@@ -19,7 +28,7 @@ public AsPipeOperator setAlias(Alias alias) {
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/CallPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/CallPipeOperator.java
index 982b715c1..08f444e87 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/CallPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/CallPipeOperator.java
@@ -1,9 +1,56 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
+import net.sf.jsqlparser.expression.Alias;
+import net.sf.jsqlparser.statement.select.TableFunction;
+
 public class CallPipeOperator extends PipeOperator {
+    private TableFunction tableFunction;
+    private Alias alias;
+
+    public CallPipeOperator(TableFunction tableFunction, Alias alias) {
+        this.tableFunction = tableFunction;
+        this.alias = alias;
+    }
+
+    public TableFunction getTableFunction() {
+        return tableFunction;
+    }
+
+    public CallPipeOperator setTableFunction(TableFunction tableFunction) {
+        this.tableFunction = tableFunction;
+        return this;
+    }
+
+    public Alias getAlias() {
+        return alias;
+    }
+
+    public CallPipeOperator setAlias(Alias alias) {
+        this.alias = alias;
+        return this;
+    }
+
+    @Override
+    public StringBuilder appendTo(StringBuilder builder) {
+        builder.append("|> CALL ").append(tableFunction);
+        if (alias != null) {
+            builder.append(" ").append(alias);
+        }
+
+        return builder;
+    }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/DropPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/DropPipeOperator.java
index a4378c660..0742e4f05 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/DropPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/DropPipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.expression.ExpressionVisitor;
@@ -193,7 +202,7 @@ public ListIterator<Column> listIterator() {
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/ExceptPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/ExceptPipeOperator.java
deleted file mode 100644
index 2618eb814..000000000
--- a/src/main/java/net/sf/jsqlparser/statement/piped/ExceptPipeOperator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package net.sf.jsqlparser.statement.piped;
-
-public class ExceptPipeOperator extends PipeOperator {
-    @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
-        return visitor.visit(this, context);
-    }
-}
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperator.java
index e8d6f7291..dea25685c 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperator.java
@@ -1,9 +1,18 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.statement.select.SelectItem;
 
 public class ExtendPipeOperator extends SelectPipeOperator {
     public ExtendPipeOperator(SelectItem<?> selectItem) {
-        super("EXTEND", selectItem);
+        super("EXTEND", selectItem, null);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/FromQuery.java b/src/main/java/net/sf/jsqlparser/statement/piped/FromQuery.java
index ee80b1a34..6937afce0 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/FromQuery.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/FromQuery.java
@@ -1,16 +1,31 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.expression.Alias;
 import net.sf.jsqlparser.expression.ExpressionVisitor;
 import net.sf.jsqlparser.statement.select.FromItem;
 import net.sf.jsqlparser.statement.select.FromItemVisitor;
+import net.sf.jsqlparser.statement.select.Join;
+import net.sf.jsqlparser.statement.select.LateralView;
 import net.sf.jsqlparser.statement.select.Pivot;
+import net.sf.jsqlparser.statement.select.SampleClause;
 import net.sf.jsqlparser.statement.select.Select;
 import net.sf.jsqlparser.statement.select.SelectVisitor;
 import net.sf.jsqlparser.statement.select.UnPivot;
+import net.sf.jsqlparser.statement.select.WithItem;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Spliterator;
 import java.util.function.Consumer;
@@ -20,6 +35,8 @@
 public class FromQuery extends Select {
     private boolean usingFromKeyword = true;
     private FromItem fromItem;
+    private List<LateralView> lateralViews = null;
+    private List<Join> joins = null;
     private final ArrayList<PipeOperator> pipeOperators = new ArrayList<>();
 
     public FromQuery(FromItem fromItem) {
@@ -48,6 +65,51 @@ public boolean isUsingFromKeyword() {
         return usingFromKeyword;
     }
 
+
+    public List<LateralView> getLateralViews() {
+        return lateralViews;
+    }
+
+    public FromQuery setLateralViews(List<LateralView> lateralViews) {
+        this.lateralViews = lateralViews;
+        return this;
+    }
+
+    public FromQuery addLateralViews(Collection<LateralView> lateralViews) {
+        if (this.lateralViews == null) {
+            this.lateralViews = new ArrayList<>(lateralViews);
+        } else {
+            this.lateralViews.addAll(lateralViews);
+        }
+        return this;
+    }
+
+    public FromQuery addLateralViews(LateralView... lateralViews) {
+        return this.addLateralViews(Arrays.asList(lateralViews));
+    }
+
+    public List<Join> getJoins() {
+        return joins;
+    }
+
+    public FromQuery setJoins(List<Join> joins) {
+        this.joins = joins;
+        return this;
+    }
+
+    public FromQuery addJoins(Collection<Join> joins) {
+        if (this.joins == null) {
+            this.joins = new ArrayList<>(joins);
+        } else {
+            this.joins.addAll(joins);
+        }
+        return this;
+    }
+
+    public FromQuery addJoins(Join... joins) {
+        return addJoins(Arrays.asList(joins));
+    }
+
     public FromQuery setUsingFromKeyword(boolean usingFromKeyword) {
         this.usingFromKeyword = usingFromKeyword;
         return this;
@@ -188,6 +250,16 @@ public void setUnPivot(UnPivot unpivot) {
 
     }
 
+    @Override
+    public SampleClause getSampleClause() {
+        return null;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        return null;
+    }
+
     @Override
     public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
         return expressionVisitor.visit(this, context);
@@ -203,14 +275,42 @@ public <T, S> T accept(SelectVisitor<T> selectVisitor, S context) {
         return selectVisitor.visit(this, context);
     }
 
-
+    public <T, S> T accept(FromQueryVisitor<T, S> fromQueryVisitor, S context) {
+        return fromQueryVisitor.visit(this, context);
+    }
 
     @Override
     public StringBuilder appendTo(StringBuilder builder) {
+        if (withItemsList != null && !withItemsList.isEmpty()) {
+            builder.append("WITH ");
+            for (Iterator<WithItem<?>> iter = withItemsList.iterator(); iter.hasNext();) {
+                WithItem withItem = iter.next();
+                builder.append(withItem);
+                if (iter.hasNext()) {
+                    builder.append(",");
+                }
+                builder.append(" ");
+            }
+        }
+
         if (usingFromKeyword) {
             builder.append("FROM ");
         }
         builder.append(fromItem).append("\n");
+        if (lateralViews != null) {
+            for (LateralView lateralView : lateralViews) {
+                builder.append(" ").append(lateralView);
+            }
+        }
+        if (joins != null) {
+            for (Join join : joins) {
+                if (join.isSimple()) {
+                    builder.append(", ").append(join);
+                } else {
+                    builder.append(" ").append(join);
+                }
+            }
+        }
         for (PipeOperator operator : pipeOperators) {
             operator.appendTo(builder);
         }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/FromQueryVisitor.java b/src/main/java/net/sf/jsqlparser/statement/piped/FromQueryVisitor.java
new file mode 100644
index 000000000..caa76cb61
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/FromQueryVisitor.java
@@ -0,0 +1,14 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.piped;
+
+public interface FromQueryVisitor<T, S> {
+    T visit(FromQuery fromQuery, S context);
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/IntersectPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/IntersectPipeOperator.java
deleted file mode 100644
index d2ff37368..000000000
--- a/src/main/java/net/sf/jsqlparser/statement/piped/IntersectPipeOperator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package net.sf.jsqlparser.statement.piped;
-
-public class IntersectPipeOperator extends PipeOperator {
-    @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
-        return visitor.visit(this, context);
-    }
-}
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/JoinPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/JoinPipeOperator.java
index 67e63a856..ebf4be1e5 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/JoinPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/JoinPipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.statement.select.Join;
@@ -19,7 +28,7 @@ public JoinPipeOperator setJoin(Join join) {
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/LimitPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/LimitPipeOperator.java
index ab0a7cc6a..144736463 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/LimitPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/LimitPipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.expression.Expression;
@@ -34,7 +43,7 @@ public LimitPipeOperator setOffsetExpression(Expression offsetExpression) {
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/OrderByPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/OrderByPipeOperator.java
index 4cc6b8c39..35eba46ea 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/OrderByPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/OrderByPipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.statement.select.OrderByElement;
@@ -32,7 +41,7 @@ public StringBuilder appendTo(StringBuilder builder) {
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/PipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/PipeOperator.java
index 7dea891b9..8c43be516 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/PipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/PipeOperator.java
@@ -1,7 +1,16 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
 
 public abstract class PipeOperator extends ASTNodeAccessImpl {
-    public abstract <T, S> T accept(PipeOperatorVisitor<T> visitor, S context);
+    public abstract <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context);
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/PipeOperatorVisitor.java b/src/main/java/net/sf/jsqlparser/statement/piped/PipeOperatorVisitor.java
index f53bce5cd..f3f211e41 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/PipeOperatorVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/PipeOperatorVisitor.java
@@ -1,42 +1,47 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
-public interface PipeOperatorVisitor<T> {
-    <S> T visit(AggregatePipeOperator aggregate, S context);
+public interface PipeOperatorVisitor<T, S> {
+    T visit(AggregatePipeOperator aggregate, S context);
 
-    <S> T visit(AsPipeOperator as, S context);
+    T visit(AsPipeOperator as, S context);
 
-    <S> T visit(CallPipeOperator call, S context);
+    T visit(CallPipeOperator call, S context);
 
-    <S> T visit(DropPipeOperator drop, S context);
+    T visit(DropPipeOperator drop, S context);
 
-    <S> T visit(ExceptPipeOperator except, S context);
+    T visit(ExtendPipeOperator extend, S context);
 
-    <S> T visit(ExtendPipeOperator extend, S context);
+    T visit(JoinPipeOperator join, S context);
 
-    <S> T visit(IntersectPipeOperator intersect, S context);
+    T visit(LimitPipeOperator limit, S context);
 
-    <S> T visit(JoinPipeOperator join, S context);
+    T visit(OrderByPipeOperator orderBy, S context);
 
-    <S> T visit(LimitPipeOperator limit, S context);
+    T visit(PivotPipeOperator pivot, S context);
 
-    <S> T visit(OrderByPipeOperator orderBy, S context);
+    T visit(RenamePipeOperator rename, S context);
 
-    <S> T visit(PivotPipeOperator pivot, S context);
+    T visit(SelectPipeOperator select, S context);
 
-    <S> T visit(RenamePipeOperator rename, S context);
+    T visit(SetPipeOperator set, S context);
 
-    <S> T visit(SelectPipeOperator select, S context);
+    T visit(TableSamplePipeOperator tableSample, S context);
 
-    <S> T visit(SetPipeOperator set, S context);
+    T visit(SetOperationPipeOperator union, S context);
 
-    <S> T visit(TableSamplePipeOperator tableSample, S context);
+    T visit(UnPivotPipeOperator unPivot, S context);
 
-    <S> T visit(UnionPipeOperator union, S context);
+    T visit(WherePipeOperator where, S context);
 
-    <S> T visit(UnPivotPipeOperator unPivot, S context);
-
-    <S> T visit(WherePipeOperator where, S context);
-
-    <S> T visit(WindowPipeOperator window, S context);
+    T visit(WindowPipeOperator window, S context);
 }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/PivotPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/PivotPipeOperator.java
index 70d337189..94cbfdedf 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/PivotPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/PivotPipeOperator.java
@@ -1,8 +1,92 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
+import net.sf.jsqlparser.expression.Alias;
+import net.sf.jsqlparser.expression.Function;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.statement.select.Select;
+import net.sf.jsqlparser.statement.select.SelectItem;
+
+import java.util.List;
+
 public class PivotPipeOperator extends PipeOperator {
+    private Function aggregateExpression;
+    private Column inputColumn;
+    private List<SelectItem<?>> pivotColumns;
+    private Alias alias = null;
+
+    public PivotPipeOperator(Function aggregateExpression, Column inputColumn,
+            List<SelectItem<?>> pivotColumns, Alias alias) {
+        this.aggregateExpression = aggregateExpression;
+        this.inputColumn = inputColumn;
+        this.pivotColumns = pivotColumns;
+        this.alias = alias;
+    }
+
+    public Function getAggregateExpression() {
+        return aggregateExpression;
+    }
+
+    public PivotPipeOperator setAggregateExpression(Function aggregateExpression) {
+        this.aggregateExpression = aggregateExpression;
+        return this;
+    }
+
+    public Column getInputColumn() {
+        return inputColumn;
+    }
+
+    public PivotPipeOperator setInputColumn(Column inputColumn) {
+        this.inputColumn = inputColumn;
+        return this;
+    }
+
+    public List<SelectItem<?>> getPivotColumns() {
+        return pivotColumns;
+    }
+
+    public PivotPipeOperator setPivotColumns(List<SelectItem<?>> pivotColumns) {
+        this.pivotColumns = pivotColumns;
+        return this;
+    }
+
+    public Alias getAlias() {
+        return alias;
+    }
+
+    public PivotPipeOperator setAlias(Alias alias) {
+        this.alias = alias;
+        return this;
+    }
+
+    @Override
+    public StringBuilder appendTo(StringBuilder builder) {
+        builder
+                .append("|> ")
+                .append("PIVOT( ")
+                .append(aggregateExpression)
+                .append(" FOR ")
+                .append(inputColumn)
+                .append(" IN (")
+                .append(Select.getStringList(pivotColumns))
+                .append("))");
+        if (alias != null) {
+            builder.append(" ").append(alias);
+        }
+        builder.append("\n");
+        return builder;
+    }
+
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/RenamePipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/RenamePipeOperator.java
index 1f183d158..6ddc8aa61 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/RenamePipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/RenamePipeOperator.java
@@ -1,8 +1,18 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
-public class RenamePipeOperator extends PipeOperator {
-    @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
-        return visitor.visit(this, context);
+import net.sf.jsqlparser.statement.select.SelectItem;
+
+public class RenamePipeOperator extends SelectPipeOperator {
+    public RenamePipeOperator(SelectItem<?> selectItem) {
+        super("RENAME", selectItem, null);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/SelectPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/SelectPipeOperator.java
index 9bb669e4f..82a188a58 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/SelectPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/SelectPipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.statement.select.SelectItem;
@@ -6,22 +15,24 @@
 
 public class SelectPipeOperator extends PipeOperator {
     private final String operatorName;
+    private final String modifier;
 
     private final ArrayList<SelectItem<?>> selectItems = new ArrayList<>();
 
-    public SelectPipeOperator(String operatorName, SelectItem<?> selectItem) {
+    public SelectPipeOperator(String operatorName, SelectItem<?> selectItem, String modifier) {
         this.operatorName = operatorName;
+        this.modifier = modifier;
         selectItems.add(selectItem);
     }
 
-    public SelectPipeOperator(SelectItem<?> selectItem) {
-        this("SELECT", selectItem);
-    }
-
     public String getOperatorName() {
         return operatorName;
     }
 
+    public String getModifier() {
+        return modifier;
+    }
+
     public ArrayList<SelectItem<?>> getSelectItems() {
         return selectItems;
     }
@@ -36,13 +47,17 @@ public SelectPipeOperator with(SelectItem<?> selectItem) {
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 
     @Override
     public StringBuilder appendTo(StringBuilder builder) {
         builder.append("|> ").append(operatorName);
+        if (modifier != null && !modifier.isEmpty()) {
+            builder.append(" ").append(modifier);
+        }
+
         int i = 0;
         for (SelectItem<?> selectItem : selectItems) {
             builder.append(i++ > 0 ? ", " : " ").append(selectItem);
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/SetOperationPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/SetOperationPipeOperator.java
new file mode 100644
index 000000000..d236ff5ed
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/SetOperationPipeOperator.java
@@ -0,0 +1,86 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.piped;
+
+import net.sf.jsqlparser.statement.select.ParenthesedSelect;
+import net.sf.jsqlparser.statement.select.SetOperationList;
+
+import java.util.ArrayList;
+
+public class SetOperationPipeOperator extends PipeOperator {
+    private ArrayList<ParenthesedSelect> selects;
+    private SetOperationList.SetOperationType setOperationType;
+    private String modifier;
+
+    public SetOperationPipeOperator(ParenthesedSelect select,
+            SetOperationList.SetOperationType setOperationType, String modifier) {
+        this.selects = new ArrayList<>();
+        this.selects.add(select);
+
+        this.setOperationType = setOperationType;
+        this.modifier = modifier;
+    }
+
+    public SetOperationPipeOperator add(ParenthesedSelect select) {
+        this.selects.add(select);
+        return this;
+    }
+
+    public ArrayList<ParenthesedSelect> getSelects() {
+        return selects;
+    }
+
+    public SetOperationPipeOperator setSelects(ArrayList<ParenthesedSelect> selects) {
+        this.selects = selects;
+        return this;
+    }
+
+    public SetOperationList.SetOperationType getSetOperationType() {
+        return setOperationType;
+    }
+
+    public SetOperationPipeOperator setSetOperationType(
+            SetOperationList.SetOperationType setOperationType) {
+        this.setOperationType = setOperationType;
+        return this;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public SetOperationPipeOperator setModifier(String modifier) {
+        this.modifier = modifier;
+        return this;
+    }
+
+    @Override
+    public StringBuilder appendTo(StringBuilder builder) {
+        builder.append("|> ").append(setOperationType);
+        if (modifier != null) {
+            builder.append(" ").append(modifier);
+        }
+
+        int i = 0;
+        for (ParenthesedSelect select : selects) {
+            if (i++ > 0) {
+                builder.append(", ");
+            }
+            builder.append(select);
+        }
+        builder.append("\n");
+        return builder;
+    }
+
+    @Override
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
+        return visitor.visit(this, context);
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/SetPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/SetPipeOperator.java
index f36221826..806cf211b 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/SetPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/SetPipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.statement.update.UpdateSet;
@@ -155,7 +164,7 @@ public boolean isEmpty() {
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/TableSamplePipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/TableSamplePipeOperator.java
index cf209b966..bc9fcc735 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/TableSamplePipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/TableSamplePipeOperator.java
@@ -1,8 +1,42 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 public class TableSamplePipeOperator extends PipeOperator {
+    double percent;
+
+    public TableSamplePipeOperator(double percent) {
+        this.percent = percent;
+    }
+
+    public TableSamplePipeOperator(String percentStr) {
+        this.percent = Double.parseDouble(percentStr);
+    }
+
+    public double getPercent() {
+        return percent;
+    }
+
+    public TableSamplePipeOperator setPercent(double percent) {
+        this.percent = percent;
+        return this;
+    }
+
+    @Override
+    public StringBuilder appendTo(StringBuilder builder) {
+        builder.append("|> ").append("TABLESAMPLE SYSTEM (").append(percent).append(" PERCENT)");
+        return builder;
+    }
+
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/UnPivotPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/UnPivotPipeOperator.java
index 5f4b7e328..b2c598917 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/UnPivotPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/UnPivotPipeOperator.java
@@ -1,8 +1,91 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
+import net.sf.jsqlparser.expression.Alias;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.statement.select.Select;
+import net.sf.jsqlparser.statement.select.SelectItem;
+
+import java.util.List;
+
 public class UnPivotPipeOperator extends PipeOperator {
+    private Column valuesColumn;
+    private Column nameColumn;
+    private List<SelectItem<?>> pivotColumns;
+    private Alias alias = null;
+
+    public UnPivotPipeOperator(Column valuesColumn, Column nameColumn,
+            List<SelectItem<?>> pivotColumns, Alias alias) {
+        this.valuesColumn = valuesColumn;
+        this.nameColumn = nameColumn;
+        this.pivotColumns = pivotColumns;
+        this.alias = alias;
+    }
+
+    public Column getValuesColumn() {
+        return valuesColumn;
+    }
+
+    public UnPivotPipeOperator setValuesColumn(Column valuesColumn) {
+        this.valuesColumn = valuesColumn;
+        return this;
+    }
+
+    public Column getNameColumn() {
+        return nameColumn;
+    }
+
+    public UnPivotPipeOperator setNameColumn(Column nameColumn) {
+        this.nameColumn = nameColumn;
+        return this;
+    }
+
+    public List<SelectItem<?>> getPivotColumns() {
+        return pivotColumns;
+    }
+
+    public UnPivotPipeOperator setPivotColumns(List<SelectItem<?>> pivotColumns) {
+        this.pivotColumns = pivotColumns;
+        return this;
+    }
+
+    public Alias getAlias() {
+        return alias;
+    }
+
+    public UnPivotPipeOperator setAlias(Alias alias) {
+        this.alias = alias;
+        return this;
+    }
+
+    @Override
+    public StringBuilder appendTo(StringBuilder builder) {
+        builder
+                .append("|> ")
+                .append("UNPIVOT( ")
+                .append(valuesColumn)
+                .append(" FOR ")
+                .append(nameColumn)
+                .append(" IN (")
+                .append(Select.getStringList(pivotColumns))
+                .append("))");
+        if (alias != null) {
+            builder.append(" ").append(alias);
+        }
+        builder.append("\n");
+        return builder;
+    }
+
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/UnionPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/UnionPipeOperator.java
deleted file mode 100644
index 657e2aa7f..000000000
--- a/src/main/java/net/sf/jsqlparser/statement/piped/UnionPipeOperator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package net.sf.jsqlparser.statement.piped;
-
-public class UnionPipeOperator extends PipeOperator {
-    @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
-        return visitor.visit(this, context);
-    }
-}
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/WherePipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/WherePipeOperator.java
index 17fe359c4..15bcd8dbe 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/WherePipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/WherePipeOperator.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.expression.Expression;
@@ -19,7 +28,7 @@ public WherePipeOperator setExpression(Expression expression) {
     }
 
     @Override
-    public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
+    public <T, S> T accept(PipeOperatorVisitor<T, S> visitor, S context) {
         return visitor.visit(this, context);
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/piped/WindowPipeOperator.java b/src/main/java/net/sf/jsqlparser/statement/piped/WindowPipeOperator.java
index a349e6007..31902570d 100644
--- a/src/main/java/net/sf/jsqlparser/statement/piped/WindowPipeOperator.java
+++ b/src/main/java/net/sf/jsqlparser/statement/piped/WindowPipeOperator.java
@@ -1,9 +1,18 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.statement.select.SelectItem;
 
 public class WindowPipeOperator extends SelectPipeOperator {
     public WindowPipeOperator(SelectItem<?> selectItem) {
-        super("WINDOW", selectItem);
+        super("WINDOW", selectItem, null);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/AllColumns.java b/src/main/java/net/sf/jsqlparser/statement/select/AllColumns.java
index a1b16dae9..08b8532e3 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/AllColumns.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/AllColumns.java
@@ -20,18 +20,18 @@
 
 public class AllColumns extends ASTNodeAccessImpl implements Expression {
     protected ExpressionList<Column> exceptColumns;
-    protected List<SelectItem<Column>> replaceExpressions;
+    protected List<SelectItem<?>> replaceExpressions;
     private String exceptKeyword;
 
     public AllColumns(ExpressionList<Column> exceptColumns,
-            List<SelectItem<Column>> replaceExpressions) {
+            List<SelectItem<?>> replaceExpressions) {
         this.exceptColumns = exceptColumns;
         this.replaceExpressions = replaceExpressions;
         this.exceptKeyword = exceptColumns != null ? "Except" : null;
     }
 
     public AllColumns(ExpressionList<Column> exceptColumns,
-            List<SelectItem<Column>> replaceExpressions, String exceptKeyword) {
+            List<SelectItem<?>> replaceExpressions, String exceptKeyword) {
         this.exceptColumns = exceptColumns;
         this.replaceExpressions = replaceExpressions;
         this.exceptKeyword = exceptKeyword;
@@ -58,16 +58,16 @@ public ExpressionList<Column> addExceptColumn(Column column) {
         return exceptColumns;
     }
 
-    public List<SelectItem<Column>> getReplaceExpressions() {
+    public List<SelectItem<?>> getReplaceExpressions() {
         return replaceExpressions;
     }
 
-    public AllColumns setReplaceExpressions(List<SelectItem<Column>> replaceExpressions) {
+    public AllColumns setReplaceExpressions(List<SelectItem<?>> replaceExpressions) {
         this.replaceExpressions = replaceExpressions;
         return this;
     }
 
-    public List<SelectItem<Column>> addReplaceExpression(SelectItem<Column> selectItem) {
+    public List<SelectItem<?>> addReplaceExpression(SelectItem<?> selectItem) {
         if (replaceExpressions == null) {
             replaceExpressions = new ArrayList<>();
         }
@@ -92,12 +92,8 @@ public StringBuilder appendTo(StringBuilder builder) {
             builder.append(" )");
         }
         if (replaceExpressions != null && !replaceExpressions.isEmpty()) {
-            builder.append(" Replace(");
-            int i = 0;
-            for (SelectItem<?> selectItem : replaceExpressions) {
-                builder.append(i++ > 0 ? ", " : " ");
-                selectItem.appendTo(builder);
-            }
+            builder.append(" REPLACE( ");
+            builder.append(Select.getStringList(replaceExpressions));
             builder.append(" )");
         }
         return builder;
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/AllTableColumns.java b/src/main/java/net/sf/jsqlparser/statement/select/AllTableColumns.java
index d5c41e7c7..85e517aa1 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/AllTableColumns.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/AllTableColumns.java
@@ -21,13 +21,13 @@ public class AllTableColumns extends AllColumns {
     private Table table;
 
     public AllTableColumns(Table table, ExpressionList<Column> exceptColumns,
-            List<SelectItem<Column>> replaceExpressions, String exceptKeyword) {
+            List<SelectItem<?>> replaceExpressions, String exceptKeyword) {
         super(exceptColumns, replaceExpressions, exceptKeyword);
         this.table = table;
     }
 
     public AllTableColumns(Table table, ExpressionList<Column> exceptColumns,
-            List<SelectItem<Column>> replaceExpressions) {
+            List<SelectItem<?>> replaceExpressions) {
         this(table, exceptColumns, replaceExpressions, "EXCEPT");
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Distinct.java b/src/main/java/net/sf/jsqlparser/statement/select/Distinct.java
index 37f64ad81..c0312384a 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/Distinct.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/Distinct.java
@@ -20,6 +20,7 @@ public class Distinct implements Serializable {
 
     private List<SelectItem<?>> onSelectItems;
     private boolean useUnique = false;
+    private boolean useDistinctRow = false;
 
     public Distinct() {}
 
@@ -43,9 +44,18 @@ public void setUseUnique(boolean useUnique) {
         this.useUnique = useUnique;
     }
 
+    public boolean isUseDistinctRow() {
+        return useDistinctRow;
+    }
+
+    public void setUseDistinctRow(boolean useDistinctRow) {
+        this.useDistinctRow = useDistinctRow;
+    }
+
     @Override
     public String toString() {
-        String sql = useUnique ? "UNIQUE" : "DISTINCT";
+        String distinctIdentifier = useDistinctRow ? "DISTINCTROW" : "DISTINCT";
+        String sql = useUnique ? "UNIQUE" : distinctIdentifier;
 
         if (onSelectItems != null && !onSelectItems.isEmpty()) {
             sql += " ON (" + PlainSelect.getStringList(onSelectItems) + ")";
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ExceptOp.java b/src/main/java/net/sf/jsqlparser/statement/select/ExceptOp.java
index f6b11a70a..a16320822 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/ExceptOp.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/ExceptOp.java
@@ -13,7 +13,47 @@
 
 public class ExceptOp extends SetOperation {
 
+    private boolean distinct;
+    private boolean all;
+
     public ExceptOp() {
         super(SetOperationType.EXCEPT);
     }
+
+    public boolean isAll() {
+        return all;
+    }
+
+    public void setAll(boolean all) {
+        this.all = all;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    @Override
+    public String toString() {
+        String allDistinct = "";
+        if (isAll()) {
+            allDistinct = " ALL";
+        } else if (isDistinct()) {
+            allDistinct = " DISTINCT";
+        }
+        return super.toString() + allDistinct;
+    }
+
+    public ExceptOp withDistinct(boolean distinct) {
+        this.setDistinct(distinct);
+        return this;
+    }
+
+    public ExceptOp withAll(boolean all) {
+        this.setAll(all);
+        return this;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/FromItem.java b/src/main/java/net/sf/jsqlparser/statement/select/FromItem.java
index 32a6dab0b..b452d69a9 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/FromItem.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/FromItem.java
@@ -47,16 +47,25 @@ default FromItem withUnPivot(UnPivot unpivot) {
         return this;
     }
 
+    SampleClause getSampleClause();
+
+    FromItem setSampleClause(SampleClause sampleClause);
+
     default StringBuilder appendTo(StringBuilder builder, Alias alias) {
-        return appendTo(builder, alias, null, null);
+        return appendTo(builder, alias, null, null, null);
     }
 
-    default StringBuilder appendTo(StringBuilder builder, Alias alias, Pivot pivot,
+    default StringBuilder appendTo(StringBuilder builder, Alias alias, SampleClause sampleClause,
+            Pivot pivot,
             UnPivot unPivot) {
         if (alias != null) {
             builder.append(alias);
         }
 
+        if (sampleClause != null) {
+            builder.append(sampleClause);
+        }
+
         if (pivot != null) {
             builder.append(" ").append(pivot);
         }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java
index 0d97c4e4b..ed4432003 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java
@@ -10,10 +10,39 @@
 package net.sf.jsqlparser.statement.select;
 
 import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.piped.FromQuery;
 
+import java.util.Collection;
+import java.util.List;
+
 public interface FromItemVisitor<T> {
 
+    default <S> T visitFromItem(FromItem fromItem, S context) {
+        if (fromItem != null) {
+            fromItem.accept(this, context);
+        }
+        return null;
+    }
+
+    default <S> T visitTables(List<Table> tables, S context) {
+        if (tables != null) {
+            for (Table table : tables) {
+                table.accept(this, context);
+            }
+        }
+        return null;
+    }
+
+    default <S> T visitJoins(Collection<Join> joins, S context) {
+        if (joins != null) {
+            for (Join join : joins) {
+                join.getFromItem().accept(this, context);
+            }
+        }
+        return null;
+    }
+
     <S> T visit(Table tableName, S context);
 
     default void visit(Table tableName) {
@@ -68,5 +97,11 @@ default void visit(TableStatement tableStatement) {
         this.visit(tableStatement, null);
     }
 
+    <S> T visit(Import imprt, S context);
+
+    default void visit(Import imprt) {
+        this.visit(imprt, null);
+    }
+
     <S> T visit(FromQuery fromQuery, S context);
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java
index 1ea920707..783b614f2 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java
@@ -9,28 +9,96 @@
  */
 package net.sf.jsqlparser.statement.select;
 
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
+import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.piped.FromQuery;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
 @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
 public class FromItemVisitorAdapter<T> implements FromItemVisitor<T> {
+    private SelectVisitor<T> selectVisitor;
+    private ExpressionVisitor<T> expressionVisitor;
+
+    public FromItemVisitorAdapter(SelectVisitor<T> selectVisitor,
+            ExpressionVisitor<T> expressionVisitor) {
+        this.selectVisitor = selectVisitor;
+        this.expressionVisitor = expressionVisitor;
+    }
+
+    public FromItemVisitorAdapter(ExpressionVisitor<T> expressionVisitor) {
+        this.selectVisitor = new SelectVisitorAdapter<>(expressionVisitor);
+        this.expressionVisitor = expressionVisitor;
+    }
+
+    public FromItemVisitorAdapter() {
+        this.selectVisitor = new SelectVisitorAdapter<>();
+        this.expressionVisitor = new ExpressionVisitorAdapter<>(this.selectVisitor);
+    }
+
+
+    public SelectVisitor<T> getSelectVisitor() {
+        return selectVisitor;
+    }
+
+    public FromItemVisitorAdapter<T> setSelectVisitor(SelectVisitor<T> selectVisitor) {
+        this.selectVisitor = selectVisitor;
+        return this;
+    }
+
+    public FromItemVisitorAdapter<T> setSelectVisitor(SelectVisitorAdapter<T> selectVisitor) {
+        this.selectVisitor = selectVisitor;
+        this.expressionVisitor = selectVisitor.getExpressionVisitor();
+        return this;
+    }
+
+    public ExpressionVisitor<T> getExpressionVisitor() {
+        return expressionVisitor;
+    }
+
+    public FromItemVisitorAdapter<T> setExpressionVisitor(ExpressionVisitor<T> expressionVisitor) {
+        this.expressionVisitor = expressionVisitor;
+        return this;
+    }
 
     @Override
-    public <S> T visit(Table table, S context) {
+    public <S> T visitJoins(Collection<Join> joins, S context) {
+        if (joins != null) {
+            for (Join join : joins) {
+                join.getFromItem().accept(this, context);
+                if (join.getUsingColumns() != null) {
+                    for (Column column : join.getUsingColumns()) {
+                        column.accept(expressionVisitor, context);
+                    }
+                }
+                if (join.getOnExpressions() != null) {
+                    for (Expression expression : join.getOnExpressions()) {
+                        expression.accept(expressionVisitor, context);
+                    }
+                }
+            }
+        }
+        return null;
+    }
 
+    @Override
+    public <S> T visit(Table table, S context) {
         return null;
     }
 
     @Override
     public <S> T visit(ParenthesedSelect select, S context) {
-
-        return null;
+        return select.getPlainSelect().accept(selectVisitor, context);
     }
 
     @Override
     public <S> T visit(LateralSubSelect lateralSubSelect, S context) {
-
-        return null;
+        return lateralSubSelect.getPlainSelect().accept(selectVisitor, context);
     }
 
     @Override
@@ -41,36 +109,43 @@ public <S> T visit(TableFunction tableFunction, S context) {
 
     @Override
     public <S> T visit(ParenthesedFromItem fromItem, S context) {
-
-        return null;
+        return fromItem.getFromItem().accept(this, context);
     }
 
     @Override
     public <S> T visit(Values values, S context) {
-
+        for (Expression expression : values.getExpressions()) {
+            expression.accept(expressionVisitor, context);
+        }
         return null;
     }
 
     @Override
     public <S> T visit(PlainSelect plainSelect, S context) {
-
-        return null;
+        return plainSelect.accept(selectVisitor, context);
     }
 
     @Override
     public <S> T visit(SetOperationList setOperationList, S context) {
+        ArrayList<T> results = new ArrayList<>();
+        for (Select select : setOperationList.getSelects()) {
+            results.add(select.accept(selectVisitor, context));
+        }
+        return results.isEmpty() ? null : results.get(0);
+    }
 
+    @Override
+    public <S> T visit(TableStatement tableStatement, S context) {
         return null;
     }
 
     @Override
-    public <S> T visit(TableStatement tableStatement, S context) {
+    public <S> T visit(Import imprt, S context) {
 
         return null;
     }
 
-    @Override
     public <S> T visit(FromQuery fromQuery, S context) {
-        return null;
+        return fromQuery.accept(selectVisitor, context);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/FunctionAllColumns.java b/src/main/java/net/sf/jsqlparser/statement/select/FunctionAllColumns.java
new file mode 100644
index 000000000..7a4fa5ce2
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/select/FunctionAllColumns.java
@@ -0,0 +1,49 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.select;
+
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.Function;
+
+
+public class FunctionAllColumns extends AllColumns {
+    private Function function;
+
+    public FunctionAllColumns(Function function) {
+        super(null, null, null);
+        this.function = function;
+    }
+
+    public Function getFunction() {
+        return function;
+    }
+
+    public FunctionAllColumns setFunction(Function function) {
+        this.function = function;
+        return this;
+    }
+
+    public StringBuilder appendTo(StringBuilder builder) {
+        builder.append("(");
+        builder.append(function);
+        builder.append(").*");
+        return builder;
+    }
+
+    @Override
+    public String toString() {
+        return appendTo(new StringBuilder()).toString();
+    }
+
+    @Override
+    public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
+        return expressionVisitor.visit(this, context);
+    }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java b/src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java
index a4517cf84..63b6b479d 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java
@@ -22,8 +22,8 @@
 import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
 
 public class GroupByElement implements Serializable {
-    private ExpressionList groupByExpressions = new ExpressionList();
-    private List<ExpressionList> groupingSets = new ArrayList<>();
+    private ExpressionList<Expression> groupByExpressions = new ExpressionList<>();
+    private List<ExpressionList<Expression>> groupingSets = new ArrayList<>();
     // postgres rollup is an ExpressionList
     private boolean mysqlWithRollup = false;
 
@@ -35,36 +35,36 @@ public <T, S> T accept(GroupByVisitor<T> groupByVisitor, S context) {
         return groupByVisitor.visit(this, context);
     }
 
-    public ExpressionList getGroupByExpressionList() {
+    public ExpressionList<Expression> getGroupByExpressionList() {
         return groupByExpressions;
     }
 
     @Deprecated
-    public ExpressionList getGroupByExpressions() {
+    public ExpressionList<Expression> getGroupByExpressions() {
         return groupByExpressions;
     }
 
-    public void setGroupByExpressions(ExpressionList groupByExpressions) {
+    public void setGroupByExpressions(ExpressionList<Expression> groupByExpressions) {
         this.groupByExpressions = groupByExpressions;
     }
 
     @Deprecated
     public void addGroupByExpression(Expression groupByExpression) {
         if (groupByExpressions.getExpressions() == null) {
-            groupByExpressions.setExpressions(new ArrayList());
+            groupByExpressions.setExpressions(new ArrayList<>());
         }
-        groupByExpressions.getExpressions().add(groupByExpression);
+        groupByExpressions.add(groupByExpression);
     }
 
-    public List<ExpressionList> getGroupingSets() {
+    public List<ExpressionList<Expression>> getGroupingSets() {
         return groupingSets;
     }
 
-    public void setGroupingSets(List<ExpressionList> groupingSets) {
+    public void setGroupingSets(List<ExpressionList<Expression>> groupingSets) {
         this.groupingSets = groupingSets;
     }
 
-    public void addGroupingSet(ExpressionList list) {
+    public void addGroupingSet(ExpressionList<Expression> list) {
         this.groupingSets.add(list);
     }
 
@@ -75,16 +75,16 @@ public String toString() {
         b.append("GROUP BY ");
 
         if (groupByExpressions != null) {
-            b.append(groupByExpressions.toString());
+            b.append(groupByExpressions);
         }
 
         int i = 0;
-        if (groupingSets.size() > 0) {
+        if (!groupingSets.isEmpty()) {
             if (b.charAt(b.length() - 1) != ' ') {
                 b.append(' ');
             }
             b.append("GROUPING SETS (");
-            for (ExpressionList expressionList : groupingSets) {
+            for (ExpressionList<?> expressionList : groupingSets) {
                 b.append(i++ > 0 ? ", " : "").append(Select.getStringList(
                         expressionList,
                         true, expressionList instanceof ParenthesedExpressionList));
@@ -99,12 +99,12 @@ public String toString() {
         return b.toString();
     }
 
-    public GroupByElement withGroupByExpressions(ExpressionList groupByExpressions) {
+    public GroupByElement withGroupByExpressions(ExpressionList<Expression> groupByExpressions) {
         this.setGroupByExpressions(groupByExpressions);
         return this;
     }
 
-    public GroupByElement withGroupingSets(List groupingSets) {
+    public GroupByElement withGroupingSets(List<ExpressionList<Expression>> groupingSets) {
         this.setGroupingSets(groupingSets);
         return this;
     }
@@ -127,7 +127,8 @@ public GroupByElement addGroupingSets(Object... groupingSets) {
         return this.withGroupingSets(collection);
     }
 
-    public GroupByElement addGroupingSets(Collection<? extends Object> groupingSets) {
+    public GroupByElement addGroupingSets(
+            Collection<List<ExpressionList<Expression>>> groupingSets) {
         List collection = Optional.ofNullable(getGroupingSets()).orElseGet(ArrayList::new);
         collection.addAll(groupingSets);
         return this.withGroupingSets(collection);
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/IntersectOp.java b/src/main/java/net/sf/jsqlparser/statement/select/IntersectOp.java
index f2248ca1b..02233a694 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/IntersectOp.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/IntersectOp.java
@@ -13,7 +13,46 @@
 
 public class IntersectOp extends SetOperation {
 
+    private boolean distinct;
+    private boolean all;
+
     public IntersectOp() {
         super(SetOperationType.INTERSECT);
     }
+    public boolean isAll() {
+        return all;
+    }
+
+    public void setAll(boolean all) {
+        this.all = all;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    @Override
+    public String toString() {
+        String allDistinct = "";
+        if (isAll()) {
+            allDistinct = " ALL";
+        } else if (isDistinct()) {
+            allDistinct = " DISTINCT";
+        }
+        return super.toString() + allDistinct;
+    }
+
+    public IntersectOp withDistinct(boolean distinct) {
+        this.setDistinct(distinct);
+        return this;
+    }
+
+    public IntersectOp withAll(boolean all) {
+        this.setAll(all);
+        return this;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Limit.java b/src/main/java/net/sf/jsqlparser/statement/select/Limit.java
index 9257daa6d..ec5923a3f 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/Limit.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/Limit.java
@@ -89,7 +89,7 @@ public String toString() {
         }
 
         if (byExpressions != null) {
-            retVal += " BY " + byExpressions.toString();
+            retVal += " BY " + byExpressions;
         }
 
         return retVal;
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/MinusOp.java b/src/main/java/net/sf/jsqlparser/statement/select/MinusOp.java
index ab779978a..e33ce1387 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/MinusOp.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/MinusOp.java
@@ -12,8 +12,46 @@
 import net.sf.jsqlparser.statement.select.SetOperationList.SetOperationType;
 
 public class MinusOp extends SetOperation {
-
+    private boolean distinct;
+    private boolean all;
+    
     public MinusOp() {
         super(SetOperationType.MINUS);
     }
+    public boolean isAll() {
+        return all;
+    }
+
+    public void setAll(boolean all) {
+        this.all = all;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    @Override
+    public String toString() {
+        String allDistinct = "";
+        if (isAll()) {
+            allDistinct = " ALL";
+        } else if (isDistinct()) {
+            allDistinct = " DISTINCT";
+        }
+        return super.toString() + allDistinct;
+    }
+
+    public MinusOp withDistinct(boolean distinct) {
+        this.setDistinct(distinct);
+        return this;
+    }
+
+    public MinusOp withAll(boolean all) {
+        this.setAll(all);
+        return this;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedFromItem.java b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedFromItem.java
index 2e4c44e28..1d32fde7c 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedFromItem.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedFromItem.java
@@ -23,6 +23,7 @@ public class ParenthesedFromItem extends ASTNodeAccessImpl implements FromItem {
     private Alias alias;
     private Pivot pivot;
     private UnPivot unPivot;
+    private SampleClause sampleClause;
 
     public ParenthesedFromItem() {}
 
@@ -130,6 +131,22 @@ public void setUnPivot(UnPivot unpivot) {
         this.unPivot = unpivot;
     }
 
+    @Override
+    public SampleClause getSampleClause() {
+        return sampleClause;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        this.sampleClause = sampleClause;
+        return this;
+    }
+
+    public ParenthesedFromItem withSampleClause(SampleClause sampleClause) {
+        this.sampleClause = sampleClause;
+        return this;
+    }
+
     public ParenthesedFromItem withFromItem(FromItem fromItem) {
         this.setFromItem(fromItem);
         return this;
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedSelect.java b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedSelect.java
index 7fa729e37..59e2bac3d 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedSelect.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedSelect.java
@@ -23,6 +23,7 @@ public class ParenthesedSelect extends Select implements FromItem, ParenthesedSt
     Pivot pivot;
     UnPivot unPivot;
     Select select;
+    SampleClause sampleClause = null;
 
     public ParenthesedSelect() {}
 
@@ -79,7 +80,8 @@ private static Alias getAliasFromItem(FromItem fromItem) {
             TableFunction t = (TableFunction) fromItem;
             return new Alias(t.getName(), true);
         } else {
-            return new Alias(fromItem.getAlias().getName(), true);
+            return fromItem.getAlias() != null ? new Alias(fromItem.getAlias().getName(), true)
+                    : null;
         }
     }
 
@@ -116,6 +118,22 @@ public void setUnPivot(UnPivot unPivot) {
         this.unPivot = unPivot;
     }
 
+    @Override
+    public SampleClause getSampleClause() {
+        return sampleClause;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        this.sampleClause = sampleClause;
+        return this;
+    }
+
+    public ParenthesedSelect withSampleClause(SampleClause sampleClause) {
+        this.sampleClause = sampleClause;
+        return this;
+    }
+
     public Select getSelect() {
         return select;
     }
@@ -163,7 +181,7 @@ public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
 
     public StringBuilder appendSelectBodyTo(StringBuilder builder) {
         builder.append("(").append(select).append(")");
-        appendTo(builder, alias, pivot, unPivot);
+        appendTo(builder, alias, sampleClause, pivot, unPivot);
         return builder;
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Pivot.java b/src/main/java/net/sf/jsqlparser/statement/select/Pivot.java
index 87d20dbee..be3a9595f 100755
--- a/src/main/java/net/sf/jsqlparser/statement/select/Pivot.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/Pivot.java
@@ -99,6 +99,12 @@ public Pivot withForColumns(ExpressionList<Column> forColumns) {
         return this;
     }
 
+    public Pivot addForColumn(Column... forColumns) {
+        ExpressionList<Column> forColumnsList = new ExpressionList<>(forColumns);
+        this.setForColumns(forColumnsList);
+        return this;
+    }
+
     public Pivot withSingleInItems(List<SelectItem<?>> singleInItems) {
         this.setSingleInItems(singleInItems);
         return this;
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/PivotVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/select/PivotVisitorAdapter.java
index 6e7fce93f..2a9f2c6af 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/PivotVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/PivotVisitorAdapter.java
@@ -9,8 +9,20 @@
  */
 package net.sf.jsqlparser.statement.select;
 
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
+
 @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
 public class PivotVisitorAdapter<T> implements PivotVisitor<T> {
+    private final ExpressionVisitor<T> expressionVisitor;
+
+    public PivotVisitorAdapter() {
+        this.expressionVisitor = new ExpressionVisitorAdapter<T>();
+    }
+
+    public PivotVisitorAdapter(ExpressionVisitor<T> expressionVisitor) {
+        this.expressionVisitor = expressionVisitor;
+    }
 
     @Override
     public <S> T visit(Pivot pivot, S context) {
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java
index 1e84123c4..8698e3152 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java
@@ -207,7 +207,7 @@ public List<LateralView> getLateralViews() {
     }
 
     public void setLateralViews(Collection<LateralView> lateralViews) {
-        if (this.lateralViews == null && lateralViews != null) {
+        if (this.lateralViews == null) {
             this.lateralViews = new ArrayList<>();
         } else {
             this.lateralViews.clear();
@@ -324,6 +324,16 @@ public <T, S> T accept(FromItemVisitor<T> fromItemVisitor, S context) {
         return fromItemVisitor.visit(this, context);
     }
 
+    @Override
+    public SampleClause getSampleClause() {
+        return null;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        return null;
+    }
+
     public OptimizeFor getOptimizeFor() {
         return optimizeFor;
     }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SampleClause.java b/src/main/java/net/sf/jsqlparser/statement/select/SampleClause.java
index 8aeea8d50..a856e18e4 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/SampleClause.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/SampleClause.java
@@ -13,25 +13,28 @@ public class SampleClause {
     private SampleKeyword keyword;
     private SampleMethod method;
     private Number percentageArgument;
+    private String percentageUnit;
     private Number repeatArgument;
     // Oracle Specific
     private Number seedArgument;
 
     public SampleClause(String keyword, String method, Number percentageArgument,
+            String percentageUnit,
             Number repeatArgument, Number seedArgument) {
         this.keyword = SampleKeyword.from(keyword);
         this.method = method == null || method.length() == 0 ? null : SampleMethod.from(method);
         this.percentageArgument = percentageArgument;
+        this.percentageUnit = percentageUnit;
         this.repeatArgument = repeatArgument;
         this.seedArgument = seedArgument;
     }
 
     public SampleClause() {
-        this(SampleKeyword.TABLESAMPLE.toString(), null, null, null, null);
+        this(SampleKeyword.TABLESAMPLE.toString(), null, null, null, null, null);
     }
 
     public SampleClause(String keyword) {
-        this(keyword, null, null, null, null);
+        this(keyword, null, null, null, null, null);
     }
 
     public SampleKeyword getKeyword() {
@@ -56,6 +59,15 @@ public Number getRepeatArgument() {
         return repeatArgument;
     }
 
+    public String getPercentageUnit() {
+        return percentageUnit;
+    }
+
+    public SampleClause setPercentageUnit(String percentageUnit) {
+        this.percentageUnit = percentageUnit;
+        return this;
+    }
+
     public SampleClause setRepeatArgument(Number repeatArgument) {
         this.repeatArgument = repeatArgument;
         return this;
@@ -92,7 +104,8 @@ public StringBuilder appendTo(StringBuilder builder) {
         }
 
         if (percentageArgument != null) {
-            builder.append(" (").append(percentageArgument).append(")");
+            builder.append(" (").append(percentageArgument)
+                    .append(percentageUnit != null ? " " + percentageUnit : "").append(")");
         }
 
         if (repeatArgument != null) {
@@ -111,10 +124,22 @@ public String toString() {
     }
 
     public enum SampleKeyword {
-        SAMPLE, TABLESAMPLE;
+        SAMPLE("SAMPLE"), TABLESAMPLE("TABLESAMPLE"), USING_SAMPLE("USING SAMPLE");
+
+        String keyword;
+
+        SampleKeyword(String keyword) {
+            this.keyword = keyword;
+        }
 
         public static SampleKeyword from(String sampleKeyword) {
-            return Enum.valueOf(SampleKeyword.class, sampleKeyword.toUpperCase());
+            return Enum.valueOf(SampleKeyword.class,
+                    sampleKeyword.toUpperCase().replaceAll(" ", "_"));
+        }
+
+        @Override
+        public String toString() {
+            return keyword;
         }
     }
 
@@ -122,7 +147,8 @@ public enum SampleMethod {
         BERNOULLI, SYSTEM, BLOCK;
 
         public static SampleMethod from(String sampleMethod) {
-            return Enum.valueOf(SampleMethod.class, sampleMethod.toUpperCase());
+            return Enum.valueOf(SampleMethod.class,
+                    sampleMethod.toUpperCase().replaceAll(" ", "_"));
         }
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Select.java b/src/main/java/net/sf/jsqlparser/statement/select/Select.java
index 7a07105fd..0e88dfabc 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/Select.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/Select.java
@@ -26,7 +26,7 @@
 
 public abstract class Select extends ASTNodeAccessImpl implements Statement, Expression, FromItem {
     protected Table forUpdateTable = null;
-    List<WithItem<?>> withItemsList;
+    protected List<WithItem<?>> withItemsList;
     Limit limitBy;
     Limit limit;
     Offset offset;
@@ -379,6 +379,8 @@ public StringBuilder appendTo(StringBuilder builder) {
 
         appendSelectBodyTo(builder);
 
+        appendTo(builder, alias, null, pivot, unPivot);
+
         if (forClause != null) {
             forClause.appendTo(builder);
         }
@@ -420,8 +422,6 @@ public StringBuilder appendTo(StringBuilder builder) {
             }
         }
 
-        appendTo(builder, alias, pivot, unPivot);
-
         return builder;
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectItem.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectItem.java
index d2eb11fd6..1861be402 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/SelectItem.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/SelectItem.java
@@ -101,7 +101,7 @@ public SelectItem<T> withExpression(T expression) {
         return this;
     }
 
-    public SelectItem<?> withAlias(Alias alias) {
+    public SelectItem<T> withAlias(Alias alias) {
         this.setAlias(alias);
         return this;
     }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectItemVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectItemVisitorAdapter.java
index 1fc7a2322..a72ff0b70 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/SelectItemVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/SelectItemVisitorAdapter.java
@@ -10,11 +10,23 @@
 package net.sf.jsqlparser.statement.select;
 
 import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
 
 @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
 public class SelectItemVisitorAdapter<T> implements SelectItemVisitor<T> {
+    private final ExpressionVisitor<T> expressionVisitor;
+
+    public SelectItemVisitorAdapter() {
+        this.expressionVisitor = new ExpressionVisitorAdapter<>();
+    }
+
+    public SelectItemVisitorAdapter(ExpressionVisitor<T> expressionVisitor) {
+        this.expressionVisitor = expressionVisitor;
+    }
+
     @Override
     public <S> T visit(SelectItem<? extends Expression> item, S context) {
-        return null;
+        return item.getExpression().accept(expressionVisitor, context);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java
index 94357bcd9..db5ce3175 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java
@@ -9,9 +9,24 @@
  */
 package net.sf.jsqlparser.statement.select;
 
+import net.sf.jsqlparser.statement.OutputClause;
 import net.sf.jsqlparser.statement.piped.FromQuery;
 
+import java.util.List;
+
 public interface SelectVisitor<T> {
+    default <S> T visitWithItems(List<WithItem<?>> withItemsList, S context) {
+        if (withItemsList != null) {
+            for (WithItem<?> withItem : withItemsList) {
+                withItem.accept(this, context);
+            }
+        }
+        return null;
+    }
+
+    default <S> T visitOutputClause(OutputClause outputClause, S context) {
+        return null;
+    }
 
     <S> T visit(ParenthesedSelect parenthesedSelect, S context);
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java
index 462160e9f..aa0052c15 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java
@@ -9,18 +9,192 @@
  */
 package net.sf.jsqlparser.statement.select;
 
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
+import net.sf.jsqlparser.statement.OutputClause;
 import net.sf.jsqlparser.statement.piped.FromQuery;
 
 @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
 public class SelectVisitorAdapter<T> implements SelectVisitor<T> {
+    private final ExpressionVisitor<T> expressionVisitor;
+    private final PivotVisitor<T> pivotVisitor;
+    private final SelectItemVisitor<T> selectItemVisitor;
+    private final FromItemVisitor<T> fromItemVisitor;
+
+    public SelectVisitorAdapter() {
+        this.expressionVisitor = new ExpressionVisitorAdapter<>(this);
+        this.pivotVisitor = new PivotVisitorAdapter<>(this.expressionVisitor);
+        this.selectItemVisitor = new SelectItemVisitorAdapter<>(this.expressionVisitor);
+        this.fromItemVisitor = new FromItemVisitorAdapter<>(this, this.expressionVisitor);
+    }
+
+    public SelectVisitorAdapter(ExpressionVisitor<T> expressionVisitor,
+            PivotVisitor<T> pivotVisitor, SelectItemVisitor<T> selectItemVisitor,
+            FromItemVisitor<T> fromItemVisitor) {
+        this.expressionVisitor = expressionVisitor;
+        this.pivotVisitor = pivotVisitor;
+        this.selectItemVisitor = selectItemVisitor;
+        this.fromItemVisitor = fromItemVisitor;
+    }
+
+    public SelectVisitorAdapter(ExpressionVisitor<T> expressionVisitor,
+            FromItemVisitor<T> fromItemVisitor) {
+        this.expressionVisitor = expressionVisitor;
+        this.pivotVisitor = new PivotVisitorAdapter<>();
+        this.selectItemVisitor = new SelectItemVisitorAdapter<>(this.expressionVisitor);
+        this.fromItemVisitor = fromItemVisitor;
+    }
+
+    public SelectVisitorAdapter(ExpressionVisitor<T> expressionVisitor) {
+        this.expressionVisitor = expressionVisitor;
+        this.pivotVisitor = new PivotVisitorAdapter<>();
+        this.selectItemVisitor = new SelectItemVisitorAdapter<>(this.expressionVisitor);
+        this.fromItemVisitor = new FromItemVisitorAdapter<>();
+    }
 
     @Override
-    public <S> T visit(ParenthesedSelect parenthesedSelect, S context) {
-        return parenthesedSelect.getSelect().accept(this, context);
+    public <S> T visitOutputClause(OutputClause outputClause, S context) {
+        if (outputClause != null) {
+            if (outputClause.getSelectItemList() != null) {
+                for (SelectItem<?> selectItem : outputClause.getSelectItemList()) {
+                    selectItem.accept(selectItemVisitor, context);
+                }
+            }
+            if (outputClause.getTableVariable() != null) {
+                outputClause.getTableVariable().accept(expressionVisitor, context);
+            }
+            if (outputClause.getOutputTable() != null) {
+                outputClause.getOutputTable().accept(fromItemVisitor, context);
+            }
+            // @todo: check why this is a list of strings
+            // if (outputClause.getColumnList()!=null) {
+            // for (Column column:outputClause.getColumnList())
+            // }
+        }
+        return null;
+    }
+
+    public ExpressionVisitor<T> getExpressionVisitor() {
+        return expressionVisitor;
+    }
+
+    public PivotVisitor<T> getPivotVisitor() {
+        return pivotVisitor;
+    }
+
+    public SelectItemVisitor<T> getSelectItemVisitor() {
+        return selectItemVisitor;
+    }
+
+    public FromItemVisitor<T> getFromItemVisitor() {
+        return fromItemVisitor;
+    }
+
+    @Override
+    public <S> T visit(ParenthesedSelect select, S context) {
+        visitWithItems(select.withItemsList, context);
+
+        select.getSelect().accept(this, context);
+
+        expressionVisitor.visitOrderBy(select.getOrderByElements(), context);
+
+        Pivot pivot = select.getPivot();
+        if (pivot != null) {
+            pivot.accept(pivotVisitor, context);
+        }
+        UnPivot unpivot = select.getUnPivot();
+        if (unpivot != null) {
+            unpivot.accept(pivotVisitor, context);
+        }
+
+        expressionVisitor.visitLimit(select.getLimit(), context);
+
+        if (select.getOffset() != null) {
+            expressionVisitor.visitExpression(select.getOffset().getOffset(), null);
+        }
+        if (select.getFetch() != null) {
+            expressionVisitor.visitExpression(select.getFetch().getExpression(), null);
+        }
+
+        return null;
     }
 
     @Override
+    @SuppressWarnings({"PMD.ExcessiveMethodLength"})
     public <S> T visit(PlainSelect plainSelect, S context) {
+        visitWithItems(plainSelect.withItemsList, context);
+
+        if (plainSelect.getDistinct() != null) {
+            for (SelectItem<?> selectItem : plainSelect.getDistinct().getOnSelectItems()) {
+                selectItem.accept(selectItemVisitor, context);
+            }
+        }
+
+        if (plainSelect.getTop() != null) {
+            plainSelect.getTop().getExpression().accept(expressionVisitor, context);
+        }
+
+        for (SelectItem<?> selectItem : plainSelect.getSelectItems()) {
+            selectItem.accept(selectItemVisitor, context);
+        }
+
+        fromItemVisitor.visitTables(plainSelect.getIntoTables(), context);
+        fromItemVisitor.visitFromItem(plainSelect.getFromItem(), context);
+
+        // if (plainSelect.getLateralViews() != null) {
+        // //@todo: implement this
+        // }
+
+        fromItemVisitor.visitJoins(plainSelect.getJoins(), context);
+
+        // if (plainSelect.getKsqlWindow() != null) {
+        // //@todo: implement
+        // }
+
+        expressionVisitor.visitExpression(plainSelect.getWhere(), context);
+
+        // if (plainSelect.getOracleHierarchical() != null) {
+        // //@todo: implement
+        // }
+        //
+
+        expressionVisitor.visitPreferringClause(plainSelect.getPreferringClause(), context);
+        expressionVisitor.visit(plainSelect.getGroupBy(), context);
+        expressionVisitor.visitExpression(plainSelect.getHaving(), context);
+        expressionVisitor.visitExpression(plainSelect.getQualify(), context);
+
+        // if (plainSelect.getWindowDefinitions() != null) {
+        // //@todo: implement
+        // }
+
+        Pivot pivot = plainSelect.getPivot();
+        if (pivot != null) {
+            pivot.accept(pivotVisitor, context);
+        }
+        UnPivot unpivot = plainSelect.getUnPivot();
+        if (unpivot != null) {
+            unpivot.accept(pivotVisitor, context);
+        }
+
+        expressionVisitor.visitOrderBy(plainSelect.getOrderByElements(), context);
+
+        // if (plainSelect.getLimitBy() != null) {
+        // //@todo: implement
+        // }
+        // if (plainSelect.getLimit() != null) {
+        // //@todo: implement
+        // }
+        if (plainSelect.getOffset() != null) {
+            expressionVisitor.visitExpression(plainSelect.getOffset().getOffset(), context);
+        }
+        if (plainSelect.getFetch() != null) {
+            expressionVisitor.visitExpression(plainSelect.getFetch().getExpression(), context);
+        }
+        // if (plainSelect.getForMode() != null) {
+        // //@todo: implement
+        // }
+
+        fromItemVisitor.visitFromItem(plainSelect.getIntoTempTable(), context);
         return null;
     }
 
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SetOperationList.java b/src/main/java/net/sf/jsqlparser/statement/select/SetOperationList.java
index 960c11e54..465eca2d5 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/SetOperationList.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/SetOperationList.java
@@ -32,6 +32,16 @@ public <T, S> T accept(FromItemVisitor<T> fromItemVisitor, S context) {
         return fromItemVisitor.visit(this, context);
     }
 
+    @Override
+    public SampleClause getSampleClause() {
+        return null;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        return null;
+    }
+
     public List<OrderByElement> getOrderByElements() {
         return orderByElements;
     }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/TableFunction.java b/src/main/java/net/sf/jsqlparser/statement/select/TableFunction.java
index 7d3a5242a..2f4b8614f 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/TableFunction.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/TableFunction.java
@@ -20,6 +20,7 @@ public class TableFunction extends Function implements FromItem {
     private Pivot pivot = null;
     private UnPivot unPivot = null;
     private Function function;
+    private String withClause = null;
 
     public TableFunction(Function function) {
         this.function = function;
@@ -30,6 +31,17 @@ public TableFunction(String prefix, Function function) {
         this.function = function;
     }
 
+    public TableFunction(Function function, String withClause) {
+        this.function = function;
+        this.withClause = withClause;
+    }
+
+    public TableFunction(String prefix, Function function, String withClause) {
+        this.prefix = prefix;
+        this.function = function;
+        this.withClause = withClause;
+    }
+
     public TableFunction(String prefix, String name, Expression... parameters) {
         this.prefix = prefix;
         this.function = new Function(name, parameters);
@@ -62,6 +74,19 @@ public TableFunction setPrefix(String prefix) {
         return this;
     }
 
+    public String getWithClause() {
+        return withClause;
+    }
+
+    public void setWithClause(String withClause) {
+        this.withClause = withClause;
+    }
+
+    public TableFunction withWithClause(String withClause) {
+        this.withClause = withClause;
+        return this;
+    }
+
     @Override
     public <T, S> T accept(FromItemVisitor<T> fromItemVisitor, S context) {
         return fromItemVisitor.visit(this, context);
@@ -112,12 +137,26 @@ public TableFunction withUnPivot(UnPivot unpivot) {
         return (TableFunction) FromItem.super.withUnPivot(unpivot);
     }
 
+    @Override
+    public SampleClause getSampleClause() {
+        return null;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        return null;
+    }
+
     public StringBuilder appendTo(StringBuilder builder) {
         if (prefix != null) {
             builder.append(prefix).append(" ");
         }
         builder.append(function.toString());
 
+        if (withClause != null) {
+            builder.append(" WITH ").append(withClause);
+        }
+
         if (alias != null) {
             builder.append(alias);
         }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/TableStatement.java b/src/main/java/net/sf/jsqlparser/statement/select/TableStatement.java
index f1ccd0728..d5c7dc152 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/TableStatement.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/TableStatement.java
@@ -60,4 +60,14 @@ public <T, S> T accept(SelectVisitor<T> selectVisitor, S context) {
     public <T, S> T accept(FromItemVisitor<T> fromItemVisitor, S context) {
         return fromItemVisitor.visit(this, context);
     }
+
+    @Override
+    public SampleClause getSampleClause() {
+        return null;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        return null;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Values.java b/src/main/java/net/sf/jsqlparser/statement/select/Values.java
index e574b1a05..6cc0e3851 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/Values.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/Values.java
@@ -35,7 +35,7 @@ public Values(ExpressionList<Expression> expressions, Alias alias) {
         this.alias = alias;
     }
 
-    public ExpressionList<?> getExpressions() {
+    public ExpressionList<Expression> getExpressions() {
         return expressions;
     }
 
@@ -108,4 +108,14 @@ public UnPivot getUnPivot() {
     public void setUnPivot(UnPivot unpivot) {
 
     }
+
+    @Override
+    public SampleClause getSampleClause() {
+        return null;
+    }
+
+    @Override
+    public FromItem setSampleClause(SampleClause sampleClause) {
+        return null;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/WithItem.java b/src/main/java/net/sf/jsqlparser/statement/select/WithItem.java
index f1e5be3cd..d40264815 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/WithItem.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/WithItem.java
@@ -11,26 +11,27 @@
 
 import net.sf.jsqlparser.expression.Alias;
 import net.sf.jsqlparser.statement.ParenthesedStatement;
+import net.sf.jsqlparser.statement.StatementVisitor;
 import net.sf.jsqlparser.statement.delete.ParenthesedDelete;
 import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
 import net.sf.jsqlparser.statement.update.ParenthesedUpdate;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 
-public class WithItem<T extends ParenthesedStatement> {
-
-    private T statement;
+public class WithItem<K extends ParenthesedStatement> implements Serializable {
+    private K statement;
     private Alias alias;
     private List<SelectItem<?>> withItemList;
     private boolean recursive = false;
-
+    private boolean usingNot = false;
     private boolean materialized = false;
 
-    public WithItem(T statement, Alias alias) {
+    public WithItem(K statement, Alias alias) {
         this.statement = statement;
         this.alias = alias;
     }
@@ -39,15 +40,15 @@ public WithItem() {
         this(null, (Alias) null);
     }
 
-    public T getParenthesedStatement() {
+    public K getParenthesedStatement() {
         return statement;
     }
 
-    public void setParenthesedStatement(T statement) {
+    public void setParenthesedStatement(K statement) {
         this.statement = statement;
     }
 
-    public WithItem<T> withParenthesedStatement(T statement) {
+    public WithItem<K> withParenthesedStatement(K statement) {
         this.setParenthesedStatement(statement);
         return this;
     }
@@ -89,6 +90,24 @@ public void setMaterialized(boolean materialized) {
         this.materialized = materialized;
     }
 
+    public K getStatement() {
+        return statement;
+    }
+
+    public WithItem<K> setStatement(K statement) {
+        this.statement = statement;
+        return this;
+    }
+
+    public boolean isUsingNot() {
+        return usingNot;
+    }
+
+    public WithItem<K> setUsingNot(boolean usingNot) {
+        this.usingNot = usingNot;
+        return this;
+    }
+
     /**
      * The {@link SelectItem}s in this WITH (for example the A,B,C in "WITH mywith (A,B,C) AS ...")
      *
@@ -118,15 +137,24 @@ public String toString() {
             builder.append(")");
         }
         builder.append(" AS ");
-        builder.append(materialized ? "MATERIALIZED " : "");
+        if (materialized) {
+            builder.append(usingNot
+                    ? "NOT MATERIALIZED "
+                    : "MATERIALIZED ");
+        }
         builder.append(statement);
         return builder.toString();
     }
 
+    @Deprecated
     public <T, S> T accept(SelectVisitor<T> selectVisitor, S context) {
         return selectVisitor.visit(this, context);
     }
 
+    public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
+        return statement.accept(statementVisitor, context);
+    }
+
     public WithItem<?> withWithItemList(List<SelectItem<?>> withItemList) {
         this.setWithItemList(withItemList);
         return this;
@@ -138,6 +166,13 @@ public WithItem<?> withRecursive(boolean recursive, boolean materialized) {
         return this;
     }
 
+    public WithItem<?> withRecursive(boolean recursive, boolean usingNot, boolean materialized) {
+        this.setRecursive(recursive);
+        this.setUsingNot(usingNot);
+        this.setMaterialized(materialized);
+        return this;
+    }
+
     public WithItem<?> addWithItemList(SelectItem<?>... withItemList) {
         List<SelectItem<?>> collection =
                 Optional.ofNullable(getWithItemList()).orElseGet(ArrayList::new);
@@ -169,7 +204,7 @@ public ParenthesedDelete getDelete() {
     }
 
     public void setSelect(ParenthesedSelect select) {
-        this.statement = (T) select;
+        this.statement = (K) select;
     }
 
 }
diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
index 16c30f4f2..1c3b9bf9e 100644
--- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
+++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
@@ -101,6 +101,7 @@
 import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
+import net.sf.jsqlparser.expression.operators.relational.IsUnknownExpression;
 import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
 import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
 import net.sf.jsqlparser.expression.operators.relational.Matches;
@@ -129,6 +130,7 @@
 import net.sf.jsqlparser.statement.ResetStatement;
 import net.sf.jsqlparser.statement.RollbackStatement;
 import net.sf.jsqlparser.statement.SavepointStatement;
+import net.sf.jsqlparser.statement.SessionStatement;
 import net.sf.jsqlparser.statement.SetStatement;
 import net.sf.jsqlparser.statement.ShowColumnsStatement;
 import net.sf.jsqlparser.statement.ShowStatement;
@@ -155,7 +157,9 @@
 import net.sf.jsqlparser.statement.delete.ParenthesedDelete;
 import net.sf.jsqlparser.statement.drop.Drop;
 import net.sf.jsqlparser.statement.execute.Execute;
+import net.sf.jsqlparser.statement.export.Export;
 import net.sf.jsqlparser.statement.grant.Grant;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
 import net.sf.jsqlparser.statement.merge.Merge;
@@ -164,6 +168,7 @@
 import net.sf.jsqlparser.statement.select.AllColumns;
 import net.sf.jsqlparser.statement.select.AllTableColumns;
 import net.sf.jsqlparser.statement.select.FromItemVisitor;
+import net.sf.jsqlparser.statement.select.FunctionAllColumns;
 import net.sf.jsqlparser.statement.select.Join;
 import net.sf.jsqlparser.statement.select.LateralSubSelect;
 import net.sf.jsqlparser.statement.select.OrderByElement;
@@ -521,12 +526,18 @@ public <S> Void visit(SignedExpression signedExpression, S context) {
 
     @Override
     public <S> Void visit(IsNullExpression isNullExpression, S context) {
-
+        isNullExpression.getLeftExpression().accept(this, context);
         return null;
     }
 
     @Override
     public <S> Void visit(IsBooleanExpression isBooleanExpression, S context) {
+        isBooleanExpression.getLeftExpression().accept(this, context);
+        return null;
+    }
+
+    @Override
+    public <S> Void visit(IsUnknownExpression isUnknownExpression, S context) {
 
         return null;
     }
@@ -797,11 +808,17 @@ public <S> Void visit(AnalyticExpression analytic, S context) {
         }
 
         if (analytic.getWindowElement() != null) {
-            analytic.getWindowElement().getRange().getStart().getExpression().accept(this,
-                    context);
-            analytic.getWindowElement().getRange().getEnd().getExpression().accept(this,
-                    context);
-            analytic.getWindowElement().getOffset().getExpression().accept(this, context);
+            if (analytic.getWindowElement().getRange().getStart().getExpression() != null) {
+                analytic.getWindowElement().getRange().getStart().getExpression().accept(this,
+                        context);
+            }
+            if (analytic.getWindowElement().getRange().getEnd().getExpression() != null) {
+                analytic.getWindowElement().getRange().getEnd().getExpression().accept(this,
+                        context);
+            }
+            if (analytic.getWindowElement().getOffset() != null) {
+                analytic.getWindowElement().getOffset().getExpression().accept(this, context);
+            }
         }
         return null;
     }
@@ -935,6 +952,12 @@ public <S> Void visit(AllTableColumns allTableColumns, S context) {
         return null;
     }
 
+    @Override
+    public <S> Void visit(FunctionAllColumns functionAllColumns, S context) {
+
+        return null;
+    }
+
     @Override
     public <S> Void visit(AllValue allValue, S context) {
 
@@ -1011,6 +1034,11 @@ public <S> Void visit(ParenthesedDelete delete, S context) {
         return visit(delete.getDelete(), context);
     }
 
+    @Override
+    public <S> Void visit(SessionStatement sessionStatement, S context) {
+        return null;
+    }
+
     @Override
     public <S> Void visit(Update update, S context) {
         if (update.getWithItemsList() != null) {
@@ -1820,4 +1848,25 @@ public <S> Void visit(GeometryDistance geometryDistance, S context) {
         return null;
     }
 
+    @Override
+    public <S> Void visit(Import imprt, S context) {
+        throwUnsupported(imprt);
+        return null;
+    }
+
+    @Override
+    public void visit(Import imprt) {
+        StatementVisitor.super.visit(imprt);
+    }
+
+    @Override
+    public <S> Void visit(Export export, S context) {
+        throwUnsupported(export);
+        return null;
+    }
+
+    @Override
+    public void visit(Export export) {
+        StatementVisitor.super.visit(export);
+    }
 }
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 759be6f68..d517c2303 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java
@@ -101,6 +101,7 @@
 import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
+import net.sf.jsqlparser.expression.operators.relational.IsUnknownExpression;
 import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
 import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
 import net.sf.jsqlparser.expression.operators.relational.Matches;
@@ -122,6 +123,7 @@
 import net.sf.jsqlparser.statement.piped.FromQuery;
 import net.sf.jsqlparser.statement.select.AllColumns;
 import net.sf.jsqlparser.statement.select.AllTableColumns;
+import net.sf.jsqlparser.statement.select.FunctionAllColumns;
 import net.sf.jsqlparser.statement.select.OrderByElement;
 import net.sf.jsqlparser.statement.select.ParenthesedSelect;
 import net.sf.jsqlparser.statement.select.Select;
@@ -180,6 +182,13 @@ public <S> StringBuilder visit(Between between, S context) {
         }
 
         builder.append(" BETWEEN ");
+
+        if (between.isUsingSymmetric()) {
+            builder.append("SYMMETRIC ");
+        } else if (between.isUsingAsymmetric()) {
+            builder.append("ASYMMETRIC ");
+        }
+
         between.getBetweenExpressionStart().accept(this, context);
         builder.append(" AND ");
         between.getBetweenExpressionEnd().accept(this, context);
@@ -429,6 +438,17 @@ public <S> StringBuilder visit(IsBooleanExpression isBooleanExpression, S contex
         return builder;
     }
 
+    @Override
+    public <S> StringBuilder visit(IsUnknownExpression isUnknownExpression, S context) {
+        isUnknownExpression.getLeftExpression().accept(this, context);
+        if (isUnknownExpression.isNot()) {
+            builder.append(" IS NOT UNKNOWN");
+        } else {
+            builder.append(" IS UNKNOWN");
+        }
+        return builder;
+    }
+
     @Override
     public <S> StringBuilder visit(JdbcParameter jdbcParameter, S context) {
         builder.append(jdbcParameter.getParameterCharacter());
@@ -515,6 +535,10 @@ public void visit(IsBooleanExpression isBooleanExpression) {
         visit(isBooleanExpression, null);
     }
 
+    public void visit(IsUnknownExpression isUnknownExpression) {
+        visit(isUnknownExpression, null);
+    }
+
     public void visit(JdbcParameter jdbcParameter) {
         visit(jdbcParameter, null);
     }
@@ -618,7 +642,8 @@ public <S> StringBuilder visit(StringValue stringValue, S context) {
         if (stringValue.getPrefix() != null) {
             builder.append(stringValue.getPrefix());
         }
-        builder.append("'").append(stringValue.getValue()).append("'");
+        builder.append(stringValue.getQuoteStr()).append(stringValue.getValue())
+                .append(stringValue.getQuoteStr());
 
         return builder;
     }
@@ -1523,13 +1548,18 @@ public <S> StringBuilder visit(ArrayExpression array, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(ArrayConstructor aThis, S context) {
-        if (aThis.isArrayKeyword()) {
+    public <S> StringBuilder visit(ArrayConstructor arrayConstructor, S context) {
+        if (arrayConstructor.isArrayKeyword()) {
             builder.append("ARRAY");
+
+            ColDataType dataType = arrayConstructor.getDataType();
+            if (dataType != null) {
+                builder.append("<").append(dataType).append(">");
+            }
         }
         builder.append("[");
         boolean first = true;
-        for (Expression expression : aThis.getExpressions()) {
+        for (Expression expression : arrayConstructor.getExpressions()) {
             if (!first) {
                 builder.append(", ");
             } else {
@@ -1631,6 +1661,12 @@ public <S> StringBuilder visit(AllTableColumns allTableColumns, S context) {
         return builder;
     }
 
+    @Override
+    public <S> StringBuilder visit(FunctionAllColumns functionAllColumns, S context) {
+        builder.append(functionAllColumns.toString());
+        return builder;
+    }
+
     @Override
     public <S> StringBuilder visit(AllValue allValue, S context) {
         builder.append(allValue);
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/InsertDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/InsertDeParser.java
index 1c79f144e..a555f2ba7 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/InsertDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/InsertDeParser.java
@@ -91,7 +91,7 @@ public void deParse(Insert insert) {
         }
 
         if (insert.isOverriding()) {
-            buffer.append("OVERRIDING SYSTEM VALUE ");
+            builder.append("OVERRIDING SYSTEM VALUE ");
         }
 
         if (insert.getPartitions() != null) {
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
index d530c754a..d0c1040fe 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
@@ -18,14 +18,13 @@
 import net.sf.jsqlparser.expression.WindowDefinition;
 import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.piped.AggregatePipeOperator;
 import net.sf.jsqlparser.statement.piped.AsPipeOperator;
 import net.sf.jsqlparser.statement.piped.CallPipeOperator;
 import net.sf.jsqlparser.statement.piped.DropPipeOperator;
-import net.sf.jsqlparser.statement.piped.ExceptPipeOperator;
 import net.sf.jsqlparser.statement.piped.ExtendPipeOperator;
 import net.sf.jsqlparser.statement.piped.FromQuery;
-import net.sf.jsqlparser.statement.piped.IntersectPipeOperator;
 import net.sf.jsqlparser.statement.piped.JoinPipeOperator;
 import net.sf.jsqlparser.statement.piped.LimitPipeOperator;
 import net.sf.jsqlparser.statement.piped.OrderByPipeOperator;
@@ -37,7 +36,7 @@
 import net.sf.jsqlparser.statement.piped.SetPipeOperator;
 import net.sf.jsqlparser.statement.piped.TableSamplePipeOperator;
 import net.sf.jsqlparser.statement.piped.UnPivotPipeOperator;
-import net.sf.jsqlparser.statement.piped.UnionPipeOperator;
+import net.sf.jsqlparser.statement.piped.SetOperationPipeOperator;
 import net.sf.jsqlparser.statement.piped.WherePipeOperator;
 import net.sf.jsqlparser.statement.piped.WindowPipeOperator;
 import net.sf.jsqlparser.statement.select.Distinct;
@@ -57,6 +56,8 @@
 import net.sf.jsqlparser.statement.select.PivotVisitor;
 import net.sf.jsqlparser.statement.select.PivotXml;
 import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SampleClause;
+import net.sf.jsqlparser.statement.select.Select;
 import net.sf.jsqlparser.statement.select.SelectItem;
 import net.sf.jsqlparser.statement.select.SelectItemVisitor;
 import net.sf.jsqlparser.statement.select.SelectVisitor;
@@ -71,8 +72,10 @@
 import net.sf.jsqlparser.statement.update.UpdateSet;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Optional;
 
 import static java.util.stream.Collectors.joining;
 
@@ -80,7 +83,7 @@
 public class SelectDeParser extends AbstractDeParser<PlainSelect>
         implements SelectVisitor<StringBuilder>, SelectItemVisitor<StringBuilder>,
         FromItemVisitor<StringBuilder>, PivotVisitor<StringBuilder>,
-        PipeOperatorVisitor<StringBuilder> {
+        PipeOperatorVisitor<StringBuilder, Void> {
 
     private ExpressionVisitor<StringBuilder> expressionVisitor;
 
@@ -139,6 +142,12 @@ public <S> StringBuilder visit(ParenthesedSelect select, S context) {
         if (alias != null) {
             builder.append(alias);
         }
+
+        SampleClause sampleClause = select.getSampleClause();
+        if (sampleClause != null) {
+            builder.append(sampleClause);
+        }
+
         Pivot pivot = select.getPivot();
         if (pivot != null) {
             pivot.accept(this, context);
@@ -310,7 +319,21 @@ public <S> StringBuilder visit(PlainSelect plainSelect, S context) {
             plainSelect.getForClause().appendTo(builder);
         }
 
+        Alias alias = plainSelect.getAlias();
+        if (alias != null) {
+            builder.append(alias);
+        }
+        Pivot pivot = plainSelect.getPivot();
+        if (pivot != null) {
+            pivot.accept(this, context);
+        }
+        UnPivot unpivot = plainSelect.getUnPivot();
+        if (unpivot != null) {
+            unpivot.accept(this, context);
+        }
+
         deparseOrderByElementsClause(plainSelect, plainSelect.getOrderByElements());
+
         if (plainSelect.isEmitChanges()) {
             builder.append(" EMIT CHANGES");
         }
@@ -359,18 +382,7 @@ public <S> StringBuilder visit(PlainSelect plainSelect, S context) {
             builder.append(" WITH NO LOG");
         }
 
-        Alias alias = plainSelect.getAlias();
-        if (alias != null) {
-            builder.append(alias);
-        }
-        Pivot pivot = plainSelect.getPivot();
-        if (pivot != null) {
-            pivot.accept(this, context);
-        }
-        UnPivot unpivot = plainSelect.getUnPivot();
-        if (unpivot != null) {
-            unpivot.accept(this, context);
-        }
+
 
         return builder;
     }
@@ -386,6 +398,8 @@ protected void deparseDistinctClause(Distinct distinct) {
         if (distinct != null) {
             if (distinct.isUseUnique()) {
                 builder.append("UNIQUE ");
+            } else if (distinct.isUseDistinctRow()) {
+                builder.append("DISTINCTROW ");
             } else {
                 builder.append("DISTINCT ");
             }
@@ -435,25 +449,31 @@ public <S> StringBuilder visit(SelectItem<?> selectItem, S context) {
 
 
     @Override
-    public <S> StringBuilder visit(Table tableName, S context) {
-        builder.append(tableName.getFullyQualifiedName());
-        Alias alias = tableName.getAlias();
+    public <S> StringBuilder visit(Table table, S context) {
+        builder.append(table.getFullyQualifiedName());
+        if (table.getTimeTravel() != null) {
+            builder.append(" ").append(table.getTimeTravel());
+        }
+        Alias alias = table.getAlias();
         if (alias != null) {
             builder.append(alias);
         }
-        Pivot pivot = tableName.getPivot();
+        if (table.getTimeTravelStrAfterAlias() != null) {
+            builder.append(" ").append(table.getTimeTravelStrAfterAlias());
+        }
+        Pivot pivot = table.getPivot();
         if (pivot != null) {
             pivot.accept(this, context);
         }
-        UnPivot unpivot = tableName.getUnPivot();
+        UnPivot unpivot = table.getUnPivot();
         if (unpivot != null) {
             unpivot.accept(this, context);
         }
-        MySQLIndexHint indexHint = tableName.getIndexHint();
+        MySQLIndexHint indexHint = table.getIndexHint();
         if (indexHint != null) {
             builder.append(indexHint);
         }
-        SQLServerHints sqlServerHints = tableName.getSqlServerHints();
+        SQLServerHints sqlServerHints = table.getSqlServerHints();
         if (sqlServerHints != null) {
             builder.append(sqlServerHints);
         }
@@ -707,7 +727,9 @@ public <S> StringBuilder visit(WithItem<?> withItem, S context) {
         }
         builder.append(" AS ");
         if (withItem.isMaterialized()) {
-            builder.append("MATERIALIZED ");
+            builder.append(withItem.isUsingNot()
+                    ? "NOT MATERIALIZED "
+                    : "MATERIALIZED ");
         }
         StatementDeParser statementDeParser =
                 new StatementDeParser((ExpressionDeParser) expressionVisitor, this, builder);
@@ -736,6 +758,10 @@ public <S> StringBuilder visit(TableFunction tableFunction, S context) {
         }
         tableFunction.getFunction().accept(this.expressionVisitor, context);
 
+        if (tableFunction.getWithClause() != null) {
+            builder.append(" WITH ").append(tableFunction.getWithClause());
+        }
+
         if (tableFunction.getAlias() != null) {
             builder.append(tableFunction.getAlias());
         }
@@ -779,6 +805,12 @@ public <S> StringBuilder visit(Values values, S context) {
         return builder;
     }
 
+    @Override
+    public <S> StringBuilder visit(Import imprt, S context) {
+        builder.append(imprt.toString());
+        return builder;
+    }
+
     @Override
     public void visit(Values values) {
         SelectVisitor.super.visit(values);
@@ -830,13 +862,38 @@ public void visit(TableStatement tableStatement) {
 
     @Override
     public <S> StringBuilder visit(FromQuery fromQuery, S context) {
+        List<WithItem<?>> withItemsList = fromQuery.getWithItemsList();
+        if (withItemsList != null && !withItemsList.isEmpty()) {
+            builder.append("WITH ");
+            for (Iterator<WithItem<?>> iter = withItemsList.iterator(); iter.hasNext();) {
+                iter.next().accept((SelectVisitor<?>) this, context);
+                if (iter.hasNext()) {
+                    builder.append(",");
+                }
+                builder.append(" ");
+            }
+        }
+
         if (fromQuery.isUsingFromKeyword()) {
             builder.append("FROM ");
         }
         fromQuery.getFromItem().accept(this, context);
         builder.append("\n");
+
+        if (fromQuery.getLateralViews() != null) {
+            for (LateralView lateralView : fromQuery.getLateralViews()) {
+                deparseLateralView(lateralView);
+            }
+        }
+
+        if (fromQuery.getJoins() != null) {
+            for (Join join : fromQuery.getJoins()) {
+                deparseJoin(join);
+            }
+        }
+
         for (PipeOperator operator : fromQuery.getPipeOperators()) {
-            operator.accept(this, context);
+            operator.accept(this, null);
         }
         return builder;
     }
@@ -849,6 +906,10 @@ public void visit(ParenthesedFromItem fromItem) {
         visit(fromItem, null);
     }
 
+    public void visit(Import imprt) {
+        visit(imprt, null);
+    }
+
 
     private void deparseOptimizeFor(OptimizeFor optimizeFor) {
         builder.append(" OPTIMIZE FOR ");
@@ -858,16 +919,22 @@ private void deparseOptimizeFor(OptimizeFor optimizeFor) {
 
     @Override
     void deParse(PlainSelect statement) {
-        statement.accept((SelectVisitor<StringBuilder>) this, null);
+        statement.accept((SelectVisitor<StringBuilder>) this, Optional.ofNullable(null));
     }
 
     @Override
-    public <S> StringBuilder visit(AggregatePipeOperator aggregate, S context) {
+    public StringBuilder visit(AggregatePipeOperator aggregate, Void context) {
         builder.append("|> ").append("AGGREGATE");
         int i = 0;
         for (SelectItem<?> selectItem : aggregate.getSelectItems()) {
-            builder.append(i++ > 0 ? ", " : " ");
+            builder.append(i > 0 ? ", " : " ");
             selectItem.accept(this, context);
+            ArrayList<String> selectItemsOrderSuffices = aggregate.getSelectItemsOrderSuffices();
+            if (i < selectItemsOrderSuffices.size() && selectItemsOrderSuffices.get(i) != null
+                    && !selectItemsOrderSuffices.get(i).isEmpty()) {
+                builder.append(" ").append(selectItemsOrderSuffices.get(i));
+            }
+            i++;
         }
         builder.append("\n");
 
@@ -879,8 +946,16 @@ public <S> StringBuilder visit(AggregatePipeOperator aggregate, S context) {
             builder.append(" BY");
             i = 0;
             for (SelectItem<?> selectItem : aggregate.getGroupItems()) {
-                builder.append(i++ > 0 ? ", " : " ");
+                builder.append(i > 0 ? ", " : " ");
                 selectItem.accept(this, context);
+
+                ArrayList<String> groupItemsOrderSuffices = aggregate.getGroupItemsOrderSuffices();
+                if (i < groupItemsOrderSuffices.size() && groupItemsOrderSuffices.get(i) != null
+                        && !groupItemsOrderSuffices.get(i).isEmpty()) {
+                    builder.append(" ").append(groupItemsOrderSuffices.get(i));
+                }
+
+                i++;
             }
             builder.append("\n");
         }
@@ -889,19 +964,25 @@ public <S> StringBuilder visit(AggregatePipeOperator aggregate, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(AsPipeOperator as, S context) {
+    public StringBuilder visit(AsPipeOperator as, Void context) {
         builder.append("|> ").append(as.getAlias());
         builder.append("\n");
         return builder;
     }
 
     @Override
-    public <S> StringBuilder visit(CallPipeOperator call, S context) {
+    public StringBuilder visit(CallPipeOperator call, Void context) {
+        builder.append("|> CALL ");
+        call.getTableFunction().accept(this);
+        if (call.getAlias() != null) {
+            builder.append(" ").append(call.getAlias());
+        }
+
         return builder;
     }
 
     @Override
-    public <S> StringBuilder visit(DropPipeOperator drop, S context) {
+    public StringBuilder visit(DropPipeOperator drop, Void context) {
         builder.append("|> ").append("DROP ");
         drop.getColumns().accept(expressionVisitor, context);
         builder.append("\n");
@@ -909,22 +990,12 @@ public <S> StringBuilder visit(DropPipeOperator drop, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(ExceptPipeOperator except, S context) {
-        return builder;
-    }
-
-    @Override
-    public <S> StringBuilder visit(ExtendPipeOperator extend, S context) {
+    public StringBuilder visit(ExtendPipeOperator extend, Void context) {
         return visit((SelectPipeOperator) extend, context);
     }
 
     @Override
-    public <S> StringBuilder visit(IntersectPipeOperator intersect, S context) {
-        return builder;
-    }
-
-    @Override
-    public <S> StringBuilder visit(JoinPipeOperator join, S context) {
+    public StringBuilder visit(JoinPipeOperator join, Void context) {
         builder.append("|> ");
         deparseJoin(join.getJoin());
         builder.append("\n");
@@ -932,7 +1003,7 @@ public <S> StringBuilder visit(JoinPipeOperator join, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(LimitPipeOperator limit, S context) {
+    public StringBuilder visit(LimitPipeOperator limit, Void context) {
         builder.append("|> ").append("LIMIT ").append(limit.getLimitExpression());
         if (limit.getOffsetExpression() != null) {
             builder.append(" OFFSET ").append(limit.getOffsetExpression());
@@ -941,7 +1012,7 @@ public <S> StringBuilder visit(LimitPipeOperator limit, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(OrderByPipeOperator orderBy, S context) {
+    public StringBuilder visit(OrderByPipeOperator orderBy, Void context) {
         builder.append("|> ");
         new OrderByDeParser(expressionVisitor, builder).deParse(orderBy.getOrderByElements());
         builder.append("\n");
@@ -949,18 +1020,35 @@ public <S> StringBuilder visit(OrderByPipeOperator orderBy, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(PivotPipeOperator pivot, S context) {
+    public StringBuilder visit(PivotPipeOperator pivot, Void context) {
+        builder
+                .append("|> ")
+                .append("PIVOT( ")
+                .append(pivot.getAggregateExpression())
+                .append(" FOR ")
+                .append(pivot.getInputColumn())
+                .append(" IN (")
+                .append(Select.getStringList(pivot.getPivotColumns()))
+                .append("))");
+        if (pivot.getAlias() != null) {
+            builder.append(" ").append(pivot.getAlias());
+        }
+        builder.append("\n");
         return builder;
     }
 
     @Override
-    public <S> StringBuilder visit(RenamePipeOperator rename, S context) {
+    public StringBuilder visit(RenamePipeOperator rename, Void context) {
         return builder;
     }
 
     @Override
-    public <S> StringBuilder visit(SelectPipeOperator select, S context) {
+    public StringBuilder visit(SelectPipeOperator select, Void context) {
         builder.append("|> ").append(select.getOperatorName());
+        if (select.getModifier() != null && !select.getModifier().isEmpty()) {
+            builder.append(" ").append(select.getModifier());
+        }
+
         int i = 0;
         for (SelectItem<?> selectItem : select.getSelectItems()) {
             builder.append(i++ > 0 ? ", " : " ").append(selectItem);
@@ -970,7 +1058,7 @@ public <S> StringBuilder visit(SelectPipeOperator select, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(SetPipeOperator set, S context) {
+    public StringBuilder visit(SetPipeOperator set, Void context) {
         builder.append("|> ").append("SET");
         int i = 0;
         for (UpdateSet updateSet : set.getUpdateSets()) {
@@ -981,22 +1069,50 @@ public <S> StringBuilder visit(SetPipeOperator set, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(TableSamplePipeOperator tableSample, S context) {
+    public StringBuilder visit(TableSamplePipeOperator tableSample, Void context) {
+        builder.append("|> ").append("TABLESAMPLE SYSTEM (").append(tableSample.getPercent())
+                .append(" PERCENT)");
         return builder;
     }
 
     @Override
-    public <S> StringBuilder visit(UnionPipeOperator union, S context) {
+    public StringBuilder visit(SetOperationPipeOperator setOperationPipeOperator, Void context) {
+        builder.append("|> ").append(setOperationPipeOperator.getSetOperationType());
+        if (setOperationPipeOperator.getModifier() != null) {
+            builder.append(" ").append(setOperationPipeOperator.getModifier());
+        }
+
+        int i = 0;
+        for (ParenthesedSelect select : setOperationPipeOperator.getSelects()) {
+            if (i++ > 0) {
+                builder.append(", ");
+            }
+            builder.append(select);
+        }
+        builder.append("\n");
         return builder;
     }
 
     @Override
-    public <S> StringBuilder visit(UnPivotPipeOperator unPivot, S context) {
+    public StringBuilder visit(UnPivotPipeOperator unPivot, Void context) {
+        builder
+                .append("|> ")
+                .append("UNPIVOT( ")
+                .append(unPivot.getValuesColumn())
+                .append(" FOR ")
+                .append(unPivot.getNameColumn())
+                .append(" IN (")
+                .append(Select.getStringList(unPivot.getPivotColumns()))
+                .append("))");
+        if (unPivot.getAlias() != null) {
+            builder.append(" ").append(unPivot.getAlias());
+        }
+        builder.append("\n");
         return builder;
     }
 
     @Override
-    public <S> StringBuilder visit(WherePipeOperator where, S context) {
+    public StringBuilder visit(WherePipeOperator where, Void context) {
         builder.append("|> ")
                 .append("WHERE ");
         where.getExpression().accept(expressionVisitor, context);
@@ -1005,7 +1121,7 @@ public <S> StringBuilder visit(WherePipeOperator where, S context) {
     }
 
     @Override
-    public <S> StringBuilder visit(WindowPipeOperator window, S context) {
+    public StringBuilder visit(WindowPipeOperator window, Void context) {
         return visit((SelectPipeOperator) window, context);
     }
 }
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
index b078b8716..ccfc0a92b 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
@@ -25,6 +25,7 @@
 import net.sf.jsqlparser.statement.ResetStatement;
 import net.sf.jsqlparser.statement.RollbackStatement;
 import net.sf.jsqlparser.statement.SavepointStatement;
+import net.sf.jsqlparser.statement.SessionStatement;
 import net.sf.jsqlparser.statement.SetStatement;
 import net.sf.jsqlparser.statement.ShowColumnsStatement;
 import net.sf.jsqlparser.statement.ShowStatement;
@@ -51,7 +52,9 @@
 import net.sf.jsqlparser.statement.delete.ParenthesedDelete;
 import net.sf.jsqlparser.statement.drop.Drop;
 import net.sf.jsqlparser.statement.execute.Execute;
+import net.sf.jsqlparser.statement.export.Export;
 import net.sf.jsqlparser.statement.grant.Grant;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
 import net.sf.jsqlparser.statement.merge.Merge;
@@ -201,6 +204,11 @@ public <S> StringBuilder visit(ParenthesedDelete delete, S context) {
         return builder;
     }
 
+    @Override
+    public <S> StringBuilder visit(SessionStatement sessionStatement, S context) {
+        return builder.append(sessionStatement.toString());
+    }
+
 
     private <S> StringBuilder addWithItemsToBuffer(List<WithItem<?>> withItemsList, S context) {
         if (withItemsList != null && !withItemsList.isEmpty()) {
@@ -493,4 +501,16 @@ public ExpressionDeParser getExpressionDeParser() {
     public SelectDeParser getSelectDeParser() {
         return selectDeParser;
     }
+
+    @Override
+    public <S> StringBuilder visit(Import imprt, S context) {
+        builder.append(imprt.toString());
+        return builder;
+    }
+
+    @Override
+    public <S> StringBuilder visit(Export export, S context) {
+        builder.append(export.toString());
+        return builder;
+    }
 }
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/TableStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/TableStatementDeParser.java
index 73e1d429d..34aba2a86 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/TableStatementDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/TableStatementDeParser.java
@@ -101,8 +101,8 @@ public <S> StringBuilder visit(TableStatement tableStatement, S context) {
         // TODO UNION
 
         tableStatement.appendTo(
-                builder, tableStatement.getAlias(), tableStatement.getPivot(),
-                tableStatement.getUnPivot());
+                builder, tableStatement.getAlias(), null,
+                tableStatement.getPivot(), tableStatement.getUnPivot());
 
         return builder;
     }
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java
index 0b6baca9d..a4b27d765 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java
@@ -102,6 +102,7 @@
 import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression;
 import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
+import net.sf.jsqlparser.expression.operators.relational.IsUnknownExpression;
 import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
 import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
 import net.sf.jsqlparser.expression.operators.relational.Matches;
@@ -122,6 +123,7 @@
 import net.sf.jsqlparser.statement.piped.FromQuery;
 import net.sf.jsqlparser.statement.select.AllColumns;
 import net.sf.jsqlparser.statement.select.AllTableColumns;
+import net.sf.jsqlparser.statement.select.FunctionAllColumns;
 import net.sf.jsqlparser.statement.select.ParenthesedSelect;
 import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.statement.select.Select;
@@ -290,6 +292,12 @@ public <S> Void visit(IsBooleanExpression isBooleanExpression, S context) {
         return null;
     }
 
+    @Override
+    public <S> Void visit(IsUnknownExpression isUnknownExpression, S context) {
+        isUnknownExpression.getLeftExpression().accept(this, context);
+        return null;
+    }
+
     @Override
     public <S> Void visit(JdbcParameter jdbcParameter, S context) {
         validateFeature(Feature.jdbcParameter);
@@ -384,6 +392,10 @@ public void visit(IsBooleanExpression isBooleanExpression) {
         visit(isBooleanExpression, null); // Call the parametrized visit method with null context
     }
 
+    public void visit(IsUnknownExpression isUnknownExpression) {
+        visit(isUnknownExpression, null); // Call the parametrized visit method with null context
+    }
+
     public void visit(JdbcParameter jdbcParameter) {
         visit(jdbcParameter, null); // Call the parametrized visit method with null context
     }
@@ -1049,6 +1061,11 @@ public <S> Void visit(AllTableColumns allTableColumns, S context) {
         return null;
     }
 
+    @Override
+    public <S> Void visit(FunctionAllColumns functionColumns, S context) {
+        return null;
+    }
+
     @Override
     public <S> Void visit(AllValue allValue, S context) {
         return null;
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java
index 49367ddf0..bacd4e1af 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java
@@ -16,6 +16,7 @@
 import net.sf.jsqlparser.expression.SQLServerHints;
 import net.sf.jsqlparser.parser.feature.Feature;
 import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.piped.FromQuery;
 import net.sf.jsqlparser.statement.select.ExceptOp;
 import net.sf.jsqlparser.statement.select.Fetch;
@@ -360,6 +361,12 @@ public <S> Void visit(Values values, S context) {
         return null;
     }
 
+    @Override
+    public <S> Void visit(Import imprt, S context) {
+        // TODO: not yet implemented
+        return null;
+    }
+
     @Override
     public void validate(SelectItem<?> statement) {
         statement.accept(this, null);
@@ -426,4 +433,8 @@ public void visit(Values values) {
         visit(values, null);
     }
 
+    public void visit(Import imprt) {
+        visit(imprt, null);
+    }
+
 }
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java
index d8ce6078b..af4ec9256 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java
@@ -21,6 +21,7 @@
 import net.sf.jsqlparser.statement.ResetStatement;
 import net.sf.jsqlparser.statement.RollbackStatement;
 import net.sf.jsqlparser.statement.SavepointStatement;
+import net.sf.jsqlparser.statement.SessionStatement;
 import net.sf.jsqlparser.statement.SetStatement;
 import net.sf.jsqlparser.statement.ShowColumnsStatement;
 import net.sf.jsqlparser.statement.ShowStatement;
@@ -49,7 +50,9 @@
 import net.sf.jsqlparser.statement.delete.ParenthesedDelete;
 import net.sf.jsqlparser.statement.drop.Drop;
 import net.sf.jsqlparser.statement.execute.Execute;
+import net.sf.jsqlparser.statement.export.Export;
 import net.sf.jsqlparser.statement.grant.Grant;
+import net.sf.jsqlparser.statement.imprt.Import;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
 import net.sf.jsqlparser.statement.merge.Merge;
@@ -70,7 +73,6 @@
  */
 public class StatementValidator extends AbstractValidator<Statement>
         implements StatementVisitor<Void> {
-
     @Override
     public <S> Void visit(CreateIndex createIndex, S context) {
         getValidator(CreateIndexValidator.class).validate(createIndex);
@@ -112,6 +114,11 @@ public <S> Void visit(ParenthesedDelete delete, S context) {
         return visit(delete.getDelete(), context);
     }
 
+    @Override
+    public <S> Void visit(SessionStatement sessionStatement, S context) {
+        return null;
+    }
+
 
     @Override
     public <S> Void visit(Drop drop, S context) {
@@ -380,6 +387,18 @@ public <S> Void visit(UnsupportedStatement unsupportedStatement, S context) {
         return null;
     }
 
+    @Override
+    public <S> Void visit(Import imprt, S context) {
+        // TODO: not yet implemented
+        return null;
+    }
+
+    @Override
+    public <S> Void visit(Export export, S context) {
+        // TODO: not yet implemented
+        return null;
+    }
+
     public void visit(CreateIndex createIndex) {
         visit(createIndex, null);
     }
@@ -556,4 +575,11 @@ public void visit(UnsupportedStatement unsupportedStatement) {
         visit(unsupportedStatement, null);
     }
 
+    public void visit(Import imprt) {
+        visit(imprt, null);
+    }
+
+    public void visit(Export export) {
+        visit(export, null);
+    }
 }
diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
index 0fdbec865..6e2d06197 100644
--- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
+++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
@@ -18,7 +18,7 @@ options {
 //  FORCE_LA_CHECK = true;
     UNICODE_INPUT = true;
     JAVA_TEMPLATE_TYPE = "modern";
-    JDK_VERSION = "1.8";
+//  JDK_VERSION = "1.8";
     TOKEN_EXTENDS = "BaseToken";
     COMMON_TOKEN_ACTION = true;
     NODE_DEFAULT_VOID = true;
@@ -26,6 +26,7 @@ options {
     VISITOR = true;
     GRAMMAR_ENCODING = "UTF-8";
     KEEP_LINE_COLUMN = true;
+//  USER_CHAR_STREAM = false;
 }
 
 PARSER_BEGIN(CCJSqlParser)
@@ -67,8 +68,11 @@ import net.sf.jsqlparser.statement.update.*;
 import net.sf.jsqlparser.statement.upsert.*;
 import net.sf.jsqlparser.statement.merge.*;
 import net.sf.jsqlparser.statement.grant.*;
+import net.sf.jsqlparser.statement.imprt.*;
+import net.sf.jsqlparser.statement.export.*;
 import java.util.*;
 import java.util.AbstractMap.SimpleEntry;
+import net.sf.jsqlparser.statement.select.SetOperationList.SetOperationType;
 
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -95,7 +99,7 @@ public class CCJSqlParser extends AbstractJSqlParser<CCJSqlParser> {
     	return this;
     }
 
-    private void linkAST(ASTNodeAccess access, SimpleNode node) {
+    private void linkAST(ASTNodeAccess access, Node node) {
         access.setASTNode(node);
         node.jjtSetValue(access);
     }
@@ -122,6 +126,41 @@ public class CCJSqlParser extends AbstractJSqlParser<CCJSqlParser> {
             return delimiters;
         }
     }
+
+    private static void appendWhitespaceFromTokenGap(StringBuilder buffer, Token prev, Token curr) {
+        if (prev == null) return;
+
+        int lineDiff = curr.beginLine - prev.endLine;
+        if (lineDiff > 0) {
+            for (int i = 0; i < lineDiff; i++) buffer.append('\n');
+            for (int i = 1; i < curr.beginColumn; i++) buffer.append(' ');
+        } else {
+            int spaceCount = curr.beginColumn - prev.endColumn - 1;
+            for (int i = 0; i < spaceCount; i++) buffer.append(' ');
+        }
+    }
+
+    private static void appendTokenImageAndTrackDelimiter(StringBuilder buffer, Deque<Character> windowQueue,
+                                                          int delimiterLength, String image, String tag) {
+        for (char ch : image.toCharArray()) {
+            buffer.append(ch);
+            windowQueue.addLast(ch);
+            if (windowQueue.size() > delimiterLength) {
+                windowQueue.removeFirst();
+            }
+        }
+    }
+
+    private static boolean endsWithDelimiter(Deque<Character> windowQueue, String delimiter) {
+        if (windowQueue.size() != delimiter.length()) return false;
+
+        int i = 0;
+        for (char ch : windowQueue) {
+            if (ch != delimiter.charAt(i++)) return false;
+        }
+        return true;
+    }
+
 }
 
 PARSER_END(CCJSqlParser)
@@ -129,6 +168,46 @@ PARSER_END(CCJSqlParser)
 TOKEN_MGR_DECLS : {
     public FeatureConfiguration configuration = new FeatureConfiguration();
 
+    // Identify the index of the quoting/escaping tokens
+    public int charLiteralIndex = -1;
+    public int squaredBracketOpenIndex = -1;
+    {
+        for (int i=0;i<CCJSqlParserConstants.tokenImage.length;i++) {
+          if ( CCJSqlParserConstants.tokenImage[i].equals("<S_CHAR_LITERAL>") ) {
+              charLiteralIndex = i;
+              break;
+          }
+        }
+        for (int i=0;i<CCJSqlParserConstants.tokenImage.length;i++) {
+            if (CCJSqlParserConstants.tokenImage[i].equals("\"[\"")) {
+                squaredBracketOpenIndex = i;
+                break;
+            }
+        }
+    }
+
+    // Finds first occurrence of "\\'"
+    public static int indexOfSequence(String s, String target) {
+        int len = s.length();
+        for (int i = 0; i < len - 1; i++) {
+            if (s.charAt(i) == '\\' && s.charAt(i + 1) == '\'') {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    // Finds last occurrence of "\\''"
+    public static int lastIndexOfSequence(String s, String target) {
+        int len = s.length();
+        for (int i = len - 3; i >= 0; i--) {
+            if (s.charAt(i) == '\\' && s.charAt(i + 1) == '\'' && s.charAt(i + 2) == '\'') {
+                return i;
+            }
+        }
+        return -1;
+    }
+
     public void CommonTokenAction(Token t)
 	{
 		t.absoluteBegin = getCurrentTokenAbsolutePosition();
@@ -152,7 +231,9 @@ SKIP:
 
 TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 {
-    <K_ABSENT: "ABSENT">
+    <K_AT_SIGN: "@">
+|   <K_AT_V: "@V">
+|   <K_ABSENT: "ABSENT">
 |   <K_ACTION: "ACTION">
 |   <K_ACTIVE: "ACTIVE">
 |   <K_ADD:"ADD">
@@ -161,28 +242,36 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_AGAINST:"AGAINST">
 |   <K_AGGREGATE: "AGGREGATE">
 |   <K_ALGORITHM: "ALGORITHM">
+|   <K_ALIGN:"ALIGN">
 |   <K_ALL:"ALL">
 |   <K_ALTER:"ALTER">
+|   <K_ALWAYS:"ALWAYS">
 |   <K_ANALYZE:"ANALYZE">
 |   <K_AND:"AND">
 |   <K_ANY:"ANY">
+|   <K_APPEND_ONLY:"APPEND_ONLY">
 |   <K_APPLY:"APPLY">
 |   <K_APPROXIMATE:"APPROXIMATE">
 |   <K_ARCHIVE: "ARCHIVE">
 |   <K_ARRAY_LITERAL: "ARRAY" >
 |   <K_AS: "AS">
+|   <K_ASYMMETRIC: "ASYMMETRIC">
 |   <K_AT: "AT">
 |   <K_ASC:"ASC">
 |   <K_AUTHORIZATION:"AUTHORIZATION">
 |   <K_AUTO:"AUTO">
 |   <K_AUTO_INCREMENT:"AUTO_INCREMENT">
+|   <K_AZURE:"AZURE">
 |   <K_BASE64:"BASE64">
+|   <K_BEFORE: "BEFORE">
 |   <K_BEGIN:"BEGIN">
 |   <K_BERNOULLI: "BERNOULLI">
 |   <K_BETWEEN:"BETWEEN">
 |   <K_BINARY: "BINARY">
 |   <K_BIT:"BIT">
+|   <K_BLOBSTORAGE:"BLOBSTORAGE">
 |   <K_BLOCK: "BLOCK">
+|   <K_BOOLEAN:"BOOLEAN">
 |   <K_BOTH:"BOTH">
 |   <K_BROWSE:"BROWSE">
 |   <K_BY:"BY">
@@ -195,6 +284,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_CASE:"CASE">
 |   <K_CASEWHEN:"CASEWHEN">  /* H2 casewhen function */
 |   <K_CAST: "CAST">
+|   <K_CERTIFICATE: "CERTIFICATE">
 |   <K_CHARACTER:"CHARACTER">
 |   <K_CHANGE:"CHANGE">
 |   <K_CHANGES:"CHANGES">
@@ -202,22 +292,28 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_CHECKPOINT:"CHECKPOINT">
 |   <K_CHAR:"CHAR">
 |   <K_CLOSE:"CLOSE">
+|   <K_CLOUD:"CLOUD">
+|   <K_COALESCE:"COALESCE">
 |   <K_COLLATE:"COLLATE">
 |   <K_COLUMN:"COLUMN">
 |   <K_COLUMNS:"COLUMNS">
 |   <K_COMMA: ",">
 |   <K_COMMIT:"COMMIT">
 |   <K_COMMENT:"COMMENT">
+|   <K_COMMENTS:"COMMENTS">
 |   <K_CONFLICT:"CONFLICT">
 |   <K_CONNECT:"CONNECT">
 |   <K_CONNECT_BY_ROOT: "CONNECT_BY_ROOT">
 |   <K_CONSTRAINT:"CONSTRAINT">
 |   <K_CONSTRAINTS:"CONSTRAINTS">
 |   <K_CONVERT:"CONVERT">
+|   <K_CORRESPONDING:"CORRESPONDING">
 |   <K_COSTS: "COSTS">
 |   <K_COUNT: "COUNT">
 |   <K_CREATE:"CREATE">
+|   <K_CREATED:"CREATED">
 |   <K_CROSS:"CROSS">
+|   <K_CSV:"CSV">
 |   <K_CURRENT: "CURRENT">
 |   <K_CYCLE:"CYCLE">
 |   <K_DATABASE:"DATABASE">
@@ -227,19 +323,25 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_DATE_LITERAL : "YEAR" | "MONTH" | "DAY" | "HOUR" | "MINUTE" | "SECOND" >
 |   <K_DBA_RECYCLEBIN: "DBA_RECYCLEBIN">
 |   <K_DEFAULT : "DEFAULT">
+|   <K_DEFAULTS: "DEFAULTS">
 |   <K_DEFERRABLE : "DEFERRABLE">
 |   <K_DELAYED : "DELAYED">
 |   <K_DELETE:"DELETE">
+|   <K_DELIMIT : "DELIMIT">
+|   <K_DELIMITER : "DELIMITER">
 |   <K_DESC:"DESC">
 |   <K_DESCRIBE:"DESCRIBE">
 |   <K_DISABLE : "DISABLE">
+|   <K_DISCARD : "DISCARD">
 |   <K_DISCONNECT:"DISCONNECT">
 |   <K_DISTINCT:"DISTINCT">
+|   <K_DISTINCTROW:"DISTINCTROW">
 |   <K_DIV:"DIV">
 |   <K_DDL:"DDL">
 |   <K_DML:"DML">
 |   <K_DO:"DO">
 |   <K_DOMAIN:"DOMAIN">
+|   <K_DRIVER:"DRIVER">
 |   <K_DROP:"DROP">
 |   <K_DUMP:"DUMP">
 |   <K_DUPLICATE: "DUPLICATE">
@@ -247,14 +349,20 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_ELSE:"ELSE">
 |   <K_EMIT: "EMIT">
 |   <K_ENABLE: "ENABLE">
+|   <K_ENCODING: "ENCODING">
 |   <K_ENCRYPTION: "ENCRYPTION">
 |   <K_END: "END">
+|   <K_ENFORCED: "ENFORCED">
 |   <K_ENGINE: "ENGINE">
 |   <K_ERROR: "ERROR">
+|   <K_ERRORS: "ERRORS">
 |   <K_ESCAPE: "ESCAPE">
+|   <K_EXA: "EXA">
 |   <K_EXCEPT: "EXCEPT">
+|   <K_EXCHANGE: "EXCHANGE">
 |   <K_EXCLUDE: "EXCLUDE">
 |   <K_EXCLUDES: "EXCLUDES"> /* Salesforce SOQL */
+|   <K_EXCLUDING: "EXCLUDING">
 |   <K_EXEC: "EXEC">
 |   <K_EXECUTE: "EXECUTE">
 |   <K_EXISTS:"EXISTS">
@@ -263,8 +371,11 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_EXTEND:"EXTEND">
 |   <K_EXTENDED:"EXTENDED">
 |   <K_EXTRACT:"EXTRACT">
+|   <K_EXPORT:"EXPORT">
+|   <K_FBV:"FBV">
 |   <K_FETCH:"FETCH">
 |   <K_ISOLATION:("UR" | "RS" | "RR" | "CS")>
+|   <K_FILE: "FILE">
 |   <K_FILTER: "FILTER">
 |   <K_FINAL: "FINAL">
 |   <K_FIRST: "FIRST">
@@ -291,17 +402,23 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_HIGH_PRIORITY : "HIGH_PRIORITY">
 |   <K_HISTORY : "HISTORY">
 |   <K_HOPPING:"HOPPING">
+|   <K_IDENTIFIED:"IDENTIFIED">
+|   <K_IDENTITY:"IDENTITY">
 |   <K_IF:"IF">
 |   <K_IIF:"IIF">
 |   <K_IGNORE : "IGNORE">
 |   <K_ILIKE:"ILIKE">
+|   <K_IMPORT:"IMPORT">
 |   <K_IN:"IN">
 |   <K_INCLUDE:"INCLUDE">
 |   <K_INCLUDES:"INCLUDES"> /* Salesforce SOQL */
 |   <K_INCLUDE_NULL_VALUES:"INCLUDE_NULL_VALUES">
+|   <K_INCLUDING:"INCLUDING">
 |   <K_INCREMENT:"INCREMENT">
 |   <K_INDEX: "INDEX">
+|   <K_INFORMATION: "INFORMATION">
 |   <K_INNER:"INNER">
+|   <K_STATEMENT:"STATEMENT">
 |   <K_STRAIGHT:"STRAIGHT_JOIN">
 |   <K_INSERT:"INSERT">
 |   <K_INTERLEAVE: "INTERLEAVE">
@@ -311,8 +428,10 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_INTO:"INTO">
 |   <K_INVALIDATE:"INVALIDATE">
 |   <K_INVERSE:"INVERSE">
+|   <K_INVISIBLE:"INVISIBLE">
 |   <K_IS:"IS">
 |   <K_ISNULL:"ISNULL">
+|   <K_JDBC:"JDBC">
 |   <K_JOIN:"JOIN">
 |   <K_JSON:"JSON">
 |   <K_JSON_OBJECT: "JSON_OBJECT">
@@ -320,8 +439,10 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_JSON_ARRAY: "JSON_ARRAY">
 |   <K_JSON_ARRAYAGG: "JSON_ARRAYAGG">
 |   <K_KEEP:"KEEP">
+|   <K_KEY_BLOCK_SIZE: "KEY_BLOCK_SIZE">
 |   <K_KEY:"KEY">
 |   <K_KEYS:"KEYS">
+|   <K_KILL:"KILL">
 |   <K_FN:"FN">
 |   <K_LAST: "LAST">
 |   <K_LATERAL:"LATERAL">
@@ -338,6 +459,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_LOOP:"LOOP">
 |   <K_LOW : "LOW">
 |   <K_LOW_PRIORITY : "LOW_PRIORITY">
+|   <K_LTRIM : "LTRIM">
 |   <K_MATCH: "MATCH">
 |   <K_MATCH_ANY: "MATCH_ANY">
 |   <K_MATCH_ALL: "MATCH_ALL">
@@ -355,7 +477,10 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_MINVALUE:"MINVALUE">
 |   <K_MODIFY: "MODIFY">
 |   <K_MOVEMENT: "MOVEMENT">
+|   <K_NAMES:"NAMES">
 |   <K_NATURAL:"NATURAL">
+|   <K_NAME:"NAME">
+|   <K_NEVER:"NEVER">
 |   <K_NEXT:"NEXT">
 |   <K_NEXTVAL: (  (("NEXTVAL")((" ")+("FOR"))?)  |  ( ("NEXT")(" ")+("VALUE") (" ")+("FOR") )  )>
 |   <K_NO:"NO">
@@ -365,6 +490,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_NOLOCK:"NOLOCK">
 |   <K_NOMAXVALUE:"NOMAXVALUE">
 |   <K_NOMINVALUE:"NOMINVALUE">
+|   <K_NONE:"NONE">
 |   <K_NOORDER:"NOORDER">
 |   <K_NOT:"NOT">
 |   <K_NOTHING:"NOTHING">
@@ -380,8 +506,10 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_ONLY:"ONLY">
 |   <K_OPEN:"OPEN">
 |   <K_OR:"OR">
+|   <K_ORA: "ORA">
 |   <K_ORACLE_NAMED_PARAMETER_ASSIGNMENT: "=>">
 |   <K_ORDER:"ORDER">
+|   <K_ORDINALITY:"ORDINALITY">
 |   <K_OUTER:"OUTER">
 |   <K_OUTPUT:"OUTPUT">
 |   <K_OVER:"OVER">
@@ -390,9 +518,12 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_OVERRIDING:"OVERRIDING">
 |   <K_OVERWRITE:"OVERWRITE">
 |   <K_OPTIMIZE: "OPTIMIZE" >
+|   <K_PADDING:"PADDING">
 |   <K_PARALLEL:"PARALLEL">
 |   <K_PARENT:"PARENT">
+|   <K_PARSER: "PARSER">
 |   <K_PARTITION:"PARTITION">
+|   <K_PARTITIONING:"PARTITIONING">
 |   <K_PATH:"PATH">
 |   <K_PERCENT:"PERCENT">
 |   <K_PIVOT:"PIVOT">
@@ -413,17 +544,22 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_RANGE: "RANGE">
 |   <K_RAW: "RAW">
 |   <K_READ: "READ" >
+|   <K_REBUILD: "REBUILD">
 |   <K_RECYCLEBIN: "RECYCLEBIN">
 |   <K_RECURSIVE:"RECURSIVE">
 |   <K_REFERENCES:"REFERENCES">
 |   <K_REFRESH:"REFRESH">
 |   <K_REGEXP: "REGEXP">
+|   <K_REJECT: "REJECT">
 |   <K_RESPECT: "RESPECT">
 |   <K_RLIKE: "RLIKE">
 |   <K_REGEXP_LIKE: "REGEXP_LIKE">
 |   <K_REGISTER: "REGISTER">
 |   <K_REMOTE: "REMOTE">
+|   <K_REMOVE: "REMOVE">
 |   <K_RENAME:"RENAME">
+|   <K_REORGANIZE: "REORGANIZE">
+|   <K_REPAIR: "REPAIR">
 |   <K_REPEATABLE: "REPEATABLE">
 |   <K_REPLACE:"REPLACE">
 |   <K_RESET:"RESET">
@@ -440,10 +576,12 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_ROOT:"ROOT">
 |   <K_ROW: "ROW">
 |   <K_ROWS: "ROWS">
+|   <K_RTRIM: "RTRIM">
 |   <K_SAFE_CAST: "SAFE_CAST">
 |   <K_SAMPLE: "SAMPLE">
 |   <K_SAVEPOINT: "SAVEPOINT">
 |   <K_SCHEMA: "SCHEMA">
+|   <K_SCRIPT: "SCRIPT">
 |   <K_SECURE: "SECURE">
 |   <K_SEED: "SEED">
 |   <K_SELECT: ("SELECT" | "SEL")>
@@ -461,15 +599,22 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_SIZE:"SIZE">
 |   <K_SKIP: "SKIP">
 |   <K_SOME:"SOME">
+|   <K_SPATIAL:"SPATIAL">
 |   <K_START:"START">
 |   <K_STORED: "STORED">
+|   <K_STREAM: "STREAM">
+|   <K_STRICT: "STRICT">
 |   <K_STRING: "STRING">
 |   <K_STRUCT: "STRUCT">
 |   <K_SUMMARIZE: "SUMMARIZE">
 |   <K_SUSPEND:"SUSPEND">
 |   <K_SWITCH: "SWITCH">
+|   <K_SYMMETRIC:"SYMMETRIC">
 |   <K_SYNONYM:"SYNONYM">
 |   <K_SYSTEM:"SYSTEM">
+|   <K_SYSTEM_TIME:"SYSTEM_TIME">
+|   <K_SYSTEM_TIMESTAMP:"SYSTEM_TIMESTAMP">
+|   <K_SYSTEM_VERSION:"SYSTEM_VERSION">
 |   <K_TABLE:"TABLE">
 |   <K_TABLES:"TABLES">
 |   <K_TABLESAMPLE: "TABLESAMPLE">
@@ -499,6 +644,8 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_UNBOUNDED: "UNBOUNDED">
 |   <K_UNION:"UNION">
 |   <K_UNIQUE:"UNIQUE">
+|   <K_UNKNOWN:"UNKNOWN">
+|   <K_UNLIMITED: "UNLIMITED">
 |   <K_UNLOGGED: "UNLOGGED">
 |   <K_UNPIVOT:"UNPIVOT">
 |   <K_UPDATE:"UPDATE">
@@ -514,10 +661,14 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_STRING_FUNCTION_NAME: ("SUBSTR" | "SUBSTRING" | "TRIM" | "POSITION" | "OVERLAY")>
 |   <K_UNSIGNED:"UNSIGNED">
 |   <K_VALIDATE : "VALIDATE">
+|   <K_VALIDATION: "VALIDATION">
 |   <K_VALUE:"VALUE">
 |   <K_VALUES:"VALUES">
 |   <K_VERBOSE: "VERBOSE">
+|   <K_VERIFY: "VERIFY">
+|   <K_VERSION: "VERSION">
 |   <K_VIEW:"VIEW">
+|   <K_VISIBLE: "VISIBLE">
 |   <K_VOLATILE:"VOLATILE">
 |   <K_CONCURRENTLY:"CONCURRENTLY">
 |   <K_WAIT : "WAIT">
@@ -542,6 +693,8 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
 |   <K_YES:"YES">
 |   <K_ZONE:"ZONE">
 
+|   <OPENING_BRACKET: "(">
+|   <CLOSING_BRACKET: ")">
 |   <OPENING_CURLY_BRACKET: "{">
 |   <CLOSING_CURLY_BRACKET: "}">
 |   <DOUBLE_COLON: ":">
@@ -556,9 +709,11 @@ TOKEN : /* Statement Separators */
 TOKEN : /* Operators */
 {
     <OP_GREATERTHANEQUALS: ">" (<WHITESPACE>)* "=">
+|   <OP_COSINESIMILARITY: "<=>">
 |   <OP_MINORTHANEQUALS: "<" (<WHITESPACE>)* "=">
 |   <OP_NOTEQUALSSTANDARD: "<" (<WHITESPACE>)* ">">
 |   <OP_NOTEQUALSBANG: "!" (<WHITESPACE>)* "=">
+|   <OP_NOTEQUALSHAT: "^" (<WHITESPACE>)* "=">
 |   <OP_CONCAT: "|" (<WHITESPACE>)* "|">
 | 	<OP_DOUBLEAND: "&&">
 | 	<OP_CONTAINS: "&>">
@@ -581,7 +736,7 @@ TOKEN : /* Data Types */
 
     | <#TYPE_BIT:  "BISTRING">
     | <#TYPE_BLOB: "BLOB" | "BYTEA" | <K_BINARY> | "VARBINARY" | <K_BYTES> >
-    | <#TYPE_BOOLEAN: "BOOLEAN" | "BOOL" >
+    | <#TYPE_BOOLEAN: <K_BOOLEAN> | "BOOL" >
     | <#TYPE_ENUM: "ENUM" >
     | <#TYPE_MAP: "MAP" >
     | <#TYPE_DECIMAL: "DECIMAL" | "NUMBER" | "NUMERIC" >
@@ -633,6 +788,7 @@ TOKEN:
                 | <Nd> | [ "$" , "#", "_" ] // Not SQL:2016 compliant!
                 >
 |   <#PART_LETTER: <UnicodeIdentifierStart> | <UnicodeIdentifierExtend> | [ "$" , "#", "_" , "@"  ] >
+| <S_AT_IDENTIFIER: <K_AT_SIGN> (<K_AT_SIGN>)? <S_IDENTIFIER> >
 
 // Unicode characters and categories are defined here: https://www.unicode.org/Public/UNIDATA/UnicodeData.txt
 // SQL:2016 states:
@@ -664,7 +820,7 @@ TOKEN:
 | < S_CHAR_LITERAL: (
                         (["U","E","N","R","B"]|"RB"|"_utf8")?
                         (
-                            ("'" ( <ESC> | <SPECIAL_ESC> | ~["'", "\\"] )* "'") | ("'" ("''" | ~["'"])* "'")
+                            ("'" ( <ESC> | <SPECIAL_ESC> | ~["'", "\\"] )* "'") | ("'" ("''" | ~["'"])* "'" | "$$" (~["$"])* "$$")
                             // Alternative Oracle Escape Modes
                             | ("q'{" (~[])* "}'")
                             | ("q'(" (~[])* ")'")
@@ -679,38 +835,69 @@ TOKEN:
         // which contains the <SPECIAL_ESC>, then we will need to
         // 1) break the <S_CHAR_LITERAL> at <SPECIAL_ESC> close it with a "'"
         // 2) continue tokenizing after that <SPECIAL_ESC> with a new <S_CHAR_LITERAL> or any other Token
-        if ( !configuration.getAsBoolean(Feature.allowBackslashEscapeCharacter) && matchedToken.image.contains("\\'") ) {
-            matchedToken.image = image.substring( 0, image.indexOf("\\'") + 1 ) + "'";
-            for (int i=0;i<CCJSqlParserConstants.tokenImage.length;i++) {
-              if ( CCJSqlParserConstants.tokenImage[i].equals("<S_CHAR_LITERAL>") ) {
-                  matchedToken.kind = i;
-              }
-            }
-            input_stream.backup(image.length() - matchedToken.image.length() );
-        } else if ( configuration.getAsBoolean(Feature.allowBackslashEscapeCharacter) && matchedToken.image.contains("\\''") ) {
-            matchedToken.image = image.substring( 0, image.lastIndexOf("\\'") + 3);
-            for (int i=0;i<CCJSqlParserConstants.tokenImage.length;i++) {
-                if ( CCJSqlParserConstants.tokenImage[i].equals("<S_CHAR_LITERAL>") ) {
-                    matchedToken.kind = i;
+        boolean allowEscape = configuration.getAsBoolean(Feature.allowBackslashEscapeCharacter);
+                String img = matchedToken.image;
+                int pos;
+                if (!allowEscape) {
+                    pos = indexOfSequence(img, "\\'");
+                    if (pos > 0) {
+                        matchedToken.image = "'" + image.substring( 0, image.indexOf("\\'") + 1 ) + "'";
+                        // `charLiteralIndex` defined in TokenManagerDeclaration above
+                        matchedToken.kind = charLiteralIndex;
+                        input_stream.backup(image.length() + 1 - matchedToken.image.length());
+                    }
+                } else {
+                    pos = lastIndexOfSequence(img, "\\''");
+                    if (pos > 0) {
+                        matchedToken.image = "'" + image.substring( 0, image.lastIndexOf("\\'") + 3);
+                        // `charLiteralIndex` defined in TokenManagerDeclaration above
+                        matchedToken.kind = charLiteralIndex;
+                        input_stream.backup(image.length() + 1 - matchedToken.image.length() );
+                    }
                 }
-            }
-            input_stream.backup(image.length() - matchedToken.image.length() );
-      }
     }
-| < S_QUOTED_IDENTIFIER: "\"" ( "\"\"" | ~["\n","\r","\""])* "\"" | "$$" (~["$"])* "$$" | ("`" (~["\n","\r","`"])+ "`") | ( "[" (~["\n","\r","]"])* "]" ) >
+| < S_QUOTED_IDENTIFIER: "\"" ( "\"\"" | ~["\n","\r","\""])* "\"" | ("`" (~["\n","\r","`"])+ "`") | ( "[" (~["\n","\r","]"])* "]" ) >
     {
-        if ( !configuration.getAsBoolean(Feature.allowSquareBracketQuotation) && matchedToken.image.charAt(0) == '[' ) {
+        if ( !configuration.getAsBoolean(Feature.allowSquareBracketQuotation)
+            && matchedToken.image.charAt(0) == '[' ) {
+
             matchedToken.image = "[";
-            for (int i=0;i<CCJSqlParserConstants.tokenImage.length;i++) {
-                if (CCJSqlParserConstants.tokenImage[i].equals("\"[\"")) {
-                    matchedToken.kind = i;
-                }
-            }
+            // `squaredBracketOpenIndex` defined in TokenManagerDeclaration above
+            matchedToken.kind = squaredBracketOpenIndex;
             input_stream.backup(image.length() - 1);
         }
     }
 }
 
+/**
+ * Parses identifiers including standard SQL identifiers, quoted identifiers, and specific keywords.
+ *
+ * This is used in cases where certain SQL keywords (like NAME, NEXT, VALUE, etc.) can appear
+ * as identifiers (e.g., table names, column names) depending on the SQL dialect or context.
+ *
+ * Supported tokens:
+ *  - <S_IDENTIFIER>: Standard unquoted SQL identifier
+ *  - <S_QUOTED_IDENTIFIER>: Quoted identifier (e.g., `identifier` or "identifier")
+ *  - <K_NAME>, <K_NEXT>, <K_VALUE>, <K_PUBLIC>, <K_STRING>: Specific keywords treated as identifiers
+ *
+ * @return Token representing the identifier or keyword used as identifier
+ */
+Token KeywordOrIdentifier():
+{
+    Token tk;
+}
+{
+    (
+        tk = <S_IDENTIFIER>
+      | tk = <S_QUOTED_IDENTIFIER>
+      | tk = <K_NAME>
+      | tk = <K_NEXT>
+      | tk = <K_VALUE>
+      | tk = <K_PUBLIC>
+      | tk = <K_STRING>
+    )
+    { return tk; }
+}
 
 Statement Statement() #Statement:
 {
@@ -837,6 +1024,10 @@ Statement SingleStatement() :
             stm = Grant()
             |
             stm = PurgeStatement()
+            |
+            stm = SessionStatement()
+            |
+            LOOKAHEAD({ Dialect.EXASOL.name().equals(getAsString(Feature.dialect)) }) ( stm = Import() | stm = Export() )
         )
         { return stm; }
 }
@@ -1002,7 +1193,7 @@ Statements Statements() #Statements: {
 JAVACODE
 List<String> error_skipto(int kind) {
   ArrayList<String> tokenImages = new ArrayList<String>();
-  ParseException e = generateParseException();
+  ParseException e = generateParseException("test");
   Token t;
   do {
     t = getNextToken();
@@ -1013,192 +1204,1073 @@ List<String> error_skipto(int kind) {
   return tokenImages;
 }
 
-DeclareStatement Declare(): {
-    UserVariable userVariable;
-    ColDataType colDataType;
-    Expression defaultExpr = null;
-    DeclareStatement stmt = new DeclareStatement();
-    String typeName;
-    String columnName;
-    ColumnDefinition colDef;
+LikeClause LikeClause(): {
+    LikeClause likeClause = new LikeClause();
+    Table table;
+    List<SelectItem<Column>> columnsList;
 } {
-    <K_DECLARE> userVariable = UserVariable()
-    (
-         LOOKAHEAD(2) (
-            <K_TABLE> "(" colDef = ColumnDefinition()
-            {
-            stmt.withUserVariable(userVariable)
-            .withDeclareType(DeclareType.TABLE)
-            .addColumnDefinition(colDef);
-            }
-            ("," colDef = ColumnDefinition() { stmt.addColumnDefinition(colDef); })*  ")"
-        )
-        |
-            <K_AS> typeName = RelObjectName()
-                {
-                    stmt.withUserVariable(userVariable)
-                      .withDeclareType(DeclareType.AS)
-                      .withTypeName(typeName);
-                }
-        |
-            (colDataType = ColDataType() ["=" defaultExpr = Expression()]
-                {
-                  stmt.withDeclareType(DeclareType.TYPE)
-                  .addType(userVariable, colDataType, defaultExpr);
-                }
-                ("," userVariable = UserVariable() colDataType = ColDataType() { defaultExpr = null; }
-                ["=" defaultExpr = Expression()] { stmt.addType(userVariable, colDataType, defaultExpr); } )*
-            )
-    )
-    {
-       return stmt;
-    }
-}
-
+    <K_LIKE>
+    table = Table() { likeClause.setTable(table); }
+    [ "(" columnsList = ColumnSelectItemsList() ")" { likeClause.setColumnsList(columnsList); }]
 
+    [
+        LOOKAHEAD(2)
+        (
+              <K_INCLUDING> { likeClause.setIncludingDefaults(true); }
+            | <K_EXCLUDING> { likeClause.setExcludingDefaults(true); }
+        )
+        <K_DEFAULTS>
+    ]
 
-SetStatement Set(): {
-    String namePart;
-    Object name;
-    ExpressionList expList;
-    boolean useEqual = false;
-    SetStatement set;
-    Expression exp = null;
-    Token tk = null;
-    String effectParameter = null;
-}
-{
-    <K_SET>
-    [LOOKAHEAD(3) (tk = <K_LOCAL> | tk = <K_SESSION>) {effectParameter = tk.image; } ]
-    (
+    [
         LOOKAHEAD(2)
-        <K_DATETIMELITERAL> <K_ZONE> { name = "Time Zone"; useEqual=false; }
-        |
         (
-            name = UserVariable() ["=" { useEqual=true; } ]
+              <K_INCLUDING> { likeClause.setIncludingIdentity(true); }
+            | <K_EXCLUDING> { likeClause.setExcludingIdentity(true); }
         )
-        |
+        <K_IDENTITY>
+    ]
+
+    [
+        LOOKAHEAD(2)
         (
-            name = IdentifierChain()
-            ["=" { useEqual=true; } ]
+              <K_INCLUDING> { likeClause.setIncludingComments(true); }
+            | <K_EXCLUDING> { likeClause.setExcludingComments(true); }
         )
-    )
-    exp=Expression()
+        <K_COMMENTS>
+    ]
+    
     {
-        expList = new ExpressionList();
-        expList.add(exp);
-        set = new SetStatement(name, expList)
-            .withUseEqual(useEqual)
-            .withEffectParameter(effectParameter);
+        return likeClause;
     }
+}
 
+Export Export() #Export: {
+    Export export = new Export();
+    Table table;
+    ParenthesedExpressionList<Column> columns;
+    ParenthesedSelect select;
+    ExportIntoItem exportIntoItem;
+} {
+    <K_EXPORT>
     (
-        { useEqual=false; }
-        ","
-        (LOOKAHEAD(3)
-            (
-                ( LOOKAHEAD(2)
-                    <K_DATETIMELITERAL> <K_ZONE> { name = "Time Zone"; useEqual=false; }
-                    |
-                    (name = RelObjectNameExt() ["=" { useEqual=true; } ])
-                )
-                exp=Expression()
-                {
-                    expList = new ExpressionList();
-                    expList.add(exp);
-                    set.add(name, expList, useEqual);
-                }
-            )
-            |
-            exp=Expression() { expList.add(exp); }
-         )
-    )*
-    { return set; }
-}
+          table = Table() { export.setTable(table); }
+          [ columns = ParenthesedColumnList() { export.setColumns(columns); } ]
+        | select = ParenthesedSelect() { export.setSelect(select); }
+    )
 
-ResetStatement Reset(): {
-    String name;
-    ResetStatement reset;
-    Token all;
+    <K_INTO>
+    exportIntoItem = ExportIntoItem() { export.setExportIntoItem(exportIntoItem); }
+
+    {
+        return export;
+    }
 }
-{
-    <K_RESET> ( LOOKAHEAD(2) <K_DATETIMELITERAL> <K_ZONE> {name = "Time Zone"; } | name = RelObjectName() | all = <K_ALL> {name = all.image; } )
-    { reset = new ResetStatement(name);   return reset; }
+
+Import Import() #Import: {
+    Import impt = new Import();
+    Table table;
+    ParenthesedExpressionList<Column> columns;
+    List<ImportColumn> importColumns;
+    ImportFromItem fromItem;
+} {
+    <K_IMPORT>
+    [
+        <K_INTO>
+        (
+              table = Table() { impt.setTable(table); }
+              [ columns = ParenthesedColumnList() { impt.setColumns(columns); } ]
+            | importColumns = ImportColumns() { impt.setImportColumns(importColumns); }
+        )
+    ]
+
+    <K_FROM>
+    fromItem = ImportFromItem() { impt.setFromItem(fromItem); }
+
+    {
+        return impt;
+    }
 }
 
-RenameTableStatement RenameTableStatement(): {
-    RenameTableStatement renameTableStatement;
-    Table oldName;
-    Table newName;
-    boolean usingTableKeyword=false;
-    boolean usesIfExistsKeyword=false;
-    String waitDirective = "";
-    Token token;
+Import SubImport() #SubImport: {
+    Import impt = new Import();
+    List<ImportColumn> importColumns;
+    ImportFromItem fromItem;
+} {
+    "("
+        <K_IMPORT>
+        [ <K_INTO> importColumns = ImportColumns() { impt.setImportColumns(importColumns); } ]
+
+        <K_FROM>
+        fromItem = ImportFromItem() { impt.setFromItem(fromItem); }
+    ")"
+
+    {
+        return impt;
+    }
 }
-{
-    <K_RENAME>
-    [ LOOKAHEAD(2) <K_TABLE> { usingTableKeyword = true; } ]
-    [ LOOKAHEAD(2) <K_IF> <K_EXISTS> { usesIfExistsKeyword = true; } ]
-    oldName = Table()
-    [ (
-        <K_WAIT> token=<S_LONG> { waitDirective = "WAIT " + token.image; }
-        |
-        <K_NOWAIT>  { waitDirective = "NOWAIT"; }
-       ) ]
-    <K_TO>
-    newName = Table()
+
+List<ImportColumn> ImportColumns(): {
+    ImportColumn importColumn;
+    List<ImportColumn> importColumns = new ArrayList<ImportColumn>();
+} {
+    "("
+        (
+              importColumn = ColumnDefinition()
+            | importColumn = LikeClause()
+        )
+        { importColumns.add(importColumn); }
+
+        (
+            ","
+            (
+                  importColumn = ColumnDefinition()
+                | importColumn = LikeClause()
+            )
+            { importColumns.add(importColumn); }
+        )*
+    ")"
 
     {
-        renameTableStatement = new RenameTableStatement(oldName, newName, usingTableKeyword, usesIfExistsKeyword, waitDirective);
+        return importColumns;
     }
+}
 
+ExportIntoItem ExportIntoItem(): {
+    ExportIntoItem exportIntoItem;
+    ErrorClause errorClause;
+} {
     (
-        ","
-        oldName = Table()
-        <K_TO>
-        newName = Table()
-        {
-            renameTableStatement.addTableNames(oldName, newName);
-        }
-    )*
+          exportIntoItem = DBMSDestination()
+        | exportIntoItem = FileDestination()
+        | exportIntoItem = ScriptSourceDestination()
+    )
+    [ LOOKAHEAD(2) errorClause = ErrorClause() { exportIntoItem.setErrorClause(errorClause); } ]
 
     {
-        return renameTableStatement;
+        return exportIntoItem;
     }
 }
 
-PurgeStatement PurgeStatement(): {
-    PurgeStatement purgeStatement = null;
-    Table table;
-    Index index;
-    Token tableSpaceToken;
-    Token userToken = null;
-}
-{
-    <K_PURGE>
+ImportFromItem ImportFromItem(): {
+    ImportFromItem importFromItem;
+    ErrorClause errorClause;
+} {
     (
-        <K_TABLE> table=Table() { purgeStatement = new PurgeStatement(table); }
-        |
-        <K_INDEX> index=Index() { purgeStatement = new PurgeStatement(index); }
-        |
-        <K_RECYCLEBIN> { purgeStatement = new PurgeStatement(PurgeObjectType.RECYCLEBIN); }
-        |
-        <K_DBA_RECYCLEBIN> { purgeStatement = new PurgeStatement(PurgeObjectType.DBA_RECYCLEBIN); }
-        |
-        <K_TABLESPACE> tableSpaceToken=<S_IDENTIFIER> [ <K_USER> userToken=<S_IDENTIFIER> ] {
-            purgeStatement = new PurgeStatement(
-                PurgeObjectType.TABLESPACE
-                , tableSpaceToken.image
-                , userToken!=null ? userToken.image : null);
-            }
+          importFromItem = DBMSSource()
+        | importFromItem = FileSource()
+        | importFromItem = ScriptSourceDestination()
     )
+    [ LOOKAHEAD(2) errorClause = ErrorClause() { importFromItem.setErrorClause(errorClause); } ]
 
     {
-        return purgeStatement;
+        return importFromItem;
     }
 }
 
-DescribeStatement Describe(): {
+DBMSDestination DBMSDestination() #DBMSDestination: {
+    DBMSDestination dbmsDestination = new DBMSDestination();
+    DBMSType dbmsType;
+    ConnectionDefinition connectionDefinition;
+    Table table;
+    ExpressionList<Column> columns;
+    StringValue statement;
+    List<DBMSTableDestinationOption> dbmsTableDestinationOptions;
+} {
+    dbmsType = DBMSType() { dbmsDestination.setDestinationType(dbmsType); }
+
+    connectionDefinition = ConnectionDefinition() { dbmsDestination.setConnectionDefinition(connectionDefinition); }
+
+    (
+          LOOKAHEAD(3)
+          <K_TABLE> table = Table() { dbmsDestination.setTable(table); }
+          [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsDestination.setColumns(columns); } ]
+          [ LOOKAHEAD(2) dbmsTableDestinationOptions = DBMSTableDestinationOptionList() { dbmsDestination.setDBMSTableDestinationOptions(dbmsTableDestinationOptions); } ]
+        | statement = ImportExportStatement() { dbmsDestination.setStatement(statement); }
+    )
+
+    {
+      return dbmsDestination;
+    }
+}
+
+DBMSTableDestinationOption DBMSTableDestinationOption(): {
+    DBMSTableDestinationOption dbmsTableDestinationOption;
+
+    Token token;
+    Token token2;
+    Token token3;
+} {
+    (
+        (
+              token = <K_REPLACE>
+            | token = <K_TRUNCATE>
+            ) { dbmsTableDestinationOption = new DBMSTableDestinationOption(token.image); }
+        | token = <K_CREATED> token2 = <K_BY> token3 = <S_CHAR_LITERAL> { dbmsTableDestinationOption = new DBMSTableDestinationOption(token.image + " " + token2.image, new StringValue(token3.image)); }
+    )
+
+    {
+        return dbmsTableDestinationOption;
+    }
+}
+
+List<DBMSTableDestinationOption> DBMSTableDestinationOptionList(): {
+    List<DBMSTableDestinationOption> dbmsTableDestinationOptions = new ArrayList<DBMSTableDestinationOption>();
+    DBMSTableDestinationOption dbmsTableDestinationOption;
+} {
+    ( LOOKAHEAD(2) dbmsTableDestinationOption = DBMSTableDestinationOption() { dbmsTableDestinationOptions.add(dbmsTableDestinationOption); } )+
+    {
+        return dbmsTableDestinationOptions;
+    }
+}
+
+DBMSSource DBMSSource() #DBMSSource: {
+    DBMSSource dbmsSource = new DBMSSource();
+    DBMSType dbmsType;
+    ConnectionDefinition connectionDefinition;
+    Table table;
+    ExpressionList<Column> columns;
+    List<StringValue> statements;
+} {
+    dbmsType = DBMSType() { dbmsSource.setSourceType(dbmsType); }
+
+    connectionDefinition = ConnectionDefinition() { dbmsSource.setConnectionDefinition(connectionDefinition); }
+
+    (
+          <K_TABLE> table = Table() { dbmsSource.setTable(table); }
+          [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsSource.setColumns(columns); } ]
+        | statements = ImportExportStatementsList() { dbmsSource.setStatements(statements); }
+    )
+    {
+      return dbmsSource;
+    }
+}
+
+DBMSType DBMSType(): {
+    DBMSType dbmsType;
+    Token tk1;
+    Token tk2 = null;
+} {
+    (
+        tk1=<K_EXA>
+      | tk1=<K_ORA>
+      | tk1=<K_JDBC>
+        [<K_DRIVER> "=" tk2=<S_CHAR_LITERAL>]
+    ) { dbmsType = new DBMSType(tk1.image, tk2 == null ? null : tk2.image); }
+    {
+        return dbmsType;
+    }
+}
+
+FileType FileType(): {
+    FileType fileType;
+    Token tk;
+} {
+    (
+        tk=<K_CSV>
+      | tk=<K_FBV>
+    ) { fileType = new FileType(tk.image); }
+    {
+        return fileType;
+    }
+}
+
+StringValue ImportExportStatement() #ImportExportStatement: {
+    StringValue statement;
+} {
+    <K_STATEMENT> token = <S_CHAR_LITERAL>
+    {
+      statement = new StringValue(token.image);
+      linkAST(statement, jjtThis);
+      return statement;
+    }
+}
+
+List<StringValue> ImportExportStatementsList(): {
+    List<StringValue> statements = new ArrayList<StringValue>();
+    StringValue statement;
+} {
+    ( statement = ImportExportStatement() { statements.add(statement); } )+
+
+    {
+        return statements;
+    }
+}
+
+StringValue File() #File: {
+    Token token;
+} {
+    <K_FILE> token = <S_CHAR_LITERAL>
+    {
+        StringValue file = new StringValue(token.image);
+        linkAST(file, jjtThis);
+        return file;
+    }
+}
+
+List<StringValue> FileList(): {
+    List<StringValue> files = new ArrayList<StringValue>();
+    StringValue file;
+} {
+    ( file = File() { files.add(file); } )+
+    {
+        return files;
+    }
+}
+
+ConnectionFileDefinition ConnectionFileDefinition(): {
+    ConnectionDefinition connectionDefinition = null;
+    List<StringValue> files;
+} {
+    connectionDefinition = ConnectionOrCloudConnectionDefinition()
+    files = FileList()
+    {
+        return new ConnectionFileDefinition(connectionDefinition, files);
+    }
+}
+
+List<ConnectionFileDefinition> ConnectionFileDefinitionList(): {
+    List<ConnectionFileDefinition> connectionFileDefinitions = new ArrayList<ConnectionFileDefinition>();
+    ConnectionFileDefinition connectionFileDefinition;
+} {
+    ( LOOKAHEAD(2) connectionFileDefinition = ConnectionFileDefinition() { connectionFileDefinitions.add(connectionFileDefinition); } )+
+    {
+        return connectionFileDefinitions;
+    }
+}
+
+CSVColumn CSVDestinationColumn(): {
+    CSVColumn csvColumn;
+
+    Token token;
+    Token token2;
+} {
+    (
+          LOOKAHEAD(2)
+          token=<S_LONG> ".." token2=<S_LONG> { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); }
+        | token=<S_LONG> { csvColumn = new CSVColumn(Long.valueOf(token.image)); }
+          [ <K_FORMAT> "=" token = <S_CHAR_LITERAL> { csvColumn.setFormat(new StringValue(token.image)); }]
+          [
+            <K_DELIMIT>
+            "="
+            (
+                  token=<K_ALWAYS>
+                | token=<K_NEVER>
+                | token=<K_AUTO>
+            )
+            { csvColumn.setDelimit(token.image); }
+          ]
+    )
+    {
+        return csvColumn;
+    }
+}
+
+List<CSVColumn> CSVDestinationColumnList(): {
+    List<CSVColumn> csvColumns = new ArrayList<CSVColumn>();
+    CSVColumn csvColumn;
+} {
+    csvColumn = CSVDestinationColumn() { csvColumns.add(csvColumn); }
+    ( "," csvColumn = CSVDestinationColumn() { csvColumns.add(csvColumn); } )*
+    {
+        return csvColumns;
+    }
+}
+
+CSVColumn CSVSourceColumn(): {
+    CSVColumn csvColumn;
+
+    Token token;
+    Token token2;
+} {
+    (
+          LOOKAHEAD(2)
+          token=<S_LONG> ".." token2=<S_LONG> { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); }
+        | token=<S_LONG> { csvColumn = new CSVColumn(Long.valueOf(token.image)); }
+          [ <K_FORMAT> "=" token = <S_CHAR_LITERAL> { csvColumn.setFormat(new StringValue(token.image)); }]
+    )
+    {
+        return csvColumn;
+    }
+}
+
+List<CSVColumn> CSVSourceColumnList(): {
+    List<CSVColumn> csvColumns = new ArrayList<CSVColumn>();
+    CSVColumn csvColumn;
+} {
+    csvColumn = CSVSourceColumn() { csvColumns.add(csvColumn); }
+    ( "," csvColumn = CSVSourceColumn() { csvColumns.add(csvColumn); } )*
+    {
+        return csvColumns;
+    }
+}
+
+FBVColumn FBVDestinationColumn(): {
+    FBVColumn fbvColumn;
+
+    Token token;
+    Token token2;
+} {
+    (
+          token=<K_SIZE> "=" token2=<S_LONG> { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); }
+        | ( token=<K_FORMAT> | token=<K_PADDING> ) "=" token2=<S_CHAR_LITERAL> { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); }
+        | token=<K_ALIGN> "=" ( token2=<K_LEFT> | token2=<K_RIGHT> ) { fbvColumn = new FBVColumn(token.image, token2.image); }
+    )
+    {
+        return fbvColumn;
+    }
+}
+
+List<FBVColumn> FBVDestinationColumnList(): {
+    List<FBVColumn> fbvColumns = new ArrayList<FBVColumn>();
+    FBVColumn fbvColumn;
+    boolean precedesComma;
+} {
+    fbvColumn = FBVDestinationColumn() { fbvColumns.add(fbvColumn); }
+    (
+        { precedesComma = false; }
+        ["," { precedesComma = true; }]
+        fbvColumn = FBVDestinationColumn() { fbvColumn.setPrecedesComma(precedesComma); fbvColumns.add(fbvColumn); }
+    )*
+    {
+        return fbvColumns;
+    }
+}
+
+FBVColumn FBVSourceColumn(): {
+    FBVColumn fbvColumn;
+
+    Token token;
+    Token token2;
+} {
+    (
+          ( token=<K_SIZE> | token=<K_START> ) "=" token2=<S_LONG> { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); }
+        | ( token=<K_FORMAT> | token=<K_PADDING> ) "=" token2=<S_CHAR_LITERAL> { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); }
+        | token=<K_ALIGN> "=" ( token2=<K_LEFT> | token2=<K_RIGHT> ) { fbvColumn = new FBVColumn(token.image, token2.image); }
+    )
+    {
+        return fbvColumn;
+    }
+}
+
+List<FBVColumn> FBVSourceColumnList(): {
+    List<FBVColumn> fbvColumns = new ArrayList<FBVColumn>();
+    FBVColumn fbvColumn;
+    boolean precedesComma;
+} {
+    fbvColumn = FBVSourceColumn() { fbvColumns.add(fbvColumn); }
+    (
+        { precedesComma = false; }
+        ["," { precedesComma = true; }]
+        fbvColumn = FBVSourceColumn() { fbvColumn.setPrecedesComma(precedesComma); fbvColumns.add(fbvColumn); }
+    )*
+    {
+        return fbvColumns;
+    }
+}
+
+FileOption FileDestinationOption(): {
+    FileOption fileOption;
+
+    Token token;
+    Token token2;
+    Token token3;
+} {
+    (
+        ( token=<K_REPLACE> | token=<K_TRUNCATE> ) { fileOption = new FileOption(token.image); }
+      | token=<K_WITH> token2=<K_COLUMN> token3=<K_NAMES> { fileOption = new FileOption(token.image + " " + token2.image + " " + token3.image); }
+      | ( token=<K_ENCODING> | token=<K_NULL> | token=<K_BOOLEAN> ) "=" token2=<S_CHAR_LITERAL> { fileOption = new FileOption(token.image, new StringValue(token2.image)); }
+      | (
+            token=<K_ROW> token2=<K_SEPARATOR> "=" token3=<S_CHAR_LITERAL>
+          | token=<K_COLUMN> ( token2=<K_SEPARATOR> | token2=<K_DELIMITER> ) "=" token3=<S_CHAR_LITERAL>
+        )
+        { fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); }
+      | token=<K_DELIMIT> "=" ( token2=<K_ALWAYS> | token2=<K_NEVER> | token2=<K_AUTO> ) { fileOption = new FileOption(token.image, token2.image); }
+    )
+    {
+        return fileOption;
+    }
+}
+
+List<FileOption> FileDestinationOptionList(): {
+    List<FileOption> fileOptions = new ArrayList<FileOption>();
+    FileOption fileOption;
+} {
+    ( LOOKAHEAD(2) fileOption = FileDestinationOption() { fileOptions.add(fileOption); } )+
+    {
+        return fileOptions;
+    }
+}
+
+FileOption FileSourceOption(): {
+    FileOption fileOption;
+
+    Token token;
+    Token token2;
+    Token token3;
+} {
+    (
+        ( token=<K_TRIM> | token=<K_LTRIM> | token=<K_RTRIM> ) { fileOption = new FileOption(token.image); }
+      | (
+            ( token=<K_ENCODING> | token=<K_NULL> ) "=" token2=<S_CHAR_LITERAL> { fileOption = new FileOption(token.image, new StringValue(token2.image)); }
+          | token=<K_SKIP> "=" token2=<S_LONG> { fileOption = new FileOption(token.image, new LongValue(token2.image)); }
+        )
+      | LOOKAHEAD(2)
+        (
+            token=<K_ROW> token2=<K_SEPARATOR> "=" token3=<S_CHAR_LITERAL>
+          | token=<K_COLUMN> ( token2=<K_SEPARATOR> | token2=<K_DELIMITER> ) "=" token3=<S_CHAR_LITERAL>
+        )
+        { fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); }
+      | token=<K_ROW> token2=<K_SIZE> "=" token3=<S_LONG>
+        { fileOption = new FileOption(token.image + " " + token2.image, new LongValue(token3.image)); }
+    )
+    {
+        return fileOption;
+    }
+}
+
+List<FileOption> FileSourceOptionList(): {
+    List<FileOption> fileOptions = new ArrayList<FileOption>();
+    FileOption fileOption;
+} {
+    ( LOOKAHEAD(2) fileOption = FileSourceOption() { fileOptions.add(fileOption); } )+
+    {
+        return fileOptions;
+    }
+}
+
+FileDestination FileDestination() #FileDestination: {
+    FileDestination fileDestination = new FileDestination();
+    FileType fileType;
+    List<ConnectionFileDefinition> connectionFileDefinitions;
+    List<StringValue> files;
+    List<CSVColumn> csvColumns;
+    List<FBVColumn> fbvColumns;
+    List<FileOption> fileOptions;
+    CertificateVerification certificateVerification;
+} {
+  (
+      fileType = FileType() { fileDestination.setDestinationType(fileType); }
+      connectionFileDefinitions = ConnectionFileDefinitionList() { fileDestination.setConnectionFileDefinitions(connectionFileDefinitions); }
+    | <K_LOCAL> { fileDestination.setLocal(true); }
+      [<K_SECURE> { fileDestination.setSecure(true); }]
+
+      fileType = FileType() { fileDestination.setDestinationType(fileType); }
+      files = FileList()
+      {
+            connectionFileDefinitions = new ArrayList<ConnectionFileDefinition>();
+            connectionFileDefinitions.add(new ConnectionFileDefinition(files));
+      }
+  )
+  { fileDestination.setConnectionFileDefinitions(connectionFileDefinitions); }
+
+  [
+    LOOKAHEAD(2)
+    "("
+        (
+            csvColumns = CSVDestinationColumnList() { fileDestination.setCSVColumns(csvColumns); }
+          | fbvColumns = FBVDestinationColumnList() { fileDestination.setFBVColumns(fbvColumns); }
+        )
+    ")"
+  ]
+
+  [ LOOKAHEAD(2) fileOptions = FileDestinationOptionList() { fileDestination.setFileOptions(fileOptions); } ]
+
+  [ LOOKAHEAD(2) certificateVerification = CertificateVerification() { fileDestination.setCertificateVerification(certificateVerification); } ]
+
+  {
+    return fileDestination;
+  }
+}
+
+FileSource FileSource() #FileSource: {
+    FileSource fileSource = new FileSource();
+    FileType fileType;
+    List<ConnectionFileDefinition> connectionFileDefinitions;
+    List<StringValue> files;
+    List<CSVColumn> csvColumns;
+    List<FBVColumn> fbvColumns;
+    List<FileOption> fileOptions;
+    CertificateVerification certificateVerification;
+} {
+  (
+      fileType = FileType() { fileSource.setSourceType(fileType); }
+      connectionFileDefinitions = ConnectionFileDefinitionList() { fileSource.setConnectionFileDefinitions(connectionFileDefinitions); }
+    | <K_LOCAL> { fileSource.setLocal(true); }
+      [<K_SECURE> { fileSource.setSecure(true); }]
+
+      fileType = FileType() { fileSource.setSourceType(fileType); }
+      files = FileList()
+      {
+            connectionFileDefinitions = new ArrayList<ConnectionFileDefinition>();
+            connectionFileDefinitions.add(new ConnectionFileDefinition(files));
+      }
+  )
+  { fileSource.setConnectionFileDefinitions(connectionFileDefinitions); }
+
+  [
+    LOOKAHEAD(2)
+    "("
+        (
+            csvColumns = CSVSourceColumnList() { fileSource.setCSVColumns(csvColumns); }
+          | fbvColumns = FBVSourceColumnList() { fileSource.setFBVColumns(fbvColumns); }
+        )
+    ")"
+  ]
+
+  [ LOOKAHEAD(2) fileOptions = FileSourceOptionList() { fileSource.setFileOptions(fileOptions); } ]
+
+  [ LOOKAHEAD(2) certificateVerification = CertificateVerification() { fileSource.setCertificateVerification(certificateVerification); } ]
+
+  {
+    return fileSource;
+  }
+}
+
+CertificateVerification CertificateVerification(): {
+    CertificateVerification certificateVerification = new CertificateVerification();
+    Token token;
+} {
+    (
+          (
+                <K_IGNORE> { certificateVerification.setIgnoreCertificate(true); }
+              | <K_VERIFY> { certificateVerification.setVerifyCertificate(true); }
+          )
+          <K_CERTIFICATE>
+          [
+            LOOKAHEAD(2)
+            <K_PUBLIC> <K_KEY>
+            token = <S_CHAR_LITERAL> { certificateVerification.setPublicKey(new StringValue(token.image)); }
+          ]
+        | <K_PUBLIC> <K_KEY>
+          token = <S_CHAR_LITERAL> { certificateVerification.setPublicKey(new StringValue(token.image)); }
+    )
+    {
+        return certificateVerification;
+    }
+}
+
+ScriptSourceDestination ScriptSourceDestination(): {
+  ScriptSourceDestination scriptSourceDestination = new ScriptSourceDestination();
+  ConnectionDefinition connectionDefinition;
+  Table script;
+  String property;
+  StringValue value;
+
+  Token token;
+} {
+    <K_SCRIPT>
+    script = Table() { scriptSourceDestination.setScript(script); }
+
+    [ LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() { scriptSourceDestination.setConnectionDefinition(connectionDefinition); } ]
+
+    [
+        LOOKAHEAD(2)
+        {
+            List<String> properties = new ArrayList<String>();
+            List<StringValue> values = new ArrayList<StringValue>();
+            scriptSourceDestination.setProperties(properties);
+            scriptSourceDestination.setValues(values);
+        }
+
+        <K_WITH>
+        (
+            LOOKAHEAD(2)
+            property = RelObjectNameWithoutValue() "=" token = <S_CHAR_LITERAL> { value = new StringValue(token.image); }
+            {
+                properties.add(property);
+                values.add(value);
+            }
+        )+
+    ]
+
+    {
+      return scriptSourceDestination;
+    }
+}
+
+UserIdentification UserIdentification(): {
+    UserIdentification userIdentification = new UserIdentification();
+    Token token;
+} {
+    <K_USER>
+    token=<S_CHAR_LITERAL> { userIdentification.setUser(new StringValue(token.image)); }
+    <K_IDENTIFIED> <K_BY>
+    token=<S_CHAR_LITERAL> { userIdentification.setPassword(new StringValue(token.image)); }
+
+    {
+        return userIdentification;
+    }
+}
+
+ConnectionDefinition ConnectionDefinition(): {
+  ConnectionDefinition connectionDefinition = new ConnectionDefinition();
+  String connectionObjectName;
+  UserIdentification userIdentification;
+  CertificateVerification certificateVerification;
+
+  Token token;
+} {
+  <K_AT>
+  (
+      connectionObjectName = RelObjectNameWithoutValue() { connectionDefinition.setConnectionObjectName(connectionObjectName); }
+    | token=<S_CHAR_LITERAL> { connectionDefinition.setConnectionDefinition(new StringValue(token.image)); }
+  )
+
+  [ LOOKAHEAD(2) userIdentification = UserIdentification() { connectionDefinition.setUserIdentification(userIdentification); } ]
+
+  [ LOOKAHEAD(2) certificateVerification = CertificateVerification() { connectionDefinition.setCertificateVerification(certificateVerification); } ]
+
+  {
+      return connectionDefinition;
+  }
+}
+
+ConnectionDefinition CloudConnectionDefinition(): {
+  CloudConnectionDefinition connectionDefinition = new CloudConnectionDefinition();
+  String connectionObjectName;
+  UserIdentification userIdentification;
+
+  Token token;
+  Token token2;
+} {
+  <K_AT> <K_CLOUD>
+  (
+      token = <K_NONE> { connectionDefinition.setStorage(token.image); }
+    | token = <K_AZURE> token2 = <K_BLOBSTORAGE> { connectionDefinition.setStorage(token.image + " " + token2.image); }
+  )
+
+  (
+      connectionObjectName = RelObjectNameWithoutValue() { connectionDefinition.setConnectionObjectName(connectionObjectName); }
+    | token = <S_CHAR_LITERAL> { connectionDefinition.setConnectionDefinition(new StringValue(token.image)); }
+  )
+
+  [ userIdentification = UserIdentification() { connectionDefinition.setUserIdentification(userIdentification); } ]
+
+  {
+      return connectionDefinition;
+  }
+}
+
+ConnectionDefinition ConnectionOrCloudConnectionDefinition(): {
+    ConnectionDefinition connectionDefinition;
+} {
+    (
+        LOOKAHEAD(2) connectionDefinition = CloudConnectionDefinition()
+      | connectionDefinition = ConnectionDefinition()
+    )
+    {
+        return connectionDefinition;
+    }
+}
+
+ErrorClause ErrorClause(): {
+  ErrorClause errorClause = new ErrorClause();
+  ErrorDestination errorDestination;
+  Expression expression;
+  RejectClause rejectClause;
+
+  Token token;
+} {
+    (
+        <K_ERRORS> <K_INTO>
+        errorDestination = ErrorDestination() { errorClause.setErrorDestination(errorDestination); }
+        [
+          LOOKAHEAD(2)
+          "("
+          expression = Expression() { errorClause.setExpression(expression); }
+          ")"
+        ]
+        [
+            LOOKAHEAD(2) 
+            (
+                <K_REPLACE> { errorClause.setReplace(true); }
+              | <K_TRUNCATE> { errorClause.setTruncate(true); }
+            )
+        ]
+        [ LOOKAHEAD(2) rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } ]
+      | rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); }
+  )
+  
+  {
+    return errorClause;
+  }
+}
+
+RejectClause RejectClause(): {
+    RejectClause rejectClause = new RejectClause();
+} {
+    <K_REJECT> <K_LIMIT>
+    (
+          token=<S_LONG> { rejectClause.setLimit(new LongValue(token.image)); }
+        | <K_UNLIMITED>
+    )
+
+    [ LOOKAHEAD(2) <K_ERRORS> { rejectClause.setErrors(true); } ]
+
+    {
+        return rejectClause;
+    }
+}
+
+ErrorDestination ErrorDestination(): {
+    ErrorDestination errorDestination;
+} {
+    (
+          LOOKAHEAD(2) errorDestination = CSVFileDestination()
+        | errorDestination = Table()
+    )
+
+    {
+        return errorDestination;
+    }
+}
+
+CSVFileDestination CSVFileDestination(): {
+    CSVFileDestination csvFileDestination = new CSVFileDestination();
+    ConnectionDefinition connectionDefinition;
+    StringValue file;
+} {
+    (
+          <K_CSV>
+          connectionDefinition = ConnectionOrCloudConnectionDefinition() { csvFileDestination.setConnectionDefinition(connectionDefinition); }
+        | <K_LOCAL> { csvFileDestination.setLocal(true); }
+          [ <K_SECURE> { csvFileDestination.setSecure(true); } ]
+          <K_CSV>
+    )
+
+    file = File() { csvFileDestination.setFile(file); }
+
+    {
+        return csvFileDestination;
+    }
+}
+
+DeclareStatement Declare(): {
+    UserVariable userVariable;
+    ColDataType colDataType;
+    Expression defaultExpr = null;
+    DeclareStatement stmt = new DeclareStatement();
+    String typeName;
+    String columnName;
+    ColumnDefinition colDef;
+} {
+    <K_DECLARE> userVariable = UserVariable()
+    (
+         LOOKAHEAD(2) (
+            <K_TABLE> "(" colDef = ColumnDefinition()
+            {
+            stmt.withUserVariable(userVariable)
+            .withDeclareType(DeclareType.TABLE)
+            .addColumnDefinition(colDef);
+            }
+            ("," colDef = ColumnDefinition() { stmt.addColumnDefinition(colDef); })*  ")"
+        )
+        |
+            <K_AS> typeName = RelObjectName()
+                {
+                    stmt.withUserVariable(userVariable)
+                      .withDeclareType(DeclareType.AS)
+                      .withTypeName(typeName);
+                }
+        |
+            (colDataType = ColDataType() ["=" defaultExpr = Expression()]
+                {
+                  stmt.withDeclareType(DeclareType.TYPE)
+                  .addType(userVariable, colDataType, defaultExpr);
+                }
+                ("," userVariable = UserVariable() colDataType = ColDataType() { defaultExpr = null; }
+                ["=" defaultExpr = Expression()] { stmt.addType(userVariable, colDataType, defaultExpr); } )*
+            )
+    )
+    {
+       return stmt;
+    }
+}
+
+SessionStatement SessionStatement():
+{
+    Token actionToken;
+    Token idToken = null;
+}
+{
+    <K_SESSION>
+    (
+        actionToken = <K_START>
+        |
+        actionToken = <K_APPLY>
+        |
+        actionToken = <K_DROP>
+        |
+        actionToken = <K_SHOW>
+        |
+        actionToken = <K_DESCRIBE>
+    )
+
+    [
+        (
+            idToken = <S_IDENTIFIER>
+            |
+            idToken = <S_QUOTED_IDENTIFIER>
+            |
+            idToken = <S_CHAR_LITERAL>
+            |
+            idToken = <S_LONG>
+        )
+    ]
+
+    {
+        SessionStatement sessionsStatement = idToken!=null
+            ? new SessionStatement(actionToken.image, idToken.image)
+            : new SessionStatement(actionToken.image);
+
+        //linkAST(sessionsStatement,jjtThis);
+        return sessionsStatement;
+    }
+}
+
+SetStatement Set(): {
+    String namePart;
+    Object name;
+    ExpressionList expList;
+    boolean useEqual = false;
+    SetStatement set;
+    Expression exp = null;
+    Token tk = null;
+    String effectParameter = null;
+}
+{
+    <K_SET>
+    [LOOKAHEAD(3) (tk = <K_LOCAL> | tk = <K_SESSION>) {effectParameter = tk.image; } ]
+    (
+        LOOKAHEAD(2)
+        <K_DATETIMELITERAL> <K_ZONE> { name = "Time Zone"; useEqual=false; }
+        |
+        (
+            name = UserVariable() ["=" { useEqual=true; } ]
+        )
+        |
+        (
+            name = IdentifierChain()
+            ["=" { useEqual=true; } ]
+        )
+    )
+    exp=Expression()
+    {
+        expList = new ExpressionList();
+        expList.add(exp);
+        set = new SetStatement(name, expList)
+            .withUseEqual(useEqual)
+            .withEffectParameter(effectParameter);
+    }
+
+    (
+        { useEqual=false; }
+        ","
+        (LOOKAHEAD(3)
+            (
+                ( LOOKAHEAD(2)
+                    <K_DATETIMELITERAL> <K_ZONE> { name = "Time Zone"; useEqual=false; }
+                    |
+                    (name = RelObjectNameExt() ["=" { useEqual=true; } ])
+                )
+                exp=Expression()
+                {
+                    expList = new ExpressionList();
+                    expList.add(exp);
+                    set.add(name, expList, useEqual);
+                }
+            )
+            |
+            exp=Expression() { expList.add(exp); }
+         )
+    )*
+    { return set; }
+}
+
+ResetStatement Reset(): {
+    String name;
+    ResetStatement reset;
+    Token all;
+}
+{
+    <K_RESET> ( LOOKAHEAD(2) <K_DATETIMELITERAL> <K_ZONE> {name = "Time Zone"; } | name = RelObjectName() | all = <K_ALL> {name = all.image; } )
+    { reset = new ResetStatement(name);   return reset; }
+}
+
+RenameTableStatement RenameTableStatement(): {
+    RenameTableStatement renameTableStatement;
+    Table oldName;
+    Table newName;
+    boolean usingTableKeyword=false;
+    boolean usesIfExistsKeyword=false;
+    String waitDirective = "";
+    Token token;
+}
+{
+    <K_RENAME>
+    [ LOOKAHEAD(2) <K_TABLE> { usingTableKeyword = true; } ]
+    [ LOOKAHEAD(2) <K_IF> <K_EXISTS> { usesIfExistsKeyword = true; } ]
+    oldName = Table()
+    [ (
+        <K_WAIT> token=<S_LONG> { waitDirective = "WAIT " + token.image; }
+        |
+        <K_NOWAIT>  { waitDirective = "NOWAIT"; }
+       ) ]
+    <K_TO>
+    newName = Table()
+
+    {
+        renameTableStatement = new RenameTableStatement(oldName, newName, usingTableKeyword, usesIfExistsKeyword, waitDirective);
+    }
+
+    (
+        ","
+        oldName = Table()
+        <K_TO>
+        newName = Table()
+        {
+            renameTableStatement.addTableNames(oldName, newName);
+        }
+    )*
+
+    {
+        return renameTableStatement;
+    }
+}
+
+PurgeStatement PurgeStatement(): {
+    PurgeStatement purgeStatement = null;
+    Table table;
+    Index index;
+    Token tableSpaceToken;
+    Token userToken = null;
+}
+{
+    <K_PURGE>
+    (
+        <K_TABLE> table=Table() { purgeStatement = new PurgeStatement(table); }
+        |
+        <K_INDEX> index=Index() { purgeStatement = new PurgeStatement(index); }
+        |
+        <K_RECYCLEBIN> { purgeStatement = new PurgeStatement(PurgeObjectType.RECYCLEBIN); }
+        |
+        <K_DBA_RECYCLEBIN> { purgeStatement = new PurgeStatement(PurgeObjectType.DBA_RECYCLEBIN); }
+        |
+        <K_TABLESPACE> tableSpaceToken=<S_IDENTIFIER> [ <K_USER> userToken=<S_IDENTIFIER> ] {
+            purgeStatement = new PurgeStatement(
+                PurgeObjectType.TABLESPACE
+                , tableSpaceToken.image
+                , userToken!=null ? userToken.image : null);
+            }
+    )
+
+    {
+        return purgeStatement;
+    }
+}
+
+DescribeStatement Describe(): {
     Table table;
     DescribeStatement stmt = new DescribeStatement();
     Token tk = null;
@@ -2028,7 +3100,14 @@ ObjectNames RelObjectNames() : {
 } {
     token = RelObjectNameExt() { data.add(token); }
     (
-        LOOKAHEAD (2) ( delimiter = "." | delimiter = ":" ) { delimiters.add(delimiter.image); } (( delimiter =  "." | delimiter = ":" ) { data.add(null); delimiters.add(delimiter.image); })*
+        LOOKAHEAD (2) (
+            ( delimiter = "..."  { delimiters.add("."); data.add(null); delimiters.add("."); data.add(null); delimiters.add("."); } )
+            |
+            ( delimiter = ".."  { delimiters.add("."); data.add(null); delimiters.add("."); } )
+            |
+            ( ( delimiter = "." | delimiter = ":" ) { delimiters.add(delimiter.image); } )
+        )
+
         token = RelObjectNameExt2() { data.add(token); }
     ) *
 
@@ -2044,7 +3123,14 @@ ObjectNames ColumnIdentifier() : {
 } {
     token = RelObjectNameExt() { data.add(token); }
     (
-        LOOKAHEAD (2) ( delimiter = "." ) { delimiters.add(delimiter.image); } (( delimiter =  "." ) { data.add(null); delimiters.add(delimiter.image); })*
+        LOOKAHEAD (2) (
+            ( delimiter = "..."  { delimiters.add("."); data.add(null); delimiters.add("."); data.add(null); delimiters.add("."); } )
+            |
+            ( delimiter = ".."  { delimiters.add("."); data.add(null); delimiters.add("."); } )
+            |
+            ( delimiter = "."  { delimiters.add(delimiter.image); } )
+        )
+
         token = RelObjectNameExt2() { data.add(token); }
     ) *
 
@@ -2088,7 +3174,7 @@ String RelObjectNameWithoutValue() :
 {    Token tk = null; }
 {
     ( tk=<DATA_TYPE> | tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> |  tk=<K_DATE_LITERAL> | tk=<K_DATETIMELITERAL> | tk=<K_STRING_FUNCTION_NAME> | tk=<K_ISOLATION> | tk=<K_TIME_KEY_EXPR> | tk=<K_TEXT_LITERAL> 
-       | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="AUTO_INCREMENT" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="COSTS" | tk="COUNT" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="ENCRYPTION" | tk="END" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="INVERSE" | tk="ISNULL" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW" | tk="LOW_PRIORITY" | tk="MATCH" | tk="MATCHED" | tk="MATCH_ALL" | tk="MATCH_ANY" | tk="MATCH_PHRASE" | tk="MATCH_PHRASE_PREFIX" | tk="MATCH_REGEXP" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="OVERRIDING" | tk="OVERWRITE" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PLUS" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REMOTE" | tk="RENAME" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
+       | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="AGGREGATE" | tk="ALGORITHM" | tk="ALIGN" | tk="ALTER" | tk="ALWAYS" | tk="ANALYZE" | tk="APPEND_ONLY" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="ASYMMETRIC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="AUTO_INCREMENT" | tk="AZURE" | tk="BASE64" | tk="BEFORE" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOBSTORAGE" | tk="BLOCK" | tk="BOOLEAN" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CERTIFICATE" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="CLOUD" | tk="COALESCE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMENTS" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="CORRESPONDING" | tk="COSTS" | tk="COUNT" | tk="CREATED" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFAULTS" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DELIMIT" | tk="DELIMITER" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCARD" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DRIVER" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="ENCODING" | tk="ENCRYPTION" | tk="END" | tk="ENFORCED" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXA" | tk="EXCHANGE" | tk="EXCLUDE" | tk="EXCLUDING" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXPORT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="IDENTIFIED" | tk="IDENTITY" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCLUDING" | tk="INCREMENT" | tk="INDEX" | tk="INFORMATION" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="INVERSE" | tk="INVISIBLE" | tk="ISNULL" | tk="JDBC" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="KEY_BLOCK_SIZE" | tk="KILL" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW" | tk="LOW_PRIORITY" | tk="LTRIM" | tk="MATCH" | tk="MATCHED" | tk="MATCH_ALL" | tk="MATCH_ANY" | tk="MATCH_PHRASE" | tk="MATCH_PHRASE_PREFIX" | tk="MATCH_REGEXP" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NAME" | tk="NAMES" | tk="NEVER" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NONE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="ORA" | tk="ORDINALITY" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="OVERRIDING" | tk="OVERWRITE" | tk="PADDING" | tk="PARALLEL" | tk="PARENT" | tk="PARSER" | tk="PARTITION" | tk="PARTITIONING" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PLUS" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="REBUILD" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REJECT" | tk="REMOTE" | tk="REMOVE" | tk="RENAME" | tk="REORGANIZE" | tk="REPAIR" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="RTRIM" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="SPATIAL" | tk="STORED" | tk="STREAM" | tk="STRICT" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYMMETRIC" | tk="SYNONYM" | tk="SYSTEM" | tk="SYSTEM_TIME" | tk="SYSTEM_TIMESTAMP" | tk="SYSTEM_VERSION" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLIMITED" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VALIDATION" | tk="VERBOSE" | tk="VERSION" | tk="VIEW" | tk="VISIBLE" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
     { return tk.image; }
 }
 
@@ -2161,17 +3247,20 @@ Table Table() #TableName :
     ObjectNames data = null;
     Token fileNameToken = null;
     Table table;
+    String timeTravelStr = null;
 }
 {
     (
-        data = RelObjectNames()
+        data = RelObjectNames() [ LOOKAHEAD(2) timeTravelStr = TimeTravelBeforeAlias() ]
         {
             table = new Table(data.getNames());
+            table.setTimeTravel(timeTravelStr);
         }
         |
         fileNameToken = <S_CHAR_LITERAL>
         {
-            table = new Table(fileNameToken.image);
+            // don't split name parts
+            table = new Table(fileNameToken.image, false);
         }
     )
 
@@ -2229,6 +3318,7 @@ SampleClause SampleClause():
     String keyword;
     String method=null;
     Number percentageArgument;
+    String percentageUnit = null;
     Number repeatArgument=null;
     Number seedArgument=null;
 }
@@ -2245,16 +3335,30 @@ SampleClause SampleClause():
             token = <K_TABLESAMPLE> { keyword = token.image; }
             ( token = <K_SYSTEM> | token = <K_BERNOULLI> ) { method = token.image; }
         )
+        |
+        (
+            // Duck DB
+            <K_USING> <K_SAMPLE> { keyword = "USING SAMPLE"; }
+            ( token = <K_SYSTEM> | token = <K_BERNOULLI> ) { method = token.image; }
+        )
     )
 
-    "(" percentageArgument = Number() ")"
+    "(" percentageArgument = Number()
+    [
+        "%" { percentageUnit="%"; }
+        |
+        <K_PERCENT> { percentageUnit="PERCENT"; }
+        |
+        <K_ROWS> { percentageUnit="ROWS"; }
+    ]
+    ")"
 
     [ LOOKAHEAD(2) <K_REPEATABLE> "(" repeatArgument = Number() ")" ]
 
     [ LOOKAHEAD(2) <K_SEED> "(" seedArgument = Number() ")" ]
 
     {
-        return new SampleClause(keyword, method, percentageArgument, repeatArgument, seedArgument);
+        return new SampleClause(keyword, method, percentageArgument, percentageUnit, repeatArgument, seedArgument);
     }
 }
 
@@ -2277,17 +3381,21 @@ Select Select() #Select:
     Offset offset = null;
     Fetch fetch = null;
     WithIsolation withIsolation = null;
+    Alias alias = null;
 }
 {
+
+    [ with=WithList() ]
     (
+        LOOKAHEAD(3) select = FromQuery()
+        |
         (
-            [ with=WithList() ]
             (
                 LOOKAHEAD(3) select = PlainSelect()
                 |
                 LOOKAHEAD(3) select = Values()
                 |
-                LOOKAHEAD(3) select = ParenthesedSelect()
+                LOOKAHEAD(3) select = ParenthesedSelect() [ LOOKAHEAD(2) alias = Alias() {select.setAlias(alias);} ]
             )
             [ LOOKAHEAD(2) select = FromQueryFromSelect(select) ]
             [ LOOKAHEAD(2) select = SetOperationList(select) ]
@@ -2299,8 +3407,6 @@ Select Select() #Select:
             [ LOOKAHEAD(<K_FETCH>) fetch = Fetch() { select.setFetch(fetch);} ]
             [ LOOKAHEAD(<K_WITH> <K_ISOLATION>) withIsolation = WithIsolation() { select.setIsolation(withIsolation);} ]
         )
-        |
-        select = FromQuery()
     )
     {
         linkAST(select, jjtThis);
@@ -2312,10 +3418,14 @@ FromQuery FromQuery() #FromQuery:
 {
     FromQuery fromQuery;
     FromItem fromItem;
+    List<LateralView> lateralViews = null;
+    List<Join> joins = null;
     PipeOperator pipeOperator;
 }
 {
     <K_FROM> fromItem = FromItem() { fromQuery = new FromQuery(fromItem); }
+    [ LOOKAHEAD(2) lateralViews=LateralViews() { fromQuery.setLateralViews(lateralViews); } ]
+    [ LOOKAHEAD(2) joins=JoinsList() { fromQuery.setJoins(joins); } ]
     (
         LOOKAHEAD(2) "|>" pipeOperator = PipeOperator() { fromQuery.add(pipeOperator); }
     )*
@@ -2353,15 +3463,12 @@ PipeOperator PipeOperator() #PipeOperator:
 }
 {
     (
+        // SELECT covers also EXTEND, WINDOW and RENAME
         operator = SelectPipeOperator()
-//        |
-//        operator = ExtendPipeOperator()
         |
         operator = SetPipeOperator()
         |
         operator = DropPipeOperator()
-//        |
-//        operator = RenamePipeOperator()
         |
         LOOKAHEAD(2) operator = AsPipeOperator()
         |
@@ -2372,14 +3479,19 @@ PipeOperator PipeOperator() #PipeOperator:
         LOOKAHEAD(2) operator = AggregatePipeOperator()
         |
         operator = OrderByPipeOperator()
-//        |
-//        operator = UnionPipeOperator();
-//        |
-//        operator = IntersectPipeOperator();
-//        |
-//        operator = ExceptPipeOperator();
+        |
+        // covers UNION, INTERSET, EXCEPT
+        operator = SetOperationPipeOperator()
         |
         operator = JoinPipeOperator()
+        |
+        operator = CallPipeOperator()
+        |
+        operator = TableSamplePipeOperator()
+        |
+        operator = PivotPipeOperator()
+        |
+        operator = UnPivotPipeOperator()
     )
     {
         return operator;
@@ -2389,12 +3501,13 @@ PipeOperator PipeOperator() #PipeOperator:
 SelectPipeOperator SelectPipeOperator():
 {
     Token operatorKeyToken;
+    Token modifierToken = null;
     SelectPipeOperator selectPipeOperator;
     SelectItem<?> selectItem;
 }
 {
     (
-        operatorKeyToken = <K_SELECT>
+        ( operatorKeyToken = <K_SELECT> [ LOOKAHEAD(2) ( modifierToken=<K_DISTINCT> | modifierToken=<K_ALL> ) ] )
         |
         operatorKeyToken = <K_EXTEND>
         |
@@ -2403,7 +3516,7 @@ SelectPipeOperator SelectPipeOperator():
         operatorKeyToken = <K_RENAME>
     )
     selectItem = SelectItem()
-    { selectPipeOperator = new SelectPipeOperator(operatorKeyToken.image, selectItem); }
+    { selectPipeOperator = new SelectPipeOperator(operatorKeyToken.image, selectItem, modifierToken !=null ? modifierToken.image : null); }
 
     ( LOOKAHEAD(2) "," selectItem = SelectItem() { selectPipeOperator.add(selectItem); } )*
 
@@ -2425,25 +3538,43 @@ WherePipeOperator WherePipeOperator():
     }
 }
 
+String OrderSuffix():
+{
+    Token token =null;
+    String orderSuffix = null;
+}
+{
+    ( token = <K_ASC> | token = <K_DESC> ) { orderSuffix = token.image; }
+    [ LOOKAHEAD(2) <K_NULLS> ( token = <K_FIRST> | token = <K_LAST> ) { orderSuffix += " NULLS " + token.image; } ]
+
+    {
+        return orderSuffix;
+    }
+}
+
 AggregatePipeOperator AggregatePipeOperator():
 {
     AggregatePipeOperator aggregatePipeOperator;
     SelectItem<?> selectItem;
+    Token token =null;
+    String orderSuffix = null;
 }
 {
     <K_AGGREGATE>
-    selectItem = SelectItem() { aggregatePipeOperator = new AggregatePipeOperator(selectItem); }
-    ( LOOKAHEAD(2) "," selectItem = SelectItem() { aggregatePipeOperator.add(selectItem); } )*
+    selectItem = SelectItem() [ LOOKAHEAD(2) orderSuffix = OrderSuffix() ]
+    { aggregatePipeOperator = new AggregatePipeOperator(selectItem, orderSuffix); orderSuffix=null; }
+
+    ( LOOKAHEAD(2) "," selectItem = SelectItem() [ LOOKAHEAD(2) orderSuffix = OrderSuffix() ]
+    { aggregatePipeOperator.add(selectItem, orderSuffix); orderSuffix=null; } )*
 
     [
         LOOKAHEAD(2) <K_GROUP> [ <K_AND> <K_ORDER> { aggregatePipeOperator.setShorthandOrdering(true); } ] <K_BY>
-        selectItem = SelectItem()
-        { aggregatePipeOperator.addGroupItem(selectItem); }
+        selectItem = SelectItem() [ LOOKAHEAD(2) orderSuffix = OrderSuffix() ]
+        { aggregatePipeOperator.addGroupItem(selectItem, orderSuffix); orderSuffix=null; }
 
         (
-            LOOKAHEAD(2) ","
-            selectItem = SelectItem()
-            { aggregatePipeOperator.addGroupItem(selectItem); }
+            LOOKAHEAD(2) "," selectItem = SelectItem() [ LOOKAHEAD(2) orderSuffix = OrderSuffix() ]
+            { aggregatePipeOperator.addGroupItem(selectItem, orderSuffix); orderSuffix=null; }
         )*
     ]
 
@@ -2531,6 +3662,115 @@ LimitPipeOperator LimitPipeOperator():
     }
 }
 
+String SetOperationModifier():
+{
+    Token token = null;
+    String modifier = null;
+}
+{
+    ( token=<K_ALL> | token=<K_DISTINCT> ) { modifier = token.image; }
+    [ (<K_BY> <K_NAME> { modifier+= " BY NAME"; } ) | (<K_STRICT> <K_CORRESPONDING> { modifier+= " STRICT CORRESPONDING"; }) ]
+
+    {
+        return modifier;
+    }
+}
+
+SetOperationPipeOperator SetOperationPipeOperator():
+{
+    SetOperationPipeOperator setOperationPipeOperator = null;
+    SetOperationType setOperationType;
+    String modifier = null;
+    ParenthesedSelect select;
+}
+{
+    (
+        (
+            <K_UNION>  [ modifier=SetOperationModifier() ] { setOperationType = SetOperationType.UNION; }
+            select = ParenthesedSelect() { setOperationPipeOperator = new SetOperationPipeOperator(select, setOperationType,  modifier); }
+        )
+        |
+        (
+            <K_INTERSECT> [ modifier=SetOperationModifier() ]  { setOperationType = SetOperationType.INTERSECT; }
+            select = ParenthesedSelect() { setOperationPipeOperator = new SetOperationPipeOperator(select, setOperationType,  modifier); }
+        )
+        |
+        (
+            <K_EXCEPT> [ modifier=SetOperationModifier() ]  { setOperationType = SetOperationType.EXCEPT; }
+            select = ParenthesedSelect() { setOperationPipeOperator = new SetOperationPipeOperator(select, setOperationType,  modifier); }
+        )
+    )
+
+    (
+        LOOKAHEAD(2) "," select = ParenthesedSelect() { setOperationPipeOperator.add(select); }
+    )*
+
+    {
+        return setOperationPipeOperator;
+    }
+}
+
+CallPipeOperator CallPipeOperator():
+{
+    TableFunction tableFunction;
+    Alias alias=null;
+}
+{
+    <K_CALL> tableFunction = TableFunction() [ LOOKAHEAD(2) alias = Alias() ]
+
+    {
+        return new CallPipeOperator(tableFunction, alias);
+    }
+}
+
+
+TableSamplePipeOperator TableSamplePipeOperator():
+{
+    Token token;
+}
+{
+    <K_TABLESAMPLE> <K_SYSTEM> "(" ( token=<S_DOUBLE> | token=<S_LONG> ) <K_PERCENT> ")"
+    {
+        return new TableSamplePipeOperator( token.image );
+    }
+}
+
+PivotPipeOperator PivotPipeOperator():
+{
+    Function aggregateExpression;
+    Column inputColumn;
+    List<SelectItem<?>> pivotColumns;
+    Alias alias = null;
+}
+{
+    <K_PIVOT> "(" aggregateExpression=Function()
+    <K_FOR> inputColumn=Column()
+    <K_IN> "(" pivotColumns = SelectItemsList() ")"
+    ")"
+    [ LOOKAHEAD(2)  alias = Alias() ]
+    {
+        return new PivotPipeOperator(aggregateExpression, inputColumn, pivotColumns, alias);
+    }
+}
+
+UnPivotPipeOperator UnPivotPipeOperator():
+{
+    Column valuesColumn;
+    Column nameColumn;
+    List<SelectItem<?>> pivotColumns;
+    Alias alias = null;
+}
+{
+    <K_UNPIVOT> "(" valuesColumn=Column()
+    <K_FOR> nameColumn=Column()
+    <K_IN> "(" pivotColumns = SelectItemsList() ")"
+    ")"
+    [ LOOKAHEAD(2) alias = Alias() ]
+    {
+        return new UnPivotPipeOperator(valuesColumn, nameColumn, pivotColumns, alias);
+    }
+}
+
 TableStatement TableStatement():
 {
     Table table = null;
@@ -2543,7 +3783,7 @@ TableStatement TableStatement():
     table = Table()
     { tableStatement.setTable(table); }
     [ LOOKAHEAD(<K_ORDER> <K_BY>) orderByElements = OrderByElements() { tableStatement.setOrderByElements(orderByElements); } ]
-    [ LOOKAHEAD(<K_LIMIT>) limit=LimitWithOffset() { tableStatement.setLimit(limit);} ]
+    [ LOOKAHEAD(<K_LIMIT>) limit = LimitWithOffset() { tableStatement.setLimit(limit);} ]
     [ LOOKAHEAD(<K_OFFSET>) offset = Offset() { tableStatement.setOffset(offset);} ]
     { return tableStatement; }
     /* Support operationList */
@@ -2780,6 +4020,7 @@ PlainSelect PlainSelect() #PlainSelect:
     String windowName = null;
     WindowDefinition winDef;
     Table intoTempTable = null;
+    Distinct distinct;
 }
 {
     <K_SELECT>
@@ -2802,11 +4043,13 @@ PlainSelect PlainSelect() #PlainSelect:
         <K_ALL>
         |
         (
-            <K_DISTINCT> { Distinct distinct = new Distinct(); plainSelect.setDistinct(distinct); }
+            <K_DISTINCT> { distinct = new Distinct(); plainSelect.setDistinct(distinct); }
             [ LOOKAHEAD(2) "ON" "(" distinctOn=SelectItemsList() { plainSelect.getDistinct().setOnSelectItems(distinctOn); } ")" ]
         )
         |
-        <K_UNIQUE> { Distinct distinct = new Distinct(true); plainSelect.setDistinct(distinct); }
+        <K_DISTINCTROW> { distinct = new Distinct(); distinct.setUseDistinctRow(true); plainSelect.setDistinct(distinct); }
+        |
+        <K_UNIQUE> { distinct = new Distinct(true); plainSelect.setDistinct(distinct); }
         |
         <K_SQL_CALC_FOUND_ROWS> { plainSelect.setMySqlSqlCalcFoundRows(true); }
         |
@@ -2848,8 +4091,9 @@ PlainSelect PlainSelect() #PlainSelect:
     [ LOOKAHEAD(2) preferringClause=PreferringClause() { plainSelect.setPreferringClause(preferringClause); }
         [LOOKAHEAD(2) <K_PARTITION> <K_BY>
             (
-                (LOOKAHEAD(ComplexExpressionList()) expressionList=ComplexExpressionList()
-                | "(" {partitionByBrackets = true;} expressionList=ComplexExpressionList() ")" )
+                LOOKAHEAD(2) expressionList=ComplexExpressionList()
+                |
+                "(" {partitionByBrackets = true;} expressionList=ComplexExpressionList() ")"
             )
             {
                 preferringClause.setPartitionExpressionList(expressionList, partitionByBrackets);
@@ -2870,7 +4114,7 @@ PlainSelect PlainSelect() #PlainSelect:
     ]
     [ LOOKAHEAD(<K_ORDER> <K_BY>) orderByElements = OrderByElements() { plainSelect.setOrderByElements(orderByElements); } ]
     [ LOOKAHEAD(2) <K_EMIT> <K_CHANGES> { plainSelect.setEmitChanges(true); } ]
-    [ LOOKAHEAD(LimitBy()) limit = LimitBy() { plainSelect.setLimitBy(limit);  } ]
+    [ LOOKAHEAD(7) limit = LimitBy() { plainSelect.setLimitBy(limit);  } ]
     [ LOOKAHEAD(<K_LIMIT>) limit = LimitWithOffset() { plainSelect.setLimit(limit);    } ]
     [ LOOKAHEAD(<K_OFFSET>) offset = Offset() { plainSelect.setOffset(offset);    } ]
 	[ LOOKAHEAD(<K_LIMIT>, { limit==null }) limit = LimitWithOffset() { plainSelect.setLimit(limit);    } ]
@@ -2925,14 +4169,25 @@ Select SetOperationList(Select select) #SetOperationList: {
     ( LOOKAHEAD(2) (
             (
                 <K_UNION> { UnionOp union = new UnionOp(); linkAST(union,jjtThis); operations.add(union); }
-                [ <K_ALL> { union.setAll(true); } | <K_DISTINCT> { union.setDistinct(true); } ]
+                [ <K_ALL> { union.setAll(true); } | <K_DISTINCT> { union.setDistinct(true); } [ (<K_BY> <K_NAME>) | (<K_STRICT> <K_CORRESPONDING>) ] ]
+
             )
             |
-            <K_INTERSECT> { operations.add(new IntersectOp()); }
+            (
+                <K_INTERSECT> { IntersectOp intersect = new IntersectOp(); linkAST(intersect,jjtThis); operations.add(intersect); }
+                [ <K_ALL> { intersect.setAll(true); } | <K_DISTINCT> { intersect.setDistinct(true); } [ (<K_BY> <K_NAME>) | (<K_STRICT> <K_CORRESPONDING>) ] ]
+            )
             |
-            <K_MINUS> { operations.add(new MinusOp()); }
+            ( 
+                <K_MINUS> { MinusOp minus = new MinusOp(); linkAST(minus,jjtThis); operations.add(minus); }
+                [ <K_ALL> { minus.setAll(true); } | <K_DISTINCT> { minus.setDistinct(true); } [ (<K_BY> <K_NAME>) | (<K_STRICT> <K_CORRESPONDING>) ] ]
+            )
             |
-            <K_EXCEPT> { operations.add(new ExceptOp()); }
+            (
+                <K_EXCEPT> { ExceptOp except = new ExceptOp(); linkAST(except,jjtThis); operations.add(except); }
+                [ <K_ALL> { except.setAll(true); } | <K_DISTINCT> { except.setDistinct(true); } [ (<K_BY> <K_NAME>) | (<K_STRICT> <K_CORRESPONDING>) ] ]
+            )
+           
         )
 
         (
@@ -2985,7 +4240,8 @@ List<WithItem<?>> WithList():
     WithItem with = null;
 }
 {
-    <K_WITH> with=WithItem() { withItemsList.add(with); } ("," with=WithItem() { withItemsList.add(with); } )*
+    <K_WITH> with=WithItem() { withItemsList.add(with); }
+    ( "," with=WithItem() { withItemsList.add(with); } )*
 
      { return withItemsList; }
 }
@@ -2994,6 +4250,7 @@ WithItem<?> WithItem() #WithItem:
 {
     boolean recursive = false;
     boolean materialized = false;
+    boolean usingNot = false;
     String name;
     List<SelectItem<?>> selectItems = null;
     ParenthesedStatement statement;
@@ -3003,7 +4260,7 @@ WithItem<?> WithItem() #WithItem:
      name=RelObjectName()
      [ "(" selectItems=SelectItemsList() ")" ]
      <K_AS>
-     [ LOOKAHEAD(2) <K_MATERIALIZED>  { materialized = true; } ]
+     [ LOOKAHEAD(2) [ <K_NOT> { usingNot = true; } ] <K_MATERIALIZED>  { materialized = true; } ]
      (
          LOOKAHEAD(2) statement = ParenthesedSelect()
          |
@@ -3016,7 +4273,7 @@ WithItem<?> WithItem() #WithItem:
      {
         WithItem<?> withItem = new WithItem(statement, new Alias(name, false));
         return withItem
-            .withRecursive(recursive, materialized)
+            .withRecursive(recursive, usingNot, materialized)
             .withWithItemList(selectItems);
      }
 }
@@ -3055,6 +4312,16 @@ List<SelectItem<?>> SelectItemsList():
     { return selectItemsList; }
 }
 
+FunctionAllColumns FunctionAllColumns() #FunctionAllColumns:
+{
+    Function function;
+}
+{
+    "(" ( "(" )* function=Function() ")" ( ")" )* "." "*"
+    {
+        return new FunctionAllColumns(function);
+    }
+}
 
 SelectItem<?> SelectItem() #SelectItem:
 {
@@ -3065,12 +4332,8 @@ SelectItem<?> SelectItem() #SelectItem:
     // @fixme: Oracle's SEQUENCE.nextval is parsed as COLUMN with a name part nextval
     // @todo: parse a proper SEQUENCE instead of a COLUMN
     (
-        expression = AllColumns()
-        |
         LOOKAHEAD( 3 ) expression = ConnectByPriorOperator()
         |
-        LOOKAHEAD(AllTableColumns()) expression = AllTableColumns()
-        |
         LOOKAHEAD( 3 ) expression = XorExpression()
         |
         LOOKAHEAD( 3 ) expression = ConcatExpression()
@@ -3088,14 +4351,14 @@ SelectItem<?> SelectItem() #SelectItem:
 AllColumns AllColumns():
 {
     ParenthesedExpressionList<Column> exceptColumns = null;
-    List<SelectItem<Column>> replaceExpressions = null;
+    List<SelectItem<?>> replaceExpressions = null;
     String exceptKeyword=null;
     Token tk;
 }
 {
     "*"
     [ LOOKAHEAD(2) ( tk=<K_EXCEPT> | tk=<K_EXCLUDE> ) exceptColumns = ParenthesedColumnList() { exceptKeyword=tk.image; } ]
-    [ LOOKAHEAD(2) <K_REPLACE> "(" replaceExpressions = ColumnSelectItemsList() ")" ]
+    [ LOOKAHEAD(2) <K_REPLACE> "(" replaceExpressions = SelectItemsList() ")" ]
 
     {
         return new AllColumns(exceptColumns, replaceExpressions, exceptKeyword);
@@ -3395,16 +4658,18 @@ FromItem FromItem() #FromItem:
     MySQLIndexHint indexHint = null;
     SQLServerHints sqlServerHints = null;
     Select select;
+
+    String timeTravelStr = null;
 }
 {
     (
         LOOKAHEAD(3, { !getAsBoolean(Feature.allowUnparenthesizedSubSelects) }) fromItem = Values()
         |
-        LOOKAHEAD( TableFunction() ) fromItem=TableFunction()
+        LOOKAHEAD(16) fromItem=TableFunction()
         |
         LOOKAHEAD(3) fromItem=Table()
         |
-        LOOKAHEAD( ParenthesedFromItem() ) fromItem = ParenthesedFromItem()
+        LOOKAHEAD(ParenthesedFromItem()) fromItem = ParenthesedFromItem()
         |
         LOOKAHEAD(3, { !getAsBoolean(Feature.allowUnparenthesizedSubSelects) }) (
             fromItem=ParenthesedSelect()
@@ -3414,11 +4679,17 @@ FromItem FromItem() #FromItem:
         |
         fromItem=LateralSubSelect()
         |
+        LOOKAHEAD(2, { Dialect.EXASOL.name().equals(getAsString(Feature.dialect)) }) fromItem=SubImport() { fromItem = new ParenthesedFromItem(fromItem); }
+        |
         LOOKAHEAD({ getAsBoolean(Feature.allowUnparenthesizedSubSelects) }) fromItem=Select()
     )
 
     [ LOOKAHEAD(2) alias=Alias() { fromItem.setAlias(alias); } ]
-    [ LOOKAHEAD(2) sampleClause = SampleClause() { ((Table) fromItem).setSampleClause(sampleClause); } ]
+    [
+        LOOKAHEAD(2, {fromItem instanceof Table }) timeTravelStr = TimeTravelAfterAlias()
+        { ((Table) fromItem).setTimeTravelStrAfterAlias(timeTravelStr); }
+    ]
+    [ LOOKAHEAD(2) sampleClause = SampleClause() { fromItem.setSampleClause(sampleClause); } ]
     [ LOOKAHEAD(2) unpivot=UnPivot() { fromItem.setUnPivot(unpivot); } ]
     [ LOOKAHEAD(2) ( LOOKAHEAD(2) pivot=PivotXml() | pivot=Pivot() ) { fromItem.setPivot(pivot); } ]
     [
@@ -3626,20 +4897,20 @@ OracleHierarchicalExpression OracleHierarchicalQueryClause():
 {
     (
         (
-            <K_START> <K_WITH>  expr=AndExpression() {result.setStartExpression(expr);}
-            <K_CONNECT> <K_BY> [ <K_NOCYCLE> { result.setNoCycle(true); } ] expr=AndExpression()
+            <K_START> <K_WITH>  expr=XorExpression() {result.setStartExpression(expr);}
+            <K_CONNECT> <K_BY> [ <K_NOCYCLE> { result.setNoCycle(true); } ] expr=XorExpression()
             {
                 result.setConnectExpression(expr);
             }
         )
         |
         (
-            <K_CONNECT> <K_BY> [ <K_NOCYCLE> { result.setNoCycle(true); } ] expr=AndExpression()
+            <K_CONNECT> <K_BY> [ <K_NOCYCLE> { result.setNoCycle(true); } ] expr=XorExpression()
             {
                 result.setConnectExpression(expr);
                 result.setConnectFirst(true);
             }
-            [ LOOKAHEAD(2) <K_START> <K_WITH>  expr=AndExpression() {result.setStartExpression(expr);} ]
+            [ LOOKAHEAD(2) <K_START> <K_WITH>  expr=XorExpression() {result.setStartExpression(expr);} ]
         )
     )
     {
@@ -3702,17 +4973,18 @@ Expression PriorTo():
 }
 {
     (
-          LOOKAHEAD(PreferenceTermTerminal(), {!interrupted}) left=PreferenceTermTerminal()
-        | "(" left=PreferenceTerm() ")" { left = new ParenthesedExpressionList(left); }
+        LOOKAHEAD(3) left=PreferenceTermTerminal()
+        |
+        "(" left=PreferenceTerm() ")" { left = new ParenthesedExpressionList(left); }
     )
     { result = left; }
 
     (
-        LOOKAHEAD(2)
-        <K_PRIOR> <K_TO>
+        LOOKAHEAD(2) <K_PRIOR> <K_TO>
         (
-              LOOKAHEAD(PreferenceTermTerminal(), {!interrupted}) right=PreferenceTermTerminal()
-            | "(" right=PreferenceTerm() ")" { left = new ParenthesedExpressionList(right); }
+            LOOKAHEAD(3) right=PreferenceTermTerminal()
+            |
+            "(" right=PreferenceTerm() ")" { left = new ParenthesedExpressionList(right); }
         )
         {
             result = new PriorTo(left, right);
@@ -3794,7 +5066,7 @@ GroupByElement GroupByColumnReferences():
     Expression columnReference;
     GroupByElement groupBy = new GroupByElement();
     Expression expr;
-    ExpressionList list;
+    ExpressionList<Expression> list;
     Token token;
 }
 {
@@ -3825,16 +5097,16 @@ GroupByElement GroupByColumnReferences():
     }
 }
 
-ExpressionList GroupingSet():
+ExpressionList<Expression> GroupingSet():
 {
-    ExpressionList list;
+    ExpressionList<Expression> list;
     Expression expression;
 }
 {
     (
         LOOKAHEAD(2) list = ParenthesedExpressionList()
         |
-        expression = SimpleExpression() { list = new ExpressionList(expression); }
+        expression = SimpleExpression() { list = new ExpressionList<Expression>(expression); }
     )
     {
         return list;
@@ -4051,13 +5323,9 @@ WithIsolation WithIsolation():
     JdbcParameter jdbc;
 }
 {
-    (
-            //with (ur | cs | rs | rr)
-             <K_WITH>
-             token=<K_ISOLATION> { withIsolation.setIsolation(token.image); }
-
-        )
-    {
+    <K_WITH>
+    token=<K_ISOLATION>
+    { withIsolation.setIsolation(token.image);
         return withIsolation;
     }
 }
@@ -4119,10 +5387,11 @@ Skip Skip():
 {
     <K_SKIP>
     (
-         token=<S_LONG>                      { skip.setRowCount(Long.parseLong(token.image)); }
-                | token=<S_IDENTIFIER>              { skip.setVariable(token.image); }
-                | jdbc = JdbcParameter() { skip.setJdbcParameter(jdbc); }
-                   /* "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */
+        token=<S_LONG> { skip.setRowCount(Long.parseLong(token.image)); }
+        |
+        token=<S_IDENTIFIER> { skip.setVariable(token.image); }
+        |
+        jdbc = JdbcParameter() { skip.setJdbcParameter(jdbc); }
     )
     {
         return skip;
@@ -4173,12 +5442,14 @@ First First():
 
 Expression Expression() #Expression :
 {
-    Expression retval = null;
+    Expression expression = null;
 }
 {
-    retval=XorExpression()
-
-    { return retval; }
+    expression=XorExpression()
+    {
+        linkAST(expression,jjtThis);
+        return expression;
+    }
 }
 
 Expression XorExpression():
@@ -4228,8 +5499,7 @@ Expression AndExpression() :
 }
 {
     (
-        LOOKAHEAD(Condition(), {!interrupted})
-        left=Condition()
+        LOOKAHEAD(Condition(), {!interrupted}) left=Condition()
         |
         [ <K_NOT> { not=true; } | "!" { not=true; exclamationMarkNot=true; } ]
         "(" left=XorExpression() ")" {left = new ParenthesedExpressionList(left); if (not) { left = new NotExpression(left, exclamationMarkNot); not = false; } }
@@ -4240,8 +5510,7 @@ Expression AndExpression() :
         { boolean useOperator = false; }
          (<K_AND> | <OP_DOUBLEAND> {useOperator=true;} )
         (
-        LOOKAHEAD(Condition(), {!interrupted})
-            right=Condition()
+            LOOKAHEAD(Condition(), {!interrupted}) right=Condition()
             |
             [ <K_NOT> { not=true; } | "!" { not=true; exclamationMarkNot=true; } ]
             "(" right=XorExpression() ")" {right = new ParenthesedExpressionList(right); if (not) { right = new NotExpression(right, exclamationMarkNot); not = false; } }
@@ -4267,8 +5536,9 @@ Expression Condition():
 {
     [ LOOKAHEAD(2) (<K_NOT> { not=true; } | "!" { not=true; exclamationMarkNot=true; })]
     (
-        LOOKAHEAD(RegularCondition()) result=RegularCondition()
-        | result=SQLCondition()
+        LOOKAHEAD(RegularCondition(), {!interrupted}) result=RegularCondition()
+        |
+        result=SQLCondition()
     )
 
     { return not?new NotExpression(result, exclamationMarkNot):result; }
@@ -4313,6 +5583,7 @@ Expression RegularCondition() #RegularCondition:
         | token=<OP_MINORTHANEQUALS> { result = new MinorThanEquals(token.image); }
         | token=<OP_NOTEQUALSSTANDARD> { result = new NotEqualsTo(token.image); }
         | token=<OP_NOTEQUALSBANG> { result = new NotEqualsTo(token.image); }
+        | token=<OP_NOTEQUALSHAT> { result = new NotEqualsTo(token.image); }
         | "*=" { result = new TSQLLeftJoin(); }
         | "=*" { result = new TSQLRightJoin(); }
         | token=<OP_DOUBLEAND> { result = new DoubleAnd(); }
@@ -4334,7 +5605,7 @@ Expression RegularCondition() #RegularCondition:
         | "-#" { result = new JsonOperator("-#"); }
         | "<->" { result = new GeometryDistance("<->"); }
         | "<#>" { result = new GeometryDistance("<#>"); }
-        | "<=>" { result = new CosineSimilarity(); }
+        | <OP_COSINESIMILARITY> { result = new CosineSimilarity(); }
     )
 
     ( LOOKAHEAD(2) <K_PRIOR> rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; }
@@ -4368,47 +5639,46 @@ Expression SQLCondition():
 {
     (
     result=ExistsExpression()
-    | LOOKAHEAD(InExpression() , {!interrupted}) result=InExpression()
-    | LOOKAHEAD(OverlapsCondition(), {!interrupted}) result=OverlapsCondition()
+    | LOOKAHEAD( OverlapsCondition(), {!interrupted}) result=OverlapsCondition()
     | left = SimpleExpression() { result = left; }
         [
             LOOKAHEAD(2) (
-                (
-                LOOKAHEAD(ExcludesExpression()) result=ExcludesExpression(left)
+                LOOKAHEAD(3, {!interrupted}) result=InExpression(left)
+                |
+                LOOKAHEAD(3) result=ExcludesExpression(left)
                 |
-                LOOKAHEAD(IncludesExpression()) result=IncludesExpression(left)
+                LOOKAHEAD(3) result=IncludesExpression(left)
                 |
                 LOOKAHEAD(2) result=Between(left)
                 |
                 result = MemberOfExpression(left)
                 |
-                LOOKAHEAD(IsNullExpression()) result=IsNullExpression(left)
+                LOOKAHEAD(3) result=IsNullExpression(left)
                 |
-                LOOKAHEAD(IsBooleanExpression()) result=IsBooleanExpression(left)
+                LOOKAHEAD(3) result=IsBooleanExpression(left)
+                |
+                LOOKAHEAD(3) result=IsUnknownExpression(left)
                 |
                 LOOKAHEAD(2) result=LikeExpression(left)
                 |
-                LOOKAHEAD(IsDistinctExpression()) result=IsDistinctExpression(left)
+                LOOKAHEAD(3) result=IsDistinctExpression(left)
                 |
                 result=SimilarToExpression(left)
-                )
             )
         ]
     )
     { return result; }
 }
 
-Expression InExpression() #InExpression :
+Expression InExpression(Expression leftExpression) #InExpression :
 {
     Token token;
     int oldOracleJoin = 0;
     boolean usingNot = false;
     boolean usingGlobal = false;
-    Expression leftExpression;
     Expression rightExpression;
 }
 {
-    leftExpression=SimpleExpression()
     [ "(" "+" ")" { oldOracleJoin=EqualsTo.ORACLE_JOIN_RIGHT; } ]
 
     [<K_GLOBAL> { usingGlobal=true; } ]
@@ -4416,10 +5686,8 @@ Expression InExpression() #InExpression :
     <K_IN>
     (
         LOOKAHEAD(2) token=<S_CHAR_LITERAL> {  rightExpression = new StringValue(token.image); }
-        | LOOKAHEAD(3) rightExpression = Function()
-        | LOOKAHEAD(ParenthesedSelect(), {!interrupted}) rightExpression = ParenthesedSelect()
-        | LOOKAHEAD(3) rightExpression = ParenthesedExpressionList()
-        | rightExpression = SimpleExpression()
+        |
+        rightExpression = PrimaryExpression()
     )
     {
         InExpression inExpression =  new InExpression(leftExpression, rightExpression)
@@ -4470,8 +5738,15 @@ Expression Between(Expression leftExpression) :
 {
         [<K_NOT> { result.setNot(true); }]
         <K_BETWEEN>
+        [
+            LOOKAHEAD(2) (
+                <K_SYMMETRIC> { result.setUsingSymmetric(true); }
+                |
+                <K_ASYMMETRIC> { result.setUsingAsymmetric(true); }
+            )
+        ]
         (
-            LOOKAHEAD( 3 ) betweenExpressionStart = ParenthesedSelect()
+            LOOKAHEAD( ParenthesedSelect() ) betweenExpressionStart = ParenthesedSelect()
             |
             LOOKAHEAD( RegularCondition() ) betweenExpressionStart = RegularCondition()
             |
@@ -4480,7 +5755,7 @@ Expression Between(Expression leftExpression) :
 
         <K_AND>
         (
-            LOOKAHEAD( 3 ) betweenExpressionEnd = ParenthesedSelect()
+            LOOKAHEAD( ParenthesedSelect() ) betweenExpressionEnd = ParenthesedSelect()
             |
             LOOKAHEAD( RegularCondition() ) betweenExpressionEnd = RegularCondition()
             |
@@ -4599,6 +5874,21 @@ Expression IsBooleanExpression(Expression leftExpression):
     }
 }
 
+Expression IsUnknownExpression(Expression leftExpression):
+{
+    IsUnknownExpression result = new IsUnknownExpression();
+}
+{
+        (
+          <K_IS> [<K_NOT> { result.setNot(true); } ] <K_UNKNOWN>
+        )
+
+    {
+        result.setLeftExpression(leftExpression);
+        return result;
+    }
+}
+
 Expression ExistsExpression():
 {
     ExistsExpression result = new ExistsExpression();
@@ -4689,8 +5979,7 @@ ExpressionList SimpleExpressionList():
     (
         LOOKAHEAD(2, {!interrupted} ) ","
         (
-            // @todo: Check hot to avoid this expensive look ahead
-            LOOKAHEAD( LambdaExpression() ) expr=LambdaExpression()
+            LOOKAHEAD( 7 ) expr=LambdaExpression()
             |
             expr=SimpleExpression()
         )
@@ -4737,7 +6026,8 @@ ExpressionList ComplexExpressionList():
 {
     (
         LOOKAHEAD(2) expr=OracleNamedFunctionParameter()
-        | expr=Expression()
+        |
+        expr=Expression()
     )
     {
         expressions.add(expr);
@@ -4748,9 +6038,9 @@ ExpressionList ComplexExpressionList():
         (
             LOOKAHEAD(2) expr=OracleNamedFunctionParameter()
             |
-            // @todo: Check hot to avoid this expensive look ahead
-            LOOKAHEAD( LambdaExpression() ) expr=LambdaExpression()
-            | expr=Expression()
+            LOOKAHEAD(7) expr=LambdaExpression()
+            |
+            expr=Expression()
         ) { expressions.add(expr); }
     )*
 
@@ -4813,11 +6103,15 @@ Expression ComparisonItem() :
 }
 {
   (
-    LOOKAHEAD( AnyComparisonExpression() ) retval=AnyComparisonExpression()
-    | LOOKAHEAD(3) retval=SimpleExpression()
-    | LOOKAHEAD(3) retval=ParenthesedExpressionList()
-    | LOOKAHEAD(3) retval=RowConstructor()
-    | retval=PrimaryExpression()
+    LOOKAHEAD( 6 ) retval=AnyComparisonExpression()
+    |
+    LOOKAHEAD( 3 ) retval=SimpleExpression()
+    |
+    LOOKAHEAD( 3 ) retval=ParenthesedExpressionList()
+    |
+    LOOKAHEAD( 3 ) retval=RowConstructor()
+    |
+    retval=PrimaryExpression()
   )
 
    {
@@ -4830,16 +6124,15 @@ Expression AnyComparisonExpression() :
     AnyType anyType;
     Select select;
 }
-{
-    (
-        (
-            <K_ANY> { anyType = AnyType.ANY; }
-            | <K_SOME> { anyType = AnyType.SOME; }
-            | <K_ALL> { anyType = AnyType.ALL; }
-        )
-
-        select = ParenthesedSelect()
+{
+    (
+        <K_ANY> { anyType = AnyType.ANY; }
+        |
+        <K_SOME> { anyType = AnyType.SOME; }
+        |
+        <K_ALL> { anyType = AnyType.ALL; }
     )
+    select = ParenthesedSelect()
     {
       return new AnyComparisonExpression(anyType, select);
     }
@@ -4852,17 +6145,8 @@ Expression SimpleExpression():
     Token operation = null;
 }
 {
-
-    (
-        [ LOOKAHEAD(UserVariable() ("=" | ":=") )
-            user = UserVariable()
-           ( operation = "=" | operation = ":=" )
-        ]
-
-        (
-            retval=ConcatExpression()
-        )
-    )
+    [ LOOKAHEAD( 5 ) user = UserVariable() ( operation = "=" | operation = ":=" ) ]
+    retval=ConcatExpression()
     {
         if (user != null) {
             VariableAssignment assignment = new VariableAssignment();
@@ -4920,7 +6204,7 @@ Expression BitwiseAndOr():
         rightExpression=AdditiveExpression()
 
         {
-             BinaryExpression binExp = (BinaryExpression) result;
+            BinaryExpression binExp = (BinaryExpression) result;
             binExp.setLeftExpression(leftExpression);
             binExp.setRightExpression(rightExpression);
             leftExpression = result;
@@ -5062,7 +6346,7 @@ Expression PrimaryExpression() #PrimaryExpression:
 
         | LOOKAHEAD(2, {!interrupted}) retval=CharacterPrimary()
 
-        | LOOKAHEAD( ImplicitCast(), {!interrupted})  retval=ImplicitCast()
+        | LOOKAHEAD(6, {!interrupted}) retval=ImplicitCast()
 
         | retval = JdbcParameter()
 
@@ -5072,7 +6356,7 @@ Expression PrimaryExpression() #PrimaryExpression:
 
         | LOOKAHEAD(2, {!interrupted}) retval=NumericBind()
 
-        | LOOKAHEAD( ExtractExpression() , {!interrupted}) retval=ExtractExpression()
+        | LOOKAHEAD(4 , {!interrupted}) retval=ExtractExpression()
 
         | LOOKAHEAD(3) retval=MySQLGroupConcat()
 
@@ -5084,7 +6368,9 @@ Expression PrimaryExpression() #PrimaryExpression:
 
         | LOOKAHEAD(3, { !interrupted}) retval = FullTextSearch()
 
-        | LOOKAHEAD( Function(), { !interrupted}) retval=Function() [ LOOKAHEAD(2) retval = AnalyticExpression( (Function) retval ) ]
+        | LOOKAHEAD(2, {!interrupted}) retval=CastExpression()
+
+        | LOOKAHEAD(16) retval=Function() [ LOOKAHEAD(2) retval = AnalyticExpression( (Function) retval ) ]
 
         | LOOKAHEAD(2, {!interrupted}) retval = IntervalExpression() { dateExpressionAllowed = false; }
 
@@ -5094,8 +6380,13 @@ Expression PrimaryExpression() #PrimaryExpression:
 
         | token=<S_HEX>  { retval = new HexValue(token.image); }
 
-        | LOOKAHEAD(2, {!interrupted}) retval=CastExpression()
+        | LOOKAHEAD(3) retval=AllColumns()
+
+        | LOOKAHEAD(16) retval=AllTableColumns()
 
+        // See issue  #2207
+        // there is a huge! performance deterioration from this production
+        //| LOOKAHEAD(FunctionAllColumns()) retval=FunctionAllColumns()
 
         // support timestamp expressions
         | LOOKAHEAD(2, {!interrupted}) (token=<K_TIME_KEY_EXPR> | token=<K_CURRENT>) { retval = new TimeKeyExpression(token.image); }
@@ -5104,7 +6395,7 @@ Expression PrimaryExpression() #PrimaryExpression:
 
         | LOOKAHEAD(3 , {!interrupted}) retval=StructType()
 
-        | LOOKAHEAD(3, {!interrupted}) <K_ARRAY_LITERAL> retval=ArrayConstructor(true)
+        | LOOKAHEAD(3, {!interrupted}) <K_ARRAY_LITERAL> [ "<" type=ColDataType() ">" ] retval=ArrayConstructor(true) { if (type!=null) ((ArrayConstructor) retval).setDataType(type); }
 
         | LOOKAHEAD(3, {!interrupted}) retval=ArrayConstructor(false)
 
@@ -5112,6 +6403,8 @@ Expression PrimaryExpression() #PrimaryExpression:
 
         | retval=ConnectByRootOperator()
 
+        | retval=ConnectByPriorOperator()
+
         | LOOKAHEAD(2, {!interrupted}) <K_ALL> { retval = new AllValue(); }
 
         | LOOKAHEAD(2, {!interrupted}) retval=Column()
@@ -5178,15 +6471,23 @@ Expression PrimaryExpression() #PrimaryExpression:
 
     // Check for JSON operands
     [
-         LOOKAHEAD(2) (
+        LOOKAHEAD(2) (
             LOOKAHEAD(2) (
-                ( token="->" | token=":" /*Snowflake GET_PATH Operator*/ ) expression=Expression()
+                token="->"
+                |
+                token=":"
                 |
-                token="->>" expression=Expression()
+                token="->>"
                 |
-                token="#>" expression=Expression()
+                token="#>"
+                |
+                token="#>>"
+            )
+
+            (
+                LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing) && !interrupted }) expression=Expression()
                 |
-                token="#>>" expression=Expression()
+                expression=SimpleExpression()
             )
             {
                 jsonIdents.add(new AbstractMap.SimpleEntry<Expression, String>(expression, token.image ));
@@ -5280,16 +6581,13 @@ OracleNamedFunctionParameter OracleNamedFunctionParameter() : {
 }
 
 UserVariable UserVariable() : {
-    UserVariable var = new UserVariable();
+    Token tk;
     String varName;
-    String var2;
 }
 {
-    ("@" | "@@" { var.setDoubleAdd(true);} )
-    varName=IdentifierChain()
+    tk = <S_AT_IDENTIFIER> varName=IdentifierChain2(tk.image)
     {
-        var.setName(varName);
-        return var;
+        return new UserVariable(varName);
     }
 }
 
@@ -5434,7 +6732,7 @@ StructType StructType() #StruckType:
 JsonExpression JsonExpression(Expression expr, List<Map.Entry<Expression, String>> idents) : {
   JsonExpression result = new JsonExpression(expr, idents);
   Expression expression;
-  Token token;
+  Token token=null;
   ColDataType type = null;
   CastExpression castExpr = null;
 }
@@ -5460,18 +6758,26 @@ JsonExpression JsonExpression(Expression expr, List<Map.Entry<Expression, String
         }
 
         (
-             LOOKAHEAD(2) (
-                    ( token="->" | token=":" /*Snowflake GET_PATH Operator*/ ) expression=Expression()
-                    |
-                    token="->>" expression=Expression()
-                    |
-                    token="#>" expression=Expression()
-                    |
-                    token="#>>" expression=Expression()
-                )
-                {
-                    result.addIdent( expression, token.image );
-                }
+            LOOKAHEAD(2) (
+                token="->"
+                |
+                token=":"
+                |
+                token="->>"
+                |
+                token="#>"
+                |
+                token="#>>"
+            )
+
+            (
+                LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing) && !interrupted}) expression=Expression()
+                |
+                expression=SimpleExpression()
+            )
+            {
+                result.addIdent( expression, token.image );
+            }
         )*
     )*
 
@@ -5699,7 +7005,7 @@ JsonAggregateFunction JsonAggregateFunction() : {
             <K_OVER> {result.setAnalyticType(AnalyticType.OVER);}
             "("
             [<K_PARTITION> <K_BY>
-                (LOOKAHEAD(ComplexExpressionList()) expressionList=ComplexExpressionList()
+                (LOOKAHEAD(3) expressionList=ComplexExpressionList()
                 | "(" {partitionByBrackets = true;} expressionList=ComplexExpressionList() ")" )
             ]
             [olist=OrderByElements() ]
@@ -5719,15 +7025,25 @@ JsonAggregateFunction JsonAggregateFunction() : {
 }
 
 IntervalExpression IntervalExpression() : {
-    IntervalExpression interval;
+    IntervalExpression interval = new IntervalExpression();
     Token token = null;
     Expression expr = null;
     boolean signed = false;
 }
 {
 
-{ interval = new IntervalExpression(); }
-    <K_INTERVAL> ["-" {signed=true;}] (token=<S_LONG> | token=<S_DOUBLE> | token=<S_CHAR_LITERAL> | LOOKAHEAD(JdbcParameter()) expr = JdbcParameter() | expr = JdbcNamedParameter() | LOOKAHEAD(Function()) expr = Function() | expr = Column())
+    <K_INTERVAL>
+    (
+
+        LOOKAHEAD(3) (
+            [ "-" {signed=true;}]
+            (token=<S_LONG> | token=<S_DOUBLE>)
+        )
+        |
+        LOOKAHEAD(2) token=<S_CHAR_LITERAL>
+        |
+        expr = Expression()
+    )
     {
         if (expr != null) {
             if (signed) expr = new SignedExpression('-', expr);
@@ -5796,7 +7112,7 @@ void windowFun(AnalyticExpression retval):{
         [
             LOOKAHEAD(2) <K_OVER> "("
             [   <K_PARTITION> <K_BY>
-                    (LOOKAHEAD(ComplexExpressionList()) expressionList=ComplexExpressionList()
+                    (LOOKAHEAD(3) expressionList=ComplexExpressionList()
                     | "(" {partitionByBrackets = true;} expressionList=ComplexExpressionList() ")" )
             ]
             ")" { winDef.setPartitionExpressionList(expressionList, partitionByBrackets); retval.setType(AnalyticType.WITHIN_GROUP_OVER); }
@@ -5813,7 +7129,7 @@ WindowDefinition windowDefinition() : {
 } {
     "("
     [<K_PARTITION> <K_BY>
-        (LOOKAHEAD(ComplexExpressionList()) expressionList=ComplexExpressionList()
+        (LOOKAHEAD(3) expressionList=ComplexExpressionList()
         | "(" {partitionByBrackets = true;} expressionList=ComplexExpressionList() ")" )
     ]
     [olist=OrderByElements() ]
@@ -5924,7 +7240,7 @@ CastExpression ImplicitCast() #ImplicitCast:
     int scale = -1;
 }
 {
-     colDataType = DataType()
+    colDataType = DataType()
     (
         tk2 = <S_CHAR_LITERAL>
         |
@@ -6173,7 +7489,7 @@ Function SpecialStringFunctionWithNamedParameters() :
 
         "("
         (
-            LOOKAHEAD(NamedExpressionListExprFirst(), { getAsBoolean(Feature.allowComplexParsing) }) namedExpressionList = NamedExpressionListExprFirst()
+            LOOKAHEAD(6, { getAsBoolean(Feature.allowComplexParsing) }) namedExpressionList = NamedExpressionListExprFirst()
             |
             expressionList=ExpressionList()
         )
@@ -6217,10 +7533,6 @@ Function InternalFunction(boolean escaped):
             )
         ]
         (
-            "*" { expr = new AllColumns(); expressionList = new ExpressionList(expr); }
-            |
-            LOOKAHEAD( AllTableColumns() ) expr=AllTableColumns() { expressionList = new ExpressionList(expr); }
-            |
             LOOKAHEAD(3) [ LOOKAHEAD(2) extraKeywordToken = <K_TABLE> { retval.setExtraKeyword(extraKeywordToken.image); } ]
             expressionList=ExpressionList()
             [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ]
@@ -6268,7 +7580,7 @@ Function InternalFunction(boolean escaped):
             // tricky lookahead since we do need to support the following constructs
             // schema.f1().f2() - Function with Function Column
             // schema.f1().f2.f3 - Function with Attribute Column
-            LOOKAHEAD( Function() ) attributeExpression=Function() { retval.setAttribute(attributeExpression); }
+            LOOKAHEAD( 6 ) attributeExpression=Function() { retval.setAttribute(attributeExpression); }
             |
             attributeColumn=Column() { retval.setAttribute(attributeColumn); }
           )
@@ -6352,14 +7664,20 @@ TableFunction TableFunction():
     Token prefix = null;
     Function function;
     TableFunction functionItem;
+    Token withClause = null;
 }
 {
     [ prefix = <K_LATERAL> ]
     function=Function()
+    [ LOOKAHEAD(2) <K_WITH> ( withClause = <K_OFFSET> | withClause = <K_ORDINALITY> ) ]
     {
         return  prefix!=null
-            ? new TableFunction(prefix.image, function)
-            : new TableFunction(function);
+            ? withClause!=null
+                ? new TableFunction(prefix.image, function, withClause.image)
+                : new TableFunction(prefix.image, function)
+            : withClause!=null
+                ? new TableFunction(function, withClause.image)
+                : new TableFunction(function);
     }
 }
 
@@ -6406,7 +7724,7 @@ CreateIndex CreateIndex():
     CreateIndex createIndex = new CreateIndex();
     Table table = null;
     List<Index.ColumnParams> colNames;
-    Token using;
+    String indexType;
     Index index = null;
     List<String> parameter = new ArrayList<String>();
     List<String> tailParameters = new ArrayList<String>();
@@ -6421,12 +7739,12 @@ CreateIndex CreateIndex():
     (
         LOOKAHEAD(3)(
             <K_ON> table=Table()
-            [ <K_USING> using=<S_IDENTIFIER> { index.setUsing(using.image); } ]
+            [ indexType=UsingIndexType() { index.setUsing(indexType); } ]
         )
         |
         (
-            [ <K_USING> using=<S_IDENTIFIER> {
-                    index.setUsing(using.image);
+            [ indexType=UsingIndexType() {
+                    index.setUsing(indexType);
                     createIndex.setIndexTypeBeforeOn(true);
                 }
             ]
@@ -6784,12 +8102,12 @@ ColDataType DataType():
         |
         (
             ( tk=<K_DATETIMELITERAL> | tk=<DT_ZONE> | tk = <DATA_TYPE>  | tk = <K_SIGNED>  | tk = <K_UNSIGNED>
-                | tk=<K_CHARACTER>  |  tk=<K_BIT> | tk=<K_BYTES> | tk=<K_BINARY>
+                | tk=<K_CHARACTER>  |  tk=<K_BIT> | tk=<K_BYTES> | tk=<K_BINARY> | tk=<K_BOOLEAN>
                 | tk=<K_CHAR> | tk=<K_JSON> | tk=<K_STRING> ) { type = tk.image; }
             [
                 // MySQL seems to allow: INT UNSIGNED
                 LOOKAHEAD(2) ( LOOKAHEAD(2) ( tk = <DATA_TYPE>  | tk = <K_SIGNED>  | tk = <K_UNSIGNED>
-                                   | tk=<K_CHARACTER>  | tk=<K_BIT> | tk=<K_BYTES> | tk=<K_BINARY>
+                                   | tk=<K_CHARACTER>  | tk=<K_BIT> | tk=<K_BYTES> | tk=<K_BINARY> | tk=<K_BOOLEAN>
                                    | tk=<K_CHAR> | tk=<K_JSON>  | tk=<K_STRING> ) { type += " " + tk.image; } )+
             ]
             [
@@ -6826,6 +8144,19 @@ ColDataType ColDataType():
 }
 {
     (
+        (
+            <K_STRUCT>
+            "("
+            ( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> )
+            colDataType = ColDataType() { argumentsStringList.add( tk.image + " " + colDataType.toString()); }
+            [
+                ","
+                ( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> )
+                colDataType = ColDataType() { argumentsStringList.add( tk.image + " " + colDataType.toString()); }
+            ]
+            ")" { colDataType = new ColDataType("STRUCT"); }
+        )
+		|
 		LOOKAHEAD(2) (
             colDataType = DataType()
         )
@@ -6845,6 +8176,7 @@ ColDataType ColDataType():
 			| tk=<K_STRING>
 			| tk=<K_PUBLIC>
 			| tk=<K_DATA>
+			| tk=<K_NAME>
         ) { schema = tk.image; }
 
         [ LOOKAHEAD(2) "."  arrayType = ColDataType()  { schema += "." + arrayType.toString(); } ]
@@ -7024,12 +8356,14 @@ List<String> CreateParameter():
         }
         |
         (
-            (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>)
+            //@todo: implement a proper identifier
+            (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_NAME>)
             { retval+=tk.image; }
 
             [
                 "."
-                (tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>)
+                //@todo: implement a proper identifier
+                (tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER> | tk=<K_NAME>)
                 { retval+="."+tk2.image; }
             ]
             { param.add(retval); }
@@ -7047,7 +8381,7 @@ List<String> CreateParameter():
             | tk=<K_TYPE> | tk=<K_COMMENT> | tk=<K_USING> | tk=<K_COLLATE> | tk=<K_ASC>
             | tk=<K_DESC> | tk=<K_TRUE> | tk=<K_FALSE> | tk=<K_PARALLEL> | tk=<K_BINARY> | tk=<K_START>
             | tk=<K_TIME_KEY_EXPR> | tk=<K_RAW> | tk=<K_HASH> | tk=<K_FIRST> | tk=<K_LAST> | tk = <K_SIGNED>  | tk = <K_UNSIGNED>
-            | tk=<K_ENGINE>
+            | tk=<K_ENGINE> | tk=<K_IDENTITY>
             | tk="="
         )
         { param.add(tk.image); }
@@ -7320,6 +8654,34 @@ AlterExpression.ColumnDropDefault AlterExpressionColumnDropDefault():
     }
 }
 
+AlterExpression.ColumnSetDefault AlterExpressionColumnSetDefault():
+{
+    String columnName = null;
+    Expression defaultValue = null;
+}
+{
+    columnName = RelObjectName() <K_SET> <K_DEFAULT> defaultValue = Expression()
+    {
+        return new AlterExpression.ColumnSetDefault(columnName, defaultValue.toString());
+    }
+}
+
+AlterExpression.ColumnSetVisibility AlterExpressionColumnSetVisibility():
+{
+    String columnName = null;
+    boolean visible = true;
+}
+{
+    columnName = RelObjectName() <K_SET>
+    (
+        <K_VISIBLE> { visible = true; } |
+        <K_INVISIBLE> { visible = false; }
+    )
+    {
+        return new AlterExpression.ColumnSetVisibility(columnName, visible);
+    }
+}
+
 List<ConstraintState> AlterExpressionConstraintState():
 {
     List<ConstraintState> retval = new ArrayList<ConstraintState>();
@@ -7368,6 +8730,65 @@ Index IndexWithComment(Index index):
     }
 }
 
+void IndexOptionList(List<String> list) :
+{}
+{
+    (
+       LOOKAHEAD(2) IndexOption(list)
+    )*
+}
+
+String UsingIndexType() :
+{
+    String sk = null;
+}
+{
+    <K_USING> ( sk = RelObjectName() )
+    {
+        return sk;
+    }
+}
+
+void IndexOption(List<String> list) :
+{
+    Token tk1 = null;
+    Token tk2 = null;
+    String sk1 = null;
+    boolean useEqual = false;
+}
+{
+    (
+      tk1=<K_KEY_BLOCK_SIZE> ["=" { useEqual = true; } ] tk2=<S_LONG>
+      {
+        list.add("KEY_BLOCK_SIZE" +  (useEqual ? " = " : "") + tk2.image);
+      }
+    |
+      tk1=<K_WITH> <K_PARSER> tk2=<S_IDENTIFIER>
+      {
+        list.add("WITH PARSER " + tk2.image);
+      }
+    |
+      tk1=<K_COMMENT> tk2=<S_CHAR_LITERAL>
+      {
+        list.add("COMMENT " + tk2.image);
+      }
+    |
+      tk1=<K_VISIBLE>
+      {
+        list.add("VISIBLE");
+      }
+    |
+      tk1=<K_INVISIBLE>
+      {
+        list.add("INVISIBLE");
+      }
+    |
+      sk1 = UsingIndexType(){
+        list.add("USING " + sk1);
+      }
+    )
+}
+
 List<PartitionDefinition> PartitionDefinitions():
 {
     Token tk;
@@ -7376,6 +8797,7 @@ List<PartitionDefinition> PartitionDefinitions():
     String partitionName = null;
     String partitionOperation = null;
     String storageEngine = null;
+    Expression exp = null;
 }
 {
     "("
@@ -7389,10 +8811,9 @@ List<PartitionDefinition> PartitionDefinitions():
             (
                 <K_LESS> <K_THAN>
                 (
-                    "("
-                    ( tk=<S_CHAR_LITERAL> { values.add(tk.image); }
-                    | tk=<S_LONG> { values.add(tk.image); }
-                    [ "," ] )* ")"
+                    "(" exp = Expression() ")"{
+                        values.add(exp.toString());
+                    }
                     | <K_MAXVALUE> { values.add("MAXVALUE"); }
                 ) {
                     partitionOperation = "VALUES LESS THAN";
@@ -7411,21 +8832,26 @@ List<PartitionDefinition> PartitionDefinitions():
     }
 }
 
-
 List<String> PartitionNamesList() :
 {
     Token tk;
     List<String> partitionNames = new ArrayList<String>();
 }
 {
-    tk = <S_IDENTIFIER> {
-        partitionNames.add(tk.image);
-    }
     (
-        LOOKAHEAD(2) "," tk = <S_IDENTIFIER> {
+        tk = <K_ALL> {
             partitionNames.add(tk.image);
         }
-    )*
+        |
+        tk = <S_IDENTIFIER> {
+            partitionNames.add(tk.image);
+        }
+        (
+            LOOKAHEAD(2) "," tk = <S_IDENTIFIER> {
+                partitionNames.add(tk.image);
+            }
+        )*
+    )
     {
         return partitionNames;
     }
@@ -7451,11 +8877,16 @@ AlterExpression AlterExpression():
     AlterExpression.ColumnDataType alterExpressionColumnDataType = null;
     AlterExpression.ColumnDropNotNull alterExpressionColumnDropNotNull = null;
     AlterExpression.ColumnDropDefault alterExpressionColumnDropDefault = null;
+    AlterExpression.ColumnSetDefault alterExpressionColumnSetDefault = null;
+    AlterExpression.ColumnSetVisibility alterExpressionColumnSetVisibility = null;
     ReferentialAction.Action action = null;
     List<String> partitions = null;
     List<PartitionDefinition> partitionDefinition = null;
     String truncatePartitionName = null;
 
+    String identifier = null;
+    List<String> indexSpec = new ArrayList<String>();
+
     // for captureRest()
     List<String> tokens = new LinkedList<String>();
 }
@@ -7480,15 +8911,55 @@ AlterExpression AlterExpression():
                 |
                 LOOKAHEAD(2) (
                   (tk=<K_KEY> { alterExp.setUk(true); } | tk=<K_INDEX>)
-                  sk3 = RelObjectName()
-                  columnNames = ColumnsNamesList()
+                  (
+                      LOOKAHEAD(3)
+                      sk3 = RelObjectName()
+                      [ LOOKAHEAD(2) sk4 = UsingIndexType() ]
+                      [ LOOKAHEAD(2) columnNames = ColumnsNamesList() ]
+                      |
+                      [ LOOKAHEAD(2) sk4 = UsingIndexType() ]
+                      [ LOOKAHEAD(2) columnNames = ColumnsNamesList() ]
+                  )
+                  IndexOptionList(indexSpec = new ArrayList<String>())
                   {
-                    index = new Index().withType(tk.image).withName(sk3).withColumnsNames(columnNames);
+                    index = new Index()
+                            .withIndexKeyword(tk.image)
+                            .withName(sk3)
+                            .withUsing(sk4)
+                            .withColumnsNames(columnNames)
+                            .withIndexSpec(indexSpec);
+
                     alterExp.setIndex(index);
                   }
                   constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
-                  [ <K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
-                  [ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ]
+                )
+                |
+                LOOKAHEAD(4)
+                (
+                  ( tk=<K_SPATIAL> | tk=<K_FULLTEXT> )
+                  [ LOOKAHEAD(2) ( tk2=<K_INDEX> | tk2=<K_KEY> ) ]
+                  (
+                      sk3 = RelObjectName()
+                      columnNames = ColumnsNamesList()
+                      |
+                      columnNames = ColumnsNamesList()
+                  )
+                  IndexOptionList(indexSpec = new ArrayList<String>())
+                  {
+                      String type = tk.image;
+                      String keyword = tk2 != null ? tk2.image : null;
+                      index = new Index()
+                          .withType(type)
+                          .withIndexKeyword(keyword)
+                          .withColumnsNames(columnNames)
+                          .withIndexSpec(indexSpec);
+
+                      if (sk3 != null) {
+                          index.setName(sk3);
+                      }
+
+                      alterExp.setIndex(index);
+                  }
                 )
                 |
                 LOOKAHEAD(2) (
@@ -7514,6 +8985,15 @@ AlterExpression AlterExpression():
                     )?
                     [ <K_IF> <K_NOT> <K_EXISTS> { alterExp.setUseIfNotExists(true); } ]
                     (
+                        LOOKAHEAD(3) alterExpressionColumnDropDefault = AlterExpressionColumnDropDefault()
+                            { alterExp.addColDropDefault(alterExpressionColumnDropDefault); }
+                        |
+                        LOOKAHEAD(3) alterExpressionColumnSetDefault = AlterExpressionColumnSetDefault()
+                            { alterExp.addColSetDefault(alterExpressionColumnSetDefault); }
+                        |
+                        LOOKAHEAD(3) alterExpressionColumnSetVisibility = AlterExpressionColumnSetVisibility()
+                            { alterExp.addColSetVisibility(alterExpressionColumnSetVisibility); }
+                        |
                         LOOKAHEAD(4) (
                             "("
                                 { alterExp.useBrackets(true);}
@@ -7534,12 +9014,18 @@ AlterExpression AlterExpression():
                         |
                         LOOKAHEAD(3) alterExpressionColumnDropNotNull = AlterExpressionColumnDropNotNull()
                             { alterExp.addColDropNotNull( alterExpressionColumnDropNotNull);}
-                        |
-                        alterExpressionColumnDropDefault = AlterExpressionColumnDropDefault()
-                            { alterExp.addColDropDefault( alterExpressionColumnDropDefault); }
                     )
                 )
                 |
+                LOOKAHEAD(3) alterExpressionColumnDropDefault = AlterExpressionColumnDropDefault()
+                    { alterExp.addColDropDefault(alterExpressionColumnDropDefault); }
+                |
+                LOOKAHEAD(3) alterExpressionColumnSetDefault = AlterExpressionColumnSetDefault()
+                    { alterExp.addColSetDefault(alterExpressionColumnSetDefault); }
+                |
+                LOOKAHEAD(3) alterExpressionColumnSetVisibility = AlterExpressionColumnSetVisibility()
+                    { alterExp.addColSetVisibility(alterExpressionColumnSetVisibility); }
+                |
                 (
                     "(" alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); }
                         (","
@@ -7575,84 +9061,123 @@ AlterExpression AlterExpression():
                     )]
                 )
                 |
+                LOOKAHEAD(3) (
+                    <K_CHECK> sk3=RelObjectName()
+                    { boolean enforced = true; }
+                    [ tk = <K_NOT> { enforced = false; } ]
+                    <K_ENFORCED> {
+                        alterExp.setEnforced(enforced);
+                        alterExp.setConstraintType("CHECK");
+                        alterExp.setConstraintSymbol(sk3);
+                    }
+                )
+                |
                 (
-                    <K_CONSTRAINT> sk3=RelObjectName()
-                    (
-                     ( tk=<K_FOREIGN> tk2=<K_KEY>
-                        columnNames=ColumnsNamesList()
-                        {
-                            fkIndex = new ForeignKeyIndex()
-                            .withName(sk3)
-                            .withType(tk.image + " " + tk2.image)
-                            .withColumnsNames(columnNames);
-                                                columnNames = null;
-                        }
-                        <K_REFERENCES> fkTable=Table() [ LOOKAHEAD(2) columnNames=ColumnsNamesList() ]
-                        {
-                            fkIndex.withTable(fkTable).withReferencedColumnNames(columnNames);
-                            alterExp.setIndex(fkIndex);
-                        }
-
-                        [LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
-                            {  fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
-                        )]
-                        [LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
-                            { fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
-                        )]
-                        constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
-                    )
-                    |
-                    ( tk=<K_PRIMARY> tk2=<K_KEY>
-                        columnNames=ColumnsNamesList()
-                        {
-                            index = new NamedConstraint()
-                            .withName(sk3)
-                            .withType(tk.image + " " + tk2.image)
-                            .withColumnsNames(columnNames);
-                            alterExp.setIndex(index);
-                        }
-                        constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
-                        [ <K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
-                        [ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ]
-                    )
-                    |
-                    (
-                        <K_CHECK>  {Expression exp = null;} (LOOKAHEAD(2) "(" exp = Expression() ")")* {
-                            CheckConstraint checkCs = new CheckConstraint().withName(sk3).withExpression(exp);
-                            alterExp.setIndex(checkCs);
-                        }
-                    )
-                    |
+                    <K_CONSTRAINT>
                     (
-                        tk=<K_UNIQUE> (tk2=<K_KEY> { alterExp.setUk(true); } | tk2=<K_INDEX>)?
-                          columnNames=ColumnsNamesList()
-                          {
-                              index = new NamedConstraint()
-                                .withName(sk3)
-                                .withType(tk.image + (tk2!=null?" " + tk2.image:""))
-                                .withColumnsNames(columnNames);
+                        LOOKAHEAD(2)
+                        (
+                            <K_UNIQUE> (<K_KEY> { alterExp.setConstraintType("UNIQUE KEY"); }
+                            | <K_INDEX> { alterExp.setConstraintType("UNIQUE INDEX"); }
+                            | { alterExp.setConstraintType("UNIQUE"); } )
+                            sk3=RelObjectName() {
+                              alterExp.setConstraintSymbol(sk3);
+                              index = new Index();
+                            }
+                            columnNames=ColumnsNamesList() {
+                              index.setColumnsNames(columnNames);
                               alterExp.setIndex(index);
-                          }
-                          constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
-                          [ <K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
-                          [ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ]
-                    )
-                    |
-                    (
-                        tk=<K_KEY>
-                        columnNames=ColumnsNamesList()
-                        {
-                            index = new NamedConstraint()
-                              .withName(sk3)
-                              .withType(tk.image)
-                              .withColumnsNames(columnNames);
-                            alterExp.setIndex(index);
-                        }
-                        constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
+                            }
+                        )
+                        |
+                        sk3=RelObjectName()
+                        (
+                             ( tk=<K_FOREIGN> tk2=<K_KEY>
+                                columnNames=ColumnsNamesList()
+                                {
+                                    fkIndex = new ForeignKeyIndex()
+                                    .withName(sk3)
+                                    .withType(tk.image + " " + tk2.image)
+                                    .withColumnsNames(columnNames);
+                                                        columnNames = null;
+                                }
+                                <K_REFERENCES> fkTable=Table() [ LOOKAHEAD(2) columnNames=ColumnsNamesList() ]
+                                {
+                                    fkIndex.withTable(fkTable).withReferencedColumnNames(columnNames);
+                                    alterExp.setIndex(fkIndex);
+                                }
+
+                                [LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
+                                    {  fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
+                                )]
+                                [LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
+                                    { fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
+                                )]
+                                constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
+                            )
+                            |
+                            ( tk=<K_PRIMARY> tk2=<K_KEY>
+                                columnNames=ColumnsNamesList()
+                                {
+                                    index = new NamedConstraint()
+                                    .withName(sk3)
+                                    .withType(tk.image + " " + tk2.image)
+                                    .withColumnsNames(columnNames);
+                                    alterExp.setIndex(index);
+                                }
+                                constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
+                                [ <K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
+                                [ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ]
+                            )
+                            |
+                            LOOKAHEAD(2) (
+                                { boolean enforced = true; }
+                                [ tk = <K_NOT> { enforced = false; } ]
+                                <K_ENFORCED> {
+                                    alterExp.setEnforced(enforced);
+                                    alterExp.setConstraintType("CONSTRAINT");
+                                    alterExp.setConstraintSymbol(sk3);
+                                }
+                            )
+                            |
+                            (
+                                <K_CHECK>  {Expression exp = null;} (LOOKAHEAD(2) "(" exp = Expression() ")")* {
+                                    CheckConstraint checkCs = new CheckConstraint().withName(sk3).withExpression(exp);
+                                    alterExp.setIndex(checkCs);
+                                }
+                            )
+                            |
+                            (
+                                tk=<K_UNIQUE> (tk2=<K_KEY> { alterExp.setUk(true); } | tk2=<K_INDEX>)?
+                                  columnNames=ColumnsNamesList()
+                                  {
+                                      index = new NamedConstraint()
+                                        .withName(sk3)
+                                        .withType(tk.image + (tk2!=null?" " + tk2.image:""))
+                                        .withColumnsNames(columnNames);
+                                      alterExp.setIndex(index);
+                                  }
+                                  constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
+                                  [ <K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
+                                  [ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ]
+                            )
+                            |
+                            (
+                                tk=<K_KEY>
+                                columnNames=ColumnsNamesList()
+                                {
+                                    index = new NamedConstraint()
+                                      .withName(sk3)
+                                      .withType(tk.image)
+                                      .withColumnsNames(columnNames);
+                                    alterExp.setIndex(index);
+                                }
+                                constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
+                            )
+                        )
                     )
-                   )
                 )
-              )
+            )
       )
       |
       (
@@ -7692,7 +9217,8 @@ AlterExpression AlterExpression():
                 (
                     ( LOOKAHEAD(2) <K_COLUMN> { alterExp.hasColumn(true); } )?
                     [<K_IF> <K_EXISTS> { alterExp.setUsingIfExists(true); } ]
-                    (tk=<S_IDENTIFIER>    | tk=<S_QUOTED_IDENTIFIER>) { alterExp.setColumnName(tk.image); }
+                    // @todo: replace with a proper identifier
+                    (tk=<S_IDENTIFIER>  | tk=<S_QUOTED_IDENTIFIER> | tk=<K_NAME>) { alterExp.setColumnName(tk.image); }
 
                     [ "INVALIDATE" { alterExp.addParameters("INVALIDATE"); } ]
 
@@ -7748,6 +9274,14 @@ AlterExpression AlterExpression():
         )
         |
         (
+        <K_KEY_BLOCK_SIZE>{
+            alterExp.setOperation(AlterOperation.KEY_BLOCK_SIZE);
+        }
+         ["=" { alterExp.setUseEqual(true);} ]
+         tk=<S_LONG> { alterExp.setKeyBlockSize(Integer.parseInt(tk.image)); }
+        )
+        |
+        (
         <K_LOCK> {
             alterExp.setOperation(AlterOperation.LOCK);
         }
@@ -7761,9 +9295,9 @@ AlterExpression AlterExpression():
         )
       |
       LOOKAHEAD(2)  <K_RENAME> { alterExp.setOperation(AlterOperation.RENAME); } [ <K_COLUMN> {  alterExp.hasColumn(true);} ]
-                    ( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> ) { alterExp.setColOldName(tk.image); }
+                    ( tk=KeywordOrIdentifier() ) { alterExp.setColOldName(tk.image); }
                     <K_TO>
-                    (tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setColumnName(tk2.image); }
+                    ( tk2=KeywordOrIdentifier() ) { alterExp.setColumnName(tk2.image); }
       |
       LOOKAHEAD(2)(
         <K_RENAME> <K_TO> {alterExp.setOperation(AlterOperation.RENAME_TABLE);}
@@ -7776,14 +9310,28 @@ AlterExpression AlterExpression():
         <K_TO> <K_CHARACTER> <K_SET> tk=<S_IDENTIFIER> { alterExp.setCharacterSet(tk.image); }
         [<K_COLLATE> tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
       )
-      | (<K_DEFAULT> {
-          alterExp.setOperation(AlterOperation.CONVERT);
-          alterExp.setConvertType(AlterExpression.ConvertType.DEFAULT_CHARACTER_SET);
-        }
-        <K_CHARACTER> <K_SET> [ "=" { alterExp.setHasEqualForCharacterSet(true); } ]
-        tk=<S_IDENTIFIER> { alterExp.setCharacterSet(tk.image); }
-        [<K_COLLATE> [ "=" { alterExp.setHasEqualForCollate(true); } ]
-            tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
+      |
+      LOOKAHEAD(3)
+      (
+          <K_DEFAULT>
+          (
+              <K_CHARACTER> <K_SET> [ "=" { alterExp.setHasEqualForCharacterSet(true); } ]
+              tk=<S_IDENTIFIER> {
+                  alterExp.setOperation(AlterOperation.CONVERT);
+                  alterExp.setConvertType(AlterExpression.ConvertType.DEFAULT_CHARACTER_SET);
+                  alterExp.setCharacterSet(tk.image);
+              }
+              [<K_COLLATE> [ "=" { alterExp.setHasEqualForCollate(true); } ]
+                  tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
+          |
+              <K_COLLATE>
+              [ "=" { alterExp.setHasEqualForCollate(true); } ]
+              tk=<S_IDENTIFIER> {
+                  alterExp.setOperation(AlterOperation.COLLATE);
+                  alterExp.setCollation(tk.image);
+                  alterExp.setDefaultCollateSpecified(true);
+              }
+          )
       )
       | (<K_CHARACTER> <K_SET> [ "=" { alterExp.setHasEqualForCharacterSet(true); } ]
         tk=<S_IDENTIFIER> {
@@ -7794,21 +9342,87 @@ AlterExpression AlterExpression():
         [<K_COLLATE> [ "=" { alterExp.setHasEqualForCollate(true); } ]
             tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
       )
+      | (<K_COLLATE> { alterExp.setOperation(AlterOperation.COLLATE); }
+      [ "=" { alterExp.setHasEqualForCollate(true); } ]
+        tk=<S_IDENTIFIER> {
+          alterExp.setCollation(tk.image);
+        }
+      )
+      |
+      (<K_COMMENT> {alterExp.setOperation(AlterOperation.COMMENT);}
+          ["=" {alterExp.setOperation(AlterOperation.COMMENT_WITH_EQUAL_SIGN);} ]
+          tk=<S_CHAR_LITERAL> { alterExp.setCommentText(tk.image); }
+      )
+      |
+      (<K_ENCRYPTION> {alterExp.setOperation(AlterOperation.SET_TABLE_OPTION);}
+            ["=" { alterExp.setUseEqual(true);} ]
+            tk=<S_CHAR_LITERAL> {
+                if (alterExp.getUseEqual()) {
+                    alterExp.setTableOption("ENCRYPTION = " + tk.image);
+                } else {
+                    alterExp.setTableOption("ENCRYPTION " + tk.image);
+                }
+            }
+      )
+      |
+      (
+          <K_DISCARD>
+          (
+              <K_PARTITION>
+              {
+                  alterExp.setOperation(AlterOperation.DISCARD_PARTITION);
+              }
+              partitions = PartitionNamesList()
+              {
+                  alterExp.setPartitions(partitions);
+              }
+              <K_TABLESPACE>
+              {
+                  alterExp.setTableOption("TABLESPACE");
+              }
+              |
+              <K_TABLESPACE>
+              {
+                  alterExp.setOperation(AlterOperation.DISCARD_TABLESPACE);
+              }
+          )
+      )
+      |
+            (
+                <K_IMPORT>
+                (
+                    <K_PARTITION>
+                    {
+                        alterExp.setOperation(AlterOperation.IMPORT_PARTITION);
+                    }
+                    partitions = PartitionNamesList()
+                    {
+                        alterExp.setPartitions(partitions);
+                    }
+                    <K_TABLESPACE>
+                    {
+                        alterExp.setTableOption("TABLESPACE");
+                    }
+                    |
+                    <K_TABLESPACE>
+                    {
+                        alterExp.setOperation(AlterOperation.IMPORT_TABLESPACE);
+                    }
+                )
+            )
       |
-      (<K_COMMENT> {alterExp.setOperation(AlterOperation.COMMENT);}
-          ["=" {alterExp.setOperation(AlterOperation.COMMENT_WITH_EQUAL_SIGN);} ]
-          tk=<S_CHAR_LITERAL> { alterExp.setCommentText(tk.image); }
+      (
+          (tk = <K_DISABLE>)
+          (tk2 = <K_KEYS>) {
+              alterExp.setOperation(AlterOperation.DISABLE_KEYS);
+          }
       )
       |
-      (<K_ENCRYPTION> {alterExp.setOperation(AlterOperation.SET_TABLE_OPTION);}
-            ["=" { alterExp.setUseEqual(true);} ]
-            tk=<S_CHAR_LITERAL> {
-                if (alterExp.getUseEqual()) {
-                    alterExp.setTableOption("ENCRYPTION = " + tk.image);
-                } else {
-                    alterExp.setTableOption("ENCRYPTION " + tk.image);
-                }
-            }
+      (
+          (tk = <K_ENABLE>)
+          (tk2 = <K_KEYS>) {
+              alterExp.setOperation(AlterOperation.ENABLE_KEYS);
+          }
       )
       |
       (<K_AUTO_INCREMENT> {alterExp.setOperation(AlterOperation.SET_TABLE_OPTION);}
@@ -7821,6 +9435,28 @@ AlterExpression AlterExpression():
                   }
             }
       )
+      |
+        LOOKAHEAD(2) (
+            <K_PARTITION> <K_BY> {
+                alterExp.setOperation(AlterOperation.PARTITION_BY);
+            }
+            <K_RANGE> {
+                alterExp.setPartitionType("RANGE");
+                Expression exp = null;
+            }
+            (
+                "(" exp=Expression() ")" {
+                    alterExp.setPartitionExpression(exp);
+                }
+                |
+                <K_COLUMNS> columnNames=ColumnsNamesList() {
+                    alterExp.setPartitionColumns(columnNames);
+                }
+            )
+            partitionDefinition=PartitionDefinitions() {
+                alterExp.setPartitionDefinitions(partitionDefinition);
+            }
+        )
       |
       LOOKAHEAD(2)
            (<K_RENAME> ((<K_INDEX> {alterExp.setOperation(AlterOperation.RENAME_INDEX);}
@@ -7842,6 +9478,67 @@ AlterExpression AlterExpression():
            alterExp.setPartitions(partitions);
        }
       |
+      LOOKAHEAD(2) <K_COALESCE> <K_PARTITION> tk=<S_LONG> {
+            alterExp.setOperation(AlterOperation.COALESCE_PARTITION);
+            alterExp.setCoalescePartitionNumber(Integer.valueOf(tk.image));
+      }
+      | LOOKAHEAD(2) <K_REORGANIZE> <K_PARTITION>
+        partitions=PartitionNamesList() <K_INTO> partitionDefinition=PartitionDefinitions() {
+          alterExp.setOperation(AlterOperation.REORGANIZE_PARTITION);
+          alterExp.setPartitions(partitions);
+          alterExp.setPartitionDefinitions(partitionDefinition);
+      }
+      |
+      LOOKAHEAD(2) <K_EXCHANGE> <K_PARTITION> partitions=PartitionNamesList()
+        <K_WITH> <K_TABLE> tk=<S_IDENTIFIER>
+        [
+            LOOKAHEAD(2) (
+                <K_WITH> <K_VALIDATION> { alterExp.setExchangePartitionWithValidation(true); }
+                |
+                <K_WITHOUT> <K_VALIDATION> { alterExp.setExchangePartitionWithoutValidation(false); }
+            )
+        ]
+        {
+          alterExp.setOperation(AlterOperation.EXCHANGE_PARTITION);
+          alterExp.setPartitions(partitions);
+          alterExp.setExchangePartitionTableName(tk.image);
+        }
+      |
+      LOOKAHEAD(2) <K_ANALYZE> <K_PARTITION> {
+          alterExp.setOperation(AlterOperation.ANALYZE_PARTITION);
+      }
+      partitions=PartitionNamesList() {
+          alterExp.setPartitions(partitions);
+      }
+      |
+      LOOKAHEAD(2) <K_CHECK> <K_PARTITION> {
+          alterExp.setOperation(AlterOperation.CHECK_PARTITION);
+      }
+      partitions=PartitionNamesList() {
+          alterExp.setPartitions(partitions);
+      }
+      |
+      LOOKAHEAD(2) <K_OPTIMIZE> <K_PARTITION> {
+          alterExp.setOperation(AlterOperation.OPTIMIZE_PARTITION);
+      }
+      partitions=PartitionNamesList() {
+          alterExp.setPartitions(partitions);
+      }
+      |
+      LOOKAHEAD(2) <K_REBUILD> <K_PARTITION> {
+          alterExp.setOperation(AlterOperation.REBUILD_PARTITION);
+      }
+      partitions=PartitionNamesList() {
+          alterExp.setPartitions(partitions);
+      }
+      |
+      LOOKAHEAD(2) <K_REPAIR> <K_PARTITION> { alterExp.setOperation(AlterOperation.REPAIR_PARTITION); }
+      partitions=PartitionNamesList() {
+          alterExp.setPartitions(partitions);
+      }
+      |
+      LOOKAHEAD(2) <K_REMOVE> <K_PARTITIONING> { alterExp.setOperation(AlterOperation.REMOVE_PARTITIONING); }
+      |
       tokens = captureRest() {
                     alterExp.setOperation(AlterOperation.UNSPECIFIC);
                     StringBuilder optionalSpecifier = new StringBuilder();
@@ -8005,57 +9702,57 @@ AlterSystemStatement AlterSystemStatement():
 {
     <K_SYSTEM> (
         (
-           "ARCHIVE" "LOG" { operation = AlterSystemOperation.ARCHIVE_LOG; }
+           <K_ARCHIVE> <K_LOG> { operation = AlterSystemOperation.ARCHIVE_LOG; }
         )
         |
         (
-            "CHECKPOINT" { operation = AlterSystemOperation.CHECKPOINT; }
+            <K_CHECKPOINT> { operation = AlterSystemOperation.CHECKPOINT; }
         )
         |
         (
-            "DUMP" "ACTIVE" "SESSION" "HISTORY" { operation = AlterSystemOperation.DUMP_ACTIVE_SESSION_HISTORY; }
+            <K_DUMP> <K_ACTIVE> <K_SESSION> <K_HISTORY> { operation = AlterSystemOperation.DUMP_ACTIVE_SESSION_HISTORY; }
         )
         |
         (
             <K_ENABLE>  (
-                            "DISTRIBUTED RECOVERY" { operation = AlterSystemOperation.ENABLE_DISTRIBUTED_RECOVERY; }
-                            | "RESTRICTED SESSION" { operation = AlterSystemOperation.ENABLE_DISTRIBUTED_RECOVERY; }
+                            "DISTRIBUTED" "RECOVERY" { operation = AlterSystemOperation.ENABLE_DISTRIBUTED_RECOVERY; }
+                            | <K_RESTRICTED> <K_SESSION> { operation = AlterSystemOperation.ENABLE_DISTRIBUTED_RECOVERY; }
                         )
         )
         |
         (
             <K_DISABLE> (
-                            "DISTRIBUTED RECOVERY" { operation = AlterSystemOperation.DISABLE_DISTRIBUTED_RECOVERY; }
-                            | "RESTRICTED SESSION" { operation = AlterSystemOperation.DISABLE_RESTRICTED_SESSION; }
+                            "DISTRIBUTED" "RECOVERY" { operation = AlterSystemOperation.DISABLE_DISTRIBUTED_RECOVERY; }
+                            | <K_RESTRICTED> <K_SESSION> { operation = AlterSystemOperation.DISABLE_RESTRICTED_SESSION; }
                         )
         )
         |
         (
-            "FLUSH" { operation = AlterSystemOperation.FLUSH; }
+            <K_FLUSH> { operation = AlterSystemOperation.FLUSH; }
         )
         |
         (
-            "DISCONNECT" "SESSION" { operation = AlterSystemOperation.DISCONNECT_SESSION; }
+            <K_DISCONNECT> <K_SESSION> { operation = AlterSystemOperation.DISCONNECT_SESSION; }
         )
         |
         (
-            "KILL SESSION" { operation = AlterSystemOperation.KILL_SESSION; }
+            <K_KILL> <K_SESSION> { operation = AlterSystemOperation.KILL_SESSION; }
         )
         |
         (
-            "SWITCH" { operation = AlterSystemOperation.SWITCH; }
+            <K_SWITCH> { operation = AlterSystemOperation.SWITCH; }
         )
         |
         (
-            "SUSPEND" { operation = AlterSystemOperation.SUSPEND; }
+            <K_SUSPEND> { operation = AlterSystemOperation.SUSPEND; }
         )
         |
         (
-            "RESUME" { operation = AlterSystemOperation.RESUME; }
+            <K_RESUME> { operation = AlterSystemOperation.RESUME; }
         )
         |
         (
-            "QUIESCE" "RESTRICTED" { operation = AlterSystemOperation.QUIESCE; }
+            <K_QUIESCE> <K_RESTRICTED> { operation = AlterSystemOperation.QUIESCE; }
         )
         |
         (
@@ -8063,19 +9760,19 @@ AlterSystemStatement AlterSystemStatement():
         )
         |
         (
-            "SHUTDOWN" { operation = AlterSystemOperation.SHUTDOWN; }
+            <K_SHUTDOWN> { operation = AlterSystemOperation.SHUTDOWN; }
         )
         |
         (
-            "REGISTER" { operation = AlterSystemOperation.REGISTER; }
+            <K_REGISTER> { operation = AlterSystemOperation.REGISTER; }
         )
         |
         (
-            "SET" { operation = AlterSystemOperation.SET; }
+            <K_SET> { operation = AlterSystemOperation.SET; }
         )
         |
         (
-            "RESET" { operation = AlterSystemOperation.RESET; }
+            <K_RESET> { operation = AlterSystemOperation.RESET; }
         )
     )
     parameters = captureRest()
@@ -8191,23 +9888,21 @@ Grant Grant():
 	(
 	    (
             [readGrantTypes(privileges) (<K_COMMA> readGrantTypes(privileges))*]
-            <K_ON>
-                (
-                    objName=RelObjectNames()   { grant.setObjectName(objName.getNames()); }
-                )
-            )
-            |
-            (
-                tk=<S_IDENTIFIER> { grant.setRole(tk.image); }
-            )
+            <K_ON> objName=RelObjectNames()   { grant.setObjectName(objName.getNames()); }
+        )
+        |
+        (
+            tk=<S_IDENTIFIER> { grant.setRole(tk.image); }
         )
-	<K_TO> (users = UsersList() {grant.setUsers(users);})
+    )
+	<K_TO> users = UsersList()
 	{
-            if(privileges.size() > 0) {
-                grant.setPrivileges(privileges);
-            }
-		return grant;
-	}
+        grant.setUsers(users);
+        if(privileges.size() > 0) {
+            grant.setPrivileges(privileges);
+        }
+	    return grant;
+    }
 }
 
 List<String> UsersList():
@@ -8216,7 +9911,7 @@ List<String> UsersList():
     String user = null;
 }
 {
-         user=RelObjectName() { users.add(user); }
+         user=RelObjectNameExt() { users.add(user); }
          ( "," user=ColumnsNamesListItem() { users.add(user); } )*
     {
         return users;
@@ -8257,91 +9952,96 @@ List<Sequence.Parameter> SequenceParameters():
   Token token = null;
 }
 {
-(
-   (<K_INCREMENT> <K_BY> token=<S_LONG>
-    {
-        parameter = new Sequence.Parameter(Sequence.ParameterType.INCREMENT_BY);
-        parameter.setValue(Long.parseLong(token.image));
-        sequenceParameters.add(parameter);
-    }
-   )
-   |
-   (<K_START> <K_WITH> token=<S_LONG>
-    {
-      parameter = new Sequence.Parameter(Sequence.ParameterType.START_WITH);
-      parameter.setValue(Long.parseLong(token.image));
-      sequenceParameters.add(parameter);
-    }
-   )
-   |
-   (<K_RESTART> [ LOOKAHEAD(2) <K_WITH> token=<S_LONG>]
-    {
-      parameter = new Sequence.Parameter(Sequence.ParameterType.RESTART_WITH);
-      if(token != null){
-        parameter.setValue(Long.parseLong(token.image));
-      }
-      sequenceParameters.add(parameter);
-    }
-   )
-   |
-   (<K_NOMAXVALUE>
-    {
-      parameter = new Sequence.Parameter(Sequence.ParameterType.NOMAXVALUE);
-      sequenceParameters.add(parameter);
-    }
-    |<K_MAXVALUE> token=<S_LONG>
-    {
-      parameter = new Sequence.Parameter(Sequence.ParameterType.MAXVALUE);
-      parameter.setValue(Long.parseLong(token.image));
-      sequenceParameters.add(parameter);
-    }
-   )
-   |
-   (<K_NOMINVALUE>
-    {
-      parameter = new Sequence.Parameter(Sequence.ParameterType.NOMINVALUE);
-      sequenceParameters.add(parameter);
-    }
-    |<K_MINVALUE> token=<S_LONG>
-    {
-      parameter = new Sequence.Parameter(Sequence.ParameterType.MINVALUE);
-      parameter.setValue(Long.parseLong(token.image));
-      sequenceParameters.add(parameter);
-    }
-   )
-   |
-   (<K_NOCYCLE> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOCYCLE)); }
-    |<K_CYCLE> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.CYCLE)); }
-   )
-   |
-   (<K_NOCACHE>
-    {
-      parameter = new Sequence.Parameter(Sequence.ParameterType.NOCACHE);
-      sequenceParameters.add(parameter);
-    }
-   |<K_CACHE> token=<S_LONG>
+    (
+        LOOKAHEAD(2) (
+            (
+                <K_INCREMENT> <K_BY> token=<S_LONG>
+                {
+                    parameter = new Sequence.Parameter(Sequence.ParameterType.INCREMENT_BY);
+                    parameter.setValue(Long.parseLong(token.image));
+                    sequenceParameters.add(parameter);
+                }
+           )
+           |
+           (
+                <K_START> <K_WITH> token=<S_LONG>
+                {
+                    parameter = new Sequence.Parameter(Sequence.ParameterType.START_WITH);
+                    parameter.setValue(Long.parseLong(token.image));
+                    sequenceParameters.add(parameter);
+                }
+            )
+            |
+            (
+                <K_RESTART> [ LOOKAHEAD(2) <K_WITH> token=<S_LONG>]
+                {
+                    parameter = new Sequence.Parameter(Sequence.ParameterType.RESTART_WITH);
+                    if(token != null) {
+                        parameter.setValue(Long.parseLong(token.image));
+                    }
+                    sequenceParameters.add(parameter);
+                }
+            )
+            |
+            <K_NOMAXVALUE>
+            {
+              parameter = new Sequence.Parameter(Sequence.ParameterType.NOMAXVALUE);
+              sequenceParameters.add(parameter);
+            }
+            |
+            <K_MAXVALUE> token=<S_LONG>
+            {
+              parameter = new Sequence.Parameter(Sequence.ParameterType.MAXVALUE);
+              parameter.setValue(Long.parseLong(token.image));
+              sequenceParameters.add(parameter);
+            }
+            |
+            <K_NOMINVALUE>
+            {
+              parameter = new Sequence.Parameter(Sequence.ParameterType.NOMINVALUE);
+              sequenceParameters.add(parameter);
+            }
+            |
+            <K_MINVALUE> token=<S_LONG>
+            {
+              parameter = new Sequence.Parameter(Sequence.ParameterType.MINVALUE);
+              parameter.setValue(Long.parseLong(token.image));
+              sequenceParameters.add(parameter);
+            }
+            |
+            <K_NOCYCLE> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOCYCLE)); }
+            |
+            <K_CYCLE> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.CYCLE)); }
+            |
+            <K_NOCACHE>
+            {
+              parameter = new Sequence.Parameter(Sequence.ParameterType.NOCACHE);
+              sequenceParameters.add(parameter);
+            }
+            |
+            <K_CACHE> token=<S_LONG>
+            {
+              parameter = new Sequence.Parameter(Sequence.ParameterType.CACHE);
+              parameter.setValue(Long.parseLong(token.image));
+              sequenceParameters.add(parameter);
+            }
+            |
+            <K_ORDER> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.ORDER)); }
+            |
+            <K_NOORDER> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOORDER)); }
+            |
+            <K_KEEP> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.KEEP)); }
+            |
+            <K_NOKEEP> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOKEEP)); }
+            |
+            <K_SESSION> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.SESSION)); }
+            |
+            <K_GLOBAL> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.GLOBAL)); }
+        )
+    )*
     {
-      parameter = new Sequence.Parameter(Sequence.ParameterType.CACHE);
-      parameter.setValue(Long.parseLong(token.image));
-      sequenceParameters.add(parameter);
+        return sequenceParameters;
     }
-   )
-   |
-   (<K_ORDER> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.ORDER)); }
-    |<K_NOORDER> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOORDER)); }
-   )
-   |
-   (<K_KEEP> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.KEEP)); }
-    |<K_NOKEEP> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOKEEP)); }
-   )
-   |
-   (<K_SESSION> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.SESSION)); }
-    |<K_GLOBAL> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.GLOBAL)); }
-   )
-  )* //zero or many times those productions
-  {
-    return sequenceParameters;
-  }
 }
 
 CreateSequence CreateSequence():
@@ -8539,6 +10239,43 @@ List<String> captureFunctionBody() {
   return tokens;
 }
 
+/**
+* Reads the tokens of a Postgres dollar quoted string,
+  rebuilding the white space of the text based on each token's position and length
+    1) $$...$$
+    2) $tag$...$tag$
+*/
+
+JAVACODE
+String getQuotedString(String closingQuote, String escapeChar) {
+    StringBuilder buffer = new StringBuilder();
+    Deque<Character> windowQueue = new ArrayDeque<Character>();
+    int delimiterLength = closingQuote.length();
+
+    Token prevToken = null;
+    Token token;
+
+    while (true) {
+        token = getNextToken();
+        if (token.kind == 0) {
+            throw new ParseException("Unterminated quoted string");
+        }
+        appendWhitespaceFromTokenGap(buffer, prevToken, token);
+        appendTokenImageAndTrackDelimiter(buffer, windowQueue, delimiterLength, token.image, closingQuote);
+        if (endsWithDelimiter(windowQueue, closingQuote)) {
+            buffer.setLength(buffer.length() - delimiterLength);
+            return buffer.toString();
+        }
+        prevToken = token;
+    }
+}
+
+JAVACODE
+String getQuotedIdentifier(String openingQuote, String closingQuote, String escapeChar) {
+    return openingQuote + getQuotedString(closingQuote, escapeChar) + closingQuote;
+}
+
+
 JAVACODE
 List<String> captureUnsupportedStatementDeclaration() {
   List<String> tokens = new LinkedList<String>();
@@ -8569,6 +10306,17 @@ String IdentifierChain():
     }
 }
 
+String IdentifierChain2(String identifierChain):
+{
+    String part;
+}
+{
+    ( LOOKAHEAD(2) "." part=RelObjectNameExt2() { identifierChain += "." + part; }  )*
+    {
+        return identifierChain;
+    }
+}
+
 Expression CharacterPrimary():
 {
     Expression expression;
@@ -8607,15 +10355,13 @@ TranscodingFunction TranscodingFunction() #TranscodingFunction :
 {
     <K_CONVERT> "("
     (
-        LOOKAHEAD(ColDataType() ",") (
-            colDataType = ColDataType()
-            "," expression = Expression()
-            [ "," style = <S_LONG> { transcodingName = style.image; } ]
+        LOOKAHEAD(4) colDataType = ColDataType()
+        "," expression = Expression()
+        [ "," style = <S_LONG> { transcodingName = style.image; } ]
 
-            {
-                transcodingFunction = new TranscodingFunction(colDataType, expression, transcodingName);
-            }
-        )
+        {
+            transcodingFunction = new TranscodingFunction(colDataType, expression, transcodingName);
+        }
         |
         (
             expression = Expression()
@@ -8668,3 +10414,166 @@ TrimFunction TrimFunction():
         return new TrimFunction(trimSpecification, expression, fromExpression, usesFrom);
     }
 }
+
+void SnowflakeTimeTravelAt(StringBuilder builder):
+{
+    Expression expression;
+    Token tk;
+}
+{
+    // AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } )
+
+    <K_AT> <OPENING_BRACKET> { builder.append("AT ("); }
+    (
+        //@fixme: this should be TIMESTAMP only but JavaCC-8 has issues with compound tokens!
+        <K_DATETIMELITERAL> "=>" expression = Expression()
+        { builder.append( "TIMESTAMP => ").append(expression.toString()); }
+        |
+        <K_OFFSET> "=>" expression = Expression()
+        { builder.append( "OFFSET => ").append(expression.toString()); }
+        |
+        <K_STATEMENT> "=>" ( tk=<S_CHAR_LITERAL>| tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> )
+        { builder.append( "STATEMENT => ").append(tk.image); }
+        |
+        <K_STREAM> "=>" tk=<S_CHAR_LITERAL>
+        { builder.append( "STREAM => ").append(tk.image); }
+    )
+    <CLOSING_BRACKET> { builder.append(")"); }
+}
+
+
+void SnowflakeTimeTravelBefore(StringBuilder builder):
+{
+    Expression expression;
+    Token tk;
+}
+{
+    // BEFORE( STATEMENT => <id> )
+
+    <K_BEFORE> <OPENING_BRACKET> { builder.append("BEFORE ("); }
+    <K_STATEMENT> "=>" ( tk=<S_CHAR_LITERAL>| tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> )
+    { builder.append( "STATEMENT => ").append(tk.image); }
+    <CLOSING_BRACKET> { builder.append(")"); }
+}
+
+void SnowflakeTimeTravelChange(StringBuilder builder):
+{
+    Expression expression;
+    Token tk;
+}
+{
+    /*
+    CHANGES ( INFORMATION => { DEFAULT | APPEND_ONLY } )
+       AT ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } )
+       |
+       BEFORE ( STATEMENT => <id> )
+       [ END( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
+     */
+
+     <K_CHANGES> <OPENING_BRACKET> <K_INFORMATION> "=>"
+     { builder.append("CHANGES (INFORMATION => ");}
+
+     ( tk = <K_DEFAULT> | tk=<K_APPEND_ONLY>)
+     { builder.append(tk.image); }
+
+     <CLOSING_BRACKET> { builder.append(") "); }
+
+     (
+         SnowflakeTimeTravelAt(builder)
+         |
+         SnowflakeTimeTravelBefore(builder)
+     )
+
+     [
+        LOOKAHEAD(2) <K_END> <OPENING_BRACKET>
+        { builder.append(" END ("); }
+
+        (
+            //@fixme: this should be TIMESTAMP only but JavaCC-8 has issues with compound tokens!
+            <K_DATETIMELITERAL> "=>" expression = Expression()
+            { builder.append( "TIMESTAMP => ").append(expression.toString()); }
+            |
+            <K_OFFSET> "=>" expression = Expression()
+            { builder.append( "OFFSET => ").append(expression.toString()); }
+            |
+            <K_STATEMENT> "=>" ( tk=<S_CHAR_LITERAL>| tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> )
+            { builder.append( "STATEMENT => ").append(tk.image); }
+        )
+
+        <CLOSING_BRACKET> { builder.append(")"); }
+     ]
+}
+
+void DataBricksTemporalSpec(StringBuilder builder):
+{
+    Token tk;
+    Expression expression;
+}
+{
+    /*
+    temporal_spec https://docs.databricks.com/aws/en/sql/language-manual/sql-ref-names#syntax-3
+    {
+      @ timestamp_encoding |
+      @V version |
+      [ FOR ] { SYSTEM_TIMESTAMP | TIMESTAMP } AS OF timestamp_expression |
+      [ FOR ] { SYSTEM_VERSION | VERSION } AS OF version
+    }
+     */
+    (tk=<K_AT_SIGN> | tk=<K_AT_V>)  { builder.append(tk.image).append(" "); }
+    (tk=<S_CHAR_LITERAL> | tk=<S_LONG>) { builder.append(tk.image); }
+    |
+    [ <K_FOR> { builder.append(" FOR"); } ]
+
+    ( tk=<K_SYSTEM_TIMESTAMP> | tk=<K_DATETIMELITERAL> )
+    <K_AS> <K_OF> expression=Expression()
+    { builder.append(" ").append(tk.image).append(" AS OF ").append(expression.toString()); }
+    |
+    (
+        ( tk=<K_SYSTEM_VERSION> | tk= <K_VERSION>) { builder.append(" ").append(tk.image); }
+        <K_AS> <K_OF> (tk=<S_LONG> | tk=<S_CHAR_LITERAL> ) { builder.append(" AS OF ").append(tk.image); }
+    )
+}
+
+void BigQueryHistoricalVersion(StringBuilder builder):
+{
+    Token tk;
+    Expression expression;
+}
+{
+    /*
+    FOR SYSTEM_TIME AS OF timestamp_expression
+     */
+    <K_FOR> <K_SYSTEM_TIME> <K_AS> <K_OF> expression=Expression()
+    { builder.append(" FOR SYSTEM_TIME AS OF ").append(expression.toString()); }
+}
+
+String TimeTravelBeforeAlias():
+{
+    StringBuilder builder = new StringBuilder();
+}
+{
+    (
+        SnowflakeTimeTravelAt(builder)
+        |
+        SnowflakeTimeTravelBefore(builder)
+        |
+        SnowflakeTimeTravelChange(builder)
+        |
+        DataBricksTemporalSpec(builder)
+    )
+
+    {
+        return builder.toString();
+    }
+}
+
+String TimeTravelAfterAlias():
+{
+    StringBuilder builder = new StringBuilder();
+}
+{
+    BigQueryHistoricalVersion(builder)
+    {
+        return builder.toString();
+    }
+}
diff --git a/src/main/resources/rr/xhtml2rst.xsl b/src/main/resources/rr/xhtml2rst.xsl
index 1f4687517..edbc1b4ea 100644
--- a/src/main/resources/rr/xhtml2rst.xsl
+++ b/src/main/resources/rr/xhtml2rst.xsl
@@ -28,18 +28,19 @@
     <xsl:template match="*">
         <xsl:choose>
             <xsl:when test="$withFloatingToc='true'">
-                <xsl:text disable-output-escaping="yes">
-                    .. raw:: html
-
-                    &lt;div id="floating-toc"&gt;
-                    &lt;div class="search-container"&gt;
-                    &lt;input type="button" id="toc-hide-show-btn"&gt;&lt;/input&gt;
-                    &lt;input type="text" id="toc-search" placeholder="Search" /&gt;
-                    &lt;/div&gt;
-                    &lt;ul id="toc-list"&gt;&lt;/ul&gt;
-                    &lt;/div&gt;
-
-                </xsl:text>
+                <xsl:text disable-output-escaping="yes"><![CDATA[
+.. raw:: html
+
+        <div id="floating-toc">
+        <div class="search-container">
+        <input type="button" id="toc-hide-show-btn"></input>
+        <input type="text" id="toc-search" placeholder="Search" />
+        </div>
+        <ul id="toc-list"></ul>
+        </div>
+
+
+]]></xsl:text>
             </xsl:when>
         </xsl:choose>
 
@@ -47,10 +48,9 @@
     </xsl:template>
 
     <xsl:template match="/xhtml:html/xhtml:body">
-        <xsl:text disable-output-escaping="yes">
-            *********************************************************************
-            SQL Syntax
-        </xsl:text>
+        <xsl:text disable-output-escaping="yes"><![CDATA[
+*********************************************************************
+SQL Syntax ]]></xsl:text>
         <xsl:choose>
             <xsl:when test="$isSnapshot='true'">
                 <xsl:text>|JSQLPARSER_SNAPSHOT_VERSION|</xsl:text>
@@ -59,11 +59,10 @@
                 <xsl:text>|JSQLPARSER_VERSION|</xsl:text>
             </xsl:otherwise>
         </xsl:choose>
-        <xsl:text>
-            *********************************************************************
+        <xsl:text><![CDATA[
+*********************************************************************
 
-            The EBNF and Railroad Diagrams for
-        </xsl:text>
+The EBNF and Railroad Diagrams for ]]></xsl:text>
         <xsl:choose>
             <xsl:when test="$isSnapshot='true'">
                 <xsl:text>|JSQLPARSER_SNAPSHOT_VERSION|</xsl:text>
@@ -79,17 +78,16 @@
     </xsl:template>
 
     <xsl:template match="svg:svg[preceding-sibling::*[1]/xhtml:a]">
-        <xsl:text disable-output-escaping="yes">
-            ======================================================================================================================
-        </xsl:text>
-        <xsl:value-of select="translate(preceding-sibling::*[1]/xhtml:a/text(),'\:','')"/>
-        <xsl:text disable-output-escaping="yes">
-            ======================================================================================================================
+        <xsl:text disable-output-escaping="yes"><![CDATA[
+======================================================================================================================
+]]></xsl:text><xsl:value-of select="translate(preceding-sibling::*[1]/xhtml:a/text(),'\:','')"/>
+        <xsl:text disable-output-escaping="yes"><![CDATA[
+======================================================================================================================
 
-        </xsl:text>
+]]></xsl:text>
 
         <xsl:text disable-output-escaping="yes">
-            .. raw:: html
+.. raw:: html
 
         </xsl:text>
 
diff --git a/src/site/sphinx/_static/jmh_results.txt b/src/site/sphinx/_static/jmh_results.txt
new file mode 100644
index 000000000..fac4a571f
--- /dev/null
+++ b/src/site/sphinx/_static/jmh_results.txt
@@ -0,0 +1,25 @@
+-- Optimised LOOKAHEADS (replacing all syntactic lookahead by numeric lookaheads)
+Benchmark                               (version)  Mode  Cnt    Score    Error  Units
+JSQLParserBenchmark.parseSQLStatements     latest  avgt   15  264.132 ±  9.636  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.2  avgt   15  415.744 ± 20.602  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.1  avgt   15   89.387 ±  1.916  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.0  avgt   15   68.810 ±  2.591  ms/op
+JSQLParserBenchmark.parseSQLStatements        4.9  avgt   15   60.515 ±  1.650  ms/op
+JSQLParserBenchmark.parseSQLStatements        4.8  avgt   15   60.002 ±  1.259  ms/op
+JSQLParserBenchmark.parseSQLStatements        4.7  avgt   15   73.291 ±  3.049  ms/op
+
+-- Optimised LOOKAHEADS (replacing huge numeric lookaheads with syntactic lookaheads again)
+Benchmark                               (version)  Mode  Cnt    Score    Error  Units
+JSQLParserBenchmark.parseSQLStatements     latest  avgt   15  249.408 ± 11.340  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.2  avgt   15  388.453 ± 13.149  ms/op
+
+-- Disable `FunctionAllColumns()`
+Benchmark                               (version)  Mode  Cnt    Score   Error  Units
+JSQLParserBenchmark.parseSQLStatements     latest  avgt   30   83.504 ± 1.557  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.2  avgt   30  400.876 ± 8.291  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.1  avgt   30   85.731 ± 1.288  ms/op
+
+-- Token Manipulation
+JSQLParserBenchmark.parseSQLStatements     latest  avgt   30   78.287 ±  4.730  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.2  avgt   30  356.553 ± 24.823  ms/op
+JSQLParserBenchmark.parseSQLStatements        5.1  avgt   30   86.815 ±  1.771  ms/op
\ No newline at end of file
diff --git a/src/site/sphinx/conf.py b/src/site/sphinx/conf.py
index 29ab663cf..99e908d9e 100644
--- a/src/site/sphinx/conf.py
+++ b/src/site/sphinx/conf.py
@@ -4,7 +4,7 @@
 needs_sphinx = '1.0'
 add_function_parentheses = True
 
-extensions = ['myst_parser', 'sphinx.ext.autodoc', 'sphinx.ext.autosectionlabel', 'sphinx.ext.extlinks', 'sphinx-prompt', 'sphinx_substitution_extensions', 'sphinx_inline_tabs', 'pygments.sphinxext', ]
+extensions = ['myst_parser', 'sphinx.ext.autodoc', 'sphinx.ext.autosectionlabel', 'sphinx.ext.extlinks', 'sphinx_substitution_extensions', 'sphinx_inline_tabs', 'pygments.sphinxext', ]
 
 issues_github_path = "JSQLParser/JSqlParser"
 
diff --git a/src/site/sphinx/contribution.rst b/src/site/sphinx/contribution.rst
index bfb3b3571..9793e8947 100644
--- a/src/site/sphinx/contribution.rst
+++ b/src/site/sphinx/contribution.rst
@@ -77,7 +77,22 @@ The JSQLParser is generated by ``JavaCC`` based on the provided Grammar. The Gra
 
                   mvn verify
 
-   7) Create your `GitHub Pull Request <https://www.youtube.com/watch?v=nCKdihvneS0>`_
+   7) Verify the performance and avoid any deterioration
+
+      .. code-block:: shell
+          :caption: Gradle `check` Task
+
+              gradle jmh
+
+      .. code-block:: text
+                :caption: JMH performance results
+
+                    Benchmark                               (version)  Mode  Cnt    Score   Error  Units
+                    JSQLParserBenchmark.parseSQLStatements     latest  avgt   30   83.504 ± 1.557  ms/op
+                    JSQLParserBenchmark.parseSQLStatements        5.2  avgt   30  400.876 ± 8.291  ms/op
+                    JSQLParserBenchmark.parseSQLStatements        5.1  avgt   30   85.731 ± 1.288  ms/op
+
+   8) Create your `GitHub Pull Request <https://www.youtube.com/watch?v=nCKdihvneS0>`_
 
 Manage Reserved Keywords
 ------------------------------
diff --git a/src/site/sphinx/index.rst b/src/site/sphinx/index.rst
index e28a57192..d8d4bfbde 100644
--- a/src/site/sphinx/index.rst
+++ b/src/site/sphinx/index.rst
@@ -34,9 +34,9 @@ Java SQL Parser Library
     :alt: Maven Badge
     :target: https://mvnrepository.com/artifact/com.github.jsqlparser/jsqlparser
 
-.. image:: https://github.com/JSQLParser/JSqlParser/actions/workflows/maven.yml/badge.svg
-    :alt: Maven Build Status
-    :target: https://github.com/JSQLParser/JSqlParser/actions/workflows/maven.yml
+.. image:: https://github.com/JSQLParser/JSqlParser/actions/workflows/ci.yml/badge.svg
+    :alt: CI Status
+    :target: https://github.com/JSQLParser/JSqlParser/actions/workflows/ci.yml
 
 .. image:: https://coveralls.io/repos/JSQLParser/JSqlParser/badge.svg?branch=master
     :alt: Coverage Status
@@ -50,9 +50,10 @@ Java SQL Parser Library
     :alt: Java Docs
     :target: https://javadoc.io/doc/com.github.jsqlparser/jsqlparser/latest/index.html
 
+A huge thank you to our sponsor, `Starlake.ai <https://starlake.ai/>`_ who simplifies data ingestion, transformation, and orchestration, enabling faster delivery of high-quality data. Starlake has been instrumental in providing Piped SQL and numerous test cases for BigQuery, Redshift, DataBricks, and DuckDB. Show your support for ongoing development by visiting Starlake.ai and giving us a star!
 
 **JSQLParser** is a SQL statement parser built from JavaCC. It translates SQLs in a traversable hierarchy of Java classes.
-The upcoming 5.0 release will depend on Java 11 and introduces new Visitors. Please see the :ref:`Migration to 5.0` guide.
+Since the 5.0 release JSQLParser depends on Java 11 and has introduced new Visitors. Please see the :ref:`Migration to 5.0` guide.
 
 Latest stable release: |JSQLPARSER_STABLE_VERSION_LINK|
 
@@ -89,6 +90,11 @@ SQL Dialects
     * MySQL and MariaDB
     * PostgreSQL
     * H2
+    * DuckDB
+    * Google BigQuery
+    * Amazon Redshift
+    * DataBricks
+    * Snowflake
 
 *******************************
 Features
@@ -107,6 +113,7 @@ Features
     * Arrays vs. T-SQL Squared Bracket Quotes
     * Fluent API to create SQL Statements from java Code
     * Statement De-Parser to write SQL from Java Objects
+    * Piped SQL (also known as FROM SQL)
 
 
 
diff --git a/src/site/sphinx/keywords.rst b/src/site/sphinx/keywords.rst
index 616fe3148..933cba664 100644
--- a/src/site/sphinx/keywords.rst
+++ b/src/site/sphinx/keywords.rst
@@ -29,6 +29,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
 +----------------------+-------------+-----------+
 | CONNECT_BY_ROOT      | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| CSV                  | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | PRIOR                | Yes         | Yes       | 
 +----------------------+-------------+-----------+
 | CONSTRAINT           | Yes         | Yes       | 
@@ -43,10 +45,14 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
 +----------------------+-------------+-----------+
 | DISTINCT             | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| DISTINCTROW          | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | DOUBLE               | Yes         |           | 
 +----------------------+-------------+-----------+
 | ELSE                 | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| ERRORS               | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | EXCEPT               | Yes         | Yes       | 
 +----------------------+-------------+-----------+
 | EXCLUDES             | Yes         | Yes       | 
@@ -57,8 +63,12 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
 +----------------------+-------------+-----------+
 | FALSE                | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| FBV                  | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | FETCH                | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| FILE                 | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | FINAL                | Yes         | Yes       | 
 +----------------------+-------------+-----------+
 | FOR                  | Yes         | Yes       | 
@@ -89,6 +99,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
 +----------------------+-------------+-----------+
 | ILIKE                | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| IMPORT               | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | IN                   | Yes         | Yes       | 
 +----------------------+-------------+-----------+
 | INCLUDES             | Yes         | Yes       | 
@@ -159,6 +171,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
 +----------------------+-------------+-----------+
 | SAMPLE               | Yes         |           | 
 +----------------------+-------------+-----------+
+| SCRIPT               | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | SEL                  | Yes         |           | 
 +----------------------+-------------+-----------+
 | SELECT               | Yes         |           | 
@@ -171,6 +185,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
 +----------------------+-------------+-----------+
 | START                | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| STATEMENT            | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | TABLES               | Yes         |           | 
 +----------------------+-------------+-----------+
 | TOP                  | Yes         | Yes       | 
@@ -185,6 +201,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
 +----------------------+-------------+-----------+
 | UNIQUE               | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| UNKNOWN              | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | UNPIVOT              | Yes         | Yes       | 
 +----------------------+-------------+-----------+
 | USE                  | Yes         | Yes       | 
@@ -207,6 +225,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
 +----------------------+-------------+-----------+
 | VARYING              | Yes         | Yes       | 
 +----------------------+-------------+-----------+
+| VERIFY               | Yes         | Yes       | 
++----------------------+-------------+-----------+
 | WHEN                 | Yes         | Yes       | 
 +----------------------+-------------+-----------+
 | WHERE                | Yes         | Yes       | 
diff --git a/src/site/sphinx/usage.rst b/src/site/sphinx/usage.rst
index 4fe0e3b22..9b02fd656 100644
--- a/src/site/sphinx/usage.rst
+++ b/src/site/sphinx/usage.rst
@@ -18,7 +18,7 @@ How to use it
 Compile from Source Code
 ==============================
 
-You will need to have ``JDK 8`` or ``JDK 11`` installed. Please note that JSQLParser-4.9 is the last ``JDK 8`` compatible release and all development after will depend on ``JDK 11``.
+You will need to have ``JDK 8`` or ``JDK 11`` installed. Please note that JSQLParser-4.9 is the last ``JDK 8`` compatible release and all development after will depend on ``JDK 11``. Building JSQLParser-5.1 and newer with Gradle will depend on a JDK17 toolchain due to the used plugins.
 
 .. tab:: Maven
 
diff --git a/src/test/java/net/sf/jsqlparser/benchmark/DynamicParserRunner.java b/src/test/java/net/sf/jsqlparser/benchmark/DynamicParserRunner.java
new file mode 100644
index 000000000..f87acd119
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/benchmark/DynamicParserRunner.java
@@ -0,0 +1,40 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.benchmark;
+
+import net.sf.jsqlparser.parser.CCJSqlParser;
+import net.sf.jsqlparser.statement.Statements;
+
+import java.lang.reflect.Method;
+import java.net.URLClassLoader;
+import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
+
+public class DynamicParserRunner implements SqlParserRunner {
+    private final Method parseStatementsMethod;
+
+    public DynamicParserRunner(URLClassLoader loader) throws Exception {
+        Class<?> utilClass = loader.loadClass("net.sf.jsqlparser.parser.CCJSqlParserUtil");
+        Class<?> ccjClass = loader.loadClass("net.sf.jsqlparser.parser.CCJSqlParser");
+        Class<?> consumerClass = Class.forName("java.util.function.Consumer"); // interface OK
+        parseStatementsMethod = utilClass.getMethod(
+                "parseStatements",
+                String.class,
+                ExecutorService.class,
+                consumerClass);
+    }
+
+    @Override
+    public Statements parseStatements(String sql,
+            ExecutorService executorService,
+            Consumer<CCJSqlParser> consumer) throws Exception {
+        return (Statements) parseStatementsMethod.invoke(null, sql, executorService, null);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/benchmark/JSQLParserBenchmark.java b/src/test/java/net/sf/jsqlparser/benchmark/JSQLParserBenchmark.java
new file mode 100644
index 000000000..abe61a804
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/benchmark/JSQLParserBenchmark.java
@@ -0,0 +1,101 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.benchmark;
+
+import net.sf.jsqlparser.parser.CCJSqlParser;
+import net.sf.jsqlparser.statement.Statements;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.infra.Blackhole;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.*;
+import java.util.concurrent.*;
+import java.util.function.Consumer;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@State(Scope.Benchmark)
+public class JSQLParserBenchmark {
+
+    private String sqlContent;
+    private ExecutorService executorService;
+
+    SqlParserRunner runner;
+
+    // @Param({ "latest", "5.2", "5.1", "5.0", "4.9", "4.8", "4.7", "4.6", "4.5" })
+    @Param({"latest", "5.3", "5.1"})
+    public String version;
+
+    @Setup(Level.Trial)
+    public void setup() throws Exception {
+        if ("latest".equals(version)) {
+            runner = new LatestClasspathRunner(); // direct call, no reflection
+        } else {
+            Path jarPath = downloadJsqlparserJar(version);
+            URLClassLoader loader = new URLClassLoader(new URL[] {jarPath.toUri().toURL()}, null);
+            runner = new DynamicParserRunner(loader);
+        }
+
+        // Adjust path as necessary based on where source root is during test execution
+        Path path = Paths.get("src/test/resources/net/sf/jsqlparser/performance.sql");
+        sqlContent = Files.readString(path, StandardCharsets.UTF_8);
+        executorService = Executors.newSingleThreadExecutor();
+    }
+
+    private Path downloadJsqlparserJar(String version) throws IOException {
+        String jarUrl = String.format(
+                "https://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/%s/jsqlparser-%s.jar",
+                version, version);
+
+        Path cacheDir = Paths.get("build/libs/downloaded-jars");
+        Files.createDirectories(cacheDir);
+        Path jarFile = cacheDir.resolve("jsqlparser-" + version + ".jar");
+
+        if (!Files.exists(jarFile)) {
+            System.out.println("Downloading " + version);
+            try (InputStream in = new URL(jarUrl).openStream()) {
+                Files.copy(in, jarFile);
+            }
+        }
+
+        return jarFile;
+    }
+
+    @Benchmark
+    public void parseSQLStatements(Blackhole blackhole) throws Exception {
+        final Statements statements = runner.parseStatements(
+                sqlContent,
+                executorService,
+                (Consumer<CCJSqlParser>) parser -> parser.withAllowComplexParsing(false));
+        blackhole.consume(statements);
+    }
+
+    // @Benchmark
+    public void parseQuotedText(Blackhole blackhole) throws Exception {
+        String sqlStr = "SELECT ('\\'', 'a');\n"
+                + "INSERT INTO recycle_record (a,f) VALUES ('\\'anything', 'abc');\n"
+                + "INSERT INTO recycle_record (a,f) VALUES ('\\'','83653692186728700711687663398101');\n";
+
+        final Statements statements = runner.parseStatements(
+                sqlStr,
+                executorService,
+                (Consumer<CCJSqlParser>) parser -> parser.withBackslashEscapeCharacter(true));
+        blackhole.consume(statements);
+    }
+
+    @TearDown(Level.Trial)
+    public void tearDown() {
+        executorService.shutdown();
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/benchmark/LatestClasspathRunner.java b/src/test/java/net/sf/jsqlparser/benchmark/LatestClasspathRunner.java
new file mode 100644
index 000000000..5f70cf878
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/benchmark/LatestClasspathRunner.java
@@ -0,0 +1,28 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.benchmark;
+
+import net.sf.jsqlparser.parser.CCJSqlParser;
+import net.sf.jsqlparser.statement.Statements;
+
+import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
+
+public class LatestClasspathRunner implements SqlParserRunner {
+
+    @Override
+    public Statements parseStatements(String sql,
+            ExecutorService executorService,
+            Consumer<CCJSqlParser> consumer) throws Exception {
+        return net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(sql, executorService,
+                consumer);
+    }
+}
+
diff --git a/src/test/java/net/sf/jsqlparser/benchmark/SqlParserRunner.java b/src/test/java/net/sf/jsqlparser/benchmark/SqlParserRunner.java
new file mode 100644
index 000000000..00496ad68
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/benchmark/SqlParserRunner.java
@@ -0,0 +1,21 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.benchmark;
+
+import net.sf.jsqlparser.parser.CCJSqlParser;
+import net.sf.jsqlparser.statement.Statements;
+
+import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
+
+public interface SqlParserRunner {
+    Statements parseStatements(String sql, ExecutorService executorService,
+            Consumer<CCJSqlParser> consumer) throws Exception;
+}
diff --git a/src/test/java/net/sf/jsqlparser/expression/CastExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/CastExpressionTest.java
index 806b6764a..f4e17c136 100644
--- a/src/test/java/net/sf/jsqlparser/expression/CastExpressionTest.java
+++ b/src/test/java/net/sf/jsqlparser/expression/CastExpressionTest.java
@@ -104,4 +104,14 @@ void testParenthesisCastIssue1997() throws JSQLParserException {
         sqlStr = "SELECT ((foo)::text = ANY((((ARRAY['bar'])))::text[]))";
         assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
+
+    @Test
+    void testDateTimeCast() throws JSQLParserException {
+        String sqlStr = "SELECT\n"
+                + "  TIME(15, 30, 00) as time_hms,\n"
+                + "  TIME(DATETIME '2008-12-25 15:30:00') AS time_dt,\n"
+                + "  TIME(TIMESTAMP '2008-12-25 15:30:00+08', 'America/Los_Angeles')\n"
+                + "as time_tstz;";
+        assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/expression/FunctionTest.java b/src/test/java/net/sf/jsqlparser/expression/FunctionTest.java
index 0433222d3..f977d558d 100644
--- a/src/test/java/net/sf/jsqlparser/expression/FunctionTest.java
+++ b/src/test/java/net/sf/jsqlparser/expression/FunctionTest.java
@@ -108,4 +108,22 @@ void testSimpleFunctionIssue2059() throws JSQLParserException {
     void testListAggOnOverflow(String sqlStr) throws Exception {
         TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "select RTRIM('string')",
+            "select LTRIM('string')",
+            "select RTRIM(field) from dual",
+            "select LTRIM(field) from dual"
+    })
+    void testTrimFunctions(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @Test
+    void TestIntervalParameterIssue2272() throws JSQLParserException {
+        String sqlStr =
+                "SELECT DATE_SUB('2025-06-19', INTERVAL QUARTER(STR_TO_DATE('20250619', '%Y%m%d')) - 1 QUARTER) from dual";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/expression/IntervalExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/IntervalExpressionTest.java
new file mode 100644
index 000000000..30645789f
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/expression/IntervalExpressionTest.java
@@ -0,0 +1,27 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.expression;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+
+class IntervalExpressionTest {
+
+    @Test
+    void testExtractExpressionIssue2172() throws JSQLParserException {
+        String sqlStr = "select INTERVAL Extract( DAY from Now()) - 1 DAY";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        sqlStr = "SELECT UNIX_TIMESTAMP(date_sub(date_sub(date_format(now(),'%y-%m-%d'),interval extract(day from now())-1 day),interval 1 month))*1000";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/expression/JsonExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/JsonExpressionTest.java
index cb4e92ac6..c29af21f9 100644
--- a/src/test/java/net/sf/jsqlparser/expression/JsonExpressionTest.java
+++ b/src/test/java/net/sf/jsqlparser/expression/JsonExpressionTest.java
@@ -149,4 +149,33 @@ void testParenthesedJsonExpressionsIssue1792() throws JSQLParserException {
     void testIssue2054(String sqlStr) throws JSQLParserException {
         assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
+
+    @Test
+    void testIssue2181() throws JSQLParserException {
+        String sqlStr =
+                "SELECT\n" +
+                        "  1\n" +
+                        "FROM\n" +
+                        "  public.tbl\n" +
+                        "WHERE\n" +
+                        "  fieldd ->> 'att1' = 1\n" +
+                        "  OR fieldd ->> 'att1' = 1\n" +
+                        "  OR fieldd ->> 'att1' = 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "  OR fieldd::jsonb -> 'att2' @> 1\n" +
+                        "ORDER BY\n" +
+                        "  att ASC\n" +
+                        "LIMIT\n" +
+                        "  1";
+        assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/expression/OracleHierarchicalExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/OracleHierarchicalExpressionTest.java
new file mode 100644
index 000000000..2e17ad1f0
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/expression/OracleHierarchicalExpressionTest.java
@@ -0,0 +1,24 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.expression;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+class OracleHierarchicalExpressionTest {
+
+    @Test
+    void testIssue2231() throws JSQLParserException {
+        String sqlString =
+                "select name from product where level > 1 start with 1 = 1 or 1 = 2 connect by nextversion = prior activeversion";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlString, true);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/expression/StringValueTest.java b/src/test/java/net/sf/jsqlparser/expression/StringValueTest.java
index 062f131aa..75f30b365 100644
--- a/src/test/java/net/sf/jsqlparser/expression/StringValueTest.java
+++ b/src/test/java/net/sf/jsqlparser/expression/StringValueTest.java
@@ -10,7 +10,9 @@
 package net.sf.jsqlparser.expression;
 
 import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -93,4 +95,12 @@ public void testParseInput_BYTEA() throws Exception {
         String sqlStr = "VALUES (X'', X'01FF', X'01 bc 2a', X'01' '02')";
         TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
+
+    @Test
+    void testDollarQuotesIssue2267() throws JSQLParserException {
+        String sqlStr = "SELECT $$this is a string$$, test, 'text' FROM tbl;";
+        PlainSelect select = (PlainSelect) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        Assertions.assertInstanceOf(StringValue.class, select.getSelectItem(0).getExpression());
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/expression/operators/relational/BetweenTest.java b/src/test/java/net/sf/jsqlparser/expression/operators/relational/BetweenTest.java
index 56f2f44df..4fd8fd706 100644
--- a/src/test/java/net/sf/jsqlparser/expression/operators/relational/BetweenTest.java
+++ b/src/test/java/net/sf/jsqlparser/expression/operators/relational/BetweenTest.java
@@ -10,7 +10,9 @@
 package net.sf.jsqlparser.expression.operators.relational;
 
 import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.*;
@@ -22,4 +24,30 @@ void testBetweenWithAdditionIssue1948() throws JSQLParserException {
                 "select col FROM tbl WHERE start_time BETWEEN 1706024185 AND MyFunc() - 734400";
         TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
+
+    @Test
+    void testBetweenSymmetricIssue2250() throws JSQLParserException {
+        String sqlStr =
+                "SELECT *\n"
+                        + "FROM orders\n"
+                        + "WHERE 100 BETWEEN SYMMETRIC total_price AND discount_price;\n";
+        PlainSelect select = (PlainSelect) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+        Between between = (Between) select.getWhere();
+
+        Assertions.assertTrue(between.isUsingSymmetric());
+        Assertions.assertFalse(between.isUsingAsymmetric());
+    }
+
+    @Test
+    void testBetweenASymmetricIssue2250() throws JSQLParserException {
+        String sqlStr =
+                "SELECT *\n"
+                        + "FROM orders\n"
+                        + "WHERE 100 BETWEEN ASYMMETRIC total_price AND discount_price;\n";
+        PlainSelect select = (PlainSelect) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+        Between between = (Between) select.getWhere();
+
+        Assertions.assertFalse(between.isUsingSymmetric());
+        Assertions.assertTrue(between.isUsingAsymmetric());
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/expression/operators/relational/InExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/operators/relational/InExpressionTest.java
index ac1e2a0cf..8698b02be 100644
--- a/src/test/java/net/sf/jsqlparser/expression/operators/relational/InExpressionTest.java
+++ b/src/test/java/net/sf/jsqlparser/expression/operators/relational/InExpressionTest.java
@@ -10,7 +10,10 @@
 package net.sf.jsqlparser.expression.operators.relational;
 
 import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
+import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.*;
@@ -30,4 +33,12 @@ void testOracleInWithBrackets() throws JSQLParserException {
         TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
 
+    @Test
+    void testPrecedenceIssue2244() throws JSQLParserException {
+        String sqlStr = "select * from `T_DEMO` where a in (1,3,2) or b = 2";
+        PlainSelect select = (PlainSelect) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        Assertions.assertInstanceOf(OrExpression.class, select.getWhere());
+    }
+
 }
diff --git a/src/test/java/net/sf/jsqlparser/expression/operators/relational/IsUnknownExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/operators/relational/IsUnknownExpressionTest.java
new file mode 100644
index 000000000..322842395
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/expression/operators/relational/IsUnknownExpressionTest.java
@@ -0,0 +1,47 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2023 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.expression.operators.relational;
+
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+
+class IsUnknownExpressionTest {
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "SELECT * FROM mytable WHERE 1 IS UNKNOWN",
+            "SELECT * FROM mytable WHERE 1 IS NOT UNKNOWN",
+    })
+    public void testIsUnknownExpression(String sqlStr) {
+        assertDoesNotThrow(() -> TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr));
+    }
+
+    @Test
+    void testStringConstructor() {
+        Column column = new Column("x");
+
+        IsUnknownExpression defaultIsUnknownExpression =
+                new IsUnknownExpression().withLeftExpression(column);
+        TestUtils.assertExpressionCanBeDeparsedAs(defaultIsUnknownExpression, "x IS UNKNOWN");
+
+        IsUnknownExpression isUnknownExpression =
+                new IsUnknownExpression().withLeftExpression(column).withNot(false);
+        TestUtils.assertExpressionCanBeDeparsedAs(isUnknownExpression, "x IS UNKNOWN");
+
+        IsUnknownExpression isNotUnknownExpression =
+                new IsUnknownExpression().withLeftExpression(column).withNot(true);
+        TestUtils.assertExpressionCanBeDeparsedAs(isNotUnknownExpression, "x IS NOT UNKNOWN");
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/parser/ASTNodeAccessImplTest.java b/src/test/java/net/sf/jsqlparser/parser/ASTNodeAccessImplTest.java
index e9f757e4e..088eb699b 100644
--- a/src/test/java/net/sf/jsqlparser/parser/ASTNodeAccessImplTest.java
+++ b/src/test/java/net/sf/jsqlparser/parser/ASTNodeAccessImplTest.java
@@ -11,9 +11,11 @@
 
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.expression.AnalyticExpression;
+import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.statement.select.Select;
 import net.sf.jsqlparser.statement.select.SelectItem;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -33,4 +35,25 @@ void testGetParent() throws JSQLParserException {
         assertInstanceOf(SelectItem.class, expression.getParent());
         assertEquals(select, expression.getParent(Select.class));
     }
+
+    @Test
+    void testGetWherePositionIssue1339() throws JSQLParserException {
+        // WHERE expression at line 4 column 7
+        String sqlStr = "select listagg(sellerid)\n"
+                + "within group (order by sellerid)\n"
+                + "over() AS list from winsales\n"
+                + "WHERE a=b\n"
+                + "ORDER BY 1;";
+        PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(sqlStr);
+        Expression whereExpression = select.getWhere();
+
+        final Node node = whereExpression.getASTNode();
+        if (node != null) {
+            Token token = node.jjtGetFirstToken();
+            Assertions.assertEquals(4, token.beginLine);
+            Assertions.assertEquals(7, token.beginColumn);
+        } else {
+            throw new RuntimeException("Node not found.");
+        }
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/parser/ParserKeywordsUtilsTest.java b/src/test/java/net/sf/jsqlparser/parser/ParserKeywordsUtilsTest.java
index 2c531e9e9..8acdee50e 100644
--- a/src/test/java/net/sf/jsqlparser/parser/ParserKeywordsUtilsTest.java
+++ b/src/test/java/net/sf/jsqlparser/parser/ParserKeywordsUtilsTest.java
@@ -9,11 +9,8 @@
  */
 package net.sf.jsqlparser.parser;
 
-import net.sf.jsqlparser.JSQLParserException;
-import net.sf.jsqlparser.test.TestUtils;
 import org.javacc.jjtree.JJTree;
-import org.javacc.parser.JavaCCErrors;
-import org.javacc.parser.JavaCCGlobals;
+import org.javacc.parser.Context;
 import org.javacc.parser.JavaCCParser;
 import org.javacc.parser.RCharacterList;
 import org.javacc.parser.RChoice;
@@ -141,21 +138,22 @@ public static TreeSet<String> getAllKeywordsUsingJavaCC(File file) throws Except
         Path jjGrammarOutputDir = Files.createTempDirectory("jjgrammer");
 
         new JJTree().main(new String[] {
-                "-JDK_VERSION=1.8",
-                "-OUTPUT_DIRECTORY=" + jjGrammarOutputDir.toString(),
+                "-JJTREE_OUTPUT_DIRECTORY=" + jjGrammarOutputDir.toString(),
+                "-CODE_GENERATOR=java",
                 jjtGrammar.toString()
         });
         Path jjGrammarFile = jjGrammarOutputDir.resolve("JSqlParserCC.jj");
 
+        Context context = new Context();
         JavaCCParser parser = new JavaCCParser(new java.io.FileInputStream(jjGrammarFile.toFile()));
-        parser.javacc_input();
+        parser.javacc_input(context);
 
         // needed for filling JavaCCGlobals
-        JavaCCErrors.reInit();
-        Semanticize.start();
+        // JavaCCErrors.reInit();
+        Semanticize.start(context);
 
         // read all the Token and get the String image
-        for (Map.Entry<Integer, RegularExpression> item : JavaCCGlobals.rexps_of_tokens
+        for (Map.Entry<Integer, RegularExpression> item : context.globals().rexps_of_tokens
                 .entrySet()) {
             addTokenImage(allKeywords, item.getValue());
         }
@@ -205,9 +203,4 @@ void compareKeywordLists() throws Exception {
         }
     }
 
-    @Test
-    void testBase64() throws JSQLParserException {
-        String sqlStr = "SELECT base64('Spark SQL') AS b;";
-        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
-    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/schema/TableTest.java b/src/test/java/net/sf/jsqlparser/schema/TableTest.java
index 0f9ff2071..0f5a5bf98 100644
--- a/src/test/java/net/sf/jsqlparser/schema/TableTest.java
+++ b/src/test/java/net/sf/jsqlparser/schema/TableTest.java
@@ -15,6 +15,7 @@
 import net.sf.jsqlparser.statement.select.Select;
 import net.sf.jsqlparser.util.deparser.ExpressionDeParser;
 import net.sf.jsqlparser.util.deparser.SelectDeParser;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
@@ -59,10 +60,8 @@ public void tableSetDatabaseIssue812() throws JSQLParserException {
         SelectDeParser deparser = new SelectDeParser(expressionDeParser, buffer) {
 
             @Override
-            public <S> StringBuilder visit(Table tableName, S parameters) {
-                System.out.println(tableName);
-                tableName.setDatabase(database); // Exception
-                System.out.println(tableName.getDatabase());
+            public <S> StringBuilder visit(Table table, S parameters) {
+                table.setDatabase(database); // Exception
                 return null;
             }
         };
@@ -112,4 +111,13 @@ void testBigQueryFullQuotedName() throws JSQLParserException {
         assertEquals("s", table.getUnquotedSchemaName());
         assertEquals("t", table.getUnquotedName());
     }
+
+    @Test
+    void testClone() {
+        Table t = new Table("a.b.c");
+        t.setResolvedTable(t);
+
+        Assertions.assertNotSame(t.clone(), t);
+        Assertions.assertNotEquals(t.clone(), t);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/SerializationTest.java b/src/test/java/net/sf/jsqlparser/statement/SerializationTest.java
new file mode 100644
index 000000000..f5cfad0f6
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/SerializationTest.java
@@ -0,0 +1,52 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+public class SerializationTest {
+    @Test
+    void serializeWithItem() throws JSQLParserException, IOException, ClassNotFoundException {
+        String sqlStr =
+                "with sample_data(day, value) as (values ((0, 13), (1, 12), (2, 15), (3, 4), (4, 8), (5, 16))), test2 as (values (1,2,3)) \n"
+                        + "select day, value from sample_data as a";
+
+        // Parse the SQL string into a PlainSelect object
+        PlainSelect originalSelect = (PlainSelect) CCJSqlParserUtil.parse(sqlStr);
+
+        // Serialize the object to a byte array
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        try (ObjectOutputStream out = new ObjectOutputStream(byteArrayOutputStream)) {
+            out.writeObject(originalSelect);
+        }
+
+        // Deserialize the object from the byte array
+        PlainSelect deserializedSelect;
+        try (ObjectInputStream in = new ObjectInputStream(
+                new ByteArrayInputStream(byteArrayOutputStream.toByteArray()))) {
+            deserializedSelect = (PlainSelect) in.readObject();
+        }
+
+        // Verify that the original and deserialized objects are equal
+        Assertions.assertEquals(originalSelect.toString(), deserializedSelect.toString(),
+                "The deserialized object should be equal to the original");
+    }
+
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/SessionStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/SessionStatementTest.java
new file mode 100644
index 000000000..48c679bb3
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/SessionStatementTest.java
@@ -0,0 +1,32 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+class SessionStatementTest {
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "SESSION START 1234", "SESSION START", "SESSION APPLY 'test'", "SESSION APPLY",
+            "SESSION DROP \"test\"", "SESSION DROP", "SESSION SHOW test", "SESSION SHOW",
+            "SESSION DESCRIBE 1234", "SESSION DESCRIBE"
+    })
+    void testStartSession(String sqlStr) throws JSQLParserException {
+        SessionStatement sessionStatement =
+                (SessionStatement) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+        Assertions.assertInstanceOf(SessionStatement.Action.class, sessionStatement.getAction());
+    }
+
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java
index 3089d3ef1..d2619c50a 100644
--- a/src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java
@@ -67,14 +67,14 @@ public void testValueOnIssue927() throws JSQLParserException {
     @Test
     public void testObject() {
         SetStatement setStatement = new SetStatement();
-        setStatement.add("standard_conforming_strings", new ExpressionList(new StringValue("ON")),
+        setStatement.add("standard_conforming_strings", new ExpressionList<>(new StringValue("ON")),
                 false);
         setStatement.withUseEqual(0, true).remove(0);
 
         assertEquals(0, setStatement.getCount());
 
         setStatement.addKeyValuePairs(
-                new SetStatement.NameExpr("test", new ExpressionList(new StringValue("1")), false));
+                new SetStatement.NameExpr("test", new ExpressionList<>(new StringValue("1")), false));
         setStatement.getKeyValuePairs().get(0).setUseEqual(true);
 
         assertEquals("test", setStatement.getKeyValuePairs().get(0).getName());
diff --git a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java
index 28af60b71..559517b9d 100644
--- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java
@@ -9,6 +9,22 @@
  */
 package net.sf.jsqlparser.statement.alter;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.expression.StringValue;
 import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
@@ -21,20 +37,16 @@
 import net.sf.jsqlparser.statement.Statement;
 import net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDataType;
 import net.sf.jsqlparser.statement.create.index.CreateIndex;
-import net.sf.jsqlparser.statement.create.table.*;
+import net.sf.jsqlparser.statement.create.table.CheckConstraint;
+import net.sf.jsqlparser.statement.create.table.ForeignKeyIndex;
+import net.sf.jsqlparser.statement.create.table.Index;
 import net.sf.jsqlparser.statement.create.table.Index.ColumnParams;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Stream;
-
-import static net.sf.jsqlparser.test.TestUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
+import net.sf.jsqlparser.statement.create.table.NamedConstraint;
+import net.sf.jsqlparser.statement.create.table.PartitionDefinition;
+import static net.sf.jsqlparser.test.TestUtils.assertDeparse;
+import static net.sf.jsqlparser.test.TestUtils.assertEqualsObjectTree;
+import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
+import static net.sf.jsqlparser.test.TestUtils.assertStatementCanBeDeparsedAs;
 
 public class AlterTest {
 
@@ -82,7 +94,6 @@ public void testAlterTableAddColumn_ColumnKeyWordImplicit() throws JSQLParserExc
         assertEquals("varchar (255)", colDataTypes.get(0).getColDataType().toString());
     }
 
-
     @Test
     public void testAlterTableBackBrackets() throws JSQLParserException {
         String sql = "ALTER TABLE tablename add column (field  string comment 'aaaaa')";
@@ -96,7 +107,6 @@ public void testAlterTableBackBrackets() throws JSQLParserException {
         assertEquals("tablename", alter2.getTable().toString());
     }
 
-
     @Test
     public void testAlterTableIssue1815() throws JSQLParserException {
         // MySQL: see https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
@@ -620,6 +630,19 @@ public void testAlterTableRenameColumn() throws JSQLParserException {
         assertSqlCanBeParsedAndDeparsed(sql);
     }
 
+    @Test
+    public void testAlterTableRenameColumn2() throws JSQLParserException {
+        // Additional test case: Renaming column from 'name' to 'full_name'
+        String sql = "ALTER TABLE test_table RENAME COLUMN name TO full_name";
+        assertSqlCanBeParsedAndDeparsed(sql);
+
+        Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
+        AlterExpression expression = alter.getAlterExpressions().get(0);
+        assertEquals(expression.getOperation(), AlterOperation.RENAME);
+        assertEquals(expression.getColOldName(), "name");
+        assertEquals(expression.getColumnName(), "full_name");
+    }
+
     @Test
     public void testAlterTableForeignKeyIssue981() throws JSQLParserException {
         assertSqlCanBeParsedAndDeparsed(
@@ -1060,6 +1083,49 @@ public void testIssue2027() throws JSQLParserException {
         assertSqlCanBeParsedAndDeparsed(sqlLongText);
     }
 
+    @Test
+    public void testAlterTableCollate() throws JSQLParserException {
+        // Case 1: Without DEFAULT and without =
+        String sql = "ALTER TABLE tbl_name COLLATE collation_name";
+
+        Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
+        AlterExpression expression = alter.getAlterExpressions().get(0);
+        assertEquals(expression.getOperation(), AlterOperation.COLLATE);
+        assertEquals(expression.getCollation(), "collation_name");
+        assertFalse(expression.isDefaultCollateSpecified());
+        assertSqlCanBeParsedAndDeparsed(sql);
+
+        // Case 2: Without DEFAULT and with =
+        sql = "ALTER TABLE tbl_name COLLATE = collation_name";
+
+        alter = (Alter) CCJSqlParserUtil.parse(sql);
+        expression = alter.getAlterExpressions().get(0);
+        assertEquals(expression.getOperation(), AlterOperation.COLLATE);
+        assertEquals(expression.getCollation(), "collation_name");
+        assertFalse(expression.isDefaultCollateSpecified());
+        assertSqlCanBeParsedAndDeparsed(sql);
+
+        // Case 3: With DEFAULT and without =
+        sql = "ALTER TABLE tbl_name DEFAULT COLLATE collation_name";
+
+        alter = (Alter) CCJSqlParserUtil.parse(sql);
+        expression = alter.getAlterExpressions().get(0);
+        assertEquals(expression.getOperation(), AlterOperation.COLLATE);
+        assertEquals(expression.getCollation(), "collation_name");
+        assertTrue(expression.isDefaultCollateSpecified());
+        assertSqlCanBeParsedAndDeparsed(sql);
+
+        // Case 4: With DEFAULT and with =
+        sql = "ALTER TABLE tbl_name DEFAULT COLLATE = collation_name";
+
+        alter = (Alter) CCJSqlParserUtil.parse(sql);
+        expression = alter.getAlterExpressions().get(0);
+        assertEquals(expression.getOperation(), AlterOperation.COLLATE);
+        assertEquals(expression.getCollation(), "collation_name");
+        assertTrue(expression.isDefaultCollateSpecified());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
     @Test
     public void testIssue2090LockNone() throws JSQLParserException {
         String sql =
@@ -1293,7 +1359,6 @@ public void testIssue2106AlterTableTruncatePartition() throws JSQLParserExceptio
         assertEquals("p201807", partitionNames.get(3));
     }
 
-
     @Test
     public void testIssue2114AlterTableEncryption() throws JSQLParserException {
         String sql = "ALTER TABLE confidential_data ENCRYPTION = 'Y'";
@@ -1398,4 +1463,765 @@ public void testIssue2118AlterTableForceAndEngine() throws JSQLParserException {
 
         assertSqlCanBeParsedAndDeparsed(sql2);
     }
+
+    @Test
+    public void testDiscardTablespace() throws JSQLParserException {
+        String sql = "ALTER TABLE employees DISCARD TABLESPACE";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("employees", alter.getTable().getFullyQualifiedName());
+        assertEquals("DISCARD_TABLESPACE",
+                alter.getAlterExpressions().get(0).getOperation().toString());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testImportTablespace() throws JSQLParserException {
+        String sql = "ALTER TABLE employees IMPORT TABLESPACE";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("employees", alter.getTable().getFullyQualifiedName());
+        assertEquals("IMPORT_TABLESPACE",
+                alter.getAlterExpressions().get(0).getOperation().toString());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableKeys() throws JSQLParserException {
+        // Test for DISABLE KEYS
+        String sqlDisable = "ALTER TABLE tbl_name DISABLE KEYS";
+        Statement stmtDisable = CCJSqlParserUtil.parse(sqlDisable);
+        assertTrue(stmtDisable instanceof Alter);
+        Alter alterDisable = (Alter) stmtDisable;
+        assertEquals("tbl_name", alterDisable.getTable().getFullyQualifiedName());
+        AlterExpression alterExpDisable = alterDisable.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.DISABLE_KEYS, alterExpDisable.getOperation());
+
+        // Test for ENABLE KEYS
+        String sqlEnable = "ALTER TABLE tbl_name ENABLE KEYS";
+        Statement stmtEnable = CCJSqlParserUtil.parse(sqlEnable);
+        assertTrue(stmtEnable instanceof Alter);
+        Alter alterEnable = (Alter) stmtEnable;
+        assertEquals("tbl_name", alterEnable.getTable().getFullyQualifiedName());
+        AlterExpression alterExpEnable = alterEnable.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.ENABLE_KEYS, alterExpEnable.getOperation());
+    }
+
+    @Test
+    public void testAlterTablePartitionByRangeColumns() throws JSQLParserException {
+        String sql = "ALTER TABLE `payment_lock` " +
+                "PARTITION BY RANGE COLUMNS(`created_at`) (" +
+                "PARTITION p20210217 VALUES LESS THAN ('20210218') ENGINE = InnoDB, " +
+                "PARTITION p20210218 VALUES LESS THAN ('20210219') ENGINE = InnoDB);";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("`payment_lock`", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression partitionExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.PARTITION_BY, partitionExp.getOperation());
+        List<PartitionDefinition> partitions = partitionExp.getPartitionDefinitions();
+        assertNotNull(partitions);
+        assertEquals(2, partitions.size());
+
+        assertEquals("p20210217", partitions.get(0).getPartitionName());
+        assertEquals("VALUES LESS THAN", partitions.get(0).getPartitionOperation());
+        assertEquals(Collections.singletonList("'20210218'"), partitions.get(0).getValues());
+
+        assertEquals("p20210218", partitions.get(1).getPartitionName());
+        assertEquals("VALUES LESS THAN", partitions.get(1).getPartitionOperation());
+        assertEquals(Collections.singletonList("'20210219'"), partitions.get(1).getValues());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTablePartitionByRangeUnixTimestamp() throws JSQLParserException {
+        String sql = "ALTER TABLE `test`.`pipeline_service_metadata_history` " +
+                "PARTITION BY RANGE (FLOOR(UNIX_TIMESTAMP(requested_at))) (" +
+                "PARTITION p202104 VALUES LESS THAN (UNIX_TIMESTAMP('2021-05-01 00:00:00')) ENGINE = InnoDB, "
+                +
+                "PARTITION p202105 VALUES LESS THAN (UNIX_TIMESTAMP('2021-06-01 00:00:00')) ENGINE = InnoDB);";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("`test`.`pipeline_service_metadata_history`",
+                alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression partitionExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.PARTITION_BY, partitionExp.getOperation());
+        List<PartitionDefinition> partitions = partitionExp.getPartitionDefinitions();
+        assertNotNull(partitions);
+        assertEquals(2, partitions.size());
+
+        assertEquals("p202104", partitions.get(0).getPartitionName());
+        assertEquals("VALUES LESS THAN", partitions.get(0).getPartitionOperation());
+        assertEquals(Collections.singletonList("UNIX_TIMESTAMP('2021-05-01 00:00:00')"),
+                partitions.get(0).getValues());
+
+        assertEquals("p202105", partitions.get(1).getPartitionName());
+        assertEquals("VALUES LESS THAN", partitions.get(1).getPartitionOperation());
+        assertEquals(Collections.singletonList("UNIX_TIMESTAMP('2021-06-01 00:00:00')"),
+                partitions.get(1).getValues());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTablePartitionByRangeUnixTimestamp2() throws JSQLParserException {
+        String sql = "ALTER TABLE MP_MNEWS.PUR_MNEWS_CONTS " +
+                "PARTITION BY RANGE (UNIX_TIMESTAMP(REG_DATE_TS)) (" +
+                "PARTITION p202007 VALUES LESS THAN (1596207600) ENGINE = InnoDB, " +
+                "PARTITION p202008 VALUES LESS THAN (1598886000) ENGINE = InnoDB, " +
+                "PARTITION p202009 VALUES LESS THAN (1601478000) ENGINE = InnoDB);";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("MP_MNEWS.PUR_MNEWS_CONTS", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression partitionExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.PARTITION_BY, partitionExp.getOperation());
+        List<PartitionDefinition> partitions = partitionExp.getPartitionDefinitions();
+        assertNotNull(partitions);
+        assertEquals(3, partitions.size());
+
+        assertEquals("p202007", partitions.get(0).getPartitionName());
+        assertEquals("VALUES LESS THAN", partitions.get(0).getPartitionOperation());
+        assertEquals(Collections.singletonList("1596207600"), partitions.get(0).getValues());
+
+        assertEquals("p202008", partitions.get(1).getPartitionName());
+        assertEquals("VALUES LESS THAN", partitions.get(1).getPartitionOperation());
+        assertEquals(Collections.singletonList("1598886000"), partitions.get(1).getValues());
+
+        assertEquals("p202009", partitions.get(2).getPartitionName());
+        assertEquals("VALUES LESS THAN", partitions.get(2).getPartitionOperation());
+        assertEquals(Collections.singletonList("1601478000"), partitions.get(2).getValues());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableDiscardPartitionTablespace() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name DISCARD PARTITION p1 TABLESPACE";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.DISCARD_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertEquals("TABLESPACE", alterExpression.getTableOption());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableDiscardAllPartitionTablespace() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name DISCARD PARTITION ALL TABLESPACE";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.DISCARD_PARTITION, alterExpression.getOperation());
+        assertEquals("ALL", alterExpression.getPartitions().get(0));
+        assertEquals("TABLESPACE", alterExpression.getTableOption());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableImportMultiplePartitionsTablespace() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name IMPORT PARTITION p1, p2 TABLESPACE";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.IMPORT_PARTITION, alterExpression.getOperation());
+
+        List<String> partitions = alterExpression.getPartitions();
+        assertNotNull(partitions);
+        assertEquals(2, partitions.size());
+        assertEquals("p1", partitions.get(0));
+        assertEquals("p2", partitions.get(1));
+
+        assertEquals("TABLESPACE", alterExpression.getTableOption());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableTruncatePartition() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name TRUNCATE PARTITION p1";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.TRUNCATE_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableCoalescePartition() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name COALESCE PARTITION 2";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.COALESCE_PARTITION, alterExpression.getOperation());
+        assertEquals(2, alterExpression.getCoalescePartitionNumber());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableReorganizePartition() throws JSQLParserException {
+        String sql =
+                "ALTER TABLE tbl_name REORGANIZE PARTITION p1 INTO (PARTITION p2 VALUES LESS THAN (100))";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.REORGANIZE_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        PartitionDefinition partitionDef = alterExpression.getPartitionDefinitions().get(0);
+        assertEquals("p2", partitionDef.getPartitionName());
+        assertEquals("VALUES LESS THAN", partitionDef.getPartitionOperation());
+        assertEquals(Collections.singletonList("100"), partitionDef.getValues());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableExchangePartition() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name EXCHANGE PARTITION p1 WITH TABLE tbl_name2";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.EXCHANGE_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertEquals("tbl_name2", alterExpression.getExchangePartitionTableName());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableExchangePartitionWithValidation() throws JSQLParserException {
+        String sql =
+                "ALTER TABLE tbl_name EXCHANGE PARTITION p1 WITH TABLE tbl_name2 WITH VALIDATION";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.EXCHANGE_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertEquals("tbl_name2", alterExpression.getExchangePartitionTableName());
+        assertTrue(alterExpression.isExchangePartitionWithValidation());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAnalyzePartition() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name ANALYZE PARTITION p1";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.ANALYZE_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableCheckPartition() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name CHECK PARTITION p1";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.CHECK_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableOptimizePartition() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name OPTIMIZE PARTITION p1";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.OPTIMIZE_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableRebuildPartition() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name REBUILD PARTITION p1";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.REBUILD_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableRepairPartition() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name REPAIR PARTITION p1";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.REPAIR_PARTITION, alterExpression.getOperation());
+        assertEquals("p1", alterExpression.getPartitions().get(0));
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableRemovePartitioning() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name REMOVE PARTITIONING";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("tbl_name", alter.getTable().getFullyQualifiedName());
+        AlterExpression alterExpression = alter.getAlterExpressions().get(0);
+        assertEquals(AlterOperation.REMOVE_PARTITIONING, alterExpression.getOperation());
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableKeyBlockSizeAlgorithmLock() throws JSQLParserException {
+        String sql = "ALTER TABLE dw_rpt " +
+                "KEY_BLOCK_SIZE = 8, " +
+                "ALGORITHM = INPLACE, " +
+                "LOCK = NONE";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+        Alter alter = (Alter) stmt;
+        assertEquals("dw_rpt", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(3, alterExpressions.size());
+
+        AlterExpression keyBlockSizeExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.KEY_BLOCK_SIZE, keyBlockSizeExp.getOperation());
+        assertEquals(8, keyBlockSizeExp.getKeyBlockSize());
+
+        AlterExpression algorithmExp = alterExpressions.get(1);
+        assertEquals(AlterOperation.ALGORITHM, algorithmExp.getOperation());
+        assertEquals("INPLACE", algorithmExp.getAlgorithmOption());
+
+        AlterExpression lockExp = alterExpressions.get(2);
+        assertEquals(AlterOperation.LOCK, lockExp.getOperation());
+        assertEquals("NONE", lockExp.getLockOption());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAddFullTextIndex() throws JSQLParserException {
+        String sql = "ALTER TABLE yum_table_myisam ADD FULLTEXT (name)";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+
+        Alter alter = (Alter) stmt;
+        assertEquals("yum_table_myisam", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression indexExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ADD, indexExp.getOperation());
+        assertEquals("FULLTEXT", indexExp.getIndex().getType());
+        assertEquals("name", indexExp.getIndex().getColumnsNames().get(0));
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAddSpatialIndex() throws JSQLParserException {
+        String sql = "ALTER TABLE places ADD SPATIAL KEY sp_idx_location(location)";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+
+        Alter alter = (Alter) stmt;
+        assertEquals("places", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression indexExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ADD, indexExp.getOperation());
+        assertEquals("SPATIAL", indexExp.getIndex().getType());
+        assertEquals("sp_idx_location", indexExp.getIndex().getName());
+        assertEquals("location", indexExp.getIndex().getColumnsNames().get(0));
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAddFullTextIndexWithOptions() throws JSQLParserException {
+        String sql = "ALTER TABLE my_table ADD FULLTEXT my_idx(col1, col2) " +
+                "KEY_BLOCK_SIZE = 8 WITH PARSER ngram COMMENT 'fulltext' INVISIBLE";
+
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        Alter alter = (Alter) stmt;
+
+        assertEquals("my_table", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression indexExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ADD, indexExp.getOperation());
+
+        Index index = indexExp.getIndex();
+        assertNotNull(index);
+        assertEquals("FULLTEXT", index.getType());
+        assertEquals("my_idx", index.getName());
+
+        List<String> columnNames = index.getColumnsNames();
+        assertEquals(2, columnNames.size());
+        assertEquals("col1", columnNames.get(0));
+        assertEquals("col2", columnNames.get(1));
+
+        List<String> indexSpec = index.getIndexSpec();
+        assertNotNull(indexSpec);
+        assertEquals(4, indexSpec.size());
+        assertEquals("KEY_BLOCK_SIZE = 8", indexSpec.get(0));
+        assertEquals("WITH PARSER ngram", indexSpec.get(1));
+        assertEquals("COMMENT 'fulltext'", indexSpec.get(2));
+        assertEquals("INVISIBLE", indexSpec.get(3));
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAddUnnamedIndex() throws JSQLParserException {
+        String sql = "ALTER TABLE employees ADD INDEX (name1, name2)";
+
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        Alter alter = (Alter) stmt;
+
+        assertEquals("employees", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression indexExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ADD, indexExp.getOperation());
+
+        Index index = indexExp.getIndex();
+        assertNotNull(index);
+        assertNull(index.getName());
+
+        List<String> columnNames = index.getColumnsNames();
+        assertEquals(2, columnNames.size());
+        assertEquals("name1", columnNames.get(0));
+        assertEquals("name2", columnNames.get(1));
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAddIndexWithOptions() throws JSQLParserException {
+        String sql = "ALTER TABLE employees ADD INDEX idx_lastname (last_name) " +
+                "USING BTREE KEY_BLOCK_SIZE = 16 COMMENT 'Performance tuning' VISIBLE";
+
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        Alter alter = (Alter) stmt;
+
+        assertEquals("employees", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression indexExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ADD, indexExp.getOperation());
+
+        Index index = indexExp.getIndex();
+        assertNotNull(index);
+        assertEquals("INDEX", index.getIndexKeyword());
+        assertEquals("idx_lastname", index.getName());
+        assertEquals("last_name", index.getColumnsNames().get(0));
+
+        List<String> indexSpec = index.getIndexSpec();
+        assertNotNull(indexSpec);
+        assertEquals(4, indexSpec.size());
+        assertEquals("USING BTREE", indexSpec.get(0));
+        assertEquals("KEY_BLOCK_SIZE = 16", indexSpec.get(1));
+        assertEquals("COMMENT 'Performance tuning'", indexSpec.get(2));
+        assertEquals("VISIBLE", indexSpec.get(3));
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAddIndex_UsingBeforeColumns() throws JSQLParserException {
+        String sql = "ALTER TABLE t ADD INDEX idx_name USING BTREE (col)";
+
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        Alter alter = (Alter) stmt;
+
+        assertEquals("t", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression expr = alterExpressions.get(0);
+        assertEquals(AlterOperation.ADD, expr.getOperation());
+
+        Index index = expr.getIndex();
+        assertEquals("idx_name", index.getName());
+        assertEquals("INDEX", index.getIndexKeyword());
+        assertEquals("BTREE", index.getUsing());
+        assertEquals(List.of("col"), index.getColumnsNames());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableSetDefaultWithAlgorithm() throws JSQLParserException {
+        String sql = "ALTER TABLE t2 ALTER COLUMN b SET DEFAULT 100, ALGORITHM = INSTANT";
+        Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
+
+        assertEquals("t2", alter.getTable().getFullyQualifiedName());
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(2, alterExpressions.size());
+
+        AlterExpression setDefaultExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ALTER, setDefaultExp.getOperation());
+        assertEquals("b", setDefaultExp.getColumnSetDefaultList().get(0).getColumnName());
+        assertEquals("100", setDefaultExp.getColumnSetDefaultList().get(0).getDefaultValue());
+
+        AlterExpression algorithmExp = alterExpressions.get(1);
+        assertEquals(AlterOperation.ALGORITHM, algorithmExp.getOperation());
+        assertEquals("INSTANT", algorithmExp.getAlgorithmOption());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableDropDefaultWithAlgorithm() throws JSQLParserException {
+        String sql = "ALTER TABLE t2 ALTER COLUMN b DROP DEFAULT, ALGORITHM = INSTANT";
+        Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
+
+        assertEquals("t2", alter.getTable().getFullyQualifiedName());
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(2, alterExpressions.size());
+
+        AlterExpression dropDefaultExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ALTER, dropDefaultExp.getOperation());
+        assertEquals("b", dropDefaultExp.getColumnDropDefaultList().get(0).getColumnName());
+
+        AlterExpression algorithmExp = alterExpressions.get(1);
+        assertEquals(AlterOperation.ALGORITHM, algorithmExp.getOperation());
+        assertEquals("INSTANT", algorithmExp.getAlgorithmOption());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+
+    @Test
+    public void testAlterTableColumnSetInvisible() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl ALTER COLUMN ts SET INVISIBLE";
+        Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
+
+        assertEquals("tbl", alter.getTable().getFullyQualifiedName());
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression setInvisibleExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ALTER, setInvisibleExp.getOperation());
+        assertEquals("ts", setInvisibleExp.getColumnSetVisibilityList().get(0).getColumnName());
+        assertFalse(setInvisibleExp.getColumnSetVisibilityList().get(0).isVisible());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableSetInvisible() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl ALTER ts SET INVISIBLE";
+        Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
+
+        assertEquals("tbl", alter.getTable().getFullyQualifiedName());
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression setInvisibleExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ALTER, setInvisibleExp.getOperation());
+        assertEquals("ts", setInvisibleExp.getColumnSetVisibilityList().get(0).getColumnName());
+        assertFalse(setInvisibleExp.getColumnSetVisibilityList().get(0).isVisible());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterIndexVisibility() throws JSQLParserException {
+        String sql = "ALTER TABLE tbl_name ALTER INDEX idx_name VISIBLE";
+        Alter alterVisible = (Alter) CCJSqlParserUtil.parse(sql);
+
+        assertEquals("tbl_name", alterVisible.getTable().getFullyQualifiedName());
+        List<AlterExpression> alterExpressionsVisible = alterVisible.getAlterExpressions();
+        assertNotNull(alterExpressionsVisible);
+        assertEquals(1, alterExpressionsVisible.size());
+
+        AlterExpression visibleExp = alterExpressionsVisible.get(0);
+        assertEquals(AlterOperation.ALTER, visibleExp.getOperation());
+        assertEquals("idx_name", visibleExp.getIndex().getName());
+        assertEquals("VISIBLE", visibleExp.getIndex().getIndexSpec().get(0));
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAlterConstraintEnforced() throws JSQLParserException {
+        String sql = "ALTER TABLE employees ALTER CONSTRAINT chk_salary ENFORCED";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+
+        Alter alter = (Alter) stmt;
+        assertEquals("employees", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression alterConstraintExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ALTER, alterConstraintExp.getOperation());
+        assertEquals("CONSTRAINT", alterConstraintExp.getConstraintType());
+        assertEquals("chk_salary", alterConstraintExp.getConstraintSymbol());
+        assertTrue(alterConstraintExp.isEnforced());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAlterCheckNotEnforced() throws JSQLParserException {
+        String sql = "ALTER TABLE employees ALTER CHECK chk_salary NOT ENFORCED";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+
+        Alter alter = (Alter) stmt;
+        assertEquals("employees", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression alterCheckExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ALTER, alterCheckExp.getOperation());
+        assertEquals("CHECK", alterCheckExp.getConstraintType());
+        assertEquals("chk_salary", alterCheckExp.getConstraintSymbol());
+        assertFalse(alterCheckExp.isEnforced());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAddConstraintUniqueKey() throws JSQLParserException {
+        String sql = "ALTER TABLE sbtest1 ADD CONSTRAINT UNIQUE KEY ux_c3 (c3)";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+
+        Alter alter = (Alter) stmt;
+        assertEquals("sbtest1", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression alterExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ADD, alterExp.getOperation());
+        assertEquals("UNIQUE KEY", alterExp.getConstraintType());
+        assertEquals("ux_c3", alterExp.getConstraintSymbol());
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAlterIndexInvisible() throws JSQLParserException {
+        String sql = "ALTER TABLE sbtest1 ALTER INDEX c4 INVISIBLE";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+
+        Alter alter = (Alter) stmt;
+        assertEquals("sbtest1", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression alterExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ALTER, alterExp.getOperation());
+        assertEquals("c4", alterExp.getIndex().getName());
+        assertEquals("INVISIBLE", alterExp.getIndex().getIndexSpec().get(0));
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
+
+    @Test
+    public void testAlterTableAddIndexInvisible() throws JSQLParserException {
+        String sql = "ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE";
+        Statement stmt = CCJSqlParserUtil.parse(sql);
+        assertInstanceOf(Alter.class, stmt);
+
+        Alter alter = (Alter) stmt;
+        assertEquals("t1", alter.getTable().getFullyQualifiedName());
+
+        List<AlterExpression> alterExpressions = alter.getAlterExpressions();
+        assertNotNull(alterExpressions);
+        assertEquals(1, alterExpressions.size());
+
+        AlterExpression alterExp = alterExpressions.get(0);
+        assertEquals(AlterOperation.ADD, alterExp.getOperation());
+        assertNotNull(alterExp.getIndex());
+        assertEquals("k_idx", alterExp.getIndex().getName());
+        assertEquals("INDEX", alterExp.getIndex().getIndexKeyword());
+
+        List<String> columnNames = alterExp.getIndex().getColumnsNames();
+        assertNotNull(columnNames);
+        assertEquals(1, columnNames.size());
+        assertEquals("k", columnNames.get(0));
+
+        List<String> indexSpec = alterExp.getIndex().getIndexSpec();
+        assertNotNull(indexSpec);
+        assertTrue(indexSpec.contains("INVISIBLE"));
+
+        assertSqlCanBeParsedAndDeparsed(sql);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java
index 7d4c33714..3fbfe8d96 100644
--- a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java
@@ -16,8 +16,8 @@
 import net.sf.jsqlparser.statement.create.table.ColDataType;
 import net.sf.jsqlparser.statement.refresh.RefreshMode;
 import net.sf.jsqlparser.statement.select.ParenthesedSelect;
-import net.sf.jsqlparser.statement.update.UpdateSet;
 import net.sf.jsqlparser.util.ReflectionTestUtils;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
@@ -110,6 +110,7 @@ public class ReflectionModelTest {
             new net.sf.jsqlparser.expression.operators.relational.InExpression(),
             new net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression(),
             new net.sf.jsqlparser.expression.operators.relational.IsNullExpression(),
+            new net.sf.jsqlparser.expression.operators.relational.IsUnknownExpression(),
             new net.sf.jsqlparser.expression.operators.relational.JsonOperator("@>"),
             new net.sf.jsqlparser.expression.operators.relational.LikeExpression(),
             new net.sf.jsqlparser.expression.operators.relational.Matches(),
@@ -169,7 +170,7 @@ public class ReflectionModelTest {
             new net.sf.jsqlparser.statement.grant.Grant(),
             new net.sf.jsqlparser.statement.insert.Insert(),
             new net.sf.jsqlparser.statement.merge.Merge(),
-            new net.sf.jsqlparser.statement.merge.MergeUpdate(new ArrayList<UpdateSet>()),
+            new net.sf.jsqlparser.statement.merge.MergeUpdate(new ArrayList<>()),
             new net.sf.jsqlparser.statement.select.AllColumns(),
             // new net.sf.jsqlparser.statement.select.AllTableColumns(new Table()),
             new net.sf.jsqlparser.statement.select.Distinct(),
@@ -189,7 +190,7 @@ public class ReflectionModelTest {
             new net.sf.jsqlparser.statement.select.OrderByElement(),
             // new net.sf.jsqlparser.statement.select.ParenthesisFromItem().getFromItem(),
             new net.sf.jsqlparser.statement.select.Pivot(),
-            new net.sf.jsqlparser.statement.select.PivotXml(),
+            // new net.sf.jsqlparser.statement.select.PivotXml(),
             // new net.sf.jsqlparser.statement.select.PlainSelect(),
             // new net.sf.jsqlparser.statement.select.Select(),
             new net.sf.jsqlparser.statement.select.SelectItem<>(),
@@ -210,6 +211,7 @@ public class ReflectionModelTest {
                     null));
 
     @Test
+    @Disabled
     public void testModels() {
         ReflectionTestUtils.testGetterSetterChaining(MODEL_OBJECTS,
                 m -> !"setASTNode".equals(m.getName()));
diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java
index 328b8ecca..b23850b11 100644
--- a/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java
@@ -180,7 +180,7 @@ public void testCreateViewAutoFails() {
 
         assertThatThrownBy(throwingCallable).isInstanceOf(JSQLParserException.class)
                 .hasRootCauseInstanceOf(ParseException.class).rootCause()
-                .hasMessageStartingWith("Encountered unexpected token");
+                .hasMessageStartingWith("Encountered: <K_AUTO> / \"AUTO\"");
     }
 
     @Test
@@ -191,7 +191,7 @@ public void testCreateViewRefreshFails() {
 
         assertThatThrownBy(throwingCallable).isInstanceOf(JSQLParserException.class)
                 .hasRootCauseInstanceOf(ParseException.class).rootCause()
-                .hasMessageStartingWith("Encountered unexpected token");
+                .hasMessageStartingWith("Encountered: <K_REFRESH> / \"REFRESH\"");
     }
 
     @Test
@@ -202,7 +202,7 @@ public void testCreateViewAutoRefreshFails() {
 
         assertThatThrownBy(throwingCallable).isInstanceOf(JSQLParserException.class)
                 .hasRootCauseInstanceOf(ParseException.class).rootCause()
-                .hasMessageStartingWith("Encountered unexpected token");
+                .hasMessageStartingWith("Encountered: <K_AUTO> / \"AUTO\"");
     }
 
     @Test
diff --git a/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java b/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java
new file mode 100644
index 000000000..1d158b975
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java
@@ -0,0 +1,272 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.export;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.parallel.Execution;
+import org.junit.jupiter.api.parallel.ExecutionMode;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+@Execution(ExecutionMode.CONCURRENT)
+public class ExportTest {
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv'",
+            "EXPORT schemaName.tableName ( columnName ) INTO LOCAL CSV FILE 'file.csv'",
+            "EXPORT schemaName.tableName ( columnName1, columnName2 ) INTO LOCAL CSV FILE 'file.csv'",
+
+            "EXPORT ( select 1 ) INTO LOCAL CSV FILE 'file.csv'",
+    })
+    public void testExport(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file1.csv' FILE 'file2.csv'",
+
+            "EXPORT schemaName.tableName INTO LOCAL SECURE CSV FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO LOCAL SECURE CSV FILE 'file1.csv' FILE 'file2.csv'"
+    })
+    public void testExportIntoFileCSV(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 2 )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format' )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = ALWAYS )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = NEVER )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = AUTO )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 DELIMIT = NEVER )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 DELIMIT = NEVER, 3 FORMAT = 'format' DELIMIT = ALWAYS )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 .. 2 )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2 )",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )"
+    })
+    public void testExportIntoFileCSVCols(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv'",
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file1.fbv' FILE 'file2.fbv'",
+
+            "EXPORT schemaName.tableName INTO LOCAL SECURE FBV FILE 'file.fbv'",
+            "EXPORT schemaName.tableName INTO LOCAL SECURE FBV FILE 'file1.fbv' FILE 'file2.fbv'"
+    })
+    public void testExportIntoFileFBV(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 )",
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( FORMAT = 'format' )",
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( ALIGN = LEFT )",
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( ALIGN = RIGHT )",
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( PADDING = '0' )",
+
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1, PADDING = '0' )",
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 PADDING = '0' )",
+            "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 PADDING = '0', FORMAT = 'format' )"
+    })
+    public void testExportIntoFileFBVCols(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REPLACE",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' TRUNCATE",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' NULL = 'null'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' BOOLEAN = 'yes/no'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ROW SEPARATOR = 'CRLF'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' COLUMN SEPARATOR = ','",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' COLUMN DELIMITER = '\"'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' DELIMIT = ALWAYS",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' DELIMIT = NEVER",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' DELIMIT = AUTO",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' WITH COLUMN NAMES",
+
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' REPLACE",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' REPLACE WITH COLUMN NAMES"
+    })
+    public void testExportIntoFileFileOpts(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' VERIFY CERTIFICATE",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' PUBLIC KEY 'publicKey'",
+
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' VERIFY CERTIFICATE PUBLIC KEY 'publicKey'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE PUBLIC KEY 'publicKey'"
+    })
+    public void testExportIntoFileCertVerification(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO CSV AT connectionName FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' FILE 'file.csv'",
+
+            "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+
+            "EXPORT schemaName.tableName INTO CSV AT connectionName IGNORE CERTIFICATE FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT connectionName VERIFY CERTIFICATE FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT connectionName PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT connectionName IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT connectionName VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+
+            "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'"
+    })
+    public void testExportIntoConnectionDef(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO CSV AT CLOUD NONE connectionName FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT CLOUD NONE '127.0.0.1' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT CLOUD NONE connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT CLOUD NONE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE connectionName FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'"
+    })
+    public void testExportIntoCloudConnectionDef(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName",
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName ( columnName )",
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 )",
+
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName REPLACE",
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName TRUNCATE",
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName CREATED BY 'CREATE OR REPLACE TABLE schemaName (columnName INTEGER)'",
+
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName REPLACE TRUNCATE",
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName ( columnName ) REPLACE TRUNCATE",
+            "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 ) REPLACE TRUNCATE",
+
+            "EXPORT schemaName.tableName INTO EXA AT connectionName STATEMENT 'insert into schemaName.tableName ( columnName ) values ( ? )'"
+    })
+    public void testExportIntoDBMSEXA(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO ORA AT connectionName TABLE schemaName.tableName",
+            "EXPORT schemaName.tableName INTO ORA AT connectionName TABLE schemaName.tableName ( columnName )",
+            "EXPORT schemaName.tableName INTO ORA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 )",
+
+            "EXPORT schemaName.tableName INTO ORA AT connectionName STATEMENT 'insert into schemaName.tableName ( columnName ) values ( ? )'"
+    })
+    public void testExportIntoDBMSORA(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO JDBC AT connectionName TABLE tableName",
+            "EXPORT schemaName.tableName INTO JDBC DRIVER = 'driverName' AT connectionName TABLE tableName"
+    })
+    public void testExportIntoDBMSJDBC(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO SCRIPT scriptName",
+            "EXPORT schemaName.tableName INTO SCRIPT scriptName AT connectionName",
+            "EXPORT schemaName.tableName INTO SCRIPT scriptName WITH propertyName = 'value'",
+            "EXPORT schemaName.tableName INTO SCRIPT scriptName WITH propertyName = 'value' propertyName2 = 'value2'",
+            "EXPORT schemaName.tableName INTO SCRIPT scriptName AT connectionName WITH propertyName = 'value' propertyName2 = 'value2'"
+    })
+    public void testExportIntoScript(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED",
+
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS",
+
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv'",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName",
+
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1 ERRORS",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1 ERRORS",
+
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS",
+            "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED ERRORS"
+    })
+    public void testImportErrorClause(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/grant/GrantTest.java b/src/test/java/net/sf/jsqlparser/statement/grant/GrantTest.java
index e0bb8faa4..fd41bda45 100644
--- a/src/test/java/net/sf/jsqlparser/statement/grant/GrantTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/grant/GrantTest.java
@@ -13,6 +13,7 @@
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.parser.CCJSqlParserManager;
 import static net.sf.jsqlparser.test.TestUtils.*;
+import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import org.junit.jupiter.api.Test;
 
@@ -97,4 +98,10 @@ public void testGrantQueryWithRole() throws JSQLParserException {
     public void testGrantSchemaParsingIssue1080() throws JSQLParserException {
         assertSqlCanBeParsedAndDeparsed("GRANT SELECT ON schema_name.table_name TO XYZ");
     }
+
+    @Test
+    void testPublicKeywordIssue2230() throws JSQLParserException {
+        String sqlStr = "grant select on da380_now to public;";
+        assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java
new file mode 100644
index 000000000..1539d4375
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java
@@ -0,0 +1,281 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2019 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.imprt;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.parallel.Execution;
+import org.junit.jupiter.api.parallel.ExecutionMode;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+@Execution(ExecutionMode.CONCURRENT)
+public class ImportTest {
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT INTO schemaName.tableName FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT INTO schemaName.tableName ( columnName ) FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT INTO schemaName.tableName ( columnName1, columnName2 ) FROM LOCAL CSV FILE 'file.csv'"
+    })
+    public void testImportIntoTable(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT INTO ( columnName integer ) FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT INTO ( columnName1 integer, columnName2 varchar(100) ) FROM LOCAL CSV FILE 'file.csv'",
+
+            "IMPORT INTO ( LIKE schemaName.tableName ) FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT INTO ( LIKE schemaName.tableName ( columnName ) ) FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT INTO ( LIKE schemaName.tableName ( columnName1, columnName2 ) ) FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT INTO ( LIKE schemaName.tableName ( columnName AS aliasName ) ) FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT INTO ( LIKE schemaName.tableName ( columnName aliasName ) ) FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT INTO ( LIKE schemaName.tableName ( columnName1 AS aliasName2, columnName2 AS aliasName2 ) ) FROM LOCAL CSV FILE 'file.csv'"
+    })
+    public void testImportIntoImportColumns(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM LOCAL CSV FILE 'file.csv'",
+            "IMPORT FROM LOCAL CSV FILE 'file1.csv' FILE 'file2.csv'",
+
+            "IMPORT FROM LOCAL SECURE CSV FILE 'file.csv'",
+            "IMPORT FROM LOCAL SECURE CSV FILE 'file1.csv' FILE 'file2.csv'"
+    })
+    public void testImportFromFileCSV(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1 )",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1, 2 )",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format' )",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 FORMAT = 'format' )",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1 .. 2 )",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2 )",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )"
+    })
+    public void testImportFromFileCSVCols(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv'",
+            "IMPORT FROM LOCAL FBV FILE 'file1.fbv' FILE 'file2.fbv'",
+
+            "IMPORT FROM LOCAL SECURE FBV FILE 'file.fbv'",
+            "IMPORT FROM LOCAL SECURE FBV FILE 'file1.fbv' FILE 'file2.fbv'"
+    })
+    public void testImportFromFileFBV(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1 )",
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( START = 1 )",
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( FORMAT = 'format' )",
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( ALIGN = LEFT )",
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( ALIGN = RIGHT )",
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( PADDING = 'padding' )",
+
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1, START = 1 )",
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1 )",
+            "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1, FORMAT = 'format' )"
+    })
+    public void testImportFromFileFBVCols(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8'",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' SKIP = 1",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' TRIM",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' LTRIM",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' RTRIM",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' NULL = 'null'",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ROW SEPARATOR = 'CRLF'",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' COLUMN SEPARATOR = ','",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' COLUMN DELIMITER = '\"'",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ROW SIZE = 1",
+
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1 TRIM"
+    })
+    public void testImportFromFileFileOpts(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' VERIFY CERTIFICATE",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' PUBLIC KEY 'publicKey'",
+
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' VERIFY CERTIFICATE PUBLIC KEY 'publicKey'",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE PUBLIC KEY 'publicKey'"
+    })
+    public void testImportFromFileCertVerification(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM CSV AT connectionName FILE 'file.csv'",
+            "IMPORT FROM CSV AT '127.0.0.1' FILE 'file.csv'",
+
+            "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+            "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+
+            "IMPORT FROM CSV AT connectionName IGNORE CERTIFICATE FILE 'file.csv'",
+            "IMPORT FROM CSV AT connectionName VERIFY CERTIFICATE FILE 'file.csv'",
+            "IMPORT FROM CSV AT connectionName PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "IMPORT FROM CSV AT connectionName IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "IMPORT FROM CSV AT connectionName VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+
+            "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE FILE 'file.csv'",
+            "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE FILE 'file.csv'",
+            "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE FILE 'file.csv'",
+            "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE FILE 'file.csv'",
+            "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'",
+            "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'"
+    })
+    public void testImportFromConnectionDef(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM CSV AT CLOUD NONE connectionName FILE 'file.csv'",
+            "IMPORT FROM CSV AT CLOUD NONE '127.0.0.1' FILE 'file.csv'",
+            "IMPORT FROM CSV AT CLOUD NONE connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+            "IMPORT FROM CSV AT CLOUD NONE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+            "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE connectionName FILE 'file.csv'",
+            "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' FILE 'file.csv'",
+            "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'",
+            "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'"
+    })
+    public void testImportFromCloudConnectionDef(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM EXA AT connectionName TABLE schemaName.tableName",
+            "IMPORT FROM EXA AT connectionName TABLE schemaName.tableName ( columnName )",
+            "IMPORT FROM EXA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 )",
+
+            "IMPORT FROM EXA AT connectionName STATEMENT 'select 1'",
+            "IMPORT FROM EXA AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'"
+    })
+    public void testImportFromDBMSEXA(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM ORA AT connectionName TABLE schemaName.tableName",
+            "IMPORT FROM ORA AT connectionName TABLE schemaName.tableName ( columnName )",
+            "IMPORT FROM ORA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 )",
+
+            "IMPORT FROM ORA AT connectionName STATEMENT 'select 1'",
+            "IMPORT FROM ORA AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'"
+    })
+    public void testImportFromDBMSORA(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM JDBC AT connectionName TABLE tableName",
+            "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName TABLE tableName",
+
+            "IMPORT FROM JDBC AT connectionName STATEMENT 'select 1'",
+            "IMPORT FROM JDBC AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'",
+            "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName STATEMENT 'select 1'",
+            "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'"
+    })
+    public void testImportFromDBMSJDBC(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM SCRIPT scriptName",
+            "IMPORT FROM SCRIPT scriptName AT connectionName",
+            "IMPORT FROM SCRIPT scriptName WITH propertyName = 'value'",
+            "IMPORT FROM SCRIPT scriptName WITH propertyName = 'value' propertyName2 = 'value2'",
+            "IMPORT FROM SCRIPT scriptName AT connectionName WITH propertyName = 'value' propertyName2 = 'value2'"
+    })
+    public void testImportFromScript(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' REJECT LIMIT 1",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED",
+
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS",
+
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv'",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv'",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv'",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName",
+
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1 ERRORS",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1 ERRORS",
+
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS",
+            "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED ERRORS"
+    })
+    public void testImportErrorClause(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java b/src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java
index 24456212c..850fedfd9 100644
--- a/src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java
@@ -27,6 +27,7 @@
 import net.sf.jsqlparser.statement.select.*;
 import net.sf.jsqlparser.statement.update.Update;
 import net.sf.jsqlparser.statement.update.UpdateSet;
+import net.sf.jsqlparser.test.TestUtils;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.function.Executable;
@@ -36,7 +37,6 @@
 import java.io.StringReader;
 import java.util.List;
 
-import static junit.framework.Assert.assertNull;
 import static net.sf.jsqlparser.test.TestUtils.assertDeparse;
 import static net.sf.jsqlparser.test.TestUtils.assertOracleHintExists;
 import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
@@ -44,6 +44,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertThrowsExactly;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -902,4 +903,18 @@ public void testOverridingSystemValueInsertsParseWithTableNamedOverriding(String
         assertEquals(true, insert.isOverriding());
     }
 
+    @Test
+    void insertDemo() {
+        Insert insert =
+                new Insert()
+                        .withTable(new Table("test"))
+                        .withSelect(
+                                new Values()
+                                        .addExpressions(
+                                                new StringValue("A"), new StringValue("B")));
+
+        TestUtils.assertStatementCanBeDeparsedAs(
+                insert, "INSERT INTO test VALUES ('A', 'B')");
+    }
+
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/AsPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/AsPipeOperatorTest.java
new file mode 100644
index 000000000..17b90e28b
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/AsPipeOperatorTest.java
@@ -0,0 +1,32 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.piped;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+class AsPipeOperatorTest {
+
+    @Test
+    void testParseAndDeparse() throws JSQLParserException {
+        String sqlStr="(\n" +
+                "  SELECT '000123' AS id, 'apples' AS item, 2 AS sales\n" +
+                "  UNION ALL\n" +
+                "  SELECT '000456' AS id, 'bananas' AS item, 5 AS sales\n" +
+                ") AS sales_table\n" +
+                "|> AGGREGATE SUM(sales) AS total_sales GROUP BY id, item\n" +
+                "|> AS t1\n" +
+                "|> JOIN (SELECT 456 AS id, 'yellow' AS color) AS t2\n" +
+                "   ON CAST(t1.id AS INT64) = t2.id\n" +
+                "|> SELECT t2.id, total_sales, color;";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/CallPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/CallPipeOperatorTest.java
new file mode 100644
index 000000000..a8f921617
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/CallPipeOperatorTest.java
@@ -0,0 +1,25 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.piped;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+
+class CallPipeOperatorTest {
+    @Test
+    void testParseAndDeparse() throws JSQLParserException {
+        String sqlStr = "FROM input_table\n" +
+                "|> CALL tvf1(arg1)\n" +
+                "|> CALL tvf2(arg2, arg3);";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/DropPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/DropPipeOperatorTest.java
index 7022fbfcf..5c8ce0a15 100644
--- a/src/test/java/net/sf/jsqlparser/statement/piped/DropPipeOperatorTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/DropPipeOperatorTest.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.JSQLParserException;
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperatorTest.java
index aa0c2dda0..652838017 100644
--- a/src/test/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperatorTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/ExtendPipeOperatorTest.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.JSQLParserException;
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/FromQueryTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/FromQueryTest.java
index 168d1101b..a10e0c570 100644
--- a/src/test/java/net/sf/jsqlparser/statement/piped/FromQueryTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/FromQueryTest.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.JSQLParserException;
@@ -8,6 +17,7 @@
 public class FromQueryTest {
     @Test
     void testParseAndDeparse() throws JSQLParserException {
+        // formatter:off
         String sqlStr = "FROM Produce\n"
                 + "|> WHERE\n"
                 + "    item != 'bananas'\n"
@@ -15,10 +25,232 @@ void testParseAndDeparse() throws JSQLParserException {
                 + "|> AGGREGATE COUNT(*) AS num_items, SUM(sales) AS total_sales\n"
                 + "   GROUP BY item\n"
                 + "|> ORDER BY item DESC;";
+        // formatter:on
         FromQuery fromQuery = (FromQuery) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
 
         Assertions.assertInstanceOf(WherePipeOperator.class, fromQuery.get(0));
         Assertions.assertInstanceOf(AggregatePipeOperator.class, fromQuery.get(1));
         Assertions.assertInstanceOf(OrderByPipeOperator.class, fromQuery.get(2));
     }
+
+    @Test
+    void testParseAndDeparseJoin() throws JSQLParserException {
+        // formatter:off
+        String sqlStr =
+                "FROM Produce INNER JOIN Price USING(id_product) \n"
+                        + "|> WHERE\n"
+                        + "    item != 'bananas'\n"
+                        + "    AND category IN ('fruit', 'nut')\n"
+                        + "|> AGGREGATE COUNT(*) AS num_items, SUM(sales) AS total_sales\n"
+                        + "   GROUP BY item\n"
+                        + "|> ORDER BY item DESC;";
+        // formatter:on
+
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @Test
+    void testParseAndDeparseWithIssue73() throws JSQLParserException {
+        // formatter:off
+        String sqlStr =
+                "with client_info as (\n" +
+                        "  with client as (\n" +
+                        "    select 1 as client_id\n" +
+                        "    |> UNION ALL\n" +
+                        "      (select 2),\n" +
+                        "      (select 3)\n" +
+                        "  ), basket as (\n" +
+                        "    select 1 as basket_id, 1 as client_id\n" +
+                        "    |> UNION ALL\n" +
+                        "      (select 2, 2)\n" +
+                        "  ), basket_item as (\n" +
+                        "    select 1 as item_id, 1 as basket_id\n" +
+                        "    |> UNION ALL\n" +
+                        "      (select 2, 1),\n" +
+                        "      (select 3, 1),\n" +
+                        "      (select 4, 2)\n" +
+                        "  ), item as (\n" +
+                        "    select 1 as item_id, 'milk' as name\n" +
+                        "    |> UNION ALL\n" +
+                        "      (select 2, \"chocolate\"),\n" +
+                        "      (select 3, \"donut\"),\n" +
+                        "      (select 4, \"croissant\")\n" +
+                        "  ), wrapper as (\n" +
+                        "    FROM client c\n" +
+                        "    |> aggregate count(i.item_id) as bought_item\n" +
+                        "       group by c.client_id, i.item_id, i.name\n" +
+                        "    |> aggregate array_agg((select as struct item_id, name, bought_item)) as items_info\n"
+                        +
+                        "       group by client_id\n" +
+                        "  )\n" +
+                        "  select * from wrapper\n" +
+                        ")\n" +
+                        "select * from client_info";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @Test
+    void testParseAndDeparseWithJoinIssue72() throws JSQLParserException {
+        // formatter:off
+        String sqlStr =
+                "with client as (\n" +
+                        "  select 1 as client_id\n" +
+                        "  |> UNION ALL\n" +
+                        "    (select 2),\n" +
+                        "    (select 3)\n" +
+                        "), basket as (\n" +
+                        "  select 1 as basket_id, 1 as client_id\n" +
+                        "  |> UNION ALL\n" +
+                        "    (select 2, 2)\n" +
+                        "), basket_item as (\n" +
+                        "  select 1 as item_id, 1 as basket_id\n" +
+                        "  |> UNION ALL\n" +
+                        "    (select 2, 1),\n" +
+                        "    (select 3, 1),\n" +
+                        "    (select 4, 2)\n" +
+                        "), item as (\n" +
+                        "  select 1 as item_id, 'milk' as name\n" +
+                        "  |> UNION ALL\n" +
+                        "    (select 2, \"chocolate\"),\n" +
+                        "    (select 3, \"donut\"),\n" +
+                        "    (select 4, \"croissant\")\n" +
+                        ")\n" +
+                        "FROM client c\n" +
+                        "  left join basket b using(client_id)\n" +
+                        "  left join basket_item bi using(basket_id)\n" +
+                        "  left join item i on i.item_id = bi.item_id\n" +
+                        "|> aggregate count(i.item_id) as bought_item\n" +
+                        "   group by c.client_id, i.item_id, i.name\n" +
+                        "|> aggregate array_agg((select as struct item_id, name, bought_item)) as items_info\n"
+                        +
+                        "   group by client_id";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @Test
+    void testParseAndDeparseIssue74() throws JSQLParserException {
+        // formatter:off
+        String sqlStr =
+                "FROM\n" +
+                        "  Produce AS p1\n" +
+                        "  JOIN Produce AS p2\n" +
+                        "    USING (item)\n" +
+                        "|> WHERE item = 'bananas'\n" +
+                        "|> SELECT p1.item, p2.sales;";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        // formatter:off
+        sqlStr =
+                "(\n" +
+                        "  SELECT 'apples' AS item, 2 AS sales\n" +
+                        "  UNION ALL\n" +
+                        "  SELECT 'carrots' AS item, 8 AS sales\n" +
+                        ")\n" +
+                        "|> EXTEND item IN ('carrots', 'oranges') AS is_orange;";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        // formatter:off
+        sqlStr =
+                "(\n" +
+                        "  SELECT 'apples' AS item, 2 AS sales\n" +
+                        "  UNION ALL\n" +
+                        "  SELECT 'bananas' AS item, 5 AS sales\n" +
+                        "  UNION ALL\n" +
+                        "  SELECT 'carrots' AS item, 8 AS sales\n" +
+                        ")\n" +
+                        "|> EXTEND SUM(sales) OVER() AS total_sales;";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        // formatter:off
+        sqlStr =
+                "(\n" +
+                        "  SELECT 1 AS x, 11 AS y\n" +
+                        "  UNION ALL\n" +
+                        "  SELECT 2 AS x, 22 AS y\n" +
+                        ")\n" +
+                        "|> SET x = x * x, y = 3";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        // formatter:off
+        sqlStr =
+                "(\n" +
+                        "  SELECT \"000123\" AS id, \"apples\" AS item, 2 AS sales\n" +
+                        "  UNION ALL\n" +
+                        "  SELECT \"000456\" AS id, \"bananas\" AS item, 5 AS sales\n" +
+                        ") AS sales_table\n" +
+                        "|> AGGREGATE SUM(sales) AS total_sales GROUP BY id, item\n" +
+                        "-- The sales_table alias is now out of scope. We must introduce a new one.\n"
+                        +
+                        "|> AS t1\n" +
+                        "|> JOIN (SELECT 456 AS id, \"yellow\" AS color) AS t2\n" +
+                        "   ON CAST(t1.id AS INT64) = t2.id\n" +
+                        "|> SELECT t2.id, total_sales, color;";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        // formatter:off
+        sqlStr =
+                "(\n" +
+                        "  SELECT 'apples' AS item, 2 AS sales\n" +
+                        "  UNION ALL\n" +
+                        "  SELECT 'bananas' AS item, 5 AS sales\n" +
+                        "  UNION ALL\n" +
+                        "  SELECT 'carrots' AS item, 8 AS sales\n" +
+                        ")\n" +
+                        "|> WHERE sales >= 3;";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+
+        // formatter:off
+        sqlStr =
+                "FROM Produce\n" +
+                        "|> AGGREGATE SUM(sales) AS total_sales ASC\n" +
+                        "   GROUP BY item, category DESC;";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+        // formatter:off
+        sqlStr =
+                "SELECT * FROM UNNEST(ARRAY<INT64>[1, 2, 3]) AS number\n" +
+                        "|> UNION ALL (SELECT 1);";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+
+
+        // formatter:off
+        sqlStr =
+                "WITH\n" +
+                        "  NumbersTable AS (\n" +
+                        "    SELECT 1 AS one_digit, 10 AS two_digit\n" +
+                        "    UNION ALL\n" +
+                        "    SELECT 2, 20\n" +
+                        "    UNION ALL\n" +
+                        "    SELECT 3, 30\n" +
+                        "  )\n" +
+                        "SELECT one_digit, two_digit FROM NumbersTable\n" +
+                        "|> INTERSECT ALL BY NAME\n" +
+                        "    (SELECT 10 AS two_digit, 1 AS one_digit);";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @Test
+    void testParseAndDeparseNestedWithIssue2168() throws JSQLParserException {
+        // formatter:off
+        String sqlStr =
+                "with b as (\n" +
+                        "    with a as (select 1)\n" +
+                        "    from a )\n" +
+                        "from b\n" +
+                        ";";
+        // formatter:on
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/JoinPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/JoinPipeOperatorTest.java
index 6600449cb..f14de993a 100644
--- a/src/test/java/net/sf/jsqlparser/statement/piped/JoinPipeOperatorTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/JoinPipeOperatorTest.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.JSQLParserException;
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/LimitPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/LimitPipeOperatorTest.java
index 17c86bbab..10468390a 100644
--- a/src/test/java/net/sf/jsqlparser/statement/piped/LimitPipeOperatorTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/LimitPipeOperatorTest.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.JSQLParserException;
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/PivotPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/PivotPipeOperatorTest.java
new file mode 100644
index 000000000..6898099f4
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/PivotPipeOperatorTest.java
@@ -0,0 +1,34 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.piped;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+
+class PivotPipeOperatorTest {
+    @Test
+    void testParseAndDeparse() throws JSQLParserException {
+        String sqlStr = "(\n" +
+                "  SELECT \"kale\" AS product, 51 AS sales, \"Q1\" AS quarter\n" +
+                "  UNION ALL\n" +
+                "  SELECT \"kale\" AS product, 4 AS sales, \"Q1\" AS quarter\n" +
+                "  UNION ALL\n" +
+                "  SELECT \"kale\" AS product, 45 AS sales, \"Q2\" AS quarter\n" +
+                "  UNION ALL\n" +
+                "  SELECT \"apple\" AS product, 8 AS sales, \"Q1\" AS quarter\n" +
+                "  UNION ALL\n" +
+                "  SELECT \"apple\" AS product, 10 AS sales, \"Q2\" AS quarter\n" +
+                ")\n" +
+                "|> PIVOT(SUM(sales) FOR quarter IN (\"Q1\", \"Q2\"));";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/SelectPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/SelectPipeOperatorTest.java
index 5e4ad42ad..cc164b55a 100644
--- a/src/test/java/net/sf/jsqlparser/statement/piped/SelectPipeOperatorTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/SelectPipeOperatorTest.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.JSQLParserException;
@@ -14,4 +23,14 @@ void testRename() throws JSQLParserException {
                 + "|> SELECT *, t.y AS t_y;";
         TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
+
+    @Test
+    void testDistinct() throws JSQLParserException {
+        String sqlStr = "FROM orders\n" +
+                "|> WHERE order_date >= '2024-01-01'\n" +
+                "|> SELECT DISTINCT customer_id \n" +
+                "|> INNER JOIN customers USING(customer_id)\n" +
+                "|> SELECT *;";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/SetOperationPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/SetOperationPipeOperatorTest.java
new file mode 100644
index 000000000..7efbc0758
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/SetOperationPipeOperatorTest.java
@@ -0,0 +1,48 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.piped;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+
+class SetOperationPipeOperatorTest {
+
+    @Test
+    void parseAndDeparseUnion() throws JSQLParserException {
+        String sqlStr =
+                "SELECT 3\n" +
+                        "|> UNION ALL\n" +
+                        "    (SELECT 1),\n" +
+                        "    (SELECT 2);";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    // @todo: parse SELECT * FROM UNNEST(ARRAY<INT64>[2, 3, 3, 5]) AS number
+
+    @Test
+    void parseAndDeparseIntersect() throws JSQLParserException {
+        String sqlStr =
+                "SELECT * FROM UNNEST(ARRAY[1, 2, 3, 3, 4]) AS number\n" +
+                        "|> INTERSECT DISTINCT\n" +
+                        "    (SELECT * FROM UNNEST(ARRAY[2, 3, 3, 5]) AS number);";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @Test
+    void parseAndDeparseExcept() throws JSQLParserException {
+        String sqlStr =
+                "SELECT * FROM UNNEST(ARRAY[1, 2, 3, 3, 4]) AS number\n" +
+                        "|> EXCEPT DISTINCT\n" +
+                        "    (SELECT * FROM UNNEST(ARRAY[1, 2]) AS number);";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/SetPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/SetPipeOperatorTest.java
index ee3bfaf0c..369298718 100644
--- a/src/test/java/net/sf/jsqlparser/statement/piped/SetPipeOperatorTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/SetPipeOperatorTest.java
@@ -1,3 +1,12 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
 package net.sf.jsqlparser.statement.piped;
 
 import net.sf.jsqlparser.JSQLParserException;
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/TableSamplePipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/TableSamplePipeOperatorTest.java
new file mode 100644
index 000000000..f96e963fc
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/TableSamplePipeOperatorTest.java
@@ -0,0 +1,24 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.piped;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+
+class TableSamplePipeOperatorTest {
+    @Test
+    void testParseAndDeparse() throws JSQLParserException {
+        String sqlStr = "FROM LargeTable\n" +
+                "|> TABLESAMPLE SYSTEM (1.0 PERCENT);\n";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/piped/UnPivotPipeOperatorTest.java b/src/test/java/net/sf/jsqlparser/statement/piped/UnPivotPipeOperatorTest.java
new file mode 100644
index 000000000..4126bce6c
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/piped/UnPivotPipeOperatorTest.java
@@ -0,0 +1,29 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.piped;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+class UnPivotPipeOperatorTest {
+
+    @Test
+    void testParseAndDeparse() throws JSQLParserException {
+        String sqlStr = "(\n" +
+                "  SELECT 'kale' as product, 55 AS Q1, 45 AS Q2\n" +
+                "  UNION ALL\n" +
+                "  SELECT 'apple', 8, 10\n" +
+                ")\n" +
+                "|> UNPIVOT(sales FOR quarter IN (Q1, Q2));";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/DuckDBTest.java b/src/test/java/net/sf/jsqlparser/statement/select/DuckDBTest.java
index 2cb4b57fb..aad68683b 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/DuckDBTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/DuckDBTest.java
@@ -25,4 +25,15 @@ void testFileTable() throws JSQLParserException {
 
         Assertions.assertEquals("'/tmp/test.parquet'", table.getName());
     }
+
+    @Test
+    void testCreateWithStruct() throws JSQLParserException {
+        String sqlStr =
+                "CREATE TABLE starbake.array_test (\n" +
+                        "  keys VARCHAR[] NOT NULL,\n" +
+                        "  values1 struct( field1 varchar(255), field2 double) NOT NULL,\n" +
+                        "  values2 struct( field1 varchar(255), field2 double) NOT NULL\n" +
+                        ");";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java b/src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java
index b8b02dccd..acc510ec3 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java
@@ -137,8 +137,7 @@ public void testRecursiveBracketExpressionIssue1019() {
     @Test
     @Timeout(2000)
     public void testRecursiveBracketExpressionIssue1019_2() throws JSQLParserException {
-        // Temporally set the maxDepth to be 6, was 8 before this
-        doIncreaseOfParseTimeTesting("IF(1=1, $1, 2)", "1", 8);
+        doIncreaseOfParseTimeTesting("IF(1=1, $1, 2)", "1", 10);
     }
 
     @Test
@@ -531,8 +530,6 @@ void testIssue1983() throws JSQLParserException {
                 "3,\n" +
                 "4";
         CCJSqlParserUtil.parse(sqlStr, parser -> parser
-                .withSquareBracketQuotation(false)
-                .withAllowComplexParsing(true)
                 .withTimeOut(60000));
     }
 
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java b/src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java
index 06d1e3d54..9ded16786 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java
@@ -10,14 +10,17 @@
 package net.sf.jsqlparser.statement.select;
 
 import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.expression.Alias;
 import net.sf.jsqlparser.expression.JsonExpression;
 import net.sf.jsqlparser.expression.StringValue;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
 import net.sf.jsqlparser.statement.Statements;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.test.TestUtils;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
@@ -102,4 +105,37 @@ void testNextValueIssue1863() throws JSQLParserException {
         String sqlStr = "SELECT nextval('client_id_seq')";
         assertSqlCanBeParsedAndDeparsed(sqlStr);
     }
+
+    @Test
+    @Disabled
+    // wip
+    void testDollarQuotedText() throws JSQLParserException {
+        String sqlStr = "SELECT $tag$This\nis\na\nselect\ntest\n$tag$ from dual where a=b";
+        PlainSelect st = (PlainSelect) CCJSqlParserUtil.parse(sqlStr);
+
+        StringValue stringValue = st.getSelectItem(0).getExpression(StringValue.class);
+
+        Assertions.assertEquals("This\nis\na\nselect\ntest\n", stringValue.getValue());
+    }
+
+    @Test
+    @Disabled
+    // wip
+    void testQuotedIdentifier() throws JSQLParserException {
+        String sqlStr = "SELECT \"This is a Test Column\" AS [Alias] from `This is a Test Table`";
+        PlainSelect st = (PlainSelect) CCJSqlParserUtil.parse(sqlStr);
+
+        Column column = st.getSelectItem(0).getExpression(Column.class);
+        Assertions.assertEquals("This is a Test Column", column.getUnquotedName());
+        Assertions.assertEquals("\"This is a Test Column\"", column.getColumnName());
+
+        Alias alias = st.getSelectItem(0).getAlias();
+        Assertions.assertEquals("Alias", alias.getUnquotedName());
+        Assertions.assertEquals("[Alias]", alias.getName());
+
+        Table table = st.getFromItem(Table.class);
+        Assertions.assertEquals("This is a Test Table", table.getUnquotedName());
+        Assertions.assertEquals("`This is a Test Table`", table.getName());
+
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SampleClauseTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SampleClauseTest.java
index ea0cf4abf..c7ea265d5 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/SampleClauseTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/SampleClauseTest.java
@@ -11,6 +11,7 @@
 
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 
@@ -41,4 +42,20 @@ void standardOracleIssue1826() throws JSQLParserException {
         String sqlStr = "SELECT * from table_name SAMPLE(99)";
         TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
+
+    @Test
+    void testDuckDB() throws JSQLParserException {
+        String sqlStr = "SELECT *\n" +
+                "FROM (SELECT * FROM addresses)\n" +
+                "USING SAMPLE SYSTEM (10 PERCENT);";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @Test
+    void testBigQuery() throws JSQLParserException {
+        String sqlStr = "SELECT *\n" +
+                "FROM (SELECT * FROM addresses)\n" +
+                "TABLESAMPLE SYSTEM (10 PERCENT);";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectASTTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectASTTest.java
index 2888ed72c..ddc578d26 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/SelectASTTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectASTTest.java
@@ -15,7 +15,7 @@
 import net.sf.jsqlparser.parser.CCJSqlParserDefaultVisitor;
 import net.sf.jsqlparser.parser.CCJSqlParserTreeConstants;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
-import net.sf.jsqlparser.parser.SimpleNode;
+import net.sf.jsqlparser.parser.Node;
 import net.sf.jsqlparser.parser.Token;
 import net.sf.jsqlparser.schema.Column;
 
@@ -39,13 +39,13 @@ public void testSelectASTColumn() throws JSQLParserException {
         for (SelectItem item : plainSelect.getSelectItems()) {
             SelectItem<?> sei = (SelectItem) item;
             Column c = sei.getExpression(Column.class);
-            SimpleNode astNode = c.getASTNode();
+            Node astNode = c.getASTNode();
             assertNotNull(astNode);
             b.setCharAt(astNode.jjtGetFirstToken().beginColumn - 1, '*');
         }
         for (OrderByElement item : plainSelect.getOrderByElements()) {
             Column c = item.getExpression(Column.class);
-            SimpleNode astNode = c.getASTNode();
+            Node astNode = c.getASTNode();
             assertNotNull(astNode);
             b.setCharAt(astNode.jjtGetFirstToken().beginColumn - 1, '#');
         }
@@ -55,7 +55,7 @@ public void testSelectASTColumn() throws JSQLParserException {
     @Test
     public void testSelectASTNode() throws JSQLParserException {
         String sql = "SELECT  a,  b FROM  mytable  order by   b,  c";
-        SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
+        Node node = (Node) CCJSqlParserUtil.parseAST(sql);
         node.dump("*");
         assertEquals(CCJSqlParserTreeConstants.JJTSTATEMENT, node.getId());
     }
@@ -66,12 +66,12 @@ public void testSelectASTNode() throws JSQLParserException {
     // @Test
     // public void testSelectASTNodeSubSelect() throws JSQLParserException {
     // String sql = "SELECT * FROM mytable where 0<(select count(*) from mytable2)";
-    // SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
+    // Node node = (Node) CCJSqlParserUtil.parseAST(sql);
     // node.dump("*");
     // assertEquals(CCJSqlParserTreeConstants.JJTSTATEMENT, node.getId());
     // node.jjtAccept(new CCJSqlParserDefaultVisitor() {
     // @Override
-    // public Object visit(SimpleNode node, Object data) {
+    // public Object visit(Node node, Object data) {
     // if (node.getId() == CCJSqlParserTreeConstants.JJTSUBSELECT) {
     // subSelectStart = node.jjtGetFirstToken();
     // subSelectEnd = node.jjtGetLastToken();
@@ -95,13 +95,13 @@ public void testSelectASTColumnLF() throws JSQLParserException {
         PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true);
         for (SelectItem<?> item : plainSelect.getSelectItems()) {
             Column c = item.getExpression(Column.class);
-            SimpleNode astNode = c.getASTNode();
+            Node astNode = c.getASTNode();
             assertNotNull(astNode);
             b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '*');
         }
         for (OrderByElement item : plainSelect.getOrderByElements()) {
             Column c = item.getExpression(Column.class);
-            SimpleNode astNode = c.getASTNode();
+            Node astNode = c.getASTNode();
             assertNotNull(astNode);
             b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '#');
         }
@@ -116,13 +116,13 @@ public void testSelectASTCommentLF() throws JSQLParserException {
         PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true);
         for (SelectItem<?> item : plainSelect.getSelectItems()) {
             Column c = item.getExpression(Column.class);
-            SimpleNode astNode = c.getASTNode();
+            Node astNode = c.getASTNode();
             assertNotNull(astNode);
             b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '*');
         }
         for (OrderByElement item : plainSelect.getOrderByElements()) {
             Column c = item.getExpression(Column.class);
-            SimpleNode astNode = c.getASTNode();
+            Node astNode = c.getASTNode();
             assertNotNull(astNode);
             b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '#');
         }
@@ -139,13 +139,13 @@ public void testSelectASTCommentCRLF() throws JSQLParserException {
         PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true);
         for (SelectItem<?> item : plainSelect.getSelectItems()) {
             Column c = item.getExpression(Column.class);
-            SimpleNode astNode = c.getASTNode();
+            Node astNode = c.getASTNode();
             assertNotNull(astNode);
             b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '*');
         }
         for (OrderByElement item : plainSelect.getOrderByElements()) {
             Column c = item.getExpression(Column.class);
-            SimpleNode astNode = c.getASTNode();
+            Node astNode = c.getASTNode();
             assertNotNull(astNode);
             b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '#');
         }
@@ -157,12 +157,12 @@ public void testSelectASTCommentCRLF() throws JSQLParserException {
     @Test
     public void testDetectInExpressions() throws JSQLParserException {
         String sql = "SELECT * FROM  mytable WHERE a IN (1,2,3,4,5,6,7)";
-        SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
+        Node node = (Node) CCJSqlParserUtil.parseAST(sql);
         node.dump("*");
         assertEquals(CCJSqlParserTreeConstants.JJTSTATEMENT, node.getId());
         node.jjtAccept(new CCJSqlParserDefaultVisitor() {
             @Override
-            public Object visit(SimpleNode node, Object data) {
+            public Object visit(Node node, Object data) {
                 if (node.getId() == CCJSqlParserTreeConstants.JJTINEXPRESSION) {
                     subSelectStart = node.jjtGetFirstToken();
                     subSelectEnd = node.jjtGetLastToken();
@@ -175,7 +175,7 @@ public Object visit(SimpleNode node, Object data) {
 
         assertNotNull(subSelectStart);
         assertNotNull(subSelectEnd);
-        assertEquals(30, subSelectStart.beginColumn);
+        assertEquals(32, subSelectStart.beginColumn);
         assertEquals(49, subSelectEnd.endColumn);
     }
 
@@ -183,12 +183,12 @@ public Object visit(SimpleNode node, Object data) {
     public void testSelectASTExtractWithCommentsIssue1580() throws JSQLParserException {
         String sql =
                 "SELECT  /* testcomment */ \r\n a,  b FROM  -- testcomment2 \r\n mytable \r\n order by   b,  c";
-        SimpleNode root = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
+        Node root = (Node) CCJSqlParserUtil.parseAST(sql);
         List<Token> comments = new ArrayList<>();
 
         root.jjtAccept(new CCJSqlParserDefaultVisitor() {
             @Override
-            public Object visit(SimpleNode node, Object data) {
+            public Object visit(Node node, Object data) {
                 if (node.jjtGetFirstToken().specialToken != null) {
                     // needed since for different nodes we got the same first token
                     if (!comments.contains(node.jjtGetFirstToken().specialToken)) {
@@ -207,7 +207,7 @@ public Object visit(SimpleNode node, Object data) {
     public void testSelectASTExtractWithCommentsIssue1580_2() throws JSQLParserException {
         String sql = "/* I want this comment */\n" + "SELECT order_detail_id, quantity\n"
                 + "/* But ignore this one safely */\n" + "FROM order_details;";
-        SimpleNode root = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
+        Node root = (Node) CCJSqlParserUtil.parseAST(sql);
 
         assertThat(root.jjtGetFirstToken().specialToken.image)
                 .isEqualTo("/* I want this comment */");
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
index 4164f1cbc..1ba1bb4a7 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
@@ -58,6 +58,7 @@
 import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
 import net.sf.jsqlparser.expression.operators.relational.InExpression;
 import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
+import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect;
 import net.sf.jsqlparser.parser.CCJSqlParserManager;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.schema.Column;
@@ -1058,6 +1059,27 @@ public void testDistinct() throws JSQLParserException {
                 .getExpression()).getColumnName());
     }
 
+    @Test
+    public void testDistinctRow() throws JSQLParserException {
+        String statement =
+                "SELECT DISTINCTROW col1, col2 FROM mytable WHERE mytable.col = 9";
+        Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true);
+
+        assertInstanceOf(PlainSelect.class, select);
+
+        PlainSelect plainSelect = (PlainSelect) select;
+        Distinct distinct = plainSelect.getDistinct();
+
+        assertNotNull(distinct);
+        assertTrue(distinct.isUseDistinctRow());
+        assertNull(distinct.getOnSelectItems());
+
+        assertEquals("col1", ((Column) (plainSelect.getSelectItems().get(0))
+                .getExpression()).getColumnName());
+        assertEquals("col2", ((Column) (plainSelect.getSelectItems().get(1))
+                .getExpression()).getColumnName());
+    }
+
     @Test
     public void testIsDistinctFrom() throws JSQLParserException {
         String stmt = "SELECT name FROM tbl WHERE name IS DISTINCT FROM foo";
@@ -2271,6 +2293,18 @@ public void testIsNotFalse() throws JSQLParserException {
         assertSqlCanBeParsedAndDeparsed(statement);
     }
 
+    @Test
+    public void testIsUnknown() throws JSQLParserException {
+        String statement = "SELECT col FROM tbl WHERE col IS UNKNOWN";
+        assertSqlCanBeParsedAndDeparsed(statement);
+    }
+
+    @Test
+    public void testIsNotUnknown() throws JSQLParserException {
+        String statement = "SELECT col FROM tbl WHERE col IS NOT UNKNOWN";
+        assertSqlCanBeParsedAndDeparsed(statement);
+    }
+
     @Test
     public void testTSQLJoin() throws JSQLParserException {
         String stmt = "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a *= tabelle2.b";
@@ -2762,6 +2796,19 @@ public void testPivot5() throws JSQLParserException {
         assertSqlCanBeParsedAndDeparsed(stmt);
     }
 
+    @Test
+    void testPivotWithOrderBy() throws JSQLParserException {
+        String sqlStr = "" +
+                "SELECT *\n" +
+                "FROM (\n" +
+                "       SELECT 'kale' AS product, 51 AS sales, 'Q1' AS quarter\n" +
+                "     )\n" +
+                "PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2'))\n" +
+                "ORDER BY 1\n" +
+                ";";
+        assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
     @Test
     public void testPivotXml1() throws JSQLParserException {
         String stmt = "SELECT * FROM mytable PIVOT XML (count(a) FOR b IN ('val1'))";
@@ -5461,6 +5508,12 @@ public void testReservedKeywordsIssue1352() throws JSQLParserException {
         assertSqlCanBeParsedAndDeparsed("SELECT fulltext from fulltext.fulltext", true);
     }
 
+    @Test
+    public void testGroupByWithAllTableColumns() throws JSQLParserException {
+        assertSqlCanBeParsedAndDeparsed(
+                "select c.post_id, p.* from posts p inner join comments c on c.post_id = p.post_id group by p.post_id, c.post_id, p.*;");
+    }
+
     @Test
     public void testTableSpaceKeyword() throws JSQLParserException {
         // without extra brackets
@@ -6142,4 +6195,216 @@ public void testSelectWithSkylineKeywords() throws JSQLParserException {
                 select.getPlainSelect().getSelectItems().toString());
     }
 
+    @Test
+    @Disabled
+    // see issue #2207
+    public void testSelectAllColumnsFromFunctionReturn() throws JSQLParserException {
+        String sql = "SELECT (pg_stat_file('postgresql.conf')).*";
+        Statement statement = CCJSqlParserUtil.parse(sql);
+        assertNotNull(statement);
+        assertTrue(statement instanceof Select);
+
+        // Ensure the function is recognized correctly
+        Select select = (Select) statement;
+        PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
+        assertNotNull(plainSelect);
+        assertEquals(1, plainSelect.getSelectItems().size());
+        assertTrue(plainSelect.getSelectItems().get(0)
+                .getExpression() instanceof FunctionAllColumns);
+        assertEquals("(pg_stat_file('postgresql.conf')).*",
+                plainSelect.getSelectItems().get(0).toString());
+    }
+
+    @Test
+    @Disabled
+    // see issue #2207
+    public void testSelectAllColumnsFromFunctionReturnWithMultipleParentheses()
+            throws JSQLParserException {
+        String sql = "SELECT ( ( ( pg_stat_file('postgresql.conf') ) )) . *";
+        Statement statement = CCJSqlParserUtil.parse(sql);
+        assertNotNull(statement);
+        assertTrue(statement instanceof Select);
+
+        // Ensure the function is recognized correctly
+        Select select = (Select) statement;
+        PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
+        assertNotNull(plainSelect);
+        assertEquals(1, plainSelect.getSelectItems().size());
+        assertTrue(plainSelect.getSelectItems().get(0)
+                .getExpression() instanceof FunctionAllColumns);
+        assertEquals("(pg_stat_file('postgresql.conf')).*",
+                plainSelect.getSelectItems().get(0).toString());
+    }
+
+    @Test
+    void testIssue2242SubSelectLookAhead() throws JSQLParserException {
+        String sqlStr = "INSERT INTO foo(col1, col2, col3, col4, col5, col6)\n"
+                + "      VALUES ( (SELECT blah FROM bar INNER JOIN bam ON bar.col1 = bam.col1 WHERE bar.id = ? AND et.id = ?), ?, ?, ?, ?, ?)\n"
+                + "      ON CONFLICT (id) DO UPDATE\n"
+                + "      SET col4 = ?, col5 = ?, col6 = ?";
+        Statement statement = CCJSqlParserUtil.parse(sqlStr);
+        System.out.println(statement.toString());
+        Insert insert = (Insert) statement;
+        Assertions.assertEquals("foo", insert.getTable().toString());
+    }
+
+    @Test
+    void testIssue2255() throws JSQLParserException {
+        String sqlStr = "select\n"
+                + "       sum(if(log.\"output\" = 'SUCCESS', 1, 0))                                   success_req_num\n"
+                + "from mysql_kt_plan.daily_cvmapi_runinstance_log log";
+        CCJSqlParserUtil.parse(sqlStr);
+    }
+
+    @Test
+    void testIssue2257() throws JSQLParserException {
+        String sqlStr = "SELECT sum(iif(diff = 7, lc_lv, 0)) AS lc_7\n"
+                + "FROM (  SELECT  a.day\n"
+                + "                , a.channel_type\n"
+                + "                , a.username\n"
+                + "                , a.diff\n"
+                + "                , a.cnt\n"
+                + "                , lc\n"
+                + "                ,  Cast( lc / cnt AS DECIMAL (38, 4) ) AS lc_lv\n"
+                + "        FROM (  SELECT  a.day\n"
+                + "                        , a.channel_type\n"
+                + "                        , a.username\n"
+                + "                        , Datediff( b.day, a.day )\n"
+                + "                             + 1 AS diff\n"
+                + "                        , cnt\n"
+                + "                        , Count( DISTINCT b.user_id ) AS lc\n"
+                + "                FROM (  SELECT  a.day\n"
+                + "                                , a.user_id\n"
+                + "                                , channel_id channel_type\n"
+                + "                                , adtrace_adgroup_id AS username\n"
+                + "                        FROM (  SELECT  day\n"
+                + "                                        , a.user_id\n"
+                + "                                        , last_login_channel_id AS channel_id\n"
+                + "                                        , last_adtrace_adgroup_id AS adtrace_adgroup_id\n"
+                + "                                FROM (  SELECT  day\n"
+                + "                                                , user_id\n"
+                + "                                                , yidevice\n"
+                + "                                        FROM (  SELECT  day\n"
+                + "                                                        , user_id\n"
+                + "                                                        , yidevice\n"
+                + "                                                        , Row_Number(  )\n"
+                + "                                                                OVER (PARTITION BY day, user_id ORDER BY event_time) AS rk\n"
+                + "                                                FROM dwd_table.event_pj\n"
+                + "                                                WHERE day BETWEEN '2025-05-30'\n"
+                + "                                                                 AND '2025-06-06'\n"
+                + "                                                    AND event_id = 'device_login'\n"
+                + "                                                    AND yidevice IS NOT NULL\n"
+                + "                                                    AND yidevice != '' ) a\n"
+                + "                                        WHERE rk = 1 ) a\n"
+                + "                                    LEFT JOIN ( SELECT DISTINCT\n"
+                + "                                                    From_Unixtime(  Cast( (  Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ) AS last_adtrace_dt\n"
+                + "                                                    , yidevice\n"
+                + "                                                    , last_login_channel_id\n"
+                + "                                                    , last_adtrace_adgroup_id\n"
+                + "                                                    , last_adtrace_creative_id\n"
+                + "                                                FROM dwd_user.yidevice_pj\n"
+                + "                                                WHERE  Cast( adtrace_reattributed_times AS INT ) > 0\n"
+                + "                                                    AND Datediff( From_Unixtime(  Cast( (  Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ), create_date ) >= 30\n"
+                + "                                                    AND From_Unixtime(  Cast( (  Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ) BETWEEN '2025-05-30'\n"
+                + "                                                                                                                                                                         AND '2025-06-06' ) b\n"
+                + "                                        ON a.day = b.last_adtrace_dt\n"
+                + "                                            AND a.yidevice = b.yidevice ) a  ) a\n"
+                + "                    LEFT JOIN ( SELECT  day\n"
+                + "                                        , user_id\n"
+                + "                                FROM dwd_table.event_pj\n"
+                + "                                WHERE day BETWEEN '2025-05-30'\n"
+                + "                                                 AND '2025-06-06'\n"
+                + "                                    AND event_id = 'login'\n"
+                + "                                GROUP BY    day\n"
+                + "                                            , user_id ) b\n"
+                + "                        ON a.user_id = b.user_id\n"
+                + "                    LEFT JOIN ( SELECT  a.day\n"
+                + "                                        , channel_type\n"
+                + "                                        , username\n"
+                + "                                        , Count( DISTINCT a.user_id ) AS cnt\n"
+                + "                                FROM (  SELECT  a.day\n"
+                + "                                                , a.user_id\n"
+                + "                                                , channel_id AS channel_type\n"
+                + "                                                , adtrace_adgroup_id username\n"
+                + "                                        FROM (  SELECT  day\n"
+                + "                                                        , a.user_id\n"
+                + "                                                        , last_login_channel_id AS channel_id\n"
+                + "                                                        , last_adtrace_adgroup_id AS adtrace_adgroup_id\n"
+                + "                                                FROM (  SELECT  day\n"
+                + "                                                                , user_id\n"
+                + "                                                                , yidevice\n"
+                + "                                                        FROM (  SELECT  day\n"
+                + "                                                                        , user_id\n"
+                + "                                                                        , yidevice\n"
+                + "                                                                        , Row_Number(  )\n"
+                + "                                                                                OVER (PARTITION BY day, user_id ORDER BY event_time) AS rk\n"
+                + "                                                                FROM dwd_table.event_pj\n"
+                + "                                                                WHERE day BETWEEN '2025-05-30'\n"
+                + "                                                                                 AND '2025-06-06'\n"
+                + "                                                                    AND event_id = 'device_login'\n"
+                + "                                                                    AND yidevice IS NOT NULL\n"
+                + "                                                                    AND yidevice != '' ) a\n"
+                + "                                                        WHERE rk = 1 ) a\n"
+                + "                                                    LEFT JOIN ( SELECT DISTINCT\n"
+                + "                                                                    From_Unixtime(  Cast( (  Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ) AS last_adtrace_dt\n"
+                + "                                                                    , yidevice\n"
+                + "                                                                    , last_login_channel_id\n"
+                + "                                                                    , last_adtrace_adgroup_id\n"
+                + "                                                                    , last_adtrace_creative_id\n"
+                + "                                                                FROM dwd_user.yidevice_pj\n"
+                + "                                                                WHERE  Cast( adtrace_reattributed_times AS INT ) > 0\n"
+                + "                                                                    AND Datediff( From_Unixtime(  Cast( (  Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ), create_date ) >= 30\n"
+                + "                                                                    AND From_Unixtime(  Cast( (  Cast( last_adtrace_time AS BIGINT ) + 28800000 ) / 1000 AS BIGINT ), 'yyyy-MM-dd' ) BETWEEN '2025-05-30'\n"
+                + "                                                                                                                                                                                         AND '2025-06-06' ) b\n"
+                + "                                                        ON a.day = b.last_adtrace_dt\n"
+                + "                                                            AND a.yidevice = b.yidevice ) a  ) a\n"
+                + "                                GROUP BY    a.day\n"
+                + "                                            , channel_type\n"
+                + "                                            , username ) c\n"
+                + "                        ON a.day = c.day\n"
+                + "                            AND a.channel_type = c.channel_type\n"
+                + "                            AND a.username = c.username\n"
+                + "                GROUP BY    a.day\n"
+                + "                            , a.channel_type\n"
+                + "                            , a.username\n"
+                + "                            , diff\n"
+                + "                            , cnt ) a\n"
+                + "        WHERE diff > 1\n"
+                + "            AND diff <= 7 ) a\n"
+                + "GROUP BY    username\n"
+                + "            , channel_type\n"
+                + "            , day\n"
+                + "            , cnt\n"
+                + "ORDER BY    username DESC\n"
+                + "            , channel_type\n"
+                + "            , day DESC\n"
+                + ";";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(
+                sqlStr, true, parser -> parser
+                        .withAllowComplexParsing(true)
+                        .withAllowedNestingDepth(-1));
+    }
+
+    @Test
+    void testQuotedStringValueIssue2258() throws JSQLParserException {
+        String sqlStr = "SELECT 'yyyy-MM-dd''T''HH:mm:ss'";
+        PlainSelect select = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+        Assertions.assertEquals(
+                "yyyy-MM-dd'T'HH:mm:ss", select
+                        .getSelectItem(0)
+                        .getExpression(StringValue.class)
+                        .getNotExcapedValue());
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "SELECT * FROM ( IMPORT FROM EXA AT connectionName STATEMENT 'select 1' )",
+            "SELECT * FROM ( IMPORT INTO ( LIKE schemaName.tableName ( a, b as c) ) FROM EXA AT connectionName STATEMENT 'select 1' )",
+            "SELECT * FROM schemaName.tableName JOIN ( IMPORT FROM EXA AT connectionName STATEMENT 'select 1' ) USING ( columnName )"
+    })
+    public void testSelectWithSubImport(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
+                parser -> parser.withDialect(Dialect.EXASOL));
+    }
+
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SpeedTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SpeedTest.java
index 21565c78f..19908e675 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/SpeedTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/SpeedTest.java
@@ -15,6 +15,7 @@
 import net.sf.jsqlparser.statement.simpleparsing.CCJSqlParserManagerTest;
 import net.sf.jsqlparser.test.TestException;
 import net.sf.jsqlparser.util.TablesNamesFinder;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 import java.io.BufferedReader;
@@ -30,6 +31,9 @@ public class SpeedTest {
     private final CCJSqlParserManager parserManager = new CCJSqlParserManager();
 
     @Test
+    @Disabled
+    // replaced by a proper JMH based benchmark
+    // @todo: remove this eventually
     public void testSpeed() throws Exception {
         // all the statements in testfiles/simple_parsing.txt
         BufferedReader in = new BufferedReader(
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java b/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java
index b53000455..faf4cbe8c 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java
@@ -12,6 +12,8 @@
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.test.TestUtils;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 import static org.junit.jupiter.api.Assertions.*;
 
@@ -47,4 +49,14 @@ void testTableFunctionWithNamedParameterWhereNameIsOuterKeyword() throws JSQLPar
                         "     lateral flatten(input => i.DATA_VALUE:Friends, outer => true) AS f1;";
         TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
     }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "OFFSET",
+            "ORDINALITY"
+    })
+    void testTableFunctionWithSupportedWithClauses(String withClause) throws JSQLParserException {
+        String sqlStr = "SELECT * FROM UNNEST(ARRAY[1, 2, 3]) WITH " + withClause + " AS t(a, b)";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/TimeTravelTest.java b/src/test/java/net/sf/jsqlparser/statement/select/TimeTravelTest.java
new file mode 100644
index 000000000..1c7f2eb23
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/select/TimeTravelTest.java
@@ -0,0 +1,101 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.select;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class TimeTravelTest {
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "SELECT * FROM my_table AT(TIMESTAMP => 'Wed, 26 Jun 2024 09:20:00 -0700'::TIMESTAMP_LTZ);",
+            "SELECT * FROM my_table AT(OFFSET => -60*5) AS T WHERE T.flag = 'valid';",
+            "SELECT * FROM my_table AT(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');",
+            "SELECT * FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');",
+            "SELECT oldt.* ,newt.*\n"
+                    + "  FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS oldt\n"
+                    + "    FULL OUTER JOIN my_table AT(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS newt\n"
+                    + "    ON oldt.id = newt.id\n"
+                    + "  WHERE oldt.id IS NULL OR newt.id IS NULL;"
+    })
+    void testSnowflakeAtBefore(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "SELECT C1\n"
+                    + "  FROM t1\n"
+                    + "  CHANGES(INFORMATION => APPEND_ONLY)\n"
+                    + "  AT(TIMESTAMP => CURRENT_TIMESTAMP)\n"
+                    + "  END(TIMESTAMP => CURRENT_TIMESTAMP);",
+            "SELECT *\n"
+                    + " FROM t1\n"
+                    + "   CHANGES(INFORMATION => APPEND_ONLY)\n"
+                    + "   AT(TIMESTAMP => $ts1);",
+            "CREATE OR REPLACE TABLE t2 (\n"
+                    + "  c1 varchar(255) default NULL\n"
+                    + "  )\n"
+                    + "AS SELECT C1\n"
+                    + "  FROM t1\n"
+                    + "  CHANGES(INFORMATION => APPEND_ONLY)\n"
+                    + "  AT(TIMESTAMP => $ts1)\n"
+                    + "  END(TIMESTAMP => $ts2);\n",
+            "CREATE OR REPLACE TABLE t2 (\n"
+                    + "  c1 varchar(255) default NULL\n"
+                    + "  )\n"
+                    + "AS SELECT C1\n"
+                    + "  FROM t1\n"
+                    + "  CHANGES(INFORMATION => APPEND_ONLY)\n"
+                    + "  AT(STREAM => 's1')\n"
+                    + "  END(TIMESTAMP => $ts2);\n"
+    })
+    void testSnowflakeChange(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "SELECT * FROM delta.`/delta/events` @ 20240618093000000;\n",
+            "SELECT * FROM delta.`/delta/events` @V 5;\n",
+            "SELECT * FROM delta.`/delta/events` TIMESTAMP AS OF '2024-06-01T00:00:00';\n",
+            "SELECT * FROM delta.`/delta/events` VERSION AS OF 3;\n",
+            "MERGE INTO target_table AS t\n"
+                    + "USING source_table VERSION AS OF 5 AS s\n"
+                    + "ON t.id = s.id\n"
+                    + "WHEN MATCHED THEN UPDATE SET t.value = s.value;\n"
+    })
+    void testDataBricksTemporalSpec(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "SELECT *\n"
+                    + "FROM t\n"
+                    + "  FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);\n",
+            "SELECT *\n"
+                    + "FROM t\n"
+                    + "  FOR SYSTEM_TIME AS OF '2017-01-01 10:00:00-07:00';\n",
+            "SELECT *\n"
+                    + "FROM t1\n"
+                    + "WHERE t1.a IN (SELECT t2.a\n"
+                    + "               FROM t2 FOR SYSTEM_TIME AS OF t1.timestamp_column);\n",
+            "SELECT * FROM books FOR SYSTEM_TIME AS OF before_replace_timestamp;",
+            "INSERT INTO t1\n"
+                    + "SELECT * FROM t1\n"
+                    + "  FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY);\n"
+    })
+    void testBigQueryHistoricVersion(String sqlStr) throws JSQLParserException {
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/WithItemTest.java b/src/test/java/net/sf/jsqlparser/statement/select/WithItemTest.java
new file mode 100644
index 000000000..7517b9a36
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/select/WithItemTest.java
@@ -0,0 +1,29 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2025 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.select;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.test.TestUtils;
+import org.junit.jupiter.api.Test;
+
+class WithItemTest {
+
+    @Test
+    void testNotMaterializedIssue2251() throws JSQLParserException {
+        String sqlStr = "WITH devices AS NOT MATERIALIZED (\n"
+                + "  SELECT\n"
+                + "    d.uuid AS device_uuid\n"
+                + "  FROM active_devices d\n"
+                + ")\n"
+                + "SELECT 1;";
+        TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
+    }
+
+}
diff --git a/src/test/java/net/sf/jsqlparser/test/AssortedFeatureTests.java b/src/test/java/net/sf/jsqlparser/test/AssortedFeatureTests.java
index 07fdb858b..c0132155f 100644
--- a/src/test/java/net/sf/jsqlparser/test/AssortedFeatureTests.java
+++ b/src/test/java/net/sf/jsqlparser/test/AssortedFeatureTests.java
@@ -10,10 +10,14 @@
 package net.sf.jsqlparser.test;
 
 import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.expression.Alias;
+import net.sf.jsqlparser.expression.Function;
 import net.sf.jsqlparser.expression.LongValue;
 import net.sf.jsqlparser.expression.StringValue;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SelectItem;
 import net.sf.jsqlparser.util.deparser.ExpressionDeParser;
 import net.sf.jsqlparser.util.deparser.SelectDeParser;
 import net.sf.jsqlparser.util.deparser.StatementDeParser;
@@ -61,4 +65,54 @@ public void testIssue1608() throws JSQLParserException {
                 "INSERT INTO example (num, name, address, tel) VALUES (1, 'name', 'test ', '1234-1234')"));
         System.out.println(cleanStatement("DELETE FROM table1 where col=5 and col2=4"));
     }
+
+    @Test
+    void addSelectItemTest() throws JSQLParserException {
+        String provided = "SELECT col1 FROM WHATEVER";
+        String expected = "SELECT col1, Sum(1, 2) AS col2 FROM WHATEVER";
+
+        PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(provided);
+
+        Function f = new Function("Sum", new LongValue(1), new LongValue(2));
+        SelectItem<?> i = new SelectItem<>(f, new Alias("col2", true));
+
+        select
+                .getSelectItems()
+                .add(i);
+
+        TestUtils.assertStatementCanBeDeparsedAs(select, expected);
+    }
+
+    @Test
+    void removeSelectItemTest() throws JSQLParserException {
+        String provided = "SELECT col1, Sum(1, 2) AS col2 FROM WHATEVER";
+        String expected = "SELECT col1 FROM WHATEVER";
+
+        PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(provided);
+
+        select
+                .getSelectItems()
+                .remove(1);
+
+        TestUtils.assertStatementCanBeDeparsedAs(select, expected);
+    }
+
+    @Test
+    void sweapSelectItemTest() throws JSQLParserException {
+        String provided = "SELECT col1 FROM WHATEVER";
+        String expected = "SELECT Sum(1, 2) AS col1 FROM WHATEVER";
+
+        PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(provided);
+
+        Function f = new Function("Sum", new LongValue(1), new LongValue(2));
+        SelectItem<?> i = new SelectItem<>(f, new Alias("col1", true));
+        select
+                .getSelectItems()
+                .remove(0);
+        select
+                .getSelectItems()
+                .add(0, i);
+
+        TestUtils.assertStatementCanBeDeparsedAs(select, expected);
+    }
 }
diff --git a/src/test/java/net/sf/jsqlparser/util/ReflectionTestUtils.java b/src/test/java/net/sf/jsqlparser/util/ReflectionTestUtils.java
index 8be1c9275..07dec9f07 100644
--- a/src/test/java/net/sf/jsqlparser/util/ReflectionTestUtils.java
+++ b/src/test/java/net/sf/jsqlparser/util/ReflectionTestUtils.java
@@ -129,7 +129,7 @@ public static void testMethodInvocation(Object object,
             BiPredicate<Object, Method> returnTypeCheck,
             Function<Method, Object[]> argsFunction,
             Predicate<Method>... methodFilters) {
-        log(Level.INFO, "testing methods of class " + object.getClass());
+        log(Level.FINE, "testing methods of class " + object.getClass());
         for (Method m : object.getClass().getMethods()) {
             boolean testMethod = true;
             for (Predicate<Method> f : methodFilters) {
@@ -140,7 +140,7 @@ public static void testMethodInvocation(Object object,
                 }
             }
             if (testMethod) {
-                log(Level.INFO, "testing method " + m.toGenericString());
+                log(Level.FINE, "testing method " + m.toGenericString());
                 try {
                     invoke(m, returnTypeCheck, argsFunction, object);
                 } catch (Exception e) {
diff --git a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java
index 111fba75a..19a619c88 100644
--- a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java
+++ b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java
@@ -505,6 +505,75 @@ void testSubqueryAliasesIssue1987() throws JSQLParserException {
         tables = TablesNamesFinder.findTables(sqlStr);
         assertThat(tables).containsExactlyInAnyOrder("a", "b");
         assertThat(tables).doesNotContain("a1");
+
+        sqlStr = "select (a_alias.col1), b_alias.col2\n" +
+                "from b b_alias, a as a_alias, c join b on c.id = b.id\n" +
+                "where b_alias.id = a_alias.id and c.id = b_alias.id";
+        tables = TablesNamesFinder.findTables(sqlStr);
+        assertThat(tables).containsExactlyInAnyOrder("a", "b", "c");
+
+        sqlStr = "with\n" +
+                "temp1 as (( select * from b )),\n" +
+                "temp2 as ( select (((temp1_alias1.id))) from temp1 temp1_alias1 )\n" +
+                "select a_alias.col1, temp1_alias2.col2\n" +
+                "from temp1 temp1_alias2, a as a_alias, temp2 join c c_alias on c_alias.id = temp2.id\n"
+                +
+                "where c.id = temp1_alias2.id";
+        tables = TablesNamesFinder.findTables(sqlStr);
+        assertThat(tables).containsExactlyInAnyOrder("a", "b", "c");
+
+        sqlStr = "select a.id, (select max(val) from e) as maxval\n" +
+                "from a, (select * from b, (select * from c) c_alias) as bc_nested\n" +
+                "            where a.id in ( select id from bc_nested join (select * from d) d_alias on bc_nested.id = d_alias.id ) \n"
+                +
+                "            and a.max > (select max(val) from bc_nested, f) and a.desc like 'abc'";
+        tables = TablesNamesFinder.findTables(sqlStr);
+        assertThat(tables).containsExactlyInAnyOrder("a", "b", "c", "d", "e", "f");
+
+        sqlStr = " select (select max(val) from e) as maxval, id\n" +
+                "            from  (select * from b, (select * from c) c_alias) as bc_nested, a\n" +
+                "            where a.max > (select max(val) from bc_nested, f) and \n" +
+                "            a.id in ( select id from (select * from d) d_alias join bc_nested on bc_nested.id = d_alias.id )";
+        tables = TablesNamesFinder.findTables(sqlStr);
+        assertThat(tables).containsExactlyInAnyOrder("a", "b", "c", "d", "e", "f");
+
+        sqlStr = "select a.id, bc_nested.id\n" +
+                "            from (select * from b, (select * from c) c_alias) as bc_nested, a\n" +
+                "            where a.id in (((\n" +
+                "               select id from d join \n" +
+                "                   (select * from bc_nested join \n" +
+                "                       (select * from e) e_alias on bc_nested.id = e_alias.id\n" +
+                "                   ) bc_nested_alias \n" +
+                "                   on bc_nested_alias.id = d.id\n" +
+                "            )))";
+        tables = TablesNamesFinder.findTables(sqlStr);
+        assertThat(tables).containsExactlyInAnyOrder("a", "b", "c", "d", "e");
+
+        sqlStr = "select id\n" +
+                "from (select * from c, (select * from b) b_alias) as bc_nested, a\n" +
+                "where a.id in (\n" +
+                "select id from (select * from d \n" +
+                "join (select * from e) e_alias on d.id = e_alias.id) bc_nested_alias\n" +
+                "join bc_nested on bc_nested_alias.id = bc_nested.id\n" +
+                ")";
+        tables = TablesNamesFinder.findTables(sqlStr);
+        assertThat(tables).containsExactlyInAnyOrder("a", "b", "c", "d", "e");
+
+        sqlStr = "with\n" +
+                "    temp1 as (\n" +
+                "        select a1.id as id, b.content as content from a a1\n" +
+                "        join b on a1.id = b.id\n" +
+                "    ),\n" +
+                "    temp2 as (\n" +
+                "        select b.id as id, b.value as value from b, c cross join temp1 where\n" +
+                "        b.id = c.id and b.value = \"b.value\"\n" +
+                "    )\n" +
+                "select temp1.id, ( select tid from d where cid = 29974 ) as tid \n" +
+                "from ( select tid from e, (select * from f) where cid = 29974) e_alias, temp1 cross join temp2\n"
+                +
+                "where exist ( select * from e, e_alias where e.test = dtest.test ) and temp1.max = (select max(column_1) from g)";
+        tables = TablesNamesFinder.findTables(sqlStr);
+        assertThat(tables).containsExactlyInAnyOrder("a", "b", "c", "d", "e", "f", "g");
     }
 
     @Test
@@ -592,5 +661,25 @@ void testInsertTableIssue() throws JSQLParserException {
         tables = TablesNamesFinder.findTables(sqlStr);
         assertThat(tables).containsExactlyInAnyOrder("the_cool_db.the_table");
     }
+
+    @Test
+    void testIssue2183() throws JSQLParserException {
+        String sqlStr = "SELECT\n" +
+                "\tsubscriber_id,\n" +
+                "\tsum(1) OVER (PARTITION BY subscriber_id\n" +
+                "ORDER BY\n" +
+                "\tstat_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS stop_id\n" +
+                "FROM\n" +
+                "\t(\n" +
+                "\tSELECT\n" +
+                "\t\tsubscriber_id,\n" +
+                "\t\tstat_time\n" +
+                "\tFROM\n" +
+                "\t\tlocation_subscriber AS mid2 WINDOW w AS (PARTITION BY subscriber_id\n" +
+                "\tORDER BY\n" +
+                "\t\tstat_time ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING ) )";
+        Set<String> tables = TablesNamesFinder.findTables(sqlStr);
+        assertThat(tables).containsExactlyInAnyOrder("location_subscriber");
+    }
 }
 
diff --git a/src/test/java/net/sf/jsqlparser/util/cnfexpression/CNFTest.java b/src/test/java/net/sf/jsqlparser/util/cnfexpression/CNFTest.java
index e4dd322c5..cb67e9ca7 100644
--- a/src/test/java/net/sf/jsqlparser/util/cnfexpression/CNFTest.java
+++ b/src/test/java/net/sf/jsqlparser/util/cnfexpression/CNFTest.java
@@ -67,8 +67,7 @@ public void test2() throws Exception {
                 "((NOT (NOT 1.1 >= 2.3 OR 3.3 < 4.5)) OR "
                         + "(S.A LIKE '\"%%%\"' AND S.B = '\"orz\"'))");
         Expression expected = CCJSqlParserUtil.parseCondExpression(
-                "(1.1 >= 2.3 OR S.A LIKE '\"%%%\"') AND (1.1 >= 2.3 OR S.B = '\"orz\"')"
-                        + " AND (NOT 3.3 < 4.5 OR S.A LIKE '\"%%%\"') AND (NOT 3.3 < 4.5 OR S.B = '\"orz\"')");
+                "(1.1 >= 2.3 OR S.A LIKE '\"%%%\"') AND (1.1 >= 2.3 OR S.B = '\"orz\"') AND (NOT 3.3 < 4.5 OR S.A LIKE '\"%%%\"') AND (NOT 3.3 < 4.5 OR S.B = '\"orz\"')");
         Expression result = CNFConverter.convertToCNF(expr);
         assertEquals(expected.toString(), result.toString());
     }
@@ -206,8 +205,7 @@ public void test5() throws Exception {
                 "NOT ((NOT (S.A > 3.5 AND S.B < 4)) OR "
                         + "(S.C LIKE '\"%%\"' OR S.D = {t '12:04:34'}))");
         Expression expected = CCJSqlParserUtil.parseCondExpression(
-                "S.A > 3.5 AND S.B < 4 AND NOT S.C LIKE '\"%%\"' "
-                        + "AND NOT S.D = {t '12:04:34'}");
+                "S.A > 3.5 AND S.B < 4 AND NOT S.C LIKE '\"%%\"' AND NOT S.D = {t '12:04:34'}");
         Expression result = CNFConverter.convertToCNF(expr);
         assertEquals(expected.toString(), result.toString());
     }
diff --git a/src/test/java/net/sf/jsqlparser/util/deparser/CreateViewDeParserTest.java b/src/test/java/net/sf/jsqlparser/util/deparser/CreateViewDeParserTest.java
index 1a8f75d81..05b9e6bf5 100644
--- a/src/test/java/net/sf/jsqlparser/util/deparser/CreateViewDeParserTest.java
+++ b/src/test/java/net/sf/jsqlparser/util/deparser/CreateViewDeParserTest.java
@@ -13,7 +13,7 @@
 import net.sf.jsqlparser.parser.CCJSqlParserDefaultVisitor;
 import net.sf.jsqlparser.parser.CCJSqlParserTreeConstants;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
-import net.sf.jsqlparser.parser.SimpleNode;
+import net.sf.jsqlparser.parser.Node;
 import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
 import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -72,7 +72,7 @@ public <K> StringBuilder visit(Column tableColumn, K parameters) {
     public void testCreateViewASTNode() throws JSQLParserException {
         String sql = "CREATE VIEW test AS SELECT a, b FROM mytable";
         final StringBuilder b = new StringBuilder(sql);
-        SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
+        Node node = (Node) CCJSqlParserUtil.parseAST(sql);
         node.dump("*");
         assertEquals(CCJSqlParserTreeConstants.JJTSTATEMENT, node.getId());
 
@@ -80,7 +80,7 @@ public void testCreateViewASTNode() throws JSQLParserException {
             int idxDelta = 0;
 
             @Override
-            public Object visit(SimpleNode node, Object data) {
+            public Object visit(Node node, Object data) {
                 if (CCJSqlParserTreeConstants.JJTCOLUMN == node.getId()) {
                     b.insert(node.jjtGetFirstToken().beginColumn - 1 + idxDelta, '"');
                     idxDelta++;
diff --git a/src/test/java/net/sf/jsqlparser/util/deparser/ExpressionDeParserTest.java b/src/test/java/net/sf/jsqlparser/util/deparser/ExpressionDeParserTest.java
index 09ba90dc6..dd0df1fe0 100644
--- a/src/test/java/net/sf/jsqlparser/util/deparser/ExpressionDeParserTest.java
+++ b/src/test/java/net/sf/jsqlparser/util/deparser/ExpressionDeParserTest.java
@@ -147,11 +147,11 @@ public void shouldDeParseComplexAnalyticExpressionWithPartitionExpressionList()
         Expression partitionExpression1 = mock(Expression.class);
         Expression partitionExpression2 = mock(Expression.class);
 
-        analyticExpression.setName("name");
-        analyticExpression.setPartitionExpressionList(partitionExpressionList);
         partitionExpressionList.add(partitionExpression1);
         partitionExpressionList.add(partitionExpression2);
 
+        analyticExpression.setName("name");
+        analyticExpression.setPartitionExpressionList(partitionExpressionList);
         will(appendToBuffer("partition expression 1")).given(partitionExpression1)
                 .accept(expressionDeParser, null);
         will(appendToBuffer("partition expression 2")).given(partitionExpression2)
diff --git a/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java b/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java
index 8be6d1078..1b129e6a2 100644
--- a/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java
+++ b/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java
@@ -132,27 +132,27 @@ public void shouldUseProvidedDeparsersWhenDeParsingInsert() {
         then(duplicateUpdateExpression1).should().accept(expressionDeParser, null);
     }
 
-    @Test
-    @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert")
-    public void shouldUseProvidedDeParsersWhenDeParsingSelect() {
-        WithItem withItem1 = spy(new WithItem());
-        withItem1.setSelect(mock(ParenthesedSelect.class));
-        WithItem withItem2 = spy(new WithItem());
-        withItem2.setSelect(mock(ParenthesedSelect.class));
-
-        List<WithItem<?>> withItemsList = new ArrayList<WithItem<?>>();
-        withItemsList.add(withItem1);
-        withItemsList.add(withItem2);
-
-        PlainSelect plainSelect = mock(PlainSelect.class);
-        plainSelect.setWithItemsList(withItemsList);
-
-        statementDeParser.visit(plainSelect);
-
-        // then(withItem1).should().accept((SelectVisitor) selectDeParser);
-        // then(withItem2).should().accept((SelectVisitor) selectDeParser);
-        then(plainSelect).should().accept((SelectVisitor<StringBuilder>) selectDeParser, null);
-    }
+    // @Test
+    // @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert")
+    // public void shouldUseProvidedDeParsersWhenDeParsingSelect() {
+    // WithItem<?> withItem1 = spy(new WithItem<>());
+    // withItem1.setSelect(mock(ParenthesedSelect.class));
+    // WithItem<?> withItem2 = spy(new WithItem<>());
+    // withItem2.setSelect(mock(ParenthesedSelect.class));
+    //
+    // List<WithItem<?>> withItemsList = new ArrayList<WithItem<?>>();
+    // withItemsList.add(withItem1);
+    // withItemsList.add(withItem2);
+    //
+    // PlainSelect plainSelect = mock(PlainSelect.class);
+    // plainSelect.setWithItemsList(withItemsList);
+    //
+    // statementDeParser.visit(plainSelect);
+    //
+    // // then(withItem1).should().accept((SelectVisitor) selectDeParser);
+    // // then(withItem2).should().accept((SelectVisitor) selectDeParser);
+    // then(plainSelect).should().accept((SelectVisitor<StringBuilder>) selectDeParser, null);
+    // }
 
     @Test
     @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert")
diff --git a/src/test/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidatorTest.java b/src/test/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidatorTest.java
index edba27f66..d83bb2e51 100644
--- a/src/test/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidatorTest.java
+++ b/src/test/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidatorTest.java
@@ -150,6 +150,12 @@ public void testIsNull() {
         validateNoErrors("SELECT * FROM tab t WHERE t.col IS NOT NULL", 1, EXPRESSIONS);
     }
 
+    @Test
+    public void testIsUnknown() {
+        validateNoErrors("SELECT * FROM tab t WHERE t.col IS UNKNOWN", 1, EXPRESSIONS);
+        validateNoErrors("SELECT * FROM tab t WHERE t.col IS NOT UNKNOWN", 1, EXPRESSIONS);
+    }
+
     @Test
     public void testLike() {
         validateNoErrors("SELECT * FROM tab t WHERE t.col LIKE '%search for%'", 1, EXPRESSIONS);
diff --git a/src/test/resources/net/sf/jsqlparser/performance.sql b/src/test/resources/net/sf/jsqlparser/performance.sql
new file mode 100644
index 000000000..d83065643
--- /dev/null
+++ b/src/test/resources/net/sf/jsqlparser/performance.sql
@@ -0,0 +1,2110 @@
+---
+-- #%L
+-- JSQLParser library
+-- %%
+-- Copyright (C) 2004 - 2025 JSQLParser
+-- %%
+-- Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+-- #L%
+---
+-- complex-lateral-select-request.txt
+SELECT
+O.ORDERID,
+O.CUSTNAME,
+OL.LINETOTAL,
+OC.ORDCHGTOTAL,
+OT.TAXTOTAL
+FROM
+ORDERS O,
+LATERAL (
+SELECT
+SUM(NETAMT) AS LINETOTAL
+FROM
+ORDERLINES LINES
+WHERE
+LINES.ORDERID=O.ORDERID
+) AS OL,
+LATERAL (
+SELECT
+SUM(CHGAMT) AS ORDCHGTOTAL
+FROM
+ORDERCHARGES CHARGES
+WHERE
+LINES.ORDERID=O.ORDERID
+) AS OC,
+LATERAL (
+SELECT
+SUM(TAXAMT) AS TAXTOTAL
+FROM
+ORDERTAXES TAXES
+WHERE
+TAXES.ORDERID=O.ORDERID
+) AS OT
+;
+
+-- large-sql-issue-235.txt
+SELECT
+        'CR' AS `^CR`,
+        (1 - (SUM((CASE
+            WHEN (`tbl`.`AS` = 'Cancelled') THEN (CASE
+                WHEN (ROUND((((((period_diff(date_format(`tbl`.`CD`,
+                '%Y%m'),
+                date_format(SUBTIME(CURRENT_TIMESTAMP(),
+                25200),
+                '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200)) - MONTH('2012-02-01')) - 1) / 3)))) = -3) THEN 1
+                ELSE 0
+            END)
+            ELSE 0
+        END)) / SUM((CASE
+            WHEN (`tbl`.`AS` = 'Active') THEN (CASE
+                WHEN (ROUND((((((period_diff(date_format(`tbl`.`OCD`,
+                '%Y%m'),
+                date_format(SUBTIME(CURRENT_TIMESTAMP(),
+                25200),
+                '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200)) - MONTH('2012-02-01')) - 1) / 3)))) <= -3) THEN 1
+                ELSE 0
+            END)
+            ELSE 0
+        END)))) AS `^P3Q TRR`,
+        (1 - (SUM((CASE
+            WHEN (`tbl`.`AS` = 'Cancelled') THEN (CASE
+                WHEN (ROUND((((((period_diff(date_format(`tbl`.`CD`,
+                '%Y%m'),
+                date_format(SUBTIME(CURRENT_TIMESTAMP(),
+                25200),
+                '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200)) - MONTH('2012-02-01')) - 1) / 3)))) = -2) THEN 1
+                ELSE 0
+            END)
+            ELSE 0
+        END)) / SUM((CASE
+            WHEN (`tbl`.`AS` = 'Active') THEN (CASE
+                WHEN (ROUND((((((period_diff(date_format(`tbl`.`OCD`,
+                '%Y%m'),
+                date_format(SUBTIME(CURRENT_TIMESTAMP(),
+                25200),
+                '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200)) - MONTH('2012-02-01')) - 1) / 3)))) <= -2) THEN 1
+                ELSE 0
+            END)
+            ELSE 0
+        END)))) AS `^P2Q TRR`,
+        (1 - (SUM((CASE
+            WHEN (`tbl`.`AS` = 'Cancelled') THEN (CASE
+                WHEN (ROUND((((((period_diff(date_format(`tbl`.`CD`,
+                '%Y%m'),
+                date_format(SUBTIME(CURRENT_TIMESTAMP(),
+                25200),
+                '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200)) - MONTH('2012-02-01')) - 1) / 3)))) = -1) THEN 1
+                ELSE 0
+            END)
+            ELSE 0
+        END)) / SUM((CASE
+            WHEN (`tbl`.`AS` = 'Active') THEN (CASE
+                WHEN (ROUND((((((period_diff(date_format(`tbl`.`OCD`,
+                '%Y%m'),
+                date_format(SUBTIME(CURRENT_TIMESTAMP(),
+                25200),
+                '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),
+                25200)) - MONTH('2012-02-01')) - 1) / 3)))) <= -1) THEN 1
+                ELSE 0
+            END)
+            ELSE 0
+        END)))) AS `^PQ TRR`,
+        (1 - (SUM((CASE
+            WHEN ((ROUND((((((period_diff(date_format(`tbl`.`CD`,
+            '%Y%m'),
+            date_format(SUBTIME(CURRENT_TIMESTAMP(),
+            25200),
+            '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(),
+            25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),
+            25200)) - MONTH('2012-02-01')) - 1) / 3)))) = 0)
+            AND (`tbl`.`AS` = 'Cancelled')) THEN 1
+            ELSE 0
+        END)) / SUM((CASE
+            WHEN (`tbl`.`AS` = 'Active') THEN 1
+            ELSE 0
+        END)))) AS `^CQ TRR`
+    FROM
+        `tbl`
+    GROUP BY
+        'CR' LIMIT 25000
+;
+
+-- large-sql-issue-566.txt
+SELECT "CAMPAIGNID","TARGET_SOURCE","NON_INDV_TYPE","GROUP_SPONSOR","SEGMNTS","COUNTRY_CD","TARGET_STATE","TARGET_CITY","TARGET_ZIP","SIC_CLASS","NAICS_CLASS","GENDER_CD","OCCUPATION","CREDIT_SCORE","MARITAL_STATUS","IMPORT_ID","BIRTH_DT","STATUS"
+             FROM (
+               SELECT
+                 X.CAMPAIGNID,
+                 X.FIELDNAME,
+                 CASE WHEN Y.VALUE IS NULL THEN 'ALL'
+                 ELSE Y.VALUE END AS VALUE
+               FROM
+            --CREATES A CARTESIAN JOIN TO COMBINE ALL CHARACTERISTICS WITH CAMPAIGN
+                 (SELECT
+                    CAMPAIGNID,
+                    FIELDNAME
+                  FROM CAMPAIGN
+                    CROSS JOIN (SELECT DISTINCT FIELDNAME
+                                FROM FIELDCRITERIA)) X
+                 LEFT JOIN
+            --RETURNS ALL AVAILABLE CAMPAIGN CHARACTERISTS
+                 (
+                   SELECT
+                     CAMPAIGNID,
+                     FIELDNAME,
+                     (CASE FIELDNAME
+                      WHEN U'BUSINESSTYPE' THEN D.DISPLAYVALUE
+                      WHEN U'LEADTARGETSOURCE' THEN E.DISPLAYVALUE
+                      ELSE VALUE END) AS VALUE
+                   FROM FIELDCRITERIA A, STRINGFIELDCRITERIA_VALUE B
+                     LEFT JOIN (SELECT
+                                  B.CODE,
+                                  B.DISPLAYVALUE,
+                                  LOOKUPNAME
+                                FROM LOOKUPLIST A, LOOKUPVALUE B
+                                WHERE A.ID = B.LOOKUPLIST_ID AND LOOKUPNAME = 'NONINDIVIDUALTYPE') D ON B.VALUE = D.CODE
+                     LEFT JOIN (SELECT
+                                  B.CODE,
+                                  B.DISPLAYVALUE,
+                                  LOOKUPNAME
+                                FROM LOOKUPLIST A, LOOKUPVALUE B
+                                WHERE A.ID = B.LOOKUPLIST_ID AND LOOKUPNAME = 'LEADTARGETSOURCE') E ON B.VALUE = E.CODE
+                     ,
+                     CAMPAIGN C
+                   WHERE A.ID = B.FIELD_CRITERIA_ID
+                         AND A.CRITERIA_ID = C.ID
+                 ) Y ON X.CAMPAIGNID = Y.CAMPAIGNID AND X.FIELDNAME = Y.FIELDNAME
+             )
+             PIVOT (MAX(VALUE)
+                FOR FIELDNAME
+                IN
+                   ('LEADTARGETSOURCE' AS TARGET_SOURCE, 'BUSINESSTYPE' AS NON_INDV_TYPE, 'GROUPSPONSOR' AS GROUP_SPONSOR, 'SEGMENTS' AS SEGMNTS, 'COUNTRYCD' AS COUNTRY_CD, 'STATEPROVCD' AS TARGET_STATE,
+                   'CITY' AS TARGET_CITY, 'POSTALCODE' AS TARGET_ZIP, 'SICCLASSIFICATION' AS SIC_CLASS, 'NAICSCLASSIFICATION' AS NAICS_CLASS, 'GENDERCD' AS GENDER_CD, 'OCCUPATION' AS OCCUPATION, 'CREDITSCORE' AS CREDIT_SCORE,
+                   'MARITALSTATUSCD' AS MARITAL_STATUS, 'IMPORTID' AS IMPORT_ID, 'BIRTHDATE' AS BIRTH_DT, 'STATUS' AS STATUS))
+;
+
+-- large-sql-issue-923.txt
+SELECT DISTINCT
+  CLM_MAP_1.INTERNAL_ID,
+  CLM.STATUS_C,
+  nvl(LOBCL.LOB_NAME,'UNKNOWN'),
+  EPPCL.PRODUCT_TYPE,
+  CLM.SERVICE_START_DATE,
+  CLM.SERVICE_END_DATE,
+  CLM.DATE_RECEIVED,
+  CLM_CS.NAME,
+  CLM.STATUS_DATE,
+  CLM_APSTS.ABBR,
+  CLM_CF.NAME,
+  case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end,
+  GRP.PLAN_GRP_NAME,
+  SERREN_2.NPI,
+  SERREN.PROV_NAME,
+  D_VTN.TAX_ID,
+  VENCLM.VENDOR_NAME,
+  (CLM.TOT_BILLED_AMT),
+  (CLM.TOT_NET_PAYABLE),
+  CASE
+	WHEN CLM.AP_STS_C=3 THEN CKR.AP_RUN_DATE
+END,
+  CASE
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('NC','SC') AND
+CLM_TRAIT_2.ABBR='CAP'
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('NW')  AND
+ (UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE  'ANTHEM FOUNDATION%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM SUNNYSIDE%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM WESTSIDE%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANNW REGIONAL LAB%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM CLINIC%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'CARE ESSENTIALS BY ANTHEM NW%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM HOSPITALS%')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'HI' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%HAWAII PERMANENTE MEDICAL GROUP'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%HOSPITAL%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION HEALTH PLAN INC%')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'CO' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%COLORADO PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'KASC FRANKLIN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'KASC LONETREE%')
+Then 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'MAS' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN OF THE MID-ATLANTIC STATES%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%MID ATLANTIC PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION MEDICAL GROUP%'
+OR upper(VENCLM.VENDOR_NAME) = 'ANTHEM MID ATLANTIC')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'GA' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'PMG VENDOR'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FAMILY CHIROPRACTI%')
+THEN 'Internal'
+ELSE 'External'
+END,
+  coalesce(EPPCL.PRODUCT_TYPE ,ZC_PRD_TYP.NAME),
+  POS.CITY,
+  POS_ST.ABBR,
+  TRUNC((sysdate-( PAT.BIRTH_DATE ))/365,0),
+    case
+	when D_AA_INDICATOR.CLAIM_ID is null
+then  'Not AA'
+else 'AA'  end,
+  ZC_REG_CD.NAME,
+  POS_TYPE.NAME,
+  POS.POS_CODE,
+  CASE
+WHEN CLM.ORIG_REV_CLM_ID IS NOT NULL
+    THEN 'Reversal Claim'
+WHEN  (CLM.ORIG_ADJST_CLM_ID IS NOT NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NULL) OR ("LEGACY_ADJST"."CLAIM_ID" IS NOT NULL)
+                THEN 'Adjusted / Revised Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NOT NULL  AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NOT NULL
+  THEN 'Multiple Adj Interim Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND  "LEGACY_ADJST"."CLAIM_ID" IS  NULL
+    THEN 'Original Claim'
+ELSE NULL
+END,
+  CLM_MAP5.INTERNAL_ID,
+  LISTAGG_DTL_INFO.CODE_LIST,
+  LISTAGG_HDR_INFO.CODE_LIST
+FROM (
+   select DISTINCT min(owner) AS
+ CLARITY_DATABASE
+FROM
+ALL_VIEWS  WHERE VIEW_NAME LIKE 'AP_CLAIM'
+  And OWNER Like 'HCCL%'
+  )  D_CLARITY_DATABASE,  ZC_CLAIM_FORMAT  CLM_CF RIGHT OUTER JOIN AP_CLAIM  CLM ON (CLM.CLAIM_FORMAT_C=CLM_CF.CLAIM_FORMAT_C)
+   LEFT OUTER JOIN ZC_CLM_STATUS  CLM_CS ON (CLM.STATUS_C=CLM_CS.STATUS_C)
+   LEFT OUTER JOIN PATIENT  PAT ON (PAT.PAT_ID=CLM.PAT_ID)
+   LEFT OUTER JOIN ZC_CLM_AP_STAT  CLM_APSTS ON (CLM.AP_STS_C=CLM_APSTS.AP_STS_C)
+   LEFT OUTER JOIN CLARITY_POS  POS ON (CLM.LOC_ID=POS.POS_ID)
+   LEFT OUTER JOIN ZC_POS_TYPE  POS_TYPE ON (POS.POS_TYPE_C=POS_TYPE.POS_TYPE_C)
+   LEFT OUTER JOIN ZC_STATE  POS_ST ON (POS.STATE_C=POS_ST.STATE_C  AND  POS_ST.INTERNAL_ID >= 0  AND POS_ST.INTERNAL_ID <= 51)
+   LEFT OUTER JOIN AP_CLAIM_EOB_CODE  CLM_EOB ON (CLM_EOB.CLAIM_ID=CLM.CLAIM_ID)
+   LEFT OUTER JOIN CLARITY_EOB_CODE  EOB_CODE ON (EOB_CODE.EOB_CODE_ID=CLM_EOB.EOB_CODE_ID)
+   LEFT OUTER JOIN COVERAGE  COVCL ON (CLM.COVERAGE_ID=COVCL.COVERAGE_ID)
+   LEFT OUTER JOIN PLAN_GRP  GRP ON (GRP.PLAN_GRP_ID=COVCL.PLAN_GRP_ID)
+   LEFT OUTER JOIN ZC_REGION_CODE  ZC_REG_CD ON (GRP.CUR_REGION_CODE_C=ZC_REG_CD.REGION_CODE_C)
+   LEFT OUTER JOIN CLARITY_LOB  LOBCL ON (CLM.CLM_LOB_ID=LOBCL.LOB_ID)
+   LEFT OUTER JOIN (
+  (SELECT
+ CLM.CLAIM_ID
+ FROM  AP_CLAIM  CLM
+ WHERE
+ CLM.CLAIM_ID NOT IN
+(SELECT CLAIM_ID
+FROM AP_CLAIM_CHANGE_HX HX
+LEFT OUTER JOIN ECI_BASIC ECI ON HX.CM_LOG_OWNER_ID =ECI.INSTANCE_ID
+WHERE((UPPER(DEPLYMNT_DESC) LIKE '%NP%' AND CHANGE_HX_USER_ID NOT IN ( '161NCALTAP3','161NCALTAP1')) --NCAL
+OR (UPPER(DEPLYMNT_DESC) LIKE '%CO%' AND CHANGE_HX_USER_ID NOT IN ( '140194','44323593','44323592')) --CO
+OR (UPPER(DEPLYMNT_DESC) LIKE '%SP%' AND CHANGE_HX_USER_ID NOT IN ( '1501001006','1501001005','150119165')) --SCAL
+OR (UPPER(DEPLYMNT_DESC) LIKE '%MA%' AND CHANGE_HX_USER_ID NOT IN ( '170100056','1213117','19012093','17017391')) --MAS
+OR (UPPER(DEPLYMNT_DESC) LIKE '%NW%' AND CHANGE_HX_USER_ID NOT IN ( '19012093','19012091')) --NW
+OR (UPPER(DEPLYMNT_DESC) LIKE '%HI%' AND CHANGE_HX_USER_ID NOT IN ( '130HI50101','130HI50100')) --HI
+OR (UPPER(DEPLYMNT_DESC) LIKE '%GA%' AND CHANGE_HX_USER_ID NOT IN('2001','200EDIUSER')) -- GA
+) )
+AND (CLM.STATUS_C IN (3, 4, 5)
+AND CLM.ORIG_REV_CLM_ID IS NULL
+AND CLM.ORIG_ADJST_CLM_ID IS NULL))
+  )  D_AA_INDICATOR ON (D_AA_INDICATOR.CLAIM_ID=CLM.CLAIM_ID)
+   LEFT OUTER JOIN CLARITY_EPP  EPPCL ON (CLM.PLAN_ID=EPPCL.BENEFIT_PLAN_ID)
+   LEFT OUTER JOIN CLARITY_EPP_2  EPPCL_2 ON (EPPCL_2.BENEFIT_PLAN_ID=EPPCL.BENEFIT_PLAN_ID)
+   LEFT OUTER JOIN ZC_PROD_TYPE  ZC_PRD_TYP ON (EPPCL_2.PROD_TYPE_C=ZC_PRD_TYP.PROD_TYPE_C)
+   LEFT OUTER JOIN AP_CLAIM_PX  CLD ON (CLM.CLAIM_ID=CLD.CLAIM_ID)
+   LEFT OUTER JOIN ZC_POS_TYPE  CLMPOS ON (CLD.POS_TYPE_C=CLMPOS.POS_TYPE_C)
+   LEFT OUTER JOIN AP_CLAIM_PX_EOBS  CLD_EOB ON (CLD.TX_ID=CLD_EOB.TX_ID)
+   LEFT OUTER JOIN CLARITY_EOB_CODE  EOB_CODE2 ON (CLD_EOB.EOB_CODE_ID=EOB_CODE2.EOB_CODE_ID)
+   LEFT OUTER JOIN AP_CLAIM_2  CLM2 ON (CLM.CLAIM_ID=CLM2.CLAIM_ID)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_3  CLM_TRAIT ON (CLM2.CLM_TRAIT_3_C=CLM_TRAIT.CLM_TRAIT_3_C)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_4  CLM_TRAIT_4 ON (CLM2.CLM_TRAIT_4_C=CLM_TRAIT_4.CLM_TRAIT_4_C
+)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_2  CLM_TRAIT_2 ON (CLM2.CLM_TRAIT_2_C=CLM_TRAIT_2.CLM_TRAIT_2_C)
+   LEFT OUTER JOIN CLARITY_SER  SERREN ON (CLM.PROV_ID=SERREN.PROV_ID)
+   LEFT OUTER JOIN CLARITY_SER_2  SERREN_2 ON (SERREN.PROV_ID=SERREN_2.PROV_ID)
+   LEFT OUTER JOIN CLARITY_VENDOR  VENCLM ON (VENCLM.VENDOR_ID=CLM.VENDOR_ID)
+   LEFT OUTER JOIN (
+  select t1.vendor_id,t1.line,t1.TAX_ID
+from	vendor_tax_id   t1 ,
+(select	vendor_id,max(line) as line from	vendor_tax_id group	by vendor_id)   t2	Where 	t1.vendor_id=t2.vendor_id 	and	t1.line=t2.line
+group	by  t1.vendor_id,t1.line,t1.TAX_ID
+  )  D_VTN ON (VENCLM.VENDOR_ID=D_VTN.VENDOR_ID)
+   LEFT OUTER JOIN (
+  SELECT DISTINCT VENDOR_ID,  PLACE_OF_SERVICE_ID FROM VENDOR_POS
+WHERE PLACE_OF_SERVICE_ID IN  (SELECT POS_ID FROM CLARITY_POS WHERE  POS_NAME LIKE '%VISITING MEM%')
+union all
+SELECT distinct
+   t1.vendor_id
+   ,999 as PLACE_OF_SERVICE_ID
+from
+   vendor_tax_id t1 inner join
+		(
+		select    vendor_id,
+		max(line) as line
+		from      vendor_tax_id
+		group    by vendor_id
+		)  t2 on             t1.vendor_id=t2.vendor_id
+                             and        t1.line=t2.line
+WHERE
+  t1.TAX_ID  = '811559375'
+  )  D_VM ON (D_VM.VENDOR_ID=VENCLM.VENDOR_ID)
+   LEFT OUTER JOIN AP_CLAIM  AOC ON (CLM.ORIG_ADJST_CLM_ID=AOC.CLAIM_ID)
+   LEFT OUTER JOIN CLM_MAP  CLM_MAP5 ON (AOC.CLAIM_ID=CLM_MAP5.CID  AND  AOC.CM_LOG_OWNER_ID=CLM_MAP5.CM_LOG_OWNER_ID)
+   LEFT OUTER JOIN CLM_MAP  CLM_MAP_1 ON (CLM.CLAIM_ID=CLM_MAP_1.CID  AND  CLM.CM_LOG_OWNER_ID=CLM_MAP_1.CM_LOG_OWNER_ID)
+   LEFT OUTER JOIN (
+  SELECT
+CLAIM_ID
+,PAT_LIABILITY
+,LISTAGG(MNEMONIC,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS CODE_LIST
+,LISTAGG(REMIT_CD,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS REMIT_CODE_LIST
+FROM  (SELECT DISTINCT
+        CLM_EOB.CLAIM_ID
+        ,CASE WHEN MAX(EOB.ROUTE_FROM_DISC_C)=2 THEN 'Yes' ELSE
+		'No'
+		END AS PAT_LIABILITY
+        ,EOB.MNEMONIC
+        ,RMC.RMC_EXTERNAL_ID||'/'||RMK.ABBR AS REMIT_CD
+        FROM
+        AP_CLAIM_PX_EOBS CLM_EOB,
+        CLARITY_EOB_CODE EOB,
+		CLARITY_RMC RMC,
+		ZC_REMARK_CODE RMK
+        WHERE
+        CLM_EOB.EOB_CODE_ID=EOB.EOB_CODE_ID
+		AND EOB.REMIT_CODE_ID=RMC.REMIT_CODE_ID(+)
+		AND EOB.REMARK_CODE_C=RMK.REMARK_CODE_C(+)
+        --1 IS PEND CODE    2 IS DENIAL CODE        3 IS INFO CODE
+        AND EOB.CODE_TYPE_C=3
+        GROUP BY CLM_EOB.CLAIM_ID,EOB.ROUTE_FROM_DISC_C,EOB.MNEMONIC,RMC.RMC_EXTERNAL_ID,RMK.ABBR
+		)
+GROUP BY CLAIM_ID,PAT_LIABILITY
+  )  LISTAGG_DTL_INFO ON (CLM.CLAIM_ID=LISTAGG_DTL_INFO.CLAIM_ID)
+   LEFT OUTER JOIN (
+      SELECT DISTINCT CLM.CLAIM_ID FROM  (
+   select DISTINCT min(owner) AS
+ CLARITY_DATABASE
+FROM
+ALL_VIEWS  WHERE VIEW_NAME LIKE 'AP_CLAIM'
+  And OWNER Like 'HCCL%'
+  )  D_CLARITY_DATABASE
+  ,  CLARITY_EOB_CODE  EOB_CODE
+  RIGHT OUTER JOIN AP_CLAIM_EOB_CODE  CLM_EOB ON (EOB_CODE.EOB_CODE_ID=CLM_EOB.EOB_CODE_ID)
+   RIGHT OUTER JOIN AP_CLAIM  CLM ON (CLM_EOB.CLAIM_ID=CLM.CLAIM_ID)
+   WHERE
+  ( ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('SC','NC') AND  EOB_CODE.MNEMONIC IN ('CI134','CLP38','CLI36') AND CLM_EOB.ENTRY_DATE >=TO_DATE ('2017-12-15' ,'YYYY-MM-DD'))
+  )  "LEGACY_ADJST" ON (CLM.CLAIM_ID="LEGACY_ADJST"."CLAIM_ID")
+   LEFT OUTER JOIN (
+  SELECT
+CLAIM_ID
+,LISTAGG(MNEMONIC,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS CODE_LIST
+,LISTAGG(REMIT_CD,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS REMIT_CODE_LIST
+FROM  (SELECT DISTINCT
+        CLM_EOB.CLAIM_ID
+        ,EOB.MNEMONIC
+        ,RMC.RMC_EXTERNAL_ID||'/'||RMK.ABBR AS REMIT_CD
+        FROM
+        AP_CLAIM_EOB_CODE CLM_EOB,
+        CLARITY_EOB_CODE EOB,
+		CLARITY_RMC RMC,
+		ZC_REMARK_CODE RMK
+        WHERE
+        CLM_EOB.EOB_CODE_ID=EOB.EOB_CODE_ID
+		AND EOB.REMIT_CODE_ID=RMC.REMIT_CODE_ID(+)
+		AND EOB.REMARK_CODE_C=RMK.REMARK_CODE_C(+)
+        AND CLM_EOB.RESOLUTION_DATE IS NULL
+        --1 IS PEND CODE    2 IS DENIAL CODE        3 IS INFO CODE
+        AND EOB.CODE_TYPE_C=3
+		)
+GROUP BY CLAIM_ID
+  )  LISTAGG_HDR_INFO ON (CLM.CLAIM_ID=LISTAGG_HDR_INFO.CLAIM_ID)
+   LEFT OUTER JOIN AP_CLAIM_CHECK  CLM_CHK ON (CLM.CLAIM_ID=CLM_CHK.CLAIM_ID)
+   LEFT OUTER JOIN AP_CHECK  CKR ON (CLM_CHK.CHECK_ID=CKR.CHECK_ID)
+WHERE
+( COALESCE(CLM.WORKFLOW_C,0) IN @Prompt(P_WorkflowTypeInclude)  and COALESCE(CLM_TRAIT_4.NAME,'CCA') In @Prompt(P_CCA-TPMG)  )
+  AND
+  (
+   coalesce(EPPCL.PRODUCT_TYPE ,ZC_PRD_TYP.NAME)  IN  @Prompt('Enter Product Type or Leave Blank for All:','A','Claim Header (CLM)\Claim Header IDs (CLM)\Benefit Plan Id (CLM)\Product Type',Multi,Free,Persistent,,User:1,Optional)
+   AND
+   nvl(LOBCL.LOB_NAME,'UNKNOWN')  LIKE  @Prompt('Enter Line of Business or Leave Blank for All:','A','Claim Header (CLM)\Line Of Business (CLM)\Line Of Business Name (CLM)',Mono,Free,Persistent,,User:2,Optional)
+   AND
+   SERREN.PROV_NAME  LIKE  @Prompt('Enter Provider Name or Leave Blank for All:','A','Provider (PRV)\Rendering (SERREN)\Prov Name (SERREN)',Mono,Free,Persistent,,User:3,Optional)
+   AND
+   SERREN_2.NPI  LIKE  @Prompt('Enter Provider ID or Leave Blank for All:','A',,Mono,Free,Persistent,,User:4,Optional)
+   AND
+   D_VTN.TAX_ID  LIKE  @Prompt('Enter Vendor Tax ID or Leave Blank for All:','A',,Mono,Free,Persistent,,User:5,Optional)
+   AND
+   VENCLM.VENDOR_NAME  LIKE  @Prompt('Enter Vendor Name or Leave Blank for All:','A','Claim Header Vendor (VENCLM)\Vendor Name (VENCLM)',Mono,Free,Persistent,,User:6,Optional)
+   AND
+   GRP.PLAN_GRP_NAME  LIKE  @Prompt('Enter Plan Group Name or Leave Blank for All:','A','Plan / Group (GRP)\Plan Grp Name (GRP)',Mono,Free,Persistent,,User:0,Optional)
+   AND
+   CLM.STATUS_C  =  3
+   AND
+   CASE
+	WHEN CLM.AP_STS_C=3 THEN CKR.AP_RUN_DATE
+END  BETWEEN  (CASE
+    WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='t' THEN
+		trunc(sysdate)
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) ) Like 't-%' THEN
+			trunc(sysdate)-to_number(Substr(( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) ),3,3))
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='wb' THEN
+                          TRUNC(sysdate, 'IW')-1
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='wb-1' THEN
+                          TRUNC(sysdate, 'IW')-8
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='we' THEN
+                     NEXT_DAY(TRUNC(sysdate,'IW'),'SATURDAY')
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='we-1' THEN
+                     NEXT_DAY(TRUNC(sysdate,'IW')-8,'SATURDAY')
+    WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='mb' THEN
+		trunc(sysdate,'MM')
+    WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='me' THEN
+		trunc(last_day(sysdate))
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='mb-1' THEN
+		trunc(trunc(sysdate, 'MM') - 1, 'MM')
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='me-1' THEN
+		(trunc(sysdate, 'MM') - 1)
+		 WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='mb-2' THEN
+		add_months(trunc(sysdate, 'MM'), - 2)
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='me-2' THEN
+		(last_day(add_months (sysdate,-2)))
+		WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='yb' THEN
+		trunc(sysdate,'YY')
+		 WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='yb-1' THEN
+		trunc(trunc(sysdate, 'YY') - 1, 'YY')
+ else
+    TO_DATE(( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) ),'MM/dd/yyyy')
+END)  AND  (CASE
+    WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='t' THEN
+		trunc(sysdate)
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) ) Like't-%' THEN
+		trunc(sysdate)-to_number(Substr(( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) ),3,3))
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='wb' THEN
+                          TRUNC(sysdate, 'IW')-1
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='wb-1' THEN
+                          TRUNC(sysdate, 'IW')-8
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='we' THEN
+                     NEXT_DAY(TRUNC(sysdate,'IW'),'SATURDAY')
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='we-1' THEN
+                     NEXT_DAY(TRUNC(sysdate,'IW')-8,'SATURDAY')
+    WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='mb' THEN
+		trunc(sysdate,'MM')
+    WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='me' THEN
+		trunc(last_day(sysdate))
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='mb-1' THEN
+		trunc(trunc(sysdate, 'MM') - 1, 'MM')
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='me-1' THEN
+		(trunc(sysdate, 'MM') - 1)
+		WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='mb-2' THEN
+		add_months(trunc(sysdate, 'MM'), - 2)
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='me-2' THEN
+		(last_day(add_months (sysdate,-2)))
+		WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='yb' THEN
+		trunc(sysdate,'YY')
+		 WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='yb-1' THEN
+		trunc(trunc(sysdate, 'YY') - 1, 'YY')
+ else
+    TO_DATE(( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) ),'MM/dd/yyyy')
+END)
+   AND
+   (
+    EOB_CODE.MNEMONIC  IN  @Prompt('Enter Claim Denial Code(s) or Leave Blank for All:','A','Claim EOB (EOB)\Eob Code Id (CLM_EOB)\Mnemonic (EOB_CODE)',Multi,Free,Persistent,,User:8,Optional)
+    OR
+    EOB_CODE2.MNEMONIC  IN  @Prompt('Enter Claim Denial Code(s) or Leave Blank for All:','A','Claim Line (CLD)\Claim Line EOB\Eob Code Id (CLD)\Mnemonic (CLD)',Multi,Free,Persistent,,User:7,Optional)
+   )
+   AND
+   CLMPOS.NAME  IN  @Prompt('Enter POS Type(s) or Leave Blank for All:','A','Claim Line (CLD)\Pos Type C (CLD)\Name (CLMPOS)',Multi,Free,Persistent,,User:9,Optional)
+   AND
+   CASE
+WHEN CLM.ORIG_REV_CLM_ID IS NOT NULL
+    THEN 'Reversal Claim'
+WHEN  (CLM.ORIG_ADJST_CLM_ID IS NOT NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NULL) OR ("LEGACY_ADJST"."CLAIM_ID" IS NOT NULL)
+                THEN 'Adjusted / Revised Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NOT NULL  AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NOT NULL
+  THEN 'Multiple Adj Interim Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND  "LEGACY_ADJST"."CLAIM_ID" IS  NULL
+    THEN 'Original Claim'
+ELSE NULL
+END  IN  @Prompt('Enter Claim Adjudication Type:','A','Claim Header (CLM)\Clm Adj Type (CLM)\Clm Adj Type Desc (CLM)',Multi,Free,Persistent,,User:13)
+   AND
+   NVL(CLM_TRAIT.NAME,'KFHP')  IN  @Prompt('Enter ANIC Claim Trait or Leave Blank for All:','A','Claim Header (CLM)\Company Code (CLM)',Multi,Free,Persistent,,User:10,Optional)
+   AND
+   nvl(CLM2.DENTAL_INFO_YN,'N')  IN  @Prompt('Enter Dental Indicator (Y/N):','A','Claim Header (CLM)\Dental Info Yn (CLM2)',Multi,Free,Persistent,{'N'},User:11,Optional)
+   AND
+   CLM.ADJST_CLM_ID  Is Null
+   AND
+   ZC_REG_CD.NAME  IN  @Prompt('Enter CO Service Area Name:','A','Plan / Group (GRP)\Current Region Code C (GRP)\Current Region Code Name (GRP)',Multi,Free,Persistent,,User:12,Optional)
+   AND
+   ( ( CASE
+WHEN D_VM.PLACE_OF_SERVICE_ID IS NOT NULL THEN 'Y' ELSE 'N'
+END ) in @Prompt(Visiting Member) OR ( 'ALL') IN @Prompt(Visiting Member)  )
+  )
+--END--
+SELECT DISTINCT
+  CLM_MAP_1.INTERNAL_ID,
+  EOB_CODE.ROUTE_FROM_DISC_C,
+  EOB_CODE.MNEMONIC
+FROM
+  ZC_POS_TYPE  CLMPOS RIGHT OUTER JOIN AP_CLAIM_PX  CLD ON (CLD.POS_TYPE_C=CLMPOS.POS_TYPE_C)
+   LEFT OUTER JOIN AP_CLAIM_PX_EOBS  CLD_EOB ON (CLD.TX_ID=CLD_EOB.TX_ID)
+   LEFT OUTER JOIN CLARITY_EOB_CODE  EOB_CODE2 ON (CLD_EOB.EOB_CODE_ID=EOB_CODE2.EOB_CODE_ID)
+   RIGHT OUTER JOIN AP_CLAIM  CLM ON (CLM.CLAIM_ID=CLD.CLAIM_ID)
+   LEFT OUTER JOIN AP_CLAIM_EOB_CODE  CLM_EOB ON (CLM_EOB.CLAIM_ID=CLM.CLAIM_ID)
+   LEFT OUTER JOIN CLARITY_EOB_CODE  EOB_CODE ON (EOB_CODE.EOB_CODE_ID=CLM_EOB.EOB_CODE_ID)
+   LEFT OUTER JOIN COVERAGE  COVCL ON (CLM.COVERAGE_ID=COVCL.COVERAGE_ID)
+   LEFT OUTER JOIN PLAN_GRP  GRP ON (GRP.PLAN_GRP_ID=COVCL.PLAN_GRP_ID)
+   LEFT OUTER JOIN ZC_REGION_CODE  ZC_REG_CD ON (GRP.CUR_REGION_CODE_C=ZC_REG_CD.REGION_CODE_C)
+   LEFT OUTER JOIN CLARITY_LOB  LOBCL ON (CLM.CLM_LOB_ID=LOBCL.LOB_ID)
+   LEFT OUTER JOIN CLARITY_EPP  EPPCL ON (CLM.PLAN_ID=EPPCL.BENEFIT_PLAN_ID)
+   LEFT OUTER JOIN CLARITY_EPP_2  EPPCL_2 ON (EPPCL_2.BENEFIT_PLAN_ID=EPPCL.BENEFIT_PLAN_ID)
+   LEFT OUTER JOIN ZC_PROD_TYPE  ZC_PRD_TYP ON (EPPCL_2.PROD_TYPE_C=ZC_PRD_TYP.PROD_TYPE_C)
+   LEFT OUTER JOIN AP_CLAIM_2  CLM2 ON (CLM.CLAIM_ID=CLM2.CLAIM_ID)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_3  CLM_TRAIT ON (CLM2.CLM_TRAIT_3_C=CLM_TRAIT.CLM_TRAIT_3_C)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_4  CLM_TRAIT_4 ON (CLM2.CLM_TRAIT_4_C=CLM_TRAIT_4.CLM_TRAIT_4_C
+)
+   LEFT OUTER JOIN CLARITY_SER  SERREN ON (CLM.PROV_ID=SERREN.PROV_ID)
+   LEFT OUTER JOIN CLARITY_SER_2  SERREN_2 ON (SERREN.PROV_ID=SERREN_2.PROV_ID)
+   LEFT OUTER JOIN CLARITY_VENDOR  VENCLM ON (VENCLM.VENDOR_ID=CLM.VENDOR_ID)
+   LEFT OUTER JOIN (
+  select t1.vendor_id,t1.line,t1.TAX_ID
+from	vendor_tax_id   t1 ,
+(select	vendor_id,max(line) as line from	vendor_tax_id group	by vendor_id)   t2	Where 	t1.vendor_id=t2.vendor_id 	and	t1.line=t2.line
+group	by  t1.vendor_id,t1.line,t1.TAX_ID
+  )  D_VTN ON (VENCLM.VENDOR_ID=D_VTN.VENDOR_ID)
+   LEFT OUTER JOIN (
+  SELECT DISTINCT VENDOR_ID,  PLACE_OF_SERVICE_ID FROM VENDOR_POS
+WHERE PLACE_OF_SERVICE_ID IN  (SELECT POS_ID FROM CLARITY_POS WHERE  POS_NAME LIKE '%VISITING MEM%')
+union all
+SELECT distinct
+   t1.vendor_id
+   ,999 as PLACE_OF_SERVICE_ID
+from
+   vendor_tax_id t1 inner join
+		(
+		select    vendor_id,
+		max(line) as line
+		from      vendor_tax_id
+		group    by vendor_id
+		)  t2 on             t1.vendor_id=t2.vendor_id
+                             and        t1.line=t2.line
+WHERE
+  t1.TAX_ID  = '811559375'
+  )  D_VM ON (D_VM.VENDOR_ID=VENCLM.VENDOR_ID)
+   LEFT OUTER JOIN CLM_MAP  CLM_MAP_1 ON (CLM.CLAIM_ID=CLM_MAP_1.CID  AND  CLM.CM_LOG_OWNER_ID=CLM_MAP_1.CM_LOG_OWNER_ID)
+   LEFT OUTER JOIN (
+      SELECT DISTINCT CLM.CLAIM_ID FROM  (
+   select DISTINCT min(owner) AS
+ CLARITY_DATABASE
+FROM
+ALL_VIEWS  WHERE VIEW_NAME LIKE 'AP_CLAIM'
+  And OWNER Like 'HCCL%'
+  )  D_CLARITY_DATABASE
+  ,  CLARITY_EOB_CODE  EOB_CODE
+  RIGHT OUTER JOIN AP_CLAIM_EOB_CODE  CLM_EOB ON (EOB_CODE.EOB_CODE_ID=CLM_EOB.EOB_CODE_ID)
+   RIGHT OUTER JOIN AP_CLAIM  CLM ON (CLM_EOB.CLAIM_ID=CLM.CLAIM_ID)
+   WHERE
+  ( ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('SC','NC') AND  EOB_CODE.MNEMONIC IN ('CI134','CLP38','CLI36') AND CLM_EOB.ENTRY_DATE >=TO_DATE ('2017-12-15' ,'YYYY-MM-DD'))
+  )  "LEGACY_ADJST" ON (CLM.CLAIM_ID="LEGACY_ADJST"."CLAIM_ID")
+   LEFT OUTER JOIN AP_CLAIM_CHECK  CLM_CHK ON (CLM.CLAIM_ID=CLM_CHK.CLAIM_ID)
+   LEFT OUTER JOIN AP_CHECK  CKR ON (CLM_CHK.CHECK_ID=CKR.CHECK_ID)
+WHERE
+( COALESCE(CLM.WORKFLOW_C,0) IN @Prompt(P_WorkflowTypeInclude)  and COALESCE(CLM_TRAIT_4.NAME,'CCA') In @Prompt(P_CCA-TPMG)  )
+  AND
+  (
+   coalesce(EPPCL.PRODUCT_TYPE ,ZC_PRD_TYP.NAME)  IN  @Prompt('Enter Product Type or Leave Blank for All:','A','Claim Header (CLM)\Claim Header IDs (CLM)\Benefit Plan Id (CLM)\Product Type',Multi,Free,Persistent,,User:1,Optional)
+   AND
+   nvl(LOBCL.LOB_NAME,'UNKNOWN')  LIKE  @Prompt('Enter Line of Business or Leave Blank for All:','A','Claim Header (CLM)\Line Of Business (CLM)\Line Of Business Name (CLM)',Mono,Free,Persistent,,User:2,Optional)
+   AND
+   SERREN.PROV_NAME  LIKE  @Prompt('Enter Provider Name or Leave Blank for All:','A','Provider (PRV)\Rendering (SERREN)\Prov Name (SERREN)',Mono,Free,Persistent,,User:3,Optional)
+   AND
+   SERREN_2.NPI  LIKE  @Prompt('Enter Provider ID or Leave Blank for All:','A',,Mono,Free,Persistent,,User:4,Optional)
+   AND
+   D_VTN.TAX_ID  LIKE  @Prompt('Enter Vendor Tax ID or Leave Blank for All:','A',,Mono,Free,Persistent,,User:5,Optional)
+   AND
+   VENCLM.VENDOR_NAME  LIKE  @Prompt('Enter Vendor Name or Leave Blank for All:','A','Claim Header Vendor (VENCLM)\Vendor Name (VENCLM)',Mono,Free,Persistent,,User:6,Optional)
+   AND
+   GRP.PLAN_GRP_NAME  LIKE  @Prompt('Enter Plan Group Name or Leave Blank for All:','A','Plan / Group (GRP)\Plan Grp Name (GRP)',Mono,Free,Persistent,,User:0,Optional)
+   AND
+   CLM.STATUS_C  =  3
+   AND
+   CASE
+	WHEN CLM.AP_STS_C=3 THEN CKR.AP_RUN_DATE
+END  BETWEEN  (CASE
+    WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='t' THEN
+		trunc(sysdate)
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) ) Like 't-%' THEN
+			trunc(sysdate)-to_number(Substr(( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) ),3,3))
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='wb' THEN
+                          TRUNC(sysdate, 'IW')-1
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='wb-1' THEN
+                          TRUNC(sysdate, 'IW')-8
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='we' THEN
+                     NEXT_DAY(TRUNC(sysdate,'IW'),'SATURDAY')
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='we-1' THEN
+                     NEXT_DAY(TRUNC(sysdate,'IW')-8,'SATURDAY')
+    WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='mb' THEN
+		trunc(sysdate,'MM')
+    WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='me' THEN
+		trunc(last_day(sysdate))
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='mb-1' THEN
+		trunc(trunc(sysdate, 'MM') - 1, 'MM')
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='me-1' THEN
+		(trunc(sysdate, 'MM') - 1)
+		 WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='mb-2' THEN
+		add_months(trunc(sysdate, 'MM'), - 2)
+ WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='me-2' THEN
+		(last_day(add_months (sysdate,-2)))
+		WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='yb' THEN
+		trunc(sysdate,'YY')
+		 WHEN ( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) )='yb-1' THEN
+		trunc(trunc(sysdate, 'YY') - 1, 'YY')
+ else
+    TO_DATE(( @Prompt(Enter Claim Finalized From Date:§(relative or absolute date§)) ),'MM/dd/yyyy')
+END)  AND  (CASE
+    WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='t' THEN
+		trunc(sysdate)
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) ) Like't-%' THEN
+		trunc(sysdate)-to_number(Substr(( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) ),3,3))
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='wb' THEN
+                          TRUNC(sysdate, 'IW')-1
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='wb-1' THEN
+                          TRUNC(sysdate, 'IW')-8
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='we' THEN
+                     NEXT_DAY(TRUNC(sysdate,'IW'),'SATURDAY')
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='we-1' THEN
+                     NEXT_DAY(TRUNC(sysdate,'IW')-8,'SATURDAY')
+    WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='mb' THEN
+		trunc(sysdate,'MM')
+    WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='me' THEN
+		trunc(last_day(sysdate))
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='mb-1' THEN
+		trunc(trunc(sysdate, 'MM') - 1, 'MM')
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='me-1' THEN
+		(trunc(sysdate, 'MM') - 1)
+		WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='mb-2' THEN
+		add_months(trunc(sysdate, 'MM'), - 2)
+ WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='me-2' THEN
+		(last_day(add_months (sysdate,-2)))
+		WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='yb' THEN
+		trunc(sysdate,'YY')
+		 WHEN ( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) )='yb-1' THEN
+		trunc(trunc(sysdate, 'YY') - 1, 'YY')
+ else
+    TO_DATE(( @Prompt(Enter Claim Finalized Thru Date:§(relative or absolute date§)) ),'MM/dd/yyyy')
+END)
+   AND
+   (
+    EOB_CODE.MNEMONIC  IN  @Prompt('Enter Claim Denial Code(s) or Leave Blank for All:','A','Claim EOB (EOB)\Eob Code Id (CLM_EOB)\Mnemonic (EOB_CODE)',Multi,Free,Persistent,,User:8,Optional)
+    OR
+    EOB_CODE2.MNEMONIC  IN  @Prompt('Enter Claim Denial Code(s) or Leave Blank for All:','A','Claim Line (CLD)\Claim Line EOB\Eob Code Id (CLD)\Mnemonic (CLD)',Multi,Free,Persistent,,User:7,Optional)
+   )
+   AND
+   CLMPOS.NAME  IN  @Prompt('Enter POS Type(s) or Leave Blank for All:','A','Claim Line (CLD)\Pos Type C (CLD)\Name (CLMPOS)',Multi,Free,Persistent,,User:9,Optional)
+   AND
+   EOB_CODE.CODE_TYPE_C  IN  ( 2  )
+   AND
+   CASE
+WHEN CLM.ORIG_REV_CLM_ID IS NOT NULL
+    THEN 'Reversal Claim'
+WHEN  (CLM.ORIG_ADJST_CLM_ID IS NOT NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NULL) OR ("LEGACY_ADJST"."CLAIM_ID" IS NOT NULL)
+                THEN 'Adjusted / Revised Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NOT NULL  AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NOT NULL
+  THEN 'Multiple Adj Interim Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND  "LEGACY_ADJST"."CLAIM_ID" IS  NULL
+    THEN 'Original Claim'
+ELSE NULL
+END  IN  @Prompt('Enter Claim Adjudication Type:','A','Claim Header (CLM)\Clm Adj Type (CLM)\Clm Adj Type Desc (CLM)',Multi,Free,Persistent,,User:13)
+   AND
+   NVL(CLM_TRAIT.NAME,'KFHP')  IN  @Prompt('Enter ANIC Claim Trait or Leave Blank for All:','A','Claim Header (CLM)\Company Code (CLM)',Multi,Free,Persistent,,User:10,Optional)
+   AND
+   nvl(CLM2.DENTAL_INFO_YN,'N')  IN  @Prompt('Enter Dental Indicator (Y/N):','A','Claim Header (CLM)\Dental Info Yn (CLM2)',Multi,Free,Persistent,{'N'},User:11,Optional)
+   AND
+   CLM.ADJST_CLM_ID  Is Null
+   AND
+   ZC_REG_CD.NAME  IN  @Prompt('Enter CO Service Area Name:','A','Plan / Group (GRP)\Current Region Code C (GRP)\Current Region Code Name (GRP)',Multi,Free,Persistent,,User:12,Optional)
+   AND
+   ( ( CASE
+WHEN D_VM.PLACE_OF_SERVICE_ID IS NOT NULL THEN 'Y' ELSE 'N'
+END ) in @Prompt(Visiting Member) OR ( 'ALL') IN @Prompt(Visiting Member)  )
+  )
+--END--
+SELECT DISTINCT
+  EOB_CODE.MNEMONIC,
+  EOB_CODE.EOB_CODE_NAME
+FROM
+  CLARITY_EOB_CODE  EOB_CODE
+WHERE
+  EOB_CODE.CODE_TYPE_C  =  2
+--END--
+SELECT DISTINCT
+  CLM_MAP_1.INTERNAL_ID,
+  EAP.PROC_CODE,
+  CLM_CS.NAME,
+  CLM.STATUS_DATE,
+  CKR.CHECK_STATUS_C,
+  CLM_APSTS.ABBR,
+  CASE
+	WHEN CLM.AP_STS_C=3 THEN CKR.AP_RUN_DATE
+END,
+  CASE
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('NC','SC') AND
+CLM_TRAIT_2.ABBR='CAP'
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('NW')  AND
+ (UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE  'ANTHEM FOUNDATION%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM SUNNYSIDE%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM WESTSIDE%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANNW REGIONAL LAB%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM CLINIC%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'CARE ESSENTIALS BY ANTHEM NW%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM HOSPITALS%')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'HI' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%HAWAII PERMANENTE MEDICAL GROUP'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%HOSPITAL%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION HEALTH PLAN INC%')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'CO' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%COLORADO PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'KASC FRANKLIN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'KASC LONETREE%')
+Then 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'MAS' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN OF THE MID-ATLANTIC STATES%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%MID ATLANTIC PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION MEDICAL GROUP%'
+OR upper(VENCLM.VENDOR_NAME) = 'ANTHEM MID ATLANTIC')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'GA' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'PMG VENDOR'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FAMILY CHIROPRACTI%')
+THEN 'Internal'
+ELSE 'External'
+END,
+  CASE
+WHEN CLM.ORIG_REV_CLM_ID IS NOT NULL
+    THEN 'Reversal Claim'
+WHEN  (CLM.ORIG_ADJST_CLM_ID IS NOT NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NULL) OR ("LEGACY_ADJST"."CLAIM_ID" IS NOT NULL)
+                THEN 'Adjusted / Revised Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NOT NULL  AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NOT NULL
+  THEN 'Multiple Adj Interim Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND  "LEGACY_ADJST"."CLAIM_ID" IS  NULL
+    THEN 'Original Claim'
+ELSE NULL
+END,
+  ZC_SPEC.NAME,
+  EOB_CODE.MNEMONIC,
+  EOB_CODE.EOB_CODE_NAME,
+  EOB_CODE2.MNEMONIC,
+  EOB_CODE2.CODE_TYPE_C,
+  EOB_CODE.CODE_TYPE_C,
+  EOB_CODE2.EOB_CODE_NAME,
+  TRUNC((sysdate-( PAT.BIRTH_DATE ))/365,0),
+  Upper(SERRENADDR.CITY),
+  SERRENST.ABBR,
+    case
+	when D_AA_INDICATOR.CLAIM_ID is null
+then  'Not AA'
+else 'AA'  end,
+  ZC_REG_CD.NAME,
+  case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end,
+  LISTAGG_DTL_INFO.CODE_LIST,
+  LISTAGG_HDR_INFO.CODE_LIST
+FROM (
+   select DISTINCT min(owner) AS
+ CLARITY_DATABASE
+FROM
+ALL_VIEWS  WHERE VIEW_NAME LIKE 'AP_CLAIM'
+  And OWNER Like 'HCCL%'
+  )  D_CLARITY_DATABASE,  ZC_CLM_STATUS  CLM_CS RIGHT OUTER JOIN AP_CLAIM  CLM ON (CLM.STATUS_C=CLM_CS.STATUS_C)
+   LEFT OUTER JOIN PATIENT  PAT ON (PAT.PAT_ID=CLM.PAT_ID)
+   LEFT OUTER JOIN ZC_CLM_AP_STAT  CLM_APSTS ON (CLM.AP_STS_C=CLM_APSTS.AP_STS_C)
+   LEFT OUTER JOIN AP_CLAIM_EOB_CODE  CLM_EOB ON (CLM_EOB.CLAIM_ID=CLM.CLAIM_ID)
+   LEFT OUTER JOIN CLARITY_EOB_CODE  EOB_CODE ON (EOB_CODE.EOB_CODE_ID=CLM_EOB.EOB_CODE_ID)
+   LEFT OUTER JOIN COVERAGE  COVCL ON (CLM.COVERAGE_ID=COVCL.COVERAGE_ID)
+   LEFT OUTER JOIN PLAN_GRP  GRP ON (GRP.PLAN_GRP_ID=COVCL.PLAN_GRP_ID)
+   LEFT OUTER JOIN ZC_REGION_CODE  ZC_REG_CD ON (GRP.CUR_REGION_CODE_C=ZC_REG_CD.REGION_CODE_C)
+   LEFT OUTER JOIN CLARITY_LOB  LOBCL ON (CLM.CLM_LOB_ID=LOBCL.LOB_ID)
+   LEFT OUTER JOIN (
+  (SELECT
+ CLM.CLAIM_ID
+ FROM  AP_CLAIM  CLM
+ WHERE
+ CLM.CLAIM_ID NOT IN
+(SELECT CLAIM_ID
+FROM AP_CLAIM_CHANGE_HX HX
+LEFT OUTER JOIN ECI_BASIC ECI ON HX.CM_LOG_OWNER_ID =ECI.INSTANCE_ID
+WHERE((UPPER(DEPLYMNT_DESC) LIKE '%NP%' AND CHANGE_HX_USER_ID NOT IN ( '161NCALTAP3','161NCALTAP1')) --NCAL
+OR (UPPER(DEPLYMNT_DESC) LIKE '%CO%' AND CHANGE_HX_USER_ID NOT IN ( '140194','44323593','44323592')) --CO
+OR (UPPER(DEPLYMNT_DESC) LIKE '%SP%' AND CHANGE_HX_USER_ID NOT IN ( '1501001006','1501001005','150119165')) --SCAL
+OR (UPPER(DEPLYMNT_DESC) LIKE '%MA%' AND CHANGE_HX_USER_ID NOT IN ( '170100056','1213117','19012093','17017391')) --MAS
+OR (UPPER(DEPLYMNT_DESC) LIKE '%NW%' AND CHANGE_HX_USER_ID NOT IN ( '19012093','19012091')) --NW
+OR (UPPER(DEPLYMNT_DESC) LIKE '%HI%' AND CHANGE_HX_USER_ID NOT IN ( '130HI50101','130HI50100')) --HI
+OR (UPPER(DEPLYMNT_DESC) LIKE '%GA%' AND CHANGE_HX_USER_ID NOT IN('2001','200EDIUSER')) -- GA
+) )
+AND (CLM.STATUS_C IN (3, 4, 5)
+AND CLM.ORIG_REV_CLM_ID IS NULL
+AND CLM.ORIG_ADJST_CLM_ID IS NULL))
+  )  D_AA_INDICATOR ON (D_AA_INDICATOR.CLAIM_ID=CLM.CLAIM_ID)
+   LEFT OUTER JOIN CLARITY_EPP  EPPCL ON (CLM.PLAN_ID=EPPCL.BENEFIT_PLAN_ID)
+   LEFT OUTER JOIN CLARITY_EPP_2  EPPCL_2 ON (EPPCL_2.BENEFIT_PLAN_ID=EPPCL.BENEFIT_PLAN_ID)
+   LEFT OUTER JOIN ZC_PROD_TYPE  ZC_PRD_TYP ON (EPPCL_2.PROD_TYPE_C=ZC_PRD_TYP.PROD_TYPE_C)
+   LEFT OUTER JOIN AP_CLAIM_PX  CLD ON (CLM.CLAIM_ID=CLD.CLAIM_ID)
+   LEFT OUTER JOIN ZC_POS_TYPE  CLMPOS ON (CLD.POS_TYPE_C=CLMPOS.POS_TYPE_C)
+   LEFT OUTER JOIN CLARITY_EAP  EAP ON (CLD.PROC_ID=EAP.PROC_ID)
+   LEFT OUTER JOIN AP_CLAIM_PX_EOBS  CLD_EOB ON (CLD.TX_ID=CLD_EOB.TX_ID)
+   LEFT OUTER JOIN CLARITY_EOB_CODE  EOB_CODE2 ON (CLD_EOB.EOB_CODE_ID=EOB_CODE2.EOB_CODE_ID)
+   LEFT OUTER JOIN AP_CLAIM_2  CLM2 ON (CLM.CLAIM_ID=CLM2.CLAIM_ID)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_3  CLM_TRAIT ON (CLM2.CLM_TRAIT_3_C=CLM_TRAIT.CLM_TRAIT_3_C)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_4  CLM_TRAIT_4 ON (CLM2.CLM_TRAIT_4_C=CLM_TRAIT_4.CLM_TRAIT_4_C
+)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_2  CLM_TRAIT_2 ON (CLM2.CLM_TRAIT_2_C=CLM_TRAIT_2.CLM_TRAIT_2_C)
+   LEFT OUTER JOIN CLARITY_SER  SERREN ON (CLM.PROV_ID=SERREN.PROV_ID)
+   LEFT OUTER JOIN CLARITY_SER_2  SERREN_2 ON (SERREN.PROV_ID=SERREN_2.PROV_ID)
+   LEFT OUTER JOIN (
+  SELECT
+  PRV_SPEC.PROV_ID PROV_ID,
+  PRV_SPEC.SPECIALTY_C SPECIALTY_C
+FROM
+  CLARITY_SER_SPEC  PRV_SPEC
+WHERE LINE=1
+group by PROV_ID,SPECIALTY_C
+  )  D_PRV_SPEC ON (SERREN.PROV_ID=D_PRV_SPEC.PROV_ID)
+   LEFT OUTER JOIN ZC_SPECIALTY  ZC_SPEC ON (D_PRV_SPEC.SPECIALTY_C=ZC_SPEC.SPECIALTY_C)
+   LEFT OUTER JOIN CLARITY_SER_ADDR  SERRENADDR ON (SERREN.PROV_ID=SERRENADDR.PROV_ID)
+   LEFT OUTER JOIN ZC_STATE  SERRENST ON (SERRENADDR.STATE_C=SERRENST.STATE_C  AND  SERRENST.INTERNAL_ID >= 0  AND SERRENST.INTERNAL_ID <= 51)
+   LEFT OUTER JOIN CLARITY_VENDOR  VENCLM ON (VENCLM.VENDOR_ID=CLM.VENDOR_ID)
+   LEFT OUTER JOIN (
+  select t1.vendor_id,t1.line,t1.TAX_ID
+from	vendor_tax_id   t1 ,
+(select	vendor_id,max(line) as line from	vendor_tax_id group	by vendor_id)   t2	Where 	t1.vendor_id=t2.vendor_id 	and	t1.line=t2.line
+group	by  t1.vendor_id,t1.line,t1.TAX_ID
+  )  D_VTN ON (VENCLM.VENDOR_ID=D_VTN.VENDOR_ID)
+   LEFT OUTER JOIN (
+  SELECT DISTINCT VENDOR_ID,  PLACE_OF_SERVICE_ID FROM VENDOR_POS
+WHERE PLACE_OF_SERVICE_ID IN  (SELECT POS_ID FROM CLARITY_POS WHERE  POS_NAME LIKE '%VISITING MEM%')
+union all
+SELECT distinct
+   t1.vendor_id
+   ,999 as PLACE_OF_SERVICE_ID
+from
+   vendor_tax_id t1 inner join
+		(
+		select    vendor_id,
+		max(line) as line
+		from      vendor_tax_id
+		group    by vendor_id
+		)  t2 on             t1.vendor_id=t2.vendor_id
+                             and        t1.line=t2.line
+WHERE
+  t1.TAX_ID  = '811559375'
+  )  D_VM ON (D_VM.VENDOR_ID=VENCLM.VENDOR_ID)
+   LEFT OUTER JOIN CLM_MAP  CLM_MAP_1 ON (CLM.CLAIM_ID=CLM_MAP_1.CID  AND  CLM.CM_LOG_OWNER_ID=CLM_MAP_1.CM_LOG_OWNER_ID)
+   LEFT OUTER JOIN (
+  SELECT
+CLAIM_ID
+,PAT_LIABILITY
+,LISTAGG(MNEMONIC,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS CODE_LIST
+,LISTAGG(REMIT_CD,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS REMIT_CODE_LIST
+FROM  (SELECT DISTINCT
+        CLM_EOB.CLAIM_ID
+        ,CASE WHEN MAX(EOB.ROUTE_FROM_DISC_C)=2 THEN 'Yes' ELSE
+		'No'
+		END AS PAT_LIABILITY
+        ,EOB.MNEMONIC
+        ,RMC.RMC_EXTERNAL_ID||'/'||RMK.ABBR AS REMIT_CD
+        FROM
+        AP_CLAIM_PX_EOBS CLM_EOB,
+        CLARITY_EOB_CODE EOB,
+		CLARITY_RMC RMC,
+		ZC_REMARK_CODE RMK
+        WHERE
+        CLM_EOB.EOB_CODE_ID=EOB.EOB_CODE_ID
+		AND EOB.REMIT_CODE_ID=RMC.REMIT_CODE_ID(+)
+		AND EOB.REMARK_CODE_C=RMK.REMARK_CODE_C(+)
+        --1 IS PEND CODE    2 IS DENIAL CODE        3 IS INFO CODE
+        AND EOB.CODE_TYPE_C=3
+        GROUP BY CLM_EOB.CLAIM_ID,EOB.ROUTE_FROM_DISC_C,EOB.MNEMONIC,RMC.RMC_EXTERNAL_ID,RMK.ABBR
+		)
+GROUP BY CLAIM_ID,PAT_LIABILITY
+  )  LISTAGG_DTL_INFO ON (CLM.CLAIM_ID=LISTAGG_DTL_INFO.CLAIM_ID)
+   LEFT OUTER JOIN (
+      SELECT DISTINCT CLM.CLAIM_ID FROM  (
+   select DISTINCT min(owner) AS
+ CLARITY_DATABASE
+FROM
+ALL_VIEWS  WHERE VIEW_NAME LIKE 'AP_CLAIM'
+  And OWNER Like 'HCCL%'
+  )  D_CLARITY_DATABASE
+  ,  CLARITY_EOB_CODE  EOB_CODE
+  RIGHT OUTER JOIN AP_CLAIM_EOB_CODE  CLM_EOB ON (EOB_CODE.EOB_CODE_ID=CLM_EOB.EOB_CODE_ID)
+   RIGHT OUTER JOIN AP_CLAIM  CLM ON (CLM_EOB.CLAIM_ID=CLM.CLAIM_ID)
+   WHERE
+  ( ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('SC','NC') AND  EOB_CODE.MNEMONIC IN ('CI134','CLP38','CLI36') AND CLM_EOB.ENTRY_DATE >=TO_DATE ('2017-12-15' ,'YYYY-MM-DD'))
+  )  "LEGACY_ADJST" ON (CLM.CLAIM_ID="LEGACY_ADJST"."CLAIM_ID")
+   LEFT OUTER JOIN (
+  SELECT
+CLAIM_ID
+,LISTAGG(MNEMONIC,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS CODE_LIST
+,LISTAGG(REMIT_CD,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS REMIT_CODE_LIST
+FROM  (SELECT DISTINCT
+        CLM_EOB.CLAIM_ID
+        ,EOB.MNEMONIC
+        ,RMC.RMC_EXTERNAL_ID||'/'||RMK.ABBR AS REMIT_CD
+        FROM
+        AP_CLAIM_EOB_CODE CLM_EOB,
+        CLARITY_EOB_CODE EOB,
+		CLARITY_RMC RMC,
+		ZC_REMARK_CODE RMK
+        WHERE
+        CLM_EOB.EOB_CODE_ID=EOB.EOB_CODE_ID
+		AND EOB.REMIT_CODE_ID=RMC.REMIT_CODE_ID(+)
+		AND EOB.REMARK_CODE_C=RMK.REMARK_CODE_C(+)
+        AND CLM_EOB.RESOLUTION_DATE IS NULL
+        --1 IS PEND CODE    2 IS DENIAL CODE        3 IS INFO CODE
+        AND EOB.CODE_TYPE_C=3
+		)
+GROUP BY CLAIM_ID
+  )  LISTAGG_HDR_INFO ON (CLM.CLAIM_ID=LISTAGG_HDR_INFO.CLAIM_ID)
+   LEFT OUTER JOIN AP_CLAIM_CHECK  CLM_CHK ON (CLM.CLAIM_ID=CLM_CHK.CLAIM_ID)
+   LEFT OUTER JOIN AP_CHECK  CKR ON (CLM_CHK.CHECK_ID=CKR.CHECK_ID)
+WHERE
+( COALESCE(CLM.WORKFLOW_C,0) IN @Prompt(P_WorkflowTypeInclude)  and COALESCE(CLM_TRAIT_4.NAME,'CCA') In @Prompt(P_CCA-TPMG)  )
+  AND
+  (
+   coalesce(EPPCL.PRODUCT_TYPE ,ZC_PRD_TYP.NAME)  IN  @Prompt('Enter Product Type or Leave Blank for All:','A','Claim Header (CLM)\Claim Header IDs (CLM)\Benefit Plan Id (CLM)\Product Type',Multi,Free,Persistent,,User:1,Optional)
+   AND
+   nvl(LOBCL.LOB_NAME,'UNKNOWN')  LIKE  @Prompt('Enter Line of Business or Leave Blank for All:','A','Claim Header (CLM)\Line Of Business (CLM)\Line Of Business Name (CLM)',Mono,Free,Persistent,,User:2,Optional)
+   AND
+   SERREN.PROV_NAME  LIKE  @Prompt('Enter Provider Name or Leave Blank for All:','A','Provider (PRV)\Rendering (SERREN)\Prov Name (SERREN)',Mono,Free,Persistent,,User:3,Optional)
+   AND
+   SERREN_2.NPI  LIKE  @Prompt('Enter Provider ID or Leave Blank for All:','A',,Mono,Free,Persistent,,User:4,Optional)
+   AND
+   D_VTN.TAX_ID  LIKE  @Prompt('Enter Vendor Tax ID or Leave Blank for All:','A',,Mono,Free,Persistent,,User:5,Optional)
+   AND
+   VENCLM.VENDOR_NAME  LIKE  @Prompt('Enter Vendor Name or Leave Blank for All:','A','Claim Header Vendor (VENCLM)\Vendor Name (VENCLM)',Mono,Free,Persistent,,User:6,Optional)
+   AND
+   GRP.PLAN_GRP_NAME  LIKE  @Prompt('Enter Plan Group Name or Leave Blank for All:','A','Plan / Group (GRP)\Plan Grp Name (GRP)',Mono,Free,Persistent,,User:0,Optional)
+   AND
+   CLM.STATUS_C  =  3
+   AND
+   CASE
+	WHEN CLM.AP_STS_C=3 THEN CKR.AP_RUN_DATE
+END  Is Null
+   AND
+   CLMPOS.NAME  IN  @Prompt('Enter POS Type(s) or Leave Blank for All:','A','Claim Line (CLD)\Pos Type C (CLD)\Name (CLMPOS)',Multi,Free,Persistent,,User:7,Optional)
+   AND
+   (
+    EOB_CODE2.MNEMONIC  IN  @Prompt('Enter Claim Denial Code(s) or Leave Blank for All:','A','Claim Line (CLD)\Claim Line EOB\Eob Code Id (CLD)\Mnemonic (CLD)',Multi,Free,Persistent,,User:8,Optional)
+    OR
+    EOB_CODE.MNEMONIC  IN  @Prompt('Enter Claim Denial Code(s) or Leave Blank for All:','A','Claim EOB (EOB)\Eob Code Id (CLM_EOB)\Mnemonic (EOB_CODE)',Multi,Free,Persistent,,User:9,Optional)
+   )
+   AND
+   NVL(CLM_TRAIT.NAME,'KFHP')  IN  @Prompt('Enter ANIC Claim Trait or Leave Blank for All:','A','Claim Header (CLM)\Company Code (CLM)',Multi,Free,Persistent,,User:10,Optional)
+   AND
+   nvl(CLM2.DENTAL_INFO_YN,'N')  IN  @Prompt('Enter Dental Indicator (Y/N):','A','Claim Header (CLM)\Dental Info Yn (CLM2)',Multi,Free,Persistent,{'N'},User:11,Optional)
+   AND
+   CLM.ADJST_CLM_ID  Is Null
+   AND
+   ZC_REG_CD.NAME  IN  @Prompt('Enter CO Service Area Name:','A','Plan / Group (GRP)\Current Region Code C (GRP)\Current Region Code Name (GRP)',Multi,Free,Persistent,,User:12,Optional)
+   AND
+   CASE
+WHEN CLM.ORIG_REV_CLM_ID IS NOT NULL
+    THEN 'Reversal Claim'
+WHEN  (CLM.ORIG_ADJST_CLM_ID IS NOT NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NULL) OR ("LEGACY_ADJST"."CLAIM_ID" IS NOT NULL)
+                THEN 'Adjusted / Revised Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NOT NULL  AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NOT NULL
+  THEN 'Multiple Adj Interim Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND  "LEGACY_ADJST"."CLAIM_ID" IS  NULL
+    THEN 'Original Claim'
+ELSE NULL
+END  IN  @Prompt('Enter Claim Adjudication Type:','A','Claim Header (CLM)\Clm Adj Type (CLM)\Clm Adj Type Desc (CLM)',Multi,Free,Persistent,{'Original Claim'},User:13)
+   AND
+   ( ( CASE
+WHEN D_VM.PLACE_OF_SERVICE_ID IS NOT NULL THEN 'Y' ELSE 'N'
+END ) in @Prompt(Visiting Member) OR ( 'ALL') IN @Prompt(Visiting Member)  )
+  )
+--END--
+SELECT DISTINCT
+  CLM_MAP_1.INTERNAL_ID,
+  CLD.LINE,
+  CLM.ACCT_NUM_WITH_VEN
+,
+  CLM_CF.NAME,
+  CASE
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('NC','SC') AND
+CLM_TRAIT_2.ABBR='CAP'
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('NW')  AND
+ (UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE  'ANTHEM FOUNDATION%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM SUNNYSIDE%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM WESTSIDE%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANNW REGIONAL LAB%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM CLINIC%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'CARE ESSENTIALS BY ANTHEM NW%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM HOSPITALS%')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'HI' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%HAWAII PERMANENTE MEDICAL GROUP'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%HOSPITAL%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION HEALTH PLAN INC%')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'CO' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%COLORADO PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'KASC FRANKLIN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'KASC LONETREE%')
+Then 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'MAS' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN OF THE MID-ATLANTIC STATES%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%MID ATLANTIC PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION MEDICAL GROUP%'
+OR upper(VENCLM.VENDOR_NAME) = 'ANTHEM MID ATLANTIC')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'GA' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'PMG VENDOR'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FAMILY CHIROPRACTI%')
+THEN 'Internal'
+ELSE 'External'
+END,
+  VENCLM.VENDOR_NAME,
+  nvl(LOBCL.LOB_NAME,'UNKNOWN'),
+  SERREN.PROV_NAME,
+  EAP.PROC_CODE,
+  CLM.TYPE_OF_BILL,
+  CLM_CS.NAME,
+  ZC_SPEC.NAME,
+  EOB_CODE.MNEMONIC,
+  EOB_CODE.EOB_CODE_NAME,
+  (case when length(substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1))) = 0 or  length(substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1))) Is Null  then CLD.MODIFIERS else  substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1)-1) end),
+  (case when length(CLD.MODIFIERS) > 3 then substr(CLD.MODIFIERS,4,2) else '0' end),
+  (case when length(CLD.MODIFIERS) > 6 then substr(CLD.MODIFIERS,7,2) else '0' end),
+  (case when length(CLD.MODIFIERS) > 9 then substr(CLD.MODIFIERS,10,2) else '0' end ),
+  CASE
+	WHEN CLM.AP_STS_C=3 THEN CKR.AP_RUN_DATE
+END,
+  CLM.DATE_RECEIVED,
+  CLM.SERVICE_END_DATE,
+  WQ.WORKQUEUE_NAME,
+  CLM.SERVICE_START_DATE,
+  CLD.POS_TYPE_C,
+  CLMPOS.NAME,
+  POS.POS_NAME,
+  sum(coalesce(CLD.OVERRIDE_ALLD_AMT,CLD.ALLOWED_AMT,0)),
+  CLD.NET_PAYABLE,
+  sum(coalesce(CLD.OVRD_COPAY,CLD.COPAYMENT,0)),
+  sum(coalesce(CLD.OVRD_COINS,CLD.COINSURANCE,0)),
+  sum(CLD.BILLED_AMT),
+  EAFMAP.INTERNAL_ID,
+  sum(coalesce(CLD.OVRD_DEDUCTIBLE,CLD.DEDUCTIBLE,0)),
+  SUM(CLD.PRIM_PAT_PORTION),
+  sum(CLD.PRIM_INS_AMOUNT),
+  TRUNC((sysdate-( PAT.BIRTH_DATE ))/365,0),
+  Upper(SERRENADDR.CITY),
+  SERRENST.ABBR,
+    case
+	when D_AA_INDICATOR.CLAIM_ID is null
+then  'Not AA'
+else 'AA'  end,
+  ZC_REG_CD.NAME,
+  case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end,
+  LISTAGG_DTL_INFO.CODE_LIST,
+  LISTAGG_HDR_INFO.CODE_LIST,
+  CLD.BILLED_AMT
+FROM (
+   select DISTINCT min(owner) AS
+ CLARITY_DATABASE
+FROM
+ALL_VIEWS  WHERE VIEW_NAME LIKE 'AP_CLAIM'
+  And OWNER Like 'HCCL%'
+  )  D_CLARITY_DATABASE,  ZC_CLAIM_FORMAT  CLM_CF RIGHT OUTER JOIN AP_CLAIM  CLM ON (CLM.CLAIM_FORMAT_C=CLM_CF.CLAIM_FORMAT_C)
+   LEFT OUTER JOIN ZC_CLM_STATUS  CLM_CS ON (CLM.STATUS_C=CLM_CS.STATUS_C)
+   LEFT OUTER JOIN PATIENT  PAT ON (PAT.PAT_ID=CLM.PAT_ID)
+   LEFT OUTER JOIN CLARITY_POS  POS ON (CLM.LOC_ID=POS.POS_ID)
+   LEFT OUTER JOIN EAF_MAP  EAFMAP ON (EAFMAP.CID=POS.POS_ID  AND  POS.CM_LOG_OWNER_ID=EAFMAP.CM_LOG_OWNER_ID)
+   LEFT OUTER JOIN AP_CLAIM_EOB_CODE  CLM_EOB ON (CLM_EOB.CLAIM_ID=CLM.CLAIM_ID)
+   LEFT OUTER JOIN CLARITY_EOB_CODE  EOB_CODE ON (EOB_CODE.EOB_CODE_ID=CLM_EOB.EOB_CODE_ID)
+   LEFT OUTER JOIN COVERAGE  COVCL ON (CLM.COVERAGE_ID=COVCL.COVERAGE_ID)
+   LEFT OUTER JOIN PLAN_GRP  GRP ON (GRP.PLAN_GRP_ID=COVCL.PLAN_GRP_ID)
+   LEFT OUTER JOIN ZC_REGION_CODE  ZC_REG_CD ON (GRP.CUR_REGION_CODE_C=ZC_REG_CD.REGION_CODE_C)
+   LEFT OUTER JOIN CLARITY_LOB  LOBCL ON (CLM.CLM_LOB_ID=LOBCL.LOB_ID)
+   LEFT OUTER JOIN (
+  (SELECT
+ CLM.CLAIM_ID
+ FROM  AP_CLAIM  CLM
+ WHERE
+ CLM.CLAIM_ID NOT IN
+(SELECT CLAIM_ID
+FROM AP_CLAIM_CHANGE_HX HX
+LEFT OUTER JOIN ECI_BASIC ECI ON HX.CM_LOG_OWNER_ID =ECI.INSTANCE_ID
+WHERE((UPPER(DEPLYMNT_DESC) LIKE '%NP%' AND CHANGE_HX_USER_ID NOT IN ( '161NCALTAP3','161NCALTAP1')) --NCAL
+OR (UPPER(DEPLYMNT_DESC) LIKE '%CO%' AND CHANGE_HX_USER_ID NOT IN ( '140194','44323593','44323592')) --CO
+OR (UPPER(DEPLYMNT_DESC) LIKE '%SP%' AND CHANGE_HX_USER_ID NOT IN ( '1501001006','1501001005','150119165')) --SCAL
+OR (UPPER(DEPLYMNT_DESC) LIKE '%MA%' AND CHANGE_HX_USER_ID NOT IN ( '170100056','1213117','19012093','17017391')) --MAS
+OR (UPPER(DEPLYMNT_DESC) LIKE '%NW%' AND CHANGE_HX_USER_ID NOT IN ( '19012093','19012091')) --NW
+OR (UPPER(DEPLYMNT_DESC) LIKE '%HI%' AND CHANGE_HX_USER_ID NOT IN ( '130HI50101','130HI50100')) --HI
+OR (UPPER(DEPLYMNT_DESC) LIKE '%GA%' AND CHANGE_HX_USER_ID NOT IN('2001','200EDIUSER')) -- GA
+) )
+AND (CLM.STATUS_C IN (3, 4, 5)
+AND CLM.ORIG_REV_CLM_ID IS NULL
+AND CLM.ORIG_ADJST_CLM_ID IS NULL))
+  )  D_AA_INDICATOR ON (D_AA_INDICATOR.CLAIM_ID=CLM.CLAIM_ID)
+   LEFT OUTER JOIN CLARITY_EPP  EPPCL ON (CLM.PLAN_ID=EPPCL.BENEFIT_PLAN_ID)
+   LEFT OUTER JOIN CLARITY_EPP_2  EPPCL_2 ON (EPPCL_2.BENEFIT_PLAN_ID=EPPCL.BENEFIT_PLAN_ID)
+   LEFT OUTER JOIN ZC_PROD_TYPE  ZC_PRD_TYP ON (EPPCL_2.PROD_TYPE_C=ZC_PRD_TYP.PROD_TYPE_C)
+   LEFT OUTER JOIN AP_CLAIM_PX  CLD ON (CLM.CLAIM_ID=CLD.CLAIM_ID)
+   LEFT OUTER JOIN ZC_POS_TYPE  CLMPOS ON (CLD.POS_TYPE_C=CLMPOS.POS_TYPE_C)
+   LEFT OUTER JOIN CLARITY_EAP  EAP ON (CLD.PROC_ID=EAP.PROC_ID)
+   LEFT OUTER JOIN AP_CLAIM_2  CLM2 ON (CLM.CLAIM_ID=CLM2.CLAIM_ID)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_3  CLM_TRAIT ON (CLM2.CLM_TRAIT_3_C=CLM_TRAIT.CLM_TRAIT_3_C)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_4  CLM_TRAIT_4 ON (CLM2.CLM_TRAIT_4_C=CLM_TRAIT_4.CLM_TRAIT_4_C
+)
+   LEFT OUTER JOIN ZC_CLM_TRAIT_2  CLM_TRAIT_2 ON (CLM2.CLM_TRAIT_2_C=CLM_TRAIT_2.CLM_TRAIT_2_C)
+   LEFT OUTER JOIN CLARITY_SER  SERREN ON (CLM.PROV_ID=SERREN.PROV_ID)
+   LEFT OUTER JOIN CLARITY_SER_2  SERREN_2 ON (SERREN.PROV_ID=SERREN_2.PROV_ID)
+   LEFT OUTER JOIN (
+  SELECT
+  PRV_SPEC.PROV_ID PROV_ID,
+  PRV_SPEC.SPECIALTY_C SPECIALTY_C
+FROM
+  CLARITY_SER_SPEC  PRV_SPEC
+WHERE LINE=1
+group by PROV_ID,SPECIALTY_C
+  )  D_PRV_SPEC ON (SERREN.PROV_ID=D_PRV_SPEC.PROV_ID)
+   LEFT OUTER JOIN ZC_SPECIALTY  ZC_SPEC ON (D_PRV_SPEC.SPECIALTY_C=ZC_SPEC.SPECIALTY_C)
+   LEFT OUTER JOIN CLARITY_SER_ADDR  SERRENADDR ON (SERREN.PROV_ID=SERRENADDR.PROV_ID)
+   LEFT OUTER JOIN ZC_STATE  SERRENST ON (SERRENADDR.STATE_C=SERRENST.STATE_C  AND  SERRENST.INTERNAL_ID >= 0  AND SERRENST.INTERNAL_ID <= 51)
+   LEFT OUTER JOIN CLARITY_VENDOR  VENCLM ON (VENCLM.VENDOR_ID=CLM.VENDOR_ID)
+   LEFT OUTER JOIN (
+  select t1.vendor_id,t1.line,t1.TAX_ID
+from	vendor_tax_id   t1 ,
+(select	vendor_id,max(line) as line from	vendor_tax_id group	by vendor_id)   t2	Where 	t1.vendor_id=t2.vendor_id 	and	t1.line=t2.line
+group	by  t1.vendor_id,t1.line,t1.TAX_ID
+  )  D_VTN ON (VENCLM.VENDOR_ID=D_VTN.VENDOR_ID)
+   LEFT OUTER JOIN (
+  SELECT DISTINCT VENDOR_ID,  PLACE_OF_SERVICE_ID FROM VENDOR_POS
+WHERE PLACE_OF_SERVICE_ID IN  (SELECT POS_ID FROM CLARITY_POS WHERE  POS_NAME LIKE '%VISITING MEM%')
+union all
+SELECT distinct
+   t1.vendor_id
+   ,999 as PLACE_OF_SERVICE_ID
+from
+   vendor_tax_id t1 inner join
+		(
+		select    vendor_id,
+		max(line) as line
+		from      vendor_tax_id
+		group    by vendor_id
+		)  t2 on             t1.vendor_id=t2.vendor_id
+                             and        t1.line=t2.line
+WHERE
+  t1.TAX_ID  = '811559375'
+  )  D_VM ON (D_VM.VENDOR_ID=VENCLM.VENDOR_ID)
+   LEFT OUTER JOIN CLM_MAP  CLM_MAP_1 ON (CLM.CLAIM_ID=CLM_MAP_1.CID  AND  CLM.CM_LOG_OWNER_ID=CLM_MAP_1.CM_LOG_OWNER_ID)
+   LEFT OUTER JOIN (
+  SELECT
+CLAIM_ID
+,PAT_LIABILITY
+,LISTAGG(MNEMONIC,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS CODE_LIST
+,LISTAGG(REMIT_CD,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS REMIT_CODE_LIST
+FROM  (SELECT DISTINCT
+        CLM_EOB.CLAIM_ID
+        ,CASE WHEN MAX(EOB.ROUTE_FROM_DISC_C)=2 THEN 'Yes' ELSE
+		'No'
+		END AS PAT_LIABILITY
+        ,EOB.MNEMONIC
+        ,RMC.RMC_EXTERNAL_ID||'/'||RMK.ABBR AS REMIT_CD
+        FROM
+        AP_CLAIM_PX_EOBS CLM_EOB,
+        CLARITY_EOB_CODE EOB,
+		CLARITY_RMC RMC,
+		ZC_REMARK_CODE RMK
+        WHERE
+        CLM_EOB.EOB_CODE_ID=EOB.EOB_CODE_ID
+		AND EOB.REMIT_CODE_ID=RMC.REMIT_CODE_ID(+)
+		AND EOB.REMARK_CODE_C=RMK.REMARK_CODE_C(+)
+        --1 IS PEND CODE    2 IS DENIAL CODE        3 IS INFO CODE
+        AND EOB.CODE_TYPE_C=3
+        GROUP BY CLM_EOB.CLAIM_ID,EOB.ROUTE_FROM_DISC_C,EOB.MNEMONIC,RMC.RMC_EXTERNAL_ID,RMK.ABBR
+		)
+GROUP BY CLAIM_ID,PAT_LIABILITY
+  )  LISTAGG_DTL_INFO ON (CLM.CLAIM_ID=LISTAGG_DTL_INFO.CLAIM_ID)
+   LEFT OUTER JOIN (
+      SELECT DISTINCT CLM.CLAIM_ID FROM  (
+   select DISTINCT min(owner) AS
+ CLARITY_DATABASE
+FROM
+ALL_VIEWS  WHERE VIEW_NAME LIKE 'AP_CLAIM'
+  And OWNER Like 'HCCL%'
+  )  D_CLARITY_DATABASE
+  ,  CLARITY_EOB_CODE  EOB_CODE
+  RIGHT OUTER JOIN AP_CLAIM_EOB_CODE  CLM_EOB ON (EOB_CODE.EOB_CODE_ID=CLM_EOB.EOB_CODE_ID)
+   RIGHT OUTER JOIN AP_CLAIM  CLM ON (CLM_EOB.CLAIM_ID=CLM.CLAIM_ID)
+   WHERE
+  ( ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('SC','NC') AND  EOB_CODE.MNEMONIC IN ('CI134','CLP38','CLI36') AND CLM_EOB.ENTRY_DATE >=TO_DATE ('2017-12-15' ,'YYYY-MM-DD'))
+  )  "LEGACY_ADJST" ON (CLM.CLAIM_ID="LEGACY_ADJST"."CLAIM_ID")
+   LEFT OUTER JOIN (
+  SELECT
+CLAIM_ID
+,LISTAGG(MNEMONIC,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS CODE_LIST
+,LISTAGG(REMIT_CD,', ') WITHIN GROUP ( ORDER BY MNEMONIC) AS REMIT_CODE_LIST
+FROM  (SELECT DISTINCT
+        CLM_EOB.CLAIM_ID
+        ,EOB.MNEMONIC
+        ,RMC.RMC_EXTERNAL_ID||'/'||RMK.ABBR AS REMIT_CD
+        FROM
+        AP_CLAIM_EOB_CODE CLM_EOB,
+        CLARITY_EOB_CODE EOB,
+		CLARITY_RMC RMC,
+		ZC_REMARK_CODE RMK
+        WHERE
+        CLM_EOB.EOB_CODE_ID=EOB.EOB_CODE_ID
+		AND EOB.REMIT_CODE_ID=RMC.REMIT_CODE_ID(+)
+		AND EOB.REMARK_CODE_C=RMK.REMARK_CODE_C(+)
+        AND CLM_EOB.RESOLUTION_DATE IS NULL
+        --1 IS PEND CODE    2 IS DENIAL CODE        3 IS INFO CODE
+        AND EOB.CODE_TYPE_C=3
+		)
+GROUP BY CLAIM_ID
+  )  LISTAGG_HDR_INFO ON (CLM.CLAIM_ID=LISTAGG_HDR_INFO.CLAIM_ID)
+   LEFT OUTER JOIN AP_CLAIM_WQ_ITEM  WQI ON (CLM.CLAIM_ID=WQI.CLAIM_ID)
+   LEFT OUTER JOIN AP_CLAIM_WQ  WQ ON (WQI.WORKQUEUE_ID=WQ.WORKQUEUE_ID)
+   LEFT OUTER JOIN AP_CLAIM_CHECK  CLM_CHK ON (CLM.CLAIM_ID=CLM_CHK.CLAIM_ID)
+   LEFT OUTER JOIN AP_CHECK  CKR ON (CLM_CHK.CHECK_ID=CKR.CHECK_ID)
+WHERE
+( COALESCE(CLM.WORKFLOW_C,0) IN @Prompt(P_WorkflowTypeInclude)  and COALESCE(CLM_TRAIT_4.NAME,'CCA') In @Prompt(P_CCA-TPMG)  )
+  AND
+  (
+   coalesce(EPPCL.PRODUCT_TYPE ,ZC_PRD_TYP.NAME)  IN  @Prompt('Enter Product Type or Leave Blank for All:','A','Claim Header (CLM)\Claim Header IDs (CLM)\Benefit Plan Id (CLM)\Product Type',Multi,Free,Persistent,,User:1,Optional)
+   AND
+   nvl(LOBCL.LOB_NAME,'UNKNOWN')  LIKE  @Prompt('Enter Line of Business or Leave Blank for All:','A','Claim Header (CLM)\Line Of Business (CLM)\Line Of Business Name (CLM)',Mono,Free,Persistent,,User:2,Optional)
+   AND
+   SERREN.PROV_NAME  LIKE  @Prompt('Enter Provider Name or Leave Blank for All:','A','Provider (PRV)\Rendering (SERREN)\Prov Name (SERREN)',Mono,Free,Persistent,,User:3,Optional)
+   AND
+   SERREN_2.NPI  LIKE  @Prompt('Enter Provider ID or Leave Blank for All:','A',,Mono,Free,Persistent,,User:4,Optional)
+   AND
+   D_VTN.TAX_ID  LIKE  @Prompt('Enter Vendor Tax ID or Leave Blank for All:','A',,Mono,Free,Persistent,,User:5,Optional)
+   AND
+   VENCLM.VENDOR_NAME  LIKE  @Prompt('Enter Vendor Name or Leave Blank for All:','A','Claim Header Vendor (VENCLM)\Vendor Name (VENCLM)',Mono,Free,Persistent,,User:6,Optional)
+   AND
+   GRP.PLAN_GRP_NAME  LIKE  @Prompt('Enter Plan Group Name or Leave Blank for All:','A','Plan / Group (GRP)\Plan Grp Name (GRP)',Mono,Free,Persistent,,User:0,Optional)
+   AND
+   (
+    (case when length(substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1))) = 0 or  length(substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1))) Is Null  then CLD.MODIFIERS else  substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1)-1) end)  IN  ( '77','76'  )
+    OR
+    (case when length(CLD.MODIFIERS) > 6 then substr(CLD.MODIFIERS,7,2) else '0' end)  IN  ( '77','76'  )
+    OR
+    (case when length(CLD.MODIFIERS) > 9 then substr(CLD.MODIFIERS,10,2) else '0' end )  IN  ( '77','76'  )
+    OR
+    (case when length(CLD.MODIFIERS) > 3 then substr(CLD.MODIFIERS,4,2) else '0' end)  IN  ( '77','76'  )
+   )
+   AND
+   (
+    CLM.STATUS_C  =  3
+    OR
+    CLD.STATUS_C  =  1
+   )
+   AND
+   EOB_CODE.MNEMONIC  IN  ( 'CED12','CED44'  )
+   AND
+   CLMPOS.NAME  IN  @Prompt('Enter POS Type(s) or Leave Blank for All:','A','Claim Line (CLD)\Pos Type C (CLD)\Name (CLMPOS)',Multi,Free,Persistent,,User:7,Optional)
+   AND
+   NVL(CLM_TRAIT.NAME,'KFHP')  IN  @Prompt('Enter ANIC Claim Trait or Leave Blank for All:','A','Claim Header (CLM)\Company Code (CLM)',Multi,Free,Persistent,,User:8,Optional)
+   AND
+   nvl(CLM2.DENTAL_INFO_YN,'N')  IN  @Prompt('Enter Dental Indicator (Y/N):','A','Claim Header (CLM)\Dental Info Yn (CLM2)',Multi,Free,Persistent,{'N'},User:9,Optional)
+   AND
+   CLM.ADJST_CLM_ID  Is Null
+   AND
+   ZC_REG_CD.NAME  IN  @Prompt('Enter CO Service Area Name:','A','Plan / Group (GRP)\Current Region Code C (GRP)\Current Region Code Name (GRP)',Multi,Free,Persistent,,User:10,Optional)
+   AND
+   CASE
+WHEN CLM.ORIG_REV_CLM_ID IS NOT NULL
+    THEN 'Reversal Claim'
+WHEN  (CLM.ORIG_ADJST_CLM_ID IS NOT NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NULL) OR ("LEGACY_ADJST"."CLAIM_ID" IS NOT NULL)
+                THEN 'Adjusted / Revised Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NOT NULL  AND CLM.ORIG_REV_CLM_ID IS NULL AND CLM.ADJST_CLM_ID IS NOT NULL
+  THEN 'Multiple Adj Interim Claim'
+WHEN CLM.ORIG_ADJST_CLM_ID IS NULL AND CLM.ORIG_REV_CLM_ID IS NULL AND  "LEGACY_ADJST"."CLAIM_ID" IS  NULL
+    THEN 'Original Claim'
+ELSE NULL
+END  IN  @Prompt('Enter Claim Adjudication Type:','A','Claim Header (CLM)\Clm Adj Type (CLM)\Clm Adj Type Desc (CLM)',Multi,Free,Persistent,,User:11)
+   AND
+   ( ( CASE
+WHEN D_VM.PLACE_OF_SERVICE_ID IS NOT NULL THEN 'Y' ELSE 'N'
+END ) in @Prompt(Visiting Member) OR ( 'ALL') IN @Prompt(Visiting Member)  )
+  )
+GROUP BY
+  CLM_MAP_1.INTERNAL_ID,
+  CLD.LINE,
+  CLM.ACCT_NUM_WITH_VEN
+,
+  CLM_CF.NAME,
+  CASE
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('NC','SC') AND
+CLM_TRAIT_2.ABBR='CAP'
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) IN ('NW')  AND
+ (UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE  'ANTHEM FOUNDATION%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM SUNNYSIDE%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM WESTSIDE%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANNW REGIONAL LAB%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM CLINIC%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'CARE ESSENTIALS BY ANTHEM NW%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM HOSPITALS%')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'HI' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%HAWAII PERMANENTE MEDICAL GROUP'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%HOSPITAL%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION HEALTH PLAN INC%')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'CO' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%COLORADO PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'KASC FRANKLIN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'KASC LONETREE%')
+Then 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'MAS' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%INTRGNL AN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN OF THE MID-ATLANTIC STATES%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%MID ATLANTIC PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION MEDICAL GROUP%'
+OR upper(VENCLM.VENDOR_NAME) = 'ANTHEM MID ATLANTIC')
+THEN 'Internal'
+WHEN ( case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end ) = 'GA' AND
+(UPPER(VENCLM.VENDOR_NAME) LIKE '%ANTHEM FOUNDATION HEALTH PLAN%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE '%PERMANENTE MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FOUNDATION MEDICAL GROUP%'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'PMG VENDOR'
+OR UPPER(VENCLM.VENDOR_NAME) LIKE 'ANTHEM FAMILY CHIROPRACTI%')
+THEN 'Internal'
+ELSE 'External'
+END,
+  VENCLM.VENDOR_NAME,
+  nvl(LOBCL.LOB_NAME,'UNKNOWN'),
+  SERREN.PROV_NAME,
+  EAP.PROC_CODE,
+  CLM.TYPE_OF_BILL,
+  CLM_CS.NAME,
+  ZC_SPEC.NAME,
+  EOB_CODE.MNEMONIC,
+  EOB_CODE.EOB_CODE_NAME,
+  (case when length(substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1))) = 0 or  length(substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1))) Is Null  then CLD.MODIFIERS else  substr(CLD.MODIFIERS, 0,instr(CLD.MODIFIERS, ',',1,1)-1) end),
+  (case when length(CLD.MODIFIERS) > 3 then substr(CLD.MODIFIERS,4,2) else '0' end),
+  (case when length(CLD.MODIFIERS) > 6 then substr(CLD.MODIFIERS,7,2) else '0' end),
+  (case when length(CLD.MODIFIERS) > 9 then substr(CLD.MODIFIERS,10,2) else '0' end ),
+  CASE
+	WHEN CLM.AP_STS_C=3 THEN CKR.AP_RUN_DATE
+END,
+  CLM.DATE_RECEIVED,
+  CLM.SERVICE_END_DATE,
+  WQ.WORKQUEUE_NAME,
+  CLM.SERVICE_START_DATE,
+  CLD.POS_TYPE_C,
+  CLMPOS.NAME,
+  POS.POS_NAME,
+  CLD.NET_PAYABLE,
+  EAFMAP.INTERNAL_ID,
+  TRUNC((sysdate-( PAT.BIRTH_DATE ))/365,0),
+  Upper(SERRENADDR.CITY),
+  SERRENST.ABBR,
+    case
+	when D_AA_INDICATOR.CLAIM_ID is null
+then  'Not AA'
+else 'AA'  end,
+  ZC_REG_CD.NAME,
+  case when D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLHI%' then 'HI'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNW%' then 'NW'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLMA%' then 'MAS'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLSC%' then 'SC'
+when  D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLNC%' then 'NC'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLCO%' then 'CO'
+When D_CLARITY_DATABASE.CLARITY_DATABASE like '%HCCLGA%' then 'GA'
+else 'Contact BO Developers' end,
+  LISTAGG_DTL_INFO.CODE_LIST,
+  LISTAGG_HDR_INFO.CODE_LIST,
+  CLD.BILLED_AMT
+--END--
+SELECT DISTINCT
+  EOB_CODE.MNEMONIC,
+  EOB_CODE.EOB_CODE_NAME
+FROM
+  CLARITY_EOB_CODE  EOB_CODE
+WHERE
+  EOB_CODE.CODE_TYPE_C  =  3
+;
+
+-- large-sql-with-issue-265.txt
+with cross_items as
+(select i_item_sk ss_item_sk
+from item,
+(select iss.i_brand_id brand_id
+,iss.i_class_id class_id
+,iss.i_category_id category_id
+from store_sales
+,item iss
+,date_dim d1
+where ss_item_sk = iss.i_item_sk
+and ss_sold_date_sk = d1.d_date_sk
+and d1.d_year between 1999 AND 1999 + 2
+intersect
+select ics.i_brand_id
+,ics.i_class_id
+,ics.i_category_id
+from catalog_sales
+,item ics
+,date_dim d2
+where cs_item_sk = ics.i_item_sk
+and cs_sold_date_sk = d2.d_date_sk
+and d2.d_year between 1999 AND 1999 + 2
+intersect
+select iws.i_brand_id
+,iws.i_class_id
+,iws.i_category_id
+from web_sales
+,item iws
+,date_dim d3
+where ws_item_sk = iws.i_item_sk
+and ws_sold_date_sk = d3.d_date_sk
+and d3.d_year between 1999 AND 1999 + 2) x
+where i_brand_id = brand_id
+and i_class_id = class_id
+and i_category_id = category_id
+),
+avg_sales as
+(select avg(quantitylist_price) average_sales
+from (select ss_quantity quantity
+,ss_list_price list_price
+from store_sales
+,date_dim
+where ss_sold_date_sk = d_date_sk
+and d_year between 1999 and 2001
+union all
+select cs_quantity quantity
+,cs_list_price list_price
+from catalog_sales
+,date_dim
+where cs_sold_date_sk = d_date_sk
+and d_year between 1998 and 1998 + 2
+union all
+select ws_quantity quantity
+,ws_list_price list_price
+from web_sales
+,date_dim
+where ws_sold_date_sk = d_date_sk
+and d_year between 1998 and 1998 + 2) x)
+select channel, i_brand_id,i_class_id,i_category_id,sum(sales), sum(number_sales)
+from(
+select 'store' channel, i_brand_id,i_class_id
+,i_category_id,sum(ss_quantityss_list_price) sales
+, count() number_sales
+from store_sales
+,item
+,date_dim
+where ss_item_sk in (select ss_item_sk from cross_items)
+and ss_item_sk = i_item_sk
+and ss_sold_date_sk = d_date_sk
+and d_year = 1998+2
+and d_moy = 11
+group by i_brand_id,i_class_id,i_category_id
+having sum(ss_quantityss_list_price) > (select average_sales from avg_sales)
+union all
+select 'catalog' channel, i_brand_id,i_class_id,i_category_id, sum(cs_quantitycs_list_price) sales, count() number_sales
+from catalog_sales
+,item
+,date_dim
+where cs_item_sk in (select ss_item_sk from cross_items)
+and cs_item_sk = i_item_sk
+and cs_sold_date_sk = d_date_sk
+and d_year = 1998+2
+and d_moy = 11
+group by i_brand_id,i_class_id,i_category_id
+having sum(cs_quantitycs_list_price) > (select average_sales from avg_sales)
+union all
+select 'web' channel, i_brand_id,i_class_id,i_category_id, sum(ws_quantityws_list_price) sales , count() number_sales
+from web_sales
+,item
+,date_dim
+where ws_item_sk in (select ss_item_sk from cross_items)
+and ws_item_sk = i_item_sk
+and ws_sold_date_sk = d_date_sk
+and d_year = 1998+2
+and d_moy = 11
+group by i_brand_id,i_class_id,i_category_id
+having sum(ws_quantityws_list_price) > (select average_sales from avg_sales)
+) y
+group by rollup (channel, i_brand_id,i_class_id,i_category_id)
+order by channel,i_brand_id,i_class_id,i_category_id
+limit 100;
+with cross_items as
+(select i_item_sk ss_item_sk
+from item,
+(select iss.i_brand_id brand_id
+,iss.i_class_id class_id
+,iss.i_category_id category_id
+from store_sales
+,item iss
+,date_dim d1
+where ss_item_sk = iss.i_item_sk
+and ss_sold_date_sk = d1.d_date_sk
+and d1.d_year between 1999 AND 1999 + 2
+intersect
+select ics.i_brand_id
+,ics.i_class_id
+,ics.i_category_id
+from catalog_sales
+,item ics
+,date_dim d2
+where cs_item_sk = ics.i_item_sk
+and cs_sold_date_sk = d2.d_date_sk
+and d2.d_year between 1999 AND 1999 + 2
+intersect
+select iws.i_brand_id
+,iws.i_class_id
+,iws.i_category_id
+from web_sales
+,item iws
+,date_dim d3
+where ws_item_sk = iws.i_item_sk
+and ws_sold_date_sk = d3.d_date_sk
+and d3.d_year between 1999 AND 1999 + 2) x
+where i_brand_id = brand_id
+and i_class_id = class_id
+and i_category_id = category_id
+),
+avg_sales as
+(select avg(quantitylist_price) average_sales
+from (select ss_quantity quantity
+,ss_list_price list_price
+from store_sales
+,date_dim
+where ss_sold_date_sk = d_date_sk
+and d_year between 1998 and 1998 + 2
+union all
+select cs_quantity quantity
+,cs_list_price list_price
+from catalog_sales
+,date_dim
+where cs_sold_date_sk = d_date_sk
+and d_year between 1998 and 1998 + 2
+union all
+select ws_quantity quantity
+,ws_list_price list_price
+from web_sales
+,date_dim
+where ws_sold_date_sk = d_date_sk
+and d_year between 1998 and 1998 + 2) x)
+select * from
+(select 'store' channel, i_brand_id,i_class_id,i_category_id
+,sum(ss_quantityss_list_price) sales, count() number_sales
+from store_sales
+,item
+,date_dim
+where ss_item_sk in (select ss_item_sk from cross_items)
+and ss_item_sk = i_item_sk
+and ss_sold_date_sk = d_date_sk
+and d_week_seq = (select d_week_seq
+from date_dim
+where d_year = 1998 + 1
+and d_moy = 12
+and d_dom = 16)
+group by i_brand_id,i_class_id,i_category_id
+having sum(ss_quantityss_list_price) > (select average_sales from avg_sales)) this_year,
+(select 'store' channel, i_brand_id,i_class_id
+,i_category_id, sum(ss_quantityss_list_price) sales, count() number_sales
+from store_sales
+,item
+,date_dim
+where ss_item_sk in (select ss_item_sk from cross_items)
+and ss_item_sk = i_item_sk
+and ss_sold_date_sk = d_date_sk
+and d_week_seq = (select d_week_seq
+from date_dim
+where d_year = 1998
+and d_moy = 12
+and d_dom = 16)
+group by i_brand_id,i_class_id,i_category_id
+having sum(ss_quantity*ss_list_price) > (select average_sales from avg_sales)) last_year
+where this_year.i_brand_id= last_year.i_brand_id
+and this_year.i_class_id = last_year.i_class_id
+and this_year.i_category_id = last_year.i_category_id
+order by this_year.channel, this_year.i_brand_id, this_year.i_class_id, this_year.i_category_id
+limit 100;
+
+
+-- performanceIssue1397.sql
+SELECT "TABLE1"."LABEL" ,
+  (CASE WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 005 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 2021 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 000 - Alternative Capacitor Devices', 'Registration Q4 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 006 - Alternative Capacitor Devices - Stuff Sample')) THEN 'Alternative Capacitor Devices' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Entry Alt Propane', 'Registration Q2 001 - Entry Alt Propane', 'Registration Q2 002 - Entry Alt Propane', 'Registration Q4 000 - Entry Alt Propane', 'Registration Q4 001 - Entry Alt Propane', 'Registration Q4 002 - Entry Alt Propane', 'Registration Q4 005 - Camper Yeah - Entry Alt')) THEN 'Entry Alt Propane' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Entry Amps', 'Registration Q2 000 - Entry Amps', 'Registration Q2 001 - Entry Amps', 'Registration Q2 002 - Entry Amps', 'Registration Q2 005 - Entry Amps', 'Registration Q4 000 - Entry Amps', 'Registration Q4 001 - Entry Amps', 'Registration Q4 002 - Entry Amps', 'Registration Q4 005 - Entry Amps', 'Registration Q4 006 - Entry Amps')) THEN 'Entry Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Fullsize Amp Alt', 'Registration Q2 001 - Fullsize Amp Alt', 'Registration Q2 002 - Fullsize Amp Alt', 'Registration Q2 005 - Fullsize Amp Alt', 'Registration Q2 2021 - Fullsize Amp Alt', 'Registration Q4 000 - Fullsize Amp Alt', 'Registration Q4 001 - Fullsize Amp Alt', 'Registration Q4 002 - Fullsize Amp Alt', 'Registration Q4 005 - Fullsize Amp Alt', 'Registration Q4 006 - Fullsize Amp Alt')) THEN 'Fullsize Amp Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Purple Device Makes - 450 Ratings', 'Registration Q2 000 - Purple Device Makes - 450 Ratings', 'Registration Q2 001 - Purple Device Makes - 450 Ratings', 'Registration Q2 002 - Purple Device Makes - 450 Ratings', 'Registration Q2 005 - Purple Device Makes - 450 Ratings', 'Registration Q2 2021 - Purple Device Makes - 450 Ratings', 'Registration Q4 000 - Purple Device Makes - 450 Ratings', 'Registration Q4 001 - Purple Device Makes - 450 Ratings', 'Registration Q4 002 - Purple Device Makes - 450 Ratings', 'Registration Q4 005 - Purple Device Makes - 450 Ratings', 'Registration Q4 006 - Purple Device Makes - 450 Ratings')) THEN 'Purple Device Makes' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 001 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 002 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q4 000 - Purple Device Makes Non-Waterproof - Any-American')) THEN 'Purple Device Makes Non-Waterproof - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Waterproof Speakers', 'Registration Q2 001 - Waterproof Speakers', 'Registration Q2 002 - Waterproof Speakers', 'Registration Q2 005 - Waterproof Speakers', 'Registration Q2 2021 - Waterproof Speakers', 'Registration Q4 000 - Waterproof Speakers', 'Registration Q4 001 - Waterproof Speakers', 'Registration Q4 002 - Waterproof Speakers', 'Registration Q4 005 - Waterproof Speakers', 'Registration Q4 006 - Waterproof Speakers')) THEN 'Waterproof Speakers' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Waterproof Makes - 450 Ratings', 'Registration Q2 001 - Waterproof Makes - 450 Ratings', 'Registration Q2 002 - Waterproof Makes - 450 Ratings', 'Registration Q2 005 - Waterproof Makes - 450 Ratings', 'Registration Q2 2021 - Waterproof Makes - 450 Ratings', 'Registration Q4 000 - Waterproof Makes - 450 Ratings', 'Registration Q4 001 - Waterproof Makes - 450 Ratings', 'Registration Q4 002 - Waterproof Makes - 450 Ratings', 'Registration Q4 005 - Waterproof Makes - 450 Ratings', 'Registration Q4 006 - Waterproof Makes - 450 Ratings')) THEN 'Waterproof Makes' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Waterproof Propane Redsize', 'Registration Q2 002 - Waterproof Propane Redsize', 'Registration Q2 005 - Waterproof Propane Redsize', 'Registration Q2 2021 - Waterproof Propane Redsize', 'Registration Q4 001 - Waterproof Propane Redsize', 'Registration Q4 002 - Waterproof Propane Redsize', 'Registration Q4 005 - Waterproof Propane Redsize', 'Registration Q4 006 - Waterproof Propane Redsize')) THEN 'Waterproof Propane Redsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Waterproof Propane Small', 'Registration Q2 002 - Waterproof Propane Small', 'Registration Q2 005 - Waterproof Propane Small', 'Registration Q4 001 - Waterproof Propane Small', 'Registration Q4 002 - Waterproof Propane Small', 'Registration Q4 005 - Waterproof Propane Small', 'Registration Q4 006 - Waterproof Propane Small')) THEN 'Waterproof Propane Small' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Red-Junk - Waterproof', 'Registration Q2 001 - Red-Junk - Waterproof', 'Registration Q2 002 - Red-Junk - Waterproof', 'Registration Q2 005 - Red-Junk - Waterproof', 'Registration Q2 2021 - Red-Junk - Waterproof', 'Registration Q4 000 - Red-Junk - Waterproof', 'Registration Q4 001 - Red-Junk - Waterproof', 'Registration Q4 002 - Red-Junk - Waterproof', 'Registration Q4 005 - Red-Junk - Waterproof', 'Registration Q4 006 - Red-Junk - Waterproof')) THEN 'Red-Junk Waterproof' WHEN ("TABLE1"."DESCRIPTION" = 'Registration Q2 2021 - Redsize Amps') THEN 'Redsize Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Near-Entry Waterproof', 'Registration Q2 001 - Near-Entry Waterproof', 'Registration Q2 002 - Near-Entry Waterproof', 'Registration Q2 005 - Near-Entry Waterproof', 'Registration Q2 2021 - Near-Entry Waterproof', 'Registration Q4 000 - Near-Entry Waterproof', 'Registration Q4 001 - Near-Entry Waterproof', 'Registration Q4 002 - Near-Entry Waterproof', 'Registration Q4 005 - Near-Entry Waterproof', 'Registration Q4 006 - Near-Entry Waterproof')) THEN 'Near-Entry Waterproof' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Smooth', 'Registration Q2 001 - Home Theaters - Smooth', 'Registration Q2 002 - Home Theaters - Smooth', 'Registration Q2 005 - Home Theaters - Smooth', 'Registration Q2 2021 - Home Theaters - Smooth', 'Registration Q4 000 - Home Theaters - Smooth', 'Registration Q4 001 - Home Theaters - Smooth', 'Registration Q4 002 - Home Theaters - Smooth', 'Registration Q4 005 - Home Theaters - Smooth', 'Registration Q4 006 - Home Theaters - Smooth')) THEN 'Home Theaters - Smooth' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Fullsize', 'Registration Q2 001 - Home Theaters - Fullsize', 'Registration Q2 002 - Home Theaters - Fullsize', 'Registration Q2 005 - Home Theaters - Fullsize', 'Registration Q2 2021 - Home Theaters - Fullsize', 'Registration Q4 000 - Home Theaters - Fullsize', 'Registration Q4 001 - Home Theaters - Fullsize', 'Registration Q4 002 - Home Theaters - Fullsize', 'Registration Q4 005 - Home Theaters - Fullsize', 'Registration Q4 006 - Home Theaters - Fullsize')) THEN 'Home Theaters - Fullsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Fullsize - Half Full', 'Registration Q2 001 - Home Theaters - Fullsize - Half Full', 'Registration Q2 002 - Home Theaters - Fullsize - Half Full', 'Registration Q2 005 - Home Theaters - Fullsize - Half Full', 'Registration Q2 2021 - Home Theaters - Fullsize - Half Full', 'Registration Q4 000 - Home Theaters - Fullsize - Half Full', 'Registration Q4 001 - Home Theaters - Fullsize - Half Full', 'Registration Q4 002 - Home Theaters - Fullsize - Half Full', 'Registration Q4 005 - Home Theaters - Fullsize - Half Full')) THEN 'Home Theaters - Fullsize - Half Full' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Small Amps', 'Registration Q1 001 - Small Amps', 'Registration Q1 002 - Small Amps', 'Registration Q1 005 - Small Amps', 'Registration Q1 006 - Small Amps', 'Registration Q1 2021 - Small Amps', 'Registration Q2 000 - Small Amps', 'Registration Q2 001 - Small Amps', 'Registration Q2 002 - Small Amps', 'Registration Q2 005 - Small Amps', 'Registration Q2 2021 - Small Amps', 'Registration Q3 000 - Small Amps', 'Registration Q3 001 - Small Amps', 'Registration Q3 002 - Small Amps', 'Registration Q3 006 - Small Amps', 'Registration Q4 000 - Small Amps', 'Registration Q4 001 - Small Amps', 'Registration Q4 002 - Small Amps', 'Registration Q4 005 - Small Amps', 'Registration Q4 006 - Small Amps')) THEN 'Small Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Small-Entry Amps - Any-American', 'Registration Q2 001 - Small-Entry Amps - Any-American', 'Registration Q2 002 - Small-Entry Amps - Any-American', 'Registration Q4 000 - Small-Entry Amps - Any-American')) THEN 'Small-Entry Amps - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 005 - Camper Yeah - Entry Alt', 'Registration Q4 006 - Camper Yeah - Entry Alt')) THEN 'Camper Yeah - Entry Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 2021 - Camper Yeah - Fullsize', 'Registration Q4 006 - Camper Yeah - Fullsize')) THEN 'Camper Yeah - Fullsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Redsize', 'Registration Q2 001 - Camper Yeah - Redsize', 'Registration Q2 002 - Camper Yeah - Redsize', 'Registration Q2 005 - Camper Yeah - Redsize', 'Registration Q2 2021 - Camper Yeah - Redsize', 'Registration Q4 000 - Camper Yeah - Redsize', 'Registration Q4 001 - Camper Yeah - Redsize', 'Registration Q4 002 - Camper Yeah - Redsize', 'Registration Q4 005 - Camper Yeah - Redsize', 'Registration Q4 006 - Camper Yeah - Redsize')) THEN 'Camper Yeah - Redsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Camper Yeah - Small', 'Registration Q1 001 - Camper Yeah - Small', 'Registration Q1 002 - Camper Yeah - Small', 'Registration Q1 005 - Camper Yeah - Small', 'Registration Q1 006 - Camper Yeah - Small', 'Registration Q1 2021 - Camper Yeah - Small', 'Registration Q2 000 - Camper Yeah - Small', 'Registration Q2 001 - Camper Yeah - Small', 'Registration Q2 002 - Camper Yeah - Small', 'Registration Q2 005 - Camper Yeah - Small', 'Registration Q2 2021 - Camper Yeah - Small', 'Registration Q3 000 - Camper Yeah - Small', 'Registration Q3 001 - Camper Yeah - Small', 'Registration Q3 002 - Camper Yeah - Small', 'Registration Q3 006 - Camper Yeah - Small', 'Registration Q4 000 - Camper Yeah - Small', 'Registration Q4 001 - Camper Yeah - Small', 'Registration Q4 002 - Camper Yeah - Small', 'Registration Q4 005 - Camper Yeah - Small', 'Registration Q4 006 - Camper Yeah - Small')) THEN 'Camper Yeah - Small' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Small - Any-American', 'Registration Q2 001 - Camper Yeah - Small - Any-American', 'Registration Q2 002 - Camper Yeah - Small - Any-American', 'Registration Q4 000 - Camper Yeah - Small - Any-American')) THEN 'Camper Yeah - Small - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Premium Redsize Alt', 'Registration Q4 000 - Camper Yeah - Premium Redsize Alt')) THEN 'Camper Yeah Premium Redsize Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 002 - Camper Wagon', 'Registration Q2 005 - Camper Wagon', 'Registration Q2 2021 - Camper Wagon', 'Registration Q4 002 - Camper Wagon', 'Registration Q4 005 - Camper Wagon', 'Registration Q4 006 - Camper Wagon')) THEN 'Camper Wagon' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 005 - Campers Amps', 'Registration Q2 2021 - Campers Amps', 'Registration Q4 005 - Campers Amps', 'Registration Q4 006 - Campers Amps')) THEN 'Campers Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Campery', 'Registration Q2 001 - Campery', 'Registration Q2 002 - Campery', 'Registration Q2 005 - Campery', 'Registration Q2 2021 - Campery', 'Registration Q4 000 - Campery', 'Registration Q4 001 - Campery', 'Registration Q4 002 - Campery', 'Registration Q4 005 - Campery', 'Registration Q4 006 - Campery')) THEN 'Campery' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Upper Reddle Alt', 'Registration Q1 001 - Upper Reddle Alt', 'Registration Q1 002 - Upper Reddle Alt', 'Registration Q1 005 - Upper Reddle Alt', 'Registration Q1 006 - Upper Reddle Alt', 'Registration Q1 2021 - Upper Reddle Alt', 'Registration Q2 000 - Upper Reddle Alt', 'Registration Q2 001 - Upper Reddle Alt', 'Registration Q2 002 - Upper Reddle Alt', 'Registration Q2 005 - Upper Reddle Alt', 'Registration Q3 000 - Upper Reddle Alt', 'Registration Q3 001 - Upper Reddle Alt', 'Registration Q3 002 - Upper Reddle Alt', 'Registration Q3 006 - Upper Reddle Alt', 'Registration Q4 000 - Upper Reddle Alt', 'Registration Q4 001 - Upper Reddle Alt', 'Registration Q4 002 - Upper Reddle Alt', 'Registration Q4 005 - Upper Reddle Alt', 'Registration Q4 006 - Upper Reddle Alt')) THEN 'Upper Reddle Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Upper Reddle Alt - Any-American', 'Registration Q2 001 - Upper Reddle Alt - Any-American', 'Registration Q2 002 - Upper Reddle Alt - Any-American', 'Registration Q4 000 - Upper Reddle Alt - Any-American')) THEN 'Upper Reddle Alt - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Fires - Smooth', 'Registration Q2 001 - Fires - Smooth', 'Registration Q2 002 - Fires - Smooth', 'Registration Q2 005 - Fires - Smooth', 'Registration Q2 2021 - Fires - Smooth', 'Registration Q4 000 - Fires - Smooth', 'Registration Q4 001 - Fires - Smooth', 'Registration Q4 002 - Fires - Smooth', 'Registration Q4 005 - Fires - Smooth', 'Registration Q4 006 - Fires - Smooth')) THEN 'Fires - Smooth' ELSE "TABLE1"."DESCRIPTION" END) AS "SEGMENT",
+  (CASE WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Entry Amps', 'Registration Q1 000 - Purple Device Makes - 450 Ratings', 'Registration Q1 000 - Small Amps', 'Registration Q1 000 - Camper Yeah - Small', 'Registration Q1 000 - Upper Reddle Alt')) THEN '000 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Entry Alt Propane', 'Registration Q2 000 - Entry Amps', 'Registration Q2 000 - Fullsize Amp Alt', 'Registration Q2 000 - Purple Device Makes - 450 Ratings', 'Registration Q2 000 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 000 - Waterproof Speakers', 'Registration Q2 000 - Waterproof Makes - 450 Ratings', 'Registration Q2 000 - Red-Junk - Waterproof', 'Registration Q2 000 - Near-Entry Waterproof', 'Registration Q2 000 - Home Theaters - Smooth', 'Registration Q2 000 - Home Theaters - Fullsize', 'Registration Q2 000 - Home Theaters - Fullsize - Half Full', 'Registration Q2 000 - Small Amps', 'Registration Q2 000 - Small-Entry Amps - Any-American', 'Registration Q2 000 - Camper Yeah - Redsize', 'Registration Q2 000 - Camper Yeah - Premium Redsize Alt', 'Registration Q2 000 - Camper Yeah - Small', 'Registration Q2 000 - Camper Yeah - Small - Any-American', 'Registration Q2 000 - Campery', 'Registration Q2 000 - Upper Reddle Alt', 'Registration Q2 000 - Upper Reddle Alt - Any-American', 'Registration Q2 000 - Fires - Smooth')) THEN '000 Q2' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q3 000 - Small Amps', 'Registration Q3 000 - Camper Yeah - Small', 'Registration Q3 000 - Upper Reddle Alt')) THEN '000 Q3' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 000 - Alternative Capacitor Devices', 'Registration Q4 000 - Entry Alt Propane', 'Registration Q4 000 - Entry Amps', 'Registration Q4 000 - Fullsize Amp Alt', 'Registration Q4 000 - Purple Device Makes - 450 Ratings', 'Registration Q4 000 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q4 000 - Waterproof Speakers', 'Registration Q4 000 - Waterproof Makes - 450 Ratings', 'Registration Q4 000 - Red-Junk - Waterproof', 'Registration Q4 000 - Near-Entry Waterproof', 'Registration Q4 000 - Home Theaters - Smooth', 'Registration Q4 000 - Home Theaters - Fullsize', 'Registration Q4 000 - Home Theaters - Fullsize - Half Full', 'Registration Q4 000 - Small Amps', 'Registration Q4 000 - Small-Entry Amps - Any-American', 'Registration Q4 000 - Camper Yeah - Redsize', 'Registration Q4 000 - Camper Yeah - Premium Redsize Alt', 'Registration Q4 000 - Camper Yeah - Small', 'Registration Q4 000 - Camper Yeah - Small - Any-American', 'Registration Q4 000 - Campery', 'Registration Q4 000 - Upper Reddle Alt', 'Registration Q4 000 - Upper Reddle Alt - Any-American', 'Registration Q4 000 - Fires - Smooth')) THEN '000 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 001 - Small Amps', 'Registration Q1 001 - Camper Yeah - Small', 'Registration Q1 001 - Upper Reddle Alt')) THEN '001 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 001 - Entry Alt Propane', 'Registration Q2 001 - Entry Amps', 'Registration Q2 001 - Fullsize Amp Alt', 'Registration Q2 001 - Purple Device Makes - 450 Ratings', 'Registration Q2 001 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 001 - Waterproof Speakers', 'Registration Q2 001 - Waterproof Makes - 450 Ratings', 'Registration Q2 001 - Waterproof Propane Redsize', 'Registration Q2 001 - Waterproof Propane Small', 'Registration Q2 001 - Red-Junk - Waterproof', 'Registration Q2 001 - Near-Entry Waterproof', 'Registration Q2 001 - Home Theaters - Smooth', 'Registration Q2 001 - Home Theaters - Fullsize', 'Registration Q2 001 - Home Theaters - Fullsize - Half Full', 'Registration Q2 001 - Small Amps', 'Registration Q2 001 - Small-Entry Amps - Any-American', 'Registration Q2 001 - Camper Yeah - Redsize', 'Registration Q2 001 - Camper Yeah - Small', 'Registration Q2 001 - Camper Yeah - Small - Any-American', 'Registration Q2 001 - Campery', 'Registration Q2 001 - Upper Reddle Alt', 'Registration Q2 001 - Upper Reddle Alt - Any-American', 'Registration Q2 001 - Fires - Smooth')) THEN '001 Q2' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q3 001 - Small Amps', 'Registration Q3 001 - Camper Yeah - Small', 'Registration Q3 001 - Upper Reddle Alt')) THEN '001 Q3' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 001 - Entry Alt Propane', 'Registration Q4 001 - Entry Amps', 'Registration Q4 001 - Fullsize Amp Alt', 'Registration Q4 001 - Purple Device Makes - 450 Ratings', 'Registration Q4 001 - Waterproof Speakers', 'Registration Q4 001 - Waterproof Makes - 450 Ratings', 'Registration Q4 001 - Waterproof Propane Redsize', 'Registration Q4 001 - Waterproof Propane Small', 'Registration Q4 001 - Red-Junk - Waterproof', 'Registration Q4 001 - Near-Entry Waterproof', 'Registration Q4 001 - Home Theaters - Smooth', 'Registration Q4 001 - Home Theaters - Fullsize', 'Registration Q4 001 - Home Theaters - Fullsize - Half Full', 'Registration Q4 001 - Small Amps', 'Registration Q4 001 - Camper Yeah - Redsize', 'Registration Q4 001 - Camper Yeah - Small', 'Registration Q4 001 - Campery', 'Registration Q4 001 - Upper Reddle Alt', 'Registration Q4 001 - Fires - Smooth')) THEN '001 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 002 - Small Amps', 'Registration Q1 002 - Camper Yeah - Small', 'Registration Q1 002 - Upper Reddle Alt')) THEN '002 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 002 - Entry Alt Propane', 'Registration Q2 002 - Entry Amps', 'Registration Q2 002 - Fullsize Amp Alt', 'Registration Q2 002 - Purple Device Makes - 450 Ratings', 'Registration Q2 002 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 002 - Waterproof Speakers', 'Registration Q2 002 - Waterproof Makes - 450 Ratings', 'Registration Q2 002 - Waterproof Propane Redsize', 'Registration Q2 002 - Waterproof Propane Small', 'Registration Q2 002 - Red-Junk - Waterproof', 'Registration Q2 002 - Near-Entry Waterproof', 'Registration Q2 002 - Home Theaters - Smooth', 'Registration Q2 002 - Home Theaters - Fullsize', 'Registration Q2 002 - Home Theaters - Fullsize - Half Full', 'Registration Q2 002 - Small Amps', 'Registration Q2 002 - Small-Entry Amps - Any-American', 'Registration Q2 002 - Camper Yeah - Redsize', 'Registration Q2 002 - Camper Yeah - Small', 'Registration Q2 002 - Camper Yeah - Small - Any-American', 'Registration Q2 002 - Camper Wagon', 'Registration Q2 002 - Campery', 'Registration Q2 002 - Upper Reddle Alt', 'Registration Q2 002 - Upper Reddle Alt - Any-American', 'Registration Q2 002 - Fires - Smooth')) THEN '002 Q2' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q3 002 - Small Amps', 'Registration Q3 002 - Camper Yeah - Small', 'Registration Q3 002 - Upper Reddle Alt')) THEN '002 Q3' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 002 - Entry Alt Propane', 'Registration Q4 002 - Entry Amps', 'Registration Q4 002 - Fullsize Amp Alt', 'Registration Q4 002 - Purple Device Makes - 450 Ratings', 'Registration Q4 002 - Waterproof Speakers', 'Registration Q4 002 - Waterproof Makes - 450 Ratings', 'Registration Q4 002 - Waterproof Propane Redsize', 'Registration Q4 002 - Waterproof Propane Small', 'Registration Q4 002 - Red-Junk - Waterproof', 'Registration Q4 002 - Near-Entry Waterproof', 'Registration Q4 002 - Home Theaters - Smooth', 'Registration Q4 002 - Home Theaters - Fullsize', 'Registration Q4 002 - Home Theaters - Fullsize - Half Full', 'Registration Q4 002 - Small Amps', 'Registration Q4 002 - Camper Yeah - Redsize', 'Registration Q4 002 - Camper Yeah - Small', 'Registration Q4 002 - Camper Wagon', 'Registration Q4 002 - Campery', 'Registration Q4 002 - Upper Reddle Alt', 'Registration Q4 002 - Fires - Smooth')) THEN '002 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 005 - Small Amps', 'Registration Q1 005 - Camper Yeah - Small', 'Registration Q1 005 - Upper Reddle Alt')) THEN '005 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 005 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 005 - Entry Amps', 'Registration Q2 005 - Fullsize Amp Alt', 'Registration Q2 005 - Purple Device Makes - 450 Ratings', 'Registration Q2 005 - Waterproof Speakers', 'Registration Q2 005 - Waterproof Makes - 450 Ratings', 'Registration Q2 005 - Waterproof Propane Redsize', 'Registration Q2 005 - Waterproof Propane Small', 'Registration Q2 005 - Red-Junk - Waterproof', 'Registration Q2 005 - Near-Entry Waterproof', 'Registration Q2 005 - Home Theaters - Smooth', 'Registration Q2 005 - Home Theaters - Fullsize', 'Registration Q2 005 - Home Theaters - Fullsize - Half Full', 'Registration Q2 005 - Small Amps', 'Registration Q2 005 - Camper Yeah - Entry Alt', 'Registration Q2 005 - Camper Yeah - Redsize', 'Registration Q2 005 - Camper Yeah - Small', 'Registration Q2 005 - Camper Wagon', 'Registration Q2 005 - Campers Amps', 'Registration Q2 005 - Campery', 'Registration Q2 005 - Upper Reddle Alt', 'Registration Q2 005 - Fires - Smooth')) THEN '005 Q2' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 005 - Entry Amps', 'Registration Q4 005 - Fullsize Amp Alt', 'Registration Q4 005 - Purple Device Makes - 450 Ratings', 'Registration Q4 005 - Waterproof Speakers', 'Registration Q4 005 - Waterproof Makes - 450 Ratings', 'Registration Q4 005 - Waterproof Propane Redsize', 'Registration Q4 005 - Waterproof Propane Small', 'Registration Q4 005 - Red-Junk - Waterproof', 'Registration Q4 005 - Near-Entry Waterproof', 'Registration Q4 005 - Home Theaters - Smooth', 'Registration Q4 005 - Home Theaters - Fullsize', 'Registration Q4 005 - Home Theaters - Fullsize - Half Full', 'Registration Q4 005 - Small Amps', 'Registration Q4 005 - Camper Yeah - Entry Alt', 'Registration Q4 005 - Camper Yeah - Redsize', 'Registration Q4 005 - Camper Yeah - Small', 'Registration Q4 005 - Camper Wagon', 'Registration Q4 005 - Campers Amps', 'Registration Q4 005 - Campery', 'Registration Q4 005 - Upper Reddle Alt', 'Registration Q4 005 - Fires - Smooth')) THEN '005 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 006 - Small Amps', 'Registration Q1 006 - Camper Yeah - Small', 'Registration Q1 006 - Upper Reddle Alt')) THEN '006 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q3 006 - Small Amps', 'Registration Q3 006 - Camper Yeah - Small', 'Registration Q3 006 - Upper Reddle Alt')) THEN '006 Q3' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 006 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 006 - Entry Amps', 'Registration Q4 006 - Fullsize Amp Alt', 'Registration Q4 006 - Purple Device Makes - 450 Ratings', 'Registration Q4 006 - Waterproof Speakers', 'Registration Q4 006 - Waterproof Makes - 450 Ratings', 'Registration Q4 006 - Waterproof Propane Redsize', 'Registration Q4 006 - Waterproof Propane Small', 'Registration Q4 006 - Red-Junk - Waterproof', 'Registration Q4 006 - Near-Entry Waterproof', 'Registration Q4 006 - Home Theaters - Smooth', 'Registration Q4 006 - Home Theaters - Fullsize', 'Registration Q4 006 - Small Amps', 'Registration Q4 006 - Camper Yeah - Entry Alt', 'Registration Q4 006 - Camper Yeah - Fullsize', 'Registration Q4 006 - Camper Yeah - Redsize', 'Registration Q4 006 - Camper Yeah - Small', 'Registration Q4 006 - Camper Wagon', 'Registration Q4 006 - Campers Amps', 'Registration Q4 006 - Campery', 'Registration Q4 006 - Upper Reddle Alt', 'Registration Q4 006 - Fires - Smooth')) THEN '006 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 2021 - Small Amps', 'Registration Q1 2021 - Camper Yeah - Small', 'Registration Q1 2021 - Upper Reddle Alt')) THEN '2021 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 2021 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 2021 - Fullsize Amp Alt', 'Registration Q2 2021 - Purple Device Makes - 450 Ratings', 'Registration Q2 2021 - Waterproof Speakers', 'Registration Q2 2021 - Waterproof Makes - 450 Ratings', 'Registration Q2 2021 - Waterproof Propane Redsize', 'Registration Q2 2021 - Red-Junk - Waterproof', 'Registration Q2 2021 - Redsize Amps', 'Registration Q2 2021 - Near-Entry Waterproof', 'Registration Q2 2021 - Home Theaters - Smooth', 'Registration Q2 2021 - Home Theaters - Fullsize', 'Registration Q2 2021 - Home Theaters - Fullsize - Half Full', 'Registration Q2 2021 - Small Amps', 'Registration Q2 2021 - Camper Yeah - Fullsize', 'Registration Q2 2021 - Camper Yeah - Redsize', 'Registration Q2 2021 - Camper Yeah - Small', 'Registration Q2 2021 - Camper Wagon', 'Registration Q2 2021 - Campers Amps', 'Registration Q2 2021 - Campery', 'Registration Q2 2021 - Fires - Smooth')) THEN '2021 Q2' ELSE "TABLE1"."DESCRIPTION" END) AS "Study_Quarter/Year",
+  COUNT(DISTINCT "TABLE2"."ID") AS "ctd:ID:ok"
+FROM "SCHEMA1"."TABLE2" "TABLE2"
+  INNER JOIN "SCHEMA1"."TABLE1" "TABLE1" ON ("TABLE2"."ID" = "TABLE1"."ID")
+WHERE (((CASE WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 005 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 2021 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 000 - Alternative Capacitor Devices', 'Registration Q4 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 006 - Alternative Capacitor Devices - Stuff Sample')) THEN 'Alternative Capacitor Devices' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Entry Alt Propane', 'Registration Q2 001 - Entry Alt Propane', 'Registration Q2 002 - Entry Alt Propane', 'Registration Q4 000 - Entry Alt Propane', 'Registration Q4 001 - Entry Alt Propane', 'Registration Q4 002 - Entry Alt Propane', 'Registration Q4 005 - Camper Yeah - Entry Alt')) THEN 'Entry Alt Propane' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Entry Amps', 'Registration Q2 000 - Entry Amps', 'Registration Q2 001 - Entry Amps', 'Registration Q2 002 - Entry Amps', 'Registration Q2 005 - Entry Amps', 'Registration Q4 000 - Entry Amps', 'Registration Q4 001 - Entry Amps', 'Registration Q4 002 - Entry Amps', 'Registration Q4 005 - Entry Amps', 'Registration Q4 006 - Entry Amps')) THEN 'Entry Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Fullsize Amp Alt', 'Registration Q2 001 - Fullsize Amp Alt', 'Registration Q2 002 - Fullsize Amp Alt', 'Registration Q2 005 - Fullsize Amp Alt', 'Registration Q2 2021 - Fullsize Amp Alt', 'Registration Q4 000 - Fullsize Amp Alt', 'Registration Q4 001 - Fullsize Amp Alt', 'Registration Q4 002 - Fullsize Amp Alt', 'Registration Q4 005 - Fullsize Amp Alt', 'Registration Q4 006 - Fullsize Amp Alt')) THEN 'Fullsize Amp Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Purple Device Makes - 450 Ratings', 'Registration Q2 000 - Purple Device Makes - 450 Ratings', 'Registration Q2 001 - Purple Device Makes - 450 Ratings', 'Registration Q2 002 - Purple Device Makes - 450 Ratings', 'Registration Q2 005 - Purple Device Makes - 450 Ratings', 'Registration Q2 2021 - Purple Device Makes - 450 Ratings', 'Registration Q4 000 - Purple Device Makes - 450 Ratings', 'Registration Q4 001 - Purple Device Makes - 450 Ratings', 'Registration Q4 002 - Purple Device Makes - 450 Ratings', 'Registration Q4 005 - Purple Device Makes - 450 Ratings', 'Registration Q4 006 - Purple Device Makes - 450 Ratings')) THEN 'Purple Device Makes' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 001 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 002 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q4 000 - Purple Device Makes Non-Waterproof - Any-American')) THEN 'Purple Device Makes Non-Waterproof - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Waterproof Speakers', 'Registration Q2 001 - Waterproof Speakers', 'Registration Q2 002 - Waterproof Speakers', 'Registration Q2 005 - Waterproof Speakers', 'Registration Q2 2021 - Waterproof Speakers', 'Registration Q4 000 - Waterproof Speakers', 'Registration Q4 001 - Waterproof Speakers', 'Registration Q4 002 - Waterproof Speakers', 'Registration Q4 005 - Waterproof Speakers', 'Registration Q4 006 - Waterproof Speakers')) THEN 'Waterproof Speakers' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Waterproof Makes - 450 Ratings', 'Registration Q2 001 - Waterproof Makes - 450 Ratings', 'Registration Q2 002 - Waterproof Makes - 450 Ratings', 'Registration Q2 005 - Waterproof Makes - 450 Ratings', 'Registration Q2 2021 - Waterproof Makes - 450 Ratings', 'Registration Q4 000 - Waterproof Makes - 450 Ratings', 'Registration Q4 001 - Waterproof Makes - 450 Ratings', 'Registration Q4 002 - Waterproof Makes - 450 Ratings', 'Registration Q4 005 - Waterproof Makes - 450 Ratings', 'Registration Q4 006 - Waterproof Makes - 450 Ratings')) THEN 'Waterproof Makes' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Waterproof Propane Redsize', 'Registration Q2 002 - Waterproof Propane Redsize', 'Registration Q2 005 - Waterproof Propane Redsize', 'Registration Q2 2021 - Waterproof Propane Redsize', 'Registration Q4 001 - Waterproof Propane Redsize', 'Registration Q4 002 - Waterproof Propane Redsize', 'Registration Q4 005 - Waterproof Propane Redsize', 'Registration Q4 006 - Waterproof Propane Redsize')) THEN 'Waterproof Propane Redsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Waterproof Propane Small', 'Registration Q2 002 - Waterproof Propane Small', 'Registration Q2 005 - Waterproof Propane Small', 'Registration Q4 001 - Waterproof Propane Small', 'Registration Q4 002 - Waterproof Propane Small', 'Registration Q4 005 - Waterproof Propane Small', 'Registration Q4 006 - Waterproof Propane Small')) THEN 'Waterproof Propane Small' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Red-Junk - Waterproof', 'Registration Q2 001 - Red-Junk - Waterproof', 'Registration Q2 002 - Red-Junk - Waterproof', 'Registration Q2 005 - Red-Junk - Waterproof', 'Registration Q2 2021 - Red-Junk - Waterproof', 'Registration Q4 000 - Red-Junk - Waterproof', 'Registration Q4 001 - Red-Junk - Waterproof', 'Registration Q4 002 - Red-Junk - Waterproof', 'Registration Q4 005 - Red-Junk - Waterproof', 'Registration Q4 006 - Red-Junk - Waterproof')) THEN 'Red-Junk Waterproof' WHEN ("TABLE1"."DESCRIPTION" = 'Registration Q2 2021 - Redsize Amps') THEN 'Redsize Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Near-Entry Waterproof', 'Registration Q2 001 - Near-Entry Waterproof', 'Registration Q2 002 - Near-Entry Waterproof', 'Registration Q2 005 - Near-Entry Waterproof', 'Registration Q2 2021 - Near-Entry Waterproof', 'Registration Q4 000 - Near-Entry Waterproof', 'Registration Q4 001 - Near-Entry Waterproof', 'Registration Q4 002 - Near-Entry Waterproof', 'Registration Q4 005 - Near-Entry Waterproof', 'Registration Q4 006 - Near-Entry Waterproof')) THEN 'Near-Entry Waterproof' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Smooth', 'Registration Q2 001 - Home Theaters - Smooth', 'Registration Q2 002 - Home Theaters - Smooth', 'Registration Q2 005 - Home Theaters - Smooth', 'Registration Q2 2021 - Home Theaters - Smooth', 'Registration Q4 000 - Home Theaters - Smooth', 'Registration Q4 001 - Home Theaters - Smooth', 'Registration Q4 002 - Home Theaters - Smooth', 'Registration Q4 005 - Home Theaters - Smooth', 'Registration Q4 006 - Home Theaters - Smooth')) THEN 'Home Theaters - Smooth' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Fullsize', 'Registration Q2 001 - Home Theaters - Fullsize', 'Registration Q2 002 - Home Theaters - Fullsize', 'Registration Q2 005 - Home Theaters - Fullsize', 'Registration Q2 2021 - Home Theaters - Fullsize', 'Registration Q4 000 - Home Theaters - Fullsize', 'Registration Q4 001 - Home Theaters - Fullsize', 'Registration Q4 002 - Home Theaters - Fullsize', 'Registration Q4 005 - Home Theaters - Fullsize', 'Registration Q4 006 - Home Theaters - Fullsize')) THEN 'Home Theaters - Fullsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Fullsize - Half Full', 'Registration Q2 001 - Home Theaters - Fullsize - Half Full', 'Registration Q2 002 - Home Theaters - Fullsize - Half Full', 'Registration Q2 005 - Home Theaters - Fullsize - Half Full', 'Registration Q2 2021 - Home Theaters - Fullsize - Half Full', 'Registration Q4 000 - Home Theaters - Fullsize - Half Full', 'Registration Q4 001 - Home Theaters - Fullsize - Half Full', 'Registration Q4 002 - Home Theaters - Fullsize - Half Full', 'Registration Q4 005 - Home Theaters - Fullsize - Half Full')) THEN 'Home Theaters - Fullsize - Half Full' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Small Amps', 'Registration Q1 001 - Small Amps', 'Registration Q1 002 - Small Amps', 'Registration Q1 005 - Small Amps', 'Registration Q1 006 - Small Amps', 'Registration Q1 2021 - Small Amps', 'Registration Q2 000 - Small Amps', 'Registration Q2 001 - Small Amps', 'Registration Q2 002 - Small Amps', 'Registration Q2 005 - Small Amps', 'Registration Q2 2021 - Small Amps', 'Registration Q3 000 - Small Amps', 'Registration Q3 001 - Small Amps', 'Registration Q3 002 - Small Amps', 'Registration Q3 006 - Small Amps', 'Registration Q4 000 - Small Amps', 'Registration Q4 001 - Small Amps', 'Registration Q4 002 - Small Amps', 'Registration Q4 005 - Small Amps', 'Registration Q4 006 - Small Amps')) THEN 'Small Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Small-Entry Amps - Any-American', 'Registration Q2 001 - Small-Entry Amps - Any-American', 'Registration Q2 002 - Small-Entry Amps - Any-American', 'Registration Q4 000 - Small-Entry Amps - Any-American')) THEN 'Small-Entry Amps - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 005 - Camper Yeah - Entry Alt', 'Registration Q4 006 - Camper Yeah - Entry Alt')) THEN 'Camper Yeah - Entry Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 2021 - Camper Yeah - Fullsize', 'Registration Q4 006 - Camper Yeah - Fullsize')) THEN 'Camper Yeah - Fullsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Redsize', 'Registration Q2 001 - Camper Yeah - Redsize', 'Registration Q2 002 - Camper Yeah - Redsize', 'Registration Q2 005 - Camper Yeah - Redsize', 'Registration Q2 2021 - Camper Yeah - Redsize', 'Registration Q4 000 - Camper Yeah - Redsize', 'Registration Q4 001 - Camper Yeah - Redsize', 'Registration Q4 002 - Camper Yeah - Redsize', 'Registration Q4 005 - Camper Yeah - Redsize', 'Registration Q4 006 - Camper Yeah - Redsize')) THEN 'Camper Yeah - Redsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Camper Yeah - Small', 'Registration Q1 001 - Camper Yeah - Small', 'Registration Q1 002 - Camper Yeah - Small', 'Registration Q1 005 - Camper Yeah - Small', 'Registration Q1 006 - Camper Yeah - Small', 'Registration Q1 2021 - Camper Yeah - Small', 'Registration Q2 000 - Camper Yeah - Small', 'Registration Q2 001 - Camper Yeah - Small', 'Registration Q2 002 - Camper Yeah - Small', 'Registration Q2 005 - Camper Yeah - Small', 'Registration Q2 2021 - Camper Yeah - Small', 'Registration Q3 000 - Camper Yeah - Small', 'Registration Q3 001 - Camper Yeah - Small', 'Registration Q3 002 - Camper Yeah - Small', 'Registration Q3 006 - Camper Yeah - Small', 'Registration Q4 000 - Camper Yeah - Small', 'Registration Q4 001 - Camper Yeah - Small', 'Registration Q4 002 - Camper Yeah - Small', 'Registration Q4 005 - Camper Yeah - Small', 'Registration Q4 006 - Camper Yeah - Small')) THEN 'Camper Yeah - Small' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Small - Any-American', 'Registration Q2 001 - Camper Yeah - Small - Any-American', 'Registration Q2 002 - Camper Yeah - Small - Any-American', 'Registration Q4 000 - Camper Yeah - Small - Any-American')) THEN 'Camper Yeah - Small - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Premium Redsize Alt', 'Registration Q4 000 - Camper Yeah - Premium Redsize Alt')) THEN 'Camper Yeah Premium Redsize Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 002 - Camper Wagon', 'Registration Q2 005 - Camper Wagon', 'Registration Q2 2021 - Camper Wagon', 'Registration Q4 002 - Camper Wagon', 'Registration Q4 005 - Camper Wagon', 'Registration Q4 006 - Camper Wagon')) THEN 'Camper Wagon' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 005 - Campers Amps', 'Registration Q2 2021 - Campers Amps', 'Registration Q4 005 - Campers Amps', 'Registration Q4 006 - Campers Amps')) THEN 'Campers Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Campery', 'Registration Q2 001 - Campery', 'Registration Q2 002 - Campery', 'Registration Q2 005 - Campery', 'Registration Q2 2021 - Campery', 'Registration Q4 000 - Campery', 'Registration Q4 001 - Campery', 'Registration Q4 002 - Campery', 'Registration Q4 005 - Campery', 'Registration Q4 006 - Campery')) THEN 'Campery' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Upper Reddle Alt', 'Registration Q1 001 - Upper Reddle Alt', 'Registration Q1 002 - Upper Reddle Alt', 'Registration Q1 005 - Upper Reddle Alt', 'Registration Q1 006 - Upper Reddle Alt', 'Registration Q1 2021 - Upper Reddle Alt', 'Registration Q2 000 - Upper Reddle Alt', 'Registration Q2 001 - Upper Reddle Alt', 'Registration Q2 002 - Upper Reddle Alt', 'Registration Q2 005 - Upper Reddle Alt', 'Registration Q3 000 - Upper Reddle Alt', 'Registration Q3 001 - Upper Reddle Alt', 'Registration Q3 002 - Upper Reddle Alt', 'Registration Q3 006 - Upper Reddle Alt', 'Registration Q4 000 - Upper Reddle Alt', 'Registration Q4 001 - Upper Reddle Alt', 'Registration Q4 002 - Upper Reddle Alt', 'Registration Q4 005 - Upper Reddle Alt', 'Registration Q4 006 - Upper Reddle Alt')) THEN 'Upper Reddle Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Upper Reddle Alt - Any-American', 'Registration Q2 001 - Upper Reddle Alt - Any-American', 'Registration Q2 002 - Upper Reddle Alt - Any-American', 'Registration Q4 000 - Upper Reddle Alt - Any-American')) THEN 'Upper Reddle Alt - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Fires - Smooth', 'Registration Q2 001 - Fires - Smooth', 'Registration Q2 002 - Fires - Smooth', 'Registration Q2 005 - Fires - Smooth', 'Registration Q2 2021 - Fires - Smooth', 'Registration Q4 000 - Fires - Smooth', 'Registration Q4 001 - Fires - Smooth', 'Registration Q4 002 - Fires - Smooth', 'Registration Q4 005 - Fires - Smooth', 'Registration Q4 006 - Fires - Smooth')) THEN 'Fires - Smooth' ELSE "TABLE1"."DESCRIPTION" END) >= 'Alternative Capacitor Devices') AND ((CASE WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 005 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 2021 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 000 - Alternative Capacitor Devices', 'Registration Q4 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 006 - Alternative Capacitor Devices - Stuff Sample')) THEN 'Alternative Capacitor Devices' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Entry Alt Propane', 'Registration Q2 001 - Entry Alt Propane', 'Registration Q2 002 - Entry Alt Propane', 'Registration Q4 000 - Entry Alt Propane', 'Registration Q4 001 - Entry Alt Propane', 'Registration Q4 002 - Entry Alt Propane', 'Registration Q4 005 - Camper Yeah - Entry Alt')) THEN 'Entry Alt Propane' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Entry Amps', 'Registration Q2 000 - Entry Amps', 'Registration Q2 001 - Entry Amps', 'Registration Q2 002 - Entry Amps', 'Registration Q2 005 - Entry Amps', 'Registration Q4 000 - Entry Amps', 'Registration Q4 001 - Entry Amps', 'Registration Q4 002 - Entry Amps', 'Registration Q4 005 - Entry Amps', 'Registration Q4 006 - Entry Amps')) THEN 'Entry Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Fullsize Amp Alt', 'Registration Q2 001 - Fullsize Amp Alt', 'Registration Q2 002 - Fullsize Amp Alt', 'Registration Q2 005 - Fullsize Amp Alt', 'Registration Q2 2021 - Fullsize Amp Alt', 'Registration Q4 000 - Fullsize Amp Alt', 'Registration Q4 001 - Fullsize Amp Alt', 'Registration Q4 002 - Fullsize Amp Alt', 'Registration Q4 005 - Fullsize Amp Alt', 'Registration Q4 006 - Fullsize Amp Alt')) THEN 'Fullsize Amp Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Purple Device Makes - 450 Ratings', 'Registration Q2 000 - Purple Device Makes - 450 Ratings', 'Registration Q2 001 - Purple Device Makes - 450 Ratings', 'Registration Q2 002 - Purple Device Makes - 450 Ratings', 'Registration Q2 005 - Purple Device Makes - 450 Ratings', 'Registration Q2 2021 - Purple Device Makes - 450 Ratings', 'Registration Q4 000 - Purple Device Makes - 450 Ratings', 'Registration Q4 001 - Purple Device Makes - 450 Ratings', 'Registration Q4 002 - Purple Device Makes - 450 Ratings', 'Registration Q4 005 - Purple Device Makes - 450 Ratings', 'Registration Q4 006 - Purple Device Makes - 450 Ratings')) THEN 'Purple Device Makes' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 001 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 002 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q4 000 - Purple Device Makes Non-Waterproof - Any-American')) THEN 'Purple Device Makes Non-Waterproof - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Waterproof Speakers', 'Registration Q2 001 - Waterproof Speakers', 'Registration Q2 002 - Waterproof Speakers', 'Registration Q2 005 - Waterproof Speakers', 'Registration Q2 2021 - Waterproof Speakers', 'Registration Q4 000 - Waterproof Speakers', 'Registration Q4 001 - Waterproof Speakers', 'Registration Q4 002 - Waterproof Speakers', 'Registration Q4 005 - Waterproof Speakers', 'Registration Q4 006 - Waterproof Speakers')) THEN 'Waterproof Speakers' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Waterproof Makes - 450 Ratings', 'Registration Q2 001 - Waterproof Makes - 450 Ratings', 'Registration Q2 002 - Waterproof Makes - 450 Ratings', 'Registration Q2 005 - Waterproof Makes - 450 Ratings', 'Registration Q2 2021 - Waterproof Makes - 450 Ratings', 'Registration Q4 000 - Waterproof Makes - 450 Ratings', 'Registration Q4 001 - Waterproof Makes - 450 Ratings', 'Registration Q4 002 - Waterproof Makes - 450 Ratings', 'Registration Q4 005 - Waterproof Makes - 450 Ratings', 'Registration Q4 006 - Waterproof Makes - 450 Ratings')) THEN 'Waterproof Makes' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Waterproof Propane Redsize', 'Registration Q2 002 - Waterproof Propane Redsize', 'Registration Q2 005 - Waterproof Propane Redsize', 'Registration Q2 2021 - Waterproof Propane Redsize', 'Registration Q4 001 - Waterproof Propane Redsize', 'Registration Q4 002 - Waterproof Propane Redsize', 'Registration Q4 005 - Waterproof Propane Redsize', 'Registration Q4 006 - Waterproof Propane Redsize')) THEN 'Waterproof Propane Redsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Waterproof Propane Small', 'Registration Q2 002 - Waterproof Propane Small', 'Registration Q2 005 - Waterproof Propane Small', 'Registration Q4 001 - Waterproof Propane Small', 'Registration Q4 002 - Waterproof Propane Small', 'Registration Q4 005 - Waterproof Propane Small', 'Registration Q4 006 - Waterproof Propane Small')) THEN 'Waterproof Propane Small' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Red-Junk - Waterproof', 'Registration Q2 001 - Red-Junk - Waterproof', 'Registration Q2 002 - Red-Junk - Waterproof', 'Registration Q2 005 - Red-Junk - Waterproof', 'Registration Q2 2021 - Red-Junk - Waterproof', 'Registration Q4 000 - Red-Junk - Waterproof', 'Registration Q4 001 - Red-Junk - Waterproof', 'Registration Q4 002 - Red-Junk - Waterproof', 'Registration Q4 005 - Red-Junk - Waterproof', 'Registration Q4 006 - Red-Junk - Waterproof')) THEN 'Red-Junk Waterproof' WHEN ("TABLE1"."DESCRIPTION" = 'Registration Q2 2021 - Redsize Amps') THEN 'Redsize Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Near-Entry Waterproof', 'Registration Q2 001 - Near-Entry Waterproof', 'Registration Q2 002 - Near-Entry Waterproof', 'Registration Q2 005 - Near-Entry Waterproof', 'Registration Q2 2021 - Near-Entry Waterproof', 'Registration Q4 000 - Near-Entry Waterproof', 'Registration Q4 001 - Near-Entry Waterproof', 'Registration Q4 002 - Near-Entry Waterproof', 'Registration Q4 005 - Near-Entry Waterproof', 'Registration Q4 006 - Near-Entry Waterproof')) THEN 'Near-Entry Waterproof' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Smooth', 'Registration Q2 001 - Home Theaters - Smooth', 'Registration Q2 002 - Home Theaters - Smooth', 'Registration Q2 005 - Home Theaters - Smooth', 'Registration Q2 2021 - Home Theaters - Smooth', 'Registration Q4 000 - Home Theaters - Smooth', 'Registration Q4 001 - Home Theaters - Smooth', 'Registration Q4 002 - Home Theaters - Smooth', 'Registration Q4 005 - Home Theaters - Smooth', 'Registration Q4 006 - Home Theaters - Smooth')) THEN 'Home Theaters - Smooth' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Fullsize', 'Registration Q2 001 - Home Theaters - Fullsize', 'Registration Q2 002 - Home Theaters - Fullsize', 'Registration Q2 005 - Home Theaters - Fullsize', 'Registration Q2 2021 - Home Theaters - Fullsize', 'Registration Q4 000 - Home Theaters - Fullsize', 'Registration Q4 001 - Home Theaters - Fullsize', 'Registration Q4 002 - Home Theaters - Fullsize', 'Registration Q4 005 - Home Theaters - Fullsize', 'Registration Q4 006 - Home Theaters - Fullsize')) THEN 'Home Theaters - Fullsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Home Theaters - Fullsize - Half Full', 'Registration Q2 001 - Home Theaters - Fullsize - Half Full', 'Registration Q2 002 - Home Theaters - Fullsize - Half Full', 'Registration Q2 005 - Home Theaters - Fullsize - Half Full', 'Registration Q2 2021 - Home Theaters - Fullsize - Half Full', 'Registration Q4 000 - Home Theaters - Fullsize - Half Full', 'Registration Q4 001 - Home Theaters - Fullsize - Half Full', 'Registration Q4 002 - Home Theaters - Fullsize - Half Full', 'Registration Q4 005 - Home Theaters - Fullsize - Half Full')) THEN 'Home Theaters - Fullsize - Half Full' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Small Amps', 'Registration Q1 001 - Small Amps', 'Registration Q1 002 - Small Amps', 'Registration Q1 005 - Small Amps', 'Registration Q1 006 - Small Amps', 'Registration Q1 2021 - Small Amps', 'Registration Q2 000 - Small Amps', 'Registration Q2 001 - Small Amps', 'Registration Q2 002 - Small Amps', 'Registration Q2 005 - Small Amps', 'Registration Q2 2021 - Small Amps', 'Registration Q3 000 - Small Amps', 'Registration Q3 001 - Small Amps', 'Registration Q3 002 - Small Amps', 'Registration Q3 006 - Small Amps', 'Registration Q4 000 - Small Amps', 'Registration Q4 001 - Small Amps', 'Registration Q4 002 - Small Amps', 'Registration Q4 005 - Small Amps', 'Registration Q4 006 - Small Amps')) THEN 'Small Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Small-Entry Amps - Any-American', 'Registration Q2 001 - Small-Entry Amps - Any-American', 'Registration Q2 002 - Small-Entry Amps - Any-American', 'Registration Q4 000 - Small-Entry Amps - Any-American')) THEN 'Small-Entry Amps - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 005 - Camper Yeah - Entry Alt', 'Registration Q4 006 - Camper Yeah - Entry Alt')) THEN 'Camper Yeah - Entry Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 2021 - Camper Yeah - Fullsize', 'Registration Q4 006 - Camper Yeah - Fullsize')) THEN 'Camper Yeah - Fullsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Redsize', 'Registration Q2 001 - Camper Yeah - Redsize', 'Registration Q2 002 - Camper Yeah - Redsize', 'Registration Q2 005 - Camper Yeah - Redsize', 'Registration Q2 2021 - Camper Yeah - Redsize', 'Registration Q4 000 - Camper Yeah - Redsize', 'Registration Q4 001 - Camper Yeah - Redsize', 'Registration Q4 002 - Camper Yeah - Redsize', 'Registration Q4 005 - Camper Yeah - Redsize', 'Registration Q4 006 - Camper Yeah - Redsize')) THEN 'Camper Yeah - Redsize' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Camper Yeah - Small', 'Registration Q1 001 - Camper Yeah - Small', 'Registration Q1 002 - Camper Yeah - Small', 'Registration Q1 005 - Camper Yeah - Small', 'Registration Q1 006 - Camper Yeah - Small', 'Registration Q1 2021 - Camper Yeah - Small', 'Registration Q2 000 - Camper Yeah - Small', 'Registration Q2 001 - Camper Yeah - Small', 'Registration Q2 002 - Camper Yeah - Small', 'Registration Q2 005 - Camper Yeah - Small', 'Registration Q2 2021 - Camper Yeah - Small', 'Registration Q3 000 - Camper Yeah - Small', 'Registration Q3 001 - Camper Yeah - Small', 'Registration Q3 002 - Camper Yeah - Small', 'Registration Q3 006 - Camper Yeah - Small', 'Registration Q4 000 - Camper Yeah - Small', 'Registration Q4 001 - Camper Yeah - Small', 'Registration Q4 002 - Camper Yeah - Small', 'Registration Q4 005 - Camper Yeah - Small', 'Registration Q4 006 - Camper Yeah - Small')) THEN 'Camper Yeah - Small' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Small - Any-American', 'Registration Q2 001 - Camper Yeah - Small - Any-American', 'Registration Q2 002 - Camper Yeah - Small - Any-American', 'Registration Q4 000 - Camper Yeah - Small - Any-American')) THEN 'Camper Yeah - Small - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Camper Yeah - Premium Redsize Alt', 'Registration Q4 000 - Camper Yeah - Premium Redsize Alt')) THEN 'Camper Yeah Premium Redsize Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 002 - Camper Wagon', 'Registration Q2 005 - Camper Wagon', 'Registration Q2 2021 - Camper Wagon', 'Registration Q4 002 - Camper Wagon', 'Registration Q4 005 - Camper Wagon', 'Registration Q4 006 - Camper Wagon')) THEN 'Camper Wagon' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 005 - Campers Amps', 'Registration Q2 2021 - Campers Amps', 'Registration Q4 005 - Campers Amps', 'Registration Q4 006 - Campers Amps')) THEN 'Campers Amps' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Campery', 'Registration Q2 001 - Campery', 'Registration Q2 002 - Campery', 'Registration Q2 005 - Campery', 'Registration Q2 2021 - Campery', 'Registration Q4 000 - Campery', 'Registration Q4 001 - Campery', 'Registration Q4 002 - Campery', 'Registration Q4 005 - Campery', 'Registration Q4 006 - Campery')) THEN 'Campery' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Upper Reddle Alt', 'Registration Q1 001 - Upper Reddle Alt', 'Registration Q1 002 - Upper Reddle Alt', 'Registration Q1 005 - Upper Reddle Alt', 'Registration Q1 006 - Upper Reddle Alt', 'Registration Q1 2021 - Upper Reddle Alt', 'Registration Q2 000 - Upper Reddle Alt', 'Registration Q2 001 - Upper Reddle Alt', 'Registration Q2 002 - Upper Reddle Alt', 'Registration Q2 005 - Upper Reddle Alt', 'Registration Q3 000 - Upper Reddle Alt', 'Registration Q3 001 - Upper Reddle Alt', 'Registration Q3 002 - Upper Reddle Alt', 'Registration Q3 006 - Upper Reddle Alt', 'Registration Q4 000 - Upper Reddle Alt', 'Registration Q4 001 - Upper Reddle Alt', 'Registration Q4 002 - Upper Reddle Alt', 'Registration Q4 005 - Upper Reddle Alt', 'Registration Q4 006 - Upper Reddle Alt')) THEN 'Upper Reddle Alt' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Upper Reddle Alt - Any-American', 'Registration Q2 001 - Upper Reddle Alt - Any-American', 'Registration Q2 002 - Upper Reddle Alt - Any-American', 'Registration Q4 000 - Upper Reddle Alt - Any-American')) THEN 'Upper Reddle Alt - Any-American' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Fires - Smooth', 'Registration Q2 001 - Fires - Smooth', 'Registration Q2 002 - Fires - Smooth', 'Registration Q2 005 - Fires - Smooth', 'Registration Q2 2021 - Fires - Smooth', 'Registration Q4 000 - Fires - Smooth', 'Registration Q4 001 - Fires - Smooth', 'Registration Q4 002 - Fires - Smooth', 'Registration Q4 005 - Fires - Smooth', 'Registration Q4 006 - Fires - Smooth')) THEN 'Fires - Smooth' ELSE "TABLE1"."DESCRIPTION" END) <= 'Fires - Smooth') AND ((CASE WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 000 - Entry Amps', 'Registration Q1 000 - Purple Device Makes - 450 Ratings', 'Registration Q1 000 - Small Amps', 'Registration Q1 000 - Camper Yeah - Small', 'Registration Q1 000 - Upper Reddle Alt')) THEN '000 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 000 - Entry Alt Propane', 'Registration Q2 000 - Entry Amps', 'Registration Q2 000 - Fullsize Amp Alt', 'Registration Q2 000 - Purple Device Makes - 450 Ratings', 'Registration Q2 000 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 000 - Waterproof Speakers', 'Registration Q2 000 - Waterproof Makes - 450 Ratings', 'Registration Q2 000 - Red-Junk - Waterproof', 'Registration Q2 000 - Near-Entry Waterproof', 'Registration Q2 000 - Home Theaters - Smooth', 'Registration Q2 000 - Home Theaters - Fullsize', 'Registration Q2 000 - Home Theaters - Fullsize - Half Full', 'Registration Q2 000 - Small Amps', 'Registration Q2 000 - Small-Entry Amps - Any-American', 'Registration Q2 000 - Camper Yeah - Redsize', 'Registration Q2 000 - Camper Yeah - Premium Redsize Alt', 'Registration Q2 000 - Camper Yeah - Small', 'Registration Q2 000 - Camper Yeah - Small - Any-American', 'Registration Q2 000 - Campery', 'Registration Q2 000 - Upper Reddle Alt', 'Registration Q2 000 - Upper Reddle Alt - Any-American', 'Registration Q2 000 - Fires - Smooth')) THEN '000 Q2' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q3 000 - Small Amps', 'Registration Q3 000 - Camper Yeah - Small', 'Registration Q3 000 - Upper Reddle Alt')) THEN '000 Q3' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 000 - Alternative Capacitor Devices', 'Registration Q4 000 - Entry Alt Propane', 'Registration Q4 000 - Entry Amps', 'Registration Q4 000 - Fullsize Amp Alt', 'Registration Q4 000 - Purple Device Makes - 450 Ratings', 'Registration Q4 000 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q4 000 - Waterproof Speakers', 'Registration Q4 000 - Waterproof Makes - 450 Ratings', 'Registration Q4 000 - Red-Junk - Waterproof', 'Registration Q4 000 - Near-Entry Waterproof', 'Registration Q4 000 - Home Theaters - Smooth', 'Registration Q4 000 - Home Theaters - Fullsize', 'Registration Q4 000 - Home Theaters - Fullsize - Half Full', 'Registration Q4 000 - Small Amps', 'Registration Q4 000 - Small-Entry Amps - Any-American', 'Registration Q4 000 - Camper Yeah - Redsize', 'Registration Q4 000 - Camper Yeah - Premium Redsize Alt', 'Registration Q4 000 - Camper Yeah - Small', 'Registration Q4 000 - Camper Yeah - Small - Any-American', 'Registration Q4 000 - Campery', 'Registration Q4 000 - Upper Reddle Alt', 'Registration Q4 000 - Upper Reddle Alt - Any-American', 'Registration Q4 000 - Fires - Smooth')) THEN '000 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 001 - Small Amps', 'Registration Q1 001 - Camper Yeah - Small', 'Registration Q1 001 - Upper Reddle Alt')) THEN '001 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 001 - Entry Alt Propane', 'Registration Q2 001 - Entry Amps', 'Registration Q2 001 - Fullsize Amp Alt', 'Registration Q2 001 - Purple Device Makes - 450 Ratings', 'Registration Q2 001 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 001 - Waterproof Speakers', 'Registration Q2 001 - Waterproof Makes - 450 Ratings', 'Registration Q2 001 - Waterproof Propane Redsize', 'Registration Q2 001 - Waterproof Propane Small', 'Registration Q2 001 - Red-Junk - Waterproof', 'Registration Q2 001 - Near-Entry Waterproof', 'Registration Q2 001 - Home Theaters - Smooth', 'Registration Q2 001 - Home Theaters - Fullsize', 'Registration Q2 001 - Home Theaters - Fullsize - Half Full', 'Registration Q2 001 - Small Amps', 'Registration Q2 001 - Small-Entry Amps - Any-American', 'Registration Q2 001 - Camper Yeah - Redsize', 'Registration Q2 001 - Camper Yeah - Small', 'Registration Q2 001 - Camper Yeah - Small - Any-American', 'Registration Q2 001 - Campery', 'Registration Q2 001 - Upper Reddle Alt', 'Registration Q2 001 - Upper Reddle Alt - Any-American', 'Registration Q2 001 - Fires - Smooth')) THEN '001 Q2' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q3 001 - Small Amps', 'Registration Q3 001 - Camper Yeah - Small', 'Registration Q3 001 - Upper Reddle Alt')) THEN '001 Q3' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 001 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 001 - Entry Alt Propane', 'Registration Q4 001 - Entry Amps', 'Registration Q4 001 - Fullsize Amp Alt', 'Registration Q4 001 - Purple Device Makes - 450 Ratings', 'Registration Q4 001 - Waterproof Speakers', 'Registration Q4 001 - Waterproof Makes - 450 Ratings', 'Registration Q4 001 - Waterproof Propane Redsize', 'Registration Q4 001 - Waterproof Propane Small', 'Registration Q4 001 - Red-Junk - Waterproof', 'Registration Q4 001 - Near-Entry Waterproof', 'Registration Q4 001 - Home Theaters - Smooth', 'Registration Q4 001 - Home Theaters - Fullsize', 'Registration Q4 001 - Home Theaters - Fullsize - Half Full', 'Registration Q4 001 - Small Amps', 'Registration Q4 001 - Camper Yeah - Redsize', 'Registration Q4 001 - Camper Yeah - Small', 'Registration Q4 001 - Campery', 'Registration Q4 001 - Upper Reddle Alt', 'Registration Q4 001 - Fires - Smooth')) THEN '001 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 002 - Small Amps', 'Registration Q1 002 - Camper Yeah - Small', 'Registration Q1 002 - Upper Reddle Alt')) THEN '002 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 002 - Entry Alt Propane', 'Registration Q2 002 - Entry Amps', 'Registration Q2 002 - Fullsize Amp Alt', 'Registration Q2 002 - Purple Device Makes - 450 Ratings', 'Registration Q2 002 - Purple Device Makes Non-Waterproof - Any-American', 'Registration Q2 002 - Waterproof Speakers', 'Registration Q2 002 - Waterproof Makes - 450 Ratings', 'Registration Q2 002 - Waterproof Propane Redsize', 'Registration Q2 002 - Waterproof Propane Small', 'Registration Q2 002 - Red-Junk - Waterproof', 'Registration Q2 002 - Near-Entry Waterproof', 'Registration Q2 002 - Home Theaters - Smooth', 'Registration Q2 002 - Home Theaters - Fullsize', 'Registration Q2 002 - Home Theaters - Fullsize - Half Full', 'Registration Q2 002 - Small Amps', 'Registration Q2 002 - Small-Entry Amps - Any-American', 'Registration Q2 002 - Camper Yeah - Redsize', 'Registration Q2 002 - Camper Yeah - Small', 'Registration Q2 002 - Camper Yeah - Small - Any-American', 'Registration Q2 002 - Camper Wagon', 'Registration Q2 002 - Campery', 'Registration Q2 002 - Upper Reddle Alt', 'Registration Q2 002 - Upper Reddle Alt - Any-American', 'Registration Q2 002 - Fires - Smooth')) THEN '002 Q2' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q3 002 - Small Amps', 'Registration Q3 002 - Camper Yeah - Small', 'Registration Q3 002 - Upper Reddle Alt')) THEN '002 Q3' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 002 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 002 - Entry Alt Propane', 'Registration Q4 002 - Entry Amps', 'Registration Q4 002 - Fullsize Amp Alt', 'Registration Q4 002 - Purple Device Makes - 450 Ratings', 'Registration Q4 002 - Waterproof Speakers', 'Registration Q4 002 - Waterproof Makes - 450 Ratings', 'Registration Q4 002 - Waterproof Propane Redsize', 'Registration Q4 002 - Waterproof Propane Small', 'Registration Q4 002 - Red-Junk - Waterproof', 'Registration Q4 002 - Near-Entry Waterproof', 'Registration Q4 002 - Home Theaters - Smooth', 'Registration Q4 002 - Home Theaters - Fullsize', 'Registration Q4 002 - Home Theaters - Fullsize - Half Full', 'Registration Q4 002 - Small Amps', 'Registration Q4 002 - Camper Yeah - Redsize', 'Registration Q4 002 - Camper Yeah - Small', 'Registration Q4 002 - Camper Wagon', 'Registration Q4 002 - Campery', 'Registration Q4 002 - Upper Reddle Alt', 'Registration Q4 002 - Fires - Smooth')) THEN '002 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 005 - Small Amps', 'Registration Q1 005 - Camper Yeah - Small', 'Registration Q1 005 - Upper Reddle Alt')) THEN '005 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 005 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 005 - Entry Amps', 'Registration Q2 005 - Fullsize Amp Alt', 'Registration Q2 005 - Purple Device Makes - 450 Ratings', 'Registration Q2 005 - Waterproof Speakers', 'Registration Q2 005 - Waterproof Makes - 450 Ratings', 'Registration Q2 005 - Waterproof Propane Redsize', 'Registration Q2 005 - Waterproof Propane Small', 'Registration Q2 005 - Red-Junk - Waterproof', 'Registration Q2 005 - Near-Entry Waterproof', 'Registration Q2 005 - Home Theaters - Smooth', 'Registration Q2 005 - Home Theaters - Fullsize', 'Registration Q2 005 - Home Theaters - Fullsize - Half Full', 'Registration Q2 005 - Small Amps', 'Registration Q2 005 - Camper Yeah - Entry Alt', 'Registration Q2 005 - Camper Yeah - Redsize', 'Registration Q2 005 - Camper Yeah - Small', 'Registration Q2 005 - Camper Wagon', 'Registration Q2 005 - Campers Amps', 'Registration Q2 005 - Campery', 'Registration Q2 005 - Upper Reddle Alt', 'Registration Q2 005 - Fires - Smooth')) THEN '005 Q2' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 005 - Entry Amps', 'Registration Q4 005 - Fullsize Amp Alt', 'Registration Q4 005 - Purple Device Makes - 450 Ratings', 'Registration Q4 005 - Waterproof Speakers', 'Registration Q4 005 - Waterproof Makes - 450 Ratings', 'Registration Q4 005 - Waterproof Propane Redsize', 'Registration Q4 005 - Waterproof Propane Small', 'Registration Q4 005 - Red-Junk - Waterproof', 'Registration Q4 005 - Near-Entry Waterproof', 'Registration Q4 005 - Home Theaters - Smooth', 'Registration Q4 005 - Home Theaters - Fullsize', 'Registration Q4 005 - Home Theaters - Fullsize - Half Full', 'Registration Q4 005 - Small Amps', 'Registration Q4 005 - Camper Yeah - Entry Alt', 'Registration Q4 005 - Camper Yeah - Redsize', 'Registration Q4 005 - Camper Yeah - Small', 'Registration Q4 005 - Camper Wagon', 'Registration Q4 005 - Campers Amps', 'Registration Q4 005 - Campery', 'Registration Q4 005 - Upper Reddle Alt', 'Registration Q4 005 - Fires - Smooth')) THEN '005 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 006 - Small Amps', 'Registration Q1 006 - Camper Yeah - Small', 'Registration Q1 006 - Upper Reddle Alt')) THEN '006 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q3 006 - Small Amps', 'Registration Q3 006 - Camper Yeah - Small', 'Registration Q3 006 - Upper Reddle Alt')) THEN '006 Q3' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q4 006 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q4 006 - Entry Amps', 'Registration Q4 006 - Fullsize Amp Alt', 'Registration Q4 006 - Purple Device Makes - 450 Ratings', 'Registration Q4 006 - Waterproof Speakers', 'Registration Q4 006 - Waterproof Makes - 450 Ratings', 'Registration Q4 006 - Waterproof Propane Redsize', 'Registration Q4 006 - Waterproof Propane Small', 'Registration Q4 006 - Red-Junk - Waterproof', 'Registration Q4 006 - Near-Entry Waterproof', 'Registration Q4 006 - Home Theaters - Smooth', 'Registration Q4 006 - Home Theaters - Fullsize', 'Registration Q4 006 - Small Amps', 'Registration Q4 006 - Camper Yeah - Entry Alt', 'Registration Q4 006 - Camper Yeah - Fullsize', 'Registration Q4 006 - Camper Yeah - Redsize', 'Registration Q4 006 - Camper Yeah - Small', 'Registration Q4 006 - Camper Wagon', 'Registration Q4 006 - Campers Amps', 'Registration Q4 006 - Campery', 'Registration Q4 006 - Upper Reddle Alt', 'Registration Q4 006 - Fires - Smooth')) THEN '006 Q4' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q1 2021 - Small Amps', 'Registration Q1 2021 - Camper Yeah - Small', 'Registration Q1 2021 - Upper Reddle Alt')) THEN '2021 Q1' WHEN ("TABLE1"."DESCRIPTION" IN ('Registration Q2 2021 - Alternative Capacitor Devices - Stuff Sample', 'Registration Q2 2021 - Fullsize Amp Alt', 'Registration Q2 2021 - Purple Device Makes - 450 Ratings', 'Registration Q2 2021 - Waterproof Speakers', 'Registration Q2 2021 - Waterproof Makes - 450 Ratings', 'Registration Q2 2021 - Waterproof Propane Redsize', 'Registration Q2 2021 - Red-Junk - Waterproof', 'Registration Q2 2021 - Redsize Amps', 'Registration Q2 2021 - Near-Entry Waterproof', 'Registration Q2 2021 - Home Theaters - Smooth', 'Registration Q2 2021 - Home Theaters - Fullsize', 'Registration Q2 2021 - Home Theaters - Fullsize - Half Full', 'Registration Q2 2021 - Small Amps', 'Registration Q2 2021 - Camper Yeah - Fullsize', 'Registration Q2 2021 - Camper Yeah - Redsize', 'Registration Q2 2021 - Camper Yeah - Small', 'Registration Q2 2021 - Camper Wagon', 'Registration Q2 2021 - Campers Amps', 'Registration Q2 2021 - Campery', 'Registration Q2 2021 - Fires - Smooth')) THEN '2021 Q2' ELSE "TABLE1"."DESCRIPTION" END) = '2021 Q2') AND ((CASE WHEN ("TABLE1"."CODE" = 'No Answer') THEN 0 ELSE 1 END) <> 0) AND ("TABLE1"."DESCRIPTION" = 'Familiar With (G1)'))
+GROUP BY 1,
+  2,
+  3
+;
+
+-- simple_parsing.txt
+sELect g.*, A.K from B, KLJ as A;
+
+select * from TABLE_A;
+
+select * from TABLE_A;
+
+select * from TABLE_A LIMIT 34;
+
+select * from TABLE_A LIMIT ?;
+
+select * from TABLE_A LIMIT 34,?;
+
+select * from TABLE_A LIMIT ?,?;
+
+select * from TABLE_A LIMIT ? OFFSET 3;
+
+select * from TABLE_A LIMIT ? OFFSET ?;
+
+select * from TABLE_A LIMIT ALL OFFSET ?;
+
+select * from TABLE_A LIMIT ALL OFFSET 3;
+
+select * from TABLE_A OFFSET 3;
+
+select A,sdf,sch.tab.col from TABLE_A;
+
+select k, * from K as skldjfl where i=0;
+
+select MAX(k+2), COUNT(*), MYCOL from K;
+
+SELECT * FROM TA2 LEFT JOIN O USING (col1, col2)
+where D.OasSD = 'asdf' And (kj >= 4 OR l < 'sdf');
+
+seLECT 	my as KIO, lio aS
+NE fRom TA2 LEFT OUter 		JOIN O as TA3
+where D.OasSD = 'asdf' And (kj >= 4 OR l < 'sdf');
+
+select * from a
+INNer Join TAB_2 ON i.o = p.l whEre 'sdf'>'asdf' AND
+	(
+	OL<>?
+			OR
+	L NOT IN (SELECT * FROM KJSD)
+	);
+
+select * from k where L IS NOT NUll;
+
+(select sdf from sdfd) UNION (select * from k);
+
+update mytab set jk=das, d=kasd+asd/d+3 where KL>= ds OR (k not in (SELECT K from KS));
+
+insert into tabName VALUES ('sdgf', ?, ?);
+
+insert into myschama.tabName2 (col1, col2, col3) VALUES ('sdgf', ?, ?);
+
+delete from jk;
+
+delete from asdff where INI = 94 OR (ASD>9 AND (SELECT MAX(ID) from myt) > ?);
+
+select  *  from  (  SELECT  intermediate.id  as  id  ,  intermediate.date  as
+date  FROM  (  SELECT  DISTINCT  ON  (  id  )  *  FROM  (  SELECT
+wct_workflows.workflow_id  as  id  ,  wct_transaction.date  as  date  FROM
+wct_audit_entry  ,  wct_transaction  ,  wct_workflows  WHERE
+(  wct_audit_entry.privilege  =  'W'  or  wct_audit_entry.privilege  =
+'C'  )  and  wct_audit_entry.outcome  =  't'  and
+wct_audit_entry.transaction_id  =  wct_transaction.transaction_id  and
+wct_transaction.user_id  = 164 and  wct_audit_entry.object_id  =
+wct_workflows.active_version_id)));
+
+(select  *  from  (  SELECT  intermediate.id  as  id  ,  intermediate.date  as
+date  FROM  (  SELECT  DISTINCT   (  id  )  FROM  (  SELECT
+wct_workflows.workflow_id  as  id  ,  wct_transaction.date  as  date  FROM
+wct_audit_entry  ,  wct_transaction  ,  wct_workflows  WHERE
+(  wct_audit_entry.privilege  =  'W'  or  wct_audit_entry.privilege  =
+'C'  )  and  wct_audit_entry.outcome  =  't'  and
+wct_audit_entry.transaction_id  =  wct_transaction.transaction_id  and
+wct_transaction.user_id  = 164 and  wct_audit_entry.object_id  =
+wct_workflows.active_version_id))))  UNION ( SELECT  wct_workflows.workflow_id  as
+id  ,  wct_transaction.date  as  date  FROM  wct_audit_entry  ,
+wct_transaction  ,  wct_workflows  WHERE  (  wct_audit_entry.privilege  =
+'W'  or  wct_audit_entry.privilege  =  'C'  )  and  wct_audit_entry.outcome
+=  't'  and  wct_audit_entry.transaction_id  =
+wct_transaction.transaction_id  and  wct_transaction.user_id  = 164 and
+p= 'asd');
+
+select  *  from  (  SELECT  intermediate.id  as  id  ,  intermediate.date  as
+date  FROM  (  SELECT  DISTINCT   (  id  )   FROM  (  SELECT
+wct_workflows.workflow_id  as  id  ,  wct_transaction.date  as  date  FROM
+wct_audit_entry  ,  wct_transaction  ,  wct_workflows  WHERE
+(  wct_audit_entry.privilege  =  'W'  or  wct_audit_entry.privilege  =
+'C'  )  and  wct_audit_entry.outcome  =  't'  and
+wct_audit_entry.transaction_id  =  wct_transaction.transaction_id  and
+wct_transaction.user_id  = 164 and  wct_audit_entry.object_id  =
+wct_workflows.active_version_id ))) UNION  SELECT  wct_workflows.workflow_id  as
+id  ,  wct_transaction.date  as  date  FROM  wct_audit_entry  ,
+wct_transaction  ,  wct_workflows  WHERE  (  wct_audit_entry.privilege  =
+'W'  or  wct_audit_entry.privilege  =  'C'  )  and  wct_audit_entry.outcome
+=  't'  and  wct_audit_entry.transaction_id  =
+wct_transaction.transaction_id  and  wct_transaction.user_id  = 164 and
+afdf=  (  select  wct_audit_entry.object_id  from  wct_audit_entry  ,
+wct_workflow_archive  where  wct_audit_entry.object_id  =
+wct_workflow_archive.archive_id  and  wct_workflows.workflow_id  =
+wct_workflow_archive.workflow_id  )
+UNION  SELECT  wct_workflows.workflow_id
+as  id  ,  wct_transaction.date  as  date  FROM  wct_audit_entry  ,
+wct_transaction  ,  wct_workflows  WHERE  (  wct_audit_entry.privilege  =
+'W'  OR  wct_audit_entry.privilege  =  'E'  OR  wct_audit_entry.privilege  =
+'A'  )  and  wct_audit_entry.outcome  =  't'  and
+wct_audit_entry.transaction_id  =  wct_transaction.transaction_id  and
+wct_transaction.user_id  = 164 and  wct_audit_entry.object_id  =
+wct_workflows.workflow_id    UNION SELECT * FROM interm2  ,  wct_workflow_docs  WHERE
+interm2.id  =  wct_workflow_docs.document_id  ORDER BY  id  ,  date  DESC
+;
+
+replace df set ki='oasdf', dsd=asd+dd;
+
+(select sdf from sdfd) UNION (select * from k) ORDER BY 1,2;
+
+(select sdf from sdfd) UNION (select * from k) ORDER BY 1,asd.sd ;
+
+(select sdf from sdfd) UNION (select * from k) UNION (select * from k2) LIMIT 0,2;
+
+select sdf from sdfd UNION select * from k join j on k.p = asdf.f;
+
+select  *  from  (  select  persistence_dynamic_ot.pdl_id  ,
+acs_objects.default_domain_class  as  attribute0  ,
+acs_objects.object_type  as  attribute1  ,  acs_objects.display_name
+as  attribute2  ,  persistence_dynamic_ot.dynamic_object_type  as
+attribute3  ,  persistence_dynamic_ot.pdl_file  as  attribute4  from
+persistence_dynamic_ot  ,  acs_objects  where
+persistence_dynamic_ot.pdl_id  =  acs_objects.object_id  );
+
+SELECT * FROM table1 WHERE column1 > ALL (SELECT column2 FROM table1);
+
+INSERT INTO mytable (col1, col2, col3) SELECT * FROM mytable2;
+
+insert into foo ( x )  select a from b;
+
+select (case when a > 0 then b + a else 0 end) p from mytable;
+
+SELECT BTI.*, BTI_PREDECESSOR.objid AS predecessor_objid, BTI_PREDECESSOR.item_id
+AS predecessor_item_id, BTIT_PREDECESSOR.bt_item_type_key AS predecessor_type_key,
+CAT.catalog_key, S.objid AS state_objid, S.state_key, S.is_init_state,
+S.is_final_state, mlS.name AS state, BTIT.bt_item_type_key, BTP.bt_processor_key,
+mlBTP.name AS bt_processor_name , CU.objid AS cust_user_objid , CU.title AS
+cust_user_title , CU.firstname AS cust_user_firstname , CU.lastname AS
+cust_user_lastname , CU.salutation2pv AS cust_user_salutation2pv , PV_CU.name_option
+AS cust_user_salutation , A_CU.email AS cust_user_email , '' AS use_option_field,
+'' AS use_readerlist , BTI_QUOTATION.quotation_type2pv , BTI_QUOTATION.is_mandatory
+AS quotation_is_mandatory , BTI_QUOTATION.is_multiple AS quotation_is_multiple
+, BTI_QUOTATION.expiration_datetime AS quotation_expiration_datetime ,
+BTI_QUOTATION.hint_internal AS quotation_hint_internal , BTI_QUOTATION.hint_external
+AS quotation_hint_external , BTI_QUOTATION.filter_value AS quotation_filter_value
+, BTI_QUOTATION.email_cc AS quotation_email_cc , BTI_QUOTATION.notification1_datetime
+AS notification1_datetime , BTI_QUOTATION.notification2_datetime AS
+notification2_datetime , BTI_RFQ.filter_value AS request_for_quotation_filter_value
+FROM tBusinessTransactionItem BTI LEFT OUTER JOIN tBusinessTransactionItem_Quotation
+BTI_QUOTATION ON BTI_QUOTATION.this2business_transaction_item = BTI.objid LEFT
+OUTER JOIN tBusinessTransactionItem_RequestForQuotation BTI_RFQ ON
+BTI_RFQ.this2business_transaction_item = BTI.objid LEFT OUTER JOIN
+tBusinessTransactionItem BTI_PREDECESSOR ON BTI_PREDECESSOR.objid
+= BTI.predecessor2bt_item, tBusinessTransactionItemType BTIT_PREDECESSOR
+, tBusinessTransactionItemType BTIT, tBusinessTransactionProcessor BTP,
+mltBusinessTransactionProcessor mlBTP, tLanguagePriority LP_BTP, tState S, mltState
+mlS, tLanguagePriority LP_S, tCatalog CAT
+, tBusinessTransactionItem2BusinessTransaction BTI2BT ,
+tBusinessTransactionItem2SessionCart BTI2SC , tSessionCart SC , tCustUser CU_MASTER
+, tCustUser CU , tPopValue PV_CU , tAddress A_CU , tAddress2CustUser A2CU WHERE
+BTI.objid <> -1 AND BTI_PREDECESSOR.this2bt_item_type = BTIT_PREDECESSOR.objid
+AND BTI.this2bt_item_type = BTIT.objid AND BTI.this2bt_processor = BTP.objid
+AND mlBTP.this2master = BTP.objid AND mlBTP.this2language = LP_BTP.item2language
+AND LP_BTP.master2language = 0 AND LP_BTP.this2shop = 0 AND LP_BTP.priority
+= (SELECT MIN(LP_BTP2.priority) FROM tLanguagePriority LP_BTP2,
+mltBusinessTransactionProcessor mlBTP2 WHERE LP_BTP2.master2language = 0 AND
+LP_BTP2.this2shop = 0 AND LP_BTP2.item2language = mlBTP2.this2language
+AND mlBTP2.this2master = BTP.objid ) AND BTI.this2catalog = CAT.objid AND S.objid
+= BTI.bt_item2state AND mlS.this2master = S.objid AND mlS.this2language
+= LP_S.item2language AND LP_S.master2language = 0 AND LP_S.this2shop = 0 AND
+LP_S.priority = (SELECT MIN(LP_S2.priority) FROM tLanguagePriority LP_S2, mltState
+mlS2 WHERE LP_S2.master2language = 0 AND LP_S2.this2shop = 0 AND LP_S2.item2language
+= mlS2.this2language AND mlS2.this2master = S.objid ) AND BTI.objid
+= BTI2BT.this2business_transaction_item AND CU_MASTER.objid = 1101 AND
+CU.this2customer = CU_MASTER.this2customer AND SC.this2custuser = CU.objid AND
+BTI.objid = BTI2SC.this2business_transaction_item AND BTI.bt_item2state = 6664
+AND BTI2SC.is_master_cart_item = 1 AND BTI2SC.this2session_cart = SC.objid AND
+EXISTS (SELECT NULL FROM tBusinessTransaction BT, tBusinessTransactionType BTT
+WHERE BT.objid = BTI2BT.this2business_transaction AND BTT.objid = BT.this2bt_type
+AND BTT.business_transaction_type_key = 'order:master_cart') AND PV_CU.objid
+= CU.salutation2pv AND A2CU.this2custuser = CU.objid AND A2CU.is_billing_default
+= 1 AND A2CU.this2address = A_CU.objid ORDER BY BTI.dbobj_create_datetime DESC;
+
+WITH
+DINFO (DEPTNO, AVGSALARY, EMPCOUNT) AS
+(SELECT OTHERS.WORKDEPT, AVG(OTHERS.SALARY), COUNT(*)
+FROM EMPLOYEE OTHERS
+GROUP BY OTHERS.WORKDEPT
+),
+DINFOMAX AS
+(SELECT MAX(AVGSALARY) AS AVGMAX FROM DINFO)
+SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY,
+DINFO.AVGSALARY, DINFO.EMPCOUNT, DINFOMAX.AVGMAX
+FROM EMPLOYEE THIS_EMP, DINFO, DINFOMAX
+WHERE THIS_EMP.JOB = 'SALESREP'
+AND THIS_EMP.WORKDEPT = DINFO.DEPTNO;
+
+select * from Person where deptname='it' AND NOT (age=24);
+
+select * from unnest(array[4,5,6]) with ordinality;
+
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query02.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query02.sql
index 77ace598b..e554a530f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query02.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query02.sql
@@ -20,4 +20,5 @@ select time_id, product
 
 
 --@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:07 AM
---@FAILURE: Encountered unexpected token: "by" "BY" recorded first on Apr 6, 2024, 7:38:53 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "by" "BY" recorded first on Apr 6, 2024, 7:38:53 AM
+--@FAILURE: Encountered: <K_BY> / "by", at line 14, column 39, in lexical state DEFAULT. recorded first on 23 May 2025, 22:04:10
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query03.sql
index 03cd17602..95aa905a1 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query03.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query03.sql
@@ -16,4 +16,5 @@ select times.time_id, product, quantity from inventory
 
 
 
---@FAILURE: Encountered unexpected token: "by" "BY" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "by" "BY" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_BY> / "by", at line 11, column 14, in lexical state DEFAULT. recorded first on 23 May 2025, 22:04:10
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query07.sql
index 6e1f00c92..328f42a4e 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query07.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query07.sql
@@ -47,4 +47,6 @@
 	where a.cluster_id = b.id
 	order by prob desc, cl_id asc, conf desc, attr asc, val asc
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 36, column 15, in lexical state DEFAULT. recorded first on 23 May 2025, 22:04:10
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 36, column 15, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query09.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query09.sql
index b60a7eef1..90ef12721 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query09.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/analytic_query09.sql
@@ -21,4 +21,5 @@ from
    )
    
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar03.sql
index 4ec094ba7..4d1b143f8 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar03.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar03.sql
@@ -27,4 +27,5 @@ from
 where scn > :2
 
 --@FAILURE: Encountered unexpected token: "group" "GROUP" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "minus" "MINUS" recorded first on Mar 25, 2023, 9:30:55 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "minus" "MINUS" recorded first on Mar 25, 2023, 9:30:55 AM
+--@FAILURE: Encountered: <K_GROUP> / "group", at line 25, column 2, in lexical state DEFAULT. recorded first on 23 May 2025, 22:04:10
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar04.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar04.sql
index 01b37d44b..6821142a6 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar04.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar04.sql
@@ -15,4 +15,6 @@ from
     where "rm".a-interval:"sys_b_07" day(:"sys_b_08") to second(:"sys_b_09")
 )
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 15, column 41, in lexical state DEFAULT. recorded first on 23 May 2025, 22:04:10
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 15, column 41, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset09.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset09.sql
index c30472e1e..dbe06b95c 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset09.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset09.sql
@@ -10,4 +10,5 @@
 update customers_demo
 set cust_address_ntab = cust_address_ntab multiset union cust_address_ntab
 
---@FAILURE: Encountered unexpected token: "multiset" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "multiset" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "multiset", at line 11, column 43, in lexical state DEFAULT. recorded first on 23 May 2025, 22:04:10
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset13.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset13.sql
index 487c15997..52ce45bd2 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset13.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset13.sql
@@ -12,4 +12,6 @@ multiset except distinct cust_address2_ntab multiset_except
 from customers_demo
 
 --@FAILURE: Encountered unexpected token: "except" "EXCEPT" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "distinct" "DISTINCT" recorded first on Mar 25, 2023, 9:18:30 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "distinct" "DISTINCT" recorded first on Mar 25, 2023, 9:18:30 AM
+--@FAILURE: Encountered unexpected token: "cust_address2_ntab" <S_IDENTIFIER> recorded first on Feb 8, 2025, 6:46:21 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "cust_address2_ntab", at line 11, column 26, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset14.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset14.sql
index c1c16572c..8b675ab39 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset14.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset14.sql
@@ -13,4 +13,6 @@ from customers_demo
 order by customer_id
 
 --@FAILURE: Encountered unexpected token: "intersect" "INTERSECT" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "all" "ALL" recorded first on Mar 25, 2023, 9:18:30 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "all" "ALL" recorded first on Mar 25, 2023, 9:18:30 AM
+--@FAILURE: Encountered unexpected token: "cust_address2_ntab" <S_IDENTIFIER> recorded first on Feb 8, 2025, 6:46:21 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "cust_address2_ntab", at line 11, column 24, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset15.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset15.sql
index 689791df4..7ccc1491f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset15.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset15.sql
@@ -13,4 +13,5 @@ from customers_demo
 order by customer_id
 
 --@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "cust_address2_ntab" <S_IDENTIFIER> recorded first on Mar 25, 2023, 9:18:30 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "cust_address2_ntab" <S_IDENTIFIER> recorded first on Mar 25, 2023, 9:18:30 AM
+--@FAILURE: Encountered: <K_UNION> / "union", at line 11, column 10, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset34.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset34.sql
index dd93d7fa7..e9d1debeb 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset34.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset34.sql
@@ -16,4 +16,6 @@ select deptno
      group  by
             deptno
 
---@FAILURE: Encountered unexpected token: "varchar2_ntt" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "varchar2_ntt" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "varchar2_ntt", at line 14, column 42, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset37.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset37.sql
index 00d816581..946fbda98 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset37.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset37.sql
@@ -18,4 +18,6 @@ select owner
             owner
      ,      object_type
 
---@FAILURE: Encountered unexpected token: "varchar2_ntt" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "varchar2_ntt" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "varchar2_ntt", at line 15, column 42, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset38.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset38.sql
index 038eb48b7..84086cffc 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset38.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset38.sql
@@ -12,4 +12,6 @@ select *
                       multiset union distinct
                          varchar2_ntt('b','c','d') )
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 11, column 18, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 11, column 18, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset39.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset39.sql
index dab664623..a98b02407 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset39.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset39.sql
@@ -13,4 +13,5 @@ select varchar2_ntt('a','b','c')
      from   dual
 
 --@FAILURE: Encountered unexpected token: "except" "EXCEPT" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "varchar2_ntt" <S_IDENTIFIER> recorded first on Mar 25, 2023, 9:18:30 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "varchar2_ntt" <S_IDENTIFIER> recorded first on Mar 25, 2023, 9:18:30 AM
+--@FAILURE: Encountered: <K_EXCEPT> / "except", at line 11, column 25, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cluster_set01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cluster_set01.sql
index 0e883ae44..d2ae24b1e 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cluster_set01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cluster_set01.sql
@@ -42,4 +42,6 @@ select a.probability prob, a.cluster_id cl_id,
  where a.cluster_id = b.id
 order by prob desc, cl_id asc, conf desc, attr asc, val asc
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 31, column 36, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 31, column 36, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements01.sql
index 0fce1148e..636556411 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements01.sql
@@ -29,4 +29,5 @@
       );
       END
 
---@FAILURE: Encountered unexpected token: "PK_NAME" <S_IDENTIFIER> recorded first on May 27, 2022, 10:27:41 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "PK_NAME" <S_IDENTIFIER> recorded first on May 27, 2022, 10:27:41 PM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "PK_NAME", at line 11, column 9, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements02.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements02.sql
index ec47ee889..227602a06 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements02.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements02.sql
@@ -27,4 +27,5 @@ DECLARE
           END;
         END
 
---@FAILURE: Encountered unexpected token: "n_emp_id" <S_IDENTIFIER> recorded first on May 27, 2022, 10:29:48 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "n_emp_id" <S_IDENTIFIER> recorded first on May 27, 2022, 10:29:48 PM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "n_emp_id", at line 11, column 11, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements03.sql
index b4f2d87e5..dcedbdc18 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements03.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/compound_statements03.sql
@@ -16,4 +16,5 @@ BEGIN
 
 --@FAILURE: Encountered unexpected token: "BEGIN" "BEGIN" recorded first on May 27, 2022, 10:29:48 PM
 --@FAILURE: Encountered unexpected token: ":" ":" recorded first on 9 Dec 2022, 14:03:29
---@FAILURE: Encountered unexpected token: "INTO" "INTO" recorded first on 4 May 2023, 18:47:18
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "INTO" "INTO" recorded first on 4 May 2023, 18:47:18
+--@FAILURE: Encountered: <K_INTO> / "INTO", at line 12, column 24, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition06.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition06.sql
index 1406c1f8d..d6295170c 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition06.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition06.sql
@@ -22,4 +22,5 @@ and t1.sid(+)=t2.sid
 and ( ( t1.scode like 'mmm'  and t2.scode like 'xax' ) )
 
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_IS> / "is", at line 19, column 31, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition11.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition11.sql
index 20c302deb..2b4866121 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition11.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition11.sql
@@ -15,4 +15,6 @@ and nvl(X.cid, '^') = nvl(Y.clientid (+), '^')
 and 0 = Lib.SKU(X.sid, nvl(Z.cid, '^')) 
 
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 14, column 26, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 14, column 26, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition12.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition12.sql
index afe20c6f8..94cbfadc4 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition12.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition12.sql
@@ -19,4 +19,5 @@ where
 	and  "timestamp"  <= 1298505600000
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "not" "NOT" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition16.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition16.sql
index dab84c3a9..6841847cc 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition16.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition16.sql
@@ -11,4 +11,5 @@ select * from persons p
        where value(p) is of type(only employee_t)
        
 
---@FAILURE: Encountered unexpected token: "is" "IS" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "is" "IS" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_IS> / "is", at line 11, column 23, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition17.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition17.sql
index 551ed804a..04c130530 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition17.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition17.sql
@@ -10,4 +10,5 @@
 delete from table_name
 where current of cursor_name
 
---@FAILURE: Encountered unexpected token: "of" "OF" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "of" "OF" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_OF> / "of", at line 11, column 15, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition18.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition18.sql
index 6971b861d..acca5ff98 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition18.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition18.sql
@@ -12,4 +12,5 @@ set c1 = 'x'
 where current of c_cur1
 
 
---@FAILURE: Encountered unexpected token: "of" "OF" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "of" "OF" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_OF> / "of", at line 12, column 15, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by01.sql
index 1bded99ba..025c2734f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by01.sql
@@ -27,4 +27,5 @@ from o
 connect by nocycle obj=prior link
 start with obj='a'
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 14, 2021 9:00:57 PM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 14, 2021 9:00:57 PM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/explain01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/explain01.sql
index f58d9c7d0..1833b975f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/explain01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/explain01.sql
@@ -18,4 +18,5 @@ explain plan
 
 --@FAILURE: Encountered unexpected token: "plan" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
 --@FAILURE: Encountered unexpected token: "set" "SET" recorded first on 2023年12月23日 下午1:38:33
---@FAILURE: Encountered unexpected token: "plan" "PLAN" recorded first on 23 Aug 2024, 21:35:20
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "plan" "PLAN" recorded first on 23 Aug 2024, 21:35:20
+--@FAILURE: Encountered: <K_SET> / "set", at line 11, column 5, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/flashback01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/flashback01.sql
index 93b5eed0a..67ae61cda 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/flashback01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/flashback01.sql
@@ -9,4 +9,5 @@
 ---
 select value(p$) from "XDB"."XDB$SCHEMA"                 as of snapshot(:2) p$ where SYS_NC_OID$ = :1
 
---@FAILURE: Encountered unexpected token: "snapshot" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "snapshot" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "snapshot", at line 10, column 64, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/for_update07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/for_update07.sql
index 2cb9519cc..da5b94826 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/for_update07.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/for_update07.sql
@@ -11,4 +11,5 @@ select employee_id from (select employee_id+1 as employee_id from employees)
    for update of a, b.c, d skip locked
 
 
---@FAILURE: Encountered unexpected token: "," "," recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "," "," recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_COMMA> / ",", at line 11, column 19, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/for_update08.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/for_update08.sql
index ff5b7f79b..5a482f11b 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/for_update08.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/for_update08.sql
@@ -13,4 +13,5 @@ where (nvl(su.up,'n')='n' and su.ttype=:b0)
 for update of su.up
 order by su.d
 
---@FAILURE: select su.ttype,su.cid,su.s_id,sessiontimezone from sku su where(nvl(su.up,'n')='n' and su.ttype=:b0)order by su.d for update of su.up recorded first on 20 Apr 2024, 15:59:32
\ No newline at end of file
+--@FAILURE: select su.ttype,su.cid,su.s_id,sessiontimezone from sku su where(nvl(su.up,'n')='n' and su.ttype=:b0)order by su.d for update of su.up recorded first on 20 Apr 2024, 15:59:32
+--@FAILURE: Encountered unexpected token: "order" "ORDER" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/function07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/function07.sql
index 0156c4570..aa451e33f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/function07.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/function07.sql
@@ -15,4 +15,6 @@ select cust_gender, count(*) as cnt, round(avg(age)) as avg_age
    order by cust_gender
 	    
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 12, column 20, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 12, column 20, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/groupby18.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/groupby18.sql
index 28e4d9533..6906eee22 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/groupby18.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/groupby18.sql
@@ -17,4 +17,5 @@ from   dimension_tab
 group by grouping sets(fact_1_id, fact_2_id), grouping sets(fact_3_id, fact_4_id)
 order by fact_1_id, fact_2_id, fact_3_id, fact_4_id
 
---@FAILURE: Encountered unexpected token: "," "," recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "," "," recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_COMMA> / ",", at line 17, column 45, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert01.sql
index 2564f35d4..551491cf6 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert01.sql
@@ -15,4 +15,5 @@ insert
 select object_id, created from all_objects
 
 --@FAILURE: Encountered unexpected token: "when" "WHEN" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on 11 Jan 2023, 21:07:10
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on 11 Jan 2023, 21:07:10
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 10, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert03.sql
index 3435fa022..21509acfb 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert03.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert03.sql
@@ -24,4 +24,5 @@ else
 select * from emp
 
 --@FAILURE: Encountered unexpected token: "when" "WHEN" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on 11 Jan 2023, 21:07:10
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on 11 Jan 2023, 21:07:10
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 11, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert04.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert04.sql
index 0fbb8fe3f..16c4ef662 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert04.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert04.sql
@@ -16,4 +16,5 @@ from airplanes
 
 --@FAILURE: Encountered unexpected token: "into" "INTO" recorded first on Aug 3, 2021, 7:20:08 AM
 --@FAILURE: Encountered unexpected token: "ap_cust" <S_IDENTIFIER> recorded first on 24 Oct 2021, 16:56:39
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 11, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert05.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert05.sql
index a8c42ad20..c68c64fc2 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert05.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert05.sql
@@ -19,4 +19,5 @@ select * from dual
 
 --@FAILURE: Encountered unexpected token: "into" "INTO" recorded first on Aug 3, 2021, 7:20:08 AM
 --@FAILURE: Encountered unexpected token: "t" <S_IDENTIFIER> recorded first on 24 Oct 2021, 16:56:39
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 11, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert06.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert06.sql
index c9ff596c6..58eb0fb87 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert06.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert06.sql
@@ -23,4 +23,5 @@ else
 select * from emp
 
 --@FAILURE: Encountered unexpected token: "when" "WHEN" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 10, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert07.sql
index b2d203861..6122702ef 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert07.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert07.sql
@@ -21,4 +21,5 @@ select program_id, delivered_date, customer_id, order_date
 from airplanes
 
 --@FAILURE: Encountered unexpected token: "when" "WHEN" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 10, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert08.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert08.sql
index 0dc47fba9..fed59f44e 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert08.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert08.sql
@@ -15,4 +15,5 @@ where deptno < 30)
 values (98, 'travel', 'seattle')
 
 --@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 11, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert09.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert09.sql
index 6078d3305..932680a98 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert09.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert09.sql
@@ -14,4 +14,5 @@ where deptno < 30 with check option)
 values (99, 'travel', 'seattle')
 
 --@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 10, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert10.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert10.sql
index 5c5934fc8..9ace88b05 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert10.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert10.sql
@@ -14,4 +14,5 @@ insert into (
   (1, 'morgan', 'dba', '1', 40)
 
 --@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM
+--@FAILURE: Encountered: <K_INSERT> / "insert", at line 10, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/interval01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/interval01.sql
index 3d173a1a4..df005b047 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/interval01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/interval01.sql
@@ -10,4 +10,6 @@
 select (systimestamp - order_date) day(9) to second from orders
 where order_id = 2458
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 10, column 39, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 10, column 39, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/interval03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/interval03.sql
index 3e84e6285..80fec57aa 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/interval03.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/interval03.sql
@@ -25,4 +25,5 @@ select
 ,interval :a day
 from dual
 
---@FAILURE: Encountered unexpected token: "second" <K_DATE_LITERAL> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "second" <K_DATE_LITERAL> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_DATE_LITERAL> / "second", at line 11, column 34, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/join05.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/join05.sql
index eaada8283..32c8d6c9a 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/join05.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/join05.sql
@@ -16,4 +16,5 @@ select times.time_id, product, quantity from inventory
 
 
 
---@FAILURE: Encountered unexpected token: "by" "BY" recorded first on Aug 3, 2021, 7:20:07 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "by" "BY" recorded first on Aug 3, 2021, 7:20:07 AM
+--@FAILURE: Encountered: <K_BY> / "by", at line 11, column 14, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/keywordasidentifier04.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/keywordasidentifier04.sql
index bea6452c2..17dd16d7f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/keywordasidentifier04.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/keywordasidentifier04.sql
@@ -13,4 +13,5 @@ union all
 (select null keep, null keep_until
 from v$backup_piece bp)
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on 3 Jun 2022, 18:48:09
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on 3 Jun 2022, 18:48:09
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/lexer01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/lexer01.sql
index bf0f6c5e9..6f9c540cd 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/lexer01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/lexer01.sql
@@ -11,4 +11,5 @@ select * from dual where 1 < > 2 and 1 ! = 2 and 1 ^ /*aaa */ = 2
 
 
 --@FAILURE: Encountered unexpected token: "=" "=" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "^" "^" recorded first on Jul 11, 2024, 9:09:49 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "^" "^" recorded first on Jul 11, 2024, 9:09:49 AM
+--@FAILURE: Encountered: "^" / "^", at line 10, column 52, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/loop01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/loop01.sql
index 409d8754d..7553cc27c 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/loop01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/loop01.sql
@@ -17,4 +17,5 @@ begin
 end;
 
 --@FAILURE: Encountered unexpected token: "begin" "BEGIN" recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "forall" <S_IDENTIFIER> recorded first on 9 Dec 2022, 14:03:29
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "forall" <S_IDENTIFIER> recorded first on 9 Dec 2022, 14:03:29
+--@FAILURE: Encountered: <S_IDENTIFIER> / "forall", at line 11, column 2, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/loop02.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/loop02.sql
index 035af9ec2..e2642ee38 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/loop02.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/loop02.sql
@@ -22,4 +22,5 @@ BEGIN
 END;
 
 --@FAILURE: Encountered unexpected token: "BEGIN" "BEGIN" recorded first on Aug 3, 2021, 7:20:07 AM
---@FAILURE: Encountered unexpected token: "<<" "<<" recorded first on 9 Dec 2022, 14:03:29
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "<<" "<<" recorded first on 9 Dec 2022, 14:03:29
+--@FAILURE: Encountered: "<<" / "<<", at line 11, column 3, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause01.sql
index 9e9bbf4f1..b5c97067d 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause01.sql
@@ -26,4 +26,5 @@ order by country, prod, year
 
 
 
---@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_PARTITION> / "partition", at line 13, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause02.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause02.sql
index fb6c23dd5..7b6212a3f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause02.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause02.sql
@@ -24,4 +24,5 @@ select country, year, sale, csum
 
 
 
---@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "dimension", at line 16, column 10, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause03.sql
index 71877c2c0..1e685e0c2 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause03.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause03.sql
@@ -23,4 +23,5 @@ select country,prod,year,s
   order by country, prod, year
 
 
---@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_PARTITION> / "partition", at line 13, column 5, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause04.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause04.sql
index f974005e6..9b93ac699 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause04.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause04.sql
@@ -23,4 +23,5 @@ select country, year, sale, csum
 
  
 
---@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "dimension", at line 16, column 10, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause05.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause05.sql
index 54c9c946d..9777def6a 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause05.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause05.sql
@@ -22,4 +22,5 @@ select country, year, sale, csum
    order by country, year
 
 
---@FAILURE: Encountered unexpected token: "model" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "model" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "model", at line 16, column 4, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause06.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause06.sql
index 668b79e68..864e3932a 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause06.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause06.sql
@@ -19,4 +19,5 @@ model
   measures     ( ( select dummy from dual ) as dummy )
   rules        ( )
 
---@FAILURE: Encountered unexpected token: "model" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "model" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "model", at line 17, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause07.sql
index 63e743a26..3b099255c 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause07.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause07.sql
@@ -20,4 +20,5 @@ model unique single reference
 order by
   group_2
 
---@FAILURE: Encountered unexpected token: "unique" "UNIQUE" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "unique" "UNIQUE" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_UNIQUE> / "unique", at line 16, column 7, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause08.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause08.sql
index 75839d349..9760d9a88 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause08.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause08.sql
@@ -20,4 +20,5 @@ model
 order by
   key
 
---@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:07 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:07 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "dimension", at line 17, column 3, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause09.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause09.sql
index 0380a3fc1..6703cfd79 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause09.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause09.sql
@@ -24,4 +24,5 @@ model
 order by
   key
 
---@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "dimension", at line 17, column 3, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause10.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause10.sql
index 20d123c6d..a0ab3a65a 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause10.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause10.sql
@@ -25,4 +25,5 @@ model
 order by
   key
 
---@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "dimension", at line 17, column 3, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause11.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause11.sql
index d58a51aa8..654a82923 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause11.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause11.sql
@@ -18,4 +18,5 @@ dimension by (0 dim)
       (str_new [0] =
             regexp_replace (str_new[0], '(^|;)([^;]+;)(.*?;)?\2+', '\1\2\3'));
 
---@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_PARTITION> / "partition", at line 13, column 4, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause12.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause12.sql
index 8201dcabe..62a290586 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause12.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause12.sql
@@ -27,4 +27,5 @@ level3[any] = case when org_level[cv()] = 3 then ename [cv()] end,
 level4[any] = case when org_level[cv()] = 4 then ename [cv()] end )
 
 --@FAILURE: Encountered unexpected token: "return" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "return" "RETURN" recorded first on 9 Dec 2023, 18:20:45
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "return" "RETURN" recorded first on 9 Dec 2023, 18:20:45
+--@FAILURE: Encountered: <K_RETURN> / "return", at line 16, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause13.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause13.sql
index e9e35ce56..79e18fe7f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause13.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause13.sql
@@ -31,4 +31,5 @@ level4[any] = case when org_level[cv()] = 4 then ename [cv()] end
 )))
 
 --@FAILURE: Encountered unexpected token: "return" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
---@FAILURE: Encountered unexpected token: "return" "RETURN" recorded first on 9 Dec 2023, 18:20:44
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "return" "RETURN" recorded first on 9 Dec 2023, 18:20:44
+--@FAILURE: Encountered: <K_RETURN> / "return", at line 20, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause14.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause14.sql
index fa59dfcbc..4dbf9021a 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause14.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause14.sql
@@ -16,4 +16,5 @@ model
     dt[ iteration_number+1 ] = dt[ iteration_number ]+1
   )
 
---@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "dimension" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "dimension", at line 13, column 3, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause15.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause15.sql
index f158dcedb..6e9e355fe 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause15.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause15.sql
@@ -29,4 +29,5 @@ select
    order by name, dt
 
 
---@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_PARTITION> / "partition", at line 19, column 3, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause16.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause16.sql
index f17f8247c..156297664 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause16.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/model_clause16.sql
@@ -38,4 +38,5 @@ select spf.*, nvl(a, ddr_a) as a, b, d,
   )
 
 
---@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:07 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "partition" "PARTITION" recorded first on Aug 3, 2021, 7:20:07 AM
+--@FAILURE: Encountered: <K_PARTITION> / "partition", at line 28, column 3, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/pivot10.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/pivot10.sql
index 6799342fc..64d904e15 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/pivot10.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/pivot10.sql
@@ -27,4 +27,5 @@
  )
  where d_t = 'p'
 
---@FAILURE: Encountered unexpected token: "pivot" "PIVOT" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "pivot" "PIVOT" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_PIVOT> / "pivot", at line 12, column 2, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring01.sql
index 4d74dc0c1..9bb5986c7 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring01.sql
@@ -24,4 +24,5 @@ where r.c1 = a.c2
 order by reportlevel, eid
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring02.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring02.sql
index af27afc76..f4d4ac541 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring02.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring02.sql
@@ -26,4 +26,5 @@ from reports_to_101
 order by reportlevel, eid
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring03.sql
index 044df6fef..a7a8e63be 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring03.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring03.sql
@@ -24,4 +24,5 @@ where reportlevel <= 1
 order by reportlevel, eid
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring04.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring04.sql
index 0c59307b5..0caeb5305 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring04.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring04.sql
@@ -26,4 +26,6 @@ order by order1
 
 
 
---@FAILURE: Encountered unexpected token: "search" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:07 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "search" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:07 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "search", at line 22, column 3, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring05.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring05.sql
index 15078f7d6..40b18d5ba 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring05.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring05.sql
@@ -35,4 +35,5 @@ union
 select a from dual
 
 
---@FAILURE: Encountered unexpected token: "is" "IS" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "is" "IS" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: <K_IS> / "is", at line 33, column 9, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:08
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring07.sql
index 5a6f632f9..bd3934e5a 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring07.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring07.sql
@@ -87,5 +87,4 @@ select
 )
 
 --@FAILURE: Encountered unexpected token: "by" "BY" recorded first on Aug 3, 2021, 7:20:08 AM
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Nov 14, 2022, 11:44:23 AM
---@FAILURE: (select bsln_statistics_t(bsln_guid,metric_id,:b11,:b10,timegroup,sample_count,average,minimum,maximum,sdev,pctile_25,pctile_50,pctile_75,pctile_90,pctile_95,pctile_99,est_sample_count,est_slope,est_intercept,case when est_slope=0 then 0 else greatest(0,nvl(100-(25*power((1-est_mu1/est_slope),2)*(est_sample_count-1)),0))end,ln(1000)*est_slope+est_intercept,ln(10000)*est_slope+est_intercept)from(select metric_id,bsln_guid,timegroup,est_mu as est_slope,est_mu*ln(alpha)+x_m as est_intercept,to_number(null)as est_fit_quality,case when count_below_x_j>0 then(sum_below_x_j+(n-m+1)*(x_j-x_m))/count_below_x_j-x_j else to_number(null)end as est_mu1,est_sample_count,n as sample_count,average,minimum,maximum,sdev,pctile_25,pctile_50,pctile_75,pctile_90,pctile_95,pctile_99 from(select metric_id,bsln_guid,timegroup,max(n)as n,count(rrank)as est_sample_count,case when count(rrank)>3 then(sum(obs_value)+(max(n)-max(rrank))*max(obs_value)-(max(n)-min(rrank)+1)*min(obs_value))/(count(rrank)-1)else to_number(null)end as est_mu,(max(n)-min(rrank)+1)/(max(n)+1)as alpha,min(obs_value)as x_m,max(obs_value)as x_l,max(rrank)as l,min(rrank)as m,max(mid_tail_value)as x_j,sum(case when obs_value<mid_tail_value then obs_value else 0 end)as sum_below_x_j,sum(case when cume_dist<:b7 then 1 else 0 end)as count_below_x_j,max(max_val)as maximum,max(min_val)as minimum,max(avg_val)as average,max(sdev_val)as sdev,max(pctile_25)as pctile_25,max(pctile_50)as pctile_50,max(pctile_75)as pctile_75,max(pctile_90)as pctile_90,max(pctile_95)as pctile_95,max(pctile_99)as pctile_99 from(select metric_id,bsln_guid,timegroup,obs_value as obs_value,cume_dist()over(partition by metric_id,bsln_guid,timegroup order by obs_value)as cume_dist,count(1)over(partition by metric_id,bsln_guid,timegroup)as n,row_number()over(partition by metric_id,bsln_guid,timegroup order by obs_value)as rrank,percentile_disc(:b7)within group(order by obs_value asc)over(partition by metric_id,bsln_guid,timegroup)as mid_tail_value,max(obs_value)over(partition by metric_id,bsln_guid,timegroup)as max_val,min(obs_value)over(partition by metric_id,bsln_guid,timegroup)as min_val,avg(obs_value)over(partition by metric_id,bsln_guid,timegroup)as avg_val,stddev(obs_value)over(partition by metric_id,bsln_guid,timegroup)as sdev_val,percentile_cont(0.25)within group(order by obs_value asc)over(partition by metric_id,bsln_guid,timegroup)as pctile_25,percentile_cont(0.5)within group(order by obs_value asc)over(partition by metric_id,bsln_guid,timegroup)as pctile_50,percentile_cont(0.75)within group(order by obs_value asc)over(partition by metric_id,bsln_guid,timegroup)as pctile_75,percentile_cont(0.90)within group(order by obs_value asc)over(partition by metric_id,bsln_guid,timegroup)as pctile_90,percentile_cont(0.95)within group(order by obs_value asc)over(partition by metric_id,bsln_guid,timegroup)as pctile_95,percentile_cont(0.99)within group(order by obs_value asc)over(partition by metric_id,bsln_guid,timegroup)as pctile_99 from timegrouped_rawdata d)x where x.cume_dist>=:b9 and x.cume_dist<=:b8 group by metric_id,bsln_guid,timegroup))) recorded first on 12 Jan 2025, 15:47:43
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Nov 14, 2022, 11:44:23 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring10.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring10.sql
index 610700c4a..8b2bd85af 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring10.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring10.sql
@@ -41,4 +41,6 @@ select root,lev,obj,link,path,cycle,
  from t
 
 
---@FAILURE: Encountered unexpected token: "search" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "search" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "search", at line 33, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:09
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring13.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring13.sql
index 4013b85c5..33e358d16 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring13.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring13.sql
@@ -22,4 +22,6 @@ select lpad(' ',2*reportlevel)||emp_last emp_name, eid, mgr_id, hire_date, job_i
 from dup_hiredate
 order by order1
 
---@FAILURE: Encountered unexpected token: "search" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "search" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "search", at line 19, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:09
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring14.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring14.sql
index 06e937459..806075e17 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring14.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/query_factoring14.sql
@@ -22,4 +22,6 @@ group by emp_last, eid, mgr_id, salary
 having max(mgrlevel) > 0
 order by mgr_id nulls first, emp_last
 
---@FAILURE: Encountered unexpected token: "search" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "search" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
+--@FAILURE: Encountered: <S_IDENTIFIER> / "search", at line 18, column 1, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:09
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/returning01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/returning01.sql
index 1103dc931..9747a883c 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/returning01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/returning01.sql
@@ -13,4 +13,6 @@ where job = :jobs(i)
 returning empno
 bulk collect into :empnos
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 12, column 18, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:09
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 12, column 18, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:18
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/sample01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/sample01.sql
index 96a881ecc..476db90de 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/sample01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/sample01.sql
@@ -14,4 +14,5 @@ select 1 as c1 from "sys"."obj$" sample block (14.285714 , 1) seed (1) "o"
 
 --@FAILURE: Encountered unexpected token: "block" <S_IDENTIFIER> recorded first on Aug 3, 2021, 7:20:08 AM
 --@FAILURE: Encountered unexpected token: "block" "BLOCK" recorded first on Jul 12, 2023, 12:58:42 PM
---@FAILURE: Encountered unexpected token: "," "," recorded first on Jul 12, 2023, 1:30:58 PM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "," "," recorded first on Jul 12, 2023, 1:30:58 PM
+--@FAILURE: Encountered: <K_COMMA> / ",", at line 12, column 58, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:09
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/string01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/string01.sql
index 1e07ba58a..c61543e8c 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/string01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/string01.sql
@@ -22,4 +22,5 @@ select
 from dual
 
 
---@FAILURE: Encountered unexpected token: "%" "%" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "%" "%" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "%" / "%", at line 17, column 17, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:09
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union01.sql
index c50c5abf5..92f26c01d 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union01.sql
@@ -15,4 +15,5 @@
 (select                'e', 'e' from dual)
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union02.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union02.sql
index b0f719f00..cb360f7e2 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union02.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union02.sql
@@ -12,4 +12,5 @@ union all
 (select distinct job_id from hr.job_history)
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union03.sql
index 53ad59f0a..1c905ac03 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union03.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union03.sql
@@ -14,4 +14,5 @@ union all
 )
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union04.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union04.sql
index 44c8392e3..c59339e6f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union04.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union04.sql
@@ -53,4 +53,5 @@ union all
 	select distinct job_id from hr.job_history	
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union05.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union05.sql
index 68c7857cc..28418174f 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union05.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union05.sql
@@ -38,4 +38,5 @@ union all
 )
 order by 1 asc, 2 asc
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union06.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union06.sql
index 5eac6382d..c88c42aee 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union06.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union06.sql
@@ -43,4 +43,5 @@ union
 order by 4,3,1
 
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "minus" "MINUS" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union07.sql
index 47f09e09c..df489e122 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union07.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union07.sql
@@ -51,4 +51,5 @@ select * from (
         )
 where rownum_ >= ?
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union08.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union08.sql
index 5da67f266..9288439cb 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union08.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union08.sql
@@ -13,4 +13,5 @@ select * from dual where exists (
 	(select * from dual)
 )
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "exists" "EXISTS" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union09.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union09.sql
index a19cc34a8..9cfdd6776 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union09.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union09.sql
@@ -35,4 +35,5 @@ select * from (
         )
 where rownum >= 1
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union10.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union10.sql
index 0055acf05..2ecbb56f2 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union10.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/union10.sql
@@ -22,4 +22,5 @@ select
 as yes_no                                                                                                                                                      
 from dual
 
---@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Feb 13, 2025, 10:16:06 AM
\ No newline at end of file
diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/xmltable01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/xmltable01.sql
index 4a503456e..3c7e35f56 100644
--- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/xmltable01.sql
+++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/xmltable01.sql
@@ -16,4 +16,6 @@ from warehouses,
    "rail" varchar2(6) path '/warehouse/railaccess')
 warehouse2
 
---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
\ No newline at end of file
+--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM
+--@FAILURE: Encountered: "(" / "(", at line 12, column 10, in lexical state DEFAULT. recorded first on 15 May 2025, 16:24:09
+--@FAILURE: Encountered: <OPENING_BRACKET> / "(", at line 12, column 10, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:18
\ No newline at end of file
diff --git a/src/test/resources/simple_parsing.txt b/src/test/resources/simple_parsing.txt
index 3f0670ee1..94259f416 100644
--- a/src/test/resources/simple_parsing.txt
+++ b/src/test/resources/simple_parsing.txt
@@ -208,4 +208,14 @@ FROM EMPLOYEE THIS_EMP, DINFO, DINFOMAX
 WHERE THIS_EMP.JOB = 'SALESREP' 
 AND THIS_EMP.WORKDEPT = DINFO.DEPTNO  
 
-select * from Person where deptname='it' AND NOT (age=24) 
\ No newline at end of file
+select * from Person where deptname='it' AND NOT (age=24)
+
+select * from unnest(array[4,5,6]) with ordinality;
+
+SELECT * FROM tbl WHERE
+day BETWEEN
+  CAST(CAST((NOW() + INTERVAL '-30 day') AS date) AS timestamptz)
+AND
+  CAST(CAST((NOW() + INTERVAL '-1 day') AS date) AS timestamptz);
+
+SELECT DATE_TRUNC('week',("schema"."tbl"."column" + INTERVAL '1 day')) FROM "schema"."tbl";
\ No newline at end of file
