Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
6fe3ce4
feat(qwp): add schema-aware sender
jerrinot Sep 14, 2026
98be3b0
Raise schema wait budget to 30 seconds
jerrinot Sep 14, 2026
c1506e2
feat(qwp): support schema-aware small integers
jerrinot Sep 14, 2026
1310b0d
docs(qwp): record binary compatibility gate
jerrinot Sep 14, 2026
edf6f34
Support schema-aware textual decimals
jerrinot Sep 14, 2026
21168de
feat(qwp): support schema-aware IPv4
jerrinot Sep 14, 2026
0d9663b
feat(qwp): support schema-aware LONG256
jerrinot Sep 14, 2026
8932076
feat(qwp): support schema-aware GEOHASH
jerrinot Sep 14, 2026
853c329
feat(qwp): support integer temporal targets
jerrinot Sep 14, 2026
3acdcea
feat(qwp): support small integer text targets
jerrinot Sep 14, 2026
1630c04
feat(qwp): support small integer decimal targets
jerrinot Sep 14, 2026
19557e2
feat(qwp): support int to IPv4 conversion
jerrinot Sep 14, 2026
47a37a6
feat(qwp): support string to date conversion
jerrinot Sep 14, 2026
bc16c16
feat(qwp): support schema-aware double arrays
jerrinot Sep 14, 2026
59ade91
fix(qwp): preserve async schema startup availability
jerrinot Sep 15, 2026
55fbc1f
docs(qwp): update schema-aware sender status
jerrinot Sep 15, 2026
31111e4
fix(qwp): restore char-to-text conversion
jerrinot Sep 15, 2026
acf5ac0
docs(qwp): record schema-aware E2E migration
jerrinot Sep 15, 2026
67467dc
Use one Ryu double formatter in the client
jerrinot Sep 15, 2026
eeb0bbd
Share one row-failure policy across QWP setters
jerrinot Sep 17, 2026
4275ad7
Skip schema refresh for unsupported long arrays
jerrinot Sep 17, 2026
2832833
Adopt schema mode at the batch boundary
jerrinot Sep 17, 2026
b94becd
Document batch-boundary schema adoption
jerrinot Sep 17, 2026
7f789df
Let the schema snapshot own its column index
jerrinot Sep 17, 2026
7a73e58
Share schema-binding test fixtures and reader
jerrinot Sep 17, 2026
0fb1ea9
Pin one schema snapshot per table per batch
jerrinot Sep 18, 2026
7d5f34e
Move FLAG_SCHEMA from 0x02 to 0x40
jerrinot Sep 18, 2026
89e15f0
Keep schema lookups alive across reconnects
jerrinot Sep 18, 2026
5c78a7d
Prepare QWP row schemas in table()
jerrinot Sep 18, 2026
86e5d81
remove temporary design doc
jerrinot Sep 18, 2026
ccef6c1
Reuse existing QWP state for eager table schema lookup
jerrinot Sep 18, 2026
6ebb086
Add schema_mode and schema_wait_millis knobs
jerrinot Sep 22, 2026
999b535
Fix legacy QWP failover with schema mode off
jerrinot Sep 22, 2026
f9ab44d
Allow AUTO fallback for oversized QWP schemas
jerrinot Sep 22, 2026
a12ae23
Exclude arrays from GEOHASH setter dispatch
jerrinot Sep 22, 2026
358db5f
Release schema requirement once frames are acked
jerrinot Sep 23, 2026
c314537
Resolve schema columns once per binding
jerrinot Sep 23, 2026
e8b1c5b
Parse schema timestamp text in a single pass
jerrinot Sep 23, 2026
fb28ffe
Merge micros and millis timestamp parser paths
jerrinot Sep 23, 2026
5c5fca8
Stop schema lookups from waking the I/O thread
jerrinot Sep 23, 2026
637fb98
Treat Long.MAX_VALUE wait budgets as unlimited
jerrinot Sep 23, 2026
07f8d27
Cache TOO_LARGE schema answers in AUTO mode
jerrinot Sep 23, 2026
2f5bfe2
Document what Sender.table() can block on and throw
jerrinot Sep 23, 2026
eac519c
Match server NaN and Infinity decimal parsing
jerrinot Sep 23, 2026
61457fc
Make schema conformance tests assert their data
jerrinot Sep 23, 2026
c36a507
Simplify the QWP schema coordinator cache
jerrinot Sep 23, 2026
c2c01f8
Merge origin/main into jh_schema_aware_clients
jerrinot Sep 24, 2026
6066eeb
Keep QWP schema cache across reconnects
jerrinot Sep 24, 2026
0665325
fix(client): reject unpaired surrogates in table names
jerrinot Sep 24, 2026
cfe89a7
Retire aborted schema tail before first connect
jerrinot Sep 25, 2026
89423e6
Stop allocating on schema cache hits
jerrinot Sep 25, 2026
3121903
Tidy schema flag order and stale FdBig comment
jerrinot Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,9 @@ Applied by the query pool to select and fail over between the nodes in the `addr
| `client_id` | | Opaque client identifier surfaced server-side for observability |

The ingest side also accepts store-and-forward and reconnection tuning keys (`auto_flush_*`, `initial_connect_retry`,
`reconnect_*`, `request_durable_ack`, `sf_*`, `max_frame_rejections`, `poison_min_escalation_window_millis`, …).
`reconnect_*`, `request_durable_ack`, `sf_*`, `max_frame_rejections`, `poison_min_escalation_window_millis`, …) and
the schema-aware keys `schema_mode` (`auto`, `strict`, `off`) and `schema_wait_millis`; see
[docs/schema-aware-ingestion.md](docs/schema-aware-ingestion.md).
`sf_durability=periodic` checkpoints mmap-published data in the background; `sf_sync_interval_millis` defaults to `5000`
in that mode. The interval is a target cadence: JVM scheduling and storage-sync latency add to the actual loss window.
Use `request_durable_ack=on` when end-to-end server durability is also required. See the
Expand Down
22 changes: 11 additions & 11 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@
</excludes>
</configuration>
</plugin>
<!-- Packaging integration tests (JarPackagingIT): the sun.misc.FDBigInteger /
<!-- Packaging integration tests (JarPackagingIT): the versioned-shim /
module-name regressions in 1.3.5-1.3.7 were invisible to unit tests because
they run against target/classes, where Multi-Release selection never
happens. These ITs inspect and execute the packaged jar itself. -->
Expand All @@ -220,7 +220,7 @@
</configuration>
</plugin>
<!-- Adds the JDK-version-specific source root (src/main/java11 or src/main/java8)
so the FDBigInteger bridge / module-access shim compiles on each JDK. -->
so the Compat shim compiles on each JDK. -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
Expand Down Expand Up @@ -440,8 +440,8 @@
<build>
<plugins>
<!-- The shipped artifact must be the JDK 8 build: a JDK 11+ build puts the
jdk.internal.math FdBig bridge and module-info.class into the jar ROOT,
which breaks Java 8 consumers. Refuse to publish from any other JDK. -->
Java 9+ Compat shim and module-info.class into the jar ROOT, which
breaks Java 8 consumers. Refuse to publish from any other JDK. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
Expand Down Expand Up @@ -561,13 +561,13 @@
</activation>
<build>
<plugins>
<!-- JDK 8 javac can only compile the src/main/java8 FdBig bridge
(sun.misc.FDBigInteger), which does not exist on Java 9+. Package the
src/main/java11 bridge (jdk.internal.math.FDBigInteger) into
META-INF/versions/11 so the Multi-Release jar works on every JDK.
Shipping a JDK 8-built jar without this breaks double formatting on
Java 9+ with NoClassDefFoundError (the 1.3.5-1.3.7 regression), hence
a missing JDK 11 fails the build instead of skipping. -->
<!-- JDK 8 javac can only compile the src/main/java8 Compat shim, whose
multiplyHigh/onSpinWait fallbacks exist only for Java 8. Package the
src/main/java11 shim, which uses the Math.multiplyHigh and
Thread.onSpinWait intrinsics, into META-INF/versions/11 so the
Multi-Release jar picks the right variant on every JDK. The Ryu double
formatter calls multiplyHigh on every value, so a missing JDK 11 fails
the build instead of skipping. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*+*****************************************************************************
* ___ _ ____ ____
* / _ \ _ _ ___ ___| |_| _ \| __ )
* | | | | | | |/ _ \/ __| __| | | | _ \
* | |_| | |_| | __/\__ \ |_| |_| | |_) |
* \__\_\\__,_|\___||___/\__|____/|____/
*
* Copyright (c) 2014-2019 Appsicle
* Copyright (c) 2019-2026 QuestDB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/

package io.questdb.client;

import io.questdb.client.cutlass.line.LineSenderException;

/** A schema-bound row construction failure with a stable reason. */
public class LineSenderSchemaException extends LineSenderException {
public enum Reason {
INVALID_VALUE,
SCHEMA_UNAVAILABLE,
ACCESS_DENIED,
UNSUPPORTED_FEATURE
}

private final Reason reason;

public LineSenderSchemaException(Reason reason, CharSequence message) {
super(message, false);
this.reason = reason;
}

public Reason getReason() {
return reason;
}
}
Loading
Loading