v26.1
This article describes the release notes for VeloDB Core v26.1.
Note VeloDB Core v26.1 was developed based on Apache Doris v4.1.
Public Preview The v26.1 series is in Public Preview: it is available for at-scale evaluation but is not yet GA. See Version Mapping for how VeloDB Cloud releases map to Apache Doris versions.
v26.1.2 (August 17, 2026)
This release updates the Apache Doris base of the v26.1 series from 4.1.2 to 4.1.3 and adds VeloDB-specific enhancements. It is primarily a stabilization release that adds a few connector and SQL capabilities and fixes correctness, crash, and data-loading issues carried over from the Apache Doris 4.1 line.
New Features
- Added Python user-defined functions, including scalar UDFs, aggregate UDAFs, and table UDTFs, so you can implement custom logic in Python in addition to Java.
- Added the
is_valid_utf8function, which returns whether a string is valid UTF-8. - Added support for zstd-compressed Stream Load, so clients can send zstd payloads in addition to the previously supported compression formats.
- Added the Iceberg
rewrite_manifestsprocedure for compacting the manifest files of an Iceberg table. - Added LZ4 compression for the Iceberg and Hive Parquet and ORC writers.
- Added
SHOW ROUTINE LOAD TASK FOR <db>.<job_name>for listing the running tasks of a specific Routine Load job. - Added support for
AES_ENCRYPTwith an internal customENCRYPTKEYin Stream Load and Routine Load column transformations.
Improvements
- Added table-level, event-driven cache warm-up, so newly written data can be warmed into the local cache as it lands and cold-read latency after ingestion is reduced.
- Improved the performance of queries that join external catalog tables with internal tables by preloading external table metadata before taking internal table locks.
- Extended workload policies with a remote scan bytes limit and username-based backend selection, giving finer control over how workloads consume compute resources.
- Added a configurable return mode for INSERT statements whose publish phase times out, so ETL jobs can choose whether a slow publish returns success or an error.
- Routine Load now reports consumption lag more promptly.
Bug Fixes
- Fixed several query planner issues that could return incorrect results, including aggregation with duplicate column aliases, set operations such as UNION, INTERSECT, and EXCEPT, cast pushdown through UNION DISTINCT, an over-eager null-aware anti-join rewrite, data-trait propagation through CTE anchors, an unsafe GROUP BY simplification, incorrect
convert_tzpartition pruning across daylight-saving transitions, and a rewrite that convertedORDER BY ... LIMITintoMAXand could drop rows. - Fixed
WITH RECURSIVEqueries returning incomplete results because recursive blocks were not sent to every scan instance. - Fixed
LIMIT ... OFFSETreturning wrong results when a merged Top-N limit was not clamped by the parent offset. - Fixed window functions returning wrong results, including
nth_valuewith an upper-bounded frame andCOUNT(DISTINCT)used as a window function. - Fixed scalar and array function issues, including
from_base64andto_base64output buffer sizing,MAKE_SETconstant folding,concat_wson nullable arrays,split_by_delimiterdropping backslash escapes,avg_weightedwhen the sum of weights is zero,array_sortlambda argument validation, boolean casts inarray_firstandarray_last, and a heap overflow inretentionwhen given more than 32 arguments. - Fixed date and time handling, including casts of legacy v1 date strings,
monthon nullable DATETIMEV2 literals, and DateTimeV2 scale not being preserved when exporting to CSV withOUTFILE. - Fixed a SIGFPE crash in integer division when dividing the signed minimum value.
- Fixed several Variant column issues, including compaction compatibility and empty-key preservation for nested Variant data, truncated sparse-path statistics when reading Variant,
element_atreturning a parsed value instead of the raw string for scalar-string Variants, JSON objects being lost when casting JSONB to Variant, and control characters not being escaped in JSONB path access. - Fixed group commit losing rows when a reused prepared statement shared a single load id.
- Fixed load transactions being aborted when a newer transaction reused the same label.
- Fixed Stream Load failing to parse IPv6 hosts, and fixed
load_to_single_tabletrouting on auto-partitioned tables. - Fixed partial column updates failing on tables that have generated columns.
- Fixed a backend crash from an unprotected tablet-writer map lookup in the load channel, and a delta-writer state lifetime issue during loading.
- Fixed MaxCompute catalog queries returning wrong results because of IN-predicate pushdown polarity and partition specs being parsed by position instead of by name.
- Fixed Iceberg issues, including a null pointer error in
COUNT(*)pushdown when the snapshot summary omitted row counters, nested decimal precision promotion, and binary columns being written with the wrong Arrow type. - Fixed JDBC catalog queries against SQL Server and Oracle pushing boolean predicates as
TRUE/FALSEinstead of1/0, and hardened JDBC catalog driver URL validation. - Fixed Hive text-format reads dropping empty records, an Avro reader crash on null values, and a backend crash on the external-table scan error path.
- Fixed inverted index reads spanning multiple segments, which could affect full-text search results.
- Fixed the
cdc_streamtable function not honoring the delete sign for CDC sources. - Fixed cloud restore so that restoring a table with
light_schema_change=falseis rejected, and table properties and partition information are rewritten correctly during restore. - Fixed materialized view refresh regressions involving excluded trigger tables and backward-compatible base-view lookups.
- Fixed
CREATE TABLEaccepting invalid IPv4 default values.
v26.1.1 (July 9, 2026)
This is the first release in the v26.1 series. It is based on Apache Doris v4.1 (build base 4.1.2-rc01), includes the fixes delivered through v26.0.4, and adds VeloDB-specific enhancements. The v26.1 series brings the full Apache Doris 4.1 feature set, so this note describes the 4.1 capabilities as they are exposed in VeloDB Core.
New Features
- Added the
search()function, which runs full-text search directly in SQL with an Elasticsearchquery_string-compatible DSL. It supports the TERM, PHRASE, WILDCARD, REGEXP, PREFIX, and NESTED operators, BM25 relevance scoring through thescore()column, multi-field search, and searching inside Variant JSON arrays without flattening them first. - Added the IVF approximate nearest neighbor vector index (
"index_type"="ivf") as a lower-memory alternative to HNSW for large-scale vector search, together with an on-disk variant ("index_type"="ivf_on_disk") for vector sets whose indexes are larger than available memory. - Added vector index quantization, including INT8 scalar, INT4 scalar, and product quantization, which reduces vector index memory by roughly 4 to 8 times at a small cost in recall.
- Added DOC mode for Variant columns, which keeps the whole JSON document as written and postpones splitting it into per-field storage until compaction. This lowers the cost of writing wide JSON documents in small batches.
- Added the V3 storage format (
"storage_format"="V3") for ultra-wide tables. It stores column metadata separately instead of packing it all at the end of each file, so tables that have tens of thousands of columns or many Variant subcolumns open faster and perform better on random reads and point queries. - Added native storage of very large JSON documents, up to roughly 100 MB each, in Variant columns. Long documents such as full conversation histories, agent execution traces, and RAG context can be stored and queried directly, without splitting them across rows or external files.
- Added Condition Cache, which caches the result of a filter condition on a segment of data and reuses it when the same filter runs again over unchanged data, so repeated queries with the same filter run faster.
- Added recursive common table expressions through
WITH RECURSIVEfor hierarchical and graph-style queries. - Added
UNNESTsyntax for expanding arrays and other nested values into rows. - Added the standard SQL
MERGE INTOstatement for performing insert, update, and delete against a table in a single statement. - Added the
json_eachandjson_each_texttable functions for expanding JSON objects into key-value rows. - Added the
array_cross_productfunction for calculating the Cartesian product of multiple arrays. - Added the
murmur_hash3_128scalar function, theexponential_moving_averageaggregate function, and DataSketches HLL aggregate functions. - Added
current_databaseas an alias for the existingdatabase()function. - Added full read and write support for Iceberg V2 and V3 tables, including row-level
UPDATE,DELETE, andMERGE INTO, together with reads of Iceberg V3 deletion vectors and row lineage. - Added Iceberg JDBC catalogs, sorted writes, static partition overwrite, and the
publish_changesprocedure. - Added Paimon JDBC catalogs and SQL operations for creating and dropping Paimon databases and tables.
- Added
CREATE TABLE,DROP TABLE, andINSERT INTOsupport for MaxCompute external catalogs. - Added a Parquet metadata table-valued function for inspecting row groups, column statistics, and other file metadata through SQL.
- Added
INSERT INTOsupport for file table-valued functions, allowing query results to be exported to HDFS or S3. - Added the
cdc_streamtable-valued function for reading MySQL and PostgreSQL change streams and using them as Streaming Job sources. - Added AWS MSK IAM authentication for Kafka Routine Load jobs.
Improvements
- Improved complex join and aggregation queries with aggregation pushdown through joins, which pre-aggregates each join input before the join to reduce the number of rows, the memory used, and the latency.
- Improved queries that compute several groupings at once (such as
GROUPING SETS,ROLLUP, andCUBE) by computing the most detailed grouping first and deriving the coarser ones from it, which reduces the work done. - Improved queries that read a single field inside a nested column (such as a field of a
STRUCT) so that only that field is read from storage, for both internal tables and ORC and Parquet external tables. - Improved queries that contain
CASE WHENthrough branch merging, branch elimination, and common subexpression extraction. - Added Query Cache, which caches the intermediate aggregation result of a query and reuses it when the same aggregation runs again over unchanged data.
- Improved execution across common operators and functions, including smarter join order and data shuffle selection and faster
LIKE,FROM_UNIXTIME, andCOUNT, which lowers overall query memory use and latency. - Enhanced spill to disk for large joins, aggregations, and sorts. The hash join, aggregation, and sort operators can now spill intermediate data to local disk in multiple levels when memory runs low, so memory-intensive queries finish on limited memory instead of failing.
- Improved large table scan throughput and memory efficiency by sizing scan batches adaptively.
- Improved vector search performance by letting an approximate nearest neighbor query read only the vector index, avoiding reads of the original vector column.
- Improved repeated Parquet queries by reusing decompressed data pages, added an Iceberg manifest cache that avoids repeatedly parsing the same manifest files during query planning, and improved Paimon query performance through a native reader.
- Sped up
ORDER BY ... LIMITqueries on indexed columns by reading the full row data only for the rows that end up in the result, and improvedexplodeandposexplodeexecution. - Improved storage of very wide JSON documents in which most keys are queried rarely. Those infrequently used keys are now spread across several internal columns and their reads are cached, which reduces read amplification and latency spikes.
- Added multi-stream updates for the primary key table model, so different data streams can each update different columns of the same table and merge by their own sequence column.
- Extended Routine Load with flexible partial column update, dynamic tuning through
ALTER ROUTINE LOAD, and adaptive batch sizing based on backlog. - Added adaptive MemTable flush scheduling, which matches write concurrency to the current cluster load in high-write scenarios.
- Extended MySQL and PostgreSQL CDC Streaming Jobs with custom table mapping, snapshot-only synchronization, PostgreSQL schema-change handling, excluded columns, and additional PostgreSQL data types.
- Added explicit starting offsets, compute-group selection, structured failure reasons, and per-job lag and progress metrics for Streaming Jobs.
- Improved full-snapshot CDC reliability for large or data-skewed tables by preventing tasks that are still making progress from being timed out and retried.
- Changed
window_funnelto use the more memory-efficient v2 implementation by default, while preserving the previous implementation aswindow_funnel_v1. InFIXEDmode, rows that match no funnel condition no longer break the sequence, so affected queries may return a longer funnel chain after upgrade. - Extended multiple aggregate and array functions to accept TIMESTAMPTZ values, and extended
max_byandmin_byto support complex types. - Added unified runtime statistics and progress reporting for running queries, so you can see how far a query has progressed.
- Added the compute group to MTMV refresh task output so refresh placement can be inspected directly.
- Improved elastic scaling in the storage and compute separation architecture, so adding or removing compute completes faster and balance scheduling no longer depends on the total number of tablets.
- Added the
information_schema.file_cache_infosystem table, which reports file cache usage by tablet, backend, and cache path so you can investigate hot data and uneven cache distribution. - Added Stream Load records to the audit log, so import history can be queried and audited alongside other statements.
- Reduced storage footprint and improved cold-read performance through better column encoding and compression, including moving the default compression toward ZSTD.
- Reduced memory pressure during row-store ingestion and when parsing sparse Variant documents.
- Added a default limit of 768 buckets per partition.
CREATE TABLEandADD PARTITIONnow reject partitions that exceed this limit.
Bug Fixes
- Fixed date and time constant folding disagreeing with runtime execution for
*_difffunctions that use nullable literals or cross year 0000, fordatediffon zero dates, and forconvert_tzacross daylight-saving transitions. - Fixed
coalescereturning NULL when a nullable floating-point argument contained an unused NaN value and a later argument supplied the expected non-NULL result. - Fixed incorrect results when runtime filters were pushed through the nullable side of an outer join.
- Fixed query plans reusing pre-aggregation state across separate join branches, which could produce an incorrect plan when the branches required different aggregation behavior.
- Fixed queries against a
SELECT *view over an external table failing with anIndexOutOfBoundsExceptionafter columns were added to the source table and its metadata was refreshed. - Fixed
tokenizereturning only one row when its first argument was constant and the query scanned multiple input rows. - Fixed
json_containstreating numerically equal JSON values such as1and1.0as different, and fixed duplicate array candidates causing incorrect containment results. - Fixed
enable_insert_strictsilently changing cast behavior for INSERT statements. Insert row filtering andenable_strict_castnow operate independently. - Fixed
COM_RESET_CONNECTIONclearing the selected database and leaving other session state partially reset, which could break pooled MySQL connections after a reset. - Fixed queries failing with an invalid-precision error when reading legacy DecimalV2 data that was written by Doris versions earlier than 2.1.0.
- Fixed
MATCHrejecting aliased Variant dot subcolumns such asmsg.trace_id, and fixed nested Variant searches binding to the wrong inverted index. - Fixed array subscripts and
element_atreturning NULL when applied to a Variant subpath that the optimizer had pruned. - Fixed sparse Variant paths inferring the wrong element type for mixed-type arrays and losing TIMESTAMPTZ values during serialization.
- Fixed background compaction failing on Variant columns that hold arrays of nested JSON objects when a row's nested value was NULL or empty.
- Fixed low or zero recall for IVF and PQ vector indexes when training used only part of a segment, and fixed ANN range-search state leaking between segments. Segments with insufficient training rows now skip index creation instead of failing the write.
- Fixed
window_funnelv2 returning an incorrect longest chain inDEDUPLICATIONandFIXEDmodes when a later starting event produced a longer valid sequence. - Fixed an MTMV skipping required refresh work after
excluded_trigger_tableschanged, and fixed partitioned MTMV checks failing when the caller supplied an immutable excluded-table set. - Fixed PostgreSQL CDC jobs with multiple tables and
offset=initialpermanently losing changes during the snapshot phase, and fixed same-named tables in matching schemas causing aDuplicate keyfailure. - Fixed
cdc_streamoffsets not surviving an FE checkpoint, which could make a resumed job continue from the wrong source position. - Fixed Stream Load failing with a broken pipe during redirected requests whose body had not been consumed, and fixed backend selection failing when backend ID differences exceeded the integer range.
- Fixed JSON ingestion mapping STRUCT subfields by position instead of by name when the input field order differed from the table schema.
- Fixed workload-group queries being resumed while their memory reservation was still unavailable, which could bypass the intended pause behavior.
- Fixed client queries hanging until socket timeout when an FE master switch caused the final result packet to be lost.
- Fixed transactional
INSERT INTO ... VALUESfailing with a null pointer in multi-compute-group deployments when a backend from another compute group was selected. - Fixed a failed
ADD PARTITIONleaving stale partition metadata when rollback started after part of the catalog update had completed. - Fixed vertical compaction exhausting memory on large rowsets because available buffer capacity was calculated incorrectly.
- Fixed migrated Iceberg tables without explicit write-format properties being read with the wrong file format, and fixed Iceberg writes ignoring a configured
object-store.pathdata location. - Fixed incorrect
COUNT DISTINCTresults on Iceberg V3 row-lineage tables and fixed position-delete files being written without required Iceberg field IDs. - Fixed Iceberg writes failing when partition values contained characters that require URL encoding, and fixed large sorted Iceberg writes failing after spilling intermediate data.
- Fixed SQL Server JDBC catalogs omitting built-in schemas from
SHOW DATABASESwhen used with newer Microsoft JDBC drivers. - Fixed Paimon JDBC system-table queries failing with
No suitable driver foundwhen the query ran through the native Paimon scan path.