TDengine 3.4.3.3 Release Notes
Release date: 2026-10-18
| Release type | Recommended for |
|---|---|
| Feature release | Users of stream processing, virtual tables, joins, or federated query, and users who need the security fixes in this release |
1. Highlights
- Layered stream rules and cross-source results: One stream rolls results up along a device path, from line to workshop to plant. Event windows support multi-level start conditions and nested windows, and settle on natural months, quarters, and years in the stream's own time zone. External work orders and quality tables can drive a stream. Runtime status is visible in system tables, taosExplorer, and TDinsight. Alert notifications are sent asynchronously, and the stream keeps producing after a leader change or a virtual-table reference change.
- Virtual-table inheritance and cross-layer references: A virtual super table can inherit columns and tags from a parent model, and columns and tags can reference other virtual tables layer by layer. A virtual child table can add its own columns and tags, and virtual tables can be created or dropped in batches. External columns can be filtered before time alignment. One table can reference databases of different time precision. A broken reference names the failed object and the full chain.
- Joins and subqueries: An ordinary
JOINcan match on business columns, ranges, or combined conditions without a primary-timestamp equality. It can appear in the same SQL statement asASOF JOINandWINDOW JOIN, and either side can be a subquery or a virtual table. A scalar subquery can use the current outer row. A window query can return original columns and sequence results.TEXTandFILEcan be queried directly. - Federated query: One SQL statement can query MySQL, PostgreSQL, InfluxDB, and local data together. Windows, aggregates, and
INTERVALcan be pushed down to the external source. The feature is off by default and must be enabled explicitly. - Security fixes: Malformed input that could crash the server or access memory out of bounds is rejected, and known vulnerabilities in the sync module are fixed. The Grafana data-source plugin fixes 30 dependency vulnerabilities. DSNs in XNode tasks and jobs can be shown in encrypted form.
2. Features
2.1 Query
ASOF JOINandWINDOW JOINaccept a virtual table or a subquery as input.WINDOW JOINcan name the time columns on both sides withWINDOW_TIME.- An ordinary
JOINcan be nested withASOF JOINandWINDOW JOINin the order given by SQL parentheses and join associativity. Stream queries support the same nesting. - An equality
JOINuses Hash Join when the inputs are unordered. Inputs already ordered by the join key still use Merge Join. A stable order requiresORDER BY. - Scalar correlated subqueries are supported. No matching row yields
NULL. More than one row or column is an error. DELETEWHEREcan filter on ordinary columns and combine them with a time range and tag conditions usingAND. Composite primary keys,SECURE_DELETE, andORacross time, tag, and ordinary-column conditions remain unsupported.BIT_CHANGES,VALUE_CHANGES, and the time-weighted aggregatesTWAVG,TWSUM, andTWVARare available in queries and stream processing.CSUM(expr) OVER (PARTITION BY ... ORDER BY ...)keeps a running sum for every row, by partition and the specified order.- Exact
PERCENTILEis supported on single-source virtual child tables and virtual normal tables. - External windows support
DIFF,CSUM,MAVG,LAG,LEAD,TOP,BOTTOM,SAMPLE, andHISTOGRAM. The rules match other time windows. See External Window. SHOW TABLE DISTRIBUTEDon a super table sums the compressed data-block size of all its child tables across vnodes. The same figures are available fromINS_TABLE_FIXED_DISTRIBUTED. The total includes only data-file blocks.- External sources can be registered with
CREATE EXTERNAL SOURCE. See Federated Query. - The Spark JDBC dialect
com.taosdata.spark:TDengine-spark-dialect:1.0.0lets PySpark access TDengine over WebSocket after it is registered.
2.2 Stream processing and virtual tables
- Stream processing supports nested mixes of
INNER JOINandLEFT JOIN. - A stream can use a virtual table that references MySQL, PostgreSQL, or InfluxDB columns as its trigger table, mix those columns with local columns, and merge rows by timestamp.
FILL_HISTORYandFILL_HISTORY_FIRSTare not yet supported for such streams. STREAM_OPTIONS(CONFIG)can freeze the time zone and the first day of the week, including natural quarters.- Stream processing supports multi-level nested child events.
- A virtual child table can add its own columns and tags with
CREATE VTABLEandALTER VTABLE. - Tags of normal tables and virtual normal tables can be tag-ref sources for virtual tables, including chained references.
- A virtual table can filter MySQL or PostgreSQL external columns with
WHERE. - A virtual table can reference tables in millisecond, microsecond, and nanosecond databases. Query timestamps are converted automatically.
ALTER STABLE RENAME COLUMNrenames a data column of a super table or a virtual super table.ALTER TABLE ... RENAME TAGrenames a tag of a normal table or a virtual normal table.
2.3 Backup, XNode, and writes
- Cluster-level and database-level full backup and offline restore cover mnode, snode, and vnode data, including stream checkpoints.
CREATE FULL BACKUP,SHOW BACKUPS,KILL BACKUP, andtaosd --restoreare added. Incremental backup and backup of one database are not implemented in this release. RESTART XNODErestarts xnoded on the node that holds the current mnode leader.- XNode DSN protection can be enabled. Sensitive fields in
SHOW XNODE TASKSandSHOW XNODE JOBSare shown as******, and runtime delivery uses envelope encryption. Submitting******inALTERkeeps the stored value. - taosX adds the
archivesubcommand to inspect and export archive and cache files. - A MySQL taosX source can keep a persistent checkpoint for a task-level job (
job_id=-1). After double-vertical-bar string concatenation and storage-engine substitution are turned off, data can be synchronized from Apache Doris over the MySQL protocol. - taosExplorer can configure taosX
-Ttransforms, such as super-table and child-table rename and mapping. - JDBC WebSocket connections add
stmtCacheSizeto cache prepared statements. The default is 5, efficient-write mode defaults to 2, and0turns the cache off. - taosAdapter supports the InfluxDB 1.x ping API. Compatible clients can check availability with
GETorHEAD /influxdb/v1/ping. - taosgen provides a gRPC ingress. An external program pushes normalized rows, and STMT2 batches them into writes.
- Secondary compression can load a pluggable hardware-accelerated zlib, zstd, or lz4 library through environment variables.
3. Enhancements
3.1 Query
HAVINGcan be used withoutGROUP BY,PARTITION BY, or a window.- A join
ONcondition supports equality of an expression on one side, a limited integer or time offset, range comparison, and combined conditions. - When a subquery sort disagrees with a
JOINtime condition, the query returns rows for the actual time condition. - An
INTERVALgrouped by tbname uses the fast path. Grouped last queries read the cache in batches. An eligible ordinary query can be served by a replica. - Super-table
INTERPcovers partition by tag or ordinary column, and transfers less data when results are emitted per child table. - Partitioned state windows spend less time switching among many small partitions, and keep time order inside a partition across vnodes.
- A super-table query with a
tbnameequality uses the name index. FAST_INTERVALandEX_INTERVALare hints for eligible fixed-windowINTERVALqueries.- Comparison of NCHAR with a string literal uses the client character set.
CREATE SMA INDEXis no longer supported. Existing SMA objects can still be queried and dropped.- On Linux, federated query loads a third-party library from
/usr/local/libwhen it is not in an existing search directory. Libraries shipped with the package are still preferred.
3.2 Stream processing and virtual tables
- A stream keeps producing correct results after a source vnode leader change or a vgroup redistribution. A virtual-table stream reloads table information after a leader change. A virtual-table stream with an unmapped source column is no longer redeployed repeatedly.
- When virtual-table metadata changes while a stream is running, the trigger updates references and the child-table list online and the stream stays running.
- Writing a stream into an existing super table checks only the order, names, and types of output columns against the saved columns.
- Event notifications other than
ON_FAILURE_PAUSEare sent asynchronously in batches. streamTriggerMaxPendingParamslimits the calculation parameters a trigger may queue.- Multi-group batching of an external window supports
JOINand nested windows. UnderCOUNT_WINDOWand related triggers, a calculation subquery that contains a derived aggregate can use an external window. - A nested-window stream that joins a dimension table reads that table in batches and, within budget, filters join data by equality keys.
- A metadata transaction can include stream creation, stream deletion, and more table-schema changes.
- When a source table or source column referenced by a virtual table is gone, the query and
SHOW VTABLE VALIDATEname the failed object and the reference chain. A virtual super table whose source column was dropped no longer returns an empty result silently. - A federated query on a virtual table can push windows, aggregates, and
INTERVALdown to the external source.
3.3 Storage and cluster
SPLIT VGROUPruns more efficiently and blocks online writes less.REDISTRIBUTE VGROUPhandles concurrency with writes, stream processing, subscriptions, and virtual-table queries.CREATE DATABASEreturns only after every vgroup has elected a leader, so a followingSHOW CLUSTER ALIVEdoes not report partial availability.BALANCE VGROUP LEADERis split into the default random rebalance andFORCEfor an even distribution. Force may temporarily fail to elect a leader when replicas lag too far.- Forced balance falls back after about 2 minutes, so a lagging replica does not stay without a leader.
- Cluster recovery after a multi-replica leader change is shorter.
- Changing the replica count of a database can set concurrency with
PARALLEL.restore dnodeaddsparallel. compactSpeedLimitMBlimits how fastCOMPACTwrites to disk.0means no limit.snapshotMediumOnLagis off by default. When it is on, a replica that already has data but is behind catches up with a file-level incremental snapshot.- The BLOB value limit rises from 4 MB to 16 MB. The Python and Node.js connectors and taosX support that limit. Python reads larger than 64 KB, and Node.js binds of a larger BLOB, no longer fail.
- A composite primary key can include a
TIMESTAMPcolumn. - Last Cache RocksDB parameters are configurable in
taos.cfgassLastCache*.information_schema.ins_last_cache_statsis added. SHOW VARIABLESandSHOW LOCAL VARIABLESadd arebootcolumn for a setting that has been changed and takes effect only after restart.- Slow-query, UDF, MQTT, and XNode log file names use the
taosprefix.logKeepDayscan remove expired slow-query logs. - taosd writes
[KEYOP]logs for migration, compact, leader election, stream processing, subscription, and virtual-table DDL. - A free license is supported, and the system variable
registerEmailis added. - The community edition cross-checks the operating system against an allowlist at startup, and supports Rocky Linux and AlmaLinux. A proprietary feature returns an error that names the feature.
3.4 Writes, subscription, and clients
- STMT2 can reuse the same statement after a server execution error.
taos_stmt2supports parameter binding forUPDATE. - CSV table creation and import accept a UTF-8 BOM. A non-UTF-8 BOM is rejected.
- A retry for a missing table refreshes table metadata and no longer runs
USEon every retry. - Error codes, SQL prompts, client logs, and command-line tools correct English spelling and grammar. Error-code numbers are unchanged.
- On Windows,
taossupports Tab completion.libtaospreferstaosnative.dllandtaosws.dllin the same directory. - JDBC WebSocket supports
setTimezoneandgetTimezone. Parameter binding converts numeric types automatically. - The Rust connector in
adapter_hamode picks a taosAdapter per connection and refreshes failover addresses from the cluster registry. - A subscription rebalances automatically when vnodes are redistributed.
- When TMQ consumes a wide table, projection column widths are refreshed only after the table schema changes.
3.5 taosX, XNode, and taosExplorer
- A taosX instance registered to one cluster cannot be taken over by another cluster.
- MSSQL, Oracle, and MongoDB taosX sources use the same write-acknowledgement flow as MySQL and PostgreSQL. Cancelling a task does not advance the checkpoint.
- If the XNode bound to a taosX task is missing or unavailable at start, the task tries another schedulable node.
- XNode tasks and jobs return to their desired state after xnoded, taosd, or an Agent reconnects. This is on by default and can be turned off with
--auto-resumeorXNODED_AUTO_RESUME. - taosX and XNode add metrics for CPU, RPC, queues, downstream writes, and the persistent buffer.
- Archive and cache files use a versioned frame format and deduplicate by failure reason. Old files can still be read.
- taosExplorer supports an S3 connectivity test on the backup page, saving a taosX-Agent address, and a single-line truncation hint for long text.
- The taosExplorer Tools page lines up with the Programming cards and adds tool descriptions. Export in the SQL result area uses a text button, as Run and Format do.
- The TDgpt image mounts
modelandmodel_venvson the host, so upgrading the image no longer overwrites models that were added later. - The default taosX and Java plugin packages no longer include OpenTelemetry or Swagger UI. Enable them when they are needed.
- taosgen WebSocket writes reconnect after a disconnect and log retries and recovery.
4. Fixes
4.1 Severe issues
COUNT(DISTINCT)mixed with a plain aggregate returned unstable results. That part was fixed inv3.4.2.10andv3.4.3.0.PARTITION BYwithINTERVALstill collapses each partition into one row. The per-partition distinct fix is not inv3.4.3.3. AggregateDISTINCThas existed sincev3.4.2.0. Affected versions:v3.4.2.0throughv3.4.3.3. (#35495)COUNT(DISTINCT)incorrectly used the tag-count optimization, so aGROUP BYresult included rows outside the time filter. Affected versions:v3.4.2.0throughv3.4.2.11. (#35508)- A concurrent failure on the memory-pool session idle list allocated and destroyed the same session twice, and taosd crashed. Affected versions:
v3.3.5.0throughv3.4.2.8. (#35485) - A dynamic super-table join allocated supplemental columns by row count instead of block capacity, corrupting the heap and crashing taosd. Affected versions:
v3.3.6.0throughv3.4.2.10. (#35509) - After a query memory allocation failed, cleaning up a null subjob context crashed taosd (#35468, #35559). Affected versions:
v3.4.0.0throughv3.4.3.2. FILL_FORWARDon an integer column wrote 8 bytes, past the column width, and corrupted neighboring memory. Affected versions:v3.4.1.0throughv3.4.3.2. (#35550)- After a column compression was changed to TSZ, a later write and query crashed taosd. The encoding of a TSZ column must be
DISABLED. Affected versions:v3.3.0.0throughv3.4.2.9. (#35475) SET TAGon a normal table or a virtual normal table could crash. The tag value was not committed, and the query returnedNULL. Affected versions:v3.4.2.12. (#35505)- A virtual-table column declared narrower than its source wrote past the buffer and crashed taosd. Buffers are now sized to the actual source width. A value that cannot be widened returns
Query buffer limit has reached. Affected versions:v3.3.6.0throughv3.4.3.0. (#35570) LASTwith a time range on a virtual table could reportTable schema is oldor return the wrong column value. Affected versions:v3.4.2.3throughv3.4.3.0. (#35568)DESCRIBEof a federated MySQLDECIMALcolumn that has no precision extension crashed taos and taosAdapter. Affected versions:v3.4.2.0throughv3.4.2.13. (#35534)- A repeated empty heartbeat reply while a stream was reading a virtual table could crash taosd. Affected versions:
v3.4.0.0throughv3.4.2.12. (#35502) - When an external window settled a group with zero rows, the group alias was lost and a null pointer crashed taosd. Settlement of a fully filtered group could also be skipped. Affected versions:
v3.4.1.0throughv3.4.2.12. (#35537) - With low-latency calculation off, new data kept postponing the realtime trigger batch deadline, so a
COUNT_WINDOWsubquery stream produced no output. Affected versions:v3.4.1.0throughv3.4.2.8. (#35490) - When a stream statement had more than one time condition on the same side, the scan range of a point window was computed as empty and the stream wrote no rows. Affected versions:
v3.3.7.0throughv3.4.3.1. (#35566) - History recalculation of a grouped stream was treated as a single group. The stream became Failed and reported
Stream internal error. Affected versions:v3.4.2.7throughv3.4.2.13. (#35474) - After an upgrade, a saved stream plan could not be restored because node numbers had changed, and starting it again still failed. Node numbers have differed since
v3.4.2.0. Affected versions:v3.4.2.0throughv3.4.3.1. (#35556) - A stream kept using a cached virtual-table tag-ref, so it still used the old threshold after the config-table tag changed. Affected versions:
v3.4.2.13throughv3.4.3.1. (#35491) - The Rust connector's native TMQ dropped a message silently when a receive timeout overlapped message arrival, so a subscription or a taosX sync missed rows. Affected versions:
v3.4.2.0throughv3.4.3.0. (#35528) tmq_write_rawswallowed the error and skipped the row when the destination table did not exist, so a caller that creates the table from that error no longer saw it. Affected versions:v3.4.2.0throughv3.4.2.8. (#35523)- A taosX sync did not commit the consumer offset of a partial batch on idle flush or exit. After a restart, or after the sink was briefly unable to write, already synchronized rows were replayed. Affected versions:
v3.4.2.0throughv3.4.3.0. (#35571) - The query window and checkpoint of a taosX relational sync were wrong, so a migration over a large time range wrote no rows. Affected versions:
v3.4.2.0throughv3.4.2.12. (#35510) - After the OPC UA source restarted, the taosX task still showed as running but collected nothing until the task was restarted by hand. Affected versions:
v3.4.2.0throughv3.4.3.2. (#35557) - On Windows,
NOWandNOW()returned a value near 1970-01-01. Sincev3.4.1.0the realtime clock and the monotonic clock shared a number. Affected versions:v3.4.1.0throughv3.4.3.1. (#35565) - When a dnode heartbeat carried an empty vnode-load list,
SHOW VNODESshowed vnodes as offline. Affected versions:v3.4.2.0throughv3.4.2.8. (#35481)
4.2 Query
- A branch of a multi-branch
UNION ALLthat folds to empty is pruned at parse time, so it is not scanned. (#35483) - When
UNION ALLdrops an empty branch, the output column aliases are copied onto the kept branch. An outer query that uses those aliases no longer fails. (#35539) - A client running many
UNIONorUNION ALLbranches of the same type no longer overflows the stack because of deep nesting. (#35503) - With
keepColumnNameon, an implicit column name of a single-argument aggregate or selection function no longer collides with an explicit alias as a false column-ambiguity error. (#35498) - When metadata for a row's schema version cannot be found, the underlying error code is kept instead of always showing
NOT_FOUND. (#35542) - System tables such as
information_schema.ins_columnsaccess only the current database whendb_name = DATABASE(), and no longer contact an unrelated offline vnode. (#35535) - Scanning virtual-child-table tag references in
information_schema.ins_tagsno longer starts an RPC storm that cannot be interrupted. (#35515) - A virtual super-table query ends the catalog task when split vgroup makes a batch metadata request fail, so the query no longer hangs. (#35520)
- A virtual-table query that references a deleted source table or column releases temporary memory. Repeating the query no longer grows taosd memory. (#35530)
- Federated
DESCof an external table keeps the original column-name case. (#35493) - An ordinary user can query a registered external source and a virtual table that references it without a privilege on a local database of the same name. Creating, altering, and dropping an external source still use the existing privilege checks. (#35569)
4.3 Stream processing and virtual tables
CREATE STREAMthat reads a referenced tag from a virtual normal table or a virtual child table includes the physical source table and no longer reports Not found. (#35564)- An
EVENT_WINDOWthat sets onlySTARTand omitsENDcan be deployed. WhenSTARTbecomes false, the window closes at the last row that satisfied the condition. (#35533) - A nested-window stream skips an empty child-table slice produced by
PRE_FILTER. Later rows continue to be calculated. (#35511) - A transient failure to resolve a virtual-table reference no longer redeploys the whole stream, so an out-of-order recalculation result is kept. (#35477)
- A stream that reads a virtual table releases the system-table scan request when the operator is reset or destroyed. (#35525)
- When a notification has several destinations, a destination that already succeeded does not receive the same notification again on a later retry. (#35529)
- Retry and timeout handling is complete when a stream notification is sent on a nonblocking WebSocket. (#35478)
- A failed registration during the first deployment of a stream task no longer leaks the task object. A heartbeat skips a stream that is still being deployed instead of waiting on a slow connection. (#35561)
4.4 Writes, subscription, and clients
- In STMT2 interlace mode, after a child table is dropped from another connection, writing the same child-table name into another super table no longer reports that the table already exists in another super table. (#35522)
- STMT2 computes the
DECIMALscale from the fractional digits and exponent of the bound string. A legal decimal string of length 8 or 16 is no longer treated as binary. (#35540) DROP TABLEcommits only the dropped table's dirty last-cache entries. Dropping a table with the cache enabled is fast again. (#35499)- An MQTT subscription of a database or a super table includes the child-table name in the payload. (#35489)
- A subscription allocates a variable-length column by its actual length and rejects a value longer than the column definition. A string longer than 65535 bytes no longer crashes taosd. (#35546)
- Closing a TMQ consumer releases local resources even when unsubscribe fails, so the connection count no longer keeps growing. (#35497)
getData()in the Go TMQ connector frees the native buffer. A long-running consumer no longer grows memory without bound. (#35484)- After an upgrade from 3.3 to 3.4, an unfinished subscribe rebalance message no longer times out because of an incompatible format. (#35496)
- taosAdapter releases a WebSocket query result after the result set is idle past its timeout. With gzip enabled,
/metricsis no longer compressed twice. (#35516, #35488) - taosBenchmark no longer frees a failed child-table query result twice. (#35538)
taosdump -Z websocketuses port 6041 by default. On Windows it can back up databases and tables whose names contain a colon or Chinese characters. (#35517, #35482)- JDBC WebSocket no longer shifts a
TIMESTAMPa second time when the connection time zone differs from the JVM time zone. (#35562) - When
taosstarts in WebSocket mode, notices for unimplemented entry points go to the client log and are no longer printed on the terminal. (#35558) - On Windows, the taosd service can start xnoded. Starting taosd in the foreground as Administrator and then as a LocalSystem service no longer fails because the stream temporary directory has a different owner. (#35501, #35555)
- On Windows, when
timezoneis unset, the time zone name recognized by the system is kept. Creating a stream no longer fails because the name was truncated toSystem.ALTERwith an invalid time zone is rejected before the transaction starts. (#35563, #35567) - Parsing a string timestamp is no longer slow because the time-zone library was built without optimizations. (#35518)
- Client libraries no longer export statically linked third-party symbols, so they do not collide with OpenSSL when linking on Intel macOS. (#35543)
- When the xnoded executable cannot be found,
CREATE XNODEreturns a clear error instead of Unknown error 65534. The firstCREATE XNODEwaits until the control endpoint is ready. (#35549, #35548) - Community
taosno longer shows proprietary commands such asrestore. (#35576) - Community taosd on a supported Linux system no longer refuses to start because dpkg is installed, another distribution's identity remains, or os-release files disagree. (#35551)
4.5 taosX and taosExplorer
- After xnoded reconnects to taosX, an ingest task scheduled by XNode, such as OPC DA, no longer stops by itself. (#35527)
- The query window of MySQL live sync can be configured, so incremental SQL can return rows. (#35476)
- MQTT and SparkplugB sources accept
version=3.x. taosX does not support MQTT 3.1 (MQIsdp). taosExplorer removes the "3.1" option. An existing task with that setting still connects as 3.1.1. (#35479, #35553) - OPC collection can parse GBK and GB18030 configuration. pSpace can parse Chinese node names in those encodings. (#35532, #35544)
- taosExplorer can select and upload a CSV when configuring an OPC DA source. The OPC DA connectivity check and the CSV upload show a result. (#35519, #35536)
- On Windows, CSV import accepts a
\\?\extended path, and the path is no longer truncated. (#35487) - The PI plugin connects to AF with the same credentials as the Data Archive. Starting a console realtime task no longer calls an uninitialized backfill manager. (#35526)
- An S3 restore no longer hangs forever when the bucket has no backup files. Deleting a backup task also drops the oneshot topic it created. (#35492)
- A scheduled backup no longer drops a due period while the previous run is still going. It runs that period as soon as the previous run finishes. (#35541)
- When several taosX tasks connect to the same taosAdapter cluster, the connections spread across nodes. To pin one endpoint, set
adapter_ha=falsein the task DSN. (#35521) - Updating a task no longer writes a dropped column, so the cloud console can save a Kafka ingest task. (#35480)
- A TDengine data-query task shows monitoring data in taosExplorer. (#35486)
- Foreground
replicaandprivilegescommands create a log only when a diagnostic event occurs. They no longer leave an empty file or delete a service log that is still in use. (#35524) - taosExplorer can finish the SQLite migration and log in after an upgrade from an older version. (#35554)
- The task list restores activity history after a refresh, start, or stop. (#35512)
- Creating or editing a user and selecting database Read or Write also grants
USE. Removing the last Read or Write privilege also revokesUSE. This behavior applies fromv3.4.0.0. (#35552) - Opening Data Subscription no longer reports that topics failed to load when the cluster-address or password cache is wrong and the topics were already returned. (#35560)
- Viewing or editing a database no longer runs
SHOW disk_infoautomatically. (#35514) - When editing a database,
WAL_RETENTION_PERIODaccepts-1through2147483647and no longer writes a legal value below 3600 back as 3600. The default for creating a database remains 3600. (#35531) - Advanced filter on a super table can enter conditions. An
ANDof different tags returns child tables that satisfy all of them. Past the display limit, the exact child-table count is shown. The list shows at most 500 tables by default. The rest are found by search. (#35545, #35513) - Editing an existing taosX-Agent fills in the endpoint and token. (#35536)
- The community and compact editions no longer call proprietary taosX monitoring, token, license, and user-privilege APIs. The dashboard no longer queries proprietary tables that do not exist, and it shows taosX with the other components. (#35506, #35500, #35504)
- When an XNode drain fails, the node stays in Drain. Tasks that have not been drained are not scheduled again. (#35547)
5. Security
5.1 Vulnerability fixes
- In the community edition, only a superuser can change system objects. A signed-in ordinary user can no longer
ALTER DNODE, alter another user, or change their own IP whitelist. GHSA-xhwr-25r2-jg46, CWE-862. - TMQ checks the consumer owner before returning vnode endpoints and rejects another user's consumerId. GHSA-crfh-3p34-23cw, CWE-639.
INSERTdeserialization rejects a column count or jump length that would wrap the length arithmetic. GHSA-gmhq-7r4w-7rp5, CWE-190.- Sync Append Entries, sync snapshot processing, message lengths truncated to 32-bit integers, and string decoding that did not check the destination buffer correspond to GHSA-q86r-32wm-qwpg, GHSA-xg67-9f8r-64v5, GHSA-hr67-c6c8-mwpx, and GHSA-x8q3-55fg-4pwh.
- The Cluster ID check in sync RequestVote could be bypassed. GHSA-c39q-62fx-c853.
- A create-function request did not check the code length or the name length. GHSA-qh9p-wprq-p2hf, GHSA-8c53-8w6m-w28r.
REPEAT()and an SQL Hint with an oversized parameter could overflow a buffer for an authenticated user. GHSA-f939-x5h3-cg4f, GHSA-j63p-9gcr-5fv8.- A query plan whose
DECIMALTLV length disagrees with the declared byte size is rejected. GHSA-pc9g-w85r-7c6x. - A stream heartbeat without a length check could underflow an integer. GHSA-382r-9pxq-7vg2.
- TDgpt installer extraction refuses to write outside the destination directory. GHSA-4w45-hf5j-95m3.
- taosKeeper audit writes escape request fields and check timestamps, database names, and table names, so that interface can no longer rewrite the audit log. GHSA-9m72-77jp-x5f2. The report interface no longer concatenates request fields into SQL, and
TDengine.skipVerifyis added. Certificate verification is still skipped by default. - The zstd bundled with TSZ is upgraded from 1.3.5 to 1.3.8, fixing an out-of-bounds write when the destination buffer is too small. CVE-2019-11922, GHSA-2hff-w2r4-f7g5. See NVD.
- Updating a client endpoint set no longer computes the message length from uninitialized memory. TD-SEC-2026-001.
- taosX upgrades quinn-proto to 0.11.19, addressing RUSTSEC-2026-0342, RUSTSEC-2026-0339, RUSTSEC-2026-0340, RUSTSEC-2026-0338, and RUSTSEC-2026-0341 in 0.11.15.
- The Grafana plugin TDengine-datasource upgrades frontend and backend dependencies, fixing 30 known vulnerabilities, 1 critical and 10 high.
DROP DNODEno longer treats the request FQDN as a format string when the node ID does not exist.- The
PRECISIONrange check on database creation takes effect. An out-of-range value is no longer used as a time-tick index. CWE-129. - A super-table
COMMENTrejects a value that is too long or whose length does not match.SHOW STABLEStruncates a comment that was already stored too long. CWE-121. - A TMQ subscribe request rejects a consumer group, client identifier, user, FQDN, or topic list that exceeds its capacity. CWE-121.
- A stream heartbeat rejects an out-of-range or inconsistent group id, an out-of-range deploy index, and an out-of-range trigger status, so mnode does not crash or touch freed memory. CWE-129, CWE-476, CWE-787.
- Shared-storage migration rejects a response whose vgroup index is out of range. Showing transaction details ignores a null stage action, avoiding a null-pointer crash. CWE-476.
- mnode rejects a configuration name longer than 128 bytes, an out-of-range vgroup replica count, and an oversized shared-storage migration database name.
DECIMALrejects an oversized exponent and an illegal precision or scale, avoiding an out-of-bounds access.- Query-plan and SQL parsing check node types, required children, lengths, and nesting depth. A malformed plan returns an error.
- TMQ and MQTT check the response header, message type, data-block length, and batch metadata before decoding, and reject an illegal topic filter.
- Virtual-table metadata is rejected as an invalid message when the column-reference count disagrees, the batch response type is wrong, or the table name is missing.
- Message decoding no longer trusts a length declared by the peer.
- The TDgpt Analytics service tightens buffer bounds and access control, and limits the address used to create taosanode. Access to an internally deployed taosanode can be configured, and requests are no longer forwarded to taosanode automatically.
- taosdump restore checks lengths and column counts in an untrusted backup.
taoswrites interactive history one statement at a time. Create and alter statements that containPASS,TOKEN, orTOTP_SECRETare not written to history.~/.taos_historyis tightened to mode0600. Control characters in text returned by the server are dropped on display.- On macOS, the related log files are created with mode
0666, so an ordinary user can write a log file created by root. - Directory settings no longer expand commands. Log and archive files do not follow symbolic links. Compression decoding rejects an illegal codec marker and a length that would wrap.
- taosd no longer trusts an xnoded pid file or unix socket under dataDir, or the runtime files of udfd and taosmqtt. A pid file is not followed as a symbolic link. Only an xnoded whose owner and executable name both match is stopped. Companion processes are loaded only from the install directory.
- A user deleted and recreated with the same name no longer inherits ownership of the previous user's XNode tasks. (#35494)
5.2 Hardening
xnodeDsnProtectionis added and defaults to0. When it is on, XNode DSN passwords inSHOWand taosExplorer are shown as******. Submitting the placeholder while editing keeps the stored password. Errors and logs no longer print a password, certificate, or private-key path. Connectivity checks, sampling, and preview carry onlytask_id.SHOW XNODE TASKSandSHOW XNODE JOBSsupportWITH ENCRYPTED.- Stream
wss://notifications check the certificate chain and hostname by default. An untrusted, expired, or hostname-mismatched certificate is rejected.ws://is unchanged. - The database encryption key is checked before a vnode is opened. A wrong key returns a dedicated verification error.
- taosBenchmark reports an error and exits on a CSV row or tag table name that exceeds capacity, instead of writing past the buffer silently.
- Install and packaging tighten permissions on the data directory and driver libraries. Temporary files use
mktemp. - TSZ decode and compress check capacity.
- Object-storage downloads and TDB page offsets are bounds-checked.
- Stream heartbeats, task deployment, and result blocks check length, index, and task type.
6. Upgrade notes
6.1 Upgrade path
- Versions that can upgrade directly:
v3.3.7and later. - Rolling upgrade: supported, from
v3.4.3.0throughv3.4.3.3. - Downgrade or rollback: supported, from
v3.4.3.0throughv3.4.3.3. - Minimum client and connector version:
v3.4.3.0.
6.2 Behavior changes
BALANCE VGROUP LEADERnow rebalances at random by default. AddFORCEfor the previous even distribution. When replicas lag too far, force may temporarily fail to elect a leader.- An equality
JOINuses Hash Join when the inputs are unordered. Results stay the same. Row order may change. WriteORDER BYwhen a stable order is required. - A subquery sort that disagrees with a
JOINtime condition no longer returns an error. The query returns rows for the actual time condition. CREATE SMA INDEXreturns unsupported. Existing SMAs can still be queried and dropped.- When column compression is TSZ, that column's encoding must be
DISABLED. - A taosX instance registered to one cluster cannot be taken over by another cluster.
- taosX WebSocket connections are balanced across taosAdapter endpoints by default. To pin one endpoint, set
adapter_ha=falsein the task DSN. - A scheduled backup no longer drops a due period while the previous run is still going. It runs that period as soon as the previous run finishes. The actual interval may be shorter than the configured period.
- Stream
wss://notifications check the server certificate by default. An untrusted, expired, or hostname-mismatched connection fails.ws://is unchanged. - Event notifications other than
ON_FAILURE_PAUSEare sent asynchronously by default. Under high load a notification may be dropped. - JDBC
TSWSPreparedStatementchanges from a class to an interface. Recompile after upgrading the driver, or the runtime throwsIncompatibleClassChangeError. A statement cannot be used afterclose(). - When a connection time zone is set and WebSocket is used, the epoch from
getTimestamp()is correct again, andtoString()follows the JVM default time zone. There is no change when the connection time zone is unset. - The next start of
taossets~/.taos_historyto mode0600. Several statements on one line are stored as several history entries. Create and alter statements that containPASS,TOKEN, orTOTP_SECRETare no longer written to history. - Slow-query, UDF, MQTT, and XNode log file names use the
taosprefix. A collector that matches the old file names needs to be updated. - In the community edition, an ordinary user can no longer
ALTER DNODEor change an IP whitelist. A proprietary feature returns an error that names the feature, instead of failing silently. - A TDgpt Lite container does not start models automatically after a restart.
6.3 Configuration changes
21 parameters are added. None are removed. The lower bound of 2 parameters is relaxed.
6.3.1 Stream processing
| Parameter | Purpose |
|---|---|
streamNotifyWorkerNum | Asynchronous notification threads on each snode. When unset, the value follows the CPU count, with a ceiling of 8. The configurable range is 1 to 16. A change takes effect after restart. |
streamNotifyBatchIntervalMs | Longest wait, in milliseconds, before asynchronous notifications are sent together. The default is 5, range 0 to 60000. A change takes effect after restart. |
streamNotifyParamPoolSize | Size of the pending-object pool for asynchronous notifications, in KB. The default is 10240, range 1 to 262144. A change takes effect after restart. |
streamTriggerMaxPendingParams | Maximum parameters one nested trigger may hold. The default is 1048576. A change takes effect immediately. |
6.3.2 Query, storage, and cluster
| Parameter | Purpose |
|---|---|
maxRetryTimes | Retries for a query-scheduling task. The default is 12, range 1 to 1000. A change takes effect after restart. |
enableFollowerRead | Whether an eligible query may read from a vgroup replica. Off by default. Both the client and the server can change it dynamically, without a restart. |
compactSpeedLimitMB | Limits COMPACT disk writes, in MB/s. The default is 0, meaning no limit, range 0 to 1024. The actual speed may be lower than the setting. |
snapshotMediumOnLag | A replica that holds data but is behind uses a file-level incremental snapshot. Off by default. A change takes effect immediately. |
backupPullupInterval | Backup scheduler poll and catch-up interval, in seconds. The default is 10, range 1 to 10000. It has no effect in the community edition. |
rpcQueueMemoryAllowed | The configurable lower bound drops from 32 MB to 10 MB. The derived value and the derived quota use the new lower bound. |
syncLogBufferMemoryAllowed | The configurable lower bound drops from 320 MB to 100 MB. |
Last Cache RocksDB parameters can all be changed dynamically and take effect after restart.
| Parameter | Purpose |
|---|---|
sLastCacheOptionsOverride | Native RocksDB option string, lowest priority. Empty by default. |
sLastCacheCompressionType | Compression algorithm. The default is none. |
sLastCacheBackgroundThreads | Background threads. The default is 2, range 1 to 256. |
sLastCacheMaxWriteBufferNumber | Maximum number of memtables. The default is 2, range 1 to 64. |
sLastCacheWriteBufferSize | Size of one memtable, in MB. The default is 8, range 1 to 1048576. |
sLastCacheBloomFilterBits | Bloom filter bits. 0 turns it off. The default is 10, range 0 to 32. |
sLastCacheMaxOpenFiles | Maximum open files. The default is -1, meaning no limit. |
6.3.3 Security, clients, and monitoring
| Parameter | Purpose |
|---|---|
xnodeDsnProtection | Whether DSN output of ins_xnode_tasks and ins_xnode_jobs is encrypted. The default is 0, range 0 to 1. A change takes effect after restart. |
xnodeDsnPublicKeyFile | Public-key file used to encrypt a DSN. Empty by default. A change takes effect after restart. |
xnodedDsnPrivateKeyFile | Private-key file used to decrypt a DSN. Empty by default. A change takes effect after restart. |
anodeAllowInternalUrl | Whether an ANODE may be created with an internal address. On by default. A change takes effect immediately. |
registerEmail | Registration email for the free edition. Empty by default. A change takes effect immediately. |
stmtCacheSize | JDBC WebSocket prepared-statement cache size. The default is 5, efficient-write mode defaults to 2, and 0 turns the cache off. |
TDengine.skipVerify | Whether taosKeeper skips certificate verification when usessl=true. The default is true, matching the previous behavior. |
prometheus.maxTotalEntries | Total entry limit of the taosKeeper v2 memory cache. The default is 100000. New entries are rejected at the limit. Cached data is unchanged. |
prometheus.maxEntriesPerTable | Per-table cache entry limit in taosKeeper. The default is 10000. |
6.4 Keyword changes
Nine keywords are added. None are removed. When one of these words is used as a database, table, super table, child table, column, or tag name, quote it with backticks regardless of case. See Reserved Keywords.
6.4.1 Backup
BACKUP, BACKUPS, and INCREMENTAL, used by CREATE BACKUP, SHOW BACKUPS, and KILL BACKUP.
6.4.2 Nodes
RESTART, used by RESTART XNODE.
6.4.3 Joins
CROSS, used by CROSS JOIN. WINDOW_TIME, used by WINDOW JOIN to name the time columns. MERGE_JOIN and JOIN_ALGO, used by the hint that selects a join algorithm.
6.4.4 Stream processing
_EVENT_CONDITION_PATH, the condition-path pseudo column of an event window.
6.5 System table changes
Two tables are added. Four existing tables gain columns. Two existing tables lengthen columns. No table is removed.
6.5.1 New tables
information_schema.ins_backups: cluster backup records. Columns areid,status,chain,database,full,encrypted,size,vgroups,start_time, andupdate_time.information_schema.ins_last_cache_stats: Last Cache runtime statistics. It includes the dnode, vgroup, and database name, block-cache capacity and usage, memtable size and flush, compaction and SST files, whether writes are throttled, andupdate_time.
6.5.2 New columns on existing tables
information_schema.ins_streams:timezoneandfirst_day_of_week.information_schema.ins_dnode_variables:reboot, whether a runtime change takes effect only after restart.SHOW VARIABLESandSHOW LOCAL VARIABLESreturn the same column.information_schema.ins_xnode_tasksandinformation_schema.ins_xnode_jobs:desired_state, the state restored after a task restarts.
6.5.3 Lengthened columns
information_schema.ins_xnode_tasks:fromandtoare twice as long. The column names and meanings are unchanged.information_schema.ins_xnode_jobs:configis lengthened to theSHOWdisplay limit. The column name and meaning are unchanged.
6.5.4 Removed tables
None.
6.6 Dependency changes
The table lists dependencies in the install package whose versions changed. The zstd and quinn-proto vulnerabilities are described in chapter 5.
| Component | Dependency | v3.4.2.8 | v3.4.3.3 |
|---|---|---|---|
| TSZ | zstd | 1.3.5 | 1.3.8 |
| taosX | quinn-proto | 0.11.15 | 0.11.19 |
| taosX | rustls | 0.23.38 | 0.23.46 |
| taosX | rustls-webpki | 0.103.13 | 0.103.15 |
| taosX | aws-lc-rs | 1.16.3 | 1.18.1 |
| taosX | aws-lc-sys | 0.40.0 | 0.45.0 |
| Rust connector | rustls | 0.23.35 | 0.23.45 |
| Rust connector | rustls-webpki | 0.103.13 | 0.103.14 |
| Rust connector | aws-lc-rs | 1.16.3 | 1.18.1 |
| Rust connector | aws-lc-sys | 0.40.0 | 0.45.0 |
| Python WebSocket connector | rustls | 0.23.37 | 0.23.45 |
| Python WebSocket connector | rustls-webpki | 0.103.13 | 0.103.14 |
| JDBC connector | taos-jdbcdriver | 3.9.0 | 3.10.0 |
| JDBC connector | jackson | 2.22.0 | 2.22.1 |
| JDBC connector | netty | 4.2.15.Final | 4.2.17.Final |
| taosAdapter | golang.org/x/crypto | 0.53.0 | 0.57.0 |
| taosAdapter | golang.org/x/net | 0.56.0 | 0.60.0 |
| taosKeeper | gorilla/websocket | 1.5.0 | 1.5.3 |
| taosKeeper | driver-go | 3.7.8 | 3.8.3 |
| Go connector | gorilla/websocket | 1.5.0 | 1.5.3 |
| Grafana plugin tdengine-datasource | axios | 1.16.0 | 1.18.0 |
| Grafana plugin tdengine-datasource | immutable | 4.3.8 | 4.3.9 |
| Grafana plugin tdengine-datasource | dompurify | 3.4.11 | 3.4.13 |
| Grafana plugin tdengine-datasource | protobufjs | 7.6.3 | 7.6.5 |
| Grafana plugin tdengine-datasource | kin-openapi | 0.131.0 | 0.144.0 |
| Grafana plugin tdengine-datasource | grpc | 1.79.3 | 1.83.2 |
| Grafana plugin tdengine-datasource | OpenTelemetry SDK | 1.43.0 | 1.45.0 |
| Grafana plugin tdengine-datasource | OpenTelemetry OTLP exporter | 1.28.0 / 1.29.0 | 1.45.0 |
| Grafana plugin tdengine-datasource | golang.org/x/mod | 0.37.0 | 0.40.0 |
6.7 Before you upgrade
An upgrade from v3.3.6 cannot keep the old stream processing. If the old streams, TSMA, snode, and their data directories are not removed, taosd fails to start. See Compatibility Notes.
A cluster that already rebuilt stream processing on v3.4.0.0 or later does not need to repeat those steps when rolling to this release.
Also check these three items:
- For a
wss://stream notification, the certificate is trusted, not expired, and the hostname matches the URL. - If taosX still has cache that has not been replayed, drain it before rolling back. Old-format files can still be read.
- If a JDBC application holds
TSWSPreparedStatement, recompile it after upgrading the driver.
7. Known issues
None.
8. Downloads
Packages are available from the TDengine download center. Each package includes SPDX and CycloneDX SBOMs, and a SHA256 checksum.