diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c12bac81..6bcb6f3af 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,9 +39,8 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: -# currently Windows does not work w/ code page related issues # os: [ ubuntu-latest, windows-latest, macos-latest ] - os: [ ubuntu-latest, macos-latest ] + os: [ ubuntu-latest, macos-latest ] steps: - uses: actions/checkout@main with: diff --git a/build.gradle b/build.gradle index 15e9e50e2..a6460e801 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ buildscript { plugins { id 'java' + id "com.vanniktech.maven.publish" version "latest.release" id 'maven-publish' id 'signing' @@ -62,16 +63,17 @@ def getVersion = { boolean considerSnapshot -> snapshot = "-SNAPSHOT" } - return patch != null - ? "${major}.${minor}.${patch}${snapshot}" - : "${major}.${minor}${snapshot}" + return "${major}.${minor}" + + (patch != null ? ".${patch}" : "") + + (build != null ? ".${build}" : "") + + 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' +group = 'com.manticore-projects.jsqlformatter' description = 'JSQLParser library' tasks.register('generateBuildInfo') { @@ -148,19 +150,17 @@ dependencies { testImplementation 'commons-io:commons-io:2.+' testImplementation 'org.apache.commons:commons-text:+' testImplementation 'org.mockito:mockito-core:+' - testImplementation 'org.assertj:assertj-core:+' + testImplementation 'org.assertj:assertj-core:3.+' testImplementation 'org.hamcrest:hamcrest-core:+' testImplementation 'org.apache.commons:commons-lang3:+' testImplementation 'com.h2database:h2:+' - - // for JaCoCo Reports 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:5.18.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.4' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.4' + // Performance Benchmark testImplementation 'org.openjdk.jmh:jmh-core:+' testImplementation 'org.openjdk.jmh:jmh-generator-annprocess:+' @@ -178,11 +178,9 @@ dependencies { 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' - } + // Cache SNAPSHOT/changing modules for javacc for 30 seconds so updates are picked up quickly + resolutionStrategy { + cacheChangingModulesFor 30, 'seconds' } } @@ -198,9 +196,6 @@ compileJavacc { } java { - withSourcesJar() - withJavadocJar() - sourceCompatibility = '11' targetCompatibility = '11' @@ -221,18 +216,18 @@ javadoc { jar { manifest { attributes ( - "Automatic-Module-Name": "net.sf.jsqlparser" + "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" + "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" ) } @@ -343,7 +338,7 @@ jacocoTestCoverageVerification { //@todo: temporarily increased to 7000, we need to bring that down to 5500 after accepting the Keywords PR maximum = 20000 - } + } excludes = [ 'net.sf.jsqlparser.util.validation.*', 'net.sf.jsqlparser.**.*Adapter', @@ -598,89 +593,56 @@ tasks.register('sphinx', Exec) { } } -publish { - dependsOn(check, gitChangelogTask, renderRR, xslt, xmldoc) -} +mavenPublishing { + publishToMavenCentral(true) + signAllPublications() -publishing { - publications { - mavenJava(MavenPublication) { - artifactId = 'jsqlparser' + coordinates(group, "jsqlparser", version) - from components.java + pom { + name.set('JSQLParser library') + description.set('Parse SQL Statements into Abstract Syntax Trees (AST)') + url.set('https://github.com/JSQLParser/JSqlParser') - versionMapping { - usage('java-api') { - fromResolutionOf('runtimeClasspath') - } - usage('java-runtime') { - fromResolutionResult() - } + licenses { + license { + name.set('GNU Library or Lesser General Public License (LGPL) V2.1') + url.set('http://www.gnu.org/licenses/lgpl-2.1.html') } - - pom { - name.set('JSQLParser library') - description.set('Parse SQL Statements into Abstract Syntax Trees (AST)') - url.set('https://github.com/JSQLParser/JSqlParser') - - licenses { - license { - 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.set('The Apache Software License, Version 2.0') - url.set('http://www.apache.org/licenses/LICENSE-2.0.txt') - } - } - - developers { - developer { - id.set('twa') - name.set('Tobias Warneke') - email.set('t.warneke@gmx.net') - } - developer { - id.set('are') - name.set('Andreas Reichel') - email.set('andreas@manticore-projects.com') - } - } - - scm { - 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') - } + license { + name.set('The Apache Software License, Version 2.0') + url.set('http://www.apache.org/licenses/LICENSE-2.0.txt') } } - } - - repositories { - maven { - 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 = providers.environmentVariable("ossrhUsername").orNull - password = providers.environmentVariable("ossrhPassword").orNull + developers { + developer { + id.set('twa') + name.set('Tobias Warneke') + email.set('t.warneke@gmx.net') + } + developer { + id.set('are') + name.set('Andreas Reichel') + email.set('andreas@manticore-projects.com') } } + + scm { + 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') + } } } +// Fix signing task dependencies +tasks.withType(AbstractPublishToMaven).configureEach { + dependsOn(tasks.withType(Sign)) +} signing { - //def signingKey = findProperty("signingKey") - //def signingPassword = findProperty("signingPassword") - //useInMemoryPgpKeys(signingKey, signingPassword) - - // don't sign SNAPSHOTS - if (!version.endsWith('SNAPSHOT')) { - sign publishing.publications.mavenJava - } + required { !version.endsWith("SNAPSHOT") && gradle.taskGraph.hasTask("publish") } } tasks.withType(JavaCompile).configureEach { @@ -732,4 +694,4 @@ jmh { fork = 3 iterations = 5 timeOnIteration = '1s' -} +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b953..61285a659 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cea7a793a..37f78a6af 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d6..adff685a0 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a2183..c4bdd3ab8 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/pom.xml b/pom.xml index 20f6b7066..f676a9399 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ org.assertj assertj-core - 3.27.3 + [3.27.7,) test @@ -276,7 +276,7 @@ org.javacc.plugin javacc-maven-plugin - 3.0.3 + 3.8.0 javacc @@ -285,14 +285,14 @@ jjtree-javacc - UTF-8 - false - false - false - java - - - + + -CODE_GENERATOR="Java" + -GRAMMAR_ENCODING="UTF-8" + + + -GRAMMAR_ENCODING="UTF-8" + -CODE_GENERATOR="Java" + diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..6d75eea53 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'JSQLParser' \ No newline at end of file diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index b598d38e1..532962695 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -15,7 +15,6 @@ options { DEBUG_LOOKAHEAD = false; DEBUG_TOKEN_MANAGER = false; CACHE_TOKENS = false; - SINGLE_TREE_FILE = false; // FORCE_LA_CHECK = true; UNICODE_INPUT = true; JAVA_TEMPLATE_TYPE = "modern"; diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java index 1c28f6aad..8fd5a9a6a 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java @@ -77,7 +77,8 @@ public class SpecialOracleTest { "cast_multiset40.sql", "cast_multiset41.sql", "cast_multiset42.sql", "cast_multiset43.sql", "columns01.sql", "condition01.sql", "condition02.sql", "condition03.sql", "condition04.sql", "condition05.sql", "condition07.sql", - "condition08.sql", "condition09.sql", "condition10.sql", "condition12.sql", + "condition08.sql", "condition09.sql", "condition10.sql", "condition11.sql", + "condition12.sql", "condition14.sql", "condition15.sql", "condition19.sql", "condition20.sql", "connect_by01.sql", "connect_by02.sql", "connect_by03.sql", "connect_by04.sql", "connect_by05.sql", "connect_by06.sql", "connect_by07.sql", "connect_by08.sql", 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 2b4866121..499d05c6e 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 @@ -17,4 +17,5 @@ and 0 = Lib.SKU(X.sid, nvl(Z.cid, '^')) --@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: / "(", at line 14, column 26, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17 \ No newline at end of file +--@FAILURE: Encountered: / "(", at line 14, column 26, in lexical state DEFAULT. recorded first on 9 Jul 2025, 17:09:17 +--@SUCCESSFULLY_PARSED_AND_DEPARSED first on 25 Feb 2026, 00:22:20 \ No newline at end of file