> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cockroachlabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SQL Feature Support in CockroachDB

export const InternalLink = ({version, path = "", children, ...props}) => {
  let detectedVersion = version || "stable";
  if (typeof window !== 'undefined' && !version) {
    const match = window.location.pathname.match(/\/docs\/([^/]+)/);
    if (match) {
      detectedVersion = match[1];
    }
  }
  const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
  return <a href={`/docs/${detectedVersion}/${normalizedPath}`} {...props}>
      {children}
    </a>;
};

CockroachDB  supports the following standard SQL features and common extensions.

* **Component** lists the components that are commonly considered part of SQL.
* **Supported** shows CockroachDB's level of support for the component.
* **Type** indicates whether the component is part of the SQL *Standard* or is an *Extension* created by Cockroach Labs or others.
* **Details** provides greater context about the component.

## Features

### Row values

| Component | Supported | Type | Details |
| - | - | - | - |
| `ARRAY` | ✓ | Standard | <InternalLink path="array">`ARRAY` documentation</InternalLink> |
| `AUTO INCREMENT`<br />(Automatic key generation) | Alternative | Common Extension | <InternalLink path="sql-faqs#how-do-i-auto-generate-unique-row-ids-in-cockroachdb">Automatic key generation FAQ</InternalLink> |
| `BIT` | ✓ | Standard | <InternalLink path="bit">`BIT` documentation</InternalLink> |
| `BOOLEAN` | ✓ | Standard | <InternalLink path="bool">`BOOL` documentation</InternalLink> |
| `BYTES` | ✓ | CockroachDB Extension | <InternalLink path="bytes">`BYTES` documentation</InternalLink> |
| `COLLATE` | ✓ | Standard | <InternalLink path="collate">`COLLATE` documentation</InternalLink> |
| `DATE` | ✓ | Standard | <InternalLink path="date">`DATE` documentation</InternalLink> |
| `DECIMAL`, `NUMERIC` | ✓ | Standard | <InternalLink path="decimal">`DECIMAL` documentation</InternalLink> |
| `DOMAIN` | ✓ | Standard | <InternalLink path="domain">`DOMAIN` documentation</InternalLink> |
| `ENUM` | ✓ | PostgreSQL Extension | <InternalLink path="enum">`ENUM` documentation</InternalLink> |
| `FLOAT`, `REAL` | ✓ | Standard | <InternalLink path="float">`FLOAT` documentation</InternalLink> |
| `INET` | ✓ | PostgreSQL Extension | <InternalLink path="inet">`INET` documentation</InternalLink> |
| `INT` | ✓ | Standard | <InternalLink path="int">`INT` documentation</InternalLink> |
| `INTERVAL` | ✓ | Standard | <InternalLink path="interval">`INTERVAL` documentation</InternalLink> |
| `JSON`/`JSONB` | ✓ | Common Extension | <InternalLink path="jsonb">`JSONB` documentation</InternalLink> |
| `NULL` | ✓ | Standard | <InternalLink path="null-handling">`NULL`-handling documentation</InternalLink> |
| `OID` | ✓ | PostgreSQL Extension | <InternalLink path="oid">`OID` documentation</InternalLink> |
| `SERIAL` | ✓ | PostgreSQL Extension | <InternalLink path="serial">`SERIAL` documentation</InternalLink> |
| `SET` | ✗ | MySQL | Only allow rows to contain values from a defined set of terms. |
| `STRING`, `CHARACTER` | ✓ | Standard | <InternalLink path="string">`STRING` documentation</InternalLink> |
| `TIME` | ✓ | Standard | <InternalLink path="time">`TIME` documentation</InternalLink> |
| `TIMESTAMP`/`TIMESTAMPTZ` | ✓ | Standard | <InternalLink path="timestamp">`TIMESTAMP` documentation</InternalLink> |
| `TSQUERY` | ✓ | Standard | <InternalLink path="tsquery">`TSQUERY` documentation</InternalLink> |
| `TSVECTOR` | ✓ | Standard | <InternalLink path="tsvector">`TSVECTOR` documentation</InternalLink> |
| `UNSIGNED INT` | ✗ | Common Extension | `UNSIGNED INT` causes numerous casting issues, so we do not plan to support it. |
| `UUID` | ✓ | PostgreSQL Extension | <InternalLink path="uuid">`UUID` documentation</InternalLink> |
| Identifiers | ✓ | Standard | <InternalLink path="keywords-and-identifiers#identifiers">Identifiers documentation</InternalLink>.  See also <InternalLink path="sql-name-resolution">SQL Name Resolution</InternalLink>. |
| Key-value pairs | Alternative | Extension | <InternalLink path="sql-faqs#can-i-use-cockroachdb-as-a-key-value-store">Key-Value FAQ</InternalLink> |
| XML | ✗ | Standard | XML data can be stored as `BYTES`, but we do not offer XML parsing. |

### Constraints

| Component | Supported | Type | Details |
| - | - | - | - |
| Not Null | ✓ | Standard | <InternalLink path="not-null">Not Null documentation</InternalLink> |
| Unique | ✓ | Standard | <InternalLink path="unique">Unique documentation</InternalLink> |
| Primary Key | ✓ | Standard | <InternalLink path="primary-key">Primary Key documentation</InternalLink> |
| Check | ✓ | Standard | <InternalLink path="check">Check documentation</InternalLink> |
| Foreign Key | ✓ | Standard | <InternalLink path="foreign-key">Foreign Key documentation</InternalLink> |
| Default Value | ✓ | Standard | <InternalLink path="default-value">Default Value documentation</InternalLink> |

### Transactions

| Component | Supported | Type | Details |
| - | - | - | - |
| Transactions (ACID semantics) | ✓ | Standard | <InternalLink path="transactions">Transactions documentation</InternalLink> |
| `BEGIN` | ✓ | Standard | <InternalLink path="begin-transaction">`BEGIN` documentation</InternalLink> |
| `COMMIT` | ✓ | Standard | <InternalLink path="commit-transaction">`COMMIT` documentation</InternalLink> |
| `ROLLBACK` | ✓ | Standard | <InternalLink path="rollback-transaction">`ROLLBACK` documentation</InternalLink> |
| `SAVEPOINT` | ✓ | Standard with CockroachDB extensions | CockroachDB supports nested transactions using <InternalLink path="savepoint">`SAVEPOINT`</InternalLink> |

### Indexes

| Component | Supported | Type | Details |
| - | - | - | - |
| Indexes | ✓ | Common Extension | <InternalLink path="indexes">Indexes documentation</InternalLink> |
| Multi-column indexes | ✓ | Common Extension | We do not limit on the number of columns indexes can include |
| Covering indexes | ✓ | Common Extension | <InternalLink path="create-index#store-columns">Storing Columns documentation</InternalLink> |
| GIN indexes | ✓ | Common Extension | <InternalLink path="inverted-indexes">GIN indexes documentation</InternalLink> |
| Trigram indexes | ✓ | PostgreSQL Extension | <InternalLink path="trigram-indexes">Trigram indexes documentation</InternalLink> |
| Partial indexes | ✓ | Common Extension | <InternalLink path="partial-indexes">Partial indexes documentation</InternalLink> |
| Spatial indexes | ✓ | Common Extension | <InternalLink path="spatial-indexes">Spatial indexes documentation</InternalLink> |
| Multiple indexes per query | Partial | Common Extension | <InternalLink path="indexes#selection">Index selection</InternalLink> |
| Full-text indexes | ✓ | Common Extension | <InternalLink path="full-text-search">Full-text search documentation</InternalLink> |
| Expression indexes | ✓ | Common Extension | <InternalLink path="expression-indexes">Expression indexes</InternalLink> |
| Prefix indexes | ✗ | Common Extension | Implement using <InternalLink path="expression-indexes">Expression indexes</InternalLink> |
| Hash indexes | ✗ | Common Extension | Improves performance of queries looking for single, exact values |
| Hash-sharded indexes | ✓ | CockroachDB Extension | <InternalLink path="hash-sharded-indexes">Hash-sharded Indexes documentation</InternalLink> |

### Schema changes

| Component | Supported | Type | Details |
| - | - | - | - |
| `ALTER TABLE` | ✓ | Standard | <InternalLink path="alter-table">`ALTER TABLE` documentation</InternalLink> |
| Database renames | ✓ | Standard | <InternalLink path="alter-database#rename-to">`ALTER DATABASE ... RENAME TO` documentation</InternalLink> |
| Table renames | ✓ | Standard | <InternalLink path="alter-table#rename-to">`ALTER TABLE ... RENAME TO` documentation</InternalLink> |
| Column renames | ✓ | Standard | <InternalLink path="alter-table#rename-column">`RENAME COLUMN` documentation</InternalLink> |
| Altering a column's data type | ✓ | Standard | <InternalLink path="alter-table#alter-column-data-types">`ALTER COLUMN` documentation</InternalLink> |
| Adding columns | ✓ | Standard | <InternalLink path="alter-table#add-column">`ADD COLUMN` documentation</InternalLink> |
| Removing columns | ✓ | Standard | <InternalLink path="alter-table#drop-column">`DROP COLUMN` documentation</InternalLink> |
| Adding constraints | ✓ | Standard | <InternalLink path="alter-table#add-constraint">`ADD CONSTRAINT` documentation</InternalLink> |
| Removing constraints | ✓ | Standard | <InternalLink path="alter-table#drop-constraint">`DROP CONSTRAINT` documentation</InternalLink> |
| Index renames | ✓ | Standard | <InternalLink path="alter-index#rename-to">`ALTER INDEX ... RENAME TO` documentation</InternalLink> |
| Adding indexes | ✓ | Standard | <InternalLink path="create-index">`CREATE INDEX` documentation</InternalLink> |
| Removing indexes | ✓ | Standard | <InternalLink path="drop-index">`DROP INDEX` documentation</InternalLink> |
| Altering a primary key | ✓ | Standard | <InternalLink path="alter-table#alter-primary-key">`ALTER PRIMARY KEY` documentation</InternalLink> |
| Adding user-defined schemas | ✓ | Standard | <InternalLink path="create-schema">`CREATE SCHEMA` documentation</InternalLink> |
| Removing user-defined schemas | ✓ | Standard | <InternalLink path="drop-schema">`DROP SCHEMA` documentation</InternalLink> |
| Altering user-defined schemas | ✓ | Standard | <InternalLink path="create-schema">`ALTER SCHEMA` documentation</InternalLink> |

### Statements

| Component | Supported | Type | Details |
| - | - | - | - |
| Common statements | ✓ | Standard, PostgreSQL/CockroachDB Extension | <InternalLink path="sql-statements">SQL Statements documentation</InternalLink> |
| `UPSERT` | ✓ | PostgreSQL, MSSQL Extension | <InternalLink path="upsert">`UPSERT` documentation</InternalLink> |
| `EXPLAIN` | ✓ | Common Extension | <InternalLink path="explain">`EXPLAIN` documentation</InternalLink> |
| `SELECT ... INTO` | ✓ | Common Extension | <InternalLink path="plpgsql#declare-a-variable">PL/pgSQL documentation</InternalLink>. |
| `SELECT FOR UPDATE` | ✓ | Common Extension | <InternalLink path="select-for-update">`SELECT FOR UPDATE` documentation</InternalLink> |

### Clauses

| Component | Supported | Type | Details |
| - | - | - | - |
| Common clauses | ✓ | Standard | <InternalLink path="sql-grammar">SQL Grammar documentation</InternalLink> |
| `LIMIT` | ✓ | Common Extension | Limit the number of rows a statement returns. For more information, see <InternalLink path="limit-offset">Limit Query Results</InternalLink>. |
| `LIMIT` with `OFFSET` | ✓ | Common Extension | Skip a number of rows, and then limit the size of the return set. For more information, see <InternalLink path="limit-offset">Limit Query Results</InternalLink>. |
| `RETURNING` | ✓ | Common Extension | Retrieve a table of rows statements affect. For examples, see the <InternalLink path="insert">`INSERT`</InternalLink> and <InternalLink path="delete">`DELETE`</InternalLink> documentation. |

### Table expressions

| Component | Supported | Type | Details |
| - | - | - | - |
| Table and View references | ✓ | Standard | <InternalLink path="table-expressions#table-and-view-names">Table expressions documentation</InternalLink> |
| `AS` in table expressions | ✓ | Standard | <InternalLink path="table-expressions#aliased-table-expressions">Aliased table expressions documentation</InternalLink> |
| `JOIN` (`INNER`, `LEFT`, `RIGHT`, `FULL`, `CROSS`) | ✓ | Standard | <InternalLink path="table-expressions#join-expressions">`JOIN` expressions documentation</InternalLink> |
| Sub-queries as table expressions | Partial | Standard | Non-correlated subqueries are <InternalLink path="table-expressions#use-a-subquery">supported</InternalLink>, as are most <InternalLink path="subqueries#correlated-subqueries">correlated subqueries</InternalLink>. |
| Table generator functions | Partial | PostgreSQL Extension | <InternalLink path="table-expressions#table-generator-functions">Table generator functions documentation</InternalLink> |
| `WITH ORDINALITY` | ✓ | CockroachDB Extension | <InternalLink path="table-expressions#ordinality-annotation">Ordinality annotation documentation</InternalLink> |

### Scalar expressions and Boolean formulas

| Component | Supported | Type | Details |
| - | - | - | - |
| Common functions | ✓ | Standard | <InternalLink path="scalar-expressions#function-calls-and-sql-special-forms">Functions calls and SQL special forms documentation</InternalLink> |
| Common operators | ✓ | Standard | <InternalLink path="scalar-expressions#unary-and-binary-operations">Operators documentation</InternalLink> |
| `IF`/`CASE`/`NULLIF` | ✓ | Standard | <InternalLink path="scalar-expressions#conditional-expressions">Conditional expressions documentation</InternalLink> |
| `COALESCE`/`IFNULL` | ✓ | Standard | <InternalLink path="scalar-expressions#conditional-expressions">Conditional expressions documentation</InternalLink> |
| `AND`/`OR` | ✓ | Standard | <InternalLink path="scalar-expressions#conditional-expressions">Conditional expressions documentation</InternalLink> |
| `LIKE`/`ILIKE` | ✓ | Standard | <InternalLink path="scalar-expressions#string-pattern-matching">String pattern matching documentation</InternalLink> |
| `SIMILAR TO` | ✓ | Standard | <InternalLink path="scalar-expressions#string-matching-using-sql-regular-expressions">SQL regexp pattern matching documentation</InternalLink> |
| Matching using POSIX regular expressions | ✓ | Common Extension | <InternalLink path="scalar-expressions#string-matching-using-posix-regular-expressions">POSIX regexp pattern matching documentation</InternalLink> |
| `EXISTS` | Partial | Standard | Non-correlated subqueries are <InternalLink path="scalar-expressions#existence-test-on-the-result-of-subqueries">supported</InternalLink>, as are most <InternalLink path="subqueries#correlated-subqueries">correlated subqueries</InternalLink>. Works only with small data sets. |
| Scalar subqueries | Partial | Standard | Non-correlated subqueries are <InternalLink path="scalar-expressions#scalar-subqueries">supported</InternalLink>, as are most <InternalLink path="subqueries#correlated-subqueries">correlated subqueries</InternalLink>. Works only with small data sets. |
| Bitwise arithmetic | ✓ | Common Extension | <InternalLink path="scalar-expressions#unary-and-binary-operations">Operators documentation</InternalLink> |
| Array constructors and subscripting | Partial | PostgreSQL Extension | Array expression documentation: <InternalLink path="scalar-expressions#array-constructors">Constructor syntax</InternalLink> and <InternalLink path="scalar-expressions#subscripted-expressions">Subscripting</InternalLink> |
| `COLLATE` | ✓ | Standard | <InternalLink path="scalar-expressions#collation-expressions">Collation expressions documentation</InternalLink> |
| Column ordinal references | ✓ | CockroachDB Extension | <InternalLink path="scalar-expressions#column-references">Column references documentation</InternalLink> |
| Type annotations | ✓ | CockroachDB Extension | <InternalLink path="scalar-expressions#explicitly-typed-expressions">Type annotations documentation</InternalLink> |

### Permissions

| Component | Supported | Type | Details |
| - | - | - | - |
| Users | ✓ | Standard | <InternalLink path="security-reference/authorization#sql-users">Users documentation</InternalLink> |
| Roles | ✓ | Standard | <InternalLink path="security-reference/authorization#roles">Roles documentation</InternalLink> |
| Object ownership | ✓ | Common Extension | <InternalLink path="security-reference/authorization#object-ownership">Ownership documentation</InternalLink> |
| Privileges | ✓ | Standard | <InternalLink path="security-reference/authorization#managing-privileges">Privileges documentation</InternalLink> |
| Default privileges | ✓ | PostgreSQL Extension | <InternalLink path="security-reference/authorization#default-privileges">Default privileges documentation</InternalLink> |

### PostgreSQL extensions

CockroachDB accepts some `CREATE EXTENSION` statements for compatibility with PostgreSQL tools and migrations. In CockroachDB, these statements are no-ops: if the related functionality is supported, it's available without running `CREATE EXTENSION`. Further, when `CREATE EXTENSION` syntax is accepted by CockroachDB, that does not imply full compatibility with the corresponding PostgreSQL extension.

| Component | Support level | Type | Details |
| - | - | - | - |
| `CREATE EXTENSION "postgis"` | Partial | PostgreSQL Extension | CockroachDB supports <InternalLink path="spatial-data-overview">spatial data</InternalLink>, <InternalLink path="spatial-indexes">spatial indexes</InternalLink>, and many <InternalLink path="functions-and-operators">PostGIS-compatible spatial functions</InternalLink>. Not all PostGIS functions are supported. |
| `CREATE EXTENSION "pg_trgm"` | Partial | PostgreSQL Extension | CockroachDB supports <InternalLink path="trigram-indexes">trigram indexes</InternalLink> and trigram functions and operators for fuzzy string matching and pattern matching. Some PostgreSQL `pg_trgm` syntax and features are not supported. |
| `CREATE EXTENSION "fuzzystrmatch"` | ✓ | Common Extension | Provides PostgreSQL-compatible fuzzy string matching functions including `soundex()`, `difference()`, `levenshtein()`, `levenshtein_less_equal()`, `metaphone()`, <InternalLink path="functions-and-operators">`dmetaphone()`</InternalLink>, <InternalLink path="functions-and-operators">`dmetaphone_alt()`</InternalLink>, and <InternalLink path="functions-and-operators">`daitch_mokotoff()`</InternalLink>. |
| `CREATE EXTENSION "pgcrypto"` | Partial | PostgreSQL Extension | CockroachDB supports some PostgreSQL-compatible <InternalLink path="functions-and-operators">cryptographic functions</InternalLink>, including `crypt()`, `digest()`, `gen_random_uuid()`, `gen_salt()`, and `hmac()`. CockroachDB also supports <InternalLink path="column-level-encryption">column-level encryption functions</InternalLink> such as `encrypt()`, `encrypt_iv()`, `decrypt()`, and `decrypt_iv()`. CockroachDB does not support every PostgreSQL `pgcrypto` function. |
| `CREATE EXTENSION "uuid-ossp"` | ✓ | Common Extension | Provides access to several additional <InternalLink path="functions-and-operators">UUID generation functions</InternalLink>. |
| `CREATE EXTENSION "vector"` | Partial | PostgreSQL Extension | CockroachDB supports the <InternalLink path="vector">`VECTOR`</InternalLink> data type, <InternalLink path="vector-indexes">vector indexes</InternalLink>, and `pgvector`-compatible <InternalLink path="functions-and-operators">vector functions</InternalLink>. |
| `CREATE EXTENSION "btree_gin"`<br />`CREATE EXTENSION "btree_gist"` | ✗ | PostgreSQL Extension | CockroachDB does not support PostgreSQL `btree_gin` or `btree_gist` operator class extensions. Depending on the use case, use CockroachDB <InternalLink path="create-index">secondary indexes</InternalLink>, <InternalLink path="inverted-indexes">GIN indexes</InternalLink>, <InternalLink path="trigram-indexes">trigram indexes</InternalLink>, or <InternalLink path="spatial-indexes">spatial indexes</InternalLink>. |
| `CREATE EXTENSION "postgres_fdw"` | ✗ | PostgreSQL Extension | CockroachDB does not support PostgreSQL foreign data wrappers. To reference objects in another database in the same CockroachDB cluster, use <InternalLink path="sql-name-resolution#lookup-with-fully-qualified-names">fully qualified names</InternalLink>, subject to the limitations for cross-database object references. |
| `CREATE EXTENSION "citext"` | ✗ | PostgreSQL Extension | CockroachDB does not support the PostgreSQL `citext` extension. To store and compare case-insensitive text, use the native <InternalLink path="citext">`CITEXT`</InternalLink> data type. For expression-based case-insensitive matching, use SQL expressions such as `lower()` or case-insensitive pattern matching with `ILIKE`, depending on the query. |
| `CREATE EXTENSION "pg_stat_statements"` | ✗ | PostgreSQL Extension | CockroachDB does not support the PostgreSQL `pg_stat_statements` extension. Use CockroachDB <InternalLink path="ui-statements-page">statement diagnostics</InternalLink> and SQL observability features instead. |

### Miscellaneous

| Component | Supported | Type | Details |
| - | - | - | - |
| Column families | ✓ | CockroachDB Extension | <InternalLink path="column-families">Column Families documentation</InternalLink> |
| Computed columns (stored and virtual) | ✓ | Common Extension | <InternalLink path="computed-columns">Computed Columns documentation</InternalLink> |
| `ON UPDATE` expressions | ✓ | MySQL Extension | <InternalLink path="create-table#on-update-expressions">`ON UPDATE` expressions documentation</InternalLink> |
| Multi-region capabilities | ✓ | CockroachDB Extension | <InternalLink path="multiregion-overview">Multi-region documentation</InternalLink> |
| System catalog schemas | ✓ | Standard, PostgreSQL/CockroachDB Extension | <InternalLink path="crdb-internal">`crdb_internal`</InternalLink> (CockroachDB Extension)<br /><InternalLink path="information-schema">`information_schema`</InternalLink> (Standard)<br /><InternalLink path="pg-catalog">`pg_catalog`</InternalLink> (PostgreSQL Extension)<br /><InternalLink path="pg-extension">`pg_extension`</InternalLink> (PostgreSQL Extension) |
| Sequences | ✓ | Common Extension | <InternalLink path="create-sequence">`CREATE SEQUENCE` documentation</InternalLink> |
| Identity columns | ✓ | Common Extension | <InternalLink path="create-table#identity-columns">Identity columns documentation</InternalLink> |
| Views | ✓ | Standard | <InternalLink path="views">Views documentation</InternalLink> |
| Materialized views | ✓ | Common Extension | <InternalLink path="views#materialized-views">Materialized views documentation</InternalLink> |
| Window functions | ✓ | Standard | <InternalLink path="window-functions">Window Functions documentation</InternalLink> |
| Common table expressions | Partial | Common Extension | <InternalLink path="common-table-expressions">Common Table Expressions documentation</InternalLink> |
| Stored procedures | Partial | Common Extension | <InternalLink path="stored-procedures">Stored procedures documentation</InternalLink> |
| Cursors | Partial | Standard | <InternalLink path="cursors">Cursors documentation</InternalLink> |
| Triggers | Partial | Standard | <InternalLink path="triggers">Triggers documentation</InternalLink> |
| Row-level TTL | ✓ | Common Extension | Automatically delete expired rows.  For more information, see <InternalLink path="row-level-ttl">Batch-delete expired data with Row-Level TTL</InternalLink>. |
| User-defined functions | Partial | Standard | <InternalLink path="user-defined-functions">User-Defined Functions documentation</InternalLink> |
