pypi / starrocks
starrocks
What changed in starrocks 3 to 4, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-25.
12 breaking7 security8 new APIs and options3 performance11 behavior and defaults67 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initstarrocks 489 changes
Breaking changes 10
CTAS preserves explicitly declared VARCHAR(N) lengths; newly created tables enforce those lengths on subsequent writes.
INT64 Parquet timestamps with isAdjustedToUTC=false are loaded as wall-clock values without a session timezone shift; reload older data if consistency is required.
Constant folding now matches MySQL 8 backslash-escape semantics, correcting results for some patterns.
Malformed JSON now fails the query in ALLOW_THROW_EXCEPTION SQL mode instead of silently returning NULL.
When unset, newly discovered partitions in auto-discovery jobs with consuming progress start at OFFSET_BEGINNING instead of OFFSET_END.
The query memory limit is now enforced during unnest execution, so large arrays fail the query rather than potentially OOM-killing the BE.
Queries without OPERATE ON SYSTEM now return a clear access-denied error instead of a misleading node-lookup failure.
ARRAY and MAP constructors fail with CapacityLimitExceed when a single chunk exceeds the addressable byte limit; reduce chunk_size or split the expression.
Static partition clauses for Iceberg and Hive tables are validated even when an INSERT specifies target columns; non-partition columns are rejected.
On columns with a GIN inverted index, NOT MATCH no longer returns rows whose value is NULL, following SQL three-valued logic.
Security 7
Negative width values no longer permit unbounded string growth and BE memory exhaustion.
This FE configuration controls HTTP authentication and RBAC enforcement on all external HTTP endpoints.
Fixes SQL injection where a single quote in a predicate value could escape the literal boundary.
Upgraded jackson-databind to fix two deserialization vulnerabilities.
Upgraded Netty to address SNI handler heap exhaustion, IPv6 subnet filter bypass, and DNS cache poisoning.
Masks Tencent COS access and secret keys and the Iceberg JDBC password in catalog output.
Fixes an out-of-bounds read when input ends with a truncated percent-escape sequence.
New APIs and options 8
Adds a BE configuration to reduce memory usage during Primary Key compaction in shared-nothing mode by releasing retained chunk capacity.
Adds refresh_warehouse, refresh_resource_group, refresh_mode, refresh_type, and last_refresh_details observability columns.
Adds a BE configuration item for jemalloc runtime options and exposes it through information_schema.be_configs.
Iceberg and Delta Lake external tables now support partition filter requirements and partition count limits.
Routine Load can continue partition auto-discovery when kafka_partitions and kafka_offsets seed exact starting offsets.
Adds a catalog property that bounds the Iceberg partition cache by memory rather than entry count; its default is 0.1.
Adds LAST_REFRESH_TIME to information_schema.materialized_views and SHOW MATERIALIZED VIEWS, reporting the data-freshness timestamp used by mv_rewrite_staleness_second.
Adds a mutable BE configuration item for the S3 and Azure Blob client cache capacity; its default is 8.
Performance 3
Changing only a column comment uses a lightweight metadata-only path, including for Primary Key columns.
Enables page-level predicate pushdown for BOOLEAN columns in Parquet files.
Table-level locks held during INSERT OVERWRITE are relaxed or shortened, reducing lock contention.
Behavior and default changes 9
Avro Routine Load supports native MAP and STRUCT target columns.
FLOOR and CEIL are non-reserved keywords and can be used as column names without quoting.
Incremental materialized views support bitmap_agg, hll_union, percentile_union, and bitmap_union aggregate functions.
The default increases from 100 to 200, batching more stale-file deletions per object-storage DeleteObjects request.
The function accepts a non-constant needle argument.
The Properties column includes partition, column, and snapshot metadata for external table statistics jobs.
Length increases are allowed on range-distribution shared-data sort-key columns through fast schema evolution without a data rewrite.
With zstd compression, flat JSON sub-columns and synthetic null and offset sub-columns of ARRAY, MAP, and STRUCT columns are compressed for newly written segments.
The Operation column now shows a readable description of the optimize operation instead of an internal object address.
Fixes and other changes 52
Prevents committing cyclic view definitions that could cause subsequent SELECT statements to throw StackOverflowError.
Fixes dropped NULL rows and incorrect row counts when all non-null arrays are empty.
Materialized-view rewriting no longer drops DISTINCT from avg(DISTINCT x), preventing incorrect results when duplicates exist.
CAST(json/variant AS struct) no longer crashes fragment preparation when a struct field name is not a parseable JSON path.
count_combine over nullable columns no longer crashes the BE in the streaming pre-aggregation pass-through path.
CTAS into a Unified catalog using a Hive metastore works with the ENGINE clause in CREATE TABLE AS SELECT.
DATETIME microseconds use ASCII digits regardless of the JVM default locale, so tablet pre-split boundary values remain parseable.
Nested dictionary expressions no longer produce incompatible dictionary translations between producer and consumer fragments that cause runtime failures.
The table-level override can enable first-load statistics collection even when the global config disables it.
Vacuum no longer deletes bundle files still referenced by sibling tablets when bundled segments have zero rows.
The planner locates the target scan node by physical table identity, preserving the base snapshot ID and conflict-detection filter.
DATETIME_PRECISION no longer always returns NULL, restoring column-size metadata for MySQL-protocol clients.
Successfully committed multi-table transaction stream load jobs are shown as VISIBLE rather than remaining at PREPARING.
Shared-data tables now report each physical partition's actual bucket count rather than the table-level default.
Java UDFs load on JDK 21 and later without relying on the removed reflective DirectByteBuffer constructor lookup.
Feedback-driven join rebuild preserves predicateCommonOperators, avoiding InputDependenciesChecker validation failures with common sub-expression reuse.
Changing a flat-JSON column from NOT NULL to nullable no longer causes a CHECK crash in the compaction read path.
The optimizer rule no longer produces nullable outputs with non-nullable declared types when a union branch has no input rows.
Query cache normalization no longer crashes on tables with sub-partitions when empty sub-partitions are pruned.
Query dump replay no longer skips session variables stored under a legacy alias, preventing fallback to default values.
The Iceberg _row_id virtual column returns correct values for data files with multiple Parquet row groups.
Schema changes no longer crash when get_rowset_by_version returns nullptr.
The audit log now records the actual exported row count instead of ReturnRows=0.
Snapshots remain restorable after tablet splits or merges because reshard jobs are considered before parent tablet metadata is reaped.
Compaction dropped during tablet reshard no longer deletes SSTable files reused by pass-through.
Compaction publish preserves rollup and synchronous materialized view indexes that become visible after the compaction transaction begins.
The Properties column always includes the isolation property, shared or isolated, for UDFs and UDAFs.
Partition row counts are no longer written as zero after INSERT OVERWRITE before tablet statistics are refreshed, preserving optimizer cardinality estimates.
Sampling ratios below 1% are supported, including in histogram ANALYZE, avoiding failures when computed ratios previously truncated to zero.
Fixes crashes and incorrect results when multiple UNNEST operators share an input array column and consume different subfields.
Fixes failures when the first argument is an untyped NULL literal.
Integer adjacent differences are widened before calculation, preventing overflow when the difference exceeds the INT range.
Fixes failures when the first argument is an untyped NULL literal.
Prepared-statement ADBC clients can open behind a load balancer; forwarded create and close actions now carry the correct Flight SQL action type.
Fixes std::length_error for predicates on wildcard CHAR columns, such as CAST(json_col->'$.x' AS char).
Fixes over-counting for COUNT(DISTINCT) on bucket-partitioned Iceberg tables with bucket-aware execution and a GROUP BY list containing the bucket column.
Division expressions with a non-constant divisor are no longer treated as monotonic, preventing unsafe Zone Map pruning and incorrect missing rows.
JSON subfield pushdown excludes case-colliding keys from pushdown to prevent wrong results.
Grouping key columns are no longer incorrectly reported as non-nullable at analysis time, correcting result schemas for Arrow Flight SQL clients.
OAuth2 client-credential catalogs rebuild their session and retry a request once after background token refresh exhausts retries; at most one rebuild occurs per 60 seconds.
Garbage collection no longer journals a failed-state change for a table already dropped.
Fixes Java UDF failures on JDK 21 and later caused by removal of a private DirectByteBuffer constructor.
Fixes query rewrite for materialized views on un-partitioned Delta Lake or Kudu tables after successful refresh.
Materialized views no longer treat negative staleness after rollback_to_snapshot as within the rewrite staleness budget.
Paimon tables now support ARRAY, MAP, and STRUCT columns, which could previously crash the BE when queried.
Unconvertible Paimon predicates no longer discard the whole conjunction; convertible conjuncts are retained.
Fixes incomplete per-tablet results being stored and served from the query cache, which could return wrong results.
With checked consistency and a staleness threshold, chained partial refreshes no longer renew freshness for the whole view while another partition lags.
Escapes double quotes in the jsonpaths value so emitted DDL can be parsed and replayed.
Fixes loading column statistics for all-NULL columns when sql_mode includes ERROR_IF_OVERFLOW.
Fixes plan-time failures when aggregating a whole STRUCT column with ROLLUP, CUBE, or GROUPING SETS.
Cyclic view definitions are detected and reported instead of failing with an opaque Unknown error caused by StackOverflowError.
starrocks 319 changes
Breaking changes 2
ALTER VIEW now rejects changes that create cyclic view definitions, rather than allowing a later SELECT to recurse and crash.
Constructors reject results whose flattened size exceeds 4 GB instead of wrapping around and returning corrupted values.
Behavior and default changes 2
The configured codec now also compresses synthetic null/offset sub-columns of flat JSON, ARRAY, MAP, and STRUCT columns.
Manually setting a materialized view from INACTIVE to ACTIVE no longer forces a full-partition refresh.
Fixes and other changes 15
Integer-array differences are widened to BIGINT before subtraction, preventing incorrect results when the true difference exceeds the INT range.
Forwarded requests now use the correct action-type string, fixing prepared statements for ADBC clients behind a load balancer.
Prepared-statement schemas now report view-column nullability correctly; nullability for grouping-set key columns was also corrected.
The missing arrow-compression module was added, restoring LZ4 and ZSTD codec support for compressed Arrow IPC clients.
Statements forwarded to the leader FE now log leader-resolved, fully qualified table relations, excluding CTEs.
dictionary_get no longer rejects a non-NULL key when the input column's cached has_null flag is stale.
Expressions with a non-constant divisor are no longer treated as monotonic, preventing incorrect ZoneMap-based pruning.
Expired external scan contexts now cancel their pipeline fragments instead of leaving them running.
External scan plans now set query delivery timeouts so their query contexts do not wait indefinitely for fragments that will never arrive.
GIN indexes on Primary Key tables now read the correct segment after a column-mode partial update, avoiding stale index data.
Hive getTable now reconnects before falling back to get_table_req(), avoiding intermittent errors when querying Iceberg tables through a Hive metastore catalog.
Background token-refresh sessions now self-heal after prolonged failure, allowing the catalog to refresh its access token again.
Caching of vended-credential tables was reverted on branch-3.5 to avoid delayed visibility of INSERT OVERWRITE transactions against slow REST catalogs.
The cache no longer stores incomplete per-tablet results for aggregations with LIMIT, preventing wrong results from cache hits.
Output struct pruning now uses the input array's subfield group, fixing mismatches between the struct type materialized by BE and declared by FE.