immudb version 1.11.2
immudb — Changes from v1.11.1 to v1.11.2
v1.11.2 is a small maintenance release. No new user-facing SQL or server features.
Bug Fixes
- pkg/server: a statement that fails before execution (e.g. a parse error) no longer aborts the surrounding transaction — the ongoing tx now survives (
5446534c, with stdlib test1a5f54e8). - pkg/database: guard against a
nildatabase inDBManager.CloseAll, which could panic during shutdown (bfa78b34). - embedded/multiapp:
ReadAtis now served from a detached handle when the appendable cache evicts an entry mid-read, fixing a close-while-reading race (f88bfb9b). - pkg/pgsql: extended-query
Parseis guarded against zero parsed statements (empty / comment-only input) in the PG wire protocol (ce64e941). - embedded/sql: remaining row-value consumers now treat
nilslots as SQLNULL(follow-up to the v1.11.1 projection-pushdown nil fixes) (c4a5beed).
Features / Build
- embedded/appendable:
fileutilsnow supports thewasip1build target (d4b3842b).
Documentation
- New in-process embedding guide with runnable examples (
9f9679e0). - README: clarified Rust SDK status (
06ef9a6d); documentation links repointed toimmudb.io/docs/(395d0a88).
CI
- Coverage workflow no longer swallows test failures; unused codecov config removed (
24b56485). - Docker official images build path adjustments (QEMU setup action bump).
Dependencies (notable)
google.golang.org/grpc→ v1.82.1 across all modules (df6953bc)golang.org/x/netv0.55.0 → v0.57.0golang.org/x/crypto/x/net/ grpc bumped in the linear-fake examples modulegithub.com/spf13/viperv1.15.0 → v1.21.0grpc-gateway/v2,grpc-ecosystem/go-grpc-middleware,gorilla/websocket,rogpeppe/go-internalv1.9.0 → v1.15.0,jaswdr/faker,mattn/goveralls- CVE cleanup in nested Go modules (
f71bdce7) - GitHub Actions:
actions/checkout6→7,actions/setup-go6→7,actions/upload-artifact4→7,codeql-action4→4.37.4,docker/login-action3→4.5.2,docker/setup-qemu-action3→4,securego/gosec2.17.0→2.28.0
Chores
- Dropped the dead
documents_tests_deprecatedmodule (923b306f).
immudb version 1.11.1
Features
- immuadmin:
sysadminpermission now accepted byuser createanduser permissionCLI commands, enabling operators to bootstrap additional sysadmin accounts from the command line without relying solely on the defaultimmudbaccount (#2052) - auditor: new opt-in
--audit-verify-valuesflag re-reads and SHA-256-verifies each committed value after the chain proof check; any on-disk tampering surfaces as a failed audit cycle without changing default (chain-only) behavior (#2091)
Performance
- embedded/sql: index-only
COUNT(*)for indexedWHEREqueries <80><94>SELECT COUNT(*) FROM t WHERE indexed_col = ?no longer fetches full rows, satisfying the count entirely from the secondary index (#2093) - embedded/sql:
reduceBoolfast path avoids per-row heap-boxing of boolean expressions in theCOUNT(*)hot path; combined with hoistingsubstituteandEncodeSelectorout of the per-row loop, a 50k-row composite-indexCOUNT(*)drops from 20.87 ms to 14.92 ms and from 234k to 150k allocations/op - embedded/store: hot-path allocation and lock-contention reductions on critical read/write paths
- embedded/appendable/remoteapp: range-fetch
ReadAt<80><94> issues a bounded range request (~256 KiB window) instead of downloading the entire chunk; for a 4 MiB chunk with a 64 B tail read, bytes on the wire shrink from 4 MiB to ~256 KiB - embedded/appendable/remoteapp: background prefetch pipelines the next read window to hide latency on sequential scans
- remote/s3 (Wave 4): drop upload-verify round-trips, parallel chunk prefetch, end-to-end compression
Bug Fixes
- embedded/sql: two server-crashing panics introduced in v1.11.0 (#2100):
- Nil pointer dereference in the disk-spill sort path: large
ORDER BY <E2><80><A6> OFFSETresult sets that spill to disk panicked because projection-pushdown left unaccessed column slots asnil; the encode path now substitutes a typedNULLfor nil slots - Index out-of-range in
db.SQLQuery: empty or comment-only SQL input (accepted by the parser since v1.11.0) returned an empty statement slice, causing a crash; alen(stmts) == 0guard now returnsErrExpectingDQLStmt
- Nil pointer dereference in the disk-spill sort path: large
- embedded/sql: standalone
COUNT(col)returned 0 for any non-empty table;CountValue.ColBounded()now returnstruefor bothCOUNT(col)andCOUNT(DISTINCT col), preserving SQLNULL-skip semantics (#2042) - embedded/sql:
TIMESTAMPparameter binds with timezone suffixes (Z,<C2><B1>HH:MM) were rejected by the PG wire bind path; space-separated layouts are now accepted alongside RFC3339 (#1149) - embedded/sql: parametrized
SELECT WHERE col = $1reused the first bound value on subsequent executions of a cached prepared statement;substitute()now returns fresh AST nodes instead of mutating the cached receiver (#1153) - embedded/store: database permanently unrecoverable after ungraceful shutdown (e.g. OOMKill) that left more pre-committed transactions on disk than
MaxActiveTransactions; the recovery path now grows the precommit buffer dynamically (doubling on overflow) instead of returningErrBufferIsFull(#2086) - embedded/store: hard 60-second ingestion freeze on every indexing error replaced with bounded exponential backoff (100 ms doubling to 60 s, reset on a fully successful iteration) (#2061)
- embedded/store: supplying different
MaxValueLen,MaxKeyLen,MaxTxEntries, orFileSizevalues on store re-open was silently ignored; a warning is now emitted naming both the supplied and stored values (#1864) - pkg/server:
DatabaseListV2failed entirely when any database was closed or unloadable; unloaded databases now appear in the listing withLoaded=false, NumTransactions=0(#1997) - docker: almalinux-8-minimal image failed to start with
permission deniedon/var/lib/immudb/immudb.identifierdue to a UID/GID mismatch (directories owned by 65532, runtime userimmurunning as 3322);IMMU_UID/IMMU_GIDare now consistently set to 3322 (#2098)
CI
- docker: official images are now built for
linux/amd64andlinux/arm64viadocker buildx; Go cross-compiles natively on the build platform without QEMU (#2069)
Dependencies
golang.org/x/cryptov0.48.0 <86><92> v0.52.0 (8 HIGH + 5 MEDIUM CVEs)golang.org/x/netv0.50.0 <86><92> v0.55.0 (7 HIGH + 1 MEDIUM CVEs)golang.org/x/sysv0.41.0 <86><92> v0.45.0 (CVE-2026-39824, required transitively)github.com/jackc/pgx/v5v5.9.1 <86><92> v5.9.2 (CVE-2026-41889)github.com/sirupsen/logrusv1.8.1 <86><92> v1.9.3 (DoS viaEntry.Writer())urllib3(test/e2e) <86><92> v2.7.0 (CVE-2026-44432, GHSA-2xpw-w6gg-jr37)
Immudb version 1.11.0
v1.11.0 — PostgreSQL Compatibility and SQL Feature Expansion
- Structured audit logging: New --audit-log flag records all gRPC operations as tamper-proof JSON events in systemdb, filterable via --audit-log-events (all/write/admin).
- PostgreSQL ORM compatibility: Added pg_catalog and information_schema virtual table resolvers to support ORM introspection from Django, SQLAlchemy, GORM, and ActiveRecord.
- immudb verification functions via SQL: immudb_state, immudb_verify_row, immudb_verify_tx, immudb_history, and immudb_tx are now accessible as SQL functions over the PostgreSQL wire protocol.
- PostgreSQL compatibility functions: current_database, current_schema, current_user, format_type, has_table_privilege, and many others; plus SHOW statement emulation for common ORM config queries.
- Subquery support: EXISTS, NOT EXISTS, IN, and NOT IN subqueries now fully implemented in the SQL engine.
- New JOIN types: CROSS JOIN and FULL OUTER JOIN added.
- Set operations: EXCEPT and INTERSECT implemented.
- New SQL functions: Math (ABS, CEIL, FLOOR, ROUND, POWER, SQRT, MOD), string (REPLACE, REVERSE, LEFT, RIGHT, REPEAT, POSITION), and conditional (NULLIF, GREATEST, LEAST).
- ORDER BY enhancements: NULLS FIRST / NULLS LAST syntax supported.
- Upserts: INSERT ... ON CONFLICT DO UPDATE SET implemented.
- Views: CREATE VIEW / DROP VIEW (session-scoped, not persisted to catalog).
- CTEs: WITH clause (Common Table Expressions) materialized and referenceable in the main query.
- Window functions: ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, FIRST_VALUE, LAST_VALUE, NTILE, plus windowed aggregates (COUNT, SUM, MIN, MAX, AVG).
- EXPLAIN statement: Returns a human-readable query plan for any SELECT.
v1.11.0-RC2
v1.11.0 — PostgreSQL Compatibility and SQL Feature Expansion
- Structured audit logging: New --audit-log flag records all gRPC operations as tamper-proof JSON events in systemdb, filterable via --audit-log-events (all/write/admin).
- PostgreSQL ORM compatibility: Added pg_catalog and information_schema virtual table resolvers to support ORM introspection from Django, SQLAlchemy, GORM, and ActiveRecord.
- immudb verification functions via SQL: immudb_state, immudb_verify_row, immudb_verify_tx, immudb_history, and immudb_tx are now accessible as SQL functions over the PostgreSQL wire protocol.
- PostgreSQL compatibility functions: current_database, current_schema, current_user, format_type, has_table_privilege, and many others; plus SHOW statement emulation for common ORM config queries.
- Subquery support: EXISTS, NOT EXISTS, IN, and NOT IN subqueries now fully implemented in the SQL engine.
- New JOIN types: CROSS JOIN and FULL OUTER JOIN added.
- Set operations: EXCEPT and INTERSECT implemented.
- New SQL functions: Math (ABS, CEIL, FLOOR, ROUND, POWER, SQRT, MOD), string (REPLACE, REVERSE, LEFT, RIGHT, REPEAT, POSITION), and conditional (NULLIF, GREATEST, LEAST).
- ORDER BY enhancements: NULLS FIRST / NULLS LAST syntax supported.
- Upserts: INSERT ... ON CONFLICT DO UPDATE SET implemented.
- Views: CREATE VIEW / DROP VIEW (session-scoped, not persisted to catalog).
- CTEs: WITH clause (Common Table Expressions) materialized and referenceable in the main query.
- Window functions: ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, FIRST_VALUE, LAST_VALUE, NTILE, plus windowed aggregates (COUNT, SUM, MIN, MAX, AVG).
- EXPLAIN statement: Returns a human-readable query plan for any SELECT.