v1.2.0-beta.1
Release date: July 31, 2026
GreptimeDB v1.2.0-beta.1 is the first beta of the v1.2 line. It brings the JSON2 type system to maturity, large query performance improvements via dictionary-encoded series keys, Prometheus Remote Write v2 native histogram support, and a large set of correctness and stability fixes.
👍 Highlights
-
JSON2 type system maturity — Variant payloads are now encoded as JSONB instead of serde JSON bytes, with type hints, write-time validation (rejecting non-object values and validating append mode), and a fix for selecting whole JSON2 columns (#8247, #8381, #8434, #8435, #8683).
CREATE TABLE t (id INT, doc JSON2);
INSERT INTO t VALUES (1, '{"a": 1, "b": [1, 2]}');
SELECT doc FROM t; -- returns the full JSON document -
Faster queries with dictionary-encoded series keys — In-memory primary key columns now use dictionary arrays to alleviate series key expansion, gaining ~24% end-to-end query performance (#8541); dictionary-encoded regex filters also get correct semantics and the fast path back (#8688).
SELECT * FROM metrics WHERE job = 'node' AND path ~ '/api/.*';
-- regex filters on dictionary-encoded columns are now semantically correct and fast -
Security hardening and access control — Local-file SQL access is sandboxed and datanode local-file access is disabled in distributed deployments (#8708 — breaking change, see below and the migration guide); table-level permission checks are enforced across query and write protocols (#8552), database ACL gaps are closed and creators get access to newly created databases (#8492, #8566), restricted HTTP endpoints require authentication (#8672), Postgres now supports SCRAM-SHA-256 (#8304), and an optional dedicated API server port (
http.enable_api_server, defaultfalse;http.api_server_addr, default127.0.0.1:4006) exposes only/v1and the dashboard (#8657). -
Prometheus Remote Write v2 with native histograms — Support for the Remote Write v2 protocol (#8361), persistence and validation of native histograms (#8382, #8654), and PromQL native histogram functions (#8664). Prometheus sends v1 unless
protobuf_messageis set; native histogram ingestion is experimental and disabled by default (experimental_enable_prometheus_native_histogramunder[http]).remote_write:
- url: http://greptimedb:4000/v1/prometheus/write
protobuf_message: io.prometheus.write.v2.Request -
Splunk HEC ingestion — New Splunk HEC-compatible endpoints at
/v1/splunk/services/collector/eventand/v1/splunk/services/collector/raw, with health probes, gzip support, and pipeline override via thex-greptime-pipeline-nameheader (#8321, #8491). Vector'ssplunk_hec_logssink, the OpenTelemetry Collectorsplunk_hecexporter, and Fluent Bit can point at GreptimeDB by changing URL and token; when authentication is enabled the token must be formatted asusername:password. -
Cluster lifecycle events — The event recorder now covers table, database, flow, and view DDL events on top of region migration, plus WAL prune, batch GC, and repartition events (#8549, #8623, #8626, #8627, #8632, #8648, #8665, #8673, #8677). Configure with
[event_recorder] ttl(default 90 days) andevent_types(omitted = record all,[]= disabled); docs: docs#2678. -
Streaming EXPLAIN ANALYZE —
POST /v1/sql/analyze/streamstreams per-stage metrics while a distributed query is still running, instead of waiting for completion; slow queries also record metrics on timeout. Enabled by default (http.experimental_enable_explain_analyze_stream, defaulttrue) (#8380, #8405, #8584, #8644, #8668). -
PromQL semantics aligned with Prometheus — Ordinary NaN samples are preserved,
ormatching handles missing labels and empty operands, range queries align to range tails, and remote read schemas are bound per query (#8494, #8502, #8504, #8650, #8591); promql-parser updated to v0.10 (#8457). -
Finer control over flush and compaction — Table-level
auto_flush_intervalwithALTER TABLE SET(#8357, #8403), per-region write buffer limits (#8473), configurable parquet row group size (#8446),ADMIN COMPACT_TABLEwithstart_time/end_timeranges (#8669), and cancelable flush jobs (#8685). -
RangeSelect projection pruning — Range queries now prune unused input columns before the RangeSelect plan, reducing scanned columns and I/O (#8570).
EXPLAIN SELECT ts, value FROM metrics WHERE ts > now() - INTERVAL '1 hour';
-- only the needed columns are scanned -
Parallel, resumable export/import v2 — The snapshot-based export/import v2 gained concurrent chunk export (
--chunk-parallelism), parallel import tasks (--task-parallelism), and progress reporting (--progress auto|always|never); resume works by re-running the same command, which skips completed chunks and tasks instead of starting over. See the export/import v2 guide.greptime cli data export-v2 create \
--addr 127.0.0.1:4000 \
--to file:///tmp/greptime-snapshots/demo \
--chunk-parallelism 4
# rerun the same command to resume from existing progress -
Also notable — MySQL as an object store backend (#8560; repartition unsupported on it), Flow scheduling and window-update stability fixes (#8360, #8544, #8582, #8389, #8409, #8611), and repartition polish (#8291, #8497, #8678).
Dashboard
The bundled GreptimeDB dashboard was updated to v0.13.10:
- Save dashboards as self-contained snapshots (time range, variables, and panel data) that open read-only without querying live data sources (dashboard#627).
- Result tables support column resizing for easier inspection, including trace queries, with a dedicated table resize mode (dashboard#628, #632, #635, #636).
- New prominent support menu and refreshed icon/status styling (dashboard#629).
- PromQL editor fixes (query header, Prometheus plugin sync) and all supported Perses plugins (dashboard#630, #631, #633).
- Virtual-list logs show a tip for hidden columns; SQL editor executes correctly when the cursor is after a SQL line (dashboard#637, #622).
Breaking changes
- fix!: sandbox SQL local filesystem access by @fengjiachun in #8708
- chore!: update promql-parser to v0.10.0, remove
holt_wintersby @shuiyisong in #8457 - feat!: remove configuration of sparse_primary_key_encoding by @sunng87 in #8470
- fix(pipeline)!: check integer narrowing by @discord9 in #8589
🚀 Features
- feat(cli): add export-v2 chunk parallelism by @fengjiachun in #8292
- feat: pass Kafka pruned entry id when creating regions by @WenyXu in #8282
- feat(cli): add export-v2 progress reporting by @fengjiachun in #8294
- feat(cli): add import-v2 task parallelism by @fengjiachun in #8300
- feat: update dashboard to v0.13.1 by @ZonaHex in #8306
- feat: add repartition column hint by @WenyXu in #8291
- feat(cli): allow overriding import-v2 state path by @fengjiachun in #8302
- feat: decouple error retryability from status codes by @WenyXu in #8301
- feat: expose region read load metrics by @v0y4g3r in #8316
- feat: add flow batching metrics to grafana dashboard by @evenyag in #8353
- feat: add remote dynamic filter metrics by @discord9 in #8309
- feat: Add support for splunk HEC endpoints by @agrawalx in #8321
- feat:
prw_v2initial commit with sample ingestion by @shuiyisong in #8361 - feat: accept x-greptime-pipeline-name header on /events/logs by @BootstrapperSBL in #8371
- feat(flow): stabilize eval interval scheduling by @discord9 in #8360
- feat(json2): type hint by @fengys1996 in #8247
- feat: support table-level auto_flush_interval by @raphaelroshan in #8357
- feat: support structured instruction reply errors by @WenyXu in #8335
- feat(json2): reject non-object JSON values on write by @fengys1996 in #8381
- feat: stream explain analyze metrics over http by @discord9 in #8380
- feat: report region query stats in heartbeat by @WenyXu in #8401
- feat: add query regression perf harness by @discord9 in #8406
- feat: persist Prometheus remote write v2 native histograms by @shuiyisong in #8382
- feat(query): add runtime provider interface by @discord9 in #8386
- feat: support ALTER TABLE SET auto_flush_interval by @srivtx in #8403
- feat: add Prom remote-write query regression scenario by @discord9 in #8413
- feat(json2): validate append mode for tables with JSON2 columns by @fengys1996 in #8434
- feat(json2): encode json2 variant payloads as jsonb by @fengys1996 in #8435
- feat: add fuzz CI failure investigation skill by @WenyXu in #8456
- feat: add strict CSV header validation by @QuakeWang in #8426
- feat: more region lifecycle hooks by @sunng87 in #8467
- feat: enlarge file meta cache by @waynexia in #8499
- feat: support per-region write buffer limits by @evenyag in #8473
- feat: support SCRAM auth for Postgres by @killme2008 in #8304
- feat: support splunk HEC raw endpoint by @agrawalx in #8491
- feat: allow unknown PluginOptions with a warning message by @sunng87 in #8550
- feat(mito2): expose adaptive batch APIs by @evenyag in #8578
- feat: grant creators access to newly created databases by @shuiyisong in #8566
- feat(flow): handle time_ranges in DirtyWindowRequest by @v0y4g3r in #8582
- feat: add mysql object store backend by @fengys1996 in #8560
- feat: add a region hook for gc cleanup by @sunng87 in #8547
- feat(json2): support JSON2 nested path fallback reads by @fengys1996 in #8540
- feat: update flow windows after metric batch flush by @v0y4g3r in #8544
- feat: make parquet row group size configurable by @evenyag in #8446
- feat(mito): add candidate series scanner by @evenyag in #8586
- feat: invoke gc hook for offline region cleanup by @sunng87 in #8613
- feat(procedure): support trigger-aware procedure events by @WenyXu in #8549
- feat(event-recorder): configure lifecycle event recording by @WenyXu in #8648
- feat: add database DDL procedure events by @WenyXu in #8623
- feat(common-query): add native histogram runtime model by @shuiyisong in #8656
- feat: add procedure events for Flow DDL by @WenyXu in #8632
- feat: update dashboard to v0.13.8 by @sunchanglong in #8666
- feat: add extra http router provider in metasrv plugin by @MichaelScofield in #8662
- feat(promql): add native histogram functions by @shuiyisong in #8664
- feat: add events for create and drop view by @WenyXu in #8626
- feat: add a dedicated http api server port by @sunng87 in #8657
- feat: record metrics for timed out explain analyze by @v0y4g3r in #8668
- feat: update dashboard to v0.13.9 by @sunchanglong in #8674
- feat(metasrv): add repartition lifecycle events by @WenyXu in #8665
- feat: support time range in manual compaction by @v0y4g3r in #8669
- feat: update dashboard to v0.13.10 by @sunchanglong in #8687
- feat: add table DDL procedure events by @WenyXu in #8627
- feat: expose MitoRegion::all_manifest_files for metadata rebuild by @sunng87 in #8680
- feat(metasrv): record WAL prune procedure events by @WenyXu in #8677
- feat(query): add native histogram result plumbing by @shuiyisong in #8693
- feat(metasrv): add batch GC lifecycle events by @WenyXu in #8673
- feat(mito2): support cancelling flush jobs by @evenyag in #8685
🐛 Bug Fixes
- fix(metric-engine): report query load under physical region id by @v0y4g3r in #8355
- fix(mito): failed to compact memtable with json2 by @fengys1996 in #8297
- fix(flow): bind scheduled now in dist plan by @discord9 in #8389
- fix(mito): honor unknown file lingering time by @discord9 in #8365
- fix(meta): configure heartbeat message size by @discord9 in #8411
- fix(flow): rebind stale snapshot fence by @discord9 in #8409
- fix: spawn read operations on query runtime by @v0y4g3r in #8433
- fix: collect lightweight query-load metrics by @v0y4g3r in #8437
- fix: preserve close-time flush responses by @fengjiachun in #8443
- fix: pause GC during maintenance mode by @discord9 in #8450
- fix: compare all LoggingOptions fields in PartialEq by @raphaelroshan in #8449
- fix: Use prepared file locations for CSV strict headers integration test by @evenyag in #8493
- fix: disable WAL index creation by default by @WenyXu in #8505
- fix: require metasrv GC for repartition by @WenyXu in #8497
- fix: reject datanode startup on GC config mismatch by @discord9 in #8509
- fix: close database ACL gaps in permission checks by @shuiyisong in #8492
- fix(promql): preserve ordinary NaN samples by @discord9 in #8494
- fix(promql): handle missing labels in or matching by @discord9 in #8504
- fix(ci): harden query regression runner by @discord9 in #8534
- fix: count Postgres SCRAM auth failures and correct auth config docs by @killme2008 in #8538
- fix(ci): summarize query regression in one table by @discord9 in #8536
- fix(mito2): adapt batch size for wide rows by @evenyag in #8543
- fix: stream remote analyze metrics while pending by @discord9 in #8405
- fix: enforce table-aware permissions across query and ingest protocols by @shuiyisong in #8552
- fix: stabilize remote analyze stage ordering by @discord9 in #8584
- fix: bind Prom remote read schema per query by @discord9 in #8591
- fix: convert literals in joins and subqueries by @discord9 in #8501
- fix(query): harden range time conversion by @discord9 in #8515
- fix(json2): treat empty object as null when insert by @MichaelScofield in #8602
- fix(json2): encode deeply nested values as jsonb by @fengys1996 in #8612
- fix: enforce COPY FROM row limit by @discord9 in #8551
- fix(flow): avoid duplicate incremental planning warnings by @discord9 in #8611
- fix: fail closed on malformed password assignments by @fengjiachun in #8622
- fix(metric-engine): validate logical projection indices by @discord9 in #8535
- fix(datatypes): replicate nested list and struct vectors by @shuiyisong in #8638
- fix: honor default prefix for all metric columns by @shuiyisong in #8640
- fix(servers): validate remote write native histograms by @shuiyisong in #8654
- fix(promql): preserve query-aligned range tail by @discord9 in #8650
- fix(partition): avoid panic on missing route columns by @discord9 in #8645
- fix(prometheus): make remote write timeout retryable by @v0y4g3r in #8639
- fix: configure datanode client gRPC message limits by @evenyag in #8642
- fix: scope live analyze metrics to streaming requests by @discord9 in #8644
- fix(mito2): suppress empty compaction skip logs by @v0y4g3r in #8667
- fix(mysql): fail closed on unrepresentable timestamps by @discord9 in #8580
- fix: enforce permissions for restricted HTTP endpoints by @shuiyisong in #8672
- fix(repartition): enforce GC across lifecycle by @killme2008 in #8678
- fix(json2): standardize widening and projection cast semantics by @fengys1996 in #8661
- fix: preserve dictionary regex filter semantics by @discord9 in #8688
- fix(query): use physical partition types for metric route pruning by @discord9 in #8590
- fix(query): handle empty operands in PromQL or by @discord9 in #8502
- fix(mito2): make async index publication conditional by @killme2008 in #8676
- fix(metric-engine): prevent stale metadata cache fills by @shuiyisong in #8699
- fix(mito2): fence async index builds by schema generation by @killme2008 in #8697
- fix: make select whole json2 column worked by @MichaelScofield in #8683
- fix(meta): preserve legacy WAL options compatibility by @WenyXu in #8707
All Contributors
We would like to thank the following contributors from the GreptimeDB community:
@BootstrapperSBL, @MichaelScofield, @QuakeWang, @WenyXu, @ZonaHex, @agrawalx, @discord9, @evenyag, @fengjiachun, @fengys1996, @killme2008, @lyang24, @raphaelroshan, @shuiyisong, @srivtx, @sunchanglong, @sunng87, @v0y4g3r, @waynexia