SET can modify one of the session configuration variables. These can also be queried via . By default, session variable values are set for all future sessions to the database; they do not affect the current session.
The
SET statement for session variables is unrelated to the other and statements.In some cases, client drivers can drop and restart the connection to the server. When this happens, any session configurations made with
SET statements are lost. It is therefore more reliable to configure the session in the client’s connection string. For examples in different languages, see the tutorials.Required privileges
To set therole session variable, the current user must be a member of the admin role, or a member of the target role.
All other session variables do not require to modify.
Synopsis
TheSET statement can set a session variable for the duration of the current session (SET {variable}/SET SESSION {variable}), or for the duration of a single transaction (SET LOCAL {variable}).
SET SESSION
By default, session variables are set for the duration of the current session. As a result,
SET {variable} and SET SESSION {variable} are equivalent.SET LOCAL
SET LOCAL is compatible with . Executing a , ROLLBACK TO SAVEPOINT, or RELEASE TO SAVEPOINT statement rolls back any variables set by SET LOCAL.Parameters
| Parameter | Description |
|---|---|
var\_name | The name of the session variable to set. The variable name is case-insensitive. |
var\_value | The value, or list of values, to assign to the session variable. |
Supported variables
| Variable name | Description | Initial value | Modify with ? | View with ? | |
|---|---|---|---|---|---|
application\_name | The current application name for statistics collection. | Empty string, or cockroach for sessions from the . | Yes | Yes | |
autocommit\_before\_ddl | When the is set to on, any schema change statement that is sent during an will cause the transaction to before executing the schema change. | off | Yes | Yes | |
bytea\_output | The . | hex | Yes | Yes | |
client\_min\_messages | The severity level of notices displayed in the . Accepted values include debug5, debug4, debug3, debug2, debug1, log, notice, warning, and error. | notice | Yes | Yes | |
copy\_from\_atomic\_enabled | If set to on, statements are committed atomically, matching PostgreSQL behavior. If set to off, COPY FROM statements are segmented into batches of 100 rows unless issued within an explicit transaction, matching the CockroachDB behavior in versions prior to v22.2. | on | Yes | Yes | |
copy\_transaction\_quality\_of\_service | The default quality of service for statements in the current session. The supported options are regular, critical, and background. See . | background | Yes | Yes | |
cost\_scans\_with\_default\_col\_size | Whether to prevent the optimizer from considering column size when costing plans. | false | Yes | Yes | |
crdb\_version | The version of CockroachDB. | CockroachDB OSS version | No | Yes | |
database | The . | Database in connection string, or empty if not specified. | Yes | Yes | |
datestyle | The input string format for and values. Accepted values include ISO,MDY, ISO,DMY, and ISO,YMD. | The value set by the sql.defaults.datestyle (ISO,MDY, by default). | Yes | Yes | |
default\_int\_size | The size, in bytes, of an type. | 8 | Yes | Yes | |
default\_text\_search\_config | The dictionary used to normalize tokens and eliminate stop words when calling a without a configuration parameter. See . | english | Yes | Yes | |
default\_transaction\_isolation | The isolation level at which transactions in the session execute ( or ). See . | SERIALIZABLE | Yes | Yes | |
default\_transaction\_priority | The default transaction priority for the current session. The supported options are low, normal, and high. | normal | Yes | Yes | |
default\_transaction\_quality\_of\_service | The default transaction quality of service for the current session. The supported options are regular, critical, and background. See . | regular | Yes | Yes | |
default\_transaction\_read\_only | The default transaction access mode for the current session. If set to on, only read operations are allowed in transactions in the current session; if set to off, both read and write operations are allowed. See for more details. | off | Yes | Yes | |
default\_transaction\_use\_follower\_reads | If set to on, all read-only transactions use to allow the transaction to use follower reads. If set to off, read-only transactions will only use follower reads if an AS OF SYSTEM TIME clause is specified in the statement, with an interval of at least 4.8 seconds. | off | Yes | Yes | |
disable\_changefeed\_replication | When true, will not emit messages for any changes (e.g., INSERT, UPDATE) issued to watched tables during that session. | false | Yes | Yes | |
disallow\_full\_table\_scans | If set to on, queries on “large” tables with a row count greater than large\_full\_scan\_rows will not use full table or index scans. If no other query plan is possible, queries will return an error message. This setting does not apply to internal queries, which may plan full table or index scans without checking the session variable. | off | Yes | Yes | |
enable\_auto\_rehoming | When enabled, the of rows in tables are automatically set to the region of the from which any or statements that operate on those rows originate. | off | Yes | Yes | |
enable\_create\_stats\_using\_extremes | If on, allows manual creation of using the syntax. | on | Yes | Yes | |
enable\_durable\_locking\_for\_serializable | Indicates whether CockroachDB replicates locks via , allowing locks to be preserved when leases are transferred. Note that replicating FOR UPDATE and FOR SHARE locks will add latency to those statements. This setting only affects SERIALIZABLE transactions and matches the default READ COMMITTED behavior when enabled. | off | Yes | Yes | |
enable\_experimental\_alter\_column\_type\_general | If on, it is possible to . | off | Yes | Yes | |
enable\_implicit\_fk\_locking\_for\_serializable | Indicates whether CockroachDB uses to perform checks. To take effect, the enable\_shared\_locking\_for\_serializable setting must also be enabled. This setting only affects SERIALIZABLE transactions and matches the default READ COMMITTED behavior when enabled. | off | Yes | Yes | |
enable\_implicit\_select\_for\_update | Indicates whether and statements acquire locks using the FOR UPDATE locking mode during their initial row scan, which improves performance for contended workloads. For more information about how FOR UPDATE locking works, see the documentation for . | on | Yes | Yes | |
enable\_implicit\_transaction\_for\_batch\_statements | Indicates whether multiple statements in a single query (a “batch statement”) will all run in the same implicit transaction, which matches the PostgreSQL wire protocol. | on | Yes | Yes | |
enable\_insert\_fast\_path | Indicates whether CockroachDB will use a specialized execution operator for inserting into a table. We recommend leaving this setting on. | on | Yes | Yes | |
enable\_shared\_locking\_for\_serializable | Indicates whether are enabled for SERIALIZABLE transactions. When off, SELECT statements using FOR SHARE are still permitted under SERIALIZABLE isolation, but silently do not lock. | off | Yes | Yes | |
enable\_super\_regions | When enabled, you can define a super region: a set of on a multi-region cluster such that your will have all of their stored only in regions that are members of the super region. | off | Yes | Yes | |
enable\_zigzag\_join | Indicates whether the will plan certain queries using a , which searches for the desired intersection by jumping back and forth between the indexes based on the fact that after constraining indexes, they share an ordering. | on | Yes | Yes | |
enforce\_home\_region | If set to on, queries return an error and in some cases a suggested resolution if they cannot run entirely in their home region. This can occur if a query has no home region (for example, if it reads from different home regions in a ) or a query’s home region differs from the region. Note that only tables with ZONE can be scanned without error when this is enabled. For more information about home regions, see . This feature is in preview. It is subject to change. | off | Yes | Yes | |
enforce\_home\_region\_follower\_reads\_enabled | If on while the setting is on, allows enforce\_home\_region to perform AS OF SYSTEM TIME to detect and report a query’s , if any. This feature is in preview. It is subject to change. | off | Yes | Yes | |
expect\_and\_ignore\_not\_visible\_columns\_in\_copy | If on, with no column specifiers will assume that hidden columns are in the copy data, but will ignore them when applying COPY FROM. | off | Yes | Yes | |
extra\_float\_digits | The number of digits displayed for floating-point values. Only values between -15 and 3 are supported. | 0 | Yes | Yes | |
force\_savepoint\_restart | When set to true, allows the statement to accept any name for a savepoint. | off | Yes | Yes | |
foreign\_key\_cascades\_limit | Limits the number of that run as part of a single query. | 10000 | Yes | Yes | |
idle\_in\_session\_timeout | Automatically terminates sessions that idle past the specified threshold. When set to 0, the session will not timeout. | The value set by the sql.defaults.idle\_in\_session\_timeout (0s, by default). | Yes | Yes | |
idle\_in\_transaction\_session\_timeout | Automatically terminates sessions that are idle in a transaction past the specified threshold. When set to 0, the session will not timeout. | The value set by the sql.defaults.idle\_in\_transaction\_session\_timeout (0s, by default). | Yes | Yes | |
index\_recommendations\_enabled | If true, display recommendations to create indexes required to eliminate full table scans. For more details, see . | true | Yes | Yes | |
inject\_retry\_errors\_enabled | If true, any statement executed inside of an explicit transaction (with the exception of statements) will return a transaction retry error. If the client retries the transaction using the special , after the 3rd retry error, the transaction will proceed as normal. Otherwise, the errors will continue until inject\_retry\_errors\_enabled is set to false. For more details, see . | false | Yes | Yes | |
intervalstyle | The input string format for values. Accepted values include postgres, iso\_8601, and sql\_standard. | The value set by the sql.defaults.intervalstyle (postgres, by default). | Yes | Yes | |
is\_superuser | If on or true, the current user is a member of the . | User-dependent | No | Yes | |
large\_full\_scan\_rows | Determines which tables are considered “large” such that disallow\_full\_table\_scans rejects full table or index scans of “large” tables. The default value is 0, which disallows all full table or index scans. | User-dependent | No | Yes | |
legacy\_varchar\_typing | New in v24.3.2: If on, type checking and overload resolution for types ignore overloads that cause errors, allowing comparisons between VARCHAR and non-STRING-like placeholder values to execute successfully. If off, type checking of these comparisons is more strict and must be handled with explicit type casts. | on | Yes | Yes | |
locality | The location of the node. For more information, see . | Node-dependent | No | Yes | |
lock\_timeout | The amount of time a query can spend acquiring or waiting for a single . In CockroachDB, unlike in PostgreSQL, non-locking reads wait for conflicting locks to be released. As a result, the lock\_timeout configuration applies to writes, and to locking and non-locking reads in read-write and read-only transactions. If lock\_timeout = 0, queries do not timeout due to lock acquisitions. | The value set by the sql.defaults.lock\_timeout (0, by default) | Yes | Yes | |
multiple\_active\_portals\_enabled | Whether to enable the pgwire feature. | false | Yes | Yes | |
node\_id | The ID of the node currently connected to. This variable is particularly useful for verifying load balanced connections. | Node-dependent | No | Yes | |
null\_ordered\_last | Set the default ordering of NULLs. The default order is NULLs first for ascending order and NULLs last for descending order. | false | Yes | Yes | |
optimizer\_merge\_joins\_enabled | If on, the optimizer will explore query plans with merge joins. | on | Yes | Yes | |
optimizer\_push\_offset\_into\_index\_join | If on, the optimizer will attempt to push offset expressions into index join expressions to produce more efficient query plans. | on | Yes | Yes | |
optimizer\_use\_forecasts | If on, the optimizer uses forecasted statistics for query planning. | on | Yes | Yes | |
optimizer\_use\_histograms | If on, the optimizer uses collected histograms for cardinality estimation. | on | No | Yes | |
optimizer\_use\_improved\_multi\_column\_selectivity\_estimate | If on, the optimizer uses an improved selectivity estimate for multi-column predicates. | on | Yes | Yes | |
optimizer\_use\_improved\_zigzag\_join\_costing | If on, the cost of is updated so they will be never be chosen over scans unless they produce fewer rows. To take effect, the enable\_zigzag\_join setting must also be enabled. | on | Yes | Yes | |
optimizer\_use\_lock\_op\_for\_serializable | If on, the optimizer uses a Lock operator to construct query plans for SELECT statements using the clauses. This setting only affects SERIALIZABLE transactions. READ COMMITTED transactions are evaluated with the Lock operator regardless of the setting. | off | Yes | Yes | |
optimizer\_use\_merged\_partial\_statistics | If on, the optimizer uses merged with existing full for cardinality estimation. | off | Yes | Yes | |
optimizer\_use\_multicol\_stats | If on, the optimizer uses collected multi-column statistics for cardinality estimation. | on | No | Yes | |
optimizer\_use\_not\_visible\_indexes | If on, the optimizer uses not visible indexes for planning. | off | No | Yes | |
optimizer\_use\_virtual\_computed\_column\_stats | If on, the optimizer uses table statistics on . | on | Yes | Yes | |
plan\_cache\_mode | The type of plan that is cached in the : auto, force\_generic\_plan, or force\_custom\_plan. For more information, refer to . | force\_custom\_plan | Yes | Yes | |
plpgsql\_use\_strict\_into | If on, PL/pgSQL behave as though the STRICT option is specified. This causes the SQL statement to error if it does not return exactly one row. | off | Yes | Yes | |
pg\_trgm.similarity\_threshold | The threshold above which a string comparison returns true. The value must be between 0 and 1. For more information, see . | 0.3 | Yes | Yes | |
prefer\_lookup\_joins\_for\_fks | If on, the optimizer prefers to when performing checks. | off | Yes | Yes | |
reorder\_joins\_limit | Maximum number of joins that the optimizer will attempt to reorder when searching for an optimal query execution plan. For more information, see . | 8 | Yes | Yes | |
require\_explicit\_primary\_keys | If on, CockroachDB throws an error for all tables created without an explicit primary key defined. | off | Yes | Yes | |
search\_path | A list of schemas that will be searched to resolve unqualified table or function names. For more details, see . | public | Yes | Yes | |
serial\_normalization | Specifies the default handling of in table definitions. Valid options include 'rowid', 'virtual\_sequence', sql\_sequence, sql\_sequence\_cached, , and unordered\_rowid. If set to 'virtual\_sequence', the SERIAL type auto-creates a sequence for better compatibility with Hibernate sequences. If set to sql\_sequence\_cached or sql\_sequence\_cached\_node, you can use the sql.defaults.serial\_sequences\_cache\_size to control the number of values to cache in a user’s session, with a default of 256. If set to unordered\_rowid, the SERIAL type generates a globally unique 64-bit integer (a combination of the insert timestamp and the ID of the node executing the statement) that does not have unique ordering. | 'rowid' | Yes | Yes | |
server\_version | The version of PostgreSQL that CockroachDB emulates. | Version-dependent | No | Yes | |
server\_version\_num | The version of PostgreSQL that CockroachDB emulates. | Version-dependent | Yes | Yes | |
session\_id | The ID of the current session. | Session-dependent | No | Yes | |
session\_user | The user connected for the current session. | User in connection string | No | Yes | |
sql\_safe\_updates | If true, the following potentially unsafe SQL statements are disallowed: of a non-empty database and all dependent objects; and without a WHERE clause, unless a clause is included; and without a WHERE or clause; ; and converting an existing table to using , unless a has already been added to the table. For more details, refer to . | true for interactive sessions from the , false for sessions from other clients | Yes | Yes | |
statement\_timeout | The amount of time a statement can run before being stopped. This value can be an int (e.g., 10) and will be interpreted as milliseconds. It can also be an interval or string argument, where the string can be parsed as a valid interval (e.g., '4s'). A value of 0 turns it off. | The value set by the sql.defaults.statement\_timeout (0s, by default). | Yes | Yes | |
stub\_catalog\_tables | If off, querying an unimplemented, empty table will result in an error, as is the case in v20.2 and earlier. If on, querying an unimplemented, empty pg\_catalog table simply returns no rows. | on | Yes | Yes | |
timezone | The default time zone for the current session. | UTC | Yes | Yes | |
tracing | The trace recording state. | off | Yes | Yes | |
transaction\_isolation | The isolation level at which the transaction executes ( or ). See . | SERIALIZABLE | Yes | Yes | |
transaction\_priority | The priority of the current transaction. See Transactions: Transaction priorities for more details. This session variable was called transaction priority (with a space) in CockroachDB 1.x. It has been renamed for compatibility with PostgreSQL. | NORMAL | Yes | Yes | |
transaction\_read\_only | The access mode of the current transaction. See for more details. | off | Yes | Yes | |
transaction\_rows\_read\_err | The limit for the number of rows read by a SQL transaction. If this value is exceeded the transaction will fail (or the event will be logged to SQL\_INTERNAL\_PERF for internal transactions). | 0 | Yes | Yes | |
transaction\_rows\_read\_log | The threshold for the number of rows read by a SQL transaction. If this value is exceeded, the event will be logged to SQL\_PERF (or SQL\_INTERNAL\_PERF for internal transactions). | 0 | Yes | Yes | |
transaction\_rows\_written\_err | The limit for the number of rows written by a SQL transaction. If this value is exceeded the transaction will fail (or the event will be logged to SQL\_INTERNAL\_PERF for internal transactions). | 0 | Yes | Yes | |
transaction\_rows\_written\_log | The threshold for the number of rows written by a SQL transaction. If this value is exceeded, the event will be logged to SQL\_PERF (or SQL\_INTERNAL\_PERF for internal transactions). | 0 | Yes | Yes | |
transaction\_status | The state of the current transaction. See for more details. | NoTxn | No | Yes | |
transaction\_timeout | Aborts an explicit when it runs longer than the configured duration. Stored in milliseconds; can be expressed in milliseconds or as an . | 0 | Yes | Yes | |
troubleshooting\_mode\_enabled | When enabled, avoid performing additional work on queries, such as collecting and emitting telemetry data. This session variable is particularly useful when the cluster is experiencing issues, unavailability, or failure. | off | Yes | Yes | |
use\_declarative\_schema\_changer | Whether to use the declarative schema changer for supported statements. | on | Yes | Yes | |
vectorize | The vectorized execution engine mode. Options include on and off. For more details, see . | on | Yes | Yes | |
virtual\_cluster\_name | The name of the virtual cluster that the SQL client is connected to. | Session-dependent | No | Yes |
| Variable name | Initial value | Modify with ? | View with ? |
|---|---|---|---|
backslash\_quote | safe\_encoding | No | Yes |
client\_encoding | UTF8 | No | Yes |
default\_tablespace | No | Yes | |
enable\_drop\_enum\_value | off | Yes | Yes |
enable\_seqscan | on | Yes | Yes |
escape\_string\_warning | on | No | Yes |
experimental\_enable\_hash\_sharded\_indexes | off | Yes | Yes |
integer\_datetimes | on | No | Yes |
max\_identifier\_length | 128 | No | Yes |
max\_index\_keys | 32 | No | Yes |
row\_security | off | No | Yes |
standard\_conforming\_strings | on | No | Yes |
server\_encoding | UTF8 | Yes | Yes |
synchronize\_seqscans | on | No | Yes |
synchronous\_commit | on | Yes | Yes |
Special syntax cases
CockroachDB supports the following syntax cases, for compatibility with common SQL syntax patterns:| Syntax | Equivalent to | Notes |
|---|---|---|
USE ... | SET database = ... | This is provided as convenience for users with a MySQL/MSSQL background. |
SET NAMES ... | SET client\_encoding = ... | This is provided for compatibility with PostgreSQL clients. |
SET ROLE | SET role = | This is provided for compatibility with PostgreSQL clients. |
RESET ROLE | SET role = 'none'/SET role = current\_user() | This is provided for compatibility with PostgreSQL clients. |
SET SCHEMA | SET search\_path = | This is provided for better compatibility with PostgreSQL. |
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ... | SET default\_transaction\_isolation = ... | This is provided for compatibility with standard SQL. |
SET TIME ZONE ... | SET timezone = ... | This is provided for compatibility with PostgreSQL clients. |
Examples
Set simple variables
The following examples demonstrate how to useSET to configure the default database for the current session:
Set variables to values containing spaces
The following demonstrates how to use quoting to use values containing spaces:Set variables to a list of values
The following demonstrates how to assign a list of values:Reset a variable to its default value
Set a variable for the duration of a single transaction
To set a variable for the duration of a single transaction, use theSET LOCAL statement.
Roll back session variables set for a transaction
You can roll back session variable settings to .Assume another role
To assume another for the duration of a session, useSET ROLE <role>. SET ROLE <role> is equivalent to SET role = <role>.
To assume a new role, the current user must be a member of the
admin role, or a member of the target role.RESET ROLE is equivalent to SET role = 'none' and SET role = current_user().
SET LOCAL ROLE.
SET TIME ZONE
As a best practice, we recommend not using this setting and avoid setting a session time for your database. We instead recommend converting UTC values to the appropriate time zone on the client side.
SET TIME ZONE. This will apply an offset to all and values in the session. By default, CockroachDB uses UTC as the time zone for SET TIME ZONE offsets.
Parameters
The input passed toSET TIME ZONE indicates the time zone for the current session. This value can be a string representation of a local system-defined time zone (e.g., 'EST', 'America/New_York') or a positive or negative numeric offset from UTC (e.g., -7, +7, or UTC-7, UTC+7) or GMT (e.g., GMT-7, GMT+7). The numeric offset input can also be colon-delimited (e.g., -7:00, GMT+7:00).
When setting a time zone, note the following:
- Timezone abbreviations are case-insensitive.
- To see a list of supported timezones, their nicknames, and their offsets, run the following query:
DEFAULT,LOCAL, or0sets the session time zone toUTC.- Only offsets specified by integers (e.g.,
-7,7) use the ISO 8601 time offset (i.e., the offset input is parsed as hours east of UTC). If you explicitly specifyUTCorGMTfor the time zone offset (e.g.,UTC-7,GMT+7), or if the numeric input is colon-delimited (e.g.,-7:00,GMT+7:00), CockroachDB uses the POSIX time offset instead (i.e., hours west of the specified time zone). This means that specifying an offset of-7(i.e., -7 east of UTC) is equivalent to specifyingGMT+7(i.e., 7 west of UTC).
Example: Set the default time zone via SET TIME ZONE
SET TRACING
SET TRACING changes the trace recording state of the current session. A trace recording can be inspected with the statement.
| Value | Description |
|---|---|
off | Trace recording is disabled. |
cluster | Trace recording is enabled; distributed traces are collected. |
on | Same as cluster. |
kv | Same as cluster except that “kv messages” are collected instead of regular trace messages. See . |
results | Result rows and row counts are copied to the session trace. This must be specified in order for the output of a query to be printed in the session trace. Example: SET tracing = kv, results; |
Considerations
Session variable precedence
When a starts, CockroachDB determines the initial value of each by evaluating the settings in the following order (items earlier in the list take precedence over later items):- : A value supplied as a query parameter in the connection URL (for example,
.../movr?sslmode=disable&timezone=UTC). - : A value set by
ALTER ROLE {role_name} IN DATABASE {db_name} SET {var}={value}. - : A value set by
ALTER ROLE {role_name} SET {var}={value}. - : A value set by
ALTER ROLE ALL IN DATABASE {db_name} SET {var}={value}or equivalently byALTER DATABASE {db_name} SET {var}={value}. - : A value set by
ALTER ROLE ALL SET {var}={value}.
root user is only affected by values specified in the connection string.
You can also set session variables for the duration of a single transaction by using .
Changes to defaults using the preceding methods only apply to future sessions. This is because session variable resolution happens at session start time. To change a default value in an existing open session, set the variable explicitly with .
Known Limitations
SET does not properly apply within a transaction. For example, in the following transaction, showing the TIME ZONE does not return 2 as expected after the rollback:

