Release Notes
Quark is v1.1.2 on the stable v1.x line (v1.1.0 was the hardening
minor). v1.x keeps API compatibility; breaking changes go to v2.x.
Narrative release notes for each minor live in the main repository under
docs/RELEASE_NOTES_*.md
— the current line is documented at
docs/RELEASE_NOTES_v1.1.0.md.
Patch releases are recorded in the
CHANGELOG and
the GitHub Releases, with a
short summary below. Migration steps for the most recent breaking changes are
at
docs/MIGRATION_v0.9.0.md;
v0.10 through v1.1.x introduced no breaking changes.
v1.1.2
Patch release: two schema-as-code correctness fixes surfaced by the
cross-engine acceptance harness (examples/superapp/).
ApplyPlannow renders the primary key when creating a table from a plan — auto-increment for a single integer PK, a table-level constraint for composite keys — so a plan-created table is functionally interchangeable with one created byMigrate.Columngains aPrimaryKeyfield, populated by introspection on all six engines and compared by the diff (a PK change is reported but refused by the executor: it needs a table rebuild).PlanMigrationreturns an empty plan on a freshly migrated database, as documented: m2m join tables are now part of the desired schema (the diff no longer proposes a destructiveDROPof a table Quark itself created), and catalog-decorated defaults ('x'::text,((1)), unquoted MySQL strings, bool-literal case) and type aliases (timestamp without time zone,tinyint(1), OracleTIMESTAMP(6)) no longer produce cosmetic alter ops.
No breaking changes.
v1.1.1
Patch release: four correctness fixes, three of them surfaced by the acceptance harness.
- Caché L2:
Createnow invalidates the model table tag on every insert path — on PostgreSQL/SQLite/MariaDB (RETURNING) and SQL Server (OUTPUT/SCOPE_IDENTITY), a cached table-level read no longer serves stale results after an insert (BB-15). - The migrator normalizes boolean column defaults per dialect
(
default:"1"on aboolfield now migrates on all six engines; PostgreSQL getsTRUE/FALSE). ErrInvalidIdentifieris reachable viaerrors.Ison every validation path.quark model generate --fieldscreates the--outdirectory and reports failures with a non-zero exit.
No breaking changes.
v1.1.0
Hardening release: the output of the post-v1.0 bug-bash (phases F0–F14, a
systematic cross-engine pass over the whole surface) plus the correctness fixes
it surfaced — versioned migrations on SQL Server, a MariaDB schema-diff false
positive, CreateBatch bind-parameter chunking, dialect-aware savepoints,
multi-tenant write routing, and three eager-loading fixes (BB-5…BB-13). No new
public API and no breaking changes. The 12h soak ran clean on the four
production CI engines.
See RELEASE_NOTES_v1.1.0.md.
v1.0.0
The first stable release. v1.0 closes the qualitative
v1.0 gate §A
(5/5) — most notably Oracle joining the blocking CI matrix (216/0), which
completes cross-engine coverage across all six dialects. No new public API
beyond the v0.13 surface and no breaking changes since v0.9.0; v1.0 is the
SemVer commitment to that surface. The benchmark harness gained the
code-generation tier (ent + sqlc, F6-8b), confirming codegen is a type-safety
feature rather than a speedup (ADR-0017
retired the ≥3× p99 gate). Known limitations consciously deferred to v1.1+ are
listed in the release notes.
See RELEASE_NOTES_v1.0.0.md.
v0.13.0
Phase 6 HA cut: opt-in read replicas (F6-5/F6-6). WithReplicas(dsns...)
opens read-only pools and routes multi-row reads across them round-robin while
writes stay on the primary (ADR-0015); Sticky(ctx) pins a read to the primary
for read-your-writes. A read to a replica that hits a transient connection error
fails over to the primary, and the replica is taken out of rotation for a
cooldown (WithReplicaDownCooldown, default 5s). Performance: a copy-on-write
query-builder clone shares slices and appends through a capacity-bounded
ownedAppend, dropping a "fat base" derive to 1 alloc/op. Tooling: a runnable
stress/load harness in benchmarks/stress (latency percentiles, throughput,
pool contention). Reads inside Client.Tx and under RowLevelSecurityNative
always use the primary. No breaking changes.
See RELEASE_NOTES_v0.13.0.md.
v0.12.0
Phase 6 sliver: opt-in compile-time column type-safety on top of the
code generator (F6-4). quark gen emits, per model, a <Model>Columns
value of typed column handles, and the query builder gains Query.WhereP
— WHERE conditions without magic column strings, with compile-time
checking of both the column and the bound value. Pure compile-time sugar
(ADR-0014); the string Where(...) API stays valid and interchangeable.
Performance: the audit row diff is now built only when an audit sink is
configured (~9% allocation drop on InsertOne). No breaking changes.
See RELEASE_NOTES_v0.12.0.md.
v0.11.0
Phase 6 first cut: opt-in code generation. A new quark gen
subcommand of cmd/quark parses your model package (go/packages +
go/types) and emits a quark_gen.go per package that registers typed
implementations into a runtime registry — read path (F6-2 typed
scanners) and INSERT for single-integer-PK models (F6-3a typed
binder). The reflection path stays the permanent default (ADR-0002);
codegen is fully opt-in (ADR-0014).
Comes with a reproducible benchmarks/ module (F6-8a) — Quark vs
hand-written database/sql vs GORM — and an honest profiling
finding in benchmarks/PROFILING.md: codegen ~2–5% on scan, ~1% on
INSERT. Quark's per-op CPU is dominated by database/sql and the
engine, not reflection. Generate for correctness and forward
compatibility, not for speed. No breaking changes.
See RELEASE_NOTES_v0.11.0.md.
v0.10.0
Correctness and resilience: JSON[T] / Array[T] now round-trip on
SQL Server (a []byte→VARBINARY→NVARCHAR conversion corrupted them);
rolling back to a savepoint discards the After*/OnCommit/OnRollback
hooks queued in that scope, so undone work no longer fires its
side-effects on the outer commit; a real cross-engine deadlock-retry
integration test (PG/MySQL/MariaDB) backs WithDeadlockRetry; raw SQL
under RowLevelSecurityNative emits a quark.tenant.raw_under_native_rls
warning. No breaking changes.
See RELEASE_NOTES_v0.10.0.md.
v0.9.0
Phase 5: PostgreSQL engine-enforced multi-tenancy
(RowLevelSecurityNative + the quarktenant policy CLI),
transactional After* hooks that fire post-commit plus
BeforeFind/AfterFind, Tx.OnCommit/Tx.OnRollback +
quark.TxFromContext, a real EventBus (Client.UseEventBus), and an
optional audit log (Client.EnableAuditLog) written atomically with
each write. Two breaking-minor changes — see
MIGRATION_v0.9.0.md.
v0.4.0 – v0.8.0
Phases 2–4: composable query builder (typed AST, subqueries, CTEs,
window functions, set operators, pessimistic locking); schema-as-code
migrations (introspection, pure-Go diff, transactional/resumable
apply, quarkmigrate CLI, backfill); observability + production caché
(OTel metrics, span redaction, slow-query log, stampede protection,
deadlock retry); per-column timezones and Array[T]. Per-version
notes are in-repo under docs/RELEASE_NOTES_v0.{4,5,6,7,8}.0.md.
v0.3.0
First proper tag since v0.1.1. Bundles Phase 0 P0 fixes (security, correctness) with the Phase 1 deliverables (rich types, dirty tracking, optimistic locking, soft-delete scopes). See the in-repo release notes for the full breakdown.
v0.1.0
Public release baseline.
Core
- Generic
Query[T]entry point throughquark.For[T](ctx, provider). - Immutable builder methods for predictable query composition.
- CRUD helpers for create, update, delete, hard delete, upsert, and map updates.
- Read helpers for
Find,First,List,Count, aggregates, pagination, streaming, and cursors. - Validation through
validatetags and model-levelValidate(context.Context) error. - Lifecycle hooks for create, update, and delete paths.
Dialects
- SQLite, PostgreSQL, MySQL, MariaDB, SQL Server, and Oracle dialects.
- Dialect-specific placeholders, identifier quoting, pagination, upsert SQL, generated-ID handling, JSON extraction, and DDL helpers.
- Custom dialect registration through
RegisterDialect.
Schema
Migratefor table and many-to-many join-table creation.Syncfor additive changes, renames, and controlled destructive drops.CreateIndexandAddForeignKeyhelpers.- Versioned Go migrations through
github.com/jcsvwinston/quark/migrate.
Relations
Preloadforhas_one,has_many,belongs_to, many-to-many, and polymorphic relations.- Recursive association persistence for common aggregate saves.
- Tenant context propagation through association loads and saves where tenant columns are present.
Production Features
- Transactions, manual transactions, savepoints, and nested savepoint-style callbacks.
TenantRouterwith database-per-tenant, schema-per-tenant, and row-level strategies.- Cache abstraction with memory and Redis stores.
- Query observers, middleware, and OpenTelemetry middleware.
- SQLGuard validation for identifiers, operators, and raw-query escape hatches.
Compatibility Notes
- The
cmd/quarkCLI ships and is installable viago install— it provides migration, tenant, andquark gencodegen subcommands (Operational Workflows). DeleteByandDeleteBatchperform hard deletes.Selectaccepts simple identifiers rather than arbitrary SQL expressions.- Raw SQL APIs require
AllowRawQueries: true. - Migration commands that use
migrate.Migratorshould use a client configured withAllowRawQueries: true.