github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/logictest/testdata/logic_test/txn (about)

     1  # Transaction involving schema changes.
     2  statement ok
     3  BEGIN TRANSACTION
     4  
     5  statement ok
     6  CREATE TABLE kv (
     7    k VARCHAR PRIMARY KEY,
     8    v VARCHAR
     9  )
    10  
    11  statement ok
    12  INSERT INTO kv (k,v) VALUES ('a', 'b')
    13  
    14  query TT
    15  SELECT * FROM kv
    16  ----
    17  a b
    18  
    19  statement ok
    20  COMMIT TRANSACTION
    21  
    22  # A transaction to update kv.
    23  
    24  statement ok
    25  BEGIN TRANSACTION
    26  
    27  statement ok
    28  UPDATE kv SET v = 'c' WHERE k in ('a')
    29  
    30  query TT
    31  SELECT * FROM kv
    32  ----
    33  a c
    34  
    35  statement ok
    36  COMMIT TRANSACTION
    37  
    38  query TT
    39  SELECT * FROM kv
    40  ----
    41  a c
    42  
    43  # Rollback a transaction before committing.
    44  
    45  statement ok
    46  BEGIN TRANSACTION
    47  
    48  statement ok
    49  UPDATE kv SET v = 'b' WHERE k in ('a')
    50  
    51  query TT
    52  SELECT * FROM kv
    53  ----
    54  a b
    55  
    56  statement ok
    57  ROLLBACK TRANSACTION
    58  
    59  query TT
    60  SELECT * FROM kv
    61  ----
    62  a c
    63  
    64  # Statement execution should not depend on request boundaries.
    65  
    66  statement ok
    67  BEGIN TRANSACTION; UPDATE kv SET v = 'b' WHERE k in ('a')
    68  
    69  query TT
    70  SELECT * FROM kv
    71  ----
    72  a b
    73  
    74  query TT
    75  SELECT * FROM kv; COMMIT; BEGIN; UPDATE kv SET v = 'd' WHERE k in ('a')
    76  ----
    77  a b
    78  
    79  query TT
    80  SELECT * FROM kv; UPDATE kv SET v = 'c' WHERE k in ('a'); COMMIT
    81  ----
    82  a d
    83  
    84  query TT
    85  SELECT * FROM kv
    86  ----
    87  a c
    88  
    89  # Abort transaction with a syntax error, and ignore statements until the end of the transaction block
    90  
    91  statement ok
    92  BEGIN
    93  
    94  query error at or near ",": syntax error
    95  SELECT count(*, 1) FROM kv
    96  
    97  statement error pgcode 25P02 current transaction is aborted, commands ignored until end of transaction block
    98  UPDATE kv SET v = 'b' WHERE k in ('a')
    99  
   100  statement ok
   101  ROLLBACK
   102  
   103  query TT
   104  SELECT * FROM kv
   105  ----
   106  a c
   107  
   108  # Abort transaction with a problematic statement, and ignore statements until
   109  # the end of the transaction block (a COMMIT/ROLLBACK statement as the first
   110  # statement in a batch).
   111  
   112  statement ok
   113  BEGIN
   114  
   115  statement error duplicate key value \(k\)=\('a'\) violates unique constraint "primary"
   116  INSERT INTO kv VALUES('unique_key', 'some value');
   117  INSERT INTO kv VALUES('a', 'c');
   118  INSERT INTO kv VALUES('unique_key2', 'some value');
   119  COMMIT
   120  
   121  # Txn is still aborted.
   122  statement error current transaction is aborted, commands ignored until end of transaction block
   123  UPDATE kv SET v = 'b' WHERE k in ('a')
   124  
   125  # Txn is still aborted.
   126  statement error current transaction is aborted, commands ignored until end of transaction block
   127  UPDATE kv SET v = 'b' WHERE k in ('a')
   128  
   129  # Now the transaction will be ended. After that, statements execute.
   130  statement ok
   131  COMMIT;
   132  INSERT INTO kv VALUES('x', 'y')
   133  
   134  query TT rowsort
   135  SELECT * FROM kv
   136  ----
   137  a c
   138  x y
   139  
   140  # Two BEGINs in a row.
   141  
   142  statement ok
   143  BEGIN TRANSACTION
   144  
   145  statement error there is already a transaction in progress
   146  BEGIN TRANSACTION
   147  
   148  statement ok
   149  ROLLBACK TRANSACTION
   150  
   151  # BEGIN in the middle of a transaction is an error.
   152  
   153  statement ok
   154  BEGIN TRANSACTION
   155  
   156  statement ok
   157  UPDATE kv SET v = 'b' WHERE k in ('a')
   158  
   159  statement error there is already a transaction in progress
   160  BEGIN TRANSACTION
   161  
   162  statement error current transaction is aborted, commands ignored until end of transaction block
   163  SELECT * FROM kv
   164  
   165  statement ok
   166  ROLLBACK TRANSACTION
   167  
   168  # An empty transaction is allowed.
   169  
   170  statement ok
   171  BEGIN; COMMIT
   172  
   173  # END is same as commit
   174  statement ok
   175  BEGIN; END
   176  
   177  # COMMIT/ROLLBACK without a transaction are errors.
   178  
   179  statement error there is no transaction in progress
   180  COMMIT TRANSACTION
   181  
   182  statement error there is no transaction in progress
   183  ROLLBACK TRANSACTION
   184  
   185  # Set isolation level without a transaction is an error.
   186  
   187  statement error there is no transaction in progress
   188  SET TRANSACTION ISOLATION LEVEL SNAPSHOT
   189  
   190  statement ok
   191  BEGIN TRANSACTION ISOLATION LEVEL SNAPSHOT; COMMIT
   192  
   193  statement ok
   194  BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; COMMIT
   195  
   196  statement ok
   197  BEGIN TRANSACTION; SET TRANSACTION ISOLATION LEVEL SNAPSHOT; COMMIT
   198  
   199  statement ok
   200  BEGIN TRANSACTION; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; COMMIT
   201  
   202  # It is an error to change the isolation level of a running transaction.
   203  
   204  statement ok
   205  BEGIN TRANSACTION
   206  
   207  statement ok
   208  UPDATE kv SET v = 'b' WHERE k in ('a')
   209  
   210  statement ok
   211  ROLLBACK
   212  
   213  statement ok
   214  BEGIN TRANSACTION
   215  
   216  statement ok
   217  UPDATE kv SET v = 'b' WHERE k in ('a')
   218  
   219  statement ok
   220  ROLLBACK
   221  
   222  # Transactions default to serializable.
   223  
   224  statement ok
   225  BEGIN TRANSACTION
   226  
   227  query T
   228  SHOW TRANSACTION ISOLATION LEVEL
   229  ----
   230  serializable
   231  
   232  query T
   233  SHOW transaction_isolation
   234  ----
   235  serializable
   236  
   237  # SNAPSHOT is now mapped to serializable
   238  statement ok
   239  SET TRANSACTION ISOLATION LEVEL SNAPSHOT
   240  
   241  query T
   242  SHOW TRANSACTION ISOLATION LEVEL
   243  ----
   244  serializable
   245  
   246  query T
   247  SHOW transaction_isolation
   248  ----
   249  serializable
   250  
   251  statement ok
   252  COMMIT
   253  
   254  # We can't set isolation level to an unsupported one.
   255  
   256  statement error invalid value for parameter "transaction_isolation": "read committed"
   257  SET transaction_isolation = 'read committed'
   258  
   259  # We can explicitly start a transaction with isolation level
   260  # specified.
   261  
   262  statement ok
   263  BEGIN TRANSACTION ISOLATION LEVEL SNAPSHOT
   264  
   265  query T
   266  SHOW TRANSACTION ISOLATION LEVEL
   267  ----
   268  serializable
   269  
   270  statement ok
   271  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
   272  
   273  query T
   274  SHOW TRANSACTION ISOLATION LEVEL
   275  ----
   276  serializable
   277  
   278  statement ok
   279  COMMIT
   280  
   281  # User priority.
   282  
   283  statement error there is no transaction in progress
   284  SET TRANSACTION PRIORITY LOW
   285  
   286  statement ok
   287  BEGIN TRANSACTION PRIORITY LOW; COMMIT
   288  
   289  statement ok
   290  BEGIN TRANSACTION PRIORITY NORMAL; COMMIT
   291  
   292  statement ok
   293  BEGIN TRANSACTION PRIORITY HIGH; COMMIT
   294  
   295  statement ok
   296  BEGIN TRANSACTION; SET TRANSACTION PRIORITY LOW; COMMIT
   297  
   298  statement ok
   299  BEGIN TRANSACTION; SET TRANSACTION PRIORITY NORMAL; COMMIT
   300  
   301  statement ok
   302  BEGIN TRANSACTION; SET TRANSACTION PRIORITY HIGH; COMMIT
   303  
   304  # It is an error to change the user priority of a running transaction.
   305  
   306  statement ok
   307  BEGIN TRANSACTION
   308  
   309  statement ok
   310  UPDATE kv SET v = 'b' WHERE k in ('a')
   311  
   312  statement error cannot change the user priority of a running transaction
   313  SET TRANSACTION PRIORITY HIGH
   314  
   315  statement ok
   316  ROLLBACK
   317  
   318  statement ok
   319  BEGIN TRANSACTION
   320  
   321  statement ok
   322  UPDATE kv SET v = 'b' WHERE k in ('a')
   323  
   324  statement error cannot change the user priority of a running transaction
   325  SET TRANSACTION PRIORITY HIGH
   326  
   327  statement ok
   328  ROLLBACK
   329  
   330  # User priority default to normal
   331  
   332  statement ok
   333  BEGIN TRANSACTION
   334  
   335  query T
   336  SHOW TRANSACTION PRIORITY
   337  ----
   338  normal
   339  
   340  statement ok
   341  SET TRANSACTION PRIORITY HIGH
   342  
   343  query T
   344  SHOW TRANSACTION PRIORITY
   345  ----
   346  high
   347  
   348  statement ok
   349  COMMIT
   350  
   351  # We can explicitly start a transaction in low user priority.
   352  
   353  statement ok
   354  BEGIN TRANSACTION PRIORITY LOW
   355  
   356  query T
   357  SHOW TRANSACTION PRIORITY
   358  ----
   359  low
   360  
   361  statement ok
   362  SET TRANSACTION PRIORITY NORMAL
   363  
   364  query T
   365  SHOW TRANSACTION PRIORITY
   366  ----
   367  normal
   368  
   369  statement ok
   370  COMMIT
   371  
   372  # Transaction priority can be assigned a default value.
   373  
   374  query T
   375  SHOW DEFAULT_TRANSACTION_PRIORITY
   376  ----
   377  normal
   378  
   379  query T
   380  SHOW TRANSACTION PRIORITY
   381  ----
   382  normal
   383  
   384  statement ok
   385  SET DEFAULT_TRANSACTION_PRIORITY TO 'LOW'
   386  
   387  query T
   388  SHOW DEFAULT_TRANSACTION_PRIORITY
   389  ----
   390  low
   391  
   392  query T
   393  SHOW TRANSACTION PRIORITY
   394  ----
   395  low
   396  
   397  statement ok
   398  SET DEFAULT_TRANSACTION_PRIORITY TO 'NORMAL'
   399  
   400  query T
   401  SHOW DEFAULT_TRANSACTION_PRIORITY
   402  ----
   403  normal
   404  
   405  query T
   406  SHOW TRANSACTION PRIORITY
   407  ----
   408  normal
   409  
   410  statement ok
   411  SET DEFAULT_TRANSACTION_PRIORITY TO 'HIGH'
   412  
   413  query T
   414  SHOW DEFAULT_TRANSACTION_PRIORITY
   415  ----
   416  high
   417  
   418  query T
   419  SHOW TRANSACTION PRIORITY
   420  ----
   421  high
   422  
   423  statement ok
   424  SET SESSION CHARACTERISTICS AS TRANSACTION PRIORITY LOW
   425  
   426  query T
   427  SHOW DEFAULT_TRANSACTION_PRIORITY
   428  ----
   429  low
   430  
   431  query T
   432  SHOW TRANSACTION PRIORITY
   433  ----
   434  low
   435  
   436  statement ok
   437  SET SESSION CHARACTERISTICS AS TRANSACTION PRIORITY NORMAL
   438  
   439  query T
   440  SHOW DEFAULT_TRANSACTION_PRIORITY
   441  ----
   442  normal
   443  
   444  query T
   445  SHOW TRANSACTION PRIORITY
   446  ----
   447  normal
   448  
   449  statement ok
   450  SET SESSION CHARACTERISTICS AS TRANSACTION PRIORITY HIGH
   451  
   452  query T
   453  SHOW DEFAULT_TRANSACTION_PRIORITY
   454  ----
   455  high
   456  
   457  query T
   458  SHOW TRANSACTION PRIORITY
   459  ----
   460  high
   461  
   462  # Without the priority specified, BEGIN should use the default
   463  
   464  statement ok
   465  BEGIN
   466  
   467  query T
   468  SHOW TRANSACTION PRIORITY
   469  ----
   470  high
   471  
   472  statement ok
   473  COMMIT
   474  
   475  # With the priority specified, BEGIN PRIORITY overrides the default
   476  
   477  statement ok
   478  BEGIN TRANSACTION PRIORITY LOW
   479  
   480  query T
   481  SHOW TRANSACTION PRIORITY
   482  ----
   483  low
   484  
   485  statement ok
   486  COMMIT
   487  
   488  # Even after starting a transaction, the default priority can be overridden
   489  
   490  statement ok
   491  BEGIN
   492  
   493  query T
   494  SHOW TRANSACTION PRIORITY
   495  ----
   496  high
   497  
   498  statement ok
   499  SET TRANSACTION PRIORITY LOW
   500  
   501  query T
   502  SHOW TRANSACTION PRIORITY
   503  ----
   504  low
   505  
   506  statement ok
   507  COMMIT
   508  
   509  statement ok
   510  RESET DEFAULT_TRANSACTION_PRIORITY
   511  
   512  query T
   513  SHOW DEFAULT_TRANSACTION_PRIORITY
   514  ----
   515  normal
   516  
   517  # We can specify both isolation level and user priority.
   518  
   519  statement ok
   520  BEGIN TRANSACTION ISOLATION LEVEL SNAPSHOT, PRIORITY LOW; COMMIT
   521  
   522  statement ok
   523  BEGIN TRANSACTION PRIORITY LOW, ISOLATION LEVEL SNAPSHOT; COMMIT
   524  
   525  # We can explicitly start a transaction with specified isolation level and low user priority.
   526  
   527  statement ok
   528  BEGIN TRANSACTION ISOLATION LEVEL SNAPSHOT, PRIORITY LOW
   529  
   530  query T
   531  SHOW TRANSACTION ISOLATION LEVEL
   532  ----
   533  serializable
   534  
   535  query T
   536  SHOW TRANSACTION PRIORITY
   537  ----
   538  low
   539  
   540  statement ok
   541  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, PRIORITY HIGH
   542  
   543  query T
   544  SHOW TRANSACTION ISOLATION LEVEL
   545  ----
   546  serializable
   547  
   548  query T
   549  SHOW TRANSACTION PRIORITY
   550  ----
   551  high
   552  
   553  statement ok
   554  SET TRANSACTION PRIORITY NORMAL, ISOLATION LEVEL SNAPSHOT
   555  
   556  query T
   557  SHOW TRANSACTION ISOLATION LEVEL
   558  ----
   559  serializable
   560  
   561  query T
   562  SHOW TRANSACTION PRIORITY
   563  ----
   564  normal
   565  
   566  statement ok
   567  COMMIT
   568  
   569  statement ok
   570  SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SNAPSHOT
   571  
   572  query T
   573  SHOW DEFAULT_TRANSACTION_ISOLATION
   574  ----
   575  serializable
   576  
   577  # SHOW without a transaction should create an auto-transaction with the default level
   578  query T
   579  SHOW TRANSACTION ISOLATION LEVEL
   580  ----
   581  serializable
   582  
   583  statement ok
   584  SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE
   585  
   586  query T
   587  SHOW DEFAULT_TRANSACTION_ISOLATION
   588  ----
   589  serializable
   590  
   591  statement ok
   592  SET DEFAULT_TRANSACTION_ISOLATION TO 'SNAPSHOT'
   593  
   594  query T
   595  SHOW DEFAULT_TRANSACTION_ISOLATION
   596  ----
   597  serializable
   598  
   599  # Without the isolation level specified, BEGIN should use the default
   600  
   601  statement ok
   602  BEGIN
   603  
   604  query T
   605  SHOW TRANSACTION ISOLATION LEVEL
   606  ----
   607  serializable
   608  
   609  statement ok
   610  COMMIT
   611  
   612  # Setting user priority without isolation level should not change isolation level
   613  
   614  statement ok
   615  BEGIN TRANSACTION
   616  
   617  statement ok
   618  SET TRANSACTION ISOLATION LEVEL SNAPSHOT
   619  
   620  query T
   621  SHOW TRANSACTION ISOLATION LEVEL
   622  ----
   623  serializable
   624  
   625  statement ok
   626  SET TRANSACTION PRIORITY HIGH
   627  
   628  query T
   629  SHOW TRANSACTION ISOLATION LEVEL
   630  ----
   631  serializable
   632  
   633  statement ok
   634  COMMIT
   635  
   636  statement ok
   637  RESET DEFAULT_TRANSACTION_ISOLATION
   638  
   639  query T
   640  SHOW DEFAULT_TRANSACTION_ISOLATION
   641  ----
   642  serializable
   643  
   644  # SHOW TRANSACTION STATUS
   645  
   646  query T
   647  SHOW TRANSACTION STATUS
   648  ----
   649  NoTxn
   650  
   651  statement ok
   652  BEGIN
   653  
   654  query T
   655  SHOW TRANSACTION STATUS
   656  ----
   657  Open
   658  
   659  statement ok
   660  COMMIT
   661  
   662  query T
   663  SHOW TRANSACTION STATUS
   664  ----
   665  NoTxn
   666  
   667  statement ok
   668  BEGIN
   669  
   670  query error pq: relation "t\.b" does not exist
   671  SELECT a FROM t.b
   672  
   673  query T
   674  SHOW TRANSACTION STATUS
   675  ----
   676  Aborted
   677  
   678  statement ok
   679  ROLLBACK
   680  
   681  query T
   682  SHOW TRANSACTION STATUS
   683  ----
   684  NoTxn
   685  
   686  # CommitWait state
   687  statement ok
   688  BEGIN;SAVEPOINT cockroach_restart
   689  
   690  statement ok
   691  RELEASE SAVEPOINT cockroach_restart
   692  
   693  query T
   694  SHOW TRANSACTION STATUS
   695  ----
   696  CommitWait
   697  
   698  statement ok
   699  COMMIT
   700  
   701  # Aborted state
   702  # The SELECT 1 is necessary to move the txn out of the AutoRetry state,
   703  # otherwise the next statement is automatically retried on the server.
   704  statement ok
   705  BEGIN TRANSACTION; SAVEPOINT cockroach_restart; SELECT 1
   706  
   707  query error pgcode 40001 restart transaction: crdb_internal.force_retry\(\): TransactionRetryWithProtoRefreshError: forced by crdb_internal.force_retry\(\)
   708  SELECT crdb_internal.force_retry('1h':::INTERVAL)
   709  
   710  query T
   711  SHOW TRANSACTION STATUS
   712  ----
   713  Aborted
   714  
   715  statement ok
   716  ROLLBACK TO SAVEPOINT cockroach_restart
   717  
   718  query T
   719  SHOW TRANSACTION STATUS
   720  ----
   721  Open
   722  
   723  statement ok
   724  COMMIT
   725  
   726  
   727  # Automatic retries for the first batch.
   728  # We use a sequence to avoid busy-looping the test.
   729  statement ok
   730  CREATE SEQUENCE s;
   731    BEGIN TRANSACTION;
   732    SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h':::INTERVAL), 0)
   733  
   734  # Demonstrate that the txn was indeed retried.
   735  query I
   736  SELECT currval('s')
   737  ----
   738  3
   739  
   740  statement ok
   741  ROLLBACK;
   742    DROP SEQUENCE s
   743  
   744  # Automatic retries for the first batch even when that first batch comes after
   745  # the BEGIN.
   746  statement ok
   747  CREATE SEQUENCE s;
   748    BEGIN TRANSACTION;
   749  
   750  statement ok
   751  SELECT 1;
   752    SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h':::INTERVAL), 0)
   753  
   754  # Demonstrate that the txn was indeed retried.
   755  query I
   756  SELECT currval('s')
   757  ----
   758  3
   759  
   760  statement ok
   761  ROLLBACK;
   762    DROP SEQUENCE s
   763  
   764  # Automatic retries for the first batch even when that first batch comes after
   765  # the BEGIN and the BEGIN also has special statements that don't move the txn
   766  # state out of the "AutoRetry" state.
   767  statement ok
   768  CREATE SEQUENCE s;
   769    BEGIN TRANSACTION;
   770    SAVEPOINT cockroach_restart;
   771    SET TRANSACTION PRIORITY HIGH;
   772    SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
   773  
   774  statement ok
   775  SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h':::INTERVAL), 0)
   776  
   777  # Demonstrate that the txn was indeed retried.
   778  query I
   779  SELECT currval('s')
   780  ----
   781  3
   782  
   783  query T
   784  SHOW TRANSACTION ISOLATION LEVEL
   785  ----
   786  serializable
   787  
   788  query T
   789  SHOW TRANSACTION PRIORITY
   790  ----
   791  high
   792  
   793  statement ok
   794  ROLLBACK;
   795    DROP SEQUENCE s
   796  
   797  # Like above, but the SAVEPOINT is its own batch.
   798  statement ok
   799  CREATE SEQUENCE s;
   800    BEGIN TRANSACTION
   801  
   802  statement ok
   803  SAVEPOINT cockroach_restart;
   804  
   805  statement ok
   806  SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h':::INTERVAL), 0)
   807  
   808  # Demonstrate that the txn was indeed retried.
   809  query I
   810  SELECT currval('s')
   811  ----
   812  3
   813  
   814  statement ok
   815  ROLLBACK;
   816    DROP SEQUENCE s
   817  
   818  
   819  # Automatic retries for the first batch after an explicit restart.
   820  statement ok
   821  CREATE SEQUENCE s;
   822    BEGIN TRANSACTION;
   823    SAVEPOINT cockroach_restart;
   824    SELECT 1;
   825  
   826  query error pgcode 40001 restart transaction: crdb_internal.force_retry\(\): TransactionRetryWithProtoRefreshError: forced by crdb_internal.force_retry\(\)
   827  SELECT crdb_internal.force_retry('1h':::INTERVAL)
   828  
   829  statement ok
   830  ROLLBACK TO SAVEPOINT COCKROACH_RESTART;
   831  
   832  # This is the automatic retry we care about.
   833  statement ok
   834  SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h':::INTERVAL), 0)
   835  
   836  # Demonstrate that the txn was indeed retried.
   837  query I
   838  SELECT currval('s')
   839  ----
   840  3
   841  
   842  statement ok
   843  ROLLBACK;
   844    DROP SEQUENCE s
   845  
   846  
   847  # Test READ ONLY/WRITE syntax.
   848  
   849  statement ok
   850  BEGIN
   851  
   852  query T
   853  SHOW transaction_read_only
   854  ----
   855  off
   856  
   857  statement ok
   858  SET TRANSACTION READ ONLY
   859  
   860  query T
   861  SHOW transaction_read_only
   862  ----
   863  on
   864  
   865  statement ok
   866  SET TRANSACTION READ WRITE
   867  
   868  query T
   869  SHOW transaction_read_only
   870  ----
   871  off
   872  
   873  statement ok
   874  SET transaction_read_only = true
   875  
   876  query T
   877  SHOW transaction_read_only
   878  ----
   879  on
   880  
   881  statement ok
   882  SET transaction_read_only = false
   883  
   884  query T
   885  SHOW transaction_read_only
   886  ----
   887  off
   888  
   889  statement error read mode specified multiple times
   890  SET TRANSACTION READ ONLY, READ WRITE
   891  
   892  statement ok
   893  ROLLBACK
   894  
   895  statement ok
   896  BEGIN READ WRITE
   897  
   898  query T
   899  SHOW transaction_read_only
   900  ----
   901  off
   902  
   903  statement ok
   904  COMMIT
   905  
   906  statement ok
   907  BEGIN READ ONLY
   908  
   909  query T
   910  SHOW transaction_read_only
   911  ----
   912  on
   913  
   914  statement ok
   915  COMMIT
   916  
   917  # Test default read-only status.
   918  query T
   919  SHOW default_transaction_read_only
   920  ----
   921  off
   922  
   923  statement ok
   924  SET default_transaction_read_only = true
   925  
   926  query T
   927  SHOW default_transaction_read_only
   928  ----
   929  on
   930  
   931  statement ok
   932  SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
   933  
   934  query T
   935  SHOW default_transaction_read_only
   936  ----
   937  off
   938  
   939  statement ok
   940  SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
   941  
   942  query T
   943  SHOW default_transaction_read_only
   944  ----
   945  on
   946  
   947  statement ok
   948  BEGIN
   949  
   950  statement ok
   951  SAVEPOINT cockroach_restart
   952  
   953  query T
   954  SHOW transaction_read_only
   955  ----
   956  on
   957  
   958  # Can override setting.
   959  statement ok
   960  SET TRANSACTION READ WRITE
   961  
   962  query T
   963  SHOW transaction_read_only
   964  ----
   965  off
   966  
   967  # Rolling back to savepoint doesn't reset to default.
   968  # TODO(jordan) fix this if necessary.
   969  statement ok
   970  ROLLBACK TO SAVEPOINT cockroach_restart
   971  
   972  query T
   973  SHOW transaction_read_only
   974  ----
   975  off
   976  
   977  statement ok
   978  COMMIT
   979  
   980  # BEGIN READ WRITE overrides READ ONLY default
   981  statement ok
   982  BEGIN READ WRITE
   983  
   984  statement ok
   985  CREATE SEQUENCE a
   986  
   987  statement ok
   988  COMMIT
   989  
   990  statement error cannot execute CREATE TABLE in a read-only transaction
   991  CREATE TABLE tab (a int)
   992  
   993  statement error cannot execute INSERT in a read-only transaction
   994  INSERT INTO kv VALUES('foo')
   995  
   996  statement error cannot execute UPDATE in a read-only transaction
   997  UPDATE kv SET v = 'foo'
   998  
   999  statement error cannot execute UPSERT in a read-only transaction
  1000  UPSERT INTO kv VALUES('foo')
  1001  
  1002  statement error cannot execute DELETE in a read-only transaction
  1003  DELETE FROM kv
  1004  
  1005  statement error cannot execute nextval\(\) in a read-only transaction
  1006  SELECT nextval('a')
  1007  
  1008  statement error cannot execute setval\(\) in a read-only transaction
  1009  SELECT setval('a', 2)
  1010  
  1011  query T
  1012  SHOW TRANSACTION STATUS
  1013  ----
  1014  NoTxn
  1015  
  1016  statement error read mode specified multiple times
  1017  BEGIN READ WRITE, READ ONLY
  1018  
  1019  statement error user priority specified multiple times
  1020  BEGIN PRIORITY LOW, PRIORITY HIGH
  1021  
  1022  statement error isolation level specified multiple times
  1023  BEGIN ISOLATION LEVEL SERIALIZABLE, ISOLATION LEVEL SERIALIZABLE
  1024  
  1025  # Retryable error in a txn that hasn't performed any KV operations. It used to
  1026  # not work.
  1027  # The SELECT 1 is necessary to take the session out of the AutoRetry state,
  1028  # otherwise the statement below would be retries automatically.
  1029  statement ok
  1030  BEGIN; SELECT 1
  1031  
  1032  query error pgcode 40001 restart transaction: crdb_internal.force_retry\(\): TransactionRetryWithProtoRefreshError: forced by crdb_internal.force_retry\(\)
  1033  SELECT crdb_internal.force_retry('1h':::INTERVAL)
  1034  
  1035  statement ok
  1036  ROLLBACK
  1037  
  1038  # restore the default
  1039  statement ok
  1040  SET default_transaction_read_only = false