Skip to main content

v1.2.0

Β· 20 min read

Release date: September 8, 2026

GreptimeDB v1.2.0 adds new structural stored JSON data type ("JSON2") and query capabilities, Prometheus Remote Write v2 ingestion, Flow runtime observability, and dashboard updates, alongside query and ingestion improvements.

πŸ‘ Highlights​

New structural stored JSON data type and dot-style SQL access. JSON data can be stored as structs, instead of as a whole blob (JSONB). Featured with SQL paths and functions, list indexing, empty and null handling, and table-aware pipelines (#8909, #8928, #8940, #8979, #9007, #9010, #9013, #9027, and #8964). For example, JSON2 fields can be accessed with dot paths or json_get:

CREATE TABLE application_logs (
ts TIMESTAMP TIME INDEX,
attrs JSON2
) WITH (
'append_mode' = 'true'
);
INSERT INTO application_logs VALUES
(1, '{"http":{"status":200,"path":"/api/orders"}}');
SELECT
attrs.http.status::BIGINT AS status,
json_get(attrs, 'http.path')::STRING AS path
FROM application_logs;

Prometheus Remote Write v2 and experimental native histograms. GreptimeDB can ingest Prometheus Remote Write v2 requests and query native histograms through PromQL (#8361, #8382, #8654, #8664, and #8693). Native-histogram ingestion is experimental and disabled by default. To enable it in GreptimeDB:

[http]
experimental_enable_prometheus_native_histogram = true

Configure Prometheus to use protobuf_message: io.prometheus.write.v2.Request:

remote_write:
- url: http://greptimedb:4000/v1/prometheus/write
protobuf_message: io.prometheus.write.v2.Request

More efficient series queries. Dictionary-encoded series keys, correct regex filtering on dictionary-encoded columns, and RangeSelect projection pruning improve query efficiency (#8541, #8688, and #8570).

Splunk HEC ingestion. Send structured events or raw logs directly to /v1/splunk/services/collector/event or /v1/splunk/services/collector/raw using Splunk HEC-compatible clients (#8321 and #8491).

Flow runtime status. SHOW FLOW STATUS and information_schema.flow_statistics expose Flow runtime statistics (#8392); distributed Flow reports start_time and uptime_seconds as NULL in this release. #8729 fixes Flow statistics aggregation and quoting.

SHOW FLOW STATUS LIKE 'my%';
SELECT * FROM information_schema.flow_statistics;

Dashboard​

The bundled GreptimeDB dashboard is updated from v0.12.2 (bundled with v1.1.0) to v0.13.13. The update includes:

Dashboard integration updates are included in #8687 and #8898.

Breaking changes​

  • Local SQL filesystem access is sandboxed. In standalone deployments, local COPY and external-table paths are limited to the copy root; in distributed deployments, those local paths are disabled. Before upgrading, follow the local SQL file access migration guide to move data, set a dedicated copy root, or move the workflow to object storage (#8708) by @fengjiachun.
  • holt_winters was removed. Use double_exponential_smoothing instead (#8457) by @shuiyisong.
  • sparse_primary_key_encoding was removed. Metric-engine data regions default to sparse primary-key encoding. Existing configurations still load, but this option is ignored. Remove it when updating configuration (#8470) by @sunng87.
  • Out-of-range pipeline integer conversions no longer silently wrap. Integer narrowing now checks the target range and follows the configured on_failure behavior when a value does not fit (#8589) by @discord9.
  • Soft-drop and recovery are Enterprise Edition features. In beta1, these operations were available in OSS; from beta2 onward, an OSS metasrv rejects gc.experimental_soft_drop.enable = true. Before upgrading from beta1, recover any soft-dropped tables you need. OSS cannot recover or purge tables already soft-dropped in beta1 and does not clean up their expired tombstones; Enterprise Edition is required to continue that lifecycle (#8747) by @v0y4g3r.
  • Native histogram persisted fields changed signedness. Span-length list elements changed from UInt32 to Int32; integer count fields changed from UInt64 to Int64, with count_u64/zero_count_u64 renamed to count_i64/zero_count_i64. Native-histogram Struct data written by earlier betas with the old schema may be unreadable. This caveat concerns the experimental beta feature, not ordinary v1.1 metric tables. There is no migration, downgrade, or mixed-version compatibility layer; plan migration or reingestion before upgrading (#8824) by @sunng87.
  • Legacy JSON2 tables require upgrade testing. Existing non-append tables using the legacy greptime.json type can fail during flush or compaction after upgrade. This known limitation is not fixed in v1.2.0. For affected tables, defer the upgrade, or logically export data from a compatible old-version environment and import it into a newly created v1.2.0 table. Do not copy old table directories or metadata. Retain a backup; validate completeness and perform an actual flush and compaction on the new table before cutover. Test the migration with representative data. Setting append_mode alone is not a guaranteed remedy.

The changelog below covers changes since v1.1.0, excluding those already shipped in v1.1.1–v1.1.4. Earlier soft-drop work is listed for attribution but is Enterprise-only in this release.

πŸš€ 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_v2 initial commit with sample ingestion by @shuiyisong in #8361
  • feat: accept x-greptime-pipeline-name header on /events/logs by @BootstrapperSBL in #8371
  • 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: add soft-drop table recovery procedures by @v0y4g3r in #8061 (Enterprise-only in v1.2.0; see upgrade notes.)
  • 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: prepare soft-drop WAL retirement by @v0y4g3r in #8475 (Enterprise-only in v1.2.0; see upgrade notes.)
  • feat: clean up soft-dropped regions offline by @v0y4g3r in #8458 (Enterprise-only in v1.2.0; see upgrade notes.)
  • 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(meta): add retention GC for soft-dropped tables by @v0y4g3r in #8526 (Enterprise-only in v1.2.0; see upgrade notes.)
  • feat: support soft-drop recycle bin and UNDROP TABLE by @v0y4g3r in #8546 (Enterprise-only in v1.2.0; see upgrade notes.)
  • feat: support splunk HEC raw endpoint by @agrawalx in #8491
  • feat: enable soft-drop table lifecycle by @v0y4g3r in #8554 (Enterprise-only in v1.2.0; see upgrade notes.)
  • 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
  • feat: support enabling skip_wal with ALTER TABLE by @evenyag in #8817
  • feat: make frontend heartbeat extensible and lifecycle-safe by @fengjiachun in #8726
  • feat(mito2): discard unflushed region data safely by @evenyag in #8600
  • feat: add admin function to discard unflushed data by @evenyag in #8768
  • feat(flow): add information_schema.flow_statistics and SHOW FLOW STATUS (distributed start_time/uptime_seconds are NULL) by @onepizzateam in #8392
  • feat: update to pgwire 0.40.7 by @sunng87 in #8860
  • feat: update dashboard to v0.13.13 by @sunchanglong in #8898
  • feat(event): add event context to procedure events by @WenyXu in #8734
  • feat(event): record admin function executions by @WenyXu in #8835
  • feat(procedure): record event actor by @WenyXu in #8849
  • feat(mito2): adapt bulk memtable encode threshold to write buffer size [Backport release/v1.2] by @MichaelScofield in #9061
  • feat(pipeline): support table-aware JSON2 transforms by @shuiyisong in #8964
  • feat(json2): support JSON2 paths in SQL functions by @MichaelScofield in #9007
  • feat(json2): support empty and null JSON2 value by @fengys1996 in #9010
  • feat(json2): support list indexing for JSON2 columns by @MichaelScofield in #9013

πŸ› 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(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
  • fix: add public constructor for compactor by @sunng87 in #8724
  • fix: backport Prometheus and skip_wal fixes to v1.2 by @evenyag in #8838
  • fix(mito2): limit compaction picker threads by @v0y4g3r in #8704
  • fix: clear pooled Prometheus Remote Write decoder state by @shuiyisong in #8921
  • fix(flow): fix flow stats aggregation and df_plan_to_sql quoting by @discord9 in #8729
  • fix(frontend): remove gRPC DDL panics for DropView and non-timestamp time index by @discord9 in #8739
  • fix(prometheus): custom column remote reads by @grezzko in #8659
  • fix(query): avoid unsafe count wildcard rewrites by @discord9 in #8522
  • fix(query): validate merge scan remote schema by @discord9 in #8579
  • fix(mito2): fail open when Bloom IN predicate has non-literal or unencodable members by @discord9 in #8709
  • fix(mito): re-encode bulk WAL entry after filling missing columns by @fengjiachun in #8808
  • fix(mito2): keep deletion markers when compacting part of a window by @fengjiachun in #8872
  • fix(query): respect query timezone in timestamp casts by @fzlzjerry in #8859
  • fix(query): preserve timestamp literal semantics in inserts by @killme2008 in #8889
  • fix(metric-engine): handle Utf8View tag/label columns without panicking by @discord9 in #8772
  • fix: cache physical table metadata lookups by @shuiyisong in #8777
  • fix: harden permission checks and process visibility by @shuiyisong in #8852
  • fix(event): preserve procedure lifecycle locators by @WenyXu in #8787
  • fix(meta): release region guards after drop rollback by @WenyXu in #8751
  • fix(object-store): fix unused import on Windows after #8735 by @discord9 in #8752
  • fix(frontend): isolate internal Flight authentication by @discord9 in #9045
  • fix: match system schema names case-insensitively [Backport release/v1.2] by @MichaelScofield in #9041
  • fix: re-scan stream-backed tables in recursive CTEs [Backport release/v1.2] by @MichaelScofield in #9052
  • fix(pipeline): coalesce concurrent pipeline cache misses and restore cache TTL configuration for v1.2 by @killme2008 in #9022 The release also retains configurable pipeline.cache_ttl (default 10s).
  • fix(mito2): fence checkpoints during region transitions by @WenyXu in #8847
  • fix(mito2): split SSTs at primary key series boundaries by @v0y4g3r in #8888
  • fix(query): keep INSERT timestamp conversion out of the source query by @killme2008 in #8911
  • fix(mysql): interpret prepared statement datetime params in session timezone by @wy471x in #8923
  • fix(meta): allow manual migration from offline datanodes by @WenyXu in #8934
  • fix(flight): bound DoGet response wait by @WenyXu in #8943
  • fix(mito2): use target sequence for foreign SSTs by @discord9 in #8946
  • fix: update tokio-postgres and correct explain/fetch cursor output schema by @sunng87 in #8955
  • fix: postgres describe for more statements by @sunng87 in #8974
  • fix(promql): resolve derived labels in aggregation arithmetic by @shuiyisong in #8994
  • fix(json2): keep empty structs in remainder by @MichaelScofield in #9027

🚜 Refactor​

πŸ“š Documentation​

  • docs(agents): add per-crate guides, architecture invariants, and generated-files list by @killme2008 in #8346
  • docs: add project-level AGENTS.md as the shared agent guide by @killme2008 in #8358
  • docs: add entity relationships and graph query RFC by @killme2008 in #8605

⚑ Performance​

  • perf: reduce parquet metadata cache footprint by @waynexia in #8527
  • perf: preserve dictionary-encoded query labels by @waynexia in #8541
  • perf: optimize OTLP trace ingestion by @shuiyisong in #8604
  • perf(servers): optimize PromQL read conversion by @lyang24 in #8587
  • perf(mito2): make compaction picker asynchronous to avoid blocking the region worker by @v0y4g3r in #8624
  • perf(query): prune RangeSelect input projections by @discord9 in #8570

πŸ§ͺ Testing​

βš™οΈ Miscellaneous Tasks​

New Contributors​

All Contributors​

We would like to thank the following contributors from the GreptimeDB community:

@agrawalx, @BootstrapperSBL, @discord9, @evenyag, @fengjiachun, @fengys1996, @fzlzjerry, @grezzko, @killme2008, @lyang24, @MichaelScofield, @onepizzateam, @QuakeWang, @raphaelroshan, @shuiyisong, @srivtx, @sunchanglong, @sunng87, @v0y4g3r, @waynexia, @WenyXu, @wy471x, @yimeng, @ZonaHex

Full Changelog: https://github.com/GreptimeTeam/greptimedb/compare/v1.1.0...v1.2.0