diff --git a/README.md b/README.md
index dfa209dd..01d99c46 100644
--- a/README.md
+++ b/README.md
@@ -199,10 +199,10 @@ Download the self-contained fat JAR for your Elasticsearch version:
| Elasticsearch Version | Artifact |
|-----------------------|----------------------------------------|
-| ES 6.x | `softclient4es6-jdbc-driver-0.2.3.jar` |
-| ES 7.x | `softclient4es7-jdbc-driver-0.2.3.jar` |
-| ES 8.x | `softclient4es8-jdbc-driver-0.2.3.jar` |
-| ES 9.x | `softclient4es9-jdbc-driver-0.2.3.jar` |
+| ES 6.x | `softclient4es6-jdbc-driver-0.2.4.jar` |
+| ES 7.x | `softclient4es7-jdbc-driver-0.2.4.jar` |
+| ES 8.x | `softclient4es8-jdbc-driver-0.2.4.jar` |
+| ES 9.x | `softclient4es9-jdbc-driver-0.2.4.jar` |
> **Java 11+ recommended** (17+ for ES 9.x): **cross-index JOINs require Java 11+** — the embedded JOIN engine is built on Apache Arrow 18.x, which ships Java-11 bytecode.
@@ -219,20 +219,20 @@ Driver class: app.softnetwork.elastic.jdbc.ElasticDriver
app.softnetwork.elastic
softclient4es8-jdbc-driver
- 0.2.3
+ 0.2.4
```
**Gradle:**
```groovy
-implementation 'app.softnetwork.elastic:softclient4es8-jdbc-driver:0.2.3'
+implementation 'app.softnetwork.elastic:softclient4es8-jdbc-driver:0.2.4'
```
**sbt:**
```scala
-libraryDependencies += "app.softnetwork.elastic" % "softclient4es8-jdbc-driver" % "0.2.3"
+libraryDependencies += "app.softnetwork.elastic" % "softclient4es8-jdbc-driver" % "0.2.4"
```
The JDBC driver JARs are Scala-version-independent (no `_2.12` or `_2.13` suffix) and include all required dependencies.
@@ -320,13 +320,13 @@ For programmatic access, add SoftClient4ES to your project.
resolvers += "Softnetwork" at "https://softnetwork.jfrog.io/artifactory/releases/"
// Choose your Elasticsearch version
-libraryDependencies += "app.softnetwork.elastic" %% "softclient4es8-java-client" % "0.20.2"
+libraryDependencies += "app.softnetwork.elastic" %% "softclient4es8-java-client" % "0.20.3"
// Add the community extensions for materialized views (optional)
-libraryDependencies += "app.softnetwork.elastic" %% "softclient4es-community-extensions" % "0.2.2"
+libraryDependencies += "app.softnetwork.elastic" %% "softclient4es-community-extensions" % "0.2.3"
// Add the arrow extensions for cross-index JOIN (required for JOINs; Java 11+)
-libraryDependencies += "app.softnetwork.elastic" %% "softclient4es-arrow-extensions" % "0.2.3"
+libraryDependencies += "app.softnetwork.elastic" %% "softclient4es-arrow-extensions" % "0.2.4"
// Add the JDBC driver if you want to use it from Scala (optional)
-libraryDependencies += "app.softnetwork.elastic" %% "softclient4es-jdbc-driver" % "0.2.3"
+libraryDependencies += "app.softnetwork.elastic" %% "softclient4es-jdbc-driver" % "0.2.4"
```
```scala
diff --git a/documentation/client/adbc_driver.md b/documentation/client/adbc_driver.md
index 741b6a24..e5fc5cf5 100644
--- a/documentation/client/adbc_driver.md
+++ b/documentation/client/adbc_driver.md
@@ -23,10 +23,10 @@ Download the self-contained fat JAR for your Elasticsearch version:
| Elasticsearch | Artifact |
|----------------|-----------------------------------------------------|
-| ES 6.x | `softclient4es6-adbc-driver-0.2.3.jar` |
-| ES 7.x | `softclient4es7-adbc-driver-0.2.3.jar` |
-| ES 8.x | `softclient4es8-adbc-driver-0.2.3.jar` |
-| ES 9.x | `softclient4es9-adbc-driver-0.2.3.jar` |
+| ES 6.x | `softclient4es6-adbc-driver-0.2.4.jar` |
+| ES 7.x | `softclient4es7-adbc-driver-0.2.4.jar` |
+| ES 8.x | `softclient4es8-adbc-driver-0.2.4.jar` |
+| ES 9.x | `softclient4es9-adbc-driver-0.2.4.jar` |
### Maven / Gradle / sbt
@@ -36,20 +36,20 @@ Download the self-contained fat JAR for your Elasticsearch version:
app.softnetwork.elastic
softclient4es8-adbc-driver
- 0.2.3
+ 0.2.4
```
**Gradle:**
```groovy
-implementation 'app.softnetwork.elastic:softclient4es8-adbc-driver:0.2.3'
+implementation 'app.softnetwork.elastic:softclient4es8-adbc-driver:0.2.4'
```
**sbt:**
```scala
-libraryDependencies += "app.softnetwork.elastic" % "softclient4es8-adbc-driver" % "0.2.3"
+libraryDependencies += "app.softnetwork.elastic" % "softclient4es8-adbc-driver" % "0.2.4"
```
---
diff --git a/documentation/client/arrow_flight_sql.md b/documentation/client/arrow_flight_sql.md
index a1731aad..d52ed630 100644
--- a/documentation/client/arrow_flight_sql.md
+++ b/documentation/client/arrow_flight_sql.md
@@ -49,15 +49,15 @@ Available images per ES version:
### Fat JAR
```bash
-java -jar softclient4es8-arrow-flight-sql-0.2.3.jar
+java -jar softclient4es8-arrow-flight-sql-0.2.4.jar
```
| Elasticsearch | Artifact |
|---------------|----------|
-| ES 6.x | `softclient4es6-arrow-flight-sql-0.2.3.jar` |
-| ES 7.x | `softclient4es7-arrow-flight-sql-0.2.3.jar` |
-| ES 8.x | `softclient4es8-arrow-flight-sql-0.2.3.jar` |
-| ES 9.x | `softclient4es9-arrow-flight-sql-0.2.3.jar` |
+| ES 6.x | `softclient4es6-arrow-flight-sql-0.2.4.jar` |
+| ES 7.x | `softclient4es7-arrow-flight-sql-0.2.4.jar` |
+| ES 8.x | `softclient4es8-arrow-flight-sql-0.2.4.jar` |
+| ES 9.x | `softclient4es9-arrow-flight-sql-0.2.4.jar` |
---
diff --git a/documentation/client/download_analytics.md b/documentation/client/download_analytics.md
index e74e52a0..bf34903e 100644
--- a/documentation/client/download_analytics.md
+++ b/documentation/client/download_analytics.md
@@ -15,7 +15,7 @@ beacon to a public endpoint with exactly these fields:
|---------------|----------|-----------------------------------------------|
| `source` | `portal` | Where the count came from (the docs button) |
| `driver` | `jdbc` | Which driver family (`jdbc` or `adbc`) |
-| `version` | `0.2.3` | The published artifact version |
+| `version` | `0.2.4` | The published artifact version |
| `count_delta` | `1` | One download |
A timestamp is added on the server. That is the **entire** record.
diff --git a/documentation/client/jdbc.md b/documentation/client/jdbc.md
index c14ef34d..c4a50574 100644
--- a/documentation/client/jdbc.md
+++ b/documentation/client/jdbc.md
@@ -20,10 +20,10 @@ Download the self-contained fat JAR for your Elasticsearch version. The JARs are
| Elasticsearch | Artifact |
|---------------|----------|
-| ES 6.x | `softclient4es6-jdbc-driver-0.2.3.jar` |
-| ES 7.x | `softclient4es7-jdbc-driver-0.2.3.jar` |
-| ES 8.x | `softclient4es8-jdbc-driver-0.2.3.jar` |
-| ES 9.x | `softclient4es9-jdbc-driver-0.2.3.jar` |
+| ES 6.x | `softclient4es6-jdbc-driver-0.2.4.jar` |
+| ES 7.x | `softclient4es7-jdbc-driver-0.2.4.jar` |
+| ES 8.x | `softclient4es8-jdbc-driver-0.2.4.jar` |
+| ES 9.x | `softclient4es9-jdbc-driver-0.2.4.jar` |
### Build Tool Integration
@@ -33,20 +33,20 @@ Download the self-contained fat JAR for your Elasticsearch version. The JARs are
app.softnetwork.elastic
softclient4es8-jdbc-driver
- 0.2.3
+ 0.2.4
```
**Gradle:**
```groovy
-implementation 'app.softnetwork.elastic:softclient4es8-jdbc-driver:0.2.3'
+implementation 'app.softnetwork.elastic:softclient4es8-jdbc-driver:0.2.4'
```
**sbt:**
```scala
-libraryDependencies += "app.softnetwork.elastic" % "softclient4es8-jdbc-driver" % "0.2.3"
+libraryDependencies += "app.softnetwork.elastic" % "softclient4es8-jdbc-driver" % "0.2.4"
```
---
diff --git a/documentation/client/repl.md b/documentation/client/repl.md
index a2d6eb44..b1ad04c5 100644
--- a/documentation/client/repl.md
+++ b/documentation/client/repl.md
@@ -118,6 +118,7 @@ Before installing, you can list all available versions for a specific Elasticsea
• 0.20.1
• 0.20.2
+ • 0.20.3
Total: 2 version(s)
@@ -147,7 +148,7 @@ Before installing, you can list all available versions for a specific Elasticsea
./install.sh --list-versions --es-version 8
# Install specific version
-./install.sh --es-version 8 --version 0.20.1
+./install.sh --es-version 8 --version 0.20.3
# Install for Elasticsearch 9 (requires Java 17+)
./install.sh --es-version 9
@@ -156,7 +157,7 @@ Before installing, you can list all available versions for a specific Elasticsea
./install.sh --target /opt/softclient4es
# Full custom installation
-./install.sh --target ~/tools/softclient4es --es-version 7 --version 0.20.1
+./install.sh --target ~/tools/softclient4es --es-version 7 --version 0.20.3
```
#### Windows
@@ -169,7 +170,7 @@ Before installing, you can list all available versions for a specific Elasticsea
.\install.ps1 -ListVersions -EsVersion 8
# Install specific version
-.\install.ps1 -EsVersion 8 -Version 0.20.1
+.\install.ps1 -EsVersion 8 -Version 0.20.3
# Install for Elasticsearch 9 (requires Java 17+)
.\install.ps1 -EsVersion 9
@@ -178,7 +179,7 @@ Before installing, you can list all available versions for a specific Elasticsea
.\install.ps1 -Target "C:\tools\softclient4es"
# Full custom installation
-.\install.ps1 -Target "C:\tools\softclient4es" -EsVersion 7 -Version 0.20.1
+.\install.ps1 -Target "C:\tools\softclient4es" -EsVersion 7 -Version 0.20.3
```
---
diff --git a/documentation/sql/dml_statements.md b/documentation/sql/dml_statements.md
index 1163a214..523a43ef 100644
--- a/documentation/sql/dml_statements.md
+++ b/documentation/sql/dml_statements.md
@@ -410,7 +410,7 @@ every supported JVM too** — including JDK 23, 24 and 25.
##### If you are on an older release
-Releases up to and including **0.20.3** fail on **JDK 23 and newer** for `PARQUET`, `DELTA_LAKE` and
+Releases up to and including **0.20.2** fail on **JDK 23 and newer** for `PARQUET`, `DELTA_LAKE` and
remote schemes, with:
| JDK | Error text | `-Djava.security.manager=allow` |
diff --git a/documentation/sql/materialized_views.md b/documentation/sql/materialized_views.md
index 3440190e..6de18530 100644
--- a/documentation/sql/materialized_views.md
+++ b/documentation/sql/materialized_views.md
@@ -536,13 +536,25 @@ To automate this re-execution, the engine creates an **Elasticsearch Watcher** t
The warning looks like this:
```
-✅ Success (14203ms)
+✅ Success (9549ms)
⚠️ Materialized view 'orders_with_customers_mv' was created, but automatic refresh is
- unavailable: this Elasticsearch cluster's licence does not include Watcher, so the joined
- data cannot be refreshed on a schedule. Run 'REFRESH MATERIALIZED VIEW
- orders_with_customers_mv' whenever the joined tables change, or schedule that statement
- externally (cron, Kubernetes CronJob, Airflow). Elasticsearch reported: …
-```
+ unavailable: this deployment cannot host the refresh watcher, so the joined data cannot
+ be refreshed on a schedule. Run 'REFRESH MATERIALIZED VIEW orders_with_customers_mv'
+ whenever the joined tables change, or schedule that statement externally (cron,
+ Kubernetes CronJob, Airflow). Reason: Elasticsearch error during createWatcher:
+ security_exception - current license is non-compliant for [watcher]
+```
+
+The wording names **no cause** — the licence is only one of two ways to end up here, and the
+actual one is quoted verbatim after `Reason:`. The other is a cluster with no usable webhook
+credentials for the watcher to call back with, which is what `xpack.security.enabled: false`
+gives you — the default local, CI and testkit setup. Both are the same outcome: the view exists
+and is queryable, only the scheduled refresh is missing, and `REFRESH MATERIALIZED VIEW` is the
+manual equivalent.
+
+A **wrong** credential is not this case. Supplying a username with no password, or a bad API key,
+keeps failing the statement loudly — that is a fixable misconfiguration, not a missing capability,
+and hiding it behind a warning would hide the typo.
A view created this way keeps `auto_refresh: unavailable` even if the cluster is later upgraded to a license that includes Watcher — re-run `CREATE OR REPLACE MATERIALIZED VIEW` with a changed definition to redeploy it with a watcher.
diff --git a/install.ps1 b/install.ps1
index 7f5e7c55..38b0108f 100644
--- a/install.ps1
+++ b/install.ps1
@@ -63,7 +63,7 @@ Examples:
.\install.ps1
.\install.ps1 -ListVersions -EsVersion 8
.\install.ps1 -Target "C:\tools\softclient4es" -EsVersion 8 -Version 1.0.0
- .\install.ps1 -EsVersion 7 -Version 0.20.2 -NoExtensions
+ .\install.ps1 -EsVersion 7 -Version 0.20.3 -NoExtensions
"@
exit 0
@@ -253,7 +253,7 @@ function Resolve-LatestVersion {
# Prefer non-snapshot versions.
# @(...) matters: with a single match the pipeline yields a bare string, and
- # [-1] on a string returns its last CHARACTER ("0.20.2" -> "2").
+ # [-1] on a string returns its last CHARACTER ("0.20.3" -> "3").
$releaseVersions = @($versions | Where-Object { $_ -notmatch 'SNAPSHOT' })
if ($releaseVersions.Count -gt 0) {
@@ -281,7 +281,7 @@ if ($WITH_EXTENSIONS) {
Where-Object { $_ -notmatch 'SNAPSHOT' })
if ($bundleVersions.Count -gt 0) {
if ($Version -eq "latest") {
- $Version = $bundleVersions[-1] # bundle-version line (0.20.2, 0.20.3, ...)
+ $Version = $bundleVersions[-1] # bundle-version line (0.20.2, 0.20.3, 0.20.4, ...)
$USE_BUNDLE = $true
Write-Success "Resolved latest -all bundle version: $Version"
}
diff --git a/install.sh b/install.sh
index c3341285..98e130cf 100755
--- a/install.sh
+++ b/install.sh
@@ -174,7 +174,7 @@ Examples:
$0
$0 --list-versions --es-version 8
$0 --target /opt/softclient4es --es-version 8 --no-extensions
- $0 -t ~/tools/softclient4es -e 7 -v 0.20.2 --no-extensions
+ $0 -t ~/tools/softclient4es -e 7 -v 0.20.3 --no-extensions
Detected OS: $OS_TYPE
@@ -424,7 +424,7 @@ if [[ "$WITH_EXTENSIONS" == true ]]; then
bundle_versions=$(fetch_versions "$BUNDLE_ARTIFACT_NAME" 2>/dev/null | grep -v 'SNAPSHOT' || true)
if [[ -n "$bundle_versions" ]]; then
if [[ "$SOFT_VERSION" == "latest" ]]; then
- SOFT_VERSION=$(echo "$bundle_versions" | tail -1) # bundle-version line (0.20.1, 0.20.2, ...)
+ SOFT_VERSION=$(echo "$bundle_versions" | tail -1) # bundle-version line (0.20.1, 0.20.2, 0.20.3, ...)
USE_BUNDLE=true
success "Resolved latest -all bundle version: $SOFT_VERSION"
elif echo "$bundle_versions" | grep -qx "$SOFT_VERSION"; then