v1.3.0
Release date: October 28, 2026
GreptimeDB v1.3.0 adds native histogram ingestion, a semantic entity graph over metrics and traces, an opt-in trace schema with JSON2 attributes, and automatic retries for distributed writes. It also fixes incorrect SQL and PromQL results, write routing during schema changes, and storage recovery failures.
👍 Highlights
Ingest native histograms without experimental switches
Prometheus Remote Write v2 native histograms and cumulative OTLP/HTTP exponential histograms are accepted by default. PromQL can query native histograms, including quantiles and fractions. Remote Write v1 native histograms, native histogram Remote Read, and OTel Arrow exponential histograms remain unsupported. (#9301, #8758, #8874)
Trace V2: JSON2 attributes with Jaeger and semantic entity graph support
The opt-in greptime_trace_v2 pipeline stores span, scope, and resource attributes in three JSON2 columns instead of adding a SQL column for every attribute. Its 19-column schema also preserves span events and links as JSON arrays. Jaeger queries and semantic entity graph derivation support the new model.
Select greptime_trace_v2 with the x-greptime-pipeline-name header on OTLP trace ingestion requests. Use a separate destination table from Trace V1. After ingesting into a table named traces_v2, query typed attributes directly:
SELECT
trace_id,
span_attributes."http.status_code"::BIGINT AS http_status,
resource_attributes."service.name"::STRING AS service_name
FROM traces_v2;
Existing Trace V1 tables are not automatically migrated. Events and links use JSON in this release; ARRAY(JSON2) is deferred. See #9192, #9232, #9257, and #9278.
Semantic entity graph (experimental)
Semantic entity graph is experimental. Future releases may introduce breaking changes.
GreptimeDB derives an entity graph of services, hosts, containers, and Kubernetes objects from metrics and traces at query time, using built-in conventions for OpenTelemetry, Prometheus, and Kubernetes data. Query it with SQL through greptime_private.semantic_entities and greptime_private.semantic_relationships. information_schema.table_semantics shows what each table contributes to the graph, and ALTER TABLE ... SET/UNSET adjusts a table’s semantic options. GreptimeDB MCP Server v0.6.0 and later lets AI agents query the graph through query_semantic_graph and find tables by concept through search_table_semantics.
See #8614, #8854, #8880, #8904, #8936.
Retry distributed writes without replaying successful entries
Frontends retry transient distributed write failures up to three times by default, refreshing routes when regions move or partitions change. Per-datanode batches remain intact, and partial-failure responses let the frontend retry failed entries without replaying acknowledged successes. Whole-RPC failures can still have an uncertain outcome. Retries do not provide exactly-once ingestion. (#9542, #9543, #9728, #9720)
The frontend defaults are:
[write_retry]
max_retries = 3
initial_backoff = "1500ms"
max_backoff = "10s"
backoff_multiplier = 2.0
Set max_retries = 0 to disable retries. These settings apply to distributed frontends, not standalone deployments.
Improved compaction algorithms and TWCS tuning
TWCS reduces repeated rewrites for continuously ingested time-series data and lets you tune compaction separately for active and inactive time windows.
Three new tuning options accompany the renamed active-window file-count trigger; the example below shows their defaults:
ALTER TABLE my_table SET
'compaction.twcs.active_window.trigger_file_num' = '4',
'compaction.twcs.active_window.l1_merge_trigger' = '16',
'compaction.twcs.inactive_window.trigger_file_num' = '2',
'compaction.twcs.inactive_window.l1_merge_trigger' = '8';
The existing compaction.twcs.trigger_file_num option remains accepted as an alias for compaction.twcs.active_window.trigger_file_num; inactive windows now use their own thresholds. See #8989, #9064, and #9011.
Query and write correctness fixes
- SQL and PromQL fixes preserve matching rows and requested ordering, retain
IGNORE NULLSsemantics, and prevent NaN ratios from triggering false alerts. They also correct folded-histogram operations and logical metric-table ordering. (#9600, #10026, #9601, #9479, #9509, #9522) - Fulltext bloom indexes no longer skip matching rows containing underscores or mixed Han and ASCII text. Eligible case-sensitive
LIKEpatterns can also use bloom pruning; see Upgrade notes for rebuilding existing indexes. (#9470) - Storage fixes preserve newer writes during bulk merges, flush skip-WAL writes on graceful region close, and keep repartition routing consistent. Flush and compaction also retain SSTs after ambiguous manifest-save failures instead of deleting files that may already be referenced. (#9517, #9440, #9458, #9898)
Dashboard
The bundled Dashboard v0.14.2 adds Signals Explore for exploring metrics, logs, and traces with label filters and links between logs and traces. Native and gauge histograms are not charted yet. Timezone settings apply consistently to display and SQL requests, including the browser's IANA timezone when Browser is selected. This version also fixes log scrolling, loading indicators, and trace-ID queries. (Signals Explore, timezone settings, v0.14.2)
JSON result columns also retain the per-column action to show or hide null fields introduced during beta.1 (dashboard#653).


Authentication
Bearer-token authentication is now supported over HTTP and SQL protocols, and MySQL authentication methods can be selected per user. (#8719, #8899, #9078)
Upgrade notes
- Keep metasrv maintenance mode enabled throughout a rolling upgrade so Batch GC does not run against mixed metasrv/datanode versions: its new packed protocol has no legacy fallback. Disable maintenance mode only after the upgrade is complete. (#9009)
- Upgrade all datanodes before frontends; roll back frontends before datanodes. New frontend write retries require per-entry datanode results: mixing new frontends with old datanodes can replay successful writes and duplicate rows in append-mode tables. New PromQL plans also use functions absent from older datanodes; operator-managed rollbacks must also stage frontends first. (#9720, #9479)
- Review
region_engine.mito.scan_memory_limit, which now defaults to25%of available system memory, andscan_memory_mode, which defaults tobasicand accounts for projected Parquet row-group decoding. Existing explicit nonzero limits also change behavior:basicno longer charges cumulative streamed batches. Useextendedto account for both decoding and streamed batches, but review capacity because the same limit may now reject previously successful scans. Explicitly setscan_memory_limit = "unlimited"to retain disabled scan enforcement and file-count checks; this does not restore the old series-merge memory pool. (#9101) - Replace
scan_memory_on_exhausted = "wait"or"wait(<duration>)"with"fail": old values still load but are normalized to immediate failure. Reviewquery.memory_pool_size, now shared by internal two-phase series merges, and scan-memory alerts, whose usage metric now reflects decoder reservations in basic mode and reservations plus streamed batches in extended mode. (#9101) - Check existing VRL pipelines for environment, filesystem, hostname, local-timezone, network, and explicit logging functions. These functions, Grok file imports, and local or dynamic timezone arguments are rejected by default, including when stored pipelines reload; set
pipeline.allow_vrl_host_access = trueonly if those capabilities are required. (#9610) - Rebuild legacy fulltext bloom indexes through compaction or
ADMIN BUILD_INDEXto regain pruning. Table data remains readable, but legacy bloom index blobs are bypassed until rebuilt. New v2 blobs also fall back to scans after downgrade, and Han bigram tokenization can increase index size. Tantivy-backedmatches_termnow uses a full scan;matches()is unchanged. (#9470) - Remove the obsolete native-histogram experimental switches: they are ignored, including values set to
false. Keepprom_validation_modeunder[prom_store]. (#8744, #9301) - Review automatic flush frequency if it was not configured: the Mito default changes from 30 minutes to 10 minutes. Explicit global and per-table overrides remain unchanged. (#8971)
- Flow mirroring has a one-million-row pending budget, counting copies sent to each flownode. Ordinary writes can succeed while their Flow mirror batches are dropped, leaving gaps in Flow output; instant-TTL writes are rejected before datanode dispatch when the budget is exhausted, and a single oversized instant-TTL batch must be split. Monitor
greptime_table_operator_mirror_pending_rowsandgreptime_operator_dist_mirror_dropped_rows. (#9421) - Existing JSON2 regions recover with flat SST output; CREATE and ALTER reject incompatible SST formats. JSON2 bulk inserts remain unsupported and are rejected before WAL persistence. (#9893, #9698)
Breaking changes
uddsketch_stateanduddsketch_mergenow produce a new binary format. v1.3 reads legacy states, but v1.2.1 readers do not understand newly produced states; preserve pre-upgrade state data if rollback is required, and do not send new states to old readers. (#8867)- OTLP metrics with a nonempty
service.namespacenow usejob="<namespace>/<service.name>"instead of just the service name. Update dashboard selectors and alert rules; existing rows are not relabeled, so queries spanning the upgrade may need both label values. This change applies even whenotlp.experimental_enable_resource_infois disabled. (#8904) - OTLP delta metrics use the reserved
otlp_aggregation_temporality="delta"label. Existing series carrying this label also use raw-delta semantics for PromQLrate()andincrease(); OTLP attributes resolving to the reserved label are rejected. Fixed-schema tables need the nullable tag to accept delta writes. (#8970) - DataFusion 55.1 changes integer-input
median,approx_median, andapprox_percentile_contresults to floating point; exact median interpolates even-sized inputs. Review fixed-schema consumers such as views and Flow sinks, and expect approximate aggregate results to differ. (#8555, #9177) REPLACE(s, '', replacement)returnssunchanged; generated structunnestcolumn names change, so use explicit aliases. PostgreSQL result metadata now reports OID aliases such asREGCLASSandREGTYPErather than only their former integer or string types. (#8555)- MySQL timestamp text output truncates fractional seconds to microseconds. Stored nanoseconds remain unchanged; use an explicit string or integer cast when a client needs the full precision. (#9831)
- SQL expression depth above 128 is rejected during planning. Simplify deeply nested generated predicates. (#9564)
- Decompressed Prometheus Remote Read/Write and Loki bodies above 512 MiB return HTTP 400. With
max_in_flight_write_bytesconfigured, HTTP admission also charges decoded bodies and streamed bytes beyondContent-Length; quota exhaustion returns HTTP 429 or gRPCRESOURCE_EXHAUSTED. Compressed gRPC requests reservemax_recv_message_sizebefore decoding, so review the quota and client batch sizes rather than relying on compressed wire size. (#9264) - JSON2 type hints no longer accept
nullableordefault; hinted fields are nullable and missing values produce NULL. Supported hint types are STRING, BIGINT, BIGINT UNSIGNED, DOUBLE, and BOOLEAN, plus INT64, UINT64, and FLOAT64 aliases; types requiring implicit widening are rejected. (#9213, #9316) - Invalid JSONPath expressions now return errors instead of silently returning NULL; use
$for root access instead of.or$.. (#9192) - PromQL vector matching now derives result labels from
on/ignoringand group modifiers, and rejects ambiguous many-to-many or duplicate-result matches. Review joins and alert label templates; eligible comparisons now retain__name__. (#9306, #9332) - PromQL stepless subqueries use a fixed one-minute step rather than the outer query step; specify
[range:step]explicitly if a different interval is required. Range queries over a range-vector root are rejected; use an instant query or reduce the range vector to an instant vector. (#9481, #9477) - Finite Prometheus sample strings can change textual formatting while retaining the same floating-point value. Compare parsed numbers instead of exact response strings. (#8815)
- Type changes to columns referenced by persisted partition expressions are rejected unless they widen a timestamp unit and all bounds remain representable. Check partition bounds before changing time precision, especially dates outside the nanosecond timestamp range. (#9487)
- Duplicate region-engine configuration entries now fail startup instead of silently overriding each other. Keep one entry per engine type. (#9281)
- Bulk inserts now reject mismatched Arrow types, invalid nulls, and duplicate or unknown columns before persistence. Some representations previously converted by primary-key-format regions are rejected; send the region's declared Arrow types. (#9698)
- Streaming SQL analyze is always enabled; the removed
experimental_enable_explain_analyze_streamconfiguration key is ignored. Downstream Rust integrations must remove the correspondingHttpOptionsfield. (#8966) - Downstream DDL configurators must accept the shared peer-discovery interface. This release includes only the DDL-hook adaptation from the original change, not its affinity-resolver or scheduling infrastructure. (#9977)
- refactor!: move native histogram config and
prom_validation_modeto prom_store by @shuiyisong in #8744 - perf(servers)!: speed up Prometheus JSON response building with ryu and per-series entry reuse by @discord9 in #8815
- feat!: stabilize streaming analyze metrics by @discord9 in #8966
- feat!: upgrade DataFusion to 55 by @discord9 in #8555
- feat(json2)!: remove nullable and default type hint options by @fengys1996 in #9213
- feat!: upgrade DataFusion fork to 55.1.0 by @discord9 in #9177
- fix(pipeline)!: disable VRL host access by default by @shuiyisong in #9610
- feat(mito2)!: account SST decoding against shared scan memory limits by @evenyag in #9101
- fix(mysql)!: cap timestamp output at microsecond precision by @MichaelScofield in #9831
🚀 Features
- feat(query): plan native histogram functions by @shuiyisong in #8705
- feat(logging): add enable_file_logging option to disable file logging by @xhwhis in #8721
- feat(function): add json_object_keys scalar function by @xhwhis in #8722
- feat: update dashboard to v0.13.11 by @sunchanglong in #8737
- feat: add health-aware gRPC client routing by @WenyXu in #8684
- feat(grafana): add events dashboard by @WenyXu in #8725
- feat: add admin function registrar by @fengjiachun in #8762
- feat(promql): define native histogram semantics by @shuiyisong in #8758
- feat(mito2): add range-based metric series reader by @evenyag in #8703
- feat: read-time entity relationships graph over telemetry (M0+M1) by @killme2008 in #8614
- feat(protocol): validate native histogram ingestion by @shuiyisong in #8775
- feat: support generic heartbeat response extension accumulation by @fengjiachun in #8786
- feat: support old-stage datanode config overlays by @discord9 in #8647
- feat: update opentelemetry family to 0.32 series by @sunng87 in #8776
- feat: add riscv64 cross-build support by @v0y4g3r in #8820
- feat(auth): support HTTP bearer-token authentication by @sunng87 in #8719
- feat(promql): support mixed sample ranges by @shuiyisong in #8784
- feat: declared edges and the derivation contract for the entity graph by @killme2008 in #8794
- feat(servers): stamp prometheus remote write v2 metadata as semantic table options by @killme2008 in #8797
- feat(promql): support native histogram vector operators by @shuiyisong in #8798
- feat: complete the derived-edge vocabulary of the entity graph by @killme2008 in #8836
- feat(servers): expose native histograms over Prometheus HTTP by @shuiyisong in #8850
- feat(promql): support native histogram aggregations by @shuiyisong in #8848
- feat: embedded convention pack for the entity graph (prom/k8s, gen_ai naming) by @killme2008 in #8854
- feat(mito2): introduce two-phase metric series scans by @evenyag in #8826
- feat: add json_object function and use it in the entity-graph derivation by @killme2008 in #8870
- feat: update dashboard to v0.13.12 by @sunchanglong in #8882
- feat: add incremental primary key index writer by @evenyag in #8788
- feat: manage semantic table options via ALTER TABLE SET/UNSET by @killme2008 in #8880
- feat(otlp): report the cause of rejected trace spans by @killme2008 in #8897
- feat: otlp duration_nano and trace_flag signed integer coercion by @sunng87 in #8816
- feat: support quantile and fraction queries on mixed histograms by @shuiyisong in #8874
- feat(otlp): support cumulative exponential histograms by @shuiyisong in #8900
- feat(cmd): add parquet development tools by @evenyag in #8939
- feat(mito2): add series index searcher by @evenyag in #8926
- feat(cmd): improve parquet rewrite fidelity and scanbench output by @evenyag in #8947
- feat(function): expose uddsketch rank by @v0y4g3r in #8929
- feat: synthesize OTLP resource descriptor for the semantic entity graph by @killme2008 in #8904
- feat: update dashboard to v0.13.14 by @sunchanglong in #8968
- feat: harden frontend heartbeat extensions by @v0y4g3r in #8803
- feat(meta): record physical table reconciliation events by @dhruvxvaishnav in #8935
- feat: expose missing SST manifest fields by @evenyag in #8965
- feat: Add built-in daemon mode for standalone service by @tian1220A in #8960
- feat: report what the graph derives and fix two duplicate-node bugs by @killme2008 in #8936
- feat(function): add mergeable stddev_pop state functions by @v0y4g3r in #8972
- feat(mito2): add SST range index writer by @evenyag in #8954
- feat(query): add experimental DataFusion spill-to-disk controls by @discord9 in #8884
- feat(mito2): add write cache upload hook by @v0y4g3r in #8992
- feat(flow): add generic delta merge for incremental aggregates by @discord9 in #8938
- feat: allow widening the time index column's timestamp unit via ALTER TABLE, mito2 table only by @sunng87 in #8894
- feat: derive k8s.node from OTLP resource attributes by @killme2008 in #9002
- feat(runtime): add weighted workload scheduler by @discord9 in #8736
- feat(flow): add row inserts to frontend client by @fengys1996 in #9006
- feat: preserve row sequences and support exact sequence-range reads by @discord9 in #8865
- feat(mito2): pass operation type to write cache upload hook by @v0y4g3r in #9012
- feat(mito2): add SST range index searcher by @evenyag in #9003
- feat: support raw OTLP delta metrics by @shuiyisong in #8970
- feat(flow): support eval schedule offsets by @discord9 in #8878
- feat(client): compress insert transport by @v0y4g3r in #9036
- feat(meta): record logical-table reconciliation events by @dhruvxvaishnav in #8941
- feat: add scanbench query suites and structured results by @evenyag in #9050
- feat: update dashboard to v0.13.15 by @sunchanglong in #9051
- feat(auth): support bearer token authentication over SQL protocols by @shuiyisong in #8899
- feat(telemetry): add log directory size retention by @WenyXu in #8997
- feat(mito2): add series index catalog and lifecycle foundation by @evenyag in #9053
- feat(auth): support per-user MySQL authentication methods by @shuiyisong in #9078
- feat: make the series index resilient to time index unit widening by @sunng87 in #8996
- feat(mito2): introduce TWCS active window compaction by @v0y4g3r in #9011
- feat: add repartition partition count hint by @WenyXu in #9080
- feat(json2): support ALTER syntax for JSON column settings by @fengys1996 in #9094
- feat: support request-level insert WAL skipping by @WenyXu in #9088
- feat(meta): record catalog and database reconciliation events by @dhruvxvaishnav in #8896
- feat(mito2): add series index planning and builders by @evenyag in #9085
- feat: support request-level WAL skipping for bulk inserts by @WenyXu in #9110
- feat(mito2): add opt-in byte-stream-split encoding for float SST fields by @discord9 in #9069
- feat(mito2): reconcile series indexes in background by @evenyag in #9086
- feat: export logical tables from Metric physical scans by @fengjiachun in #9159
- feat: allow re-enabling WAL after disabling by @dhruvxvaishnav in #9130
- feat: use exact sequence ranges for incremental Flow reads by @discord9 in #9165
- feat: add prepared batch write primitives by @WenyXu in #9186
- feat(wal): add the object store WAL provider identity and configuration by @fengjiachun in #9203
- feat: add ordinary table batching workers by @WenyXu in #9187
- feat(log-store): add the object store WAL object format by @fengjiachun in #9200
- feat: batch ordinary table writes across HTTP protocols by @WenyXu in #9115
- feat(otlp): add trace v2 ingestion with JSON2 attributes by @MichaelScofield in #9192
- feat(ci): add observability benchmark and lifecycle summaries by @WenyXu in #9215
- feat: prepare and execute database Metric exports by @fengjiachun in #9180
- feat(ci): add long-range metrics benchmark on ECS by @WenyXu in #9218
- feat(flow): expose extension-owned batching execution hooks by @discord9 in #9171
- feat(function): add mergeable binary average states by @discord9 in #9062
- feat(log-store): add the object store WAL batch, catalog and I/O by @fengjiachun in #9216
- feat(otlp): preserve trace v2 events and links as JSON (follow-up to #9192) by @MichaelScofield in #9232
- feat(flow): admit mergeable average states in incremental plans by @discord9 in #9235
- feat(log-store): add object store WAL store construction and recovery by @fengjiachun in #9238
- feat: expose region min/max timestamp in region_statistics by @sainad2222 in #9060
- feat: add status label to datanode failed-insert metric by @dhruvxvaishnav in #9191
- feat(mito2): make range index reads and builds opt-in by @evenyag in #9219
- feat(json2): respect type hints during JSON2 type concretization by @fengys1996 in #9222
- feat(mito2): split SWCS output files by size threshold by @v0y4g3r in #9259
- feat(trace): support Jaeger queries for Trace V2 and optimize writes (follow-up to #9192) by @MichaelScofield in #9257
- feat: update pgwire to 0.41 by @sunng87 in #9025
- feat: add database ingestion admission through metering by @shuiyisong in #9239
- feat: add experimental Metric export to V2 snapshots by @fengjiachun in #9233
- feat: restore packed metric snapshots by @fengjiachun in #9250
- feat(trace): support Semantic Graph for Trace V2 (follow-up to #9192) by @MichaelScofield in #9278
- feat: add experimental Jev SQL filtering by @v0y4g3r in #9265
- feat(log-store): add object store WAL reads and obsolete watermarks by @fengjiachun in #9248
- feat(json2): support altering JSON2 settings by @fengys1996 in #9029
- feat: add AI matching, classification, and scoring functions by @v0y4g3r in #9300
- feat: share logical table batching with OTLP metrics by @WenyXu in #9288
- feat(flow): allow execution hook to rewrite completed plans by @discord9 in #9290
- feat: support pending rows batching for MySQL and PostgreSQL by @WenyXu in #9302
- feat: expose region open failure metrics by @evenyag in #9283
- feat(flow): freeze recovery windows and retention bounds for incremental flows by @discord9 in #9312
- feat: add schema metadata stream to SchemaManager by @shuiyisong in #9325
- feat: enable native histogram ingestion by default by @shuiyisong in #9301
- feat(mito): limit approximate series index disk usage by @evenyag in #9313
- feat(log-store): chain object store WAL objects and recover the latest chain by @fengjiachun in #9334
- feat(otlp): add histogram rejection metrics and compact zero buckets by @shuiyisong in #9321
- feat: add manual series index reconciliation by @evenyag in #9323
- feat(log-store): add the object store WAL durable write path by @fengjiachun in #9320
- feat: allow customized time index unit for metric engine table by @sunng87 in #9236
- feat: add HDFS object storage backend by @Minghan2005 in #8701
- feat(log-store): add the enqueued acknowledgement mode to the object store WAL by @fengjiachun in #9358
- feat(query): implement PromQL @ modifier on vector and matrix selectors by @discord9 in #9224
- feat: support non-millisecond time index units in the logical batcher by @sunng87 in #9346
- feat: export Metric snapshots with packed Parquet objects by @fengjiachun in #9382
- feat: support automatic column addition for Flight bulk inserts by @v0y4g3r in #9285
- feat(json2): json_get respect type hints by @fengys1996 in #9349
- feat: update dashboard to v0.14.0 by @sunchanglong in #9510
- feat(catalog): declare information-schema table scopes by @shuiyisong in #9504
- feat(cmd): add
--http-api-server-addrCLI flags by @daviderli614 in #9512 - feat(client): support region request reuse and route refresh hints by @WenyXu in #9540
- feat(operator): retry failed writes with refreshed partitions by @WenyXu in #9542
- feat(frontend): retry transient distributed write failures by @WenyXu in #9543
- feat(meta-client): forward actor and event context for region follower RPCs by @sunng87 in #9568
- feat: update dashboard to v0.14.2 by @sunchanglong in #9570
- feat: improve SQL analyze scan diagnostics by @evenyag in #9565
- feat: return per-entry region write failures by @WenyXu in #9728
- feat(mito): add an environment switch to disable compaction by @WenyXu in #9863
- feat(mito): expose scan concurrency metrics and dashboard by @evenyag in #9758
- feat: support query concurrency limits in standalone by @evenyag in #9958
🐛 Bug Fixes
- fix(mito2): prioritize newer compaction windows by @v0y4g3r in #8714
- fix(auth): warn when credential load disables Postgres SCRAM or drops a line by @killme2008 in #8652
- fix(object-store): skip removed-entry lister test on Windows by @discord9 in #8735
- fix(query): preserve remote dynamic filter target by @discord9 in #8615
- fix(operator): invalidate local cache after dropping view by @WenyXu in #8748
- fix(ci): render query regression bot comment as compact table plus threshold details by @discord9 in #8774
- fix(mito2): avoid region worker panic when building a WAL entry fails by @fengjiachun in #8810
- fix(ci): identify team members by repository permission by @killme2008 in #8822
- fix(tests): make two Windows CI failures deterministic (Nightly CI #8837) by @discord9 in #8840
- fix(ci): grant pull-requests write and stop counting drafts by @killme2008 in #8844
- fix(mito2): publish committed sequence only after rows are installed by @discord9 in #8862
- fix: cap default runtime sizes to a minimum of 2 threads by @v0y4g3r in #8908
- fix(meta): avoid blocking runtime on stats cache lock by @WenyXu in #8910
- fix(flow): restore FrontendClient::sql API by @WenyXu in #8963
- fix(flow): avoid insert select HTTP/2 stalls by @discord9 in #8962
- fix(operator): whitelist private system table auto create by @WenyXu in #8930
- fix(cmd): configure meta client in frontend plugin test by @v0y4g3r in #8977
- fix: increase system disk size to 50 GiB for ECS instances by @paomian in #8986
- fix(cmd): gate daemon integration test on Unix by @discord9 in #8987
- fix(mito2): avoid chained L1 rewrites in TWCS by @v0y4g3r in #8981
- fix: add disk usage logging to GitHub step summary in query regression workflow by @paomian in #9005
- fix(client): isolate query and control transports by @discord9 in #8990
- fix(mito2): harden flat merge and use winner_tree by @v0y4g3r in #9064
- fix: prevent catalog testing feature from leaking into production builds by @evenyag in #9063
- fix(ci): avoid cross-references in PR limit comments by @evenyag in #9065
- fix(servers): return text[] for SELECT array[null] in PostgreSQL protocol by @Tyagiquamar in #9058
- fix(ci): strip pre-release extension when creating nightly release version by @sunng87 in #9081
- fix(ci): check Windows test targets before merge by @WenyXu in #9116
- fix(ci): increase query regression ECS disk to 80 GiB by @discord9 in #9123
- fix(promql): preserve native timestamps through sample selection by @discord9 in #9070
- fix: configure series indexes with an enable flag by @evenyag in #9141
- fix(mito2): deliver complete WAL entries without waiting for next input by @discord9 in #8916
- fix(servers): resolve port from IPv6 bind addresses by @immanuwell in #9142
- fix(mito2): preserve effective sequences during compaction by @v0y4g3r in #9147
- fix: register region migration procedures before returning IDs by @fengjiachun in #9163
- fix: preserve structured query errors through distributed execution by @discord9 in #9161
- fix(promql): skip empty batches in SeriesDivide stream by @discord9 in #9178
- fix(ci): rerun semantic PR checks after pushes by @evenyag in #9190
- fix(mito2): preserve last-non-null values across compaction by @v0y4g3r in #9169
- fix: support exact sequence ranges in two-phase series scans by @discord9 in #9096
- fix(ci): repair agent observability dispatch and runner cleanup by @WenyXu in #9204
- fix(json): fix JSONPath panic with jsonb 0.5.6 (follow-up to #9192) by @MichaelScofield in #9228
- fix(servers): merge duplicate timeseries across RecordBatches in Prometheus remote read by @Tyagiquamar in #9032
- fix(prometheus): honor label matchers in name values query by @killme2008 in #9134
- fix(mito2): hold the bulk compact permit for the whole blocking task by @killme2008 in #9252
- fix: make database export assertions portable on Windows by @fengjiachun in #9256
- fix(mito2): cancel cache construction for incomplete scans by @killme2008 in #9254
- fix(mito2): compare primary key ranges across schema versions by @v0y4g3r in #9205
- fix(query): insert MergeScan into nested scalar subqueries by @discord9 in #9261
- fix(ci): stabilize long-range benchmark execution and artifact collection by @WenyXu in #9241
- fix(promql): keep value-field grouping labels out of matching filter propagation by @discord9 in #9242
- fix: release completed SST write buffers during compaction by @v0y4g3r in #9243
- fix: fail startup on duplicate region engine configs by @v0y4g3r in #9281
- fix(query): stop encoding oversized dynamic filters by @killme2008 in #9267
- fix(meta): populate physical metric table column ids by @dhruvxvaishnav in #9286
- fix(postgres): return empty responses for comment-only SQL by @houyuwushang in #9295
- fix(ci): build tests-integration lib with meta-srv/mock by @killme2008 in #9299
- fix: keep compaction pruning, metadata, and index work on compact runtime by @v0y4g3r in #9304
- fix: serialize struct to json in postgres by @sunng87 in #9170
- fix: address Windows test failures and run full Windows CI by @WenyXu in #9305
- fix(json2): restrict JSON2 type hints by @fengys1996 in #9316
- fix(ci): repair draft PR command dispatch by @WenyXu in #9271
- fix(promql): derive vector matching result labels and reject ambiguous matchings by @killme2008 in #9306
- fix(ci): grant PR write permission for CI command replies by @WenyXu in #9331
- fix: merge every state row in geo_path and json_encode_path by @killme2008 in #9339
- fix: only push down aggregates grouped by the partition columns themselves by @killme2008 in #9337
- fix: align ordered aggregate state type with the accumulator output by @killme2008 in #9340
- fix(query): keep count_values generated label in enclosing expressions by @discord9 in #9223
- fix: make vector aggregates work with GROUP BY and partial aggregation by @killme2008 in #9338
- fix: preserve primary key order when syncing columns by @WenyXu in #9189
- fix(mito2): stop parallel flat scan tasks once the receiver is dropped by @killme2008 in #9368
- fix(query): preserve global limits with DataFusion optimizer fixes by @discord9 in #9071
- fix(auth): follow symlink chains in watch_file_user_provider by @DeviousCardi in #9365
- fix(client): complete transport lane isolation by @discord9 in #9030
- fix(ci): teach check-builder-rust-version.sh to handle stable channels by @sunng87 in #9369
- fix(ci): update the shared Actions runner to v2.337.0 by @WenyXu in #9376
- fix(meta-srv): use NoTls for disabled and Unix socket Postgres KV backends by @Tyagiquamar in #9059
- fix(promql): apply offset to subquery evaluation window by @DeviousCardi in #9364
- fix(client): yield Flight batches and affected rows without waiting for next message by @discord9 in #8918
- fix(promql): resolve dotted column names as unqualified columns by @killme2008 in #9391
- fix: bound decompressed request size and close memory-admission gaps for compressed requests by @sunng87 in #9264
- fix(promql): align timestamp(), label_join and label_replace with Prometheus semantics by @killme2008 in #9385
- fix(mito2): truncate parquet column index min/max for SST writes by @killme2008 in #9420
- fix(catalog): skip backend batch_get on full cache hits by @WenyXu in #9431
- fix: temporarily disable v2 series scan by default by @evenyag in #9436
- fix: coalesce equal histogram quantile bucket boundaries by @evenyag in #9451
- fix: accept a bool value for the CLI --auto-create-schema flag by @fengyue-xve in #9450
- fix(otlp): coerce empty and "-" trace attribute strings to null by @killme2008 in #9461
- fix(meta-client): bound heartbeat handshake timeout by @Aetherance in #9438
- fix(partition): preserve region mapping during repartition by @killme2008 in #9458
- fix(promql): restore exact filtering for nullable label matchers by @killme2008 in #9418
- fix(json2): preserve metadata when adding columns via alter table by @fengys1996 in #8696
- fix(metasrv): retry failed heartbeat address updates by @WenyXu in #9437
- fix: align TWCS assignment with half-open time windows by @v0y4g3r in #9464
- fix(operator): bound FlowMirrorTask pending rows to prevent frontend OOM by @discord9 in #9421
- fix(json2): support settings in ALTER TABLE ADD COLUMN by @fengys1996 in #9472
- fix(promql): align subqueries to the absolute evaluation grid by @discord9 in #9400
- build(deps): update opensrv-mysql to fix MariaDB 12.3 USE information_schema hang by @tian1220A in #9357
- fix(promql): keep vector labels when a computed scalar is on the right by @killme2008 in #9478
- fix(otlp): convert boolean metric attributes into label values by @fengyue-xve in #9468
- fix(promql): return no point for zero-interval irate/idelta by @niladrix719 in #9455
- fix(metasrv): stop parking the heartbeat response on the region supervisor queue by @lczllx in #9474
- fix(promql): keep metric name for comparison operators by @Aumnertic in #9332
- fix(metasrv): stop holding the pusher registry lock across mailbox sends by @lczllx in #9445
- fix(mito): flush memtables containing skip-WAL writes on region close by @WenyXu in #9440
- fix(promql): accept evaluation times before the Unix epoch by @killme2008 in #9480
- fix: unify unknown flow option rejection across OSS and enterprise builds by @discord9 in #9319
- fix(promql): return range-vector results for instant queries by @killme2008 in #9477
- fix(query): stop reporting region scans as hash partitioned by @discord9 in #9491
- fix(table): require complete primary keys for hash partitioning by @discord9 in #9507
- fix(deps): bump OpenDAL to 0.59.4 for OSS RRSA credentials by @WenyXu in #9520
- fix(promql): follow IEEE 754 float semantics in comparisons and aggregations by @killme2008 in #9479
- fix(promql): default a stepless subquery to a one-minute step by @killme2008 in #9481
- fix(query): keep filter fetch when rewriting matches term by @discord9 in #9521
- fix(mito): preserve version ordering in bulk merges and flushes by @evenyag in #9517
- fix(mito2): ignore missing inverted indexes in old SSTs by @WenyXu in #9545
- fix: prevent stale leader metadata after concurrent writes by @fengjiachun in #9549
- fix(promql): stop fabricating histogram fold hash partitioning by @discord9 in #9509
- fix(table): stop claiming tag order for logical metric scans by @discord9 in #9522
- fix(promql): stop claiming scalar calculate preserves order by @discord9 in #9523
- fix(query): guard deep expressions during query planning by @evenyag in #9564
- fix: align fulltext bloom tokens with matches_term and use them for LIKE by @killme2008 in #9470
- fix(operator): reuse catalog table resolution for write retries by @WenyXu in #9574
- fix(hdfs): clean up temporary file when an atomic write fails by @fengyue-xve in #9483
- fix(query): accept narrowed nullability in MergeScan remote schema check by @killme2008 in #9592
- fix(table): stop claiming exact null and distinct counts for append scans by @killme2008 in #9593
- fix: avoid pinning memtables during series-index reconciliation by @evenyag in #9588
- fix(query): keep state column names unique when splitting aggregates by @killme2008 in #9594
- fix(jaeger): return the most recent traces when a search hits its limit by @killme2008 in #9595
- fix(pprof): initialize framehop before signal sampling by @v0y4g3r in #9612
- fix(prom): return empty remote read results for missing metrics by @fengys1996 in #9613
- fix(ci): compare release validation against the previous stable version by @paomian in #9636
- fix(mito): avoid pinning region version when rebuilding indexes by @v0y4g3r in #9597
- fix(mito2): keep processing bulk requests after one fails to encode by @fengjiachun in #9638
- fix(promql): honor @ modifier on subqueries by @DeviousCardi in #9446
- fix(mito2): validate bulk insert batches against the region schema by @fengjiachun in #9698
- fix(mito2): fence writes before a graceful downgrade by @fengjiachun in #9716
- fix(mito2): build indexes for encoded bulk parts flushed in sync mode by @killme2008 in #9722
- fix(meta): validate persisted partition bounds before altering regions by @fengyue-xve in #9487
- fix(partition): route NULLs like row inserts and accept signed-minimum bounds by @killme2008 in #9697
- fix(mito2): re-check a filled write as sent after a schema change by @fengjiachun in #9701
- fix: record slow INSERT SELECT queries by @shuiyisong in #9733
- fix(query): push LIKE filters down into MergeScan remote plans by @killme2008 in #9648
- fix: decouple slow-query logging from the global log level by @shuiyisong in #9765
- fix(mito2): apply SST internal column encodings to bulk-encoded parts by @killme2008 in #9735
- fix(query): forward scalar subquery filters to region scans by @killme2008 in #9738
- fix(partition): coerce partition exprs against the batch schema before routing by @sunng87 in #9752
- fix: avoid exact scan row counts for SSTs with unknown counts by @Aumnertic in #9759
- fix: avoid duplicate keys in update flow metadata txn by @v0y4g3r in #9816
- fix(ci): increase release integration test stack size by @evenyag in #9817
- fix(datanode): release region map guard before awaiting role changes by @WenyXu in #9824
- fix(mito): return from manual index builds only after the index is published by @killme2008 in #9643
- fix: preserve datanode write batches when retrying by @WenyXu in #9720
- fix(query): preserve Arrow types when decoding dictionary output by @MichaelScofield in #9858
- fix(meta): release all PostgreSQL election advisory locks on step-down by @WenyXu in #9864
- fix(ci): align nightly Windows and macOS artifact test stack sizes by @evenyag in #9860
- fix(test): avoid MinIO connection reuse after conditional writes by @WenyXu in #9877
- fix(ci): move monitoring datanodeStorage out of standalone base by @daviderli614 in #9902
- fix(pipeline): accept auto-transformed values in existing JSON columns by @MichaelScofield in #9895
- fix(mito2): require flat SST output for JSON2 by @shuiyisong in #9893
- fix(ci): specify Kind storage class for datanodes by @WenyXu in #9908
- fix(mito2): keep SSTs when a manifest save ends with RateLimited or PermissionDenied by @fengjiachun in #9898
- fix: upload staging manifests in chunks by @WenyXu in #9919
- fix(query): avoid lossy casts in partition pruning by @discord9 in #9600
- fix(query): preserve IGNORE NULLS semantics in distributed queries by @discord9 in #9601
- fix(meta): share peer discovery with DDL plugin hooks (release-specific adaptation) by @WenyXu in #9977
- fix(mito2): stop the series distributor from stalling on unread partitions by @killme2008 in #9991
- fix(query): stop windowed sort on precision-lowering time casts by @discord9 in #9524
- fix(query): keep requested sort when filtering on a lossy cast by @discord9 in #10026
🚜 Refactor
- refactor(mito2): revise compaction trigger behavior by @v0y4g3r in #8706
- refactor: port query regression runner to Rust by @discord9 in #8651
- refactor(operator): split semantic_graph relationship builders into a submodule by @killme2008 in #8841
- refactor: remove trivial tests by @v0y4g3r in #8877
- refactor(udaf): replace uddsketch implementation by @v0y4g3r in #8867
- refactor(mito2): rename pk index to series index by @evenyag in #8893
- refactor: remove open metrics parser by @sunng87 in #8905
- refactor: centralize native histogram encoding in common-query by @shuiyisong in #8945
- refactor(flight): add request builder and defer DoGet execution by @WenyXu in #8953
- refactor(mito2): prioritize file count in TWCS picker by @v0y4g3r in #8765
- refactor: support plugin-backed admin functions by @v0y4g3r in #9083
- refactor: remove constant vector and replicate operation by @evenyag in #8999
- refactor(json2): JSON2 parquet projection and schema alignment by @fengys1996 in #9137
- refactor: reuse common batching components in Prom ingestion by @WenyXu in #9114
- refactor(flow): execute streaming flows with DataFusion by @discord9 in #8976
- refactor: migrate partition_statistics to statistics_from_inputs by @discord9 in #9175
- refactor: reorganize logical table batching and isolate encoding by @WenyXu in #9210
- refactor: isolate logical batch scheduling and flushing by @WenyXu in #9211
- refactor: isolate logical table preparation and reuse Flow notifications by @WenyXu in #9212
- refactor: remove experimental vector index by @killme2008 in #9345
- refactor(promql): split planner into focused modules by @discord9 in #9354
- refactor: expose OTLP write and batching helpers for downstream routers by @shuiyisong in #9401
- refactor(operator): centralize write partitioning and dispatch by @WenyXu in #9541
📚 Documentation
- docs: rework README release badges, drop star history, fix grpc flag by @killme2008 in #8743
- docs: align wal.sync_period documented default with actual fallback (5s) by @fengjiachun in #8753
- docs: refine coding agent maps by @killme2008 in #8790
- docs: refresh README product copy by @killme2008 in #8886
- docs: fix README canary release badge resolving to stable version by @sunng87 in #9109
- docs: restructure README and add a cross-signal SQL example by @killme2008 in #9136
- docs: propose Metric export and import optimizations by @fengjiachun in #9121
- docs: refine Rust style guide by @WenyXu in #9220
- docs(agents): clarify the documentation-update checklist item by @killme2008 in #9255
- docs: make packed snapshots part of the Metric export/import RFC by @fengjiachun in #9247
- docs(config): align example configs and config.md with actual defaults by @killme2008 in #9460
⚡ Performance
- perf(promql): avoid repeated scans in sliding range evaluation by @discord9 in #8646
- avoid cloning final Prometheus remote write row by @lyang24 in #8733
- perf: reduce ingestion and flat-merge overhead by @shuiyisong in #8778
- perf: reduce cold workspace compile time by @shuiyisong in #8801
- perf(mito2): optimize dictionary primary key sorting by @lyang24 in #8767
- perf(query): choose bounded CTE as hash join build side by @fengjiachun in #8807
- perf: optimize Prometheus remote write v2 decoding by @shuiyisong in #8873
- perf(mito2): postpone covered time index filters by @evenyag in #8998
- perf(mito2): blazing-fast tournament tree merger by @v0y4g3r in #8989
- perf(promql): push down last row for instant queries by @discord9 in #9034
- perf(table): filter decoded rows with dynamic predicates by @discord9 in #9004
- perf(servers): defer Prometheus sample value formatting to serialization by @killme2008 in #9091
- perf(servers): drop the output sort for Prometheus range queries by @killme2008 in #9090
- perf(mito2): skip proven all-match prefilters by @discord9 in #9066
- perf(promql): avoid per-window allocations in simple range functions by @discord9 in #9104
- perf(query): check Substrait encodability once per plan by @killme2008 in #9095
- perf(gc): pack file reference exchange by @discord9 in #9009
- perf: avoid directory listing for explicit COPY input files by @fengjiachun in #9126
- perf(servers): group Prometheus response rows by label runs by @killme2008 in #9092
- perf(metric-engine): avoid deep-cloning physical column metadata in verify_rows by @v0y4g3r in #9162
- perf(servers): avoid rebuilding JSON records payload by @discord9 in #9160
- Perf/http sql limit materialization by @lyang24 in #9148
- perf(mito2): lazily extract sparse primary key index values by @v0y4g3r in #9176
- perf(mito2): optimize materialized column index updates by @v0y4g3r in #9182
- perf(promql): reuse sliding min and max candidates by @discord9 in #9099
- perf(servers): coalesce ready Flight record batches by @discord9 in #9167
- perf(mito2): use series and range indexes in two-phase series scans by @evenyag in #9153
- perf(promql): avoid concatenating constant series tags by @discord9 in #9108
- perf(mito2): lazily materialize sparse primary key tags by @v0y4g3r in #9199
- perf: add flight coalesce regression case with high-cardinality aggregations by @discord9 in #9214
- perf(promql): propagate matching-label filters between binary operands by @killme2008 in #9202
- perf(mito-codec): streamline sparse label extraction and buffer sizing by @v0y4g3r in #9217
- perf(otlp): share trace resource and scope attributes by @killme2008 in #9253
- perf(servers): reduce temporary memory in protocol handling by @killme2008 in #9249
- perf(servers): stream Prometheus HTTP responses incrementally by @discord9 in #9229
- perf(telemetry): remove the shared lock from TraceLayer by @killme2008 in #9269
- perf(promql): push label filters into grouped join inputs by @killme2008 in #9280
- perf(mito2): lazily decode dense primary key columns by @v0y4g3r in #9226
- perf: bound concurrent Metric export writers by @fengjiachun in #9296
- perf(index): batch bloom filter searches across row groups by @killme2008 in #9361
- perf(mito2): batch index page loads and share cached bloom metadata by @killme2008 in #9360
- perf(index): cut allocations when building bloom and inverted indexes by @killme2008 in #9359
- perf(catalog): optimize single-table lookups in information_schema.partitions by @fengyue-xve in #9473
- perf(promql): reduce timestamp payload allocations and use narrow cursor scans by @discord9 in #9417
- perf(query): infer safe aggregate input bounds from HAVING by @v0y4g3r in #9582
- perf(mito2): gather last rows with one take per input batch by @killme2008 in #9737
- perf: stream and prune SST manifest scans by @WenyXu in #9931
- perf(mito2): index encoded bulk parts from memory during flush by @killme2008 in #9913
🧪 Testing
- test: rename internal bug numbers in tests to semantic names by @discord9 in #8779
- test(mito2): isolate sequence publication barrier by @discord9 in #8876
- test: cover request-level insert WAL skipping end to end by @WenyXu in #9093
- test: regenerate expired TLS certificates for integration fixtures by @discord9 in #9196
- test(flow): stabilize FLUSH_FLOW assertions after async source-table mirrors by @discord9 in #9230
- test: exclude testing feature completely by @sunng87 in #9072
- test: make export chunk deletion failure deterministic by @fengjiachun in #9291
- test: cut integration test time and make the storage matrix meaningful by @killme2008 in #9308
- test(sqlness): run environments concurrently and drop redundant restarts and sleeps by @killme2008 in #9333
- test: remove unused legacy compatibility test suites by @killme2008 in #9378
- test(sqlness): wait for mirrored inserts before flushing streaming flows by @killme2008 in #9424
- test(promql): cover label_replace normalization with distinct series by @fengyue-xve in #9485