CockroachDB v21.1 is a required Regular Release.
Refer to Major release types before installing or upgrading for release timing and support details.
On this page, you can read about changes and find downloads for all production and testing releases of CockroachDB v21.1
For key feature enhancements in v21.1 and other upgrade considerations, refer to the notes for v21.1.0.
For details about release types, naming, and licensing, refer to the Releases page.
Be sure to also review the Release Support Policy.
After downloading a supported CockroachDB binary, learn how to install CockroachDB.
Get future release notes emailed to you:
v21.1.21
Release Date: September 15, 2022
Command-line changes
- Added the
--log-config-varsflag to thecockroachCLI, which allows for environment variables to be specified for expansion within the logging configuration file. This change allows for a single logging configuration file to service an array of sinks without further manipulation of the configuration file. #85173
Contributors
This release includes 1 merged PR by 2 authors.
v21.1.19
Release Date: May 9, 2022
Enterprise edition changes
- Fixed a bug where backups in the base directory of a Google Storage bucket would not be discovered by
SHOW BACKUPS. These backups will now appear correctly. #80509
SQL language changes
- Previously, a user could run an
AS OF SYSTEM TIMEincremental backup with an end time earlier than the previous backup's end time, which could lead to an out of order incremental backup chain. An incremental backup will now fail if theAS OF SYSTEM TIMEis less than the previous backup's end time. #80500
DB Console changes
- Added a dropdown filter on the Node Diagnostics page to view by active, decommissioned, or all nodes. #80340
- Added an alert banner on Overview list page for staggered node versions #80748
Bug fixes
- Fixed a bug that caused an internal error when the inner expression of a column access expression evaluated to
NULL. For example, evaluation of the expression(CASE WHEN b THEN ((ROW(1) AS a)) ELSE NULL END).awould error whenbisfalse. This bug has been present since v19.1 or earlier. #79527 - Fixed a bug that caused an error when accessing a named column of a labelled tuple. The bug only occurred when an expression could produce one of several different tuples. For example,
(CASE WHEN true THEN (ROW(1) AS a) ELSE (ROW(2) AS a) END).awould fail to evaluate. Although present in previous versions, it was impossible to encounter due to limitations that prevented using tuples in this way. #79527 - Addressed an issue where automatic encryption-at-rest data key rotation would get disabled after a node restart without a store key rotation. #80171
- The timeout when checking for Raft application of upgrade migrations has been increased from 5 seconds to 1 minute, and is now controllable via the cluster setting
kv.migration.migrate_application.timeout. This makes migrations much less likely to fail in clusters with ongoing rebalancing activity during upgrade migrations. #80754 - Fixed a bug where, in rare circumstances, CockroachDB could incorrectly evaluate queries with
ORDER BYclause when the prefix of ordering was already provided by the index ordering of the scanned table. #80732 - Fixed a goroutine leak when internal rangefeed clients received certain kinds of retryable errors. #80795
Contributors
This release includes 18 merged PRs by 13 authors.
v21.1.18
Release Date: April 12, 2022
Bug fixes
- Fixed a bug where restores of data with multiple column families could be split illegally (within a single SQL row). This could result in temporary data unavailability until the ranges on either side of the invalid split are merged. #79207
- Fixed a bug where
SHOW SCHEMAS FROM <schema>would not include user-defined schemas. #79306 - Previously,
LIMITqueries with anORDER BYclause which scan the index of a virtual system tables, such aspg_type, could return incorrect results. This has been corrected by teaching the optimizer thatLIMIToperations cannot be pushed into ordered scans of virtual indexes. #79466 - Fixed a bug that caused the optimizer to generate invalid query plans which could result in incorrect query results. The bug, present since version v21.1.0, can appear if all of the following conditions are true:
- The query contains a semi-join, e.g., with the format
SELECT * FROM a WHERE EXISTS (SELECT * FROM b WHERE a.a @> b.b). - The inner table has a multi-column inverted index containing the inverted column in the filter.
- The index prefix columns are constrained to a set of values via the filter or a
CHECKconstraint, e.g., with anINoperator. In the case of aCHECKconstraint, the column isNOT NULL. #79508
- The query contains a semi-join, e.g., with the format
Contributors
This release includes 12 merged PRs by 10 authors.
v21.1.17
Release Date: April 4, 2022
Security updates
- Users can enable HSTS headers to be set on all HTTP requests, which force browsers to upgrade to HTTPS without a redirect. This is controlled by setting the
server.hsts.enabledcluster setting, which isfalseby default, totrue. #77863
Enterprise edition changes
SQL language changes
- Added a
sql.auth.resolve_membership_single_scan.enabledcluster setting, which changes the query for an internal role membership cache. Previously the code would recursively look up each role in the membership hierarchy, leading to multiple queries. With the setting on, it uses a single query. This setting isfalseby default. #77624
Operational changes
- The
cockroach debug tsdumpcommand now downloads histogram timeseries it silently omitted previously. #78054
Command-line changes
- The
cockroach debug tsdumpcommand now allows viewing timeseries data even in cases of node failure by allowing users to rerun the command with the import filename set to"-". #78057 - Fixed a bug where starting
cockroach demowith the--globalflag would not simulate latencies correctly when combined with the--insecureflag. #78173
Bug fixes
- Fixed a bug where draining nodes in a cluster without shutting them down could stall foreground traffic in the cluster. #77494
- Fixed a bug that caused errors when attempting to create table statistics with
CREATE STATISTICSorANALYZEfor a table containing an index which indexed only virtual computed columns. #77566 - Added a limit of seven concurrent asynchronous consistency checks per store, with an upper timeout of one hour. This prevents abandoned consistency checks from building up in some circumstances, which could lead to increasing disk usage as they held onto Pebble snapshots. #77612
- Fixed a bug where the Details page was not loading for statements whose app name contains
/were not properly loading their Details pages. #77946 - Fixed a memory leak in the Pebble block cache. #78262
- Fixed a bug that caused internal errors when
COALESCEandIFexpressions had inner expressions with different types that could not be cast to a common type. #78345 - Fixed a bug that caused errors when trying to evaluate queries with
NULLvalues annotated as a tuple type, such asNULL:::RECORD. #78638 - Fixed a bug that caused the optimizer to generate invalid query plans which could result in incorrect query results. The bug, which has been present since version v21.1.0, can appear if all of the following conditions are true: 1) the query contains a semi-join, such as queries in the form:
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.a = t2.a);, 2) the inner table has an index containing the equality column, liket2.ain the example query, 3) the index contains one or more columns that prefix the equality column, and 4) the prefix columns areNOT NULLand are constrained to a set of constant values via aCHECKconstraint or anINcondition in the filter. #78976
Contributors
This release includes 20 merged PRs by 15 authors.
v21.1.16
Release Date: March 7, 2022
Bug fixes
- Fixed a bug that caused the query optimizer to omit join filters in rare cases when reordering joins, which could result in incorrect query results. This bug was present since v20.2. #76621
- Fixed a bug where some rows within query results could be omitted if the query references a column within a composite key with a null value. Previously, CockroachDB could incorrectly omit a row from query results against a table with multiple column families when that row contains a NULL value when a composite type (FLOAT, DECIMAL, COLLATED STRING, or any arrays of such a type) is included in the PRIMARY KEY. For the bug to occur, a composite column from the PRIMARY KEY must be included in any column family other than the first one. #76637
- Fixed a race condition that, in rare circumstances, could cause a node to panic with
unexpected Stopped processorduring shutdown. #76828 - There is now a 1 hour timeout when sending Raft snapshots to avoid stalled snapshot transfers. Stalled snapshot transfers could prevent Raft log truncation, thus growing the Raft log very large. This timeout is configurable via the
COCKROACH_RAFT_SEND_SNAPSHOT_TIMEOUTenvironment variable. #76830 CASEexpressions with branches that result in types that cannot be cast to a common type now result in a user-facing error instead of an internal error. #76618- A bug has been fixed that could corrupt indexes containing virtual columns or expressions. The bug only occurred when the index's table had a foreign key reference to another table with an
ON DELETE CASCADEaction, and a row was deleted in the referenced table. This bug was present since virtual columns were added in v21.1.0. #77057
Performance improvements
- Fixed a bug in the histogram estimation code that could cause the optimizer to think a scan of a multi-column index would produce 0 rows, when in fact it would produce many rows. This could cause the optimizer to choose a suboptimal plan. This bug has now been fixed, making it less likely for the optimizer to choose a suboptimal plan when multiple multi-column indexes are available. #76557
- The accuracy of histogram calculations for
BYTEStypes has been improved. As a result, the optimizer should generate more efficient query plans in some cases. #76797
Contributors
This release includes 10 merged PRs by 6 authors.
v21.1.15
Release Date: February 14, 2022
This page lists additions and changes in v21.1.15 since v21.1.14.
Enterprise edition changes
- Kafka sinks now support larger messages, up to 2GB in size. #76322
SQL language changes
- Non-admin users can now use the
SHOW RANGESstatement if theZONECONFIGprivilege is granted. #76072 ST_MakePolygonis now disallowed from making empty polygons from empty linestrings. This is not allowed in PostGIS. #76256
Bug fixes
- Mixed dimension linestrings are now prohibited in
ST_MakePolygon. #76256 - Fixed a bug which could cause nodes to crash when truncating abnormally large Raft logs. #75980
Contributors
This release includes 6 merged PRs by 6 authors.
v21.1.14
Release Date: February 9, 2022
SQL language changes
- Collated strings may now have a locale that is a language tag, followed by a
-u-suffix, followed by anything else. For example, any locale with a prefix ofen-US-u-is now considered valid. #74754
Command-line changes
- Fixed the CLI help text for
ALTER DATABASEto show correct options forADD REGIONandDROP REGION, and include some missing options such asCONFIGURE ZONE. #75075
Bug fixes
- Fixed a panic when attempting to access the hottest ranges (e.g., via the
/_status/hotrangesendpoint) before initial statistics had been gathered. #74514 - Servers no longer crash due to panics in HTTP handlers. #74533
- Previously, running
IMPORT TABLE ... PGDUMP DATAwith aCOPY FROMstatement in the dump file that had fewer target columns than the inline table definition would result in a nil pointer exception. This is now fixed. #74452 - Previously, a doubly nested
ENUMin a DistSQL query would not be hydrated on remote nodes, resulting in panic. This is now fixed. #74527 - Error messages produced during import are now truncated. Previously, import could potentially generate large error messages that could not be persisted to the jobs table, resulting in a failed import never entering the failed state and instead retrying repeatedly. #73335
- Fixed a bug where deleting data via schema changes (e.g., when dropping an index or table) could fail with a
command too largeerror. #74797 - Fixed panics that were possible in some distributed queries using
ENUMs in join predicates. #75086 - Fixed a bug which caused errors in rare cases when trying to divide
INTERVALvalues byINT4orINT2values. #75091 - Fixed a bug that caused internal errors when altering the primary key of a table. The bug was only present if the table had a partial index with a predicate that referenced a virtual computed column. This bug was present since virtual computed columns were added in v21.1.0. #75193
- Fixed a bug that could occur when a
TIMETZcolumn was indexed, and a query predicate constrained that column using a<or>operator with aTIMETZconstant. If the column contained values with time zones that did not match the time zone of theTIMETZconstant, it was possible that not all matching values could be returned by the query. Specifically, the results may not have included values within one microsecond of the predicate's absolute time. This bug was introduced when theTIMETZdatatype was first added in v20.1. It exists on all releases of v20.1, v20.2, v21.1, and v21.2 prior to this patch. #75173 - Fixed an internal error,
estimated row count must be non-zero, that could occur during planning for queries over a table with aTIMETZcolumn. This error was due to a faulty assumption in the statistics estimation code about ordering ofTIMETZvalues, which has now been fixed. The error could occur whenTIMETZvalues used in the query had a different time zone offset than theTIMETZvalues stored in the table. #75173 - Previously, during restore, CockroachDB would not insert a
system.namespaceentry for synthetic public schemas. This is now fixed. #74760 RESTORE ... FROM LATEST INnow works to restore the latest backup from a collection without needing to first inspect the collection to supply its actual path. #75437- Fixed a bug that caused internal errors in queries with set operations, like
UNION, when corresponding columns on either side of the set operation were not the same. This error only occurred with a limited set of types. This bug is present in v20.2.6+, v21.1.0+, and v21.2.0+. #75294 - The
CancelSessionendpoint now correctly propagates gateway metadata when forwarding requests. #75886
Contributors
This release includes 27 merged PRs by 16 authors.
v21.1.13
Release Date: January 10, 2022
SQL language changes
"visible"is now usable as a table or column name without extra quoting. #72996- The
create_type_statementstable now has an index ondescriptor_id. #73672 - Added a new
stmtcolumn to thecrdb_internal.(cluster|node)_distsql_flowsvirtual table. This column is populated on a best-effort basis. #73582 - The cluster setting that controls the default value for the session setting
reorder_joins_limit, calledsql.defaults.reorder_joins_limit, is now public and included in the docs. #73891 - Added escape character processing to constraint span generation. Previously, escaped-like lookups resulted in incorrect results. #74258
Operational changes
- Added a new
bulkio.ingest.flush_delaycluster setting to act as a last-resort option to manually slow bulk-writing processes if needed for cluster stability. This should only be used if there is no better suited back-pressure mechanism available for the contended resource. #73757
DB Console changes
- Fixed drag-to-zoom on custom charts. #72589
- Node events will now display a permission error rather than an internal server error when a user does not have admin privileges to view events. #72464
- The absolute links on the Advanced Debug page within the DB Console have been updated to relative links. This will enable these links to work with the superuser dashboard in the Cloud Console. #73122
Bug fixes
- Fixed a bug which allowed computed columns to also have
DEFAULTexpressions. #73192 - Fixed a bug causing
RESTOREto sometimes map OIDs to invalid types in certain circumstances containing user-defined types. #73120 BACKUP WITH revision_historywould previously fail on an upgraded but un-finalized cluster. Now, it should succeed. #73110- Fixed a bug causing CockroachDB to not set the
TableOIDandTableAttributeNumberattributes ofRowDescriptionmessage of pgwire protocol in some cases (these values would be left as 0). #72449 - Fixed a bug causing CockroachDB to encounter an internal error or crash when some queries involving tuples with
ENUMvalues were executed in a distributed manner. #72481 - Fixed a bug causing usernames in
ALTER TABLE ... OWNER TOto not be normalized to lower case. #72658 - Previously,
atttypmodinpg_catalog.pg_attributesforDECIMALtypes with precision but no width was incorrectly "-1". This is now populated correctly. #72075 - Corrected how
typedisplays for ZM shapesgeometry_columnsto match PostGIS output. This previously incorrectly included the Z/M lettering. #71434 - Corrected how
typedisplays ingeography_columnsto better match PostGIS. This was previously in the wrong casing. #71434 - The
setvalbuilt-in function previously did not invalidate cached sequence values. This is fixed now. #71822 - Fixed a bug preventing tuple type labels from being propagated across queries when run under DistSQL. #70391
- Fixed a bug whereby setting the
CACHEfor a sequence to 1 was ignored. Before this changeALTER SEQUENCE ... CACHE 1would succeed but would not modify the cache value. #71448 - When using
COPY FROM .. BINARY, the correct format code will now be returned. #69255 - Fixed a bug causing
COPY FROM ... BINARYto return an error if the input data was split across different messages. #69255 - Fixed a bug causing
COPY FROM ... CSVto require eachCopyDatamessage to be split at the boundary of a record. This was a bug since theCOPYprotocol allows messages to be split at arbitrary points. #69255 - Fixed a bug causing
COPY FROM ... CSVto not correctly handle octal byte escape sequences such as\011when using aBYTEAcolumn. #69255 - Manually enqueueing ranges via the DB Console will no longer crash nodes that contain an uninitialized replica for the enqueued range. #73038
- Fixed a crash with message "attempting to propose command writing below closed timestamp" that could occur, typically on overloaded systems experiencing non-cooperative lease transfers. #73166
- The
txnwaitqueue.pusher.waitingmetric no longer over-reports the number of pushing transactions in some cases. #71743 - Fixed a rare condition that could cause a range merge to get stuck waiting on itself. The symptom of this deadlock was a goroutine stuck in
handleMergeInProgressErrorfor tens of minutes. #72049 - Fixed bugs causing
CREATE TABLE ASandCREATE MATERIALIZED VIEWto panic if theSELECTquery was an internal table requiring internal database state. #73620 - Fixed a rare internal error, "estimated row count must be non-zero", which could occur when planning queries using a GIN index. This error could occur if the histogram on the GIN index showed that there were no rows. #73353
- Fixed an internal error, "empty Datums being compared to other", that could occur during planning for some
SELECTqueries over tables that included aDEFAULTpartition value in aPARTITION BY LISTclause. This bug had been present since 21.1.0. The bug does not exist on versions 20.2.x and earlier. #73663 - Fixed a bug in database and schema restore cleanup that resulted in a dangling descriptor entry on job failure. #73412
- Fixed a bug with the ungraceful shutdown of distributed queries in some rare cases. #73959
- Fixed a bug causing CockroachDB to return a spurious "context canceled" error for a query that actually succeeded in extremely rare cases. #73959
- Fixed a bug which caused corruption of partial indexes, which could cause incorrect query results. The bug was only present when two or more partial indexes in the same table had identical
WHEREclauses. This bug had been present since version 21.1.0. #74475
Performance improvements
- Improved
IMPORT INTOperformance in cases where it encounters large numbers of unresolved write intents. #72272 - The performance of transaction deadlock detection is now more stable even with significant transaction contention. #71743
- Bulk ingestion of small write batches (e.g., index backfill into a large number of ranges) is now throttled, to avoid buildup of read amplification and associated performance degradation. Concurrency is controlled by the new cluster setting
kv.bulk_io_write.concurrent_addsstable_as_writes_requests. #74072
Contributors
This release includes 52 merged PRs by 26 authors.
v21.1.12
Release Date: November 15, 2021
Security updates
- Added the
--external-io-enable-non-admin-implicit-accessflag to cluster-startingcockroachcommands. This flag removes the admin-only restriction on interacting with arbitrary network endpoints and allows implicit authorization for operations such asBACKUP,IMPORT, orEXPORT. #71794
SQL language changes
- The
pg_indextable now populates theindpredcolumn for partial indexes. This column was previouslyNULLfor partial indexes. #70897 - Added
crdb_internaltablescross_db_referencesandinterleavedfor detecting cross-database references and interleaved objects. #72298 - Statements with multiple
INSERT ON CONFLICT,UPSERT,UPDATE, orDELETEsubqueries that modify the same table are now disallowed, as these statements can cause data corruption if they modify the same row multiple times. At the risk of data corruption, you can allow these statements by setting thesql.multiple_modifications_of_table.enabledcluster setting totrue. To check for corruption, use theEXPERIMENTAL SCRUBcommand. For example:EXPERIMENTAL SCRUB TABLE t WITH OPTIONS INDEX ALL;. #71621
Operational changes
IMPORTnow allows non-admin access to some previously-restricted network endpoints on clusters started with the--external-io-enable-non-admin-implicit-accessflag. #72444- A new implementation of
BACKUPfile handling is now available with the cluster settingbulkio.backup.experimental_21_2_mode.enabledset totrue. #71830
DB Console changes
- Non-admin users of the DB Console now have the ability to view the Cluster Overview page. Users without the admin role can see data about their nodes, but information such as command line arguments, environment variables, and node IP addresses and DNS names is hidden. #71719
- Replicas waiting for garbage collection were preventing the Range Report page from loading due to a JavaScript error. The page now loads and displays an empty "Replica Type" while in this state. #71745
Bug fixes
- Fixed a bug causing CockroachDB to encounter an internal error when executing a zigzag join in some cases. #71255
- Fixed a bug causing CockroachDB to incorrectly read the data of a unique secondary index that used to be a primary index that was created via
ALTER PRIMARY KEYin 21.1.x or prior versions. #71587 - CockroachDB now avoids dialing nodes in performance-critical code paths, which could cause substantial latency when encountering unresponsive nodes (e.g., when a VM or server is shut down). #70488
- Fixed a bug causing the TPC-C workload to improperly assign workers to the local partitions in a multi-region setup. #71753
- Fixed a bug that caused internal errors when collecting statistics on tables with virtual computed columns. #71284
- Fixed a bug causing CockroachDB to crash when network connectivity was impaired in some cases. The stack trace (in
cockroach-stderr.log) would containserver.(*statusServer).NodesUI. #71719 - Fixed a panic that could occur with invalid GeoJSON input using
ST_GeomFromGeoJSON/ST_GeogFromGeoJSON. #71308 - Fixed a bug causing cluster backups to back up opt-out system tables unexpectedly. #71922
- Fixed a bug that caused
ALTER COLUMN TYPEstatements to fail unexpectedly. #71166 - Connection timeout for
grpcconnections is now set to20sto match the pre-20.2 default value. #71516 - Fixed a bug that prevented the rollback of
ALTER PRIMARY KEYwhen the old primary key was interleaved. #71852 - Fixed a bug that caused incorrect results for some queries that utilized a zigzag join. The bug could only reproduce on tables with at least two multi-column indexes with nullable columns. The bug was present since version 19.2.0. #71847
- Fixed a bug causing
IMPORTstatements to incorrectly reset progress upon resumption. #72086 - Fixed a bug causing schema changes running during node shutdown to fail permanently. #71558
- Fixed an incorrect "no data source matches prefix" error for queries that use a set-returning function on the right-hand side of a
JOIN(unlessLATERALis explicitly specified). #71443 - Long running
ANALYZEstatements no longer result in GC TTL errors. #69599 IMPORT INTOno longer crashes when encountering unresolved write intents. #71982- Fixed a bug causing tracing to external tracers to inadvertently stop after the Enqueue Range or the Allocator debug pages were used. #72463
- Fixed a bug which prevented the Data Distribution debug page from working on clusters which were upgraded from 19.2 or earlier. #72507
Performance improvements
- Slightly reduced
ANALYZEandCREATE STATISTICSstatements memory usage. #71771 - To reduce transient memory usage, CockroachDB now performs intent cleanup during garbage collection in batches as they are found instead of performing a single cleanup at the end of the garbage collection cycle. #67590
Contributors
This release includes 51 merged PRs by 23 authors.
v21.1.11
Release Date: October 18, 2021
Enterprise edition changes
- Fixed a bug where
CHANGEFEEDs would fail to correctly handle a primary key change. #69926 CHANGEFEEDs no longer fail when started onREGIONAL BY ROWtables. Note that inREGIONAL BY ROWtables, thecrdb_regioncolumn becomes part of the primary index. Thus, changing an existing table toREGIONAL BY ROWwill trigger a changefeed backfill with new messages emitted using the new composite primary key. #70022- Fixed a bug that could have led to duplicate instances of a single changefeed job running for prolonged periods of time. #70926
SQL language changes
- Added
crdb_internal.(node|cluster)_distsql_flowsvirtual tables that expose the information about the flows of the DistSQL execution scheduled on remote nodes. These tables do not include information about the non-distributed queries nor about local flows (from the perspective of the gateway node of the query). #66332 - Added new metrics to track a schema job failure (
sql.schema_changer.errors.all,sql.schema_changer.errors.constraint_violation,sql.schema_changer.errors.uncategorized), with errors inside thecrdb_internal.feature_usagetable. #70621 - Fixed a bug where
LINESTRINGZ,LINESTRINGZM, andLINESTRINGMcould not be used as column types. #70749
Operational changes
- Added the cluster settings
sql.defaults.transaction_rows_written_log,sql.defaults.transaction_rows_written_err,sql.defaults.transaction_rows_read_log, andsql.defaults.transaction_rows_read_err(as well as the corresponding session variables). These settings determine the "size" of the transactions in written and read rows that are logged to theSQL_PERFlogging channel. Note that the internal queries used by CockroachDB cannot error out, but can be logged instead to theSQL_INTERNAL_PERFlogging channel. The "written" limits apply toINSERT,INSERT INTO SELECT FROM,INSERT ON CONFLICT,UPSERT,UPDATE, andDELETEwhereas the "read" limits apply toSELECTstatements, in addition to all of the others listed. These limits will not apply toCREATE TABLE AS SELECT,IMPORT,TRUNCATE,DROP TABLE,ALTER TABLE,BACKUP,RESTORE, orCREATE STATISTICSstatements. Note that enabling thetransaction_rows_read_errsetting comes at the cost of disabling the usage of the auto commit optimization for the mutation statements in implicit transactions. #70175 - Adjusted the meaning of the recently introduced session variables
transaction_rows_written_errandtransaction_rows_read_err(as well as the corresponding_logvariables) to indicate the largest number of rows that is still allowed. Prior to this change, reaching the limit would result in an error; now an error results only if the limit is exceeded. #70175 - Added the session variable
large_full_scan_rows, as well as the corresponding cluster settingsql.defaults.large_full_scan_rows. This setting determines which tables are considered "large" for the purposes of enabling thedisallow_full_table_scansfeature to reject full table/index scans of such "large" tables. The default value for the new setting is0, meaning that the previous behavior of rejecting all full table/index scans is kept. Internally-issued queries aren't affected, and the new setting has no impact when thedisallow_full_table_scanssetting is not enabled. #70294 - CockroachDB now records a log event and increments a counter when removing an expired session. #68538
Command-line changes
- Version details have been added to all JSON formatted log entries. #70451
DB Console changes
- Renamed references to the UI console from "Admin UI" to "DB Console". #70870
Bug fixes
- Fixed a bug where cluster revision history backups may have included dropped descriptors in the "current" snapshot of descriptors on the cluster. #69650
- Fixed a regression in statistics estimation in the optimizer for very large tables. The bug, which has been present since v20.2.14 and v21.1.7, could cause the optimizer to severely underestimate the number of rows returned by an expression. #69953
- Fixed a bug that can cause prolonged unavailability due to lease transfer of a replica that may be in need of a Raft snapshot. #69964
- Fixed a bug where, after a temporary node outage, other nodes in the cluster could fail to connect to the restarted node due to their circuit breakers not resetting. This would manifest in the logs via messages of the form
unable to dial nXX: breaker open, whereXXis the ID of the restarted node. Note that such errors are expected for nodes that are truly unreachable, and may still occur around the time of the restart, but for no longer than a few seconds. #70311 RESTOREwill now correctly ignore dropped databases that may have been included in cluster backups with revision history. #69791- Fixed a bug where if tracing was enabled (using the
sql.trace.txn.enable_thresholdcluster setting), the statement diagnostics collection (EXPLAIN ANALYZE (DEBUG)) would not work. #70035 - Fixed a bug in full cluster restores where dropped descriptor revisions would cause the restore job to fail. #69654
- Fixed a bug where schema changes that included both a column addition and primary key change in the same transaction resulted in a failed changefeed. #70022
- Fixed a bug which prevented proper copying of partitions and zone configurations when de-interleaving a table with ALTER PRIMARY KEY when the columns did not appear in exactly the same order in the parent and child tables. #70695
- Fixed a bug where the exit status of the
cockroachcommand did not follow the previously-documented table of exit status codes when an error occurred during command startup. Only errors occurring after startup were reported using the correct code. This bug had existed since reference exit status codes were introduced. #70675 - DNS unavailability during range 1 leaseholder loss will no longer cause significant latency increases for queries and other operations. #70134
- Fixed an issue in the Pebble storage engine where a key could be dropped from an LSM snapshot if the key was deleted by a range tombstone after the snapshot was acquired. #70967
- Fixed an internal error with joins that are both
LATERALandNATURAL/USING. #70800 - Fixed
ZandMcoordinate columns causing a panic for thegeometry_columnsandgeography_columnstables. #70813 - Fixed a bug that could cause a CockroachDB node to deadlock upon startup in extremely rare cases. If encountered, a stack trace generated by
SIGQUITwould have shown the functionmakeStartLine()near the top. This bug had existed since v21.1. #71408
Performance improvements
Miscellaneous
Contributors
This release includes 41 merged PRs by 24 authors.
v21.1.10
Release Date: October 7, 2021
Bug fixes
- Fixed a bug that caused the optimizer to erroneously discard
WHEREfilters when executing prepared statements, causing incorrect results to be returned. This bug was present since v21.1.9. #71116.
Contributors
This release includes 1 merged PRs by 1 author.
v21.1.9
Release Date: September 20, 2021
SQL language changes
- Added the
bulkio.backup.proxy_file_writes.enabledcluster setting to opt-in to writing backup files outside the KV storage layer. #69250 - You can now alter the owner of the
crdb_internal_regiontype which is created by initiating a multi-region database. #69759
Operational changes
- A new cluster setting,
sql.mutations.max_row_size.log, was added, which controls large row logging. Whenever a row larger than this size is written (or a single column family if multiple column families are in use) aLargeRowevent is logged to theSQL_PERFchannel (or aLargeRowInternalevent is logged toSQL_INTERNAL_PERFif the row was added by an internal query). This could occur forINSERT,UPSERT,UPDATE,CREATE TABLE AS,CREATE INDEX,ALTER TABLE,ALTER INDEX,IMPORT, orRESTOREstatements.SELECT,DELETE,TRUNCATE, andDROPare not affected by this setting. This setting is disabled by default. #69946 - A new cluster setting,
sql.mutations.max_row_size.err, was added, which limits the size of rows written to the database (or individual column families, if multiple column families are in use). Statements trying to write a row larger than this will fail with a code 54000 (program_limit_exceeded) error. Internal queries writing a row larger than this will not fail, but will log aLargeRowInternalevent to theSQL_INTERNAL_PERFchannel. This limit is enforced forINSERT,UPSERT, andUPDATEstatements.CREATE TABLE AS,CREATE INDEX,ALTER TABLE,ALTER INDEX,IMPORT, andRESTOREwill not fail with an error, but will logLargeRowInternalevents to theSQL_INTERNAL_PERFchannel.SELECT,DELETE,TRUNCATE, andDROPare not affected by this limit. Note that existing rows violating the limit cannot be updated, unless the update shrinks the size of the row below the limit, but can be selected, deleted, altered, backed-up, and restored. For this reason we recommend using the accompanying settingsql.mutations.max_row_size.login conjunction withSELECT pg_column_size()queries to detect and fix any existing large rows before loweringsql.mutations.max_row_size.err. This setting is disabled by default. #69946 - New variables
sql.mutations.max_row_size.{log|err}were renamed tosql.guardrails.max_row_size_{log|err}for consistency with other variables and metrics. #69946 - Added four new metrics:
sql.guardrails.max_row_size_log.count,sql.guardrails.max_row_size_log.count.internal,sql.guardrails.max_row_size_err.count, andsql.guardrails.max_row_size_err.count.internal. These metrics are incremented whenever a large row violates the correspondingsql.guardrails.max_row_size_{log|err}limit. #69946
DB Console changes
- A CES survey link component was added to support being able to get client feedback. #68517
Bug fixes
- Fixed a bug where running
IMPORT PGDUMPwith a UDT would result in a null pointer exception. This change makes it fail gracefully. #69249 - Fixed a bug where the
schedules.backup.succeededandschedules.backup.failedmetrics would sometimes not be updated. #69256 - The correct format code will now be returned when using
COPY FROM .. BINARY. #69278 - Fixed a bug where
COPY FROM ... BINARYwould return an error if the input data was split across different messages. #69278 - Fixed a bug where
COPY FROM ... CSVwould require eachCopyDatamessage to be split at the boundary of a record. TheCOPYprotocol allows messages to be split at arbitrary points. #69278 - Fixed a bug where
COPY FROM ... CSVdid not correctly handle octal byte escape sequences such as\011when using aBYTEScolumn. #69278 - Fixed an oversight in the data generator for TPC-H which was causing a smaller number of distinct values to be generated for p_type and p_container in the part table than the spec calls for. #68710
- Fixed a bug that was introduced in v21.1.5, which prevented nodes from being decommissioned in a cluster if the cluster had multiple nodes intermittently miss their liveness heartbeat. #68552
- Fixed a bug introduced in v21.1 where CockroachDB could return an internal error when performing streaming aggregation in some edge cases. #69181
- Fixed a bug that created non-partial unique constraints when a user attempted to create a partial unique constraint in
ALTER TABLEstatements. #68745 - Fixed a bug where a
DROP VIEW ... CASCADEcould incorrectly result in "table ...is already being dropped" errors. #68618 - Fixed a bug introduced in v21.1 where the output of
SHOW CREATE TABLEon tables with hash-sharded indexes was not round-trippable. Executing the output would not create an identical table. This has been fixed by showingCHECKconstraints that are automatically created for these indexes in the output ofSHOW CREATE TABLE. #69695 - Fixed internal or "invalid cast" error in some cases involving cascading updates. #69180
- Fixed a bug with cardinality estimation in the optimizer that was introduced in v21.1.0. This bug could cause inaccurate row count estimates in queries involving tables with a large number of null values. As a result, it was possible that the optimizer could choose a suboptimal plan. #69125
- Fixed a bug introduced in v20.2 that caused internal errors with set operations, like
UNION, and columns with tuple types that contained constantNULLvalues. #69271 - Added backwards compatibility between v21.1.x cluster versions and the v21.1.8 cluster version. #69894
- Fixed a bug where table stats collection issued via
EXPLAIN ANALYZEstatements or viaCREATE STATISTICSstatements without specifying theAS OF SYSTEM TIMEoption could run intoflow: memory budget exceeded. #69588 - Fixed a bug where an internal error or a crash could occur when some
crdb_internalbuilt-in functions took string-like type arguments (e.g.name). #69993 - Fixed all broken links to the documentation from the DB Console. #70117
- Previously, when using
ALTER PRIMARY KEYon aREGIONAL BY ROWtable, the copied unique index from the old primary key would not have the correct zone configurations applied. This bug is now fixed. Users who have encountered this bug should re-create the index. #69681
Performance improvements
- Lookup joins on partial indexes with virtual computed columns are not considered by the optimizer, resulting in more efficient query plans in some cases. #69110
- Updated the optimizer cost model so that, all else being equal, the optimizer prefers plans in which
LIMIToperators are pushed as far down the tree as possible. This can reduce the number of rows that need to be processed by higher operators in the plan tree, improving performance.#69977
Contributors
This release includes 40 merged PRs by 19 authors.
v21.1.8
Release Date: August 30, 2021
Downloads
This patch release has been withdrawn due to this technical advisory. We've removed the links to the downloads and Docker image.All the changes listed as part of this release will be in the next release. Do not upgrade to this release.
Security updates
- The node status retrieval endpoints over HTTP (
/_status/nodes,/_status/nodes/<N>, and the DB Console/#/reports/nodes) have been updated to require theadminrole from the requesting user. This ensures that operational details such as network addresses and command-line flags do not leak to unprivileged users. #67068
General changes
- A recent release removed parts of some queries from the debugging traces of those queries. This information (i.e. the execution of some low-level RPCs) has been re-included in the traces. #68923
Enterprise edition changes
- The
kafka_sink_configchangefeed option can now includeRequiredAcks. #69015 - Added a new per-node changefeed configuration
changefeed.node_sink_throttle_configthat can be used to throttle the rate of emission from the memory buffer thus making it possible to limit the emission rate from changefeeds. #68628
SQL language changes
- Added a new
EXPLAINflag,MEMO, to be used withEXPLAIN (OPT). When theMEMOflag is passed, a representation of the optimizer memo will be printed along with the best plan. TheMEMOflag can be used in combination with other flags such asCATALOGandVERBOSE. For example,EXPLAIN (OPT, MEMO, VERBOSE)will print the memo along with verbose output for the best plan. #67778 - Some queries with lookup joins and/or top K sorts are now more likely to be executed in a "local" manner with the
distsql=autosession variable when the newly introducedsql.distsql.prefer_local_execution.enabledcluster setting is set totrue(falseis the default). #68613
Operational changes
- Introduced the
bulkio.index_backfill.checkpoint_intervalcluster setting to control the rate at which backfills checkpoint their progress. Useful for controlling the backfill rate on large tables. #68287
Command-line changes
cockroach debug zipno longer retrieves database and table details into separate files. The schema information is collected by means ofsystem.descriptorsandcrdb_internal.create_statements. #68984
DB Console changes
- Added a new column picker on the Statements and Statements Details pages to select which columns to display in the statements table. Includes a new database column option for database name information, which is hidden by default on the Statements page. #68294
- Fixed the Transactions page to show the correct value for implicit transactions. #68294
- Statements Details, Statements, and Transactions pages now display information about the node and region on which a statement was executed. #68317
- Fixed tooltips behavior on the Sessions, Statements, and Transactions pages. #68474
Bug fixes
- Fixed missing foreign key checks in some cases when there are multiple checks and the inserted data contains a
NULLfor one of the checks. #68520 - Fixed a bug where using
ST_segmentizeon coordinates that are infinite would error with a crash. #67848 - Fixed the
COPY CSVcommand so that it handles multiple records separated by newline characters. #68623 - Fixed a bug that caused incorrect query results when querying tables with multiple column families and unique secondary indexes. The bug only occurred if 1) vectorized execution was enabled for the query, 2) the query scanned a unique secondary index that contained columns from more than one column family, and 3) the rows fetched by the query contained
NULLvalues for some of the indexed columns. This bug was present since version v20.1. #68238 - Fixed a crash in the
/debug/closedts-{sender,receiver}advanced debug pages if the last message of the closed timestamp side transport buffer was removed before rendering. #68669 - Fixed an issue where terminating a CockroachDB process early in its startup routine might cause it to fail to start again, falsely reporting write-ahead log corruption. #68897
- Fixed a regression in the optimizer's cost model that could cause it to choose sub-optimal plans when choosing between two non-unique index scans with different numbers of columns per index. #68991
- Fixed a bug where CockroachDB could incorrectly evaluate
LIKEexpressions when the pattern contained the escape characters\if the expressions were executed via the vectorized execution engine. #68353 - File logs now respect the
max-group-sizeconfiguration parameter again. This parameter had incorrectly become ignored in v21.1, resulting in arbitrarily large log directories. #69007 - Fixed a bug in
EXPORTwhere concurrent exports could overwrite each other. #68392
Performance improvements
- Jobs no longer hold exclusive locks during the duration of their checkpointing transactions which could result in long wait times when trying to run
SHOW JOBS. #68244 - Lookup joins on indexes with virtual columns are now considered by the optimizer. This should result in more efficient queries in many cases. Most notably, post-query uniqueness checks for unique indexes on virtual columns in
REGIONAL BY ROWtables can now use the unique index rather than perform a full-table scan. #68423
Contributors
This release includes 40 merged PRs by 26 authors.
v21.1.7
Release Date: August 9, 2021
Security updates
- The
--cert-principal-mapflag passed tocockroachcommands now allows the certificate principal name to contain colons. #67810
General changes
- Added a new cluster setting (
kv.transaction.reject_over_max_intents_budget) that controls the behavior of CockroachDB when a transaction exceeds the locks-tracking memory budget set by thekv.transaction.max_intents_bytescluster setting. Ifkv.transaction.reject_over_max_intents_budgetis set totrue, CockroachDB rejects the query that would push its transaction over the memory budget with an error (error code 53400 - "configuration limit exceeded"). Transactions that don't track their locks precisely are potentially destabilizing for the cluster since cleaning up locks can take up considerable resources. Transactions that change many rows have the potential to run into this memory budget issue. #67967
SQL language changes
- The remote DistSQL flows are now eagerly canceled if they were queued up and the query was canceled. #66331
- Added a new cluster setting (
changefeed.slow_span_log_threshold) that allows setting a cluster-wide default for slow span logging. #68106 - Added a new session variable (
enable_copying_partitioning_when_deinterleaving_table) which will change the behavior ofALTER PRIMARY KEYwhen performing a change which retains the same primary key but removes anINTERLEAVE INTOclause. When this variable is set totrueand anALTER PRIMARY KEYis run that only removes anINTERLEAVE INTOclause, the partitioning and zone configuration which applied to the root of the interleave will be applied to the new primary index. The default value forenable_copying_partitioning_when_deinterleaving_tableis equal to the value set for the new cluster settingsql.defaults.copy_partitioning_when_deinterleaving_table.enabled. #68114
Operational changes
- Histogram metrics now store the total number of observations over time. #68106
DB Console changes
- Fixed a bug causing the Summary Panel on the Overview Dashboard to flicker. #67365
- Fixed a bug preventing a redirect to the originally-requested DB Console page after user login. #67858
- User can now see time series metrics for disk spilling on the Advanced Debug page. #68112
- Fixed color mismatch of node status badge on the Cluster Overview page. #68056
- Chart titles on the Replication Dashboard were previously falsely labeled as "per Store" but were in fact "per Node". This bug is now fixed. #67847
Bug fixes
- Fixed a bug causing the
ST_GeneratePointsbuilt-in function to return a garbage value or an error if an empty geometry or negative nPoints input is given. #67580 - Fixed a bug where
DROP DATABASEcould return errors if the database contained temporary views in use in an another session. #67172 - Fixed a storage-level bug where Pebble would occasionally create excessively large SSTables, causing poor compaction performance and high read-amplification. This was especially likely after a manual offline compaction. #67610
- Correlated subqueries that couldn't be decorrelated and that have their own subqueries are now executed correctly when supported. Note that it is an edge case of an edge case, so it's unlikely that users have hit this bug (it was found by the randomized testing). #67570
- Fixed very rare, unexpected "index out of bounds" error from the vectorized engine when evaluating a
CASEoperator. #67779 - Catching up Raft followers on the Raft log is now more efficient in the presence of many large Raft log entries. This helps avoid situations where Raft leaders struggle to retain leadership while catching up their followers. #67127
- Fixed a bug that allowed rows to be inserted into a table with a
CHECKconstraint that always evaluated tofalse(e.g.,CHECK (false)). This bug was present since version 21.1.0. #67341 - Fixed a bug causing changefeeds to sometimes get stuck. #67968
- Previously, CockroachDB nodes would crash whenever the cluster setting
sql.trace.txn.enable_thresholdwas changed to a non-zero value. The bug was introduced in 21.1.0. #68027 - Fixed a deadlock that could occur when many replicas were rapidly queued for removal. #65859
- Fixed two bugs which affected geospatial queries with the
st_distancefunction. The first bug caused errors for filters of the formst_distance(g1, g2, use_spheroid) = 0. The second could cause incorrect results in some cases; it incorrectly transformed filters of the formst_distance(g1, g2) = 0wheng1andg2were geographies tost_instersects(g1, g2). This is not a valid transformation becausest_distancemakes spheroid-based calculations by default whilest_intersectsonly makes sphere-based calculations. #67392 - Fixed a bug causing a prepared statement to incorrectly reuse the query plan of a different prepared statement that had similar, but not identical type hints. #67688
- Fixed an issue with statistics estimation in the optimizer that could cause it to over-estimate the number of rows for some expressions and thus choose a sub-optimal plan. This issue could happen when multi-column statistics were used in combination with histograms, the query contained a predicate on two or more columns where the columns were highly correlated, and the selected values were very common according to the histograms. #67998
- Previously, CockroachDB could encounter an internal error or crash when performing a cast of
NULLJSONvalue to Geography or Geometry types. Now this is fixed. #67902 INSERTandUPDATEstatements which operate on larger rows can now be split into batches using thesql.mutations.mutation_batch_byte_sizesetting. #67958- A rare bug that could result in a crash while creating a debug.zip file has been fixed. The bug was only possible to hit if a debug.zip file was captured during a period of rapid lease movement. #67728
- Previously the
GRANTandREVOKEcommands would incorrectly handle role names. CockroachDB treats role names as case-insensitive, but these commands were incorrectly handling the names. Now,GRANTandREVOKEnormalize the names and are case-insensitive. #67901
Performance improvements
- Vectorized flows can use less memory when sending and receiving data to the network. #67609
- Range merges are no longer considered if a range has seen significant load over the previous 5 minutes, instead of being considered as long as a range had low load over the previous second. This change improves stability, as load-based splits will no longer rapidly disappear during transient throughput dips. #65362
- A new cluster setting
sql.defaults.optimizer_improve_disjunction_selectivity.enabledenables more accurate selectivity estimation of query filters withORexpressions. This improves query plans in some cases. This cluster setting is disabled by default. #67730
Contributors
This release includes 47 merged PRs by 26 authors.
v21.1.6
Release Date: July 20, 2021
General changes
- Switched the
release-21.1branch to point to a fork of the Google Cloud SDK at version 0.45.1 with an upstream bug fix. #66808
Enterprise edition changes
- Improved the internal buffering of changefeeds to be robust to bursts in traffic which exceed the throughput to the sink. #67205
- Incremental backups to a cloud storage location that already contains large existing backups now find their derived destination without listing as many remote files. #67286
Operational changes
- Added logs for important events during the server draining/shutdown process: (1) log when the server closes an existing connection while draining, (2) log when the server rejects a new connection while draining, and (3) log when the server cancels in-flight queries after waiting for the
server.shutdown.query_waitduration to elapse while draining. #66874
DB Console changes
- Fixed a bug preventing the Custom Chart debug page from loading on initial. #66897
- Added a drag-to-select timescale feature to the Custom Chart debug page. #66594
Bug fixes
- CockroachDB now allows a node with lease preferences to drain gracefully. #66712
- Fixed a panic that could occur in the optimizer when executing a prepared plan with placeholders. This could happen when one of the tables used by the query had computed columns or a partial index. #66833
- Fixed a bug that caused graceful drain to call
time.sleepmultiple times, which cut into time needed for range lease transfers. #66851 - Reduced CPU usage of idle
cockroachprocesses. #66894 - Fixed an error that backup would produce in some full backups with revision history. Previously, some full backups would erroneously produce an error in the form of
batch timestamp <some_timestamp> must be after replica GC threshold <some_other_timestamp>. #66904 - CockroachDB now avoids interacting with decommissioned nodes during DistSQL planning and consistency checking. #66950
- Changefeeds no longer interact poorly with large, abandoned transactions. Previously, this combination could result in a cascade of work during transaction cleanup that could starve out foreground traffic. #66813
- Changefeeds now properly invalidate cached range descriptors and retry when encountering decommissioned nodes. #67013
- Fixed a bug where metrics pages would lose their scroll position on chart data updates. #67089
- Fixed a bug which caused internal errors when running an
IMPORT TABLEstatement with a virtual computed column to import a CSV file. This bug has been present since virtual computed columns were introduced in v21.1.0. #67043 - Previously, the CLI would attribute some of the time spent running schema changes to network latency. This has now been fixed. Additionally, verbose timings in the CLI now also show time spent running schema changes in a separate bucket. #65719
- Fixed a statement buffer memory leak when using suspended portals. #67372
- Changefeeds on tables with array columns now support Avro. #67433
- Avro encoding now supports collated string types. #67433
ENUMcolumns can now be encoded in Avro changefeeds #67433- Avro changefeeds now support
BITandVARBITcolumns. #67433 INTERVALcolumns are now supported in Avro changefeeds. #67433
Performance improvements
- CockroachDB now continues to generate histograms when table statistics collection reaches memory limits, instead of disabling histogram generation. #67057
- The optimizer now prefers performing a reverse scan over a forward scan + sort if the reverse scan eliminates the need for a sort and the plans are otherwise equivalent. This was previously the case in most cases, but some edge cases with a small number of rows have been fixed. #67388
- When choosing between index scans that are estimated to have the same number of rows, the optimizer now prefers indexes for which it has higher certainty about the maximum number of rows over indexes for which there is more uncertainty in the estimated row count. This helps to avoid choosing suboptimal plans for small tables or if the statistics are stale. #67388
Contributors
This release includes 47 merged PRs by 34 authors. We would like to thank the following contributors from the CockroachDB community:
- joesankey (first-time contributor)
v21.1.5
Release Date: July 2, 2021
We recommend upgrading from v21.1.4 to this bug fix release as soon as possible.
Bug fixes
- Fixed a panic that could occur in the optimizer when executing a prepared plan with placeholders. This could happen when one of the tables used by the query had computed columns or a partial index. #66883
v21.1.4
Release Date: June 29, 2021
We recommend upgrading from this release to the v21.1.5 bug fix release as soon as possible.
Security updates
- Previously, all the logging output to files or network sinks was disabled temporarily while an operator was using the
/debug/logspyHTTP API, resulting in lost entries and a breach of auditability guarantees. This behavior has been corrected. #66328 - CockroachDB now configures a maximum number of concurrent password verifications in the server process, across UI and SQL clients. This limit reduces the risk of DoS attacks or accidents due to misbehaving clients. By default, the maximum amount of concurrency is ~12% of the number of allocated CPU cores (as per
GOMAXPROCS), with a minimum of 1 core. This default can be overridden using the environment variableCOCKROACH_MAX_BCRYPT_CONCURRENCY. #66367
SQL language changes
- Implemented the
ST_HasArcbuilt-in function. This adds better out-of-the-box support for GeoServer. #66531 - Added a new internal cluster setting,
jobs.cancel_update_limit, for controlling how many jobs are cleaned up concurrently after query cancellation. #66488
Command-line changes
- The SQL shell now formats times with time zones so that the minutes and seconds offsets are only shown if they are non-zero. Also, infinite floating point values are now formatted as
Infinityrather thanInf. #66130 - When log entries are written to disk, the first few header lines written at the start of every new file now report the configured logging format. #66328
API endpoint changes
- The
/debug/logspyHTTP API has changed. The endpoint now returns JSON data by default. If the previous format is desired, the user can pass the query argument&flatten=1to thelogspyURL to obtain the previous flat text format (crdb-v1) instead. #66328 This change is motivated as follows:- The previous format,
crdb-v1, cannot be parsed reliably. - Using JSON entries guarantees that the text of each entry all fits on a single line of output (newline characters inside the messages are escaped). This makes filtering easier and more reliable.
- Using JSON enables the user to apply
jqon the output, for example viacurl -s .../debug/logspy | jq ....
- The previous format,
- The
/debug/logspyAPI no longer enables maximum logging verbosity automatically. To change the verbosity, use the new/debug/vmoduleendpoint or pass the&vmodule=query parameter to the/debug/logspyendpoint. #66328 For example, suppose you wish to run a 20s logspy session:- Before:
curl 'https://.../debug/logspy?duration=20s&...'. - Now:
curl 'https://.../debug/logspy?duration=20s&vmodule=...'ORcurl 'https://.../debug/vmodule?duration=22s&vmodule=...' curl 'https://.../debug/logspy?duration=20s'. - As for the regular
vmodulecommand-line flag, the maximum verbosity across all the source code can be selected with the pattern*=4. - Note: at most one in-flight HTTP API request is allowed to modify the
vmoduleparameter. This maintains the invariant that the configuration restored at the end of each request is the same as when the request started.
- Before:
- The new
/debug/vmoduleAPI makes it possible for an operator to configure the logging verbosity in a similar way as the SQL built-in functioncrdb_internal.set_vmodule(), or to query the current configuration as incrdb_internal.get_vmodule(). Additionally, any configuration change performed via this API can be automatically reverted after a configurable delay. #66328 The API forms are:/debug/vmodule: Retrieve the current configuration/debug/vmodule?set=[vmodule config]&duration=[duration]: Change the configuration to[vmodule config]. The previous configuration at the time the/debug/vmodulerequest started is restored after[duration]. This duration, if not specified, defaults to twice the default duration of alogspyrequest (currently, thelogspydefault duration is 5s, so thevmoduledefault duration is 10s). If the duration is zero or negative, the previous configuration is never restored.
DB Console changes
Bug fixes
- Minute timezone offsets are only displayed in the wire protocol if they are non-zero for
TimestampTZandTimeTZvalues. Previously, they would always display. #66130 - Fixed a bug where binary
TimeTZvalues were not being decoded correctly when being sent as a parameter in the wire protocol. #66130 - CockroachDB's SQL shell now properly displays results of common array types, for example: arrays of floats, or arrays of strings. #66130
- Fixed a bug where the
--log='file-defaults: {format: crdb-v1}'flag was not being handled properly. This bug existed since v21.1.0. #66328 - Fixed a bug where log entries could be lost while the
/debug/logspyHTTP API was being used. This bug had existed since CockroachDB v1.1. #66328 - The binary encoding of decimals will no longer have negative
dscalevalues. This was preventing Npgsql from being able to read some binary decimals from CockroachDB. #66532 - A bug has been fixed which prevented the optimizer from producing plans with partial indexes when executing some prepared statements that contained placeholders, stable functions, or casts. This bug was present since partial indexes were added in v20.2.0. #66634
- Fixed a bug which could have prevented backups from being successfully restored. #66616
- Fixed a bug where CockroachDB could crash when executing
EXPLAIN (VEC)on some mutations. The bug is present only in the v21.1.1-v21.1.3 releases. #66573 - Fixed a bug where CockroachDB could encounter an internal error when computing window functions with
ROWSmode of window framing if the offsets were very large for theOFFSET FOLLOWINGboundary type. #66446 - Fixed a bug where using
ADD COLUMN UNIQUEonREGIONAL BY ROWtables did not correctly add the zone configs for the newly created column index. #66696 - Fixed a bug where reading from Google Cloud Storage was not using the resuming reader, as a result of which some retryable errors were not being treated as such, and the read would fail. #66190
- Fixed a deadlock during backups and imports. #66773
- Fixed incorrect accounting for statement/transaction sampled execution statistics. #66790
- Fixed a bug causing transactions to be spuriously aborted in rare circumstances. #66567
DB Console
- Fixed a CSS width calculation which was causing the multibar to not be visible in the DB Console. #66739
Contributors
This release includes 28 merged PRs by 22 authors.
v21.1.3
Release Date: June 21, 2021
Security updates
- Syntax errors in the host-based authentication (HBA) configuration in cluster setting
server.host_based_authentication.configurationare now logged on the OPS channel. #66128 - The
UserandApplicationNamefields of structured events pertaining to SQL queries are now marked as non-sensitive when they contain certain values (root/nodeforUserand values starting with$for application names). #66443
Enterprise edition changes
- Changefeeds with custom Kafka client configurations (using the
kafka_sink_configobject) that could lead to long delays in flushing messages will now produce an error. #66265 - The
kafka_sink_configobject now supports aversionconfiguration item to specify Kafka server versions. This is likely only necessary for old (Kafka 0.11/Confluent 3.3 or earlier) Kafka servers. Additionally, settings not specified inkafka_sink_confignow retain their default values. #66314
SQL language changes
TRUNCATEis now less disruptive on tables with a large amount of concurrent traffic. #65940- Creating
STOREDorVIRTUALcomputed columns with expressions that reference foreign key columns is now allowed. #66168 - The new function
crdb_internal.get_vmodulereturns the currentvmoduleconfiguration on the node processing the request. #63545 - The description string for the
random()function now clarifies that there are at most 53 bits of randomness available; that is, the function is unsuitable to generate 64-bit random integer values. This behavior is similar to that of PostgreSQL. #66128 EXPLAIN ANALYZEnow displays information about the regions on which a statement was executed. #66368
Operational changes
- Added a configurable limit to the number of intents collected by a
scanbefore aborting, to prevent out-of-memory errors. The settingstorage.mvcc.max_intents_per_errorreplacesstorage.sst_export.max_intents_per_errorand covers bothscanandexportcommands. #65923 BACKUPnow puts backup data files in adatasub-directory of theBACKUPpath instead of directly in the backup path. #66161
Command-line changes
- The informational messages printed out when
cockroach demostarts have been updated to clarify that certain information is only needed when accessing the demo cluster from another tool. #66129 cockroach demoandcockroach sqlare now able to run client-side commands via the-ecommand-line flag. This makes it possible to use commands like\dtor\hffrom a shell script. #66326
DB Console changes
- Users can now reset SQL stats from the DB Console. #65916
- Removed shading on line graphs, improving legibility when viewing more than a few series on the same plot. #66032
- Drag-to-zoom on metrics graphs now supports time ranges under 10 minutes. #66032
- In some cases, the Execution Stats page would show a very high Overhead latency for a statement. This could happen due to multiple statements being parsed together or due to statement execution being retried. To avoid this, we no longer consider the time between when parsing ends and execution begins when determining service latency. #66108
- Improved the style of the password input field for Safari. #66134
- The metrics chart under Overview was renamed from
SQL QueriestoSQL Statementsto match the naming used under SQL Metrics. #66364
Bug fixes
- Fixed a bug which prevented adding columns to tables which contain data and use
NOT NULLvirtual columns #65973 - Fixed a bug in the DB Console where graphs for clusters with decommissioned nodes could show an empty series and data could be incorrectly attributed to the wrong nodes. #66032
- Fixed a bug where queries on
REGIONAL BY ROWtables could fail in the brief window in which a DROP REGION operation is in progress. #65984 - Fixed a bug where a schema's privilege descriptor could be corrupted upon executing
ALTER DATABASE ... CONVERT TO SCHEMA, where privileges invalid on a schema were copied from the database, rendering the schema unusable. #65993 - Fixed the error classification for duplicate index names where the later index was a
UNIQUEindex. #64000 - Fixed the error classification for
ALTER TABLE ... ADD CONSTRAINT ... UNIQUEwith the same name as an existing index. #64000 - Fixed a bug that made it less likely for range merges to succeed on clusters using multiple stores per node is now fixed. #65889
- Improved
TRUNCATEoperations to prevent contention issues. #65940 - Improved garbage collection of stale replicas by proactively checking certain replicas that have lost contact with other voting replicas. #65186
- Fixed a bug in
SHOW RANGESwhich misattributed localities to nodes when using multiple stores. #66037 - Queries run through the
EXECUTEstatement can now generate statement diagnostic bundles as expected. #66098 - Previously, an
INSERTcausing a foreign key violation could result in an internal error in rare cases. The bug only affected the error response; any affectedINSERTs (which would have been foreign-key violations) did not succeed. This bug, present since v21.1.0, has been fixed. #66300 BACKUPand other operations can now reuse a previously created S3 client session when operating on the same bucket, which can avoidNoCredentialProviderserrors on EC2 when iterating with large incremental backups. #66259- The command exit status of
cockroach demoandcockroach sqlis now properly set to non-zero (error) after an error is encountered in a client-side command. Additionally,cockroach sqlandcockroach demonow properly stop upon encountering an invalid configuration with--set, instead of starting to execute SQL statements after the invalid configuration. #66326 - Improved the availability of the jobs table for reads in large, global clusters by running background tasks at low priority. #66344
- Backups no longer risk the possibility of blocking conflicting writes while being rate limited by the
kv.bulk_io_write.concurrent_export_requestsconcurrency limit. #66408 - The
soundexandst_differencebuilt-in functions for fuzzy string matching now correctly handleNULLvalues. #66302
Performance improvements
- Fixed an issue in the optimizer that prevented spatial predicates of the form
(column && value) = truefrom being index-accelerated. These queries can now use a spatial index if one is available. #65986 - The optimizer is now more efficient when planning queries on tables that have many columns and indexes. #66304
- The
COCKROACHDB_REGISTRYfile is no longer rewritten whenever a new unencrypted file is created. #66423 - After improvements, queries use up to 1MB less system memory per scan, lookup join, index join, zigzag join, or inverted join in their query plans. This will result in improved memory performance for workloads with concurrent OLAP-style queries. #66145
- Made improvements to prevent intra-query leaks during disk spilling that could cause the database to run out of memory, especially on tables with wide rows. #66145
Contributors
This release includes 64 merged PRs by 35 authors.
v21.1.2
Release Date: June 7, 2021
General changes
- Added multi-region workloads for
cockroach demo movr --geo-partitioned-replicas. Setting--multi-regionenables for multi-region workloads, and setting--surviveallows for survivingAZorREGIONfailures. Setting--infer-crdb-region-columnalso infers thecrdb_regionforREGIONAL BY ROWtables. #65642 - Changefeeds now better handle slow or unavailable sinks by treating "memory exceeded" errors as retryable. #65387
SQL language changes
- Added the
crdb_internal.lost_descriptors_with_datafunction to show descriptors that have no entries but data left behind. #65462 - Added the
crdb_internal.force_delete_table_datafunction which allows table data to be cleaned up only using a descriptor ID for cases of table descriptor corruption. #65462 - The statement type ("tag") is now also included alongside the full text of the SQL query in the various structured log entries produced when query execution is being logged. #65554
- CockroachDB now returns a SQL Notice if a
CREATE TABLE IF NOT EXISTScommand is used to create aTABLEand theTABLEalready exists. #65636 - The
SHOW FULL TABLE SCANSstatement was added to CockroachDB. #65671 - CockroachDB now returns a SQL Notice if a
CREATE TYPE IF NOT EXISTScommand is used to create a type and the type already exists. #65635 - Added a
chunk_sizeoption toEXPORT INTO CSVto control the target CSV file size. #65388 - SQL stats can now be cleared using the
crdb_internal.reset_sql_stats()function. #65674 - CockroachDB now supports
ALTER DATABASE ... ADD REGION IF NOT EXISTS ...which does not cause an error when adding a region that is already in the database. #65752 - CockroachDB now outputs a clearer error message when running
ALTER DATABASE ... ADD REGION ...if the region is an undefined region. Previously, the error message for not having a region defined on a database resulted in an error about enums. #65752 - Added the
ALTER DATABASE ... DROP REGION IF EXISTS ...statement syntax, which does not error if dropping a region that is not defined on the database. #65752 - Fixed a bug where transitioning from locality
REGIONAL BY ROWtoGLOBALorREGIONAL BY TABLEcould mistakenly remove a zone configuration on an index which has no multi-region fields set. #65833 - CockroachDB now only blocks a zone configuration DISCARD on a multi-region table, index, or partition if the multi-region abstractions created the zone configuration. #65834
Operational changes
- Range metrics are now gathered from the leaseholder (if live) rather than the first available range replica. This avoids scenarios where a stale replica may yield incorrect metrics, in particular over/underreplication markers. #64590
DB Console changes
- Fixed Jobs page crash while using pagination and improved its performance. #65723
- Fixed a typo on the Network tooltip on the Statements page. #65605
- Fixed a missing node ID in the rejoin event message #65806
- Sorts on tables now pick up the correct value from the URL. #65605
Bug fixes
- Fixed a bug where a certain percentage of cases in which a node could have served a follower read were not handled correctly, resulting in the node routing the request to another nearby node for no reason. #65471
- The
has_database_privilegefunction now correctly will check privileges on databases that are not the current database being used by the session. #65534 - Fixed a bug where CockroachDB would previously crash when attempting to create a table using
CREATE TABLE ... ASsyntax where theASclause selects fromcrdb_internal.node_statement_statistics,crdb_internal.node_transaction_statistics, orcrdb_internal.node_txn_statsvirtual tables. #65542 - Fixed a bug which allowed index definitions with redundant columns, which led to unnecessary storage usage. This bug can notably manifest itself with
ALTER TABLEstatements which alter the primary index on a partitioned table. This bug has been present for a long time in theory, but in practice would only appear in CockroachDB since version 21.1.0. #65482 - Fixed a bug where binary
TIMETZvalues were not being decoded correctly when being sent as a parameter in the wire protocol. #65341 - Fixed a race condition during transaction cleanup that could leave old transaction records behind until MVCC garbage collection. #65383
- Improved transaction cleanup for disconnected clients, to reduce intent buildup. #65383
- Added the ability to change the
COMMENTon a column after usingALTER TYPEon that column. #65698 - Scheduled backup with interleaved tables can now be created with the
include_deprecated_interleavesoption. #65731 - Fixed a bug where
ST_Nodeon aLINESTRINGwith the same repeated points results in an error. #65700 - Calling
get_bitorset_biton a byte array argument now goes to the correct index of the underlying bit string, in order to match the behavior of Postgres. #65786 - Fixed a bug where
ALTER DATABASE ... CONVERT TO SCHEMAcould potentially leave the schema with invalid privileges thus causing the privilege descriptor to be invalid. #65810 - CockroachDB now renders the
CACHEclause for sequences which use a cache. #65805 - Fixed a bug that could cause a node to crash in rare cases if a
BACKUPwriting to Google Cloud Storage failed. #65802 - Fixed a bug introduced in 21.1 where cluster restores would report inaccurate progress, showing 100% progress erroneously. #65803
- Fixed a crash when performing a cluster
BACKUPwith revision history of a cluster upgraded from 20.1 to 20.2 to 21.1 which contains tables that were truncated by 20.1. #65860 - Fixed a bug that caused incorrect results for queries where
CHARandVARCHARcolumns are filtered by constant string values. The bug was present since version v21.1.0. #66101
Performance improvements
- The optimizer can now avoid full table scans for queries with a
LIMITandORDER BYclause in some additional cases where theORDER BYcolumns are not a prefix of an index. #65392 - The optimizer now generates query plans that scan indexes on virtual collated string columns, regardless of the casing or formatting of the collated locale in the query. #65531
- CockroachDB now reduces the number of round-trips required to call
pg_table_is_visiblein the context ofpg_catalogqueries. #65807
Contributors
This release includes 58 merged PRs by 34 authors. We would like to thank the following contributors from the CockroachDB community:
- Max Neverov
- Rupesh Harode
v21.1.1
Release Date: May 24, 2021
General changes
- Disabled read-triggered compactions to avoid instances where the storage engine would compact excessively. #65345
SQL language changes
- Fixed Julian date parsing logic for wrong formats. #63540
- The error payload returned to the client when a
DATE/TIMEconversion fails now contains more details about the difference between the values provided and the values that are expected. #63540 - Introduced
ALTER TABLE ... ALTER COLUMN SET [VISIBLE|NOT VISIBLE], which marks columns as visible/not visible. #63881 - When using
ALTER TABLE ... LOCALITY REGIONAL BY ROW, we would previously verify uniqueness of the new table, which was an unnecessary operation. This verification has been removed, improving the performance of updating localities to or fromREGIONAL BY ROW. #63880 - Improved cancellation behavior for DistSQL flows. #65047
ST_EstimatedExtentnow always returnsNULL. This allows GeoServer to make progress in certain cases, and is a valid default return value for the function. #65098- Implemented
ST_EnvelopeforBox2D. #65098 - Implemented a subset of variants for
ST_AsTWKB, which encodes a geometry into aTWKBformat. This allows the use of GeoServer with CRDB if the user selects "PreserveTopology" for their "Method used to simplify geometries" option on the "Store" page. #65098 - Implemented
ST_SimplifywithpreserveCollapsedsupport. This unblocks the use of GeoServer with the default settings. #65098 - Lookup joins on indexes with computed columns which are also either constrained by
CHECKconstraints or use anENUMdata type may now choose a more optimal plan. #65361 - Floating point infinity values are now formatted as
Infinity(or-Infinityif negative). This is for compatibility with PostgresSQL. #65334 INSERT INTO ... ON CONFLICT ... DO UPDATE SETstatements without predicates now acquire locks using theFOR UPDATElocking mode during their initial row scan, which improves performance for contended workloads. This behavior is configurable using theenable_implicit_select_for_updatesession variable and thesql.defaults.implicit_select_for_update.enabledcluster setting. #65363ST_GeomFromGeoJSON(string)is now marked as the preferred overload, meaning it will resolve correctly in more contexts. #65442
Operational changes
- Replica garbage collection now checks replicas against the range descriptor every 12 hours (down from 10 days) to see if they should be removed. Replicas that fail to notice they have been removed from a range will therefore linger for at most 12 hours rather than 10 days. #64589
Command-line changes
- The
--helptext for--lognow references the fact that the flag accepts YAML syntax and also points to thecockroach debug check-log-configcommand. #64948 - The new parameter
--log-config-filesimplifies the process of loading the logging configuration from a YAML file. Instead of passing the content of the file via the--logflag (e.g.,--log=$(cat file.yaml)), it is now possible to pass the path to the file using--log-config-file=file.yaml.
Note: Each occurrence of--logand--log-config-fileon the command line overrides the configuration set from previous occurrences. #64948 - The prefixes displayed before connection URLs when
cockroach demostarts up have been updated to better align with the output ofcockroach start. #63535 - The flag
--emptyforcockroach demohas been renamed to--no-example-database.--emptyis still recognized but is marked as deprecated. Additionally, the user can now set the environment variableCOCKROACH_NO_EXAMPLE_DATABASEto obtain this behavior automatically in every new demo session. #63535 - CockroachDB no longer supports the
\demo addand\demo shutdowncommands forcockroach demoin--globalconfigurations. #63535 - Added a note when starting up a
--globaldemo cluster that the--globalconfiguration is experimental. #63535 - The SQL shell (
cockroach demo,cockroach sql) now attempts to better format values that are akin to time/date values, as well as floating-point numbers. #63541 cockroach debug zipnow attempts to pull data from multiple nodes concurrently, up to 15 nodes at a time. This change is meant to accelerate the data collection when a cluster contains multiple nodes. This behavior can be changed with the new command-line flag--concurrency. #64705- The format of the informational messages printed by
cockroach debug zip, when concurrent execution is enabled. #64705 - The new command
cockroach debug list-filesshow the list of files that can be retrieved via thecockroach debug zipcommand. It supports the--nodesand--exclude-nodesparameters in the same way ascockroach debug zip. #64705 - It is now possible to fine-tune which files get retrieved from the server nodes by the
cockroach debug zipcommand, using the new flag--include-filesand--exclude-files. These flags take glob patterns that are applied to the file names server-side. For example, to include only log files, use--include-files='*.log'. The commandcockroach debug list-filesalso accepts these flags and can thus be used to experiment with the new flags before running thecockroach debug zipcommand. #64705 - The
cockroach debug zipcommand now retrieves only the log files, goroutine dumps and heap profiles pertaining to the last 48 hours prior to the command invocation. This behavior is supported entirely client-side, which means that it is not necessary to upgrade the server nodes to put these newly-configurable limits in place. The other data items retrieved bycockroach debug zipare not affected by this time limit. This behavior can be customized by the two new flags--files-fromand--files-until. Both are optional. See the command-line help text for details. The two new flags are also supported bycockroach debug list-files. It is advised to experiment withlist-filesprior to issuing adebug zipcommand that may retrieve a large amount of data. #64705
DB Console changes
- A new metric for the average number of runnable goroutines per CPU is now present in the runtime graphs. #64750
- The Console now uses a new library for line graphs that renders metrics more efficiently. Customers with large clusters can now load and interact with metrics much faster than before. #64479
- Placed a legend under charts on metrics page, if more than 10 series are being displayed #64479
Bug fixes
- Fixed a bug in the artificial latencies introduced by the
--globalflag tocockroach demo. #63535 - Fixed a bug where multiple concurrent invocations of
cockroach debug zipcould yield cluster instability. This bug had been present since CockroachDB v20.1. #64083 - When a
STRINGvalue is converted toTIME/DATE/TIMESTAMP, and theSTRINGvalue contains invalid entries, the error messages reported now more clearly report which fields are missing or undesired. #63540 - Fixed a bug where view expressions created using an
ARRAYENUMwithout a name for the column could cause failures when dropping unrelatedENUMvalues. #64272 - Fixed a bug causing an internal error in rare circumstances when executing queries via the vectorized engine that operate on columns of
BOOL,BYTES,INT, andFLOATtypes that have a mix ofNULLand non-NULLvalues. #62915 - Fixed a bug causing CockroachDB to either return an error or crash when comparing an infinite
DATEcoming from a subquery against aTIMESTAMP. #64074 - CockroachDB now should crash less often due to out-of-memory conditions caused by the subqueries returning multiple rows of large size. #64727
- Previously, the session trace could contain entries that corresponded to the previous trace (i.e.,
SET TRACING=ONdidn't properly reset the trace). Now this is fixed. #64945 - Previously, CockroachDB could incorrectly cast integers of larger widths to integers of smaller widths (e.g.,
INT8toINT2) when the former was out of range for the latter. Now this is fixed. #65035 - Fixed a race condition where read-write requests during replica removal (e.g., during range merges or rebalancing) could be evaluated on the removed replica. #64598
BACKUPno longer resolves intents one-by-one. This eliminates the need to run a high-priority query to cleanup intents to unblockBACKUPin the case of intent buildup. #64881- Fixed an internal error that could occur during planning when a query used the output of an
UPDATE'sRETURNINGclause, and one or more of the columns in theRETURNINGclause were from a table specified in theFROMclause of theUPDATE(i.e., not from the table being updated). #62960 - Fixed an index-out-of-range error that could occur when
crdb_internal_mvcc_timestampwas selected as part of aview. It is now possible to selectcrdb_internal_mvcc_timestampas part of a view as long as it is aliased with a different name. #63632 - Fixed a bug in the application of environment variables to populate defaults for certain command-line flags, for example
COCKROACH_URLfor--url, has been fixed. #63539 - Fixed a stack overflow that can happen in some corner cases involving partial indexes with predicates containing
(x IS NOT NULL). #64738 - Providing a constant value as an
ORDER BYvalue in an ordered-set aggregate, such aspercentile_distorpercentile_cont, no longer returns an error. This bug has been present since order-set aggregates were added in version 20.2. #64902 - Queries that reference tables with
GEOMETRYorGEOGRAPHYGIN indexes and that call geospatial functions with constantNULLvalues cast to a type, likeNULL::GEOMETRYorNULL::FLOAT8, no longer error. This bug was present since 20.2. #63003 - Fixed a bug causing CockroachDB to incorrectly calculate the latency from the remote nodes when the latency info was shown on the
EXPLAIN ANALYZE (DISTSQL)diagrams. #63089 - Fixed a bug causing the
ZONECONFIGprivilege on tables and databases to be incorrectly interpreted asUSAGE, which could corrupt a table and/or database becauseUSAGEis an invalid privilege for tables and databases. #65160 - Fixed a bug which could cause a panic when running an
EXECUTEof a previously-prepared statement with aREGCLASSorREGTYPEparameter or a user-defined type argument after runningBEGIN AS OF SYSTEM TIMEwith an invalid timestamp. #65150 - Fixed a bug which could cause a panic when issuing a query referencing a user-defined type as a placeholder. #65150
- Fixed a bug introduced in 20.2 that caused rows to be incorrectly de-duplicated from a scan with a non-unique index. #65284
- Fixed a bug where interval math on a
TIMESTAMPTZvalue on a DST boundary would incorrectly add or subtract an extra hour. #65095 - Fixed a bug where
date_truncon aTIMEvalue on a DST boundary could switch timezones and produce the incorrect result. #65095 - Improved memory utilization under some write-heavy workloads, added better logging to storage engine to surface compaction type, and persisted previously-missing Pebble options in
OPTIONSfile. #65308 - Fixed a bug causing
revision_historycluster backups to not include dropped databases. This means that, previously, dropped databases could not be restored from backups that were taken after the database was dropped. #65314 - Fixed a bug causing
SHOW CREATE TABLEoutput to not display the zone configurations of a table or index if there were no partitions, even if there were zone configurations on the index or table. #65176 - Previously, concatenating a non-
STRINGvalue with aSTRINGvalue would not use the normalSTRINGrepresentation of the non-STRINGvalue. Now it does, sotrue || 'string'returnstruestringinstead oftstring. #65331 - Large
SELECT FOR UPDATEscans will no longer prevent the memory associated with their entire result set from being reclaimed by the Go garbage collector for the lifetime of the locks that they acquire. #65359 - Fixed a rare race that could lead to a 3-second stall before a Raft leader was elected on a Range immediately after it was split off from its left-hand neighbor. #65356
- Fixed a bug where
SHOW CREATE TABLEwould show the zone configurations of a table of the same name from a different schema. #65368 BACKUP,RESTORE, andIMPORTare now more resilient to node failures and will retry automatically. #65391- Previously, replica rebalancing could sometimes rebalance to stores on dead nodes. This bug is now fixed. #65428
Performance improvements
- The optimizer now always prefers to plan a locality-optimized scan over a regular scan when possible. This may enable the execution engine to avoid communicating with remote nodes, thus reducing query latency. #65088
- The optimizer will now try to plan anti lookup joins using "locality-optimized search". This optimization applies for anti lookup joins into
REGIONAL BY ROWtables (i.e., the right side of the join is aREGIONAL BY ROWtable), and if enabled, it means that the execution engine will first search locally for matching rows before searching remote nodes. If a matching row is found in a local node, remote nodes will not be searched. This optimization may improve the performance of foreign key checks when rows are inserted or updated in a table that references a foreign key in aREGIONAL BY ROWtable. #63118 - Certain queries containing
<tuple> IN (<subquery>)conditions now run faster. #63866 - Improved intent cleanup performance for aborted transactions. #64588
- Adjusted the estimated cost of locality-optimized anti joins in the optimizer so that they are always chosen over non-locality-optimized anti joins when possible. This makes it more likely that queries involving anti joins (such as inserts with foreign key checks) can avoid visiting remote regions. This results in lower latency. #65131
- The optimizer can now avoid full table scans for queries with a
LIMITandORDER BYclause, where theORDER BYcolumns form a prefix on an index in aREGIONAL BY ROWtable (excluding the hiddencrdb_regioncolumn). Instead of a full table scan, at mostLIMITrows are scanned per region. #65287
Contributors
This release includes 100 merged PRs by 33 authors. We would like to thank the following contributors from the CockroachDB community:
- Kumar Akshay
- Mohammad Aziz (first-time contributor)
- kurokochin (first-time contributor)
v21.1.0
Release Date: May 18, 2021
With the release of CockroachDB v21.1, we've made a variety of flexibility, performance, and compatibility improvements. Check out a summary of the most significant user-facing changes and then upgrade to CockroachDB v21.1.
To learn more:
- Read the v21.1 blog post.
- Join us on May 19 for a livestream on why multi-region applications matter and how our Product and Engineering teams partnered to make them simple in v21.1.
CockroachCloud
- Get a free v21.1 cluster on CockroachCloud.
- Learn about recent updates to CockroachCloud in the CockroachCloud Release Notes.
Feature summary
This section summarizes the most significant user-facing changes in v21.1.0. For a complete list of features and changes, including bug fixes and performance improvements, see the release notes for previous testing releases. You can also search for what's new in v21.1 in our docs.
"Core" features are freely available in the core version and do not require an enterprise license. "Enterprise" features require an enterprise license. CockroachCloud clusters include all enterprise features. You can also use cockroach demo to test enterprise features in a local, temporary cluster.
- SQL
- Recovery and I/O
- Database Operations
- Backward-incompatible changes
- Deprecations
- Known limitations
- Education
SQL
| Version | Feature | Description |
|---|---|---|
| Enterprise | Multi-Region Improvements | It is now much easier to leverage CockroachDB's low-latency and resilient multi-region capabilities. For an introduction to the high-level concepts, see the Multi-Region Overview. For further details and links to related SQL statements, see Choosing a Multi-Region Configuration, When to Use ZONE vs. REGION Survival Goals, and When to Use REGIONAL vs. GLOBAL Tables. For a demonstration of these capabilities using a local cluster, see the Multi-Region Tutorial. Finally, for details about related architectural enhancements, see Non-Voting Replicas and Non-Blocking Transactions. |
| Enterprise | Automatic Follower Reads for Read-Only Transactions | You can now force all read-only transactions in a session to use follower reads by setting the new default_transaction_use_follow_reads session variable to on. |
| Core | Query Observability Improvements | EXPLAIN and EXPLAIN ANALYZE responses have been unified and extended with additional details, including automatic statistics-backed row estimates for EXPLAIN, and maximum memory usage, network usage, nodes used per operator, and rows used per operator for EXPLAIN ANALYZE. EXPLAIN ANALYZE now outputs a text-based statement plan tree by default, showing statistics about the statement processors at each phase of the statement.The Transactions Page and Statements Page of the DB Console also include such details as well the mean average time statements were in contention with other transactions within a specified time interval. The SQL Dashboard has been expanded with additional graphs for latency, contention, memory, and network traffic. The SQL Tuning with EXPLAIN tutorial and Optimize Statement Performance guidance have been updated to leverage these improvements. |
| Core | Inverted Joins | CockroachDB now supports inverted joins, which force the optimizer to use a GIN index on the right side of the join. Inverted joins can only be used with INNER and LEFT joins. |
| Core | Partial GIN Indexes | You can now create a partial GIN index on a subset of JSON, ARRAY, or geospatial container column data. |
| Core | Virtual Computed Columns | You can now create virtual computed columns, which are not stored on disk and are recomputed as the column data in the expression changes. |
| Core | Dropping Values in User-Defined Types | It's now possible to drop values in user-defined types. |
| Core | Sequence Caching | You can now create a sequence with the CACHE keyword to have the sequence cache its values in memory. |
| Core | Changing Sequence & View Ownership | You can use the new OWNER TO parameter to change the owner of a sequence or view. |
| Core | Show CREATE Statements for the Current Database |
You can now use SHOW CREATE ALL TABLES to return the CREATE statements for all of the tables, views, and sequences in the current database. |
| Core | Storage of Z/M Coordinates for Spatial Objects | You can now store a third dimension coordinate (Z), a measure coordinate (M), or both (ZM) with spatial objects. Note, however, that CockroachDB's spatial indexing is still based on the 2D coordinate system. This means that the Z/M dimension is not index accelerated when using spatial predicates, and some spatial functions ignore the Z/M dimension, with transformations discarding the Z/M value. |
| Core | Third-Party Tool Support | Spatial libraries for Hibernate, ActiveRecord, and Django are now fully compatible with CockroachDB's spatial features. The DataGrip IDE and Liquibase schema migration tool are also now supported. |
| Core | Connection Pooling Guidance | Creating the appropriate size pool of connections is critical to gaining maximum performance in an application. For guidance on sizing, validating, and using connection pools with CockroachDB, as well as examples for Java and Go applications, see Use Connection Pools. |
| Core | PostgreSQL 13 Compatibility | CockroachDB is now wire-compatible with PostgreSQL 13. For more information, see PostgreSQL Compatibility. |
Recovery and I/O
| Version | Feature | Description |
|---|---|---|
| Enterprise | Changefeed Topic Naming Improvements | New CHANGEFEED options give you more control over topic naming: The full_table_name option lets you use a fully-qualified table name in topics, subjects, schemas, and record output instead of the default table name, and can prevent unintended behavior when the same table name is present in multiple databases. The avro_schema_prefix option lets you use a fully-qualified schema name for a table instead of the default table name, and makes it possible for multiple databases or clusters to share the same schema registry when the same table name is present in multiple databases. |
| Core | Running Jobs Asynchronously | You can use the new DETACHED option to run BACKUP, RESTORE, and IMPORT jobs asynchronously and receive a job ID immediately rather than waiting for the job to finish. This option enables you to run such jobs within transactions. |
| Core | Import from Local Dump File | The new cockroach import command imports a database or table from a local PGDUMP or MYSQLDUMP file into a running cluster. This is useful for quick imports of 15MB or smaller. For larger imports, use the IMPORT statement. |
| Core | Additional Import Options | New IMPORT options give you more control over the import process's behavior: The row_limit option limits the number of rows to import, which is useful for finding errors quickly before executing a more time- and resource-consuming import; the ignore_unsupported_statements option ignores SQL statements in PGDUMP files that are unsupported by CockroachDB; and the log_ignored_statements option logs unsupported statements to cloud storage or userfile storage when ignore_unsupported_statements is enabled. |
| Core | Re-validating Indexes During RESTORE |
Incremental backups created by v20.2.2 and prior v20.2.x releases or v20.1.4 and prior v20.1.x releases may include incomplete data for indexes that were in the process of being created. Therefore, when incremental backups taken by these versions are restored by v21.1.0, any indexes created during those incremental backups will be re-validated by RESTORE. |
Database Operations
| Version | Feature | Description |
|---|---|---|
| Core | Logging Improvements | Log events are now organized into logging channels that address different use cases. Logging channels can be freely mapped to log sinks and routed to destinations outside CockroachDB (including external log collectors). All logging aspects, including message format (e.g., JSON), are now configurable via YAML. |
| Core | Cluster API v2.0 | This new API for monitoring clusters and nodes builds on prior endpoints, offering a consistent REST interface that's easier to use with your choice of tooling. The API offers a streamlined authentication process and developer-friendly reference documentation. |
| Core | OpenShift-certified Kubernetes Operator |
You can now deploy CockroachDB on the Red Hat OpenShift platform using the latest OpenShift-certified Kubernetes Operator. |
| Core | Auto TLS Certificate Setup | Using the new cockroach connect command, you can now let CockroachDB handle the creation and distribution among nodes of a cluster's CA (certificate authority) and node certificates. Note that this feature is an alpha release with core functionality that may not meet your requirements. |
| Core | Built-in Timezone Library | The CockroachDB binary now includes a copy of the tzdata library, which is required by certain features that use time zone data. If CockroachDB cannot find the tzdata library externally, it will now use this built-in copy. |
Backward-incompatible changes
Before upgrading to CockroachDB v21.1, be sure to review the following backward-incompatible changes and adjust your deployment as necessary.
- Rows containing empty arrays in
ARRAYcolumns are now contained in GIN indexes. This change is backward-incompatible because prior versions of CockroachDB will not be able to recognize and decode keys for empty arrays. Note that rows containingNULLvalues in an indexed column will still not be included in GIN indexes. - Concatenation between a non-null argument and a null argument is now typed as string concatenation, whereas it was previously typed as array concatenation. This means that the result of
NULL || 1will now beNULLinstead of{1}. To preserve the old behavior, the null argument can be casted to an explicit type. - The payload fields for certain event types in
system.eventloghave been changed and/or renamed. Note that the payloads insystem.eventlogwere undocumented, so no guarantee was made about cross-version compatibility to this point. The list of changes includes (but is not limited to):TargetIDhas been renamed toNodeIDfornode_join.TargetIDhas been renamed toTargetNodeIDfornode_decommissioning/node_decommissioned/node_recommissioned.NewDatabaseNamehas been renamed toNewDatabaseParentforconvert_to_schema.grant_privilegeandrevoke_privilegehave been removed; they are replaced bychange_database_privilege,change_schema_privilege,change_type_privilege, andchange_table_privilege. Each event only reports a change for one user/role, so theGranteesfield was renamed toGrantee.- Each
drop_roleevent now pertains to a single user/role.
- The connection and authentication logging enabled by the cluster settings
server.auth_log.sql_connections.enabledandserver.auth_log.sql_sessions.enabledwas previously using a text format which was hard to parse and integrate with external monitoring tools. This has been changed to use the standard notable event mechanism, with standardized payloads. The output format is now structured; see the reference documentation for details about the supported event types and payloads. - The format for SQL audit, execution, and query logs has changed from a crude space-delimited format to JSON. To opt out of this new behavior and restore the pre-v21.1 logging format, you can set the cluster setting
sql.log.unstructured_entries.enabledtotrue. - The
cockroach debug ballastcommand now refuses to overwrite the target ballast file if it already exists. This change is intended to prevent mistaken uses of theballastcommand by operators. Scripts that integratecockroach debug ballastcan consider adding armcommand. - Removed the
kv.atomic_replication_changes.enabledcluster setting. All replication changes on a range now use joint-consensus. - Currently, changefeeds connected to Kafka versions < v1.0 are not supported in CockroachDB v21.1.
Deprecations
- The CLI flags
--log-dir,--log-file-max-size,--log-file-verbosity, and--log-group-max-sizeare deprecated. Logging configuration can now be specified via the--logparameter. See the Logging documentation for details. - The client-side command
\showfor the SQL shell is deprecated in favor of the new command\p. This prints the contents of the query buffer entered so far. - Currently, Google Cloud Storage (GCS) connections default to the
cloudstorage.gs.default.keycluster setting. This default behavior will no longer be supported in v21.2. If you are relying on this default behavior, we recommend adjusting your queries and scripts to now specify theAUTHparameter you want to use. Similarly, if you are using thecloudstorage.gs.default.keycluster setting to authorize your GCS connection, we recommend switching to useAUTH=specifiedorAUTH=implicit.AUTH=specifiedwill be the default behavior in v21.2 and beyond.
Known limitations
For information about new and unresolved limitations in CockroachDB v21.1, with suggested workarounds where applicable, see Known Limitations.
Education
| Area | Topic | Description |
|---|---|---|
| Cockroach University | New Intro Courses | Introduction to Distributed SQL and CockroachDB teaches you the core concepts behind distributed SQL databases and describes how CockroachDB fits into this landscape. Practical First Steps with CockroachDB is a hands-on sequel that gives you the tools to get started with CockroachDB. |
| Cockroach University | New Java Course | Fundamentals of CockroachDB for Java Developers guides you through building a full-stack vehicle-sharing app in Java using the popular Spring Data JPA framework with Spring Boot and a CockroachCloud Free cluster as the backend. |
| Cockroach University | New Query Performance Course | CockroachDB Query Performance for Developers teaches you key CockroachDB features and skills to improve application performance and functionality, such as analyzing a query execution plan, using indexes to avoid expensive full table scans, improving sorting performance, and efficiently querying fields in JSON records. |
| Docs | Quickstart | Documented the simplest way to get started with CockroachDB for testing and app development by using CockroachCloud Free. |
| Docs | Developer Guidance | Published more comprehensive, task-oriented guidance for developers building applications on CockroachDB, including connecting to a cluster, designing a database schema, reading and writing data, optimizing query performance, and debugging applications. |
| Docs | Connection Pooling | Added guidance on planning, configuring, and using connection pools with CockroachDB, as well as examples for Java and Go applications. |
| Docs | Sample Apps on CockroachCloud Free |
Updated various Java, Python, Node.js, Ruby, and Go sample app tutorials to offer CockroachCloud Free as the backend. |
| Docs | Licensing FAQs | Updated the Licensing FAQ to explain our licensing types, how features align to licenses, how to perform basic tasks around licenses (e.g., obtain, set, verify, monitor, renew), and other common questions. |
| Docs | Product Limits | Added object sizing and scaling considerations, including specific hard limits imposed by CockroachDB and practical limits based on our performance testing and observations. |
| Docs | System Catalogs | Documented important internal system catalogs that provide non-stored data to client applications. |
v21.1.0-rc.2
Release Date: May 5, 2021
Enterprise edition changes
- Changefeeds now reliably fail when
IMPORT INTOis run against a targeted table, as change data capture is not supported for this action. #64372
Bug fixes
- Fixed a correctness bug, which caused partitioned index scans to omit rows where the value of the first index column was
NULL. This bug was present since v19.2.0. #64046 IMPORTandRESTOREjobs that were in progress during a cluster backup will now be canceled when that cluster backup is restored. This fixes a bug where these restored jobs may have assumed to make progress that was not captured in the backup. #64352- Fixed a race condition where read-only requests during replica removal (for example, during range merges or rebalancing) could be evaluated on the removed replica, returning an empty result. #64370
- Fixed a bug where encryption-at-rest metadata was not synced and could become corrupted during a hard reset. #64473
Contributors
This release includes 5 merged PRs by 6 authors.
v21.1.0-rc.1
Release Date: May 5, 2021
SQL language changes
- CockroachDB no longer allows
ADD REGIONorDROP REGIONstatements if aREGIONAL BY ROWtable has index changes underway, or if a table is transitioning to or fromREGIONAL BY ROW. #64255 - CockroachDB now prevents index modification on
REGIONAL BY ROWtables and locality to or fromREGIONAL BY ROWchanges while anADD REGIONorDROP REGIONstatement is being executed. #64255
Bug fixes
- Fixed a scenario in which a rapid sequence of range splits could trigger a storm of Raft snapshots. This would be accompanied by log messages of the form "would have dropped incoming MsgApp, but allowing due to ..." and tended to occur as part of
RESTORE/IMPORToperations. #64202 - Read-write contention on
GLOBALtables no longer has a potential to thrash without making progress. #64215 - Previously, if a
DROP INDEXfailed during aREGIONAL BY ROWtransition, the index could have been re-inserted back into theREGIONAL BY ROWtable but would be invalid if it was hash-sharded or partitioned. This bug is now fixed. #64255 - Fixed a rare bug present in v21.1 beta versions that could cause rapid range splits and merges on a
GLOBALtable to lead to a stuck leaseholder replica. The situation is no longer possible. #64304 - Fixed a bug in previous v21.1 beta versions that allowed the store rebalancer to spuriously down-replicate a range during normal operation. #64303
- CockroachDB now prevents some out-of-memory conditions caused by schema change validations concurrent with other high-memory-use queries. #64307
- Fixed a bug present since v21.1.0-alpha.1 that could cause cascading
DELETEs with subqueries to error. #64278 - Fixed a bug that caused store information to be incorrectly redacted from the CockroachDB logs, when logging was configured with redaction. #64338
- Previously, the remote flows of execution in the vectorized engine could take a long time to shut down if a node participating in the plan died. This bug is now fixed. #64219
Contributors
This release includes 14 merged PRs by 14 authors.
v21.1.0-beta.5
Release Date: April 29, 2021
Docker image
$ docker pull cockroachdb/cockroach-unstable:v21.1.0-beta.5
Backward-incompatible changes
- The internal representation of the
voter_constraintszone configuration attribute (new in v21.1) has been altered in a way that is partially incompatible with the representation used by previous v21.1 betas (and the alphas that include this attribute). This means that users who directly set thevoter_constraintsattribute to an empty list will lose those constraints and will have to reset them. #63674
General changes
- Upgraded the CockroachDB binary to Go 1.15.10. #63865
Enterprise edition changes
- Changefeeds will now fail on any regional by row table with an error,
CHANGEFEED cannot target REGIONAL BY ROW tables: <table_name>.This is to prevent unexpected behavior in changefeeds until they offer full support for this type of table. #63542
SQL language changes
RESTOREnow re-validates restored indexes if they were restored from an incremental backup that was taken while the index was being created. #63320- The
sql.distsql.temp_storage.workmemcluster setting is now marked as public and is included in the documentation. It determines how much RAM a single operation of a single query can use before it must spill to temporary storage. Note the operations that do not support the disk spilling will ignore this setting and are subject only to the--max-sql-memorystartup argument. #63997 - SQL executor data validation queries spawned by a schema change or a
RESTOREwill now use vectorized query execution and DistSQL optimization if these are enabled in the cluster settingssql.defaults.vectorizeandsql.defaults.distsql, respectively. This may improve the speed of these queries. #64004
Bug fixes
- Allow the leases of offline descriptors to be cached, preventing issues with lease acquisitions during bulk operations (backup and restore operations). #63558
- Fixed bugs where
TRUNCATEconcurrent with index construction and other schema changes could result in corruption. #63143 - Fixed a panic condition which could occur in cases after a
RESTOREof a table with user-defined types. #63549 - CockroachDB now prevents a panic condition and offers a graceful error when spatial function
ST_Segmentizeattempts to generate an extremely large number of points on aGEOGRAPHY. #63758 - Previously, running the
ST_Simplifyspatial function on a non-numeric value would cause the node to crash. This is now resolved. #63797 - CockroachDB now uses the existing primary key to validate indexes built for
ALTER PRIMARY KEYchanges. #63609 - Fixed occasional stalls and excessive CPU usage under macOS Big Sur when building CockroachDB with Go 1.14 or newer. #63789
- Fixed a bug where crdb_internal.validate_multi_region_zone_configs() would fail during a
REGIONAL BY ROWlocality transition. #63834 - Fixed an internal error that could occur when executing queries using a GIN index. The error was an index out of range error, and could occur in rare cases when a filter or join predicate contained at least two JSON, Array, Geometry or Geography expressions that were combined with
AND. This has now been fixed. #63811 - Fixed a bug leading to crashes with the error message
writing below closed ts. #63861 - Previously, if a user altered a table to
REGIONAL BY ROWwhen a region was being dropped, and the drop failed and had to be rolled back, it could have resulted in the regional by row table missing a partition for this region. This is now fixed. #63793 - Prevent an internal error
use of enum metadata before hydration as an enumwhen querying or showing ranges from tables with user-defined types as theirPRIMARY KEY. #63878 - Fixed a theoretical issue in index backfills that could result in stale entries that would likely fail validation. [#64044][#64044]
- CockroachDB now correctly accounts for used memory when closing compressed files. #63917
Performance improvements
- CockroachDB now limits a series of heap allocations when serving read-only queries. #63972
- CockroachDB now limits the amount of memory that can be used in internal buffers for Kafka and cloud sinks. #63611
Contributors
This release includes 48 merged PRs by 23 authors. We would like to thank the following contributors from the CockroachDB community:
- Miguel Novelo (first-time contributor)
- Rupesh Harode (first-time contributor)
v21.1.0-beta.4
Release Date: April 19, 2021
General changes
- Removed experimental feature
UNIQUE WITHOUT INDEXfrom the documentation. #63499
SQL language changes
- The
pg_get_partkeydefbuilt-in function is now implemented by always returningNULL. #63149 - CockroachDB now collects execution stats for all statements when seen for the first time. To disable this behavior, set the
sql.txn_stats.sample_ratecluster setting to 0, which will disable all execution stats collection. #63325 - CockroachDB will now block the ability to set the initial
PRIMARY REGIONof a database if any multi-region fields on any zone configs in the database have been set. #63354 - CockroachDB now introduces a
pgcodewhen attempting toDROP REGIONwhen the region being dropped is thePRIMARY REGION. #63354 - Replaced the word "tuple" with its more user-friendly synonym "row" in vectorized stats outputs. #62956
- Changed
BACKUPof interleaved tables to require theinclude_deprecated_interleavesoption as interleaved table backups will not be able to be restored in future versions of CockroachDB. #63501
Operational changes
DB Console changes
The following statements now render correctly as events in the DB Console #63141:
- ALTER DATABASE ADD REGION
- ALTER DATABASE SET PRIMARY REGION
- ALTER DATABASE ... SURVIVE ... FAILURE
- ALTER DATABASE DROP REGION
- CREATE TYPE
- ALTER TYPE
- DROP TYPE
Bug fixes
- Fixed a bug present in earlier 21.1 versions where
BACKUPs would produce an error when they should be able to backup the underlying data. #63095 - Dropping a foreign key that was added in the same transaction no longer triggers an internal error. This bug has been present since at least version 20.1. #62879
- Fixed a bug where an
ALTER TABLE ... ADD COLUMN ... UNIQUEstatement would cause an error if the table had aPARTITION ALL BYorREGIONAL BY ROWdefinition. #63189 - Fixed a bug in earlier 21.1 versions where
CREATE TABLE LIKEwould copy aVIRTUALcolumn from the source table as aSTOREDcolumn in the destination table. #63172 - CockroachDB now returns an error when trying to perform a backup of a cluster that was taken on another tenant. #63223
- Fixed a bug where index backfill data may have been missed by
BACKUPin incremental backups. #63221 - Fixed a bug where
REGIONAL BY ROWzone configs were dropped beforeREGIONAL BY ROWchanges are finalized. This caused a bug when theREGIONAL BY ROWtransformation fail. #63274 - Fixed a case where implicitly partitioned columns (e.g., from
REGIONAL BY ROWtables and hash-sharded indexes) previously showed asimplicit = falsewhen usingSHOW INDEXESor queryinginformation_schema.pg_indexes. #63275 - Fixed an error that could occur when performing an
UPSERTon aREGIONAL BY ROWtable with no secondary indexes or foreign keys. The error, 'missing "crdb_region" primary key column', has now been fixed. #63257 - Fixed a bug where tables that were created by CockroachDB 19.x or older that included foreign key constraints and were backed up with the
revision_historyoption would be malformed when restored by a CockroachDB 20.x cluster if theRESTOREused theAS OF SYSTEM TIMEoption. #63267 - Fixed a bug in user-defined schemas where the dropping of any schema would prevent creation of schemas with the name of the database and would corrupt existing schemas of that name. #63395
- Fixed a bug in previous CockroachDB 21.1 releases where CockroachDB would sometimes return the output in an incorrect order if a query containing hash-aggregation was executed via the vectorized execution engine and spilled to temporary storage. #63408
- Fixed a bug where incremental cluster backups may have missed data written to tables while they were
OFFLINE. In practice this could have occurred if aRESTOREorIMPORTwas running across incremental backups. #63304 - CockroachDB now includes more anonymized data from SQL statements in telemetry updates and crash reports. #63482
- Fixed a rare issue that caused replica divergence. If this occurred the divergence was reported by the replica consistency checker, typically within 24 hours of occurrence, and caused the nodes to terminate. #63473
Performance improvements
- Improved performance of reverting
IMPORT INTOjobs thatIMPORT INTOempty tables. #63220
Miscellaneous improvements
- Made the Kafka library used in changefeeds configurable using the
kafka_sink_configoption to enable latency versus throughput configurations. #63361 - Connected the changefeed memory monitor to the parent SQL monitor to ensure that changefeeds do not try to use more memory than is available to the SQL server. #63409
Contributors
This release includes 50 merged PRs by 20 authors.
v21.1.0-beta.3
Release Date: April 12, 2021
Enterprise edition changes
- The
WITH avro_schema_prefixoption for Avro changefeeds now setsschema.namespace#61734 - CockroachDB now fails fast when Change Data Capture writes are blocked. #62756
SQL language changes
Multi-region SQL changes
Users can now use a multi-region
ALTER DATABASEcommand if:Availability zones are now ordered when using the
SHOW REGIONSset of commands. #62619
General SQL changes
- Added the
stub_catalog_tablessession variable, which is enabled by default. If disabled, querying an unimplementedpg_catalogtable will result in an error, as is the case in v20.2 and earlier. Otherwise, the query will simply return no rows. #62621
DB Console changes
- The Statements page now shows internal statements when the all filter option is selected. #62677
Bug fixes
- Fixed a bug that in rare circumstances could cause an implicitly committed (
STAGING) transaction to be uncommitted if any unresolved intents were removed by a range clear (e.g., when cleaning up a dropped table). This bug fix is only effective with separated intents, which are disabled by default. #62376 - Added a
DuplicateObjecterror code for when a user attempts toADD REGIONto a database where the region already exists. #62491 - Fixed an internal error that could occur during planning for queries involving tables with many columns and at least one GIN index. The error, "estimated distinct count must be non-zero", was caused by an invalid pointer access in the cardinality estimation code. This has now been fixed. #62545
- Writing files to
userfilewould sometimes result in an error claiming that theuserfiletable already exists. This is now fixed. #62544 - When adding/dropping regions from a multi-region database, the user must now have privileges on all regional-by-row tables as these are implicitly re-partitioned under the hood. #62612
- Fixed an internal error caused by comparing collation names that had different upper/lower case characters. #62637
- Fixed a bug whereby
ENUMtypes which have large numbers of values would cause unexpected errors when attempting to read from tables with columns using thatENUMtype. #62210 - Fixed a bug introduced in earlier v21.1 alpha releases which could cause panics when dropping indexes on tables partitioned by user-defined types. #62725
- Fixed a bug from earlier v21.1 alpha releases whereby dropping an index on a table partitioned by a user-defined type and then dropping the table and then dropping the type before the GC TTL for the index has expired could result in a crash. #62725
Performance improvements
- Improved the performance of the vectorized engine when scanning fewer than 1024 rows at a time. #62365
- Improved logic in determining the configuration for data to avoid expensive work when there are a large number of user-defined schemas. #62577
- Addressed a performance regression from a past change regarding read-triggered compactions. #62676
Contributors
This release includes 37 merged PRs by 23 authors.
v21.1.0-beta.2
Release Date: March 30, 2021
SQL language changes
Multi-region changes
- Added validation that prevents users from updating the zone configurations of multi-region tables without first setting the
override_multi_region_zone_configsession variable. #62119 - Discarding a zone configuration from a multi-region enabled entity is blocked behind the
override_multi_region_zone_configsession variable. #62159 - Reverted the change that added the
FORCEkeyword in #61499 in favor of theoverride_multi_region_zone_configsession variable. #62119 - Setting non-multi-region controlled fields on zone configs before
ALTER DATABASE ... SET PRIMARY REGIONwill now be preserved and have the same value after theSET PRIMARY REGIONcommand is issued. #62162 - Materialized views in multi-region databases will now have a
GLOBALtable locality. #62194 - Materialized views which are in a database before the first
ADD REGIONwill becomeGLOBALonADD REGION, in line with the behavior ofCREATE MATERIALIZED VIEWon a multi-region database. #62194 ALTER DATABASE .. SET PRIMARY REGIONnow requires bothCREATEandZONECONFIGprivilege on all objects inside the database when adding the first region to the database. The same behavior applies for dropping the last region usingALTER DATABASE ... DROP REGION. #62450- Removed the experimental multi-region locality syntaxes. #62114
General changes
- CockroachDB now stores information about contention on non-SQL keys. #62041
- Statement diagnostics bundles now contain output of
EXPLAIN (VEC)andEXPLAIN (VEC, VERBOSE)commands for the statements. #62049 - Sampled execution stats are now available through
crdb_internal.node_{statement,transaction}_statistics. #62089 - Increased the default value for the
sql.txn_stats.sample_ratecluster setting from 0 to 0.1. This means that from now on every statement has 10% probability of being sampled for the purposes of execution statistics. Note that no other criteria for sampling (such as query latency) are currently being utilized to decide whether to sample a statement or not. #61815 - Added the following cluster settings:
sql.defaults.statement_timeout, which controls the default value for thestatement_timeoutsession setting;sql.defaults.idle_in_transaction_session_timeout, which controls the default value for theidle_in_transaction_session_timeouttimeout setting;sql.defaults.idle_in_session_timeout, which already existed, but is now a public cluster setting. #62182 EXPLAINandEXPLAIN ANALYZEnow show how long ago table statistics were collected. #61945
Command-line changes
- Changed the formatting of namespace validation failures in
cockroach debug doctoroutput. #62245
Bug fixes
- Fixed a bug where the
targetcolumn ofcrdb_internal.zoneswould show names without properly accounting for user-defined schemas. #62022 - Added validation that prevents regions being dropped on multi-region databases when there are <= 3 regions left on the database. #62162
- Fixed a bug where zone configurations were not being correctly dropped on the final
DROP REGIONof a multi-region database. #62162 - Fixed a bug where
VIEWs andSEQUENCEs were not being allowed in multi-region databases. They will now default to theREGIONAL BY TABLElocality. #62176 - Fixed a bug where the
pg_type_is_visiblebuilt-in function did not correctly handle user-defined types. #62225 - Fixed a bug where casting an
OIDto aregtypedid not work for user-defined types. #62225 - A Raft leader who loses quorum will now relinquish its range lease and remove the replica if the range is recreated elsewhere, e.g., via
Node.ResetQuorum(). #62103 - Fixed a bug where
ClearRangecould leave behind stray write intents when separated intents were enabled, which could cause subsequent storage errors. #62104 ALTER TABLE,ALTER VIEW, andALTER SEQUENCEcan no longer be used to incorrectly create cross-DB references. #62341- Disallowed adding columns of type
OIDVECTORorINT2VECTORto a table inALTER TABLE ... ADD COLUMNstatements. These types are not allowed in user-created tables viaCREATE TABLEand were previously erroneously allowed inALTER TABLE ... ADD COLUMN. #62180 - CockroachDB now logs all unsupported
pgdumpstatements across smaller log files that can be found in the subdirectoryimport<jobID>/(unsupported_schema_stmts|unsupported_data_stmts)/<filenum>.log#62263 - Fixed a bug where a constraint like
NOT NULLorCHECKon a column made irrelevant by aDROP CONSTRAINTstatement in a later concurrent transaction would lead to errors / incorrect behaviour. #62249 - Fixed an internal error that could occur when
REGIONAL BY ROWtables were joined with other tables using a lookup or inverted join. The internal error was"we expect that limited UNION ALL queries are only planned locally". #62383 - Fixed a bug where using
DROP REGIONon the last region of a multi-region database would not delete the global zone configurations forGLOBALtables. #62220 - Fixed a bug where duplicate
IMPORTjob records may have been created, orIMPORTstatements may have failed, when the actual job succeeded. #62396 - Fixed a bug where CockroachDB could collect execution statistics prematurely, which would result in incorrect stats (e.g., when running
EXPLAIN ANALYZE). #62384 - Fixed a bug where setting the
kv.closed_timestamp.target_durationto 0 did not disable routing requests to follower replicas. #62439 - Fixed a bug where a failed restore from a backup including user defined types would require manual cleanup. #62454
Contributors
This release includes 61 merged PRs by 21 authors. We would like to thank the following contributors from the CockroachDB community:
- Tharun
v21.1.0-beta.1
Release Date: March 22, 2021
Backward-incompatible changes
- The
cockroach debug ballastcommand now refuses to overwrite the target ballast file if it already exists. This change is intended to prevent mistaken uses of theballastcommand by operators. Scripts that integratecockroach debug ballastcan consider adding armcommand. #59995 - Removed the
kv.atomic_replication_changes.enabledcluster setting. All replication changes on a range now use joint-consensus. #61170
Security updates
- It is now possible to log SQL statements executed by admin users. This logging is enabled via the
sql.log.admin_audit.enabledcluster setting. When set, events of typeadmin_queryare logged to theSENSITIVE_ACCESSchannel. #60708
General changes
- Updated the AWS SDK used to interface with AWS services such as S3 (for backup, restore, and import) and KMS (for backup/restore). #59709
SHOW TRACE FOR SESSIONpreviously included CockroachDB internal traces for async threads kicked off as part of user operations. This trace data is no longer captured. #59815- Crash reports that are sent to Cockroach Labs no longer redact the names of built-in virtual tables from the
crdb_internal,information_schema, andpg_catalogschemas. #60799 - Raised the default limit on the maximum number of spans that can be protected by the
protectedtssubsystem. This limit can be configured using thekv.protectedts.max_spanscluster setting. #61018
Enterprise edition changes
- Added the
bulkio.stream_ingestion.minimum_flush_intervalcluster setting, which allows the user to control how often the stream ingestion job will flush. Note that the job may still flush more often if the in-memory buffers are filled. #60160 - CockroachDB now supports primary key changes in
CREATE CHANGEFEED. #58422 - Multi-region database creations are now permitted as long as the cluster has a CockroachDB subscription. #61041
ALTER DATABASE ... ADD REGIONnow requires an enterprise license.#61169
SQL language changes
- Added a virtual table,
crdb_internal.node_inflight_trace_spans, which exposes span ID, parent span ID, trace ID, start time, duration, and operation of node-local inflight spans. #59492 - Added
WITH avro_schema_prefixoption to Avro changefeeds to prevent collisions in a shared schema registry #59710 - CockroachDB now allows implicitly partitioned indexes to be referenced by foreign keys using the non-implicit columns. #59692
- The
SHOW ZONE CONFIGURATIONstatement has been changed to useFROMinstead ofFOR. #59410 - It is now possible to use the
NOT VISIBLEqualifier for new column definitions inCREATE TABLE. This causes the column to become "hidden". Hidden columns are not considered when using*inSELECTclauses. Note that CockroachDB already supported hidden columns (e.g.,rowid, which is added automatically when a table definition has noPRIMARY KEYconstraint). This change adds the opportunity for end-users to define their own hidden columns. It is intended for use in combination with other features related to geo-partitioning introduced in v21.1, which offer more control about how geo-partitioning keys get exposed to client ORMs and other automated tools that inspect the SQL schema. #58923 - Added the
goroutine_idcolumn to thecrdb_internal.node_inflight_trace_spansvirtual table that represents the goroutine ID associated with a particular span. #59717 - Updated
SHOW BACKUP ... WITH PRIVILEGESto display ownership information of objects in the backup. #59732 - The
ALTER TYPE ... DROP VALUE ...statement has been added to drop values from anENUMtype. The statement drops the provided value if it isn't used as a value in any table's row. The use of this syntax is gated behind thesql_safe_updatessession variable, as it is susceptible to the value being used in a table expression (such as a computed column). #58688 - Added support for
COPY CSV. #59790 - CockroachDB now supports specifying
NULLandDELIMITERinCOPY. #59790 ALTER TABLE ... SET LOCALITYadds the ability to change the locality of aGLOBALorREGIONAL BY TABLEtable toREGIONAL BY ROW, provided an existing column of the appropriate type already exists. #59624- Overload sequence operators now accept a regclass. #59396
crdb_internal.invalid_objectsnow includes invalid type descriptors. #59978- Added the
finishedcolumn to the virtual tablecrdb_internal.node_inflight_trace_spans, which represents whether each span has finished or not. #59856 - Partitioned GIN indexes are now supported. #59858
- Hidden columns (created by using
NOT VISIBLEor implicitly created via hash sharded indexes, a lack of a primary key definition, or by usingREGIONAL BY ROW) will now display withNOT VISIBLEannotations onSHOW CREATE TABLE. #59828 REGIONAL BY ROWtables that have an implicitly createdcrdb_regiontable will now mark the given column as hidden so it does not display inSELECT *statements. #59831- CockroachDB now recognizes the
optionsURL parameter. Theoptionsparameter specifies session variables to set at connection start. This is treated the same as defined in the PostgreSQL docs. #59621 - Implemented the ability to
ALTER TABLE SET LOCALITYtoREGIONAL BY ROWwithout specifyingASforGLOBALandREGIONAL BY TABLEtables. #59824 - Added the
sql.show_tables.estimated_row_count.enabledcluster setting, which defaults totrue. Iffalse,estimated_row_countwill not display onSHOW TABLESwhich improves performance. #60282 ALTER DATABASE ... DROP REGIONis now implemented. #59989- When a connection is established, CockroachDB will now return a placeholder
BackendKeyDatamessage in the response. This is for compatibility with some tools, but usingBackendKeyDatato cancel a query will still have no effect (which is the same as before). #60281 - To match the behavior of
PRIMARY KEYcreations setting, all relevant fields toNOT NULL, allPARTITION BY/ REGIONAL BY ROWcolumns will now have their fields set toNOT NULLatCREATE TABLEtime. #60379 ALTER DATABASE ... DROP REGIONnow allows for dropping the primary region. #60437- Added support for restore of multi-region databases. #60257
- Implemented functionality to
ALTER TABLE SET LOCALITYfromREGIONAL BY ROWtoREGIONAL BY TABLEorGLOBAL. #60311 - Materialized views now require ownership or admin privilege to refresh. #60448
CONNECTcan be granted to / revoked from users at the database level (e.g.,GRANT CONNECT ON DATABASE db TO user;).CONNECTallows users to view all objects in a database ininformation_schemaandpg_catalog. Previously, only users could only see an object ininformation_schema/pg_catalogif they had any privilege (e.g.,SELECT) on the object. Added a warning when usingUSE DATABASEthat notifies the user that they do not haveCONNECTprivilege on the database and will needCONNECTprivilege to use databases in a future release. #59676- Add the built-in
crdb_internal.show_create_all_tables, which takes in a database name (STRING) and returns a flat log of all theCREATE TABLEstatements in the database followed byALTERstatements to add constraints. The output can be used to recreate a database. This built-in was added to replace old dump logic. #60154 - Implemented
default_to_database_primary_region, which will return the region passed in if the region is defined on the database, falling back to the primary key if not. #59836 - The default expression for
REGIONAL BY ROWtables is nowdefault_to_database_primary_region(gateway_region()), allowing users to add toREGIONAL BY ROWtables from any region. This would previously error if the gateway's region was not defined on the database. #59836 EXPLAINnow shows the estimated percentage of the table that is scanned. #60467- Multi-region tables will have their zone configs regenerated during database restore. #60519
- CockroachDB now supports the
DETACHEDoption when runningIMPORT. The detached import will returnjobIDand the user can later useSHOW JOBto check the result of the detached import. This allows users to runIMPORTunder explicit transactions withDETACHEDoption specified. #60442 - Casting JSON numeric scalars to numeric types now works as expected. #41367
- Most batches of data flowing through the vectorized execution engine will now be limited in size by
sql.distsql.temp_storage.workmem(64MiB by default), which should improve the stability of CockroachDB clusters. #59851 - Implemented the ability to
ALTER TABLE LOCALITY REGIONAL BY ROWfrom otherREGIONAL BY ROWvariants. #60497 - Setting of zone configs for non-physical tables is now forbidden. #60592
- Added telemetry to track usage of
pg_catalogandinformation_schematables #60511 SHOW JOBSnow displays a meaningful value in therunning_statuscolumn for GC jobs which are actually performing garbage collection, as opposed to waiting on a timer. #59220- Added the
SHOW CREATE ALL TABLESstatement, which allows the user to get the statements (CREATE/ALTER) to recreate a the current database. The command returns a flat log of the create statements followed by the alter statements for adding the constraints. The commands are ordered topologically such that dependencies appear before it's references.ALTERstatements follow create statements to guarantee that the objects are all added before adding constraints. This command is added to replace old dump logic. #60539 - Added the
schema_nameandtable_id columns to thecrdb_internal.rangesandcrdb_internal.ranges_no_leasesvirtual tables. #59865 - Using the
CACHEsequence option no longer results in an "unimplemented" error. TheCACHEoption is now fully implemented and will allow nodes to cache sequence numbers. A cache size of 1 means that there is no cache, and cache sizes of less than 1 are not valid. #56954 - The
serial_normalizationsession variable can now be set to the valuesql_sequence_cached. If this value is set, thesql.defaults.serial_sequences_cache_sizecluster setting can be used to control the number of values to cache in a user's session with a default of 256. When the cache is empty, the underlying sequence will only be incremented once to populate it. Usingsql_sequence_cachedwill result in better performance thansql_sequencebecause the former will perform fewer distributed calls to increment sequences. However, cached sequences may result in large gaps between serial sequence numbers if a session terminates before using all the values in its cache. #56954 - CockroachDB can now encode and decode sequence regclasses. #59864
- CockroachDB now allows renaming of sequences referenced by ID and conversion of sequences referenced by name to ID. #59864
EXPLAIN ANALYZEnow shows more top-level query statistics. #60641- Added
payloads_for_spanbuilt-in that takes in a span ID and returns its payloads inJSONBformat. If the span is not found, or if the span does not have any payloads, the built-in returns an empty JSON object. #60616 - Added a new
IMPORT PGDUMPoption,ignore_unsupported, to skip over all the unsupportedPGDUMPstatements. The collection of these statements will be appropriately documented. #57827 - Users will now need to specify
ignore_unsupportedto ignore all unsupported import statements during anIMPORT PGDUMP. #57827 - Added a new
IMPORT PGDUMPoption,ignored_stmt_log, which allows users to specify where they would like to log statements that have been skipped during an import, by virtue of being unsupported. #57827 - CockroachDB now supports
VIRTUALcomputed columns (as opposed toSTORED). These are computed columns that are not stored in the primary index and are recomputed as necessary. #60748 EXPLAIN ANALYZEnow includes the nodes which were involved in the execution of each operator in the tree. #60550- Added missing tables and columns at
pg_catalog. #60758 - Added a new session setting
locality_optimized_partitioned_index_scanand corresponding cluster default settingsql.defaults.locality_optimized_partitioned_index_scan.enabled. Both are currently disabled by default, and are currently unused. In the future, these settings will be used to enable or disable locality optimized search. If enabled, the optimizer will try to search locally for rows inREGIONAL BY ROWtables before searching remote nodes. #60771 - Added the new
parse_timestampfunction, which can be used to parse absolute timestamp strings in computed column expressions or partial index predicates. #60772 - CockroachDB now supports storing spatial type objects with
ZandMdimensions (e.g.,POINTZ,LINESTRINGM). #60832 ALTER DATABASE ... ADD REGIONnow re-partitionsREGIONAL BY ROWtables and updates the zone configs on the newly created partitions as well. #60596- Updated the
crdb_internal.payloads_for_spanbuilt-in to return a table instead of aJSONBarray. Each row of the table represents one payload for the given span. It has columns forpayload_typeandpayload_jsonb. #60784 ALTER DATABASE ... DROP REGION ...now re-partitionsREGIONAL BY ROWtables to remove the partition for the removed region and removes the zone configuration for the partition as well. #60938- Added the experimental
experimental_enable_stream_replicationsession setting andsql.defaults.experimental_stream_replication.enabledcluster setting to enable cluster streaming. #60826 - Introduced a new
is_multi_regioncolumn to crdb_internal.create_statements, which informs whether the database of the object is a multi-region database. #60761 - Introduced the new
crdb_internal.filter_multiregion_fields_from_zone_config_sqlbuilt-in, which removes multi-region fields from aCONFIGURE ZONEstatement. #60761 - Added new virtual tables
crdb_internal.cluster_contention_eventsandcrdb_internal.node_contention_events, which expose cluster-wide and gateway-only, respectively, contention information. In order to access them, the user needs to be either an admin or haveVIEWACTIVITYgrant. #60713 - The structured payloads used for SQL audit and execution logs now include a transaction counter since the beginning of the session. Statements issued inside the same SQL transaction will thus be logged with the same counter value, thus enabling per-transactions grouping during log analysis. Separate sessions use independent counters. #41929
- The geometry built-ins
ST_MakePointandST_MakePointMhave been implemented and provide a mechanism for easily creating new points. #61105 - Added the
payloads_for_trace()built-in so that all payloads attached to all spans for a given trace ID will be displayed, utilizing thecrdb_internal.payloads_for_span()built-in under the hood. All payloads for long-running spans are also added to debug.zip in thecrdb_internal.node_inflight_trace_spanstable dump. #60922 IMPORT PGDUMPcan now import dump files with non-public schemas. #57183- Added the
sql.optimizer.uniqueness_checks_for_gen_random_uuid.enabledcluster setting, which controls creation of uniqueness checks forUUIDcolumns set togen_random_uuid(). When enabled, uniqueness checks will be added for theUUIDcolumn if it has a unique constraint that cannot be enforced by an index. When disabled, no uniqueness checks are planned for these columns, and uniqueness is assumed due to the near-zero collision probability ofgen_random_uuid(). #61132 - The
pg_catalog.pg_classtable now has arelpartboundcolumn. This is only for compatibility, and the column value is alwaysNULL. #61162 - Cluster backup now restores the zone configurations first. This means that there should be less range-relocation during and after cluster restores. #60461
- Fixed
information_schema.columns.udt_schemaforENUMor user-defined types. #61139 - The geography built-in
ST_Affinenow supports 3D transformations. #61286 - The
ST_Z,ST_M, andST_Zmflagbuilt-ins are now available for use. #61032 - Geometry built-ins for forcing geometries into non-2D layouts are now available. #61297
ST_Buffernow requires at least 1 quadrant segment. #61315ST_RotateXfunction is now available. #61326EXPLAINnow shows estimated row counts for all operators even withoutVERBOSE(except when we do not have statistics for the tables). #61344- Updated the error message returned in case of a unique constraint violation to hide the names and values for implicit partitioning columns and hash sharded index columns. #61362
- Fixed
information_schema.columns.is_identityto display the correct value. #61348 ST_RotateYandST_RotateZare now available. #61387- CockroachDB now prevents
densifyFracs < 1e-6forST_FrechetDistanceandST_HausdorffDistanceto protect panics and out-of-memory errors. #61427 - CockroachDB now disallows
GRANT/REVOKEoperations on system tables. #61410 ST_Snapis now available. #61523- Updates to certain fields in the zone configurations are blocked for multi-region enabled databases. This block can be overridden through the use of the
FORCEkeyword on the blocked statement. #61499 - The
ST_AddMeasurefunction is now available for use. #61514 - Added a new built-in that sets the verbosity of all spans in a given trace. Syntax:
crdb_internal.set_trace_verbose($traceID,$verbosityAsBool). #61353 Pg_index.indkeynow includes attributes. #61494SHOW CREATE ALL TABLESis updated to be more memory efficient, however this should still not be run on a database with an excessive number of tables. Users should not run this on a database with more than 10000 tables (arbitrary but tested number). #61127- Set the default cluster setting for
sql.defaults.locality_optimized_partitioned_index_scan.enabledtotrue, which is the default for the session settinglocality_optimized_partitioned_index_scan. When this session setting is enabled, the optimizer will plan queries to use "locality optimized search" when possible, which instructs the execution engine to search for keys in local nodes before searching remote nodes. If a key is found in a local node, the execution engine may be able to avoid visiting the remote nodes altogether. #61601 ALTER TYPE ... DROP VALUEis gated behind a feature flag. The session setting is calledenable_drop_enum_valueand the corresponding cluster setting is calledsql.defaults.drop_enum_value.enabled. #61723TYPE SCHEMA CHANGEjobs which include aDROP VALUEin them are now cancellable. All other jobs remain non-cancellable. #61733- A statement contention timeseries is now displayed in the SQL metrics overview dashboard. #61844
- The
ST_SnapToGridfunction can now be used to snapZandMdimensions. #61826 - Added
json_extract_path_textandjsonb_extract_path_textbuilt-ins. #61813 - Removed
pg_catalogtables that were mistakenly added, notably all tables that end in_indexthat are notpg_catalog.pg_classesand all statistics collector tables that are notpg_stat_activity. #61876 - The
replicascolumn ofcrdb_internal.ranges{_no_leases}now includes both voting and non-voting replicas andcrdb_internal.ranges{_no_leases}include two new columns:voting_replicasandnon_voting_replicas, which work as labeled. #61962
Operational changes
- Added the
storage.transaction.separated_intents.enabledcluster setting, which enables separated intents by default. #59829
Command-line changes
- It is now possible to redirect logging to Fluentd-compatible network collectors. See the reference sink documentation for details.This is an alpha-quality feature. Note that Fluent-enabled configuration only provide minimal event buffering, and log entries are dropped if the logging server becomes unavailable or network errors are encountered. This is a known limitation and will be likely improved in a later version. #57170
- The SQL shell (
cockroach sql/cockroach demo) now supports a flag--embedded, for use with playground-style web applications. #59750 cockroach userfile getcan now be used to fetch files from a cluster. #60490- Added the
ignore-unsupported-statements,log-ignored-statementsandrow-limitflags to thecockroach importcommand. #60923 - The doctor tool can now report multiple descriptor validation failures per descriptor. #60775
- The new
cockroach connectcommand now recognizes--single-nodeto prepare a TLS configuration suitable for a subsequentstart-single-nodecommand. Additionally, the command checks that either--single-nodeis specified, or both--init-tokenand--num-expected-peers. #60854 - Optimized handling of multi-line SQL strings to avoid unwanted extra server roundtrips. #61207
- Added back support for
cockroach dump --dump-mode=schema. This command callsSHOW CREATE ALL TABLESand returns the output. This gives users a migration path to use in v21.1 while switching over toSHOW CREATE ALL TABLESfor v21.2. When executing this, the user is warned that the command is being removed in v21.2 and they should useSHOW CREATE ALL TABLESinstead. #61871
API endpoint changes
Added the following new HTTP API endpoints:
/api/v2/nodes/: Lists all nodes in the cluster/api/v2/nodes/<node_id>/ranges: Lists all ranges on the specified node/api/v2/ranges/hot/: Lists hot ranges in the cluster/api/v2/ranges/<range_id>/: Describes range in more detail/api/v2/health/: Returns an HTTP 200 response if node is healthy. #60952
DB Console changes
- Manually enqueue range in a replica GC queue now properly respects the
SkipShouldQueueoption. This can be useful to force a GC of a specific Range. #60619 - Added a filter for full scans to the Statements page. #60670
- The Range Report page on the DB Console will now also show each of the replica's types. #61113
- The Transaction Type column was removed from Statements page. The sort order in Statement / Transaction Table views is now by execution count. The sort order in Transaction Details view is by latency. Column titles in statements and transactions tables now say "{Statement,Transaction} Time" instead of "Latency". The Contention column added to the Statements / Transactions pages. Max Scratch Disk Usage added to Statements and Transaction Details pages. #61177
- Added a full-table scan checkbox. #61676
Bug fixes
- Fixed a bug in the DB Console affecting status badges in Nodes list on Cluster Overview page. #59636
- Fixes a bug where backups would fail with an error when trying to read a backup that was written. #59730
- Fixes a bug where some import failures would cause tables to stay
OFFLINE, when they should have been brought back toPUBLIC. #59723 - Fixed a bug that caused errors when joining two tables when one of the tables had a computed column. This bug was present since version v21.1.0-alpha.2 and not present in any production releases. #59741
- Statistics are now correctly generated for columns in multi-column GIN indexes and columns referenced in partial GIN index predicates. #59687
- Fixed a timestamp overflow bug that would overflow timestamps after the year 2038 by updating the Avro SDK used by changefeeds. #59745
- Fixed a very rare chance of inconsistent follower reads. #59502
- Previously if
RELEASE SAVEPOINT cockroach_restartwas followed byROLLBACK, thesql.txn.rollback.countmetric would be incremented. This was incorrect, since the transaction had already committed. Now that metric is not incremented in this case. #59781 - CockroachDB now explicitly verify descriptors are sequences. #60159
- The result of the
cockroach debug doctorinvocation duringcockroach debug zipis now properly included inside the generated zip file. #60529 - Fixed a bug in the optimizer statistics code that could cause an unconstrained partial index scan to be preferred over a constrained scan of the same index. #60516
- Fixed a deficiency in the replication layer that could result in ranges becoming unavailable for prolonged periods of time (hours) when a write burst occurred under system overload. While unavailable, the range status page for the affected range would show a last index much larger than the committed index and no movement in these indexes on a quorum of the replicas. Note that this should be distinguished from the case in which enough replicas are offline to constitute a loss of quorum, where the replication layer can not make progress due to the loss of quorum itself. #60581
- Previously, retryable errors in the cleanup phase of the type schema changer wouldn't be retried automatically in the background. This is now fixed. #60495
- v20.2 introduced an ability to rebalance replicas between multiple stores on the same node. This change fixed a problem with that feature, where occasionally an intra-node rebalance would fail and a range would get stuck permanently under replicated. #60546
- Fixed a bug that would cause the value of the optional
into_dbparameter toRESTOREto be included in anonymized crash reports. #60624 - Fixed a bug that caused errors for some queries on tables with
GEOMETRYorGEOGRAPHYGIN indexes with filters containing shapes with zero area. #60598 - CockroachDB previously didn't account for some RAM used when disk-spilling operations (like sorts and hash joins) were using the temporary storage in the vectorized execution engine. This could result in OOM crashes, especially when the rows are large in size. This has been fixed. #60593
- Fixed a bug where
ST_Nodewould panic if passed inMULTILINESTRING EMPTY. #60691 - Fixed a bug that could result in crashes during tracing when using the
trace.debug.enablecluster setting. #60725 - Fixed execution errors for some queries that use set operations (
UNION/EXCEPT/INTERSECT) where a column has types of different widths on the two sides (e.g.,INT4vs.INT8). #60560 - CockroachDB now avoids creating batches that exceed the raft command limit (64MB) when reverting ranges that contain very large keys. #59716
- Fixed a bug whereby high-latency global clusters could sometimes fall behind checkpointing resolved timestamps. #60807
- Added check privileges before changing table/database owner. #60800
- Fixed an internal error caused in some cases involving JSON objects and arrays in a
VALUESclause. #60767 - Previously
DROP TYPE IF EXISTSwith one existent, and another non-existent type would cause an unhandled error. This is now fixed. #60822 - Fixed bug that could report that a protected timestamp limit was exceeded when the limit was disabled, if an error were to occur while protecting a record. #60913
- CockroachDB previously could encounter an internal error when performing
UNIONoperation when the first input resulted only in NULL values and consequent inputs produce tuples, and this is now fixed. Only v21.1 alpha versions are affected. #60827 - Fixed a bug in
crdb_internal.unsafe_upsert_namespace_entryrelated to tables and types in user-defined schemas. #60510 - Integers inside of tuples were not being encoded properly when using the binary format for retrieving data. This is now fixed, and the proper integer width is reported. #61013
- Blank-padded chars (e.g.,
CHAR(3)) were not being encoded correctly when returning results to the client. Now they correctly include blank-padding when appropriate. #61013 - Collated strings were not encoded with the proper type OID when sending results to the client if the OID was for the
chartype. This is now fixed. #61013 - Fixed a very rare, possible impossible in practice, bug where a range merge that applied through a Raft snapshot on the left-hand side range's leaseholder could allow that leaseholder to serve writes that invalidated reads from before the merge on the right-hand side. Release justification: bug fix #60521
- The
SHOW CREATEoutput of a partitioned partial index now lists thePARTITION BYandWHEREclauses in the order accepted by the parser. #60590 - The
SHOW CREATEoutput of a partial interleaved index now lists theINTERLEAVEDandWHEREclauses in the order accepted by the parser. #60590 - Fix a bug where cluster restore would sometimes (very rarely) fail after retrying. #60458
- Previously, comparing a negative integer to an OID would fail to compare correctly because the integer was not converted to an unsigned representation first. this is now fixed for both comparisons and casts.#61148
- Previously, CockroachDB could not decode arrays of user-defined types when sent to the server in the binary format. Now it can. #61165
crdb_internal.jobsvirtual table is now populated in a paginated fashion, thus, alleviating memory related concerns when previously we could encounter OOM crash. #60693- The
SHOW TABLES FROM databasecommand would always show a NULLestimated_row_countif inspecting a database that was not the current database. This is now fixed. #61191 - Fixed a bug where schema changes on databases and schemas could return a
relation [<id>] does not existif they failed or were canceled and entered the reverting state. These jobs are not actually possible to revert. With this change, the correct error causing the job to fail will be returned, and the job will enter the failed state with an error indicating that the job could not be reverted. #61159 - CockroachDB now drops the default value when its dependent sequence is dropped. #60744
- Dropping and recreating a view/table/sequence in a transaction will now correctly error out if a conflicting object exists or if the drop is incomplete. #61135
- The non-server
cockroachcommands now recognize the new--logflag properly. This had been broken in one of the earlier v21.1 alpha releases. #61232 - Prepared statements would sometimes get the wrong type OID for placeholder arguments used in function parameters. This is now fixed. #60949
- Fixed a case where empty zone configurations get created for certain indexes during
ALTER PRIMARY KEY. #61235 - Schema change jobs associated with databases and schemas can no longer be canceled. Such jobs cannot actually be reverted successfully, so cancelation had no benefit and could have caused namespace corruption. #61210
- Fixed
cockroach democommands nodeName error argument index handling. #61246 - CockroachDB no longer displays incorrect node statuses on Metrics page, when page just loaded. #61000
- Fixed an NPE observed with a SpanFromContext call in the stack trace. #61124
- Limit scans are no longer counted as full scans. #61178
- Selecting from
crdb_internal.create_statementswill now correctly populate thedatabase_namewhen the virtual index is not used. #61201 - Fixed an internal error when
EXPLAINing anINSERTwith an input that was determined by the optimizer to produce no rows. #61278 - Fixed a rare deadlock where a series of lease transfers concurrent with a Range merge could block each other from ever completing. #60905
ALTER TYPE ... ADD VALUEchanges are picked up by the array type alias correctly. #61288- Previously, the traces of cascades and checks could be incomplete. This is now fixed. #61321
- Creating interleaved partitioned indexes is now disallowed. Previously, the database would crash when trying to create one. #61106
- Dropping and re-creating a database in a transaction will now correctly error out if an object in a dropped state is detected. #61361 #61358
- CockroachDB now uses the correct
FuncExprwhen encoding sequences. #61428 - Alter primary key was not idempotent, so logical equivalent changes to primary keys would unnecessarily create new indexes. This is now fixed. #61345
- Fixed a bug where
GRANT/REVOKEon thesystem.leasetable would result in a deadlock. #61410 - Fixed operation hangs when a node loses access to cluster RPC (e.g., after it has been decommissioned), and immediately return an error instead. #61356
- Fixed a bug from v21.1-alpha where a node decommissioning process could sometimes hang or fail when the decommission request was submitted via the node being decommissioned. #61356
- Fixed bug where zone configurations on indexes were not copied before the backfill of an
ALTER PRIMARY KEY. They used to be copied afterwards instead. #61300 - Fixed a bug where random numbers generated as default expressions during
IMPORTwould collide a few hundred rows apart from each-other. #61214 - Fixed a bug that caused
UPSERTandINSERT..ON CONFLICT..DO UPDATEstatements to fail on tables with both partial indexes and foreign key references. This bug has been present since v20.2.0. #61416 - An
UPDATE..FROMstatement where theFROMclause contained column names that match table column names erred if the table had a partial index predicate referencing those columns. This bug, present since partial indexes were released in v20.2.0, has been fixed. #61522 - The names of custom types are no longer sent to Cockroach Labs in telemetry and crash reports. #60806
- Fixed a case where an invalid tuple comparison using ANY was causing an internal error; we now return "unsupported comparison operator". #61647
- Added better privilege checks when creating a changefeed. #61709
- Fixed privileges for system.
protected_ts_meta. #61842 - The
indexdefcolumn in thepg_indexestable would always report that the index belonged to the public schema. Now it correctly reports user-defined schemas if necessary. #61754 - Fixed "command is too large" errors in some cases when using
EXPLAIN ANALYZE (DEBUG)or statement diagnostics on complex queries. #61909 - Using
EXPLAIN (OPT, ENV)on a query that references a table in a user-defined schema would fail previously. This is now fixed. #61888 - Fixed a bug that caused "column does not exist errors" in specific cases of
UPDATE..FROMstatements. The error only occurred when updating aDECIMALcolumn to a column in theFROMclause, and the column had aCHECKconstraint or was referenced by a partial index predicate. #61949 - Previously the
idle_in_session_timeoutandidle_in_transaction_session_timeoutsettings would show the wrong value when usingSHOW. They would instead show the value of thestatement_timeoutsetting. This is now fixed. The functionality was already working correctly; this just fixes a display bug. #61959
Performance improvements
- Improved the performance of the
pg_table_is_visiblebuilt-in function. #59880 - Added support for left and anti lookup joins in cases where the equi-join condition is not on the first column in the index, but the first column(s) are constrained to a small number of constant values using a CHECK constraint or an ENUM type. Planning a lookup join for these cases can significantly improve performance if the left input to the join is much smaller than the right-hand side. #60302
- The optimizer now knows that the unique columns in an implicitly partitioned unique index form a key. This can be used to enable certain optimizations and may result in better plans. #60591
- Improved the optimizer's ability to identify constant columns in scans. This can enable different types of optimizations and result in improved plans. #60927
- Follower reads no longer wait before redirecting to the leaseholder if they could not be served by a local follower due to an insufficient closed timestamp. #60839
- Updated the query used to build the virtual table
crdb_internal.table_row_statisticsso that it is always run atAS OF SYSTEM TIME '-10s'. This should reduce contention on the table and improve performance for transactions that rely oncrdb_internal.table_row_statistics, such asSHOW TABLES. #60953 - Improved the optimizer's cost estimation of index scans that must visit multiple partitions. When an index has multiple partitions, the optimizer is now more likely to choose a constrained scan rather than a full index scan. This can lead to better plans and improved performance. It also improves the ability of the database to serve queries if one of the partitions is unavailable. #61063
- Optimized external sort to merge partition data faster in colexec. #61056
- If the session setting
locality_optimized_partitioned_index_scanis enabled, the optimizer will try to plan scans known to produce at most one row using "locality optimized search". This optimization applies forREGIONAL BY ROWtables, and if enabled, it means that the execution engine will first search locally for the row before searching remote nodes. If the row is found in a local node, remote nodes will not be searched. #60831 - The optimizer now infers additional functional dependencies based on computed columns in tables. This may enable additional optimizations and lead to better query plans. #61097
- Removed uniqueness checks on the primary key for
REGIONAL BY ROWtables with a computed region column that is a function of the primary key columns. Uniqueness checks are not necessary in this case since uniqueness can be suitably guaranteed by the primary index. Removing these checks improves performance ofINSERT,UPDATE, andUPSERTstatements. #61097 - The optimizer no longer plans uniqueness checks for columns in implicitly partitioned unique indexes when those columns are used as the arbiters to detect conflicts in
INSERT ... ON CONFLICTstatements. Unique checks are not needed in this case to enforce uniqueness. Removing these checks results in improved performance forINSERT ... ON CONFLICTstatements. #61184 - The columns fetched for uniqueness checks of implicitly partitioned unique indexes are now pruned to only include columns necessary for determining uniqueness. #61376
- Introspection queries that use casts into the
REGPROCpseudo-type are made much more efficient: they're now implemented as a constant-time lookup instead of an internal query. #61211 - Fixed cases where the optimizer was doing unnecessary full table scans when the table was very small (according to the last collected statistics). #61805
- The optimizer now estimates the cost of evaluating query filters more accurately for queries with a
LIMIT. Previously, it was assumed that the filter would be evaluated on each input row. Now, the optimizer assumes that the filter will only be evaluated on the number of rows required to produce the LIMIT's number of rows after filtering. This may lead to more efficient query plans in some cases. #61947
Contributors
This release includes 667 merged PRs by 70 authors. We would like to thank the following contributors from the CockroachDB community:
- Abdullah Islam (first-time contributor)
- Alan Acosta (first-time contributor)
- Kumar Akshay
- Max Neverov
- Miguel Novelo (first-time contributor)
- Ratnesh Mishra (first-time contributor)
- Tharun (first-time contributor)
- Ulf Adams (first-time contributor)
- alex-berger@gmx.ch (first-time contributor)
- leoric (first-time contributor)
- shikamaru (first-time contributor)
v21.1.0-alpha.3
Release Date: February 8, 2021
General changes
- Added ability to further debug connections shut down automatically by the server. #59460
SQL language changes
- Fixed up
ALTER TABLE ... ADD CONSTRAINT ... UNIQUEto partition correctly under aPARTITION ALL BYtable. #59364 - CockroachDB now applies zone configs to new unique constraints in
REGIONAL BY ROWtables. #59364 - A new, unused field called
global_readswas added to zone configurations. The field does not yet have any effect. #59304 - A new private cluster setting
sql.distsql.temp_storage.hash_agg.enabledwas added that allows users to disable the disk spilling capability of the hash aggregation in the vectorized execution engine. It istrueby default which incurs some performance hit. Setting it tofalsewill improve the performance, but the queries might hit an out-of-memory limit error. #59414 - The optimizer now enforces a unique constraint on the explicit index columns for implicitly partitioned unique indexes and unique indexes in
REGIONAL BY ROWtables. An attempt to insert or update a row such that the unique constraint is violated will result in an error. #59501 REGIONAL BY ROWtables now preserve zone configurations when usingALTER PRIMARY KEY. #59365- Implemented
ALTER TABLE ... LOCALITY REGIONAL BY TABLEfromLOCALITY GLOBAL. #59407 - Zone configs now support new attributes
num_votersandvoter_constraints.num_voterswill specify the number of voting replicas. Whennum_votersis explicitly specified,num_replicaswill be the sum of voting and non-voting replicas.voter_constraintswill specify the constraints that govern the placement of just the voting replicas, whereas the existingconstraintsattributes will govern the placement of all replicas (voting as well as non-voting). #57184 - Added SQL syntax for
RESTORE tenant x FROM REPLICATION STREAM FROM 'replication_stream'. This allows the user to start an ingestion job to ingest KVs from the replication stream into the destination tenant's keyspace. #59112 - The
SHOW CREATEstatement now listsALTER PARTITIONstatements sorted by the partition name and index_name. #59580 - Error messages for cross-database links now include a hint directing to the user to the deprecation docs. An example message looks like:
ERROR: the view cannot refer to other databases; (see the 'sql.cross_db_views.enabled' cluster setting) SQLSTATE: 0A000 HINT: Note that cross database references will be removed in future releases. See: https://www.cockroachlabs.com/docs/releases/v21.1.html#v21-1-0-deprecations#59551 - The
escape_string_warningsession variable from PostgreSQL was added with compatibility-only support. It defaults toonand cannot be changed. #59479 - Multi-column GIN indexes can now be created. The last indexed column must be inverted types such as
JSON,ARRAY,GEOMETRY, andGEOGRAPHY. All preceding columns must have types that are indexable. These indexes may be used for queries that constrain all index columns. #59565 - Added
WITH full_table_nameoption to create a changefeed onmovr.public.driversinstead ofdrivers. #59258 UPSERTs on tables with an implicitly partitioned primary index now use only the explicit primary key columns as the conflict columns, excluding all implicit partitioning columns. This also applies toREGIONAL BY ROWtables, ensuring that thecrdb_regioncolumn is not included in theUPSERTkey. #59654
Command-line changes
- The
cockroachcommand now supports the command-line parameter--versionwhich reports its version parameters. This makescockroach --versionequivalent tocockroach version. #58665 - The
cockroach versioncommand now supports a new parameter--build-tag; when specified, it displays the technical build tag, which makes it possible to integrate with automated deployment tools. #58665 The
channelsparameter for the log sink configurations now supports a more flexible input configuration format:
Syntax to include specific channels:
channels: dev,sessions(yaml string)
channels: 'dev,sessions'(yaml string, equivalent to previous)
channels: [dev,sessions](yaml array, can use multi-line syntax with hyphens too)
channels: ['dev','sessions'](same as previous)
channels: '[dev,sessions]'(bracket-enclosed list inside yaml string)Syntax to include all channels:
channels: all(yaml string)
channels: 'all'(same as previous)
channels: [all](yaml array)
channels: ['all'](same as previous)
channels: '[all]'(bracket-enclosed "all" inside yaml string)Syntax to include all channels except some:
channels: all except dev,sessions(yaml string)
channels: 'all except dev,sessions'(same as previous, quoted string)
channels: 'all except [dev,sessions]'(same as previous, list is bracket enclosed)For example:
sinks: stderr: channels: - DEV - SQL_SESSIONSuses the "native" YAML syntax for lists. #59352The notification that
SIGHUPwas received, and that log files are flushed to disk as a result, is now sent to the OPS logging channel. #59345The notification that
SIGHUPwas received, and that TLS certificates are reloaded from disk as a result, is now sent to the OPS logging channel as a structured event. Refer to the reference docs for details about the event payload. #59345
API endpoint changes
- Added a new API tree, in
/api/v2/*, currently undocumented, that avoids the use of cookie-based authentication in favor of sessions in headers, and support for pagination. #58436
DB Console changes
- Updated the table details page to show table-specific zone configuration values when set, show constraints and lease preferences, and display a valid statement to re-configure zone configuration for that table. #59196
- Users can now see the time series of full table or index scans in the Advanced Debug page. #59261
- The
sql.leases.activegauge is now available to track the outstanding descriptor leases in the cluster. #57561 - Long queries are truncated in the DB Console. #59603
Bug fixes
- Added event logs for
SET SCHEMAstatements. #58737 - Fixed an issue where a left inverted join could have incorrect results. In particular, some output rows could have non-
NULLvalues for right-side columns when the right-side columns should have beenNULL. This issue has only existed in alpha releases of 21.1 so far, and it is now fixed. #59279 - Fixed a panic where type hints mismatching placeholder names cause a crash. #59450
- Unexpected internal errors containing stack traces that reference a
countingWriternull pointer have now been fixed. #59477 - Fixed a bug introduced in v20.1 in the DB Console where incorrect zone configuration values were shown on the table details page and constraints and lease preferences were not displayed. #59196
- Changefeeds no longer error with "1e2 is not roundtrippable at scale 2" when 100 is stored in a column with width 2. #59075
- Fixed a bug which prevented renaming a column that was referenced earlier in a transaction as part of a computed expression, index predicate, check expression, or not null constraint. #59384
- Added event logs for privilege changes in
crdb_internal.unsafe_xxx. #59282 - Fixed a bug in which incorrect results could be returned for left and anti joins. This could happen when one of the columns on one side of the join was constrained to multiple constant values, either due to a check constraint or an
INclause. The bug resulted in non-matching input rows getting returned multiple times in the output, which is incorrect. This bug only affected previous alpha releases of 21.1, and has now been fixed. #59646 - Fixed
EXPLAIN ANALYZE (DEBUG)interaction with the SQL shell. #59557 - Fixed a bug preventing foreign key constraints referencing hidden columns (e.g.,
rowid) from being added. #59659 - Fixed a bug where
DROP SCHEMA ... CASCADEcould result in types which are referenced being dropped. #59281 - Fixed a bug whereby dropping a schema with a table that used a user-defined type which was not being dropped (because it is in a different schema) would result in a descriptor corruption due to a dangling back-reference to a dropped table on the type descriptor. #59281
Performance improvements
- The query optimizer now plans scans over GIN indexes on
JSONcolumns for query filters that constrain theJSONcolumn with equality and fetch value operators (->) inside conjunctions and disjunctions, likej->'a' = '1' AND j->'b' = '2'. #59266 - Fixed a bug included in 20.2.1 for the
JSONfetch value operator,->which resulted in chained->operators in query filters not being index accelerated (e.g.,j->'a'->'b' = '1'). Chained->operators are now index accelerated. #59494 - Improved the allocation performance of workloads that use the
EXTRACTbuilt-in. #59598
Contributors
This release includes 116 merged PRs by 42 authors. We would like to thank the following contributors from the CockroachDB community:
- John Seekins (first-time contributor)
- Ulf Adams (first-time contributor)
v21.1.0-alpha.2
Release Date: February 1, 2021
Backward-incompatible changes
- The payload fields for certain event types in
system.eventloghave been changed and/or renamed. Note that the payloads insystem.eventlogwere an undocumented, reserved feature so no guarantee was made about cross-version compatibility to this point. The list of changes includes (but is not limited to):TargetIDhas been renamed toNodeIDfornode_join.TargetIDhas been renamed toTargetNodeIDfornode_decommissioning/node_decommissioned/node_recommissioned.NewDatabaseNamehas been renamed toNewDatabaseParentforconvert_to_schema.grant_privilegeandrevoke_privilegehave been removed; they are replaced bychange_database_privilege,change_schema_privilege,change_type_privilege, andchange_table_privilege. Each event only reports a change for one user/role, so theGranteesfield was renamed toGrantee.- Each
drop_roleevent now pertains to a single user/role. #57737
- The connection and authentication logging enabled by the cluster settings
server.auth_log.sql_connections.enabledandserver.auth_log.sql_sessions.enabledwas previously using a text format which was hard to parse and integrate with external monitoring tools. This has been changed to use the standard notable event mechanism, with standardized payloads. The output format is now structured; see the generated reference documentation for details about the supported event types and payloads. #57839 - The logging format for SQL audit, execution, and query logs has changed from a crude space-delimited format to JSON. To opt out of this new behavior and restore the pre-v21.1 logging format, you can set the cluster setting
sql.log.unstructured_entries.enabledtotrue. #59110
Security updates
- The entropy of the auto-generated user account password for
cockroach demoshell has been lowered, to ensure that the passwords are short and easy to copy over. This makes the password easy to brute-force and thus removes any remaining protection there may have been to the confidentiality ofdemosessions. (The reason why a password remains, as opposed to no password whatsoever, is to prevent accidental misuse of the HTTP service by other applications running on the same machine.) Since the required shortness erases any pretense of security, the algorithm has been simplified to remove usage of a cryptographic PRNG altogether. #58305 - When using a SQL proxy, by default CockroachDB only knows about the network address of the proxy. That peer address is then used for logging, authentication rules, etc. This is undesirable, as security logging and authentication rules need to operate on the actual (final) client address instead. CockroachDB can now be configured to solve this problem (conf mechanism detailed below). When so configured, a SQL proxy can inform the CockroachDB server of the real address of the client via a server status parameter called
crdb:remote_addr. The value must be the IP address of the client, followed by a colon, followed by the port number, using the standard Go syntax (e.g.,11.22.33.44:5566for IPv4,[11:22::33]:4455for IPv6). When provided, this value overrides the SQL proxy's address for logging and authentication purposes. In any case, the original peer address is also logged alongside the client address (overridden or not), via the new logging tagpeer. Security considerations:- Enabling this feature allows the peer to spoof its address with regard to authentication and thus bypass authentication rules that would otherwise apply to its address, which can introduce a serious security vulnerability if the peer is not trusted. This is why this feature is not enabled by default, and must only be enabled when using a trusted SQL proxy.
- This feature should only be used with SQL proxies which actively scrub a
crdb:remote_addrparameter received by a remote client, and replaces it by its own. If the proxy mistakenly forwards the parameter as provided by the client, it opens the door to the aforementioned security vulnerability. - Care must be taken in host-based authentication (HBA) rules:
- TLS client cert validation, if requested by a rule, is still performed using the certificate presented by the proxy, not that presented by the client. This means that this new feature is not sufficient to forward TLS client cert authentication through a proxy. (If TLS client cert authentication is required, it must be performed by the proxy directly.)
- The
protocolfield (first column) continues to apply to the connection type between CockroachDB and the proxy, not between the proxy and the client. Only the 4th column (the CIDR pattern) is matched against the proxy-provided remote address override. Therefore, it is not possible to apply different rules to different client address when proxying TCP connections via a unix socket, because HBA rules for unix connections do not use the address column. Also when proxying client SSL connections via a non-SSL proxy connection, or proxying client non-SSL connections via a SSL proxy connection, care must be taken to configure address-based rule matching using the proper connection type. A reliable way to bypass this complexity is to only use thehostconnection type which applies equally to SSL and non-SSL connections. As of this implementation, the feature is enabled using the non-documented environment variableCOCKROACH_TRUST_CLIENT_PROVIDED_SQL_REMOTE_ADDR. The use of an environment variable is a stop-gap so that this feature can be used in CockroachCloud SQL pods, which do not have access to cluster settings. The environment variable will be eventually removed and replaced by another mechanism. #58381
- Added ability to set region-specific callback URLs in the OIDC config. The
server.oidc_authentication.redirect_urlcluster setting can now accept JSON as an alternative to the basic URL string setting. If a JSON value is set, it must contain aredirect_urlkey that maps to an object with key-value pairs where the key is aregionmatching an existing locality setting and the value is a callback URL. #57519
General changes
- CockroachDB now runs fewer threads in parallel if running inside a container with a CPU limit. #57390
- Upgraded the CockroachDB binary to Go 1.15.6. #57713
- The new cluster setting
server.eventlog.enabledcontrols whether notable events are also written to the tablesystem.eventlog. Its default value istrue. Changing this cluster setting can help recovering partial cluster availability when thesystem.eventlogtable becomes unavailable. Note that even whenfalse, notable events are still propagated to the logging system, where they can be redirected to files or other log sinks. #57879 - Moved RBAC resources in Kubernetes manifests to
rbac.authorization.k8s.io/v1. #55065 - Cluster version upgrades, as initiated by
SET CLUSTER SETTING version = <major>-<minor>, now perform internal maintenance duties that will increase the time that it takes for the command to complete. This delay is proportional to the amount of data currently stored in the cluster. The cluster will also experience a small amount of additional load during this period while the upgrade is being finalized. These changes expand upon our original prototype in #57445. #58088 - Upgraded to v3.9.2 of
protobufto consume new changes for Bazel. #58891 - Increased the default value of
sql.tablecache.lease.refresh_limitto 500 in order to accommodate larger schemas without encounteringRETRY_COMMIT_DEADLINE_EXCEEDEDerrors and generally higher latency. #59319
Enterprise edition changes
SQL language changes
- Added a new built-in method to calculate Voronoi polygons. #56496
- Added a new built-in method to calculate Voronoi lines. #56496
- Previously, timezones had to be entered in the same case as they were stored on the system. Now, timezone names can be case-insensitive provided they match well-known zone names according to Go's
time/tzdatapackage. #57250 - Added
LOCALITY REGIONAL BY TABLE IN PRIMARY REGIONsyntax for configuring table locality. #57275 - The default value for
vectorize_row_count_thresholdsetting has been decreased from 1000 to 0, meaning that, by default, CockroachDB will always use the vectorized engine for all supported queries regardless of the row estimate (unlessvectorize=offis set). #55713 - Added the ability to
CREATE TABLEwith LOCALITY set. #57419 EXPLAINandEXPLAIN ANALYZEnow show counts and durations in a more user-friendly way. #57420EXPORTcan now be used by non-adminusers withSELECTprivilege on the table being exported, unless the destination URI requiresadminprivileges. #57380CREATE DATABASE ... WITH [PRIMARY] REGIONSnow modifies the zone configurations with the settings as set by the multiregion configuration. #57244SHOW [BACKUP]is no longeradmin-only. It depends on the URI construct and the credentials specified in theSHOW [BACKUP]query. #57412- built-in aggregate function
regr_avgxis now supported. #57295 - Added support for running
IMPORTin a mixed-version cluster. #57382 - Introduced
SHOW REGIONS FROM ALL DATABASES, which shows region metadata for each database in the table. #57500 - Added
collationstable to theinformation_schema. Thecollationstable contains the collations available in the current database. #57609 - Added
collation_character_set_applicabilitytable to theinformation_schema. #57609 LOCALITYdirectives onCREATE TABLEare now persisted onto the database. #57513- Multi-region defined table localities now display on the
SHOW CREATE TABLEcommand. #57513 - Arrays in
pg_catalogtables now are displayed in a format that matches PostgreSQL. #56980 - The
SET TRACINGlocaloption (to only trace messages issued by the local node) was removed. #57567 - Several
SHOWcommands have been adjusted to enforce a particular ordering of the output rows. #57644 - Implemented
regr_avgybuilt-in aggregation function. #57583 crdb_internal.tablesandSHOW TABLESnow show locality data on the tables. #57653CREATE TABLE ... LOCALITY ...statements now modify the zone configurations to be in line with the desired locality. #57654- Added
sql.trace.stmt.enable_thresold. Similar tosql.trace.txn.enable_threshold, this logs a trace of any statements that take longer than the specified duration. This new setting allows for more granularity than the transaction threshold since it applies to individual statements and does not include overhead such as communication with a SQL client. #57733 - Added a session setting
experimental_enable_unique_without_index_constraintsand cluster defaultsql.defaults.experimental_enable_unique_without_index_constraints.enabledto enable the use ofUNIQUE WITHOUT INDEXsyntax. The default value of both settings isfalsesince this feature is not yet fully supported. Use ofUNIQUE WITHOUT INDEXalso depends on all nodes being upgraded to the cluster versionUniqueWithoutIndexConstraints. #57666 - Implemented built-in function
levenshtein. #56843 - Added table-view dependency information in
pg_dependto improve compatibility with PostgreSQL. #57240 - The cluster event logging system has been modernized. In particular, the schema of the entries for the
infocolumn insystem.eventloghas been stabilized. #57737 - The
targetIDandreportingIDcolumns insystem.eventlogare now deprecated. Their values, for relevant event types, can be found as fields inside theinfocolumn instead. #57737 - Added the
soundex()anddifference()built-in functions. #57615 - New
EXPLAIN ANALYZE (DISTSQL)output format.EXPLAIN ANALYZE (DISTSQL)now only works as a top-level statement (it can no longer be part of a bigger query). #57804 - Added built-in function
ST_OrientedEnvelopeto calculate the mimimum-area rotated rectangle. #57697 - A new
default_transaction_use_follower_readssession variable is now supported, which configures SQL transactions to perform stale reads from follower replicas. #57851 - Both
ALTER TABLE OWNERandREASSIGN OWNED BYnow report structured notable events about the ownership changes. Note thatREASSIGN OWNED BYcurrently also reports analter_table_ownerfor views and sequences that were implicitly reassigned, even though CockroachDB does not yet support theALTER VIEW OWNER/ALTER SEQUENCE OWNERstatements. #57969 EXPLAIN (DISTSQL)has a new output schema and format. #57954- Added an overload to
crdb_internal.pb_to_jsonto suppress populating default values in fields. #58087 IMPORT INTOfor CSV now supportsnextvalas a default expression of a non-targeted column. #56473- The
EXPLAINoutput for foreign key checks is now labeledconstraint-checkrather thanfk-check. This change is in preparation for adding support for unique constraint checks, which will use the same label. #58053 - The error message for unique constraint violations now matches the error used by PostgreSQL. For example, the new error message looks like this:
ERROR: duplicate key value violates unique constraint "primary" DETAIL: Key (k)=(1) already exists.#58053 EXPLAIN ANALYZEdiagrams now contain "network hops" information on streams. #58078- Added support for the
IF NOT EXISTSprefix toCREATE TYPEstatements. #58173 - Added a
session_variablestable to theinformation_schema. Thesession_variablestable exposes the session variables. #57837 - Indexing into scalar JSON values using an integer index is now properly supported. #58359
- The
crdb_internal.cluster_idmethod now returns the ID of the underlying KV cluster in multi-tenant scenarios rather than the Nil UUID. TheClusterIDis needed for logging and metrics for SQL tenants. #58317 SHOW STATEMENTSis now an alias ofSHOW QUERIES. The new syntax is preferred by the SQL parser. #58072- Implemented the
gateway_regionbuilt-in, which returns the region of the connection's current node. #58423 BACKUPandRESTOREnow use the block-level checksums embedded in their data files instead of collecting / verifying more expensive file-level SHA512 checksums. #58487- Multi-tenant clusters will now send anonymous usage information to the central CockroachDB registration server. #58399
- Added support for
ALTER DATABASE ... ADD REGION. #58233 - Multiple
SHOW ZONE CONFIGURATIONstatements that previously usedFORcan now also useFROM(e.g.,SHOW ZONE CONFIGURATION FOR RANGE). This change standardizes the use ofFROMforSHOW ZONE CONFIGURATION. #58740 - Implemented
SHOW REGIONS, which shows a list of regions along with the databases associated with them. #57618 - Added
ALTER DATABASE ... PRIMARY REGION. #58725 - Columns implicitly added from hash-sharded indexes will no longer display on
pg_indexandpg_indexes. #58749 - Added a new
implicitcolumn tocrdb_internal.index_columns, which signifies whether the column is implicitly added onto the index throughPARTITION BYwith an implicit column or a hash-sharded index. #58749 - CockroachDB now omits implicit columns or hash-sharded index columns from automatically generated index names. #58898
- Implemented
PARTITION ALL BYsyntax forCREATE TABLE, which automatically partitions the table, and all indexes, with the same partitioning scheme. #58748 PARTITION ALL BYtables now display correctly onSHOW CREATE TABLE. #58928- Creating a table and changing its schema within a transaction no longer schedules a schema change job. #58888
- Implemented geo built-in function
ST_GeneratePoints. #58288 - Hash aggregation can now spill to disk when it exhausts its memory limit when executed via the vectorized engine. #57817
- Implemented
ALTER DATABASE ... SURVIVE REGION/ZONE FAILURE. #58937 CREATE INDEXwill now inheritPARTITION BYclauses fromPARTITION ALL BYtables. #58988- Implemented the geometry-based built-in functions
ST_LineSubstring({geometry,float8,float8}). #58125 - Implemented
REGIONAL BY ROWlogic onCREATE TABLE. This is gated behind the experimental session variableexperimental_enable_implicit_column_partitioning. #58987 - Added support for
ALTER VIEW/SEQUENCE OWNER TOcommands. #59049 - Casts to type
unknown[]are no longer accepted in CockroachDB. Any such casts will fail to parse and return the errorERROR: type "unknown[]" does not exist. This is consistent with PostgreSQL's behavior. #59136 - Implemented
REGIONAL BY ROW AS ..., which allows a column of typecrdb_internal_regionto be used as a column forREGIONAL BY ROWmulti-region properties. #59121 - Enabled altering of table locality for tables that are
REGIONAL BY TABLEtoREGIONAL BY TABLE(but in a different region). #59144 PARTITION ALL BYstatements will now apply for tables when usingALTER PRIMARY KEY. #59178- Implemented the geometry built-in function
ST_ShiftLongitude, which is useful for plotting data on a Pacific-centred map. #59234 - Implemented
ALTER TABLE ... SET LOCALITY GLOBALfor tables starting asREGIONAL BY ROW. #59256 - Improved the error message when people use set
search_pathincorrectly, or with a schema that legitimately has a comma in its name. #53974 - Creation of interleaved tables and indexes is now disabled by default. They can be re-enabled temporarily by running
SET CLUSTER SETTING sql.defaults.interleaved_tables.enabled=true. #59248 - CockroachDB now uses a structured logging format for the SQL audit, execution, and query logs. See the generated reference documentation for details. Of note, audit and execution logs now also include information about whether a query plan contains full index scans. Previously, this information was only included in the slow query log. #59110
CREATE INDEXonREGIONAL BY ROWtables will now correctly include the implicit partitioning and inherit the correct zone configurations. #59223- Made a minor improvement to
EXPLAINoutput for "render" node. #59313 EXPLAIN ANALYZEnow defaults to the newEXPLAIN ANALYZE (PLAN), which shows a text representation of the logical plan, annotated with execution statistics. #57337
Command-line changes
- The logging configuration can now be specified via the
--logparameter. See the documentation for details. The flags--log-dir,--log-file-max-size,--log-file-verbosity,--log-group-max-sizeare now deprecated. #57134 - A new command
cockroach debug check-log-configprints out the logging configuration that results from the provided combination of--store,--log, and other logging-related flags on the command line. #57134 - The events that were previously only stored in
system.eventlogare now also directed unconditionally to an external logging channel using a JSON format. Refer to the configuration to see how to customize how events are directed to external sinks. Note that the exact external output format (and thus how to detect/parse the events from e.g., log files) is not yet stabilized and remains subject to change. #57737 - Notable events that pertain to SQL schema, user, and privilege changes are now sent on the new
SQL_SCHEMA,USER_ADMIN, andPRIVILEGESlogging channels. These can now be redirected to different sinks from the other log entries.- The
SQL_SCHEMAchannel is used to report changes to the SQL logical schema, excluding privilege and ownership changes (which are reported on the separate channelPRIVILEGES) and zone config changes (which go toOPS). This includes:- Database, schema, table, sequence, view, and type creation.
- Adding, removing, and changing table columns.
- Changing sequence parameters.
- More generally, changes to the schema that affect the functional behavior of client apps using stored objects.
- The
USER_ADMINchannel is typically configured in "audit" mode, with event numbering and synchronous writes. It is used to report changes in users and roles, including:- Users added and dropped.
- Changes to authentication credentials, including passwords, validity, etc.
- Role grants and revocations.
- Role option grants and revocations.
- The
PRIVILEGESchannel is typically configured in "audit" mode, with event numbering and synchronous writes. It is used to report data authorization changes, including:- Privilege grants and revocations on database, objects, etc.
- Object ownership changes. #51987
- The
- Logging events that are relevant to cluster operators are now categorized under the new
OPSandHEALTHlogging channels. These can now be redirected separately from other logging events.- The
OPSchannel is used to report "point" operational events, initiated by user operators or automation:- Operator or system actions on server processes: process starts, stops, shutdowns, and crashes (if they can be logged). Each event includes any command-line parameters and the CockroachDB version.
- Actions that impact the topology of a cluster: node additions, removals, decommissions, etc.
- Cluster setting changes
- Zone configuration changes.
- The
HEALTHchannel is the channel used to report "background" operational events, initiated by CockroachDB for reporting on automatic processes:- Current resource usage, including critical resource usage.
- Node-node connection events, including connection errors and gossip details.
- Range and table leasing events.
- Up- and down-replication.
- Range unavailability. #57171
- The
- Server terminations that are triggered when a node encounters an internal fatal error are now reported on the
OPSlogging channel. The exact text of the error is not reported on theOPSchannel, however, as it may be complex (e.g., when there is a replica inconsistency); and theOPSchannel is typically monitored by tools that just detect irregularities. The text of the message refers instead to the channel where the additional details can be found. #57171 - The notable events
set_zone_configandremove_zone_configare now sent to theOPSlogging channel. #57171 - Added a flag to
cockroach debug decode-prototo suppress populating default values in fields. #58087 - When a SQL notable (structured) event is logged, the payload now attempts to include the session's
application_nameas fieldApplicationName. This is intended for use when setting up event routing and filtering in external tools. #58130 - It is now possible to set the
formatparameter of any log sink, including file sinks, tojson,json-compact,json-fluent, orjson-fluent-compactto write entries as structured JSON. Refer to the generated reference documentation for details. #58126 - The DB Console URL printed by
cockroach demonow automatically logs in the user when pasted into a web browser. #56740 - The URLs generated when
cockroach demostarts have been made shorter and easier to copy/paste by shortening the generated password. #58305 - When using the JSON output formats for log entries, the server identifiers are now reported as part of each payload once known (either cluster ID + node ID in single-tenant or KV servers, or tenant ID + SQL instance ID in multi-tenant SQL servers). #58128
- Fixed
cockroach demo --globalfrom crashing withdidn't get expected magic bytes header. #58466 - Previously, for certain log files, CockroachDB would both flush individual writes (i.e., propagate them from within the
cockroachprocess to the OS) and also synchronize writes (i.e., ask the OS to confirm the log data was written to disk). Per-write synchronization was found to be unnecessary and possibly detrimental to performance and operating cost, so it was removed. Now, the log data continues to be flushed, as before, and CockroachDB only requests synchronization periodically (every 30s). #58995 - The parameter
sync-writesfor file sink configurations has been removed. (This is not a backward-incompatible change because the configuration feature is new in v21.1.) #58995 - The parameter
buffered-writesfor file sink configurations has been added. It is set totrue(writes are buffered) by default and set tofalse(i.e., avoid buffering and flush every log entry) when theauditableflag is requested. #58995 - The default output format for
file-groupandstderrsinks has been changed tocrdb-v2. This new format is non-ambiguous and makes it possible to reliably parse log files. Refer to the format's documentation for details. Additionally, it prevents single log lines from exceeding a large size; this problem is inherent to thecrdb-v1format and can preventcockroach debug zipfrom retrievingv1log files. The new format has also been designed so that existing log file analyzers for thecrdb-v1format can read entries written the new format. However, this conversion may be imperfect. Refer to the new format's documentation for details. In case of incompatibility, users can force the previous format by usingformat: crdb-v1in their logging configuration. #59087
API endpoint changes
- The notable event
create_statisticsis only reported when the cluster settingsql.stats.post_events.enabledis enabled. This fact is now also reported in the event log reference documentation. #57877 - The
Timestampfield of structured notable events is now numeric, and encodes a number of nanoseconds since the Unix epoch. #58070 - The Health API now checks that the SQL server is ready to accept clients when a readiness check is requested. #59350
DB Console changes
- Minor style changes to represent new branding palette. #57130
- Changed the default per-page value on the Transactions page to 20; minor style updates. #57824
- Added a timeseries graph indicating statement denials due to feature flags on the SQL Dashboard of DB Console. #57533
- Updated labels on the Hardware Dashboard to be more accurate. #57224
- Updated the link back to Statements from Statement Details so that it will always link to the Statements list instead of invoking the "back" action on the browser. #57975
- On the Sessions page, every
agelabel has been replaced withdurationand everytxnlabel has been replaced withtransaction. The actual metrics remain unchanged. #58616 - Renamed the
CPUsmetric column tovCPUsin the Node List on the Cluster Overview page. #58495 - Added Open SQL Transactions to the SQL Dashboard and renamed
SQL QueriestoSQL Statements. Removed references to "Distributed SQL Queries" when metrics really are discussing all SQL queries. #57477
Bug fixes
- Fixed a bug in
RESTOREwhere some unusual range boundaries in interleaved tables caused an error. #58219 - Previously, CockroachDB would encounter an internal error when performing a
JSONB - Stringoperation via the vectorized execution engine. This has been fixed. The bug was introduced in v20.2.0. #57349 - Previously, in rare situations, an automated replication change could result in a loss of quorum. This was possible when a cluster had down nodes and a simultaneous change in replication factor. Note that a change in the replication factor can occur automatically if the cluster is comprised of fewer than five available nodes. Experimentally the likelihood of encountering this issue, even under contrived conditions, was small. #56735
- Fixed an internal error when using aggregates and window functions in an
ORDER BYfor aUNIONorVALUESclause. #57498 DROP TYPEand certain other statements that work over SQL scalar types now properly support type names containing special characters. #57354- Fixed a performance regression introduced in v20.2 to reading virtual tables which introspect the schema. #57542
- Removed
system.jobsfull table scan that is expensive in the face of many completed jobs. #57587 - In v20.2.0 we mistakenly permitted users with the
adminrole to drop tables in the system database. This commit revokes that privilege. #57568 - Previously, users could not perform a cluster restore from old backup chains (incrementals on top of fulls) when using the
BACKUP INTOsyntax. #57656 - Fixed a bug that could cause
IMPORTto incorrectly read files stored on Google Cloud if uploaded using its compression option (gsutil -Z). #57745 - Fixed a bug where
ST_MakeLineandST_Collectdid not respect ordering when used over a window clause. #57724 - Fixed a bug where schema change jobs to add foreign keys to existing tables, via
ALTER TABLE, could sometimes not be successfully reverted (either due to being canceled or having failed). #57598 - Fixed a bug where concurrent addition of a foreign key constraint and drop of a unique index could cause the foreign key constraint to be added with no unique constraint on the referenced columns. #57598
- Adding a primary key constraint to a table without a primary key no longer ignores the name specified for the primary key. #57146
- Previously, when displaying replica counts during the decommissioning process, we were overcounting the replicas displayed for r1. This is no longer the case. #57812
- Fixed a bug whereby tables in schemas other than
publicwould not be displayed when runningSHOW TABLES FROM <db>. #57749 - Fixed a bug where canceled queries reading from virtual tables could cause a crashing panic. #57828
- Fixed an assertion error caused by some DDL statements used in conjunction with common table expressions (
WITH). #57927 - Previously,
SHOW GRANTS ON DATABASEdid not include privileges that were granted on a database. Now it does. TheSHOW GRANTS ON DATABASEoutput no longer includes a column forschema_name, as these grants are not specific to any schema. #56866 - The
information_schema.schema_privilegestable now includes the correct schema-level privileges for non-user-defined schemas. Previously, all of these schemas were omitted from the table. #56866 - The
has_schema_privilegebuilt-in function now works on user-defined schemas when checking for theUSAGEprivilege. #56866 - The
ST_FrechetDistancebuilt-in function no longer causes aSIGFPEpanic for very small values ofdensifyFrac(e.g., 1e-20), and returns an error instead. #57966 - CockroachDB now removes a node's status entry when the node is decommissioned, to prevent it from appearing in API calls and UIs, and prevent it from affecting node constraints such as localities and attributes for various operations. #56529
- Fixed a bug which caused type information to be omitted when decoding descriptors using either
crdb_internal.pb_to_jsonorcockroach debug decode-proto. #58087 - Fixed a bug from v21.1.0-alpha.1 where the binary could crash if a running node lost its claim to a job while updating. #58161
- Fixed a bug where multiple invocations of
AddGeometryColumnaffecting the same table would result in only the last invocation applying. #56663 - Previously, CockroachDB could return non-deterministic output when querying the
information_schema.statisticsvirtual table (internally used bySHOW INDEXES)—namely, the implicit columns of the secondary indexes could be in arbitrary order. This is now fixed, and the columns will be in the same order as they are in the primary index. #58191 - Fixed a
column family 0 not foundcrash caused by explaining or gathering statement diagnostics on certain queries involving virtual tables. #58208 - Added a safeguard against crashes while running
SHOW STATISTICS USING JSON, which is used internally for statement diagnostics andEXPLAIN ANALYZE (DEBUG). #58221 - Fixed a bug where prior schema changes on a table that failed and could not be fully reverted could prevent the table from being dropped. #57836
- Previously, CockroachDB could crash when performing a
DELETEoperation after an alteration of the primary key when in some cases. This is now fixed. The bug was introduced in v20.1. #58153 - Fixed a bug that could cause incremental backups to a backup in a collection (i.e.,
BACKUP INTO ... IN ...) on some cloud storage providers to ignore existing incremental backups previously appended to that destination and instead backup incrementally from the base backup in that destination. #58292 - Fixed an internal panic when using the
SHOW STATISTICS USING JSONstatement on a table containingENUMtypes. #58251 - A memory leak in the optimizer has been fixed. The leak could have caused unbounded growth of memory usage for a session when planning queries on tables with partial indexes. #58306
- Fixed a bug where primary key changes on tables being watched by changefeeds would be silently ignored. #58140
- The
pg_catalogmetadata tables were using theCHARdata type for single-byte character columns. Now they use thechardata type, to match PostgreSQL. This resolves errors that would occur when using some drivers (liketokio-postgresfor Rust) to accesspg_catalogtables in the binary query format. #58084 - Prepared statements that include enums and use the binary format will no longer result in an error. #58043
- Fixed an internal error that could occur when executing prepared statements with placeholders that delete data from columns referenced by a foreign key with
ON DELETE CASCADE. #58431 - Fixed a bug which caused errors when querying a table with a disjunctive filter (an
ORexpression) that is the same or similar to the predicate of one of the table's partial indexes. #58434 - Previously, in event log entries for
ALTER TYPEandDROP TYPEstatements, theTypeNamefield did not contain fully qualified names. #58257 - A
CREATE TABLEstatement with indexes with duplicate names will no longer result in an assertion failure. This bug was present since v20.2. #58433 - Previously, event logs were not capturing the qualified table names for
COMMENT ON INDEXandCOMMENT ON COLUMNcommands. This PR changes the event logs to use the qualified table name. Tests were also added for these changes. #58472 - The
has_${OBJECT}_privilegebuilt-in methods such ashas_schema_privilegenow additionally check whether the roles of which a user is a direct or indirect member also have privileges on the object. Previously only one user was checked, which was incorrect. This bug has been present since v2.0 but became more prominent in v20.2 when role-based access control was made available in the core version of CockroachDB. #58254 - CockroachDB previously would return an internal error when attempting to execute a hash join on a JSON column via the vectorized engine. Now a more user-friendly error is returned. #57994
- Fixed a panic in protobuf decoding. #58716
- The user authentication flow no longer performs extraneous name lookups. This performance regression was present since v20.2. #58671
- CockroachDB could previously return an internal error when evaluating a binary expression between a Decimal and an Interval that required a cast to a Float when the value is out of range. A more user-friendly error is now returned instead. #58743
- Qualified table name for
alter_table_ownerevent log. #58504 - Fixed a bug that caused errors when accessing a tuple column (
tuple.columnsyntax) of a tuple that could be statically determined to be null. #58747 - The
indoptioncolumn inpg_catalog.indexis now populated correctly. #58947 - Previously, CockroachDB could encounter an internal error when executing queries with tuples containing null values and enums in a distributed setting. This is now fixed. #58894
- Fixed a nil pointer panic edge case in query setup code. #59002
- Non-ASCII characters in
NAMEresults incockroach sql/demo(e.g., in the resultsSHOW TABLES, SHOW CONSTRAINTS) are now displayed without being escaped to octal codes. #56630 - Garbage collection (GC) jobs now populate the
running_statuscolumn forSHOW JOBS. This bug has been present since v20.1. #58612 - Previously, CockroachDB could encounter an internal error when executing queries with
BYTESorSTRINGtypes via the vectorized engine in rare circumstances. This is now fixed. #59028 - Previously, the
substringfunction on byte arrays would treat its input as unicode code points, which would cause the wrong bytes to be returned. Now it only operates on the raw bytes. #58265 - Previously, the
substring(byte[])functions were not able to interpret bytes that had the\character since it was being treated as the beginning of an escape sequence. This is now fixed. #58265 - Fixed a bug in which some non-conflicting rows provided as input to an
INSERT ... ON CONFLICT DO NOTHINGstatement could be discarded, and not inserted. This could happen in cases where the table had one or more unique indexes in addition to the primary index, and some of the rows in the input conflicted with existing values in one or more unique index. This scenario could cause the rows that did not conflict to be erroneously discarded. This has now been fixed. #59147 - Fixed an internal error that could occur when
ARRAY[NULL]was used in a query due to incorrect typing.ARRAY[NULL]is now typed asstring[]if the type cannot be otherwise inferred from the context. This is the same logic that PostgreSQL uses, thus improving compatibility in addition to fixing the internal error. #59136 - Fix a slow / hanging query that can be caused by using large
max_decimal_digitsonST_AsGeoJSON. #59165 - Queries that attempt to retrieve just the key columns of a single system table row will no longer return erroneous values. #58659
- Fixed a bug in URL handling of HTTP external storage paths on Windows. #59216
- Previously, CockroachDB could crash when executing
ALTER INDEX ... SPLIT/UNSPLIT ATwhen more values were provided than are explicitly specified in the index. This has been fixed. #59213 - Fixed a bug where multi-tenancy SQL pods would not successfully initialize the GEOS library. #59259
- Placeholder values are now included alongside statements in structured events. #59110
- Added qualification prefix for user-defined schema names in event logs. #58617
- Added qualification prefix for dropped views in event logs. #59058
- Parsing errors are no longer thrown when importing a
pgdumpfile with array data. #58244 - Fixed a crash when creating backup schedules writing to GCS buckets. #57617
- CockroachDB now correctly exports
schedules_BACKUP_*metrics as well as backup RPO metrics. #57488
Performance improvements
- Previously, CockroachDB when performing an unordered
DISTINCToperation via the vectorized execution engine would buffer up all tuples from the input, which is a suboptimal behavior when the query has aLIMITclause. This has now been fixed. This behavior was introduced in v20.1. Note that the row-by-row engine doesn't have this issue. #57579 - The query optimizer can use filters that constrain columns to multiple constant values to generate lookup joins. For example, a join filter
x.a = y.a AND y.b IN (1, 2)can be used to generate a lookup join on tableyassuming that it has an index on(a, b)or(b, a). #57690 - The query optimizer now explores plans with lookup joins on partitioned indexes, resulting in more efficient query plans in some cases. #57690
- Potentially improved performance for
UPDATEstatements where the table has computed columns that do not depend on updated columns. #58188 - CockroachDB now allows the storage engine to compact
sstablesbased on reads, on read-heavy workloads. #58247 - Partial indexes with
IS NOT NULLpredicates can be used in cases whereJOINfilters implicitly imply the predicate. This results in more efficient query plans forJOINs and foreign checks. #58204 - Queries that use a geospatial GIN index can now take advantage of vectorized execution for some parts of the query plan, resulting in improved performance. #58241
- Previously, indexed columns of partial indexes were always fetched for
UPDATEs andUPSERTs. Now they are only fetched if they are required for maintaining the state of the index. If anUPDATEorUPSERTmutates columns that are neither indexed by a partial index nor referenced in a partial index predicate, they will no longer be fetched (assuming that they are not needed to maintain the state of other indexes, including the primary index). #58358 UPDATEoperations on tables with partial indexes no longer evaluate partial index predicate expressions when it is guaranteed that the operation will not alter the state of the partial index. In some cases, this can eliminate fetching the existing value of columns that are referenced in partial index predicates. #58358- The
sum_intaggregate function is now evaluated more efficiently in a distributed setting. #58345 INSERT ... ON CONFLICT ... DO NOTHINGstatements now use anti-joins for detecting conflicts. This simplifies the query plan for these statements, which may result in more efficient execution. #58679- Improved the accuracy of histogram calculations for the following types:
string/uuid/inetfamily. Additionally, support fortime/timetzhistogram calculations was also added. This improves optimizer's estimates and results in better query plans in certain instances. #55797 - The optimizer now uses collected histogram statistics to better estimate the cost of JSON and ARRAY GIN index scans, which may lead to more efficient query plans. #59326
Build changes
- CockroachDB now builds on Ubuntu 20.10 and other distros using
gcc-10. #58895
Doc updates
- The types of logging sinks available through configuration are now automatically documented. #59083
- The various output formats available for logging configurations are now documented. See the generated reference documentation for details. #58075
- The cluster event logging system has been standardized. Reference documentation is now available (auto-generated from source code); changes to non-reserved payloads will now be announced at least one release version in advance. The event types are organized into broad categories: SQL Logical Schema Changes, SQL Privilege Changes, SQL User Management, CLuster-level events and SQL Miscellaneous operations. #57737
- A report of the possible logging severities and channels is now automatically generated. #57134
Contributors
This release includes 615 merged PRs by 85 authors. We would like to thank the following contributors from the CockroachDB community:
- Alan Acosta (first-time contributor)
- ArjunM98
- Azdim Zul Fahmi
- Cheng Jing (first-time contributor)
- Cyrus Javan
- Erik Grinaker
- Javier Fernandez-Ivern (first-time contributor)
- Kumar Akshay (first-time contributor)
- Maciej Rzasa (first-time contributor)
- Marcin Knychała
- Max Neverov
- Miguel Novelo (first-time contributor)
- Omar Bahareth (first-time contributor)
- Petr Jediný
- Ruixin Bao
- Saif Al-Harthi (first-time contributor)
- Vaibhav
- Yanxin (first-time contributor)
- b41sh (first-time contributor)
- mosquito2333 (first-time contributor)
- neeral
v21.1.0-alpha.1
Release Date: December 8, 2020
Backward-incompatible changes
- RocksDB can no longer be used as the storage engine. Passing in
--storage-engine=rocksdbnow returns an error. #55509 - Rows containing empty arrays in
ARRAYcolumns are now contained in GIN indexes. This change is backward-incompatible because prior versions of CockroachDB will not be able to recognize and decode keys for empty arrays. Note that rows containingNULLvalues in an indexed column will still not be included in GIN indexes. #55970 - Concatenation between a non-null argument and a null argument is now typed as string concatenation, whereas it was previously typed as array concatenation. This means that the result of
NULL || 1will now beNULLinstead of{1}. To preserve the old behavior, the null argument can be casted to an explicit type. #55611
General changes
- Added increased logging and metrics around slow disk operations. #54215
- CockroachDB now detects stalled disk operations better and crashes the process if a disk operation is taking longer than a minute. Added cluster settings to allow for tuning of this behavior. #55186
- Added some metrics surrounding schema changes. #54855
- Upgraded CockroachDB's version of Go to v1.15.4. #56363
- The timezone data is now built in to the CockroachDB binary, which is the fallback source of time if
tzdatais not located by the default Go standard library. #56634 - Renamed instances of "Admin UI" to "DB Console" in the documentation of OIDC cluster settings. #56869
- Included
tarin docker images. This allows users to usekubectl cpon 20.2.x containers. #57241
Enterprise edition changes
- It is no longer allowed to widen an incremental-backup chain with the inclusion of new complete empty DBs. #54329
- Added cluster settings to enable/ disable the
BACKUPandRESTOREcommands. Attempts to use these features while they are disabled returns an error indicating that the database administrator has disabled the feature. Example usage:SET CLUSTER SETTING feature.backup.enabled = FALSE; SET CLUSTER SETTING feature.backup.enabled = TRUE; SET CLUSTER SETTING feature.restore.enabled = FALSE; SET CLUSTER SETTING feature.restore.enabled = TRUE;. #56533 - Added cluster settings to enable/ disable the
IMPORT,EXPORT, and changefeed commands. Attempts to use these features while they are disabled returns an error indicating that the database administrator has disabled the feature. Example usage:SET CLUSTER SETTING feature.import.enabled = FALSE; SET CLUSTER SETTING feature.import.enabled = TRUE; SET CLUSTER SETTING feature.export.enabled = FALSE; SET CLUSTER SETTING feature.export.enabled = TRUE; SET CLUSTER SETTING feature.changefeed.enabled = FALSE; SET CLUSTER SETTING feature.changefeed.enabled = TRUE;. #56872
SQL language changes
- Interleaved joins have been removed; merge joins are now planned in all cases when interleaved joins would have been planned previously. #54163
- It is now possible to create partial GIN indexes. The optimizer will choose to scan partial GIN indexes when the partial index predicate is implied and scanning the GIN index has the lowest estimated cost. #54376
EXPLAIN ANALYZEdiagrams now contain "bytes sent" information on streams. #54518- Implemented the geometry built-in functions
ST_Rotate({geometry, float8, geometry}). #54610 - Implemented the geometry built-in function
ST_ClosestPoint(). #54843 - Implement the string built-in function
unaccent(). #54628 - When enterprise features are not enabled, the
follower_read_timestamp()function now returns(statement_time - 4.8s)instead of an error. #54951 - Added a new virtual table
crdb_internal.invalid_descriptors, which runs validations on descriptors in the database context and reports any errors. #54017 - Implemented the built-in operator
add jsonb_exists_any(jsonb, text[]). #55172 - Added the ability to optionally specify the
PRIVILEGESkeyword when issuing theGRANT ALLorREVOKE ALLstatements, for Postgres compatibility. Previously, a statement like the following would fail with a syntax error:GRANT ALL PRIVILEGES ON DATABASE a TO user1;. #55304 - Implemented the built-in function
pg_column_size(), which counts the amount of bytes stored by column. #55312 - Implemented the geometry built-in functions
ST_Rotate({geometry, float8, float8, float8}). #55428 - Implemented the built-in function
ST_MemSize(), which returns the memory space a geometry takes. #55416 SHOW ENUMSnow returns an array aggregation of enum values instead of having them separated by the|character. #55386- Implemented the geometry built-in function
ST_PointInsideCircle(). #55464 - Implement the geometry built-in function
ST_LineFromEncodedPolyline(). #55429 - Implement the geometry built-in function
ST_AsEncodedPolyline(). #55515 - Implement the geometry built-in function
ST_LineLocatePoint(), which computes the fraction of the line segment that represents the location of the given point to the closest point on the original line. #55470 - Implemented the
REASSIGN OWNED BY ... TO ...statement, which changes ownership of all database objects in the current database, owned by any roles in the first argument, to the new role in the second argument. #54594 - Implemented the geometry built-in function
ST_MinimumBoundingRadius(), which returns a record containing the center point and radius of the smallest circle that can fully contain a geometry. #55532 - The vectorized engine now supports the JSONFetchValPath (
#>) operator. #55570 - Added the ability to cast a string containing all integers into a given regtype, e.g.,
'1234'::regproc. #55607 - Potentially hazardous
DROP COLUMNoperations whensql_safe_updatesis enabled now return a note and link to https://github.com/cockroachdb/cockroach/issues/46541. #55248 - Changed the
SPLIT AToutput to be consistent with the output fromSHOW RANGES. #55543 - Implemented the geometry built-in function
ST_MinimumBoundingCircle(), which returns polygon shape that approximates minimum bounding circle to contain geometry. #55567 - Added the constraint name to constraint errors, for increased wire-level Postgres compatibility. #55660
- Added support for using the syntax
... UNIQUE WITHOUT INDEX ...inCREATE TABLEandALTER TABLEstatements, both when defining columns and unique constraints. Although this syntax can now be parsed successfully, using this syntax currently returns an error:unique constraints without an index are not yet supported. #55700 - Add the built-in functions
sha224()andsha384(). #55720 - Implemented
SHOW REGIONS, which returns all of regions available in a cluster. #55831 - Implemented the geography built-in function
ST_UnaryUnion()#55894 - Implemented
ALTER TABLE ... SET LOCALITY/REGIONAL AFFINITYstatements, which configure multi-region properties of given tables. These are subject to change. #55827 - All expressions in
EXPLAINoutput that operate on indexes now show the table name the index is declared on, rather than just an alias. If the query aliases the table, the alias is also shown. For example, a scan on tablefoothat is aliased asfwas previously displayed asscan f. It is now displayed asscan foo [as=f]. #55641 - Changed the underlying type for the version cluster setting. Previously, it was of an internal type representing "state machine", but now it's simply "version". This has no operational implications, but the
Typecolumn incockroach gen settings-listnow shows "version" instead of "custom validation". #55994,#56546 - Removed the
201autovalue for thevectorizesession variable and the corresponding cluster setting. #55907 - Expanded the
CREATE SCHEMA,DROP SCHEMA,ALTER SCHEMA,GRANT ... ON SCHEMA,REVOKE ... ON SCHEMA, andSHOW GRANTS ON SCHEMAstatements to allow schema names prefixed with database names. #55647 - Added support for dollar-quoted strings with digit. #55958
- Added a new single-column output format for
EXPLAINandEXPLAIN (VERBOSE). #55866 - Creating multi-column GIN indexes is now allowed by setting the
experimental_enable_mutlti_column_inverted_indexessession setting totrue. At this time, these indexes are not fully supported and their behavior is undefined. Using this feature will likely result in errors. Do not enable this setting in a production database. #55993 - Constraints that have not been validated are now marked "NOT VALID" in the output of
SHOW CREATEandSHOW CONSTRAINTS. #53485 - The
NOT VALIDoption can now be provided forCHECKandFOREIGN KEYconstraints listed as table constraints inCREATE TABLEstatements. This option has no affect on the constraint created. It will not skip validation. #53485 - Added a pgcode (
42704,undefined_object) to the error returned when attempting to drop an index by a table and index name that doesn't exist. #55417 - Added the
WITH row_limit="{$num}"option for importing CSVs to allow users to do a quick test run on an import of$numrows. Example:IMPORT TABLE test ... CSV DATA ... WITH row_limit="3";#56080 - Added the
WITH row_limit="{$num}"option for importingDELIMITED/AVROdata to allow users to do a quick test run on an import of $num rows. Example:IMPORT TABLE test ... DELIMITED/AVRO DATA ... WITH row_limit="3";#56135 - Added
WITH row_limit="{$num}"option for importing bundle formats to allow users to do a quick test run on an import of $num rows. Example:IMPORT ... WITH row_limit="3";. #56587 EXPLAIN ANALYZEdiagrams now contain "network latency" information on streams. #55705- Implemented the
covar_pop()andcovar_samp()aggregation functions. #55707 - Prevented column type modification of columns that are depended on by views. #56213
- Implemented the geometry built-in functions
ST_TransScale({geometry,float8,float8,float8,float8})#56198 - Implemented the geometry built-in function
ST_Node(). #56183 - The concatenation operator
||can now be used between strings and any other non-array types. #55611 - CockroachDB now returns a float instead of a decimal when at least one argument of an aggregate function is decimal. #56296
- Implemented the
regr_intercept(),regr_r2(), andregr_slope()aggregation functions. #56296 EXPLAIN ANALYZEdiagrams now show "deserialization time" on streams instead of "io time". #56144- Added a pgcode (
42804,DatatypeMismatch) when adding a default value of the wrong type to a column. #56455 - Attempting to rename an undefined index now returns a
pgcode.UndefinedObject(42704) error instead of an uncategorized error. #56455 - Implemented the
regr_sxx(),regr_sxy(), andregr_syy()aggregation functions. #56585 SHOW REGIONShas changed the column name for availability zones to "zones" from "availability_zones". #56344- Introduced a
pg_collationof "default". Strings now return the "default" collation OID in thepg_attributetable (this was previouslyen_US). The "default" collation is also visible on thepg_collationvirtual table. #56598 - A table can now successfully be dropped in a transaction following other schema changes to the table in the same transaction. #56589
- Added a new variant of explain:
EXPLAIN ANALYZE (PLAN). #56524 SHOW REGIONSfunctionality is now deferred toSHOW REGIONS FROM CLUSTER. #56627- It is now possible to hint to the optimizer that it should plan an inverted join by using the syntax
... INNER INVERTED JOIN ...or... LEFT INVERTED JOIN .... If the hint is provided and it is possible to plan an inverted join, the optimizer will now plan an inverted join, even if it estimates that a different plan would have a lower cost. If the hint is provided but it is not possible to plan an inverted join because there is no GIN index on the right side table or the join condition is not a valid inverted join condition, the database will return an error. #55679 - Added the empty
pg_catalog.pg_opclasstable to improve compatibility with Postgres. #56653 SURVIVE AVAILABILITY ZONE FAILUREis nowSURVIVE ZONE FAILURE. #56837- Added admin-only,
crdb_internalfunctions to enable descriptor repair in dire circumstances. #55699 - Added support for an optional
=character forSURVIVE, e.g.,ALTER DATABASE d SURVIVE = ZONE FAILURE. #56881 - Introduced stubs for
ALTER DATABASE ... PRIMARY REGIONandCREATE TABLE ... PRIMARY REGION. #56883 - Dropping the primary index using
DROP INDEXnow returns aFeatureNotSupportederror along with hints showing supported ways to drop primary indexes. #56858 - Renaming an index to a name that is already being used for another index will now return a
pgcode.DuplicateRelation(42P07) error instead of an uncategorized error. #56681 - The
relpersistencecolumn inpg_catalog.pg_classnow correctly displaystas the persistence status for temporary tables. #56827 - Added a deprecation notice to statements containing the
INTERLEAVE IN PARENTclause. #56874 SHOW DATABASESandcrdb_internal.databasesnow display all regions as well as survival goals for a given database. #56880- Adds a feature flag via cluster settings for the
CREATE STATISTICSandANALYZEfeature. If a user attempts to use the command while disabled, an error indicating that the database administrator had disabled the feature is surfaced. Example usage:SET CLUSTER SETTING feature.stats.enabled = FALSE; SET CLUSTER SETITNG feature.stats.enabled = TRUE;. #57076 CREATE DATABASE ... PRIMARY REGIONis now stored on the database descriptor. #57038SHOW DATABASESandcrdb_internal.databasesnow display thePRIMARY REGIONset on the database descriptor as theprimary_regioncolumn. #57038- Added a feature flag via cluster settings for all schema change-related features. If a user attempts to use these features while they are disabled, an error indicating that the database administrator has disabled the feature is surfaced. Example usage:
SET CLUSTER SETTING feature.schema_change.enabled = FALSE; SET CLUSTER SETTING feature.schema_change.enabled = TRUE;. #57040 - Changed
pg_constraintcolumn types forconfkeyandconkeytosmallint[]to improve compatibility with Postgres. #56975 - The
ALTER TABLE...SPLIT/UNSPLITandALTER INDEX...SPLIT/UNSPLITcommands are now gated by a schema change feature flag. If a user attempts to use these features while they are disabled, an error indicating that the system administrator has disabled the feature is surfaced. Example usage:SET CLUSTER SETTING feature.schema_change.enabled = FALSE SET CLUSTER SETTING feature.schema_change.enabled = TRUE;. #57142 - When creating a database with the regions clause specified, CockroachDB now creates a
regionsenum type automatically. #56628 - Implemented
SHOW REGION FROM DATABASEandSHOW REGION FROM DATABASE db, which shows all regions for the given database, as well as whether that region is the primary region. #57106 CREATE TABLE AS SELECT ... FROM ... AS OF SYSTEM TIME xis now supported. #55916- Implemented the function
regr_count(). #56822 - Added the
character_setstable to theinformation_schema. #56953 SHOW ENUMSis now extended to take an optionalFROMclause. The user can specify either the schema name or both the database name and schema name separated by.. If a hierarchy is specified, the statement returns enums falling in that hierarchy rather than all of the enums in the current database. #57197- The multi-region enum, created implicitly for all multi-region databases, can be introspected using the
pg_catalog.pg_enumtable. It is also displayed inSHOW ENUMS. #57197 - Implemented the geography built-in function
ST_Subdivide(). #56898 - A
pgcode.UndefinedColumnerror is now returned when adding a unique constraint to one or more undefined columns. #57316 - The database name is now displayed in
SHOW REGIONS FROM DATABASE. #57278 - Added
SHOW SURVIVAL GOAL FROM DATABASE [database], which shows the survival goal for a multi-region database. #57278 - Added the
uuid_generate_v4()built-in function. It works exactly likegen_random_uuid()but was added for compatibility with Postgres versions older than PG13. #57212
Command-line changes
- A
debug.zipfile now includes a script,hot-ranges.sh, which will summarize the hottest ranges in the cluster. #53547 cockroach sqlandcockroach demonow support the command-line parameter--file(shorthand-f) to read commands from a named file. The behavior is the same as if the file was redirected on the standard input; in particular, the processing stops at the first error encountered (which is different from interactive usage with a prompt). Note that it is not yet possible to combine-fwith-e. #54741- The large banner message "Replication has been disabled for this cluster ..." that was unconditionally emitted on the standard error stream for
cockroach start-single-nodehas now become a simple log message at severityINFO. #54749 cockroach demonow pre-creates ademouser account with a random password to discourage the user ofroot. Thedemoaccount is currently granted theadminrole. #54749- The CLI help text for
--max-disk-temp-storagenow properly reports the default value. #54853 - The help text displayed by
\?incockroach sqlandcockroach demonow groups the recognized client-side commands into sections for easier reading. #54796 - The client-side command
\showfor the SQL shell is deprecated in favor of the new command\p. This prints the contents of the query buffer entered so far. #54796 - The new client-side command
\rfor the SQL shell erases the contents of the query buffer entered so far. This provides a convenient way to reset the input, for example, when the user gets themselves confused with string delimiters. #54796 - The SQL shell (
cockroach sql,cockroach demo) now supports the client-side command\echo, likepsql. This can be used, for example, to generate informational output when executing SQL scripts non-interactively. #54796 - The SQL shell (
cockroach sql,cockroach demo) now support the\iand\irclient-side command which reads SQL file and evaluates its content in-place.\irdiffers from\iin that the file name is resolved relative to the location of the script containing the\ircommand. This makes\irlikely more desirable in the general case. Instances of\qinside a file included via\i/\irstop evaluation of the file and resume evaluation of the file that included it. This feature is compatible with the identically namedpsqlcommands. It is meant to help compose complex initialization scripts from a library of standard components. For example, one could be defining each table and its initial contents in separate SQL files, and then use different super-files to include different tables depending on the desired final schema. #54796 - Removed the
debug sstablescommand, superseded by thedebug pebble lsmcommand. #54890 - Added the
cockroach debug pebble db checkpointdebug command to easily create a checkpoint without using rocksdb. #55751 - Updated the
--storage-enginehelp text to reflect RocksDB deletion. #55509 - Added support for
\connect DATABASEand\c DATABASE. #55934 - Added an import CLI command that allows users to upload and import local dump files into a running cockroach cluster.
PGDUMPandMYSQLDUMPformats are currently supported. #54896 cockroach demonow allows for nodes to be added using the\democlient-side command. This works in both single node and multi-node configurations, for example, when started with--nodes intor--geo-partitioned-replicas. #56344Some specific situations now have dedicated exit status codes. The following codes are defined:
Code Description 0 Process terminated without error. 1 An unspecified error was encountered. Explanation should be present in the stderr or logging output. 2 Go runtime error, or uncaught panic. Likely a bug in CockroachDB. Explanation may be present in logging output. 3 Server process interrupted gracefully with Ctrl+C / SIGINT. 4 Command-line flag error. 5 A logging operation to the process' stderr stream failed (e.g., stderr has been closed). Some details may be present in the file output, if enabled. 6 A logging operation to file has failed (e.g., log disk full, no inodes, permission issue, etc.). Some details may be present in the stderr stream. 7 Server detected an internal error and triggered an emergency shutdown. 8 Logging failed while processing an emergency shutdown. cockroach demonow tries to use the same TCP port numbers for the SQL and HTTP servers on every invocation. This is meant to simplify documentation. These defaults can be overridden with the new (demo-specific) command line flags--sql-portand/or--http-port. #56737The SQL shell now accepts
yes/noas boolean options for slash commands, followingpsqlbehavior. #56829A
\x [on|off]command has been added to toggle therecordsdisplay format, followingpsqlbehavior. #56829CockroachDB now prints a warning if the
--localityflag does not contain a "region" tier. #57179
API endpoint changes
- Added a new prometheus metric called
seconds_until_license_expirythat reports the number of seconds until the enterprise license on the cluster expires, a negative number if the expiration is in the past, or0if there is no license. #55565
DB Console changes
- Changed the view for tables without data on main pages. #54943
- Updated the design of the custom date range selector on the Cluster > Maps view and Metrics pages #54851
- The DB Console now shows messages provided by server instead of custom generic messages defined on the client side, for example, messages about permission restrictions to show pages for non-admin roles. #50869
- Added a new metric called
raft.scheduler.latency, which monitors the latency for operations to be picked up and processed by the Raft scheduler. #56943 - Redesigned inline error alerts when a user has insufficient rights to see some resources. #50869
- Implemented a permission denied error for non-admin users on the Node Map and Events views. #50869
- Tables within user-defined schemas are now included in the Data Distribution page. #56388
- Creating, dropping, and altering roles or users now causes events to be logged and displayed. #55945
- If statement diagnostics are enabled for a statement, the bytes sent over the network are now shown. #55969
ALTER DATABASE OWNERandCONVERT TO SCHEMAnow cause events to be logged and displayed. #55891- Changing schema objects now causes events to be logged and displayed. #55785
- Changing privileges (i.e., with
GRANTorREVOKE) now causes events to be logged and displayed. #55612 - Renaming databases or tables now causes events to be logged and displayed. #55269
- Added descriptions for failed job on the Job Details page. #54268
Bug fixes
- Fixed the
rpathandsonames oflibgeos.soandlibgeos_c.sosuch that adlopentolibgeos.sois not needed. #55129 - Made lease transfers during rebalancing adhere to the rate limit utilized in other lease transfer cases which eliminates unexpected lease oscillations when adding a new node. #54322
- CockroachDB now handles PostgreSQL "cancel" messages on TLS connections in the same way as when they are sent without TLS: the connection is closed, but no action takes place. No error is logged. As a reminder, PostgreSQL "cancel" messages are still unsupported in CockroachDB and client should still use
CANCEL QUERYinstead. #54618 - Cleared table statistics from job description in failed and canceled backup jobs. #54446
- Fixed an error message that referred to
experimental_enable_hash_sharded_indexesas a cluster setting when it is in fact a session variable. #54960 - Fixed a nil pointer error that could occur at planning time for some spatial queries when a GIN index existed on a geometry or geography column. #55076
- Fixed
SHOW ENUMScolumn names to havevaluesinstead ofstring_aggfor column names, andownerfor the owner itself. #55139 - Fixed
SHOW TYPESto show theownercolumn instead of thevaluecolumn. #55139 - Fixed a bug where empty enums did not show up for
SHOW ENUMSorSHOW TYPES. #55143 - Fixed a bug where, on failure of
CREATE TABLE ASorCREATE MATERIALIZED VIEW, tables would be left in an invalid non-public state until GC instead of being marked as dropped, possibly causing spurious validation failures. The bug was introduced in earlier 20.2 pre-releases. #55272 - Fixed a rare scenario in which a node would refuse to start after updating the binary. The log message would indicate:
store [...], last used with cockroach version [...], is too old for running version [...] (which requires data from [...] or later). #55240 - Changefeeds defined on multiple tables will now only backfill affected tables after a schema change. #55135
- Fixed a bug where adding child tables or types to a schema being restored would cause those new child objects to become corrupted with no parent schema if the restore job had to be rolled back. #55157
- Fixed a bug where the seconds component of a zone offset of a
TIMESTAMPTZvalue was not displayed. #55071 - Fixed a bug where casts to regclass were not escaped, e.g., when the type or table name had
"characters. #55607 - Fixed a bug where casts from string to regproc, regtype or regprocedure would not work if they contained
"characters at the beginning or at the end. #55607 - Fixed a bug which could cause
IMPORT,BACKUP, orRESTOREto experience an error when they occur concurrently to when the cluster sets its version to upgraded. #55524 - Fixed a rare crash during tracing when reading un-decodable data. #55783
- Prevented a crash, introduced in the 20.2 series, caused by range scans over virtual tables with virtual indexes. #56459
- In some cases CockroachDB, would attempt to transfer ranges to nodes in the process of being decommissioned or being shut down; this could cause disruption the moment the node did actually terminate. This bug has been fixed. It had been introduced some time before v2.0. #55808
- Fixed a bug causing queries sent to a freshly-restarted node to sometimes hang for a long time while the node catches up with replication. #55148
- Fixed typing of collated strings so that collation names are case-insensitive and hyphens/underscores are interchangeable. #56352
- Fixed internal errors related to very large
LIMITand/orOFFSETvalues. #56672 - Improved the accuracy of reported CPU usage when running in containers. #56461
- Fixed a bug which can lead to canceled schema change jobs ending in the failed rather than canceled state. #55513
- Prevented an opportunity for livelock in the jobs subsystem due to frequent updates to already finished jobs. #56855
- The
LogFilereserved API, which was used bycockroach debug zip, could corrupt log entries. This has been fixed. #56901 DELETEstatements no longer have a chance of returning an incorrect number of deleted rows in transactions that will eventually need to restart due to contention. #56458- Fixed a race condition in the
tpccworkload with the--scatterflag where tables could be scattered multiple times or not at all. #56942 - Fixed a bug where reg* types were not parsed properly over pgwire,
COPYor prepared statements. #56298 - Previously, casts and parsing of strings to types could allow an out-of-bounds value to be successfully used (e.g.,
SELECT -232321321312::int2) but fail with an out-of-bounds message when it is inserted into the table. This is now checked when the value is parsed or being casted to. #55095 cockroach debug merge-logs --redact=true --redactable-output=falsenow properly removes redaction markers. #57121- Fixed a bug related to validation of un-upgraded pre-19.2 inbound foreign keys. #57132
- Creating a materialized view that references a column with a NULL value no longer results in an error. #57139
ST_GeomFromGeoJSONnow sets the SRID to 4326, matching PostGIS 3.0 / RFC7946 behavior. #57152- Fixed a bug that caused an "ambiguous column reference" error during foreign key cascading updates. This error was incorrectly produced when the child table's reference column name was equal to the concatenation of the parent's reference column name and "_new", and when the child table had a
CHECKconstraint, computed column, or partial index predicate expression that referenced the column. This bug was introduce in version 20.2. #57153 - Fixed a bug that caused errors or corrupted partial indexes of child tables in foreign key relationships with cascading
UPDATEs andDELETEs. The corrupt partial indexes could result in incorrect query results. Any partial indexes on child tables of foreign key relationships withON DELETE CASCADEorON UPDATE CASCADEactions may be corrupt and should be dropped and re-created. This bug was introduce in version 20.2. #57100 - Second timezone offsets for
TIMETZnow correctly display over the Postgres wire protocol; these were previously omitted. #57265 SELECT FOR UPDATEnow requires bothSELECTandUPDATEprivileges, instead of justUPDATEprivileges. #57309- Fixed a bug where users of an OSS build of CockroachDB would see "Page Not Found" when loading the DB Console. #56591
Performance improvements
- The optimizer can now deduce that certain variable arguments to functions must be non-null. This improves cardinality estimation for those variables and unlocks other types of optimizations. As a result, the optimizer may choose better query plans when a function is used as a filter predicate. #54558
- Improved the selectivity estimate for array contains predicates (e.g.,
arr @> ARRAY[1]) in the optimizer. This improves the optimizer's cardinality estimation for queries containing these predicates, and may result in better query plans in some cases. #54768 - Updated the cost model in the optimizer to make index joins more expensive and better reflect the reality of their cost. As a result, the optimizer will choose index joins less frequently, generally resulting in more efficient query plans. #54768
- The optimizer simplifies join expressions to only scan a single table when the join filter is a contradiction. A limitation, now removed, was preventing this simplification from occurring in some cases, leading to more efficient query plans in some cases. #54813
- Improved the efficiency of plans for the execution of left outer spatial joins. #55216
- The optimizer now considers partial indexes when exploring zigzag joins. This may lead to more efficient query plans for queries that (1) operate on tables with partial indexes and (2) have a filter that holds two columns, indexed by two indexes, constant. #55401
- The optimizer now attempts to split a query with a disjunctive filter (OR expression) into a UNION of index scans, where one or both of the scans is an unconstrained partial index scan. As a result, more efficient query plans may be generated for queries with disjunctive filters that operate on tables with partial indexes. #55915
- CSV imports should now be slightly faster. #55845
- Previously, all
CHECKconstraints defined on a table would be tested for everyUPDATEto the table. Now, a check constraint will not be tested for validity when the values of columns it references are not being updated. The referenced columns are no longer fetched in cases where they were only fetched to testCHECKconstraints. #56007 - Indexes on computed columns can now be utilized when filters reference the computed expression and not the computed column directly. #55867
- The query optimizer can now generate inverted zigzag joins over partial GIN indexes. This may lead to more efficient query plans when filtering by a column that is indexed by a partial GIN index. #56101
- They query optimizer can now plan zigzag joins on two partial indexes with the same predicate, leading to more efficient query plans in some cases. #56103
- The optimizer now converts inner joins with single-row values expressions into projections. This allows decorrelation of subqueries that only reference variables from the outer query, such as
SELECT (SELECT value + 10) FROM table. #55961 - The optimizer may now plan an inverted join if two tables are joined on
JSONBorARRAYcolumns using a contains predicate (e.g.,WHERE a @> b), and the first column has a GIN index. The inverted join will be chosen if the optimizer expects it to be more efficient than any alternative plan. For queries in which the only alternative is a cartesian product followed by a filter, the inverted join will likely result in a performance improvement. #55679 - The hybrid logical clock used to coordinate distributed operations now performs significantly better under high contention with many concurrent updates from remote nodes. #56708
- The Raft processing goroutine pool's size is now capped at 96. This was observed to prevent instability on large machines (32+ vCPU) in clusters with many ranges (50k+ per node). #56860
- Interactions between Raft heartbeats and the Raft goroutine pool scheduler are now more efficient and avoid excessive mutex contention. This was observed to prevent instability on large machines (32+ vCPU) in clusters with many ranges (50k+ per node). #56860
- The Raft scheduler now prioritizes the node liveness Range. This was observed to prevent instability on large machines (32+ vCPU) in clusters with many ranges (50k+ per node). #56860
- The optimizer now supports using a GIN index on
JSONBorARRAYcolumns for a wider variety of filter predicates. Previously, GIN index usage was only supported for simple predicates (e.g.,WHERE a @> '{"foo": "bar"}'), but now more complicated predicates are supported by combining simple contains (@>) expressions withANDandOR(e.g.,WHERE a @> '{"foo": "bar"}' OR a @> '{"foo": "baz"}'). A GIN index will be used if it is available on the filtered column and the optimizer expects it to be more efficient than any alternative plan. This may result in performance improvements for queries involvingJSONBandARRAUcolumns. #56732
Doc updates
- Updated several Hello World tutorials to use
cockroach demoas the backend and an external repository for code samples, including Go with pgx and GORM, Java with JDBC and Hibernate, and Python with psycopg2, SQLAlchemy, and Django. #9025,#8991, - Updated the Production Checklist to recommend disabling Linux memory swapping to avoid over-allocating memory. #8979
Contributors
This release includes 1040 merged PRs by 88 authors. We would like to thank the following contributors from the CockroachDB community:
- Adrian Popescu (first-time contributor)
- Alan Acosta (first-time contributor)
- ArjunM98 (first-time contributor)
- Artem Barger
- Azdim Zul Fahmi (first-time contributor)
- David Pacheco (first-time contributor)
- Erik Grinaker
- Gabriel Jaldon (first-time contributor)
- Jake Rote (first-time contributor)
- Joshua M. Clulow (first-time contributor)
- Marcin Knychała (first-time contributor)
- Max Neverov (first-time contributor)
- Miguel Novelo (first-time contributor)
- Ruixin Bao (first-time contributor)
- TAKAHASHI Yuto (first-time contributor)
- Tayo (first-time contributor)
- Tim Graham (first-time contributor)
- Tom Milligan (first-time contributor)
- Vaibhav
- alex-berger@gmx.ch (first-time contributor)
- alex.berger@nexiot.ch (first-time contributor)
- haseth (first-time contributor)
- hewei03 (first-time contributor)
- neeral
- xinyue (first-time contributor)