diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 5ace4600..00000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 2
-updates:
- - package-ecosystem: "github-actions"
- directory: "/"
- schedule:
- interval: "weekly"
diff --git a/.github/workflows/broken_links_checker.yml b/.github/workflows/broken_links_checker.yml
index 90488caa..ee8df765 100644
--- a/.github/workflows/broken_links_checker.yml
+++ b/.github/workflows/broken_links_checker.yml
@@ -1,35 +1,44 @@
-# Generated by Project Keeper
-# https://github.com/exasol/project-keeper/blob/main/project-keeper/src/main/resources/templates/.github/workflows/broken_links_checker.yml
+# This file was generated by Project Keeper.
name: Broken Links Checker
-
on:
schedule:
- - cron: "0 5 * * 0"
-
+ - {
+ cron: 0 5 * * 0
+ }
+ workflow_dispatch: null
jobs:
linkChecker:
runs-on: ubuntu-latest
- permissions:
+ permissions: {
contents: read
+ }
defaults:
- run:
- shell: "bash"
- concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
+ run: {
+ shell: bash
+ }
+ concurrency: {
+ group: '${{ github.workflow }}-${{ github.ref }}',
cancel-in-progress: true
+ }
steps:
- - uses: actions/checkout@v4
- - name: Configure broken links checker
+ - {
+ id: checkout,
+ uses: actions/checkout@v5
+ }
+ - id: configure-broken-links-checker
+ name: Configure broken links checker
run: |
mkdir -p ./target
echo '{"aliveStatusCodes": [429, 200], "ignorePatterns": [' \
- '{"pattern": "^https?://(www|dev).mysql.com/"},' \
- '{"pattern": "^https?://(www.)?opensource.org"}' \
- '{"pattern": "^https?://(www.)?eclipse.org"}' \
- '{"pattern": "^https?://projects.eclipse.org"}' \
- ']}' > ./target/broken_links_checker.json
- - uses: gaurav-nelson/github-action-markdown-link-check@v1
- with:
- use-quiet-mode: "yes"
- use-verbose-mode: "yes"
+ '{"pattern": "^https?://(www|dev).mysql.com/"},' \
+ '{"pattern": "^https?://(www.)?opensource.org"}' \
+ '{"pattern": "^https?://(www.)?eclipse.org"}' \
+ '{"pattern": "^https?://projects.eclipse.org"}' \
+ ']}' > ./target/broken_links_checker.json
+ - id: run-broken-links-checker
+ uses: tcort/github-action-markdown-link-check@v1
+ with: {
+ use-quiet-mode: yes,
+ use-verbose-mode: yes,
config-file: ./target/broken_links_checker.json
+ }
diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml
index 7c087e95..aa273bf5 100644
--- a/.github/workflows/ci-build.yml
+++ b/.github/workflows/ci-build.yml
@@ -3,7 +3,8 @@ name: CI Build
on:
push:
branches: [
- main
+ main,
+ release/*
]
pull_request:
@@ -42,19 +43,22 @@ jobs:
sudo rm -rf /usr/share/dotnet
- name: Checkout the repository
id: checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with: {
fetch-depth: 0
}
- name: Set up JDKs
id: setup-java
- uses: actions/setup-java@v4
+ uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |-
11
17
cache: maven
+ server-id: ossindex
+ server-username: OSSINDEX_USERNAME
+ server-password: OSSINDEX_API_TOKEN
- name: Cache SonarCloud packages
id: cache-sonar
uses: actions/cache@v4
@@ -74,6 +78,10 @@ jobs:
mvn --batch-mode clean verify \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \
-DtrimStackTrace=false
+ env: {
+ OSSINDEX_USERNAME: '${{ secrets.OSSINDEX_USERNAME }}',
+ OSSINDEX_API_TOKEN: '${{ secrets.OSSINDEX_API_TOKEN }}'
+ }
- name: Sonar analysis
id: sonar-analysis
if: ${{ env.SONAR_TOKEN != null }}
@@ -110,7 +118,7 @@ jobs:
'{"pattern": "^https?://(www.)?eclipse.org"}' \
'{"pattern": "^https?://projects.eclipse.org"}' \
']}' > ./target/broken_links_checker.json
- - uses: gaurav-nelson/github-action-markdown-link-check@v1
+ - uses: tcort/github-action-markdown-link-check@v1
id: run-link-check
with: {
use-quiet-mode: yes,
@@ -133,23 +141,28 @@ jobs:
steps:
- name: Checkout the repository
id: checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with: {
fetch-depth: 0
}
- name: Set up JDK 17
id: setup-java
- uses: actions/setup-java@v4
+ uses: actions/setup-java@v5
with: {
distribution: temurin,
java-version: '17',
- cache: maven
+ cache: maven,
+ server-id: ossindex,
+ server-username: OSSINDEX_USERNAME,
+ server-password: OSSINDEX_API_TOKEN
}
- - {
- name: Run tests and build with Maven 17,
- id: build-next-java,
+ - name: Run tests and build with Maven 17
+ id: build-next-java
run: mvn --batch-mode clean package -DtrimStackTrace=false -Djava.version=17
- }
+ env: {
+ OSSINDEX_USERNAME: '${{ secrets.OSSINDEX_USERNAME }}',
+ OSSINDEX_API_TOKEN: '${{ secrets.OSSINDEX_API_TOKEN }}'
+ }
build:
needs: [
build-and-test,
@@ -170,13 +183,13 @@ jobs:
steps:
- name: Checkout the repository
id: checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with: {
fetch-depth: 0
}
- name: Set up JDKs
id: setup-java
- uses: actions/setup-java@v4
+ uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |-
@@ -185,7 +198,7 @@ jobs:
cache: maven
- name: Check if release is needed
id: check-release
- if: ${{ github.ref == 'refs/heads/main' }}
+ if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') }}
run: |
if mvn --batch-mode com.exasol:project-keeper-maven-plugin:verify-release --projects .; then
echo "### ✅ Release preconditions met, start release" >> "$GITHUB_STEP_SUMMARY"
@@ -200,7 +213,7 @@ jobs:
}
start_release:
needs: build
- if: ${{ github.ref == 'refs/heads/main' && needs.build.outputs.release-required == 'true' }}
+ if: ${{ needs.build.outputs.release-required == 'true' }}
concurrency: {
cancel-in-progress: false,
group: release
@@ -213,5 +226,6 @@ jobs:
}
uses: ./.github/workflows/release.yml
with: {
- started-from-ci: true
+ started-from-ci: true,
+ maven-central-auto-publish: true
}
diff --git a/.github/workflows/dependencies_check.yml b/.github/workflows/dependencies_check.yml
index 02c5aa06..b0877fcc 100644
--- a/.github/workflows/dependencies_check.yml
+++ b/.github/workflows/dependencies_check.yml
@@ -18,7 +18,7 @@ jobs:
issues: write
}
outputs: {
- created-issues: '${{ steps.security-issues.outputs.created-issues }}'
+ created-issues: '${{ steps.create-security-issues.outputs.created-issues }}'
}
concurrency: {
group: '${{ github.workflow }}-report_security_issues',
@@ -28,17 +28,20 @@ jobs:
- {
name: Checkout,
id: checkout,
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
}
- name: Set up JDKs
id: setup-jdks
- uses: actions/setup-java@v4
+ uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |-
11
17
cache: maven
+ server-id: ossindex
+ server-username: OSSINDEX_USERNAME
+ server-password: OSSINDEX_API_TOKEN
- name: Generate ossindex report
id: ossindex-report
run: |
@@ -46,9 +49,13 @@ jobs:
org.sonatype.ossindex.maven:ossindex-maven-plugin:audit-aggregate \
-Dossindex.reportFile=$(pwd)/ossindex-report.json \
-Dossindex.fail=false
- - name: Report Security Issues
- id: security-issues
- uses: exasol/python-toolbox/.github/actions/security-issues@main
+ env: {
+ OSSINDEX_USERNAME: '${{ secrets.OSSINDEX_USERNAME }}',
+ OSSINDEX_API_TOKEN: '${{ secrets.OSSINDEX_API_TOKEN }}'
+ }
+ - name: Create GitHub Issues
+ id: create-security-issues
+ uses: exasol/python-toolbox/.github/actions/security-issues@1.9.0
with: {
format: maven,
command: cat ossindex-report.json,
@@ -60,7 +67,7 @@ jobs:
echo "$CREATED_ISSUES" > test.jsonl
cat test.jsonl
env: {
- CREATED_ISSUES: '${{ steps.security-issues.outputs.created-issues }}'
+ CREATED_ISSUES: '${{ steps.create-security-issues.outputs.created-issues }}'
}
start_dependency_udpate:
needs: report_security_issues
diff --git a/.github/workflows/dependencies_update.yml b/.github/workflows/dependencies_update.yml
index c9015062..2ba27856 100644
--- a/.github/workflows/dependencies_update.yml
+++ b/.github/workflows/dependencies_update.yml
@@ -8,6 +8,15 @@ on:
required: true,
type: string
}
+ secrets:
+ INTEGRATION_TEAM_SLACK_NOTIFICATION_WEBHOOK: {
+ description: Slack webhook URL for notifications about failed builds.,
+ required: true
+ }
+ INTEGRATION_TEAM_SECURITY_UPDATES_WEBHOOK: {
+ description: Slack webhook URL for notifications about new Pull Requests.,
+ required: true
+ }
workflow_dispatch: null
jobs:
update_dependencies:
@@ -25,14 +34,14 @@ jobs:
cancel-in-progress: false
}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
id: checkout
with: {
fetch-depth: 0
}
- name: Set up JDKs
id: setup-jdks
- uses: actions/setup-java@v4
+ uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |-
@@ -49,7 +58,7 @@ jobs:
- name: Fail if not running on a branch
id: check-branch
if: ${{ !startsWith(github.ref, 'refs/heads/') }}
- uses: actions/github-script@v7
+ uses: actions/github-script@v8
with:
script: |
core.setFailed('Not running on a branch, github.ref is ${{ github.ref }}. Please start this workflow only on main or a branch')
@@ -172,5 +181,5 @@ jobs:
message_format: '{workflow} created Pull Request ${{ steps.create-pr.outputs.pr_url }}'
}
env: {
- SLACK_WEBHOOK_URL: '${{ secrets.INTEGRATION_TEAM_SLACK_NOTIFICATION_WEBHOOK }}'
+ SLACK_WEBHOOK_URL: '${{ secrets.INTEGRATION_TEAM_SECURITY_UPDATES_WEBHOOK }}'
}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e4682a32..dbc1ea24 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -9,6 +9,33 @@ on:
required: true,
default: false
}
+ maven-central-auto-publish: {
+ description: 'Automatically publish to Maven Central. Deactivate to manually publish at https://central.sonatype.com/publishing/deployments',
+ required: true,
+ type: boolean,
+ default: true
+ }
+ secrets:
+ OSSRH_GPG_SECRET_KEY: {
+ description: Base64 encoded GPG secret key for signing artifacts for deployment to Maven Central.,
+ required: false
+ }
+ OSSRH_GPG_SECRET_KEY_PASSWORD: {
+ description: 'Password for the GPG key. Must not contain special characters, only letters and numbers.',
+ required: false
+ }
+ MAVEN_CENTRAL_PORTAL_USERNAME: {
+ description: Username for the Maven Central Portal.,
+ required: false
+ }
+ MAVEN_CENTRAL_PORTAL_TOKEN: {
+ description: Password for the Maven Central Portal.,
+ required: false
+ }
+ INTEGRATION_TEAM_SLACK_NOTIFICATION_WEBHOOK: {
+ description: Slack webhook URL for notifications about failed and succesful releases.,
+ required: true
+ }
workflow_dispatch:
inputs:
skip-maven-central: {
@@ -17,6 +44,12 @@ on:
type: boolean,
default: false
}
+ maven-central-auto-publish: {
+ description: 'Automatically publish to Maven Central. Deactivate to manually publish at https://central.sonatype.com/publishing/deployments',
+ required: true,
+ type: boolean,
+ default: true
+ }
skip-github-release: {
description: Skip creating the GitHub release,
required: true,
@@ -42,21 +75,21 @@ jobs:
steps:
- name: Checkout the repository
id: checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with: {
fetch-depth: 0
}
- name: Set up Maven Central Repository
id: configure-maven-central-credentials
if: ${{ true }}
- uses: actions/setup-java@v4
+ uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |-
11
17
cache: maven
- server-id: ossrh
+ server-id: maven-central-portal
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
gpg-private-key: ${{ secrets.OSSRH_GPG_SECRET_KEY }}
@@ -64,27 +97,28 @@ jobs:
- name: Set up JDKs
id: setup-jdks
if: ${{ ! true }}
- uses: actions/setup-java@v4
+ uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |-
11
17
cache: maven
- - name: Fail if not running on main branch
- id: check-main-branch
- if: ${{ github.ref != 'refs/heads/main' }}
- uses: actions/github-script@v7
+ - name: Fail if not running on main or release branch
+ id: check-main-or-release-branch
+ if: ${{ github.ref != 'refs/heads/main' && !startsWith(github.ref, 'refs/heads/release/') }}
+ uses: actions/github-script@v8
with:
script: |
- core.setFailed('Not running on main branch, github.ref is ${{ github.ref }}. Please start this workflow only on main')
+ core.setFailed('Not running on main or release branch, github.ref is ${{ github.ref }}. Please start this workflow only on main or a branch starting with release/')
- name: Check CI build of this commit succeeded
id: check-ci-build-status
if: ${{ ! inputs.started-from-ci }}
run: |
echo "Commit SHA: $COMMIT_SHA"
- gh run list --workflow ci-build.yml --branch main --event push --commit $COMMIT_SHA
- ci_build_status=$(gh run list --workflow ci-build.yml --branch main --event push --commit $COMMIT_SHA --json conclusion --template '{{range .}}{{.conclusion}}{{"\n"}}{{end}}')
+ echo "Branch: $BRANCH_NAME"
+ gh run list --workflow ci-build.yml --branch $BRANCH_NAME --event push --commit $COMMIT_SHA
+ ci_build_status=$(gh run list --workflow ci-build.yml --branch $BRANCH_NAME --event push --commit $COMMIT_SHA --json conclusion --template '{{range .}}{{.conclusion}}{{"\n"}}{{end}}')
echo "CI build status at commit $COMMIT_SHA was '$ci_build_status'"
if [[ "$ci_build_status" != "success" ]]; then
gh run list --workflow ci-build.yml --commit $COMMIT_SHA >> $GITHUB_STEP_SUMMARY
@@ -94,7 +128,8 @@ jobs:
fi
env: {
COMMIT_SHA: '${{ github.sha }}',
- GH_TOKEN: '${{ github.token }}'
+ GH_TOKEN: '${{ github.token }}',
+ BRANCH_NAME: '${{ github.ref_name }}'
}
- name: Verify release preconditions
id: verify-release
@@ -107,7 +142,7 @@ jobs:
- {
name: Build project,
id: build,
- run: mvn --batch-mode -DskipTests clean verify
+ run: mvn --batch-mode -DskipTests -Dossindex.skip=true clean verify
}
- {
name: List secret GPG keys,
@@ -120,11 +155,18 @@ jobs:
if: ${{ true && (! inputs.skip-maven-central) }}
run: |
echo "#### Maven Central Release" >> "$GITHUB_STEP_SUMMARY"
- mvn --batch-mode -Dgpg.skip=false -DskipTests deploy
- echo "Published to Maven Central ✅" >> "$GITHUB_STEP_SUMMARY"
+ mvn --batch-mode -Dgpg.skip=false -DskipTests -Dossindex.skip=true deploy \
+ -Dcentral-publishing.deploymentName="Auto release of repo ${{ github.repository }} using PK release.yml" \
+ -Dcentral-publishing.autoPublish=${{ inputs.maven-central-auto-publish }}
+ if [[ "${{ inputs.maven-central-auto-publish }}" == "true" ]]; then
+ echo "Published to Maven Central ✅" >> "$GITHUB_STEP_SUMMARY"
+ else
+ echo "Uploaded to Maven Central ✅" >> "$GITHUB_STEP_SUMMARY"
+ echo "⚠️ Go to https://central.sonatype.com/publishing/deployments to publish the release ⚠️" >> "$GITHUB_STEP_SUMMARY"
+ fi
env: {
- MAVEN_USERNAME: '${{ secrets.OSSRH_USERNAME }}',
- MAVEN_PASSWORD: '${{ secrets.OSSRH_PASSWORD }}',
+ MAVEN_USERNAME: '${{ secrets.MAVEN_CENTRAL_PORTAL_USERNAME }}',
+ MAVEN_PASSWORD: '${{ secrets.MAVEN_CENTRAL_PORTAL_TOKEN }}',
MAVEN_GPG_PASSPHRASE: '${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}'
}
- name: Calculate Artifact Checksums
@@ -166,7 +208,7 @@ jobs:
echo "* \`$file\`" >> "$GITHUB_STEP_SUMMARY"
done
echo "" >> "$GITHUB_STEP_SUMMARY"
- release_url=$(gh release create --latest --title "$TITLE" --notes "$NOTES" --target main $TAG "${artifacts_array[@]}")
+ release_url=$(gh release create --latest --title "$TITLE" --notes "$NOTES" --target $BRANCH_NAME $TAG "${artifacts_array[@]}")
echo "Created release $TAG with title '$TITLE' at $release_url ✅" >> "$GITHUB_STEP_SUMMARY"
echo "release-url=$release_url" >> "$GITHUB_OUTPUT"
@@ -188,7 +230,8 @@ jobs:
ADDITIONAL_TAGS: '${{ steps.verify-release.outputs.additional-release-tags }}',
NOTES: '${{ steps.verify-release.outputs.release-notes }}',
TITLE: '${{ steps.verify-release.outputs.release-title }}',
- ARTIFACTS: '${{ steps.artifact-checksum.outputs.artifacts }}'
+ ARTIFACTS: '${{ steps.artifact-checksum.outputs.artifacts }}',
+ BRANCH_NAME: '${{ github.ref_name }}'
}
- name: Report failure Status to Slack channel
id: report-failure-status-slack
diff --git a/.project-keeper.yml b/.project-keeper.yml
index 8171b782..3fce6773 100644
--- a/.project-keeper.yml
+++ b/.project-keeper.yml
@@ -4,4 +4,3 @@ sources:
modules:
- maven_central
linkReplacements:
- - "https://www.mojohaus.org/flatten-maven-plugin/flatten-maven-plugin|https://www.mojohaus.org/flatten-maven-plugin/"
diff --git a/.vscode/settings.json b/.vscode/settings.json
index f938933d..08394ad7 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,17 +1,21 @@
{
- "editor.formatOnSave": true,
- "editor.codeActionsOnSave": {
- "source.organizeImports": true,
- "source.generate.finalModifiers": true,
- "source.fixAll": true
- },
- "java.codeGeneration.useBlocks": true,
- "java.saveActions.organizeImports": true,
- "java.sources.organizeImports.starThreshold": 3,
- "java.sources.organizeImports.staticStarThreshold": 3,
- "java.test.config": {
- "vmArgs": [
- "-Djava.util.logging.config.file=src/test/resources/logging.properties"
- ]
- }
+ "editor.formatOnSave": true,
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": "explicit",
+ "source.generate.finalModifiers": "explicit",
+ "source.fixAll": "explicit"
+ },
+ "java.codeGeneration.useBlocks": true,
+ "java.saveActions.organizeImports": true,
+ "java.sources.organizeImports.starThreshold": 3,
+ "java.sources.organizeImports.staticStarThreshold": 3,
+ "java.test.config": {
+ "vmArgs": [
+ "-Djava.util.logging.config.file=src/test/resources/logging.properties"
+ ]
+ },
+ "sonarlint.connectedMode.project": {
+ "connectionId": "exasol",
+ "projectKey": "com.exasol:sql-statement-builder"
+ }
}
diff --git a/dependencies.md b/dependencies.md
index 40e4e3e4..f2ed4025 100644
--- a/dependencies.md
+++ b/dependencies.md
@@ -5,9 +5,8 @@
| Dependency | License |
| ----------------------------------------- | -------------------------------- |
-| [JUnit Jupiter (Aggregator)][0] | [Eclipse Public License v2.0][1] |
+| [JUnit Jupiter Params][0] | [Eclipse Public License v2.0][1] |
| [Hamcrest][2] | [BSD-3-Clause][3] |
-| [mockito-core][4] | [MIT][5] |
| [mockito-junit-jupiter][4] | [MIT][5] |
| [EqualsVerifier \| release normal jar][6] | [Apache License, Version 2.0][7] |
@@ -23,7 +22,7 @@
| [Apache Maven Toolchains Plugin][14] | [Apache-2.0][7] |
| [Apache Maven Compiler Plugin][15] | [Apache-2.0][7] |
| [Apache Maven Enforcer Plugin][16] | [Apache-2.0][7] |
-| [Maven Flatten Plugin][17] | [Apache Software Licenese][7] |
+| [Maven Flatten Plugin][17] | [Apache Software License][7] |
| [org.sonatype.ossindex.maven:ossindex-maven-plugin][18] | [ASL2][19] |
| [Maven Surefire Plugin][20] | [Apache-2.0][7] |
| [Versions Maven Plugin][21] | [Apache License, Version 2.0][7] |
@@ -33,15 +32,15 @@
| [Apache Maven GPG Plugin][26] | [Apache-2.0][7] |
| [Apache Maven Source Plugin][27] | [Apache License, Version 2.0][7] |
| [Apache Maven Javadoc Plugin][28] | [Apache-2.0][7] |
-| [Nexus Staging Maven Plugin][29] | [Eclipse Public License][30] |
-| [JaCoCo :: Maven Plugin][31] | [EPL-2.0][32] |
-| [Quality Summarizer Maven Plugin][33] | [MIT License][34] |
-| [error-code-crawler-maven-plugin][35] | [MIT License][36] |
-| [Git Commit Id Maven Plugin][37] | [GNU Lesser General Public License 3.0][38] |
-| [OpenFastTrace Maven Plugin][39] | [GNU General Public License v3.0][40] |
-| [Project Keeper Maven plugin][41] | [The MIT License][42] |
+| [Central Publishing Maven Plugin][29] | [The Apache License, Version 2.0][7] |
+| [JaCoCo :: Maven Plugin][30] | [EPL-2.0][31] |
+| [Quality Summarizer Maven Plugin][32] | [MIT License][33] |
+| [error-code-crawler-maven-plugin][34] | [MIT License][35] |
+| [Git Commit Id Maven Plugin][36] | [GNU Lesser General Public License 3.0][37] |
+| [OpenFastTrace Maven Plugin][38] | [GNU General Public License v3.0][39] |
+| [Project Keeper Maven plugin][40] | [The MIT License][41] |
-[0]: https://junit.org/junit5/
+[0]: https://junit.org/
[1]: https://www.eclipse.org/legal/epl-v20.html
[2]: http://hamcrest.org/JavaHamcrest/
[3]: https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE
@@ -53,7 +52,7 @@
[9]: https://maven.apache.org/plugins/maven-install-plugin/
[10]: https://maven.apache.org/plugins/maven-resources-plugin/
[11]: https://maven.apache.org/plugins/maven-site-plugin/
-[12]: http://docs.sonarqube.org/display/PLUG/Plugin+Library/sonar-maven-plugin
+[12]: http://docs.sonarqube.org/display/PLUG/Plugin+Library/sonar-scanner-maven/sonar-maven-plugin
[13]: http://www.gnu.org/licenses/lgpl.txt
[14]: https://maven.apache.org/plugins/maven-toolchains-plugin/
[15]: https://maven.apache.org/plugins/maven-compiler-plugin/
@@ -70,17 +69,16 @@
[26]: https://maven.apache.org/plugins/maven-gpg-plugin/
[27]: https://maven.apache.org/plugins/maven-source-plugin/
[28]: https://maven.apache.org/plugins/maven-javadoc-plugin/
-[29]: http://www.sonatype.com/public-parent/nexus-maven-plugins/nexus-staging/nexus-staging-maven-plugin/
-[30]: http://www.eclipse.org/legal/epl-v10.html
-[31]: https://www.jacoco.org/jacoco/trunk/doc/maven.html
-[32]: https://www.eclipse.org/legal/epl-2.0/
-[33]: https://github.com/exasol/quality-summarizer-maven-plugin/
-[34]: https://github.com/exasol/quality-summarizer-maven-plugin/blob/main/LICENSE
-[35]: https://github.com/exasol/error-code-crawler-maven-plugin/
-[36]: https://github.com/exasol/error-code-crawler-maven-plugin/blob/main/LICENSE
-[37]: https://github.com/git-commit-id/git-commit-id-maven-plugin
-[38]: http://www.gnu.org/licenses/lgpl-3.0.txt
-[39]: https://github.com/itsallcode/openfasttrace-maven-plugin
-[40]: https://www.gnu.org/licenses/gpl-3.0.html
-[41]: https://github.com/exasol/project-keeper/
-[42]: https://github.com/exasol/project-keeper/blob/main/LICENSE
+[29]: https://central.sonatype.org
+[30]: https://www.jacoco.org/jacoco/trunk/doc/maven.html
+[31]: https://www.eclipse.org/legal/epl-2.0/
+[32]: https://github.com/exasol/quality-summarizer-maven-plugin/
+[33]: https://github.com/exasol/quality-summarizer-maven-plugin/blob/main/LICENSE
+[34]: https://github.com/exasol/error-code-crawler-maven-plugin/
+[35]: https://github.com/exasol/error-code-crawler-maven-plugin/blob/main/LICENSE
+[36]: https://github.com/git-commit-id/git-commit-id-maven-plugin
+[37]: http://www.gnu.org/licenses/lgpl-3.0.txt
+[38]: https://github.com/itsallcode/openfasttrace-maven-plugin
+[39]: https://www.gnu.org/licenses/gpl-3.0.html
+[40]: https://github.com/exasol/project-keeper/
+[41]: https://github.com/exasol/project-keeper/blob/main/LICENSE
diff --git a/doc/changes/changelog.md b/doc/changes/changelog.md
index ab4953a2..a3ab54ae 100644
--- a/doc/changes/changelog.md
+++ b/doc/changes/changelog.md
@@ -1,5 +1,6 @@
# Changes
+* [4.6.1](changes_4.6.1.md)
* [4.6.0](changes_4.6.0.md)
* [4.5.3](changes_4.5.3.md)
* [4.5.2](changes_4.5.2.md)
diff --git a/doc/changes/changes_4.6.1.md b/doc/changes/changes_4.6.1.md
new file mode 100644
index 00000000..5e545c39
--- /dev/null
+++ b/doc/changes/changes_4.6.1.md
@@ -0,0 +1,37 @@
+# Exasol SQL Statement Builder 4.6.1, released 2025-10-30
+
+Code name: Upgrade Project Keeper
+
+## Summary
+
+This release upgrades Project Keeper and dependencies.
+
+## Dependency Updates
+
+### Test Dependency Updates
+
+* Added `org.junit.jupiter:junit-jupiter-params:5.13.4`
+* Removed `org.junit.jupiter:junit-jupiter:5.12.2`
+* Removed `org.mockito:mockito-core:5.17.0`
+* Updated `org.mockito:mockito-junit-jupiter:5.17.0` to `5.20.0`
+
+### Plugin Dependency Updates
+
+* Updated `com.exasol:error-code-crawler-maven-plugin:2.0.3` to `2.0.5`
+* Updated `com.exasol:project-keeper-maven-plugin:5.0.1` to `5.4.3`
+* Updated `com.exasol:quality-summarizer-maven-plugin:0.2.0` to `0.2.1`
+* Updated `io.github.git-commit-id:git-commit-id-maven-plugin:9.0.1` to `9.0.2`
+* Updated `org.apache.maven.plugins:maven-artifact-plugin:3.6.0` to `3.6.1`
+* Updated `org.apache.maven.plugins:maven-clean-plugin:3.4.1` to `3.5.0`
+* Updated `org.apache.maven.plugins:maven-compiler-plugin:3.14.0` to `3.14.1`
+* Updated `org.apache.maven.plugins:maven-enforcer-plugin:3.5.0` to `3.6.2`
+* Updated `org.apache.maven.plugins:maven-gpg-plugin:3.2.7` to `3.2.8`
+* Updated `org.apache.maven.plugins:maven-javadoc-plugin:3.11.2` to `3.12.0`
+* Updated `org.apache.maven.plugins:maven-surefire-plugin:3.5.2` to `3.5.4`
+* Updated `org.codehaus.mojo:flatten-maven-plugin:1.7.0` to `1.7.3`
+* Updated `org.codehaus.mojo:versions-maven-plugin:2.18.0` to `2.19.1`
+* Updated `org.itsallcode:openfasttrace-maven-plugin:1.6.1` to `2.3.0`
+* Updated `org.jacoco:jacoco-maven-plugin:0.8.12` to `0.8.14`
+* Updated `org.sonarsource.scanner.maven:sonar-maven-plugin:5.0.0.4389` to `5.2.0.4988`
+* Added `org.sonatype.central:central-publishing-maven-plugin:0.9.0`
+* Removed `org.sonatype.plugins:nexus-staging-maven-plugin:1.7.0`
diff --git a/pk_generated_parent.pom b/pk_generated_parent.pom
index 83486be5..d0b3a0aa 100644
--- a/pk_generated_parent.pom
+++ b/pk_generated_parent.pom
@@ -3,7 +3,7 @@
4.0.0
com.exasol
sql-statement-builder-generated-parent
- 4.6.0
+ 4.6.1
pom
UTF-8
@@ -14,17 +14,11 @@
https://sonarcloud.io
true
+ false
+ false
+ validated
+ Manual deployment of repo sql-statement-builder
-
-
- ossrh
- https://oss.sonatype.org/content/repositories/snapshots
-
-
- ossrh
- https://oss.sonatype.org/service/local/staging/deploy/maven2/
-
-
MIT License
@@ -51,7 +45,7 @@
org.apache.maven.plugins
maven-clean-plugin
- 3.4.1
+ 3.5.0
org.apache.maven.plugins
@@ -71,7 +65,7 @@
org.sonarsource.scanner.maven
sonar-maven-plugin
- 5.0.0.4389
+ 5.2.0.4988
org.apache.maven.plugins
@@ -95,7 +89,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.14.0
+ 3.14.1
${java.version}
${java.version}
@@ -109,7 +103,7 @@
org.apache.maven.plugins
maven-enforcer-plugin
- 3.5.0
+ 3.6.2
enforce-maven
@@ -132,7 +126,7 @@
org.codehaus.mojo
flatten-maven-plugin
- 1.7.0
+ 1.7.3
true
oss
@@ -158,6 +152,9 @@
org.sonatype.ossindex.maven
ossindex-maven-plugin
3.2.0
+
+ ossindex
+
audit
@@ -171,7 +168,7 @@
org.apache.maven.plugins
maven-surefire-plugin
- 3.5.2
+ 3.5.4
@@ -182,7 +179,7 @@
org.codehaus.mojo
versions-maven-plugin
- 2.18.0
+ 2.19.1
display-updates
@@ -237,7 +234,7 @@
org.apache.maven.plugins
maven-artifact-plugin
- 3.6.0
+ 3.6.1
check-build-plan
@@ -259,7 +256,7 @@
org.apache.maven.plugins
maven-gpg-plugin
- 3.2.7
+ 3.2.8
sign-artifacts
@@ -279,9 +276,9 @@
org.apache.maven.plugins
maven-source-plugin
-
+
3.2.1
@@ -295,7 +292,7 @@
org.apache.maven.plugins
maven-javadoc-plugin
- 3.11.2
+ 3.12.0
attach-javadocs
@@ -315,30 +312,23 @@
- org.sonatype.plugins
- nexus-staging-maven-plugin
- 1.7.0
+ org.sonatype.central
+ central-publishing-maven-plugin
+ 0.9.0
+ true
- true
- ossrh
- https://oss.sonatype.org/
- 15
- 30
+ maven-central-portal
+
+ ${central-publishing.autoPublish}
+ ${central-publishing.waitUntil}
+ ${central-publishing.deploymentName}
+ ${central-publishing.skipPublishing}
-
-
- default-deploy
- deploy
-
- deploy
-
-
-
org.jacoco
jacoco-maven-plugin
- 0.8.12
+ 0.8.14
prepare-agent
@@ -379,7 +369,7 @@
com.exasol
quality-summarizer-maven-plugin
- 0.2.0
+ 0.2.1
summarize-metrics
@@ -392,7 +382,7 @@
com.exasol
error-code-crawler-maven-plugin
- 2.0.3
+ 2.0.5
verify
@@ -405,7 +395,7 @@
io.github.git-commit-id
git-commit-id-maven-plugin
- 9.0.1
+ 9.0.2
get-the-git-infos
diff --git a/pom.xml b/pom.xml
index 43a4be76..af660035 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,20 +3,18 @@
4.0.0
com.exasol
sql-statement-builder
- 4.6.0
+ 4.6.1
Exasol SQL Statement Builder
This module provides a Builder for SQL statements that helps to create the correct structure and
validates variable parts of the statements.
https://github.com/exasol/sql-statement-builder/
2018
-
- 5.17.0
-
org.junit.jupiter
- junit-jupiter
- 5.12.2
+ junit-jupiter-params
+
+ 5.13.4
test
@@ -25,21 +23,16 @@
3.0
test
-
- org.mockito
- mockito-core
- ${mockito.version}
- test
-
org.mockito
mockito-junit-jupiter
- ${mockito.version}
+ 5.20.0
test
nl.jqno.equalsverifier
equalsverifier
+
3.19.4
test
@@ -49,7 +42,7 @@
org.itsallcode
openfasttrace-maven-plugin
- 1.6.1
+ 2.3.0
trace-requirements
@@ -62,7 +55,7 @@
com.exasol
project-keeper-maven-plugin
- 5.0.1
+ 5.4.3
@@ -76,7 +69,7 @@
sql-statement-builder-generated-parent
com.exasol
- 4.6.0
+ 4.6.1
pk_generated_parent.pom
diff --git a/src/test/java/com/exasol/sql/dql/select/rendering/TestSelectRendering.java b/src/test/java/com/exasol/sql/dql/select/rendering/TestSelectRendering.java
index 04c4a49f..6e2e77e9 100644
--- a/src/test/java/com/exasol/sql/dql/select/rendering/TestSelectRendering.java
+++ b/src/test/java/com/exasol/sql/dql/select/rendering/TestSelectRendering.java
@@ -29,73 +29,74 @@
import com.exasol.sql.rendering.StringRendererConfig;
class TestSelectRendering {
- private Select select;
+ private Select selectFactory;
@BeforeEach
void beforeEach() {
- this.select = StatementFactory.getInstance().select();
+ this.selectFactory = StatementFactory.getInstance().select();
}
@Test
// Not a requirement, just to see what happens
void testSelectWithoutFields() {
- assertThat(this.select, rendersTo("SELECT "));
+ assertThat(this.selectFactory, rendersTo("SELECT "));
}
// [utest->dsn~rendering.sql.select~1]
@Test
void testSelectAll() {
- assertThat(this.select.all(), rendersTo("SELECT *"));
+ assertThat(this.selectFactory.all(), rendersTo("SELECT *"));
}
// [utest->dsn~rendering.sql.configurable-case~1]
@Test
void testSelectAllLowerCase() {
- assertThat(this.select.all(),
+ assertThat(this.selectFactory.all(),
rendersWithConfigTo(StringRendererConfig.builder().lowerCase(true).build(), "select *"));
}
// [utest->dsn~rendering.sql.select~1]
@Test
void testSelectFieldNames() {
- assertThat(this.select.field("a", "b"), rendersTo("SELECT a, b"));
+ assertThat(this.selectFactory.field("a", "b"), rendersTo("SELECT a, b"));
}
// [utest->dsn~rendering.sql.select~1]
@Test
void testSelectChainOfFieldNames() {
- assertThat(this.select.field("a", "b").field("c"), rendersTo("SELECT a, b, c"));
+ assertThat(this.selectFactory.field("a", "b").field("c"), rendersTo("SELECT a, b, c"));
}
// [utest->dsn~rendering.sql.select~1]
@Test
void testSelectFromTable() {
- assertThat(this.select.all().from().table("persons"), rendersTo("SELECT * FROM persons"));
+ assertThat(this.selectFactory.all().from().table("persons"), rendersTo("SELECT * FROM persons"));
}
// [utest->dsn~rendering.sql.select~1]
@Test
void testSelectFromMultipleTable() {
- assertThat(this.select.all().from().table("table1").table("table2"), rendersTo("SELECT * FROM table1, table2"));
+ assertThat(this.selectFactory.all().from().table("table1").table("table2"),
+ rendersTo("SELECT * FROM table1, table2"));
}
// [utest->dsn~rendering.sql.select~1]
@Test
void testSelectFromTableAs() {
- assertThat(this.select.all().from().tableAs("table", "t"), rendersTo("SELECT * FROM table AS t"));
+ assertThat(this.selectFactory.all().from().tableAs("table", "t"), rendersTo("SELECT * FROM table AS t"));
}
// [utest->dsn~rendering.sql.select~1]
@Test
void testSelectFromMultipleTableAs() {
- assertThat(this.select.all().from().tableAs("table1", "t1").tableAs("table2", "t2"),
+ assertThat(this.selectFactory.all().from().tableAs("table1", "t1").tableAs("table2", "t2"),
rendersTo("SELECT * FROM table1 AS t1, table2 AS t2"));
}
// [utest->dsn~select-statement.out-of-order-clauses~1]
@Test
void testAddClausesInRandomOrder() {
- assertThat(this.select.limit(1).all().where(not(true)).from().join("A", "A.aa = B.bb").table("B"),
+ assertThat(this.selectFactory.limit(1).all().where(not(true)).from().join("A", "A.aa = B.bb").table("B"),
rendersTo("SELECT * FROM B JOIN A ON A.aa = B.bb WHERE NOT(TRUE) LIMIT 1"));
}
@@ -103,7 +104,7 @@ void testAddClausesInRandomOrder() {
@Test
void testSelectWithQuotedIdentifiers() {
final StringRendererConfig config = StringRendererConfig.builder().quoteIdentifiers(true).build();
- assertThat(this.select.field("fieldA", "tableA.fieldB", "tableB.*").from().table("schemaA.tableA"),
+ assertThat(this.selectFactory.field("fieldA", "tableA.fieldB", "tableB.*").from().table("schemaA.tableA"),
rendersWithConfigTo(config,
"SELECT \"fieldA\", \"tableA\".\"fieldB\", \"tableB\".* FROM \"schemaA\".\"tableA\""));
}
@@ -111,14 +112,14 @@ void testSelectWithQuotedIdentifiers() {
@Test
void testSelectWithQuotedIdentifiersDoesNotAddExtraQuotes() {
final StringRendererConfig config = StringRendererConfig.builder().quoteIdentifiers(true).build();
- assertThat(this.select.field("\"fieldA\"", "\"tableA\".fieldB"),
+ assertThat(this.selectFactory.field("\"fieldA\"", "\"tableA\".fieldB"),
rendersWithConfigTo(config, "SELECT \"fieldA\", \"tableA\".\"fieldB\""));
}
@Test
void testQuotedIdentifiers() {
final StringRendererConfig config = StringRendererConfig.builder().quoteIdentifiers(true).build();
- final Select select = this.select.all();
+ final Select select = this.selectFactory.all();
select.from().table("person");
select.where(eq(stringLiteral("foo"), ColumnReference.of("test")));
assertThat(select, rendersWithConfigTo(config, "SELECT * FROM \"person\" WHERE 'foo' = \"test\""));
@@ -128,19 +129,19 @@ void testQuotedIdentifiers() {
void testSelectFromSubSelect() {
final Select innerSelect = StatementFactory.getInstance().select();
innerSelect.all().from().table("t");
- this.select.all().from().select(innerSelect);
- assertThat(this.select, rendersTo("SELECT * FROM (SELECT * FROM t)"));
+ this.selectFactory.all().from().select(innerSelect);
+ assertThat(this.selectFactory, rendersTo("SELECT * FROM (SELECT * FROM t)"));
}
@Test
void testSelectFromSubSelectInvalid() {
final Select innerSelect = StatementFactory.getInstance().select();
innerSelect.all().from().table("t");
- final ValueTable values = new ValueTable(this.select);
- this.select.all().from().select(innerSelect).valueTable(values);
+ final ValueTable values = new ValueTable(this.selectFactory);
+ this.selectFactory.all().from().select(innerSelect).valueTable(values);
final SelectRenderer renderer = SelectRenderer.create();
final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
- () -> this.select.accept(renderer));
+ () -> this.selectFactory.accept(renderer));
assertThat(exception.getMessage(),
containsString("SELECT statement cannot combine sub-select and value table"));
}
@@ -150,8 +151,8 @@ void testSelectFromSubSelectInvalid() {
void testSelectWithLikePredicate() {
final BooleanExpression like1 = notLike(stringLiteral("abcd"), stringLiteral("a_d"));
final BooleanExpression like2 = like(stringLiteral("%bcd"), stringLiteral("\\%%d"));
- this.select.valueExpression(like1, "res1").valueExpression(like2, "res2");
- assertThat(this.select, rendersTo("SELECT 'abcd' NOT LIKE 'a_d' res1, '%bcd' LIKE '\\%%d' res2"));
+ this.selectFactory.valueExpression(like1, "res1").valueExpression(like2, "res2");
+ assertThat(this.selectFactory, rendersTo("SELECT 'abcd' NOT LIKE 'a_d' res1, '%bcd' LIKE '\\%%d' res2"));
}
@Test
@@ -321,4 +322,4 @@ void testSelectTwoScalarFunctions() {
assertThat(select,
rendersTo("SELECT ADD_YEARS('2000-02-29', 1) AY1, ADD_YEARS('2005-01-31 12:00:00', -1) AY2"));
}
-}
\ No newline at end of file
+}