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.