v1.0.0-beta.1
Release date: November 11, 2025
π¨ Breaking changesβ
- refactor(pipeline)!: change dispatch table name format by @paomian in #6901
- feat!: improve
greptime_identitypipeline behavior by @waynexia in #6932 - refactor!: add
enable_read_cacheconfig to support disable read cache explicitly by @zyy17 in #6834 - refactor!: remove pb_value to json conversion, keep json output consistent by @sunng87 in #7063
- refactor!: unify the API of getting total cpu and memory by @zyy17 in #7049
- refactor!: add a
opentelemetry_traces_operationstable to aggregate(service_name, span_name, span_kind)to improve query performance by @zyy17 in #7144 - feat(metric)!: enable sparse primary key encoding by default by @WenyXu in #7195
π Highlightsβ
Dashboard v0.11.7 Releasedβ
- Metrics UI optimization: separated table and chart tabs, independent instant/range queries, support for time picker and multi-value display.
- Timezone optimization: support for timezone validation and local storage persistence.
- Flow management: UI for flow task CRUD operations.
Bulk Memtableβ
For scenarios with high cardinality primary keys, this release introduces experimental Bulk Memtable and a new data organization format (flat format). Both must be used together. Bulk Memtable offers lower memory usage when dealing with high cardinality primary keys. When primary key cardinality exceeds two million, memory usage can be reduced by more than 75%. Currently, Bulk Memtable performs better with larger write batch sizes, and we recommend setting batch sizes to 1024 rows or more when using Bulk Memtable. Additionally, the new data organization format provides better query performance in high cardinality scenarios compared to the original format.
Users can enable the new data format and Bulk Memtable by specifying sst_format as flat when creating tables.
CREATE TABLE flat_format_table(
request_id STRING,
content STRING,
greptime_timestamp TIMESTAMP TIME INDEX,
PRIMARY KEY (request_id))
WITH ('sst_format' = 'flat');
Additionally, for tables using the old format, you can switch to the flat format and Bulk Memtable using an ALTER statement.
ALTER TABLE old_format_table SET 'sst_format' = 'flat';
Tables using the flat format cannot be converted back to the old format. We will gradually switch the default format to the new format in future releases.
Independent Index File Cachingβ
This release implements independent local caching for index files on object storage, allowing index files to be cached in local disk cache as much as possible, reducing the probability of accessing object storage during index queries. By default, the database allocates 20% of disk cache space to index files. Users can adjust this ratio by setting the index_cache_percent parameter.
In previous versions, when users increased the local disk cache size, only newly generated data files could enter the local write cache, providing limited improvement for querying historical data. In this version, the database loads index files from object storage to local storage in the background after startup, reducing the time required for historical data queries.
Read-Write Permission Control Modeβ
This release introduces permission mode support for the static user provider, implementing read-write access control with support for read-only, write-only, and read-write permissions. This enhancement enables administrators to create users with specific access levels, improving security and data governance.
The static user provider now accepts the format username:permission_mode=password, where the optional permission_mode can be:
rw(read-write): Full access to read and write operationsro(read-only): Restricted to read operations onlywo(write-only): Restricted to write operations only
Examples:
# Read-write user (default, backward compatible)
greptime_user=greptime_pwd
# Or explicitly specified
greptime_user:rw=greptime_pwd
# Read-only user
greptime_user:ro=greptime_pwd
# Write-only user
greptime_user:wo=greptime_pwd
This feature is fully backward compatible with the old format - users without an explicitly specified permission mode default to read-write access (rw).
TQL Supports Value Aliasingβ
TQL now supports AS aliases for clearer column names and easier SQL integration.
TQL EVAL (0, 30, '10s') http_requests_total AS requests;
New objbench Subcommand (Datanode)β
This release adds the greptime datanode objbench subcommand for conducting read/write performance benchmarks on specified SST files in object storage. This tool can be used to analyze storage layer performance, troubleshoot slow queries or I/O latency issues, and supports generating flame graphs for deeper performance diagnostics.
Main Features
- Perform read/write performance tests on individual SST files
- Support detailed output (-v/--verbose)
- Support generating SVG flame graphs (--pprof-file)
- Can load datanode configuration files (--config)
# Basic test
greptime datanode objbench --config datanode.toml --source <path>.parquet
# Generate flame graph
greptime datanode objbench --config datanode.toml --source <path>.parquet --pprof-file flamegraph.svg
π Featuresβ
- feat: Update parquet writer and indexer to support the flat format by @evenyag in #6866
- feat: unify FlushRegions instructions by @aaraujo in #6819
- feat: implement basic write/read methods for bulk memtable by @evenyag in #6888
- feat: Supports flat format in SeqScan and UnorderedScan by @evenyag in #6905
- feat: put sqlness into a separated dir by @waynexia in #6911
- feat: humanize analyze numbers by @waynexia in #6889
- feat: file ref mgr by @discord9 in #6844
- feat: add
written_bytes_since_opencolumn toregion_statisticstable by @WenyXu in #6904 - feat: support function alias by @MichaelScofield in #6917
- feat: add CPU, memory and node status info to
cluster_infoby @WenyXu in #6897 - feat: add udtf (table function) registration by @sunng87 in #6922
- feat(pipeline): generate create table sql from pipeline config by @shuiyisong in #6930
- feat(mito): backfill partition expr on region open by @zhongzc in #6862
- feat: add InformationExtension.inspect_datanode for datanode inspection by @zhongzc in #6921
- feat: Implements compaction for bulk memtable by @evenyag in #6923
- feat: add origin_region_id and node_id to sst entry by @zhongzc in #6937
- feat: store partition expr per file in region manifest by @waynexia in #6849
- feat: exiting staging mode on success case by @waynexia in #6913
- feat: expose workload filter to selector options by @WenyXu in #6951
- feat: support flat format for SeriesScan by @evenyag in #6938
- feat: support flush and compact flat format files by @evenyag in #6949
- feat: add visible to sst entry for staging mode by @zhongzc in #6964
- feat: add an flag to enable the experimental flat format by @evenyag in #6976
- feat: add TLS support for mysql backend by @WenyXu in #6979
- feat: datanode side local gc worker by @discord9 in #6940
- feat: extract standalone functionality and introduce plugin-based router configuration by @WenyXu in #7002
- feat: update dashboard to v0.11.5 by @ZonaHex in #7001
- feat: add ssts related system table by @zhongzc in #6924
- feat: refine failure detector by @waynexia in #7005
- feat(copy_to_csv): add
date_format/timestamp_format/time_format. by @linyihai in #6995 - feat: sql parse about show create trigger by @fengys1996 in #7016
- feat: supports permission mode for static user provider by @killme2008 in #7017
- feat: upgraded pg_catalog support by @sunng87 in #6918
- feat: converts batches in old format to the flat format in query time by @evenyag in #6987
- feat: supports expression in TQL params by @killme2008 in #7014
- feat: update dashboard to v0.11.6 by @ZonaHex in #7026
- feat: add
max_connection_ageconfig to grpc server by @MichaelScofield in #7031 - feat: enable zstd for bulk memtable encoded parts by @evenyag in #7045
- feat: pgwire 0.33 update by @sunng87 in #7048
- feat: able to pass external service for sqlness test by @MichaelScofield in #7032
- feat: introduce IndexBuildTask for async index build by @SNC123 in #6927
- feat: align influxdb line timestamp with table time index by @MichaelScofield in #7057
- feat: struct value and vector by @sunng87 in #7033
- feat: supports value aliasing in TQL by @killme2008 in #7041
- feat: divide subtasks from old/new partition rules by @waynexia in #7003
- feat: explain custom statement by @discord9 in #7058
- feat: remap SST files for partition change by @waynexia in #7071
- feat: apply region partition expr to region scan by @waynexia in #7067
- feat: support setting sst_format in table options by @evenyag in #7068
- feat: conversion between struct, value and json by @sunng87 in #7052
- feat(parser): ALTER TABLE ... REPARTITION ... by @waynexia in #7082
- feat: add updated_on to tablemeta with a default of created_on by @Standing-Man in #7072
- feat: add Value::Json value type by @sunng87 in #7083
- feat: manual compaction parallelism by @v0y4g3r in #7086
- feat: memtable seq range read by @discord9 in #6950
- feat: supports large string by @killme2008 in #7097
- feat: add index cache eviction support by @zhongzc in #7064
- feat(trigger): support "for" and "keep_firing_for" by @fengys1996 in #7087
- feat: new create table syntax for new json datatype by @MichaelScofield in #7103
- feat(mito2): expose puffin index metadata by @zhongzc in #7042
- feat: introduce the Noop WAL provider for datanode by @WenyXu in #7105
- feat: expose SST index metadata via information schema by @zhongzc in #7044
- feat: implement three build types for async index build by @SNC123 in #7029
- feat: 14 days PRs review reminder by @fengjiachun in #7123
- feat: introduce
OpenRegionsandCloseRegionsinstructions to support batch region operations by @WenyXu in #7122 - feat: update pgwire to 0.34 for a critical issue on accepting connection by @sunng87 in #7127
- feat: writer mem limiter for http and grpc service by @fengjiachun in #7092
- feat: pr review reminder frequency by @fengjiachun in #7129
- feat: create table with new json datatype by @MichaelScofield in #7128
- feat: add
cpu_usage_millicoresandmemory_usage_bytesininformation_schema.cluster_infotable. by @zyy17 in #7051 - feat: add a missing pg_catalog function current_database by @sunng87 in #7138
- feat: store estimated series num in file meta by @evenyag in #7126
- feat: adds regex_extract function and more type tests by @killme2008 in #7107
- feat: add HTTP endpoint to control prof.gdump feature by @v0y4g3r in #6999
- feat: merge json datatype by @MichaelScofield in #7142
- feat: prefix option for timestamp index and value column by @shuiyisong in #7125
- feat: part sort provide dyn filter by @discord9 in #7140
- feat: update datafusion-pg-catalog for better dbeaver support by @sunng87 in #7143
- feat: gc worker heartbeat instruction by @discord9 in #7118
- feat: objbench sub command for datanode by @v0y4g3r in #7114
- feat(mito): Optimize async index building with priority-based batching by @SNC123 in #7034
- feat: json vector builder by @MichaelScofield in #7151
- feat: update dashboard to v0.11.7 by @ZonaHex in #7170
- feat: BulkMemtable stores small fragments in another buffer by @evenyag in #7164
- feat: allow creating logical table with same partition rule with physical table's by @waynexia in #7177
- feat: add greptime's arrow json extension type by @sunng87 in #7168
- feat: import backup data from local files by @waynexia in #7180
- feat(expr): support avg functions on vector by @Standing-Man in #7146
- feat: disable default compression for
__op_typecolumn by @waynexia in #7196 - feat: allow fuzz input override through env var by @v0y4g3r in #7208
- feat: report scanner metrics by @waynexia in #7200
- feat: query mem limiter by @fengjiachun in #7078
- feat: tracks index files in another cache and preloads them by @evenyag in #7181
- feat: support altering sst format for a table by @evenyag in #7206
π Bug Fixesβ
- fix: staging mode with proper region edit operations by @waynexia in #6962
- fix: print the output message of the error in admin fn macro by @evenyag in #6994
- fix: make EXPIRE (keyword) parsing case-insensitive, when creating flow by @Shyamnatesan in #6997
- fix: promql range function has incorrect timestamps by @waynexia in #7006
- fix: incorrect timestamp resolution in information_schema.partitions table by @waynexia in #7004
- fix: match promql column reference in case sensitive way by @waynexia in #7013
- fix: group by expr not as column in step aggr by @discord9 in #7008
- fix(cli): fix FS object store handling of absolute paths by @WenyXu in #7018
- fix: skip placeholder when partition columns by @discord9 in #7020
- fix: not step when aggr have order by/filter by @discord9 in #7015
- fix: step aggr merge phase not order nor filter by @discord9 in #6998
- fix: fix test_resolve_relative_path_relative on windows by @paomian in #7039
- fix: fix panic and limit concurrency in flat format by @evenyag in #7035
- fix: use instance labels to fetch
greptime_memory_limit_in_bytesandgreptime_cpu_limit_in_millicoresmetrics by @zyy17 in #7043 - fix: various typos reported by CI by @sunng87 in #7047
- fix: build_grpc_server visibility by @sunng87 in #7054
- fix: only skips auto convert when encoding is sparse by @evenyag in #7056
- fix: show proper error msg, when executing non-admin functions as admin functions by @Shyamnatesan in #7061
- fix: support dictionary in regex match by @evenyag in #7055
- fix: correct impl Clear for &[u8] by @v0y4g3r in #7081
- fix: part cols not in projection by @discord9 in #7090
- fix: fix build warnings by @WenyXu in #7099
- fix: list inner type for json and valueref, refactor type to ref for struct/list by @sunng87 in #7113
- fix: prom ql logical plan use column index not name by @discord9 in #7109
- fix: unit test about trigger parser by @fengys1996 in #7132
- fix: fix index and tag filtering for flat format by @evenyag in #7121
- fix: correct test_index_build_type_compact by @SNC123 in #7137
- fix: count_state use stat to eval&predicate w/out region by @discord9 in #7116
- fix: add delays in reconcile tests for async cache invalidation by @WenyXu in #7147
- fix: cache estimate methods by @waynexia in #7157
- fix: missing flamegraph feature in pprof dependency by @WenyXu in #7158
- fix: memtable value push result was ignored by @MichaelScofield in #7136
- fix: initializer container not work by @daviderli614 in #7152
- fix: avoid filtering rows with delete op by fields under merge mode by @evenyag in #7154
- fix: potential failure in tests by @killme2008 in #7167
- fix: stabilize test results by @shuiyisong in #7182
- fix(mito): append mode in flat format not working by @v0y4g3r in #7186
- fix(mito): avoid shortcut in picking multi window files by @v0y4g3r in #7174
- fix: add serde defaults for
MetasrvNodeInfoby @WenyXu in #7204 - fix: allow case-insensitive timezone settings by @sunng87 in #7207
- fix: correct leader state reset and region migration locking consistency by @WenyXu in #7199
- fix(mito): allow region edit in writable state by @v0y4g3r in #7201
- fix: deregister failure detectors on rollback and improve timeout handling by @WenyXu in #7212
π Refactorβ
- refactor: use DataFusion's Signature directly in UDF by @MichaelScofield in #6908
- refactor: use DataFusion's return_type in our function trait directly by @MichaelScofield in #6935
- refactor: refactor
PeerLookupServiceand simplifySelectorimplementations by @WenyXu in #6939 - refactor: rewrite h3 functions to DataFusion style by @MichaelScofield in #6942
- refactor: region follower management with unified interface by @WenyXu in #6986
- refactor: put FileId to store-api by @discord9 in #6988
- refactor: rewrite some UDFs to DataFusion style (part 2) by @MichaelScofield in #6967
- refactor: rewrite some UDFs to DataFusion style (part 3) by @MichaelScofield in #6990
- refactor(cli): refactor object storage config by @WenyXu in #7009
- refactor: rewrite some UDFs to DataFusion style (part 4) by @MichaelScofield in #7011
- refactor: cleanup datafusion-pg-catalog dependencies by @sunng87 in #7025
- refactor: rewrite some UDFs to DataFusion style (final part) by @MichaelScofield in #7023
- refactor: make
Functiontrait a simple shim of DataFusion UDF by @MichaelScofield in #7036 - refactor: add cgroup metrics collector by @zyy17 in #7038
- refactor: remove duplicated valueref to json by @sunng87 in #7062
- refactor: restructure sqlness to support multiple envs and extract common utils by @WenyXu in #7066
- refactor: remove unused grpc-expr module and pb conversions by @sunng87 in #7085
- refactor: add
peer_hostnamefield ininformation_schema.cluster_infotable by @zyy17 in #7050 - refactor: update valueref coerce function name based on its semantics by @sunng87 in #7098
- refactor: convert to mysql values directly from arrow by @MichaelScofield in #7096
- refactor: convert to postgres values directly from arrow by @MichaelScofield in #7131
- refactor: refactor instruction handler and adds support for batch region downgrade operations by @WenyXu in #7130
- refactor: use generic for heartbeat instruction handler by @discord9 in #7149
- refactor: add test feature gate to numbers table by @shuiyisong in #7148
- refactor: convert to prometheus values directly from arrow by @MichaelScofield in #7153
- refactor: add support for batch region upgrade operations part1 by @WenyXu in #7155
- refactor: add support for batch region upgrade operations part2 by @WenyXu in #7160
- refactor: convert to influxdb values directly from arrow by @MichaelScofield in #7163
π Documentationβ
- docs: update memory profiling description doc by @sunng87 in #6960
- docs: laminar flow rfc by @discord9 in #6928
π§ͺ Testingβ
- test: add upgrade compatibility tests by @WaterWhisperer in #6863
- test: migrate aggregation tests from duckdb, part4 by @killme2008 in #6965
- test: update unit test by passing extra sort columns by @discord9 in #7030
- test: run engine unit tests for flat format by @evenyag in #7119
- test: add sqlness for delete and filter by @evenyag in #7171
- test: run sqlness for flat format by @evenyag in #7178
- test: add a unit test to scan data from memtable in append mode by @evenyag in #7193
- test: only set ttl to forever in fuzz alter test by @evenyag in #7202
βοΈ Miscellaneous Tasksβ
- chore: bump main branch version to 0.18 by @WenyXu in #6890
- chore: clean up
FlowEnginetrait by @discord9 in #6934 - chore: add tests for postgre backend with tls by @WenyXu in #6973
- chore: bump sequence on region edit by @v0y4g3r in #6947
- chore: unset tz env in test by @v0y4g3r in #6984
- chore: modify LogExpr AggrFunc by @paomian in #6948
- chore: improve error logging in WAL prune manager by @WenyXu in #6993
- chore: update proto by @discord9 in #6992
- chore: add function for getting started on metasrv by @shuiyisong in #7022
- chore: add some trace logs in fetching data from cache and object store by @zyy17 in #6877
- chore: disable file not exist on watch_file_user_provider by @shuiyisong in #7028
- chore: not warning by @discord9 in #7037
- chore: improve create trigger display by @fengys1996 in #7027
- chore: rename the default ts column name to
greptime_timestampfor influxdb line protocol by @shuiyisong in #7046 - chore: add trigger querier factory trait by @fengys1996 in #7053
- chore: update rust to nightly 2025-10-01 by @MichaelScofield in #7069
- chore: add information extension to the plugins in standalone by @shuiyisong in #7079
- ci: update dev-builder image tag by @github-actions[bot] in #7073
- chore: pub route_prometheus function by @v0y4g3r in #7101
- chore: remove unused deps by @fengys1996 in #7108
- chore: pr review reminder by @fengjiachun in #7120
- chore: update datafusion to 50 by @MichaelScofield in #7076
- chore: set default catalog using build env by @shuiyisong in #7156
- chore: unify initialization of channel manager by @shuiyisong in #7159
- chore: fix typo by @sunng87 in #7169
- chore: improve search traces and jaeger resp by @shuiyisong in #7166
- chore(metrics): add region server requests failures count metrics by @v0y4g3r in #7173
- chore: update readme by @sunng87 in #7187
- chore: remove unnecessary code related to triggers by @fengys1996 in #7192
- chore: print root cause in opendal logging interceptor by @evenyag in #7183
- chore: remove ttl option if presents in trace meta table by @shuiyisong in #7197
- chore: bump main branch version to 1.0.0-beta.1 by @discord9 in #7191
Buildβ
New Contributorsβ
- @Standing-Man made their first contribution in #7146
- @Shyamnatesan made their first contribution in #7061
- @cscnk52 made their first contribution in #6946
- @WaterWhisperer made their first contribution in #6863
All Contributorsβ
We would like to thank the following contributors from the GreptimeDB community:
@MichaelScofield, @SNC123, @Shyamnatesan, @Standing-Man, @WaterWhisperer, @WenyXu, @ZonaHex, @aaraujo, @cscnk52, @daviderli614, @discord9, @evenyag, @fengjiachun, @fengys1996, @github-actions[bot], @killme2008, @linyihai, @paomian, @shuiyisong, @sunng87, @v0y4g3r, @waynexia, @zhongzc, @zyy17