Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
- {% include {{ page.version.version }}/sql/vector-batch-inserts.md %}
- Creating a vector index through a backfill disables mutations ([`INSERT`]({% link {{ page.version.version }}/insert.md %}), [`UPSERT`]({% link {{ page.version.version }}/upsert.md %}), [`UPDATE`]({% link {{ page.version.version }}/update.md %}), [`DELETE`]({% link {{ page.version.version }}/delete.md %})) on the table. [#144443](https://github.com/cockroachdb/cockroach/issues/144443)
- `IMPORT INTO` is not supported on tables with vector indexes. You can import the vectors first and create the index after import is complete. [#145227](https://github.com/cockroachdb/cockroach/issues/145227)
- The distance functions `vector_l1_ops`, `bit_hamming_ops`, and `bit_jaccard_ops` are not implemented. [#147839](https://github.com/cockroachdb/cockroach/issues/147839)
- Index acceleration with filters is only supported if the filters match prefix columns. [#146145](https://github.com/cockroachdb/cockroach/issues/146145)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
- When columns are [indexed]({% link {{ page.version.version }}/indexes.md %}), a subset of data from the indexed columns may appear in [meta ranges]({% link {{ page.version.version }}/architecture/distribution-layer.md %}#meta-ranges) or other system tables. CockroachDB synchronizes these system ranges and system tables across nodes. This synchronization does not respect any multi-region settings applied via either the [multi-region SQL statements]({% link {{ page.version.version }}/multiregion-overview.md %}), or the low-level [zone configs]({% link {{ page.version.version }}/configure-replication-zones.md %}) mechanism.
- [Zone configs]({% link {{ page.version.version }}/configure-replication-zones.md %}) can be used for data placement but these features were historically built for performance, not for domiciling. The replication system's top priority is to prevent the loss of data and it may override the zone configurations if necessary to ensure data durability. For more information, see [Replication Controls]({% link {{ page.version.version }}/configure-replication-zones.md %}#types-of-constraints).
- If your [log files]({% link {{ page.version.version }}/logging-overview.md %}) are kept in the region where they were generated, there is some cross-region leakage (like the system tables described previously), but the majority of user data that makes it into the logs is going to be homed in that region. If that's not strong enough, you can use the [log redaction functionality]({% link {{ page.version.version }}/configure-logs.md %}#redact-logs) to strip all raw data from the logs. You can also limit your log retention entirely.
- If you start a node with a [`--locality`]({% link {{ page.version.version }}/cockroach-start.md %}#locality) flag that says the node is in region _A_, but the node is actually running in some region _B_, data domiciling based on the inferred node placement will not work. A CockroachDB node only knows its locality based on the text supplied to the `--locality` flag; it can not ensure that it is actually running in that physical location.
- If you start a node with a [`--locality`]({% link {{ page.version.version }}/cockroach-start.md %}#locality) flag that says the node is in region _A_, but the node is actually running in some region _B_, data domiciling based on the inferred node placement will not work. A CockroachDB node only knows its locality based on the text supplied to the `--locality` flag; it can not ensure that it is actually running in that physical location.
- When using the `infer_rbr_region_col_using_constraint` option, inserting rows with `DEFAULT` for the region column uses the database's primary region instead of inferring the region from the parent table via foreign-key constraint. [#150783](https://github.com/cockroachdb/cockroach/issues/150783)
- {% include {{page.version.version}}/known-limitations/secondary-regions-with-regional-by-row-tables.md %}
- {% include {{ page.version.version }}/known-limitations/enforce-home-region-limitations.md %}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`LIKE` queries with an `ESCAPE` clause cannot use index acceleration, which can result in significantly slower performance compared to standard `LIKE` queries. [#30192](https://github.com/cockroachdb/cockroach/issues/30192)
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
- Multi-column-family checks during updates are not supported under `READ COMMITTED` isolation. [#112488](https://github.com/cockroachdb/cockroach/issues/112488)
- Because locks acquired by [foreign key]({% link {{ page.version.version }}/foreign-key.md %}) checks, [`SELECT FOR UPDATE`]({% link {{ page.version.version }}/select-for-update.md %}), and [`SELECT FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}) are fully replicated under `READ COMMITTED` isolation, some queries experience a delay for Raft replication.
- [Foreign key]({% link {{ page.version.version }}/foreign-key.md %}) checks are not performed in parallel under `READ COMMITTED` isolation.
- Mixed-isolation-level workloads must enable foreign-key check locking for `SERIALIZABLE` transactions to avoid race conditions. [#151663](https://github.com/cockroachdb/cockroach/issues/151663)
- [`SELECT FOR UPDATE` and `SELECT FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}) statements are less optimized under `READ COMMITTED` isolation than under `SERIALIZABLE` isolation. Under `READ COMMITTED` isolation, `SELECT FOR UPDATE` and `SELECT FOR SHARE` usually perform an extra lookup join for every locked table when compared to the same queries under `SERIALIZABLE`. In addition, some optimization steps (such as de-correlation of correlated [subqueries]({% link {{ page.version.version }}/subqueries.md %})) are not currently performed on these queries.
- Regardless of isolation level, [`SELECT FOR UPDATE` and `SELECT FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}) statements in CockroachDB do not prevent insertion of new rows matching the search condition (i.e., [phantom reads]({% link {{ page.version.version }}/read-committed.md %}#non-repeatable-reads-and-phantom-reads)). This matches PostgreSQL behavior at all isolation levels. [#120673](https://github.com/cockroachdb/cockroach/issues/120673)

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
[Secondary regions]({% link {{ page.version.version }}/multiregion-overview.md %}#secondary-regions) are not compatible with databases containing [`REGIONAL BY ROW`]({% link {{ page.version.version }}/table-localities.md %}#regional-by-row-tables) tables. CockroachDB does not prevent you from defining secondary regions on databases with regional by row tables, but the interaction of these features is not supported.

Therefore, Cockroach Labs recommends that you avoid defining secondary regions on databases that use regional by row table configurations.
[Secondary regions]({% link {{ page.version.version }}/multiregion-overview.md %}#secondary-regions) are not compatible with databases containing [`REGIONAL BY ROW`]({% link {{ page.version.version }}/table-localities.md %}#regional-by-row-tables) tables. CockroachDB does not prevent you from defining secondary regions on databases with regional by row tables, but the interaction of these features is not supported. Therefore, Cockroach Labs recommends that you avoid defining secondary regions on databases that use regional by row table configurations.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{% if page.name != "known-limitations.md" # New limitations in v24.2 %}
{% endif %}
- `COMMIT` and `ROLLBACK` statements are not supported within nested procedures. [#122266](https://github.com/cockroachdb/cockroach/issues/122266)
- `COMMIT` and `ROLLBACK` statements are not supported within nested procedures. [#122266](https://github.com/cockroachdb/cockroach/issues/122266)
- Pausable portals are not supported with `CALL` statements for stored procedures. [#151529](https://github.com/cockroachdb/cockroach/issues/151529)
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
- A [trigger function]({% link {{ page.version.version }}/triggers.md %}#trigger-function) that is used in an existing trigger cannot be replaced with `CREATE OR REPLACE` syntax. To use `CREATE OR REPLACE`, first [drop any triggers]({% link {{ page.version.version }}/drop-trigger.md %}) that are using the function. [#134555](https://github.com/cockroachdb/cockroach/issues/134555)
- Hidden columns are not visible to triggers. [#133331](https://github.com/cockroachdb/cockroach/issues/133331)
- The `REFERENCING` clause for `CREATE TRIGGER` is not supported. [#135655](https://github.com/cockroachdb/cockroach/issues/135655)
- CockroachDB uses one-based indexing for the `TG_ARGV` array to maintain consistency with its array indexing system. This differs from PostgreSQL, where `TG_ARGV` uses zero-based indexing, unlike other PostgreSQL arrays. Trigger functions that reference `TG_ARGV` need to be adjusted when migrating from PostgreSQL. [#135311](https://github.com/cockroachdb/cockroach/issues/135311)
- `UPDATE` triggers with a column list (using `UPDATE OF column_name` syntax) are not supported. [#135656](https://github.com/cockroachdb/cockroach/issues/135656)
- Statement-level triggers for `TRUNCATE` events are not supported. [#135657](https://github.com/cockroachdb/cockroach/issues/135657)
- {% include {{ page.version.version }}/known-limitations/drop-trigger-limitations.md %}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
- A `RECORD`-returning UDF cannot be created without a `RETURN` statement in the root block, which would restrict the wildcard type to a concrete one. [#122945](https://github.com/cockroachdb/cockroach/issues/122945)
- User-defined functions are not currently supported in:
- Expressions (column, index, constraint) in tables. [#87699](https://github.com/cockroachdb/cockroach/issues/87699)
- Partial index predicates. [#155488](https://github.com/cockroachdb/cockroach/issues/155488)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might also want to include this one in a conditional

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added!

- User-defined functions cannot call themselves recursively. [#93049](https://github.com/cockroachdb/cockroach/issues/93049)
- The `setval` function cannot be resolved when used inside UDF bodies. [#110860](https://github.com/cockroachdb/cockroach/issues/110860)
- Casting subqueries to [user-defined types]({% link {{ page.version.version }}/create-type.md %}) in UDFs is not supported. [#108184](https://github.com/cockroachdb/cockroach/issues/108184)
- Casting subqueries to [user-defined types]({% link {{ page.version.version }}/create-type.md %}) in UDFs is not supported. [#108184](https://github.com/cockroachdb/cockroach/issues/108184)
- Views cannot reference a UDF that contains mutation statements (`INSERT`, `UPDATE`, `UPSERT`, `DELETE`). [#151686](https://github.com/cockroachdb/cockroach/issues/151686)
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
- {% include {{ page.version.version }}/sql/vector-batch-inserts.md %}
- Creating a vector index through a backfill disables mutations ([`INSERT`]({% link {{ page.version.version }}/insert.md %}), [`UPSERT`]({% link {{ page.version.version }}/upsert.md %}), [`UPDATE`]({% link {{ page.version.version }}/update.md %}), [`DELETE`]({% link {{ page.version.version }}/delete.md %})) on the table. [#144443](https://github.com/cockroachdb/cockroach/issues/144443)
- `IMPORT INTO` is not supported on tables with vector indexes. You can import the vectors first and create the index after import is complete. [#145227](https://github.com/cockroachdb/cockroach/issues/145227)
- The distance functions `vector_l1_ops`, `bit_hamming_ops`, and `bit_jaccard_ops` are not implemented. [#147839](https://github.com/cockroachdb/cockroach/issues/147839)
- Index acceleration with filters is only supported if the filters match prefix columns. [#146145](https://github.com/cockroachdb/cockroach/issues/146145)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- The `security_invoker` attribute for views is not supported. Views always use the view definer's privileges when checking permissions. [#138918](https://github.com/cockroachdb/cockroach/issues/138918)
48 changes: 31 additions & 17 deletions src/current/v25.4/known-limitations.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: Known Limitations in CockroachDB v25.3
title: Known Limitations in CockroachDB v25.4
summary: Learn about newly identified limitations in CockroachDB as well as unresolved limitations identified in earlier releases.
toc: true
keywords: limitations, known limitations, unsupported features, PostgreSQL compatibility
Expand All @@ -12,25 +12,26 @@ docs_area: releases

This section describes newly identified limitations in CockroachDB {{ page.version.version }}.

### Row-level security filtering
### View support

{% include {{ page.version.version }}/known-limitations/rls-update-set-where-returning.md %}
{% include {{ page.version.version }}/known-limitations/view-limitations.md %}

### DistSQL
### User-defined functions

{% include {{ page.version.version }}/known-limitations/distsql-heterogeneous-endianness.md %}
- User-defined functions are not currently supported in partial index predicates. [#155488](https://github.com/cockroachdb/cockroach/issues/155488)
- Views cannot reference a UDF that contains mutation statements (`INSERT`, `UPDATE`, `UPSERT`, `DELETE`). [#151686](https://github.com/cockroachdb/cockroach/issues/151686)

### Multi-region
### Stored procedures

{% include {{ page.version.version }}/known-limitations/enforce-home-region-limitations.md %}
- Pausable portals are not supported with `CALL` statements for stored procedures. [#151529](https://github.com/cockroachdb/cockroach/issues/151529)

### Geospatial
### Mixed-isolation workloads

{% include {{ page.version.version }}/known-limitations/geospatial-heterogeneous-architectures.md %}
- Mixed-isolation-level workloads must enable foreign-key check locking for `SERIALIZABLE` transactions to avoid race conditions. [#151663](https://github.com/cockroachdb/cockroach/issues/151663)

### `CITEXT`
### Data domiciling

{% include {{ page.version.version }}/known-limitations/citext-limitations.md %}
- When using the `infer_rbr_region_col_using_constraint` option, inserting rows with `DEFAULT` for the region column uses the database's primary region instead of inferring the region from the parent table via foreign-key constraint. [#150783](https://github.com/cockroachdb/cockroach/issues/150783)

## Limitations from {{ previous_version }} and earlier

Expand Down Expand Up @@ -113,6 +114,10 @@ pq: unsupported binary operator: <collatedstring{en}> || <collatedstring{en}>

[#10679](https://github.com/cockroachdb/cockroach/issues/10679)

#### `LIKE` with `ESCAPE` performance

{% include {{ page.version.version }}/known-limitations/like-escape-performance.md %}

#### Current sequence value not checked when updating min/max value

Altering the minimum or maximum value of a series does not check the current value of a series. This means that it is possible to silently set the maximum to a value less than, or a minimum value greater than, the current value. [#23719](https://github.com/cockroachdb/cockroach/issues/23719)
Expand Down Expand Up @@ -318,11 +323,11 @@ CockroachDB does not allow inverted indexes with a [`STORING` column]({% link {{

{% include {{ page.version.version }}/known-limitations/expression-index-limitations.md %}

#### Secondary regions and regional by row tables
### Data types

{% include {{page.version.version}}/known-limitations/secondary-regions-with-regional-by-row-tables.md %}
#### `CITEXT` limitations

### Data types
{% include {{ page.version.version }}/known-limitations/citext-limitations.md %}

#### Spatial support limitations

Expand All @@ -344,6 +349,8 @@ CockroachDB supports efficiently storing and querying [spatial data]({% link {{

- {% include {{ page.version.version }}/known-limitations/srid-4326-limitations.md %}

- {% include {{ page.version.version }}/known-limitations/geospatial-heterogeneous-architectures.md %}

#### `OID` limitations

Refer to [`OID` best practices]({% link {{ page.version.version }}/oid.md %}#best-practices).
Expand All @@ -370,9 +377,8 @@ Refer to [`OID` best practices]({% link {{ page.version.version }}/oid.md %}#bes

#### Row-level security

{% include {{ page.version.version }}/known-limitations/rls-values-on-conflict-do-nothing.md %}

{% include {{ page.version.version }}/known-limitations/rls-visibility-issue.md %}
- {% include {{ page.version.version }}/known-limitations/rls-values-on-conflict-do-nothing.md %}
- {% include {{ page.version.version }}/known-limitations/rls-update-set-where-returning.md %}

#### `GRANT`/`REVOKE` limitations

Expand All @@ -396,6 +402,10 @@ Every [`DELETE`]({% link {{ page.version.version }}/delete.md %}) or [`UPDATE`](

{% include {{ page.version.version }}/known-limitations/data-domiciling-limitations.md %}

#### DistSQL

{% include {{ page.version.version }}/known-limitations/distsql-heterogeneous-endianness.md %}

#### CockroachDB does not test for all connection failure scenarios

CockroachDB servers rely on the network to report when a TCP connection fails. In most scenarios when a connection fails, the network immediately reports a connection failure, resulting in a `Connection refused` error.
Expand Down Expand Up @@ -732,3 +742,7 @@ UNION ALL SELECT * FROM t1 LEFT JOIN t2 ON st_contains(t1.geom, t2.geom) AND t2.
#### Inverted join for `tsvector` and `tsquery` types is not supported

CockroachDB cannot index-accelerate queries with `@@` predicates when both sides of the operator are variables. [#102731](https://github.com/cockroachdb/cockroach/issues/102731)

#### `LIKE` operator with `ESCAPE` clause

{% include {{ page.version.version }}/known-limitations/like-escape-performance.md %}
6 changes: 0 additions & 6 deletions src/current/v25.4/row-level-security.md
Original file line number Diff line number Diff line change
Expand Up @@ -528,12 +528,6 @@ For a demo showing how to combine row-level security with [Multi-region SQL]({%

{% include_cached youtube.html video_id="ZG8RsfwMaa8" %}

## Known limitations

### Row-level security metadata leakage

{% include {{ page.version.version }}/known-limitations/rls-visibility-issue.md %}

## See also

+ [`SHOW POLICIES`]({% link {{ page.version.version }}/show-policies.md %})
Expand Down
4 changes: 4 additions & 0 deletions src/current/v25.4/views.md
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know how much this matters, but this introduces a second "Known limitations" header to the /docs/dev/views page, which slightly messes with the ability to navigate to the bottom one via the ToC.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't realize! Fixed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On your other point, thank you for raising it. This is admittedly clunky, and is an outcome of how the includes are set up. In the v25.3 section, all KLs for a given topic are contained in the include for that topic. That include file is embedded on the respective feature pages (like for UDFs and Stored Procedures), where all the relevant KLs can also be viewed.

Because of how the main Known Limitations page is set up, we also have the newly identified KLs in the top section. The "correct" way to do this would be to have the lines appear only 1) in the top section of new KLs, 2) on the various feature pages, outside the KL includes (so that they aren't missing there). I felt this would add too much burden for the next version, because we'd have to take the "new" lines and distribute them among the appropriate include files. The way it is now, we just have to clear everything in the "new" section when we update this page for 26.1.

The headings on this page may also be misleading: "New limitations" means "newly identified limitations"; "Limitations from v24.3 and earlier" means "limitations we already knew about when these versions were released". I don't think most (if any) of these would be considered "newly introduced" limitations unless the feature itself were new, in which case it wouldn't be in the "earlier" section anyway. Perhaps we should adjust the headings. In any case, it means it's not a total contradiction to have them in two places.

Copy link
Contributor

@bsanchez-the-roach bsanchez-the-roach Oct 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just trying to get my head around this... I'm a little confused because I don't see this same duplication in previous versions when I check, for example, https://www.cockroachlabs.com/docs/v25.3/known-limitations
I guess I'd like to better understand what's changed.

I suppose in a ideal case you could have two separate include files, one for old limitations and one for new limitations, and you separate them on the main known limitations page and join them up on the feature page, but I understand that that might be too much overhead and/or might be out of scope for this PR.

None of this is a big deal I'm just curious and dogged haha.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems the reason the 25.3 "new" limitations aren't duplicated is because they were only placed in the "new" section and not in any of the feature sections. In this PR, I moved them all to existing & new subheadings on the KLs page that I thought were appropriate.

Also, the use of includes for KLs is intended to enable them to be embedded in multiple docs. The way I do it currently, all the KLs for (e.g.) stored procedures are in a stored-proc-limitations.md include that's embedded on both the KLs page and the Stored Procedures page. When a new stored proc limitation is identified, it seems simplest to add the limitation to that main list. However, that list can't then be reused in the "new" section, because it displays all the KLs in history. So for this version, I manually pasted the same limitations from the includes into the "new" KLs section.

In contrast, v25.3 have common include files for "geospatial" or "rls" (row-level security), so those are one-off includes. It also doesn't seem useful to have the KLs within includes, since they're only being used in one place. This system is still relatively new and could use another look. I'm open to ideas.

In the meantime, do you think the temporary duplication here is acceptable, or should I remove the dupes in the v25.3 section and put them back inside the includes for next version (I guess I did do that work this time, too)?

Copy link
Contributor

@bsanchez-the-roach bsanchez-the-roach Oct 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we feel the distinction is worth making (this is a newly-identified limitation vs. this is a limitation that we'd already identified in previous versions) then I think we should probably avoid the duplication, as it's sort of confusing. Having separate include files for old and new limitations could work for that, but also maybe there's a cleverer solution?

Then again, I don't think the duplication will have an effect beyond mild confusion for anyone (possibly no one) who notices it. It's clear in any case that the limitation still affects v25.4, so who cares when it was introduced. Unless... possibly it matters to someone who's considering upgrading to the newest version, and that known limitation is relevant to that decision. Maybe then it should be very clear that the limitation is genuinely new. But maybe that's an edge case.

I guess long term I'm anti-duplication but maybe a rethink of the include file situation is a separate PR?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So ... I completely forgot that I had already solved this problem when I came up with this system. Some of the include files have a conditional block for new KLs that prevents them from appearing when they're on the Known Limitations page (where they will already be at the top). For the next version, you just move them outside that conditional block.

This should be fixed now!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah amazing, elegant solution

Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,10 @@ For example:
(3 rows)
~~~

## Known limitations

{% include {{ page.version.version }}/known-limitations/view-limitations.md %}

## See also

- [Selection Queries]({% link {{ page.version.version }}/selection-queries.md %})
Expand Down
Loading