Skip to content

v1.3 GA, JSON2 Path Indexes & PostgreSQL COPY FROM STDIN | Greptime Monthly Report - No. 89

GreptimeDB v1.3.0 is GA, with native histograms on by default and opt-in Trace V2. On main for v1.4, JSON2 type-hint paths can declare inverted and skipping indexes, and JSON2 columns work on non-append-only tables. Also on main, PostgreSQL COPY FROM STDIN loads CSV and InfluxDB line protocol.
v1.3 GA, JSON2 Path Indexes & PostgreSQL COPY FROM STDIN | Greptime Monthly Report - No. 89
On this page

Summary ​

October 2026 · 2026-10-01 – 2026-10-31

What landed this month:

  • GreptimeDB v1.3.0 is GA, with native histograms on by default and opt-in Trace V2.
  • On main for v1.4, JSON2 type-hint paths can declare inverted and skipping indexes, and JSON2 columns work on non-append-only tables.
  • Also on main, PostgreSQL COPY FROM STDIN loads CSV and InfluxDB line protocol.

GreptimeDB v1.3.0 went GA on October 28, after v1.3.0-beta.2 on October 15 (release notes). A separate release post will cover it in detail. In short:

  • Native histograms from Prometheus Remote Write v2 and OTLP are accepted by default, and PromQL can query them.
  • Trace V2, opted into with x-greptime-pipeline-name: greptime_trace_v2, stores span, scope, and resource attributes in three JSON2 columns instead of one column per attribute key.
  • SQL and PromQL fixes correct several wrong-result cases, including matches_term missing rows on fulltext bloom indexes (db#9470).

Before upgrading from v1.2, check:

  • In a rolling upgrade, upgrade all datanodes before frontends, and roll back frontends first. v1.3 frontends with v1.2 datanodes can replay successful writes and duplicate rows in append-mode tables. Keep metasrv maintenance mode on until the upgrade is complete. On Kubernetes, use greptimedb-operator v1.3.0 or later (see Ecosystem Updates).
  • region_engine.mito.scan_memory_limit now defaults to 25% of system memory, and scan_memory_on_exhausted = "wait" behaves as "fail". Set scan_memory_limit = "unlimited" to keep scans unbounded (db#9101).
  • VRL pipelines can no longer call environment, filesystem, hostname, network or local-timezone functions. Set pipeline.allow_vrl_host_access = true if a pipeline needs them (db#9610).
  • Queries skip existing fulltext bloom indexes until compaction or ADMIN BUILD_INDEX rebuilds them. The default automatic flush interval drops from 30 to 10 minutes. MySQL text results truncate timestamps to microseconds (db#9831). OTLP metrics with service.namespace set use job="<namespace>/<service.name>". The release notes list the rest.

Contributors ​

Over the past month, 243 PRs from 27 contributors were merged. Among them, 14 community contributors contributed 34 PRs. Welcome to our new contributors: @fengyue-xve, @Alorun, @Byte-Naut, @NightG1owZ, @Aumnertic, @dxqlovestudy, @niladrix719, @Aetherance!

Thanks to the community contributors who shipped this month:

Highlights ​

The following changes merged to main after the v1.3 branch was cut and will ship in v1.4. They are available in the nightly builds.

db#9324 feat(json2): support inverted index ​

JSON2 type hints can declare an index on each path. INVERTED INDEX and SKIPPING INDEX (a Bloom filter, db#9967) are built during flush and compaction, so predicates on those paths prune SSTs instead of scanning them. A path can have both.

sql
CREATE TABLE logs (
    ts TIMESTAMP TIME INDEX,
    attrs JSON2 (
        service.name STRING INVERTED INDEX,
        status BIGINT SKIPPING INDEX
    )
) WITH ('append_mode' = 'true');

Changing hints with ALTER TABLE does not rebuild indexes on existing SSTs; later flushes and compactions use the new hints. Manual index rebuilds don't rebuild JSON2 path indexes on existing SSTs, and can remove the ones already built.

JSON2 columns also work on non-append-only tables with last_row and last_non_null merge modes. A newer object replaces the previous one as a whole, and JSON2 columns cannot be primary keys (db#9985). Plain JSON columns accept the same dot access as JSON2, so SELECT j.a.b reads a nested field (db#9775).

db#9297 feat: COPY FROM STDIN for postgres interface ​

PostgreSQL clients can stream data into a table with COPY ... FROM STDIN, for example \copy cpu FROM 'cpu.csv' WITH (FORMAT csv, HEADER) in psql. Specify the format explicitly: csv, or influxdb as described below. PostgreSQL's text and binary formats are not supported. In the PR's benchmark with 2,000-row batches, COPY loaded about 997K rows/s, against about 47K rows/s for INSERT.

WITH (FORMAT influxdb) takes InfluxDB line protocol, with an optional precision that defaults to nanoseconds. The statement names no table, since each line carries its measurement: COPY FROM STDIN WITH (FORMAT influxdb, precision 'ms'). One statement accepts up to 64 MiB (db#9982).

db#9754 feat(otlp)!: support raw delta exponential histograms ​

OTLP delta exponential histograms are stored as they arrive, in the native histogram format with the otlp_aggregation_temporality="delta" label. Each sample counts only its own interval: sum_over_time(metric[3m]) gives the total over three minutes, and dividing by 180 gives a per-second rate.

The same PR removes the legacy OTLP metric conversion that v1.3 still has. otlp_metric_compat is still accepted but no longer changes how metrics are converted, so check dashboards and alerts that depend on legacy metric names before moving to v1.4.

Prometheus Remote Read can also return native histograms (db#9971), which v1.3.0 does not support.

Also this month ​

  • Storage: TWCS stops rewriting L1 files in windows that receive no new data. In the PR's 6-hour benchmark with 5% late data, write amplification fell from 40.7 to 3.3 and futile compactions from 327 to 0 (db#9741). Compaction also overlaps merging with encoding, and experimental_compaction_output_parallelism (default 1) parallelizes decoding and encoding within one output (db#9945). Columns can set their own compression and encoding, such as "prompt" STRING COMPRESSION WITH (type = 'zstd', level = 3, page_size = '8MiB'); new trace tables use plain encoding for span IDs (db#9426, db#9629).
  • Jaeger UI v2 can query GreptimeDB through new /v1/jaeger/api/v3 endpoints for services, operations, trace lookup and search. The existing endpoints still work (db#9409).
  • Two breaking changes for v1.4: GreptimeDB rejects tables that set primary_key_encoding = 'sparse' by hand unless they have the metric engine's reserved key columns (db#10020); and the datanode Kafka WAL index is removed, with create_index and dump_index_interval ignored (db#9563).
  • From the community: with the default sync_write = false, the raft-engine WAL's periodic sync never called fsync; it does now (db#9715). Pipelines get a logfmt processor (db#9586), and log ingestion accepts application/x-json-stream from Fluent Bit's json_stream output (db#9581). TRUNCATE TABLE accepts WITH (wait = ..., timeout = ...) (db#9753), and datanodes check that each object store can be written, read, listed and deleted before starting (db#9954).

Ecosystem Updates ​

Operator and Helm Charts ​

greptimedb-operator v0.7.0 enables the dedicated HTTP API server by default, which requires GreptimeDB v1.2.1 or later. On older GreptimeDB versions, set enableHttpApiServer: false in the cluster CR before upgrading the operator. v1.3.0 adds logging and OTLP export settings. From this release the operator version follows GreptimeDB: run operator v1.3.0 or later with GreptimeDB v1.3.0.

The Helm charts use the same versioning. greptimedb-cluster 1.3.0 and greptimedb-standalone 1.3.1 deploy GreptimeDB v1.3.0 by default, and greptimedb-operator 1.3.0 deploys operator v1.3.0. greptimedb-cluster 1.3.0 requires greptimedb-operator chart 1.3.0 or later (compatibility matrix).

Dashboard ​

v0.14.2, bundled with v1.3.0, adds Signals Explore, which filters metrics, logs and traces by label and links logs to traces and back. Native and gauge histograms are not charted yet. The timezone setting applies to both displayed times and SQL requests, the logs table scrolls through large result sets, and trace ID queries are fixed.

MCP Server ​

v0.6.1 applies read-only mode to pipeline and dashboard writes: create_pipeline, delete_pipeline, create_dashboard and delete_dashboard require --allow-write true or GREPTIMEDB_ALLOW_WRITE=true. Tool output is capped at 1 MiB by default (GREPTIMEDB_MAX_RESULT_BYTES), and search_table_semantics takes a schema argument to search another database.

Get Involved ​

Open an issue for bugs and feature requests, or drop into the community channel.

Stay in the loop

Join our community