diff --git a/pkg/ccl/backupccl/backup_planning.go b/pkg/ccl/backupccl/backup_planning.go
index 0a26c2be949f..b6277556a213 100644
--- a/pkg/ccl/backupccl/backup_planning.go
+++ b/pkg/ccl/backupccl/backup_planning.go
@@ -653,8 +653,8 @@ func backupPlanHook(
ctx, span := tracing.ChildSpan(ctx, stmt.StatementTag())
defer span.Finish()
- if !(p.ExtendedEvalContext().TxnImplicit || backupStmt.Options.Detached) {
- return errors.Errorf("BACKUP cannot be used inside a transaction without DETACHED option")
+ if !(p.IsAutoCommit() || backupStmt.Options.Detached) {
+ return errors.Errorf("BACKUP cannot be used inside a multi-statement transaction without DETACHED option")
}
subdir, err := subdirFn()
diff --git a/pkg/ccl/backupccl/backup_rand_test.go b/pkg/ccl/backupccl/backup_rand_test.go
index 89f2104702db..4208f0673410 100644
--- a/pkg/ccl/backupccl/backup_rand_test.go
+++ b/pkg/ccl/backupccl/backup_rand_test.go
@@ -115,7 +115,8 @@ database_name = 'rand' AND schema_name = 'public'`)
// and per-table restores) work properly with two kinds of table backups
// (full database backups and per-table backups).
for _, backup := range dbBackups {
- sqlDB.Exec(t, "DROP DATABASE IF EXISTS restoredb; CREATE DATABASE restoredb")
+ sqlDB.Exec(t, "DROP DATABASE IF EXISTS restoredb")
+ sqlDB.Exec(t, "CREATE DATABASE restoredb")
if err := verifyBackupRestoreStatementResult(
t, sqlDB, "RESTORE rand.* FROM $1 WITH OPTIONS (into_db='restoredb')", backup,
); err != nil {
@@ -135,7 +136,8 @@ database_name = 'rand' AND schema_name = 'public'`)
tableNameCombos := powerset(tableNames)
for i, combo := range tableNameCombos {
- sqlDB.Exec(t, "DROP DATABASE IF EXISTS restoredb; CREATE DATABASE restoredb")
+ sqlDB.Exec(t, "DROP DATABASE IF EXISTS restoredb")
+ sqlDB.Exec(t, "CREATE DATABASE restoredb")
backupTarget := fmt.Sprintf("%s%d", localFoo, i)
if len(combo) == 0 {
continue
diff --git a/pkg/ccl/backupccl/backup_test.go b/pkg/ccl/backupccl/backup_test.go
index 677c9849d25c..ac207868a928 100644
--- a/pkg/ccl/backupccl/backup_test.go
+++ b/pkg/ccl/backupccl/backup_test.go
@@ -2413,48 +2413,37 @@ func TestBackupRestoreUserDefinedSchemas(t *testing.T) {
defer cleanupFn()
var ts1, ts2, ts3, ts4, ts5, ts6 string
- sqlDB.Exec(t, `
-CREATE DATABASE d;
-USE d;
-
-CREATE SCHEMA sc;
-CREATE SCHEMA sc2;
-CREATE TABLE d.sc.t1 (x int);
-CREATE TABLE d.sc2.t1 (x bool);
-`)
+ sqlDB.Exec(t, `CREATE DATABASE d;`)
+ sqlDB.Exec(t, `USE d;`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc;`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc2;`)
+ sqlDB.Exec(t, `CREATE TABLE d.sc.t1 (x int);`)
+ sqlDB.Exec(t, `CREATE TABLE d.sc2.t1 (x bool);`)
sqlDB.QueryRow(t, `SELECT cluster_logical_timestamp()`).Scan(&ts1)
- sqlDB.Exec(t, `
-ALTER SCHEMA sc RENAME TO sc3;
-ALTER SCHEMA sc2 RENAME TO sc;
-`)
+ sqlDB.Exec(t, `ALTER SCHEMA sc RENAME TO sc3;`)
+ sqlDB.Exec(t, `ALTER SCHEMA sc2 RENAME TO sc;`)
sqlDB.QueryRow(t, `SELECT cluster_logical_timestamp()`).Scan(&ts2)
- sqlDB.Exec(t, `
-DROP TABLE sc.t1;
-DROP TABLE sc3.t1;
-DROP SCHEMA sc;
-DROP SCHEMA sc3;
-`)
+ sqlDB.Exec(t, `DROP TABLE sc.t1;`)
+ sqlDB.Exec(t, `DROP TABLE sc3.t1;`)
+ sqlDB.Exec(t, `DROP SCHEMA sc;`)
+ sqlDB.Exec(t, `DROP SCHEMA sc3;`)
sqlDB.QueryRow(t, `SELECT cluster_logical_timestamp()`).Scan(&ts3)
- sqlDB.Exec(t, `
- CREATE SCHEMA sc;
- CREATE TABLE sc.t1 (a STRING);
+ sqlDB.Exec(t, `CREATE SCHEMA sc;`)
+ sqlDB.Exec(t, `CREATE TABLE sc.t1 (a STRING);
`)
sqlDB.QueryRow(t, `SELECT cluster_logical_timestamp()`).Scan(&ts4)
sqlDB.Exec(t, `BACKUP DATABASE d TO 'nodelocal://0/rev-history-backup' WITH revision_history`)
- sqlDB.Exec(t, `
-DROP TABLE sc.t1;
-DROP SCHEMA sc;
+ sqlDB.Exec(t, `DROP TABLE sc.t1;`)
+ sqlDB.Exec(t, `DROP SCHEMA sc;
`)
sqlDB.QueryRow(t, `SELECT cluster_logical_timestamp()`).Scan(&ts5)
- sqlDB.Exec(t, `
-CREATE SCHEMA sc;
-CREATE TABLE sc.t1 (a FLOAT);
-`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc;`)
+ sqlDB.Exec(t, `CREATE TABLE sc.t1 (a FLOAT);`)
sqlDB.QueryRow(t, `SELECT cluster_logical_timestamp()`).Scan(&ts6)
sqlDB.Exec(t, `BACKUP DATABASE d TO 'nodelocal://0/rev-history-backup' WITH revision_history`)
@@ -2500,17 +2489,15 @@ CREATE TABLE sc.t1 (a FLOAT);
t.Run("full-cluster", func(t *testing.T) {
_, sqlDB, dataDir, cleanupFn := backupRestoreTestSetup(t, singleNode, 0, InitManualReplication)
defer cleanupFn()
- sqlDB.Exec(t, `
-CREATE DATABASE d;
-USE d;
-CREATE SCHEMA unused;
-CREATE SCHEMA sc;
-CREATE TABLE sc.tb1 (x INT);
-INSERT INTO sc.tb1 VALUES (1);
-CREATE TYPE sc.typ1 AS ENUM ('hello');
-CREATE TABLE sc.tb2 (x sc.typ1);
-INSERT INTO sc.tb2 VALUES ('hello');
-`)
+ sqlDB.Exec(t, `CREATE DATABASE d;`)
+ sqlDB.Exec(t, `USE d;`)
+ sqlDB.Exec(t, `CREATE SCHEMA unused;`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc;`)
+ sqlDB.Exec(t, `CREATE TABLE sc.tb1 (x INT);`)
+ sqlDB.Exec(t, `INSERT INTO sc.tb1 VALUES (1);`)
+ sqlDB.Exec(t, `CREATE TYPE sc.typ1 AS ENUM ('hello');`)
+ sqlDB.Exec(t, `CREATE TABLE sc.tb2 (x sc.typ1);`)
+ sqlDB.Exec(t, `INSERT INTO sc.tb2 VALUES ('hello');`)
// Now backup the full cluster.
sqlDB.Exec(t, `BACKUP TO 'nodelocal://0/test/'`)
// Start a new server that shares the data directory.
@@ -2535,17 +2522,15 @@ INSERT INTO sc.tb2 VALUES ('hello');
_, sqlDB, _, cleanupFn := backupRestoreTestSetup(t, singleNode, 0, InitManualReplication)
defer cleanupFn()
- sqlDB.Exec(t, `
-CREATE DATABASE d;
-USE d;
-CREATE SCHEMA sc;
-CREATE SCHEMA unused;
-CREATE TABLE sc.tb1 (x INT);
-INSERT INTO sc.tb1 VALUES (1);
-CREATE TYPE sc.typ1 AS ENUM ('hello');
-CREATE TABLE sc.tb2 (x sc.typ1);
-INSERT INTO sc.tb2 VALUES ('hello');
-`)
+ sqlDB.Exec(t, `CREATE DATABASE d;`)
+ sqlDB.Exec(t, `USE d;`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc;`)
+ sqlDB.Exec(t, `CREATE SCHEMA unused;`)
+ sqlDB.Exec(t, `CREATE TABLE sc.tb1 (x INT);`)
+ sqlDB.Exec(t, `INSERT INTO sc.tb1 VALUES (1);`)
+ sqlDB.Exec(t, `CREATE TYPE sc.typ1 AS ENUM ('hello');`)
+ sqlDB.Exec(t, `CREATE TABLE sc.tb2 (x sc.typ1);`)
+ sqlDB.Exec(t, `INSERT INTO sc.tb2 VALUES ('hello');`)
// Backup the database.
sqlDB.Exec(t, `BACKUP DATABASE d TO 'nodelocal://0/test/'`)
@@ -2569,25 +2554,23 @@ INSERT INTO sc.tb2 VALUES ('hello');
_, sqlDB, _, cleanupFn := backupRestoreTestSetup(t, singleNode, 0, InitManualReplication)
defer cleanupFn()
- sqlDB.Exec(t, `
-CREATE TABLE table_in_data (x INT);
+ sqlDB.Exec(t, `CREATE TABLE table_in_data (x INT);`)
-CREATE SCHEMA data;
-CREATE TABLE data.tb1 (x INT);
+ sqlDB.Exec(t, `CREATE SCHEMA data;`)
+ sqlDB.Exec(t, `CREATE TABLE data.tb1 (x INT);`)
-CREATE DATABASE foo;
-USE foo;
-CREATE SCHEMA schema_in_foo;
-CREATE TABLE schema_in_foo.tb1 (x INT);
+ sqlDB.Exec(t, `CREATE DATABASE foo;`)
+ sqlDB.Exec(t, `USE foo;`)
+ sqlDB.Exec(t, `CREATE SCHEMA schema_in_foo;`)
+ sqlDB.Exec(t, `CREATE TABLE schema_in_foo.tb1 (x INT);`)
-CREATE SCHEMA schema_in_foo2;
-CREATE TABLE schema_in_foo2.tb1 (x INT);
+ sqlDB.Exec(t, `CREATE SCHEMA schema_in_foo2;`)
+ sqlDB.Exec(t, `CREATE TABLE schema_in_foo2.tb1 (x INT);`)
-CREATE SCHEMA foo;
-CREATE TABLE foo.tb1 (x INT);
+ sqlDB.Exec(t, `CREATE SCHEMA foo;`)
+ sqlDB.Exec(t, `CREATE TABLE foo.tb1 (x INT);`)
-CREATE TABLE tb2 (y INT);
-`)
+ sqlDB.Exec(t, `CREATE TABLE tb2 (y INT);`)
for _, tc := range []struct {
name string
@@ -2635,16 +2618,14 @@ table_name from [SHOW TABLES FROM restore] ORDER BY schema_name, table_name`, tc
_, sqlDB, _, cleanupFn := backupRestoreTestSetup(t, singleNode, 0, InitManualReplication)
defer cleanupFn()
- sqlDB.Exec(t, `
-CREATE DATABASE d;
-USE d;
-CREATE SCHEMA sc;
-CREATE TYPE sc.typ1 AS ENUM ('hello');
-CREATE TABLE sc.tb1 (x sc.typ1);
-INSERT INTO sc.tb1 VALUES ('hello');
-CREATE TABLE sc.tb2 (x INT);
-INSERT INTO sc.tb2 VALUES (1);
-`)
+ sqlDB.Exec(t, `CREATE DATABASE d;`)
+ sqlDB.Exec(t, `USE d;`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc;`)
+ sqlDB.Exec(t, `CREATE TYPE sc.typ1 AS ENUM ('hello');`)
+ sqlDB.Exec(t, `CREATE TABLE sc.tb1 (x sc.typ1);`)
+ sqlDB.Exec(t, `INSERT INTO sc.tb1 VALUES ('hello');`)
+ sqlDB.Exec(t, `CREATE TABLE sc.tb2 (x INT);`)
+ sqlDB.Exec(t, `INSERT INTO sc.tb2 VALUES (1);`)
{
// We have to qualify the table correctly to back it up. d.tb1 resolves
// to d.public.tb1.
@@ -2693,25 +2674,23 @@ INSERT INTO sc.tb2 VALUES (1);
defer cleanupFn()
kvDB := tc.Server(0).DB()
- sqlDB.Exec(t, `
-CREATE DATABASE d1;
-USE d1;
-CREATE SCHEMA sc1;
-CREATE TABLE sc1.tb (x INT);
-INSERT INTO sc1.tb VALUES (1);
-CREATE SCHEMA sc2;
-CREATE TABLE sc2.tb (x INT);
-INSERT INTO sc2.tb VALUES (2);
-
-CREATE DATABASE d2;
-USE d2;
-CREATE SCHEMA sc3;
-CREATE TABLE sc3.tb (x INT);
-INSERT INTO sc3.tb VALUES (3);
-CREATE SCHEMA sc4;
-CREATE TABLE sc4.tb (x INT);
-INSERT INTO sc4.tb VALUES (4);
-`)
+ sqlDB.Exec(t, `CREATE DATABASE d1;`)
+ sqlDB.Exec(t, `USE d1;`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc1;`)
+ sqlDB.Exec(t, `CREATE TABLE sc1.tb (x INT);`)
+ sqlDB.Exec(t, `INSERT INTO sc1.tb VALUES (1);`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc2;`)
+ sqlDB.Exec(t, `CREATE TABLE sc2.tb (x INT);`)
+ sqlDB.Exec(t, `INSERT INTO sc2.tb VALUES (2);`)
+
+ sqlDB.Exec(t, `CREATE DATABASE d2;`)
+ sqlDB.Exec(t, `USE d2;`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc3;`)
+ sqlDB.Exec(t, `CREATE TABLE sc3.tb (x INT);`)
+ sqlDB.Exec(t, `INSERT INTO sc3.tb VALUES (3);`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc4;`)
+ sqlDB.Exec(t, `CREATE TABLE sc4.tb (x INT);`)
+ sqlDB.Exec(t, `INSERT INTO sc4.tb VALUES (4);`)
{
// Backup all databases.
sqlDB.Exec(t, `BACKUP DATABASE d1, d2 TO 'nodelocal://0/test/'`)
@@ -2751,14 +2730,12 @@ INSERT INTO sc4.tb VALUES (4);
_, sqlDB, _, cleanupFn := backupRestoreTestSetup(t, singleNode, 0, InitManualReplication)
defer cleanupFn()
- sqlDB.Exec(t, `
-CREATE DATABASE d;
-USE d;
-CREATE SCHEMA sc;
-CREATE TYPE sc.typ1 AS ENUM ('hello');
-CREATE TABLE sc.tb1 (x sc.typ1);
-INSERT INTO sc.tb1 VALUES ('hello');
-`)
+ sqlDB.Exec(t, `CREATE DATABASE d;`)
+ sqlDB.Exec(t, `USE d;`)
+ sqlDB.Exec(t, `CREATE SCHEMA sc;`)
+ sqlDB.Exec(t, `CREATE TYPE sc.typ1 AS ENUM ('hello');`)
+ sqlDB.Exec(t, `CREATE TABLE sc.tb1 (x sc.typ1);`)
+ sqlDB.Exec(t, `INSERT INTO sc.tb1 VALUES ('hello');`)
// Take a backup.
sqlDB.Exec(t, `BACKUP TABLE d.sc.tb1 TO 'nodelocal://0/test/'`)
// Now drop the table.
@@ -4281,7 +4258,9 @@ func TestRestoreAsOfSystemTime(t *testing.T) {
t, fmt.Sprintf(`RESTORE data.* FROM $1 AS OF SYSTEM TIME %s WITH into_db='err'`, i),
latestBackup,
)
- sqlDB.Exec(t, `DROP DATABASE err; CREATE DATABASE err`)
+ sqlDB.Exec(t, `DROP DATABASE err`)
+ sqlDB.Exec(t, `CREATE DATABASE err`)
+
} else {
sqlDB.ExpectErr(
t, "invalid RESTORE timestamp",
@@ -4299,7 +4278,8 @@ func TestRestoreAsOfSystemTime(t *testing.T) {
t, fmt.Sprintf(`RESTORE data.* FROM $1, $2, $3 AS OF SYSTEM TIME %s WITH into_db='err'`, i),
latestBackup, incLatestBackup, inc2LatestBackup,
)
- sqlDB.Exec(t, `DROP DATABASE err; CREATE DATABASE err`)
+ sqlDB.Exec(t, `DROP DATABASE err`)
+ sqlDB.Exec(t, `CREATE DATABASE err`)
} else {
sqlDB.ExpectErr(
t, "invalid RESTORE timestamp",
@@ -5548,7 +5528,7 @@ func TestDetachedBackup(t *testing.T) {
return tx.QueryRow(`BACKUP DATABASE data TO $1`, localFoo).Scan(&jobID)
})
require.True(t, testutils.IsError(err,
- "BACKUP cannot be used inside a transaction without DETACHED option"))
+ "BACKUP cannot be used inside a multi-statement transaction without DETACHED option"))
// Okay to run DETACHED backup, even w/out explicit transaction.
sqlDB.QueryRow(t, `BACKUP DATABASE data TO $1 WITH DETACHED`, localFoo).Scan(&jobID)
@@ -5602,7 +5582,7 @@ func TestDetachedRestore(t *testing.T) {
return tx.QueryRow(`RESTORE TABLE t FROM $1 WITH INTO_DB=test`, localFoo).Scan(&jobID)
})
require.True(t, testutils.IsError(err,
- "RESTORE cannot be used inside a transaction without DETACHED option"))
+ "RESTORE cannot be used inside a multi-statement transaction without DETACHED option"))
// Okay to run DETACHED RESTORE, even w/out explicit transaction.
sqlDB.QueryRow(t, `RESTORE TABLE t FROM $1 WITH DETACHED, INTO_DB=test`,
@@ -9277,11 +9257,9 @@ func TestDroppedDescriptorRevisionAndSystemDBIDClash(t *testing.T) {
_, sqlDB, tempDir, cleanupFn := backupRestoreTestSetup(t, singleNode, 1, InitManualReplication)
defer cleanupFn()
- sqlDB.Exec(t, `
-CREATE TABLE foo (id INT);
-BACKUP TO 'nodelocal://0/foo' WITH revision_history;
-DROP TABLE foo;
-`)
+ sqlDB.Exec(t, `CREATE TABLE foo (id INT);`)
+ sqlDB.Exec(t, `BACKUP TO 'nodelocal://0/foo' WITH revision_history;`)
+ sqlDB.Exec(t, `DROP TABLE foo;`)
var aost string
sqlDB.QueryRow(t, "SELECT cluster_logical_timestamp()").Scan(&aost)
@@ -9357,15 +9335,13 @@ func TestRestoreRemappingOfExistingUDTInColExpr(t *testing.T) {
_, sqlDB, _, cleanupFn := backupRestoreTestSetup(t, singleNode, numAccounts, InitManualReplication)
defer cleanupFn()
- sqlDB.Exec(t, `
-CREATE TYPE status AS ENUM ('open', 'closed', 'inactive');
-CREATE TABLE foo (id INT PRIMARY KEY, what status default 'open');
-BACKUP DATABASE data to 'nodelocal://0/foo';
-DROP TABLE foo CASCADE;
-DROP TYPE status;
-CREATE TYPE status AS ENUM ('open', 'closed', 'inactive');
-RESTORE TABLE foo FROM 'nodelocal://0/foo';
-`)
+ sqlDB.Exec(t, `CREATE TYPE status AS ENUM ('open', 'closed', 'inactive');`)
+ sqlDB.Exec(t, `CREATE TABLE foo (id INT PRIMARY KEY, what status default 'open');`)
+ sqlDB.Exec(t, `BACKUP DATABASE data to 'nodelocal://0/foo';`)
+ sqlDB.Exec(t, `DROP TABLE foo CASCADE;`)
+ sqlDB.Exec(t, `DROP TYPE status;`)
+ sqlDB.Exec(t, `CREATE TYPE status AS ENUM ('open', 'closed', 'inactive');`)
+ sqlDB.Exec(t, `RESTORE TABLE foo FROM 'nodelocal://0/foo';`)
}
// TestGCDropIndexSpanExpansion is a regression test for
@@ -9398,13 +9374,12 @@ func TestGCDropIndexSpanExpansion(t *testing.T) {
sqlRunner := sqlutils.MakeSQLRunner(conn)
sqlRunner.Exec(t, `SET CLUSTER SETTING kv.closed_timestamp.target_duration = '100ms'`) // speeds up the test
- sqlRunner.Exec(t, `
-CREATE DATABASE test; USE test;
-CREATE TABLE foo (id INT PRIMARY KEY, id2 INT, id3 INT, INDEX bar (id2), INDEX baz(id3));
-ALTER INDEX foo@bar CONFIGURE ZONE USING gc.ttlseconds = '1';
-INSERT INTO foo VALUES (1, 2, 3);
-DROP INDEX foo@bar;
-`)
+ sqlRunner.Exec(t, `CREATE DATABASE test;`)
+ sqlRunner.Exec(t, ` USE test;`)
+ sqlRunner.Exec(t, `CREATE TABLE foo (id INT PRIMARY KEY, id2 INT, id3 INT, INDEX bar (id2), INDEX baz(id3));`)
+ sqlRunner.Exec(t, `ALTER INDEX foo@bar CONFIGURE ZONE USING gc.ttlseconds = '1';`)
+ sqlRunner.Exec(t, `INSERT INTO foo VALUES (1, 2, 3);`)
+ sqlRunner.Exec(t, `DROP INDEX foo@bar;`)
// Wait until the index is about to get gc'ed.
<-aboutToGC
diff --git a/pkg/ccl/backupccl/full_cluster_backup_restore_test.go b/pkg/ccl/backupccl/full_cluster_backup_restore_test.go
index 761190e204c4..d0ee8f0ac56a 100644
--- a/pkg/ccl/backupccl/full_cluster_backup_restore_test.go
+++ b/pkg/ccl/backupccl/full_cluster_backup_restore_test.go
@@ -769,11 +769,9 @@ func TestDropDatabaseRevisionHistory(t *testing.T) {
defer cleanupFn()
sqlDB.Exec(t, `BACKUP TO $1 WITH revision_history`, localFoo)
- sqlDB.Exec(t, `
-CREATE DATABASE same_name_db;
-DROP DATABASE same_name_db;
-CREATE DATABASE same_name_db;
-`)
+ sqlDB.Exec(t, `CREATE DATABASE same_name_db;`)
+ sqlDB.Exec(t, `DROP DATABASE same_name_db;`)
+ sqlDB.Exec(t, `CREATE DATABASE same_name_db;`)
sqlDB.Exec(t, `BACKUP TO $1 WITH revision_history`, localFoo)
_, sqlDBRestore, cleanupEmptyCluster := backupRestoreTestSetupEmpty(t, singleNode, tempDir, InitManualReplication, base.TestClusterArgs{})
@@ -1042,15 +1040,13 @@ func TestClusterRevisionDoesNotBackupOptOutSystemTables(t *testing.T) {
sqlDB := sqlutils.MakeSQLRunner(conn)
defer cleanup()
- sqlDB.Exec(t, `
-CREATE DATABASE test;
-USE test;
-CREATE TABLE foo (id INT);
-BACKUP TO 'nodelocal://1/foo' WITH revision_history;
-BACKUP TO 'nodelocal://1/foo' WITH revision_history;
-CREATE TABLE bar (id INT);
-BACKUP TO 'nodelocal://1/foo' WITH revision_history;
-`)
+ sqlDB.Exec(t, `CREATE DATABASE test;`)
+ sqlDB.Exec(t, `USE test;`)
+ sqlDB.Exec(t, `CREATE TABLE foo (id INT);`)
+ sqlDB.Exec(t, `BACKUP TO 'nodelocal://1/foo' WITH revision_history;`)
+ sqlDB.Exec(t, `BACKUP TO 'nodelocal://1/foo' WITH revision_history;`)
+ sqlDB.Exec(t, `CREATE TABLE bar (id INT);`)
+ sqlDB.Exec(t, `BACKUP TO 'nodelocal://1/foo' WITH revision_history;`)
}
func TestRestoreWithRecreatedDefaultDB(t *testing.T) {
diff --git a/pkg/ccl/backupccl/restore_planning.go b/pkg/ccl/backupccl/restore_planning.go
index 89a966f754b2..f091d2f90434 100644
--- a/pkg/ccl/backupccl/restore_planning.go
+++ b/pkg/ccl/backupccl/restore_planning.go
@@ -1142,8 +1142,8 @@ func restorePlanHook(
ctx, span := tracing.ChildSpan(ctx, stmt.StatementTag())
defer span.Finish()
- if !(p.ExtendedEvalContext().TxnImplicit || restoreStmt.Options.Detached) {
- return errors.Errorf("RESTORE cannot be used inside a transaction without DETACHED option")
+ if !(p.IsAutoCommit() || restoreStmt.Options.Detached) {
+ return errors.Errorf("RESTORE cannot be used inside a multi-statement transaction without DETACHED option")
}
subdir, err := subdirFn()
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/backup-dropped-descriptors b/pkg/ccl/backupccl/testdata/backup-restore/backup-dropped-descriptors
index cb7c5e89be79..749c2dcf773f 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/backup-dropped-descriptors
+++ b/pkg/ccl/backupccl/testdata/backup-restore/backup-dropped-descriptors
@@ -64,6 +64,9 @@ BACKUP INTO 'nodelocal://0/cluster/dropped-database';
# dropped database 'd'.
exec-sql
RESTORE DATABASE d FROM LATEST IN 'nodelocal://0/dropped-database' WITH new_db_name = 'd1';
+----
+
+exec-sql
USE d1;
----
@@ -77,6 +80,9 @@ public bar
# dropped database 'd'.
exec-sql
RESTORE DATABASE d FROM LATEST IN 'nodelocal://0/cluster/dropped-database' WITH new_db_name = 'd2';
+----
+
+exec-sql
USE d2;
----
@@ -95,6 +101,9 @@ new-server name=s2
exec-sql
CREATE DATABASE d2;
+----
+
+exec-sql
CREATE TABLE d2.t2 (id INT);
----
@@ -102,8 +111,14 @@ exec-sql
CREATE TYPE d2.typ AS ENUM ('hello');
CREATE SCHEMA d2.s;
CREATE TABLE d2.s.t (id INT);
+----
+
+exec-sql
SET use_declarative_schema_changer = 'off';
SET CLUSTER SETTING jobs.debug.pausepoints = 'schemachanger.before.exec';
+----
+
+exec-sql
DROP SCHEMA d2.s CASCADE;
----
paused before it completed with reason: pause point "schemachanger.before.exec" hit
@@ -160,6 +175,9 @@ WHERE object_name = 's' OR object_name = 'typ';
# Restore the backups to check they are valid.
exec-sql
RESTORE DATABASE d2 FROM LATEST IN 'nodelocal://0/dropped-schema-in-database' WITH new_db_name = 'd3';
+----
+
+exec-sql
USE d3;
----
@@ -182,6 +200,9 @@ public t2
exec-sql
RESTORE DATABASE d2 FROM LATEST IN 'nodelocal://0/cluster/dropped-schema-in-database' WITH new_db_name ='d4';
+----
+
+exec-sql
USE d4;
----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/backup-permissions b/pkg/ccl/backupccl/testdata/backup-restore/backup-permissions
index 6172d2a4f3de..e53bc58dc2c8 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/backup-permissions
+++ b/pkg/ccl/backupccl/testdata/backup-restore/backup-permissions
@@ -9,6 +9,13 @@ CREATE TABLE d.t (x INT);
INSERT INTO d.t VALUES (1), (2), (3);
----
+# BACKUP is not allowed in a batch-statement.
+exec-sql
+BACKUP TO 'nodelocal://0/test-root/';
+SELECT 1;
+----
+pq: BACKUP cannot be used inside a multi-statement transaction without DETACHED option
+
# Cluster backup should succeed as a root user.
exec-sql
BACKUP TO 'nodelocal://0/test-root/'
@@ -22,7 +29,13 @@ GRANT ADMIN TO testuser;
exec-sql user=testuser
BACKUP TO 'nodelocal://0/test-nonroot-cluster';
+----
+
+exec-sql user=testuser
BACKUP DATABASE d TO 'nodelocal://0/test-nonroot-db';
+----
+
+exec-sql user=testuser
BACKUP TABLE d.t TO 'nodelocal://0/test-nonroot-table';
----
@@ -106,6 +119,9 @@ GRANT USAGE ON TYPE d2.greeting TO testuser;
# testuser should now have all the required privileges.
exec-sql server=s2 user=testuser
BACKUP DATABASE d2 TO 'nodelocal://0/d2';
+----
+
+exec-sql server=s2 user=testuser
BACKUP TABLE d2.t TO 'nodelocal://0/d2-table';
----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/column-families b/pkg/ccl/backupccl/testdata/backup-restore/column-families
index bec83fd05b79..8f873736de3d 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/column-families
+++ b/pkg/ccl/backupccl/testdata/backup-restore/column-families
@@ -3,16 +3,40 @@ new-server name=s1 localities=us-east-1,us-west-1,us-west-2,eu-central-1
exec-sql
CREATE DATABASE orig;
+----
+
+exec-sql
USE orig;
+----
+
+exec-sql
CREATE TABLE cfs (a INT PRIMARY KEY, b STRING, c STRING, d STRING, FAMILY (b), FAMILY (c));
+----
+
+exec-sql
INSERT INTO cfs SELECT x, repeat('abc', 100), repeat('abc', 100) FROM generate_series(0, 3) AS x;
+----
+
+exec-sql
ALTER TABLE cfs SPLIT AT SELECT a FROM cfs;
+----
+
+exec-sql
-- Split the output files very small to catch output SSTs mid-row.
SET CLUSTER SETTING bulkio.backup.file_size = '1';
SET CLUSTER SETTING kv.bulk_sst.target_size = '1';
SET CLUSTER SETTING bulkio.backup.merge_file_buffer_size = '1MiB';
+----
+
+exec-sql
BACKUP cfs TO 'nodelocal://1/foo';
+----
+
+exec-sql
CREATE DATABASE r1;
+----
+
+exec-sql
RESTORE cfs FROM 'nodelocal://1/foo' WITH into_db='r1';
----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/descriptor-broadening b/pkg/ccl/backupccl/testdata/backup-restore/descriptor-broadening
index a81fa91e8c2a..848deb9392e3 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/descriptor-broadening
+++ b/pkg/ccl/backupccl/testdata/backup-restore/descriptor-broadening
@@ -4,14 +4,26 @@ new-server name=s1
exec-sql
CREATE DATABASE db1;
CREATE DATABASE db2;
+----
+
+exec-sql
CREATE TABLE db1.t (a INT);
+----
+
+exec-sql
BACKUP DATABASE db1 TO 'nodelocal://1/backup';
+----
+
+exec-sql
BACKUP DATABASE db1,db2 TO 'nodelocal://1/backup';
----
pq: previous backup does not contain the complete database "db2"
exec-sql
BACKUP db1.t TO 'nodelocal://1/backup_2';
+----
+
+exec-sql
BACKUP DATABASE db1 TO 'nodelocal://1/backup_2';
----
pq: previous backup does not contain the complete database "db1"
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/feature-flags b/pkg/ccl/backupccl/testdata/backup-restore/feature-flags
index 115e24946e94..b014b12aef5e 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/feature-flags
+++ b/pkg/ccl/backupccl/testdata/backup-restore/feature-flags
@@ -10,6 +10,9 @@ INSERT INTO d.t VALUES (1), (2), (3);
# Test running backup when BACKUP feature flag is disabled.
exec-sql
SET CLUSTER SETTING feature.backup.enabled = FALSE;
+----
+
+exec-sql
BACKUP TO 'nodelocal://0/test-root/';
----
pq: feature BACKUP was disabled by the database administrator
@@ -17,6 +20,9 @@ pq: feature BACKUP was disabled by the database administrator
# Test running backup when feature flag is enabled.
exec-sql
SET CLUSTER SETTING feature.backup.enabled = TRUE;
+----
+
+exec-sql
BACKUP TO 'nodelocal://0/test-root/';
----
@@ -27,6 +33,9 @@ DROP TABLE d.t;
# Test running restore when feature flag is disabled.
exec-sql
SET CLUSTER SETTING feature.restore.enabled = FALSE;
+----
+
+exec-sql
RESTORE TABLE d.t FROM 'nodelocal://0/test-root/';
----
pq: feature RESTORE was disabled by the database administrator
@@ -34,5 +43,8 @@ pq: feature RESTORE was disabled by the database administrator
# Test running restore when feature flag is enabled.
exec-sql
SET CLUSTER SETTING feature.restore.enabled = TRUE;
+----
+
+exec-sql
RESTORE TABLE d.t FROM 'nodelocal://0/test-root/';
----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/max-row-size b/pkg/ccl/backupccl/testdata/backup-restore/max-row-size
index d8627eb75c4d..8fc41a66c586 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/max-row-size
+++ b/pkg/ccl/backupccl/testdata/backup-restore/max-row-size
@@ -24,7 +24,13 @@ pq: row larger than max row size: table 109 family 0 primary key /Table/109/1/2/
exec-sql
BACKUP maxrow TO 'nodelocal://1/maxrow';
+----
+
+exec-sql
CREATE DATABASE d2;
+----
+
+exec-sql
RESTORE maxrow FROM 'nodelocal://1/maxrow' WITH into_db='d2';
----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/multiregion b/pkg/ccl/backupccl/testdata/backup-restore/multiregion
index 1d5f3896bb54..eee1bc5e5ae4 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/multiregion
+++ b/pkg/ccl/backupccl/testdata/backup-restore/multiregion
@@ -66,19 +66,37 @@ HINT: there are two ways you can resolve this issue: 1) update the cluster to wh
# Create a database with no regions to check default primary regions.
exec-sql
CREATE DATABASE no_region_db;
+----
+
+exec-sql
CREATE TABLE no_region_db.t (x INT);
INSERT INTO no_region_db.t VALUES (1), (2), (3);
CREATE DATABASE no_region_db_2;
CREATE TABLE no_region_db_2.t (x INT);
INSERT INTO no_region_db_2.t VALUES (1), (2), (3);
+----
+
+exec-sql
BACKUP DATABASE no_region_db TO 'nodelocal://1/no_region_database_backup/';
+----
+
+exec-sql
BACKUP TO 'nodelocal://1/no_region_cluster_backup/';
+----
+
+exec-sql
DROP DATABASE no_region_db;
+----
+
+exec-sql
DROP DATABASE no_region_db_2;
----
exec-sql
SET CLUSTER SETTING sql.defaults.primary_region = 'non-existent-region';
+----
+
+exec-sql
RESTORE DATABASE no_region_db FROM 'nodelocal://1/no_region_database_backup/';
----
pq: region "non-existent-region" does not exist
@@ -88,6 +106,9 @@ set the default PRIMARY REGION to a region that exists (see SHOW REGIONS FROM CL
exec-sql
SET CLUSTER SETTING sql.defaults.primary_region = 'eu-central-1';
+----
+
+exec-sql
RESTORE DATABASE no_region_db FROM 'nodelocal://1/no_region_database_backup/';
----
NOTICE: setting the PRIMARY REGION as eu-central-1 on database no_region_db
@@ -111,16 +132,22 @@ exec-sql
CREATE DATABASE eu_central_db;
CREATE TABLE eu_central_db.t (x INT);
INSERT INTO eu_central_db.t VALUES (1), (2), (3);
-BACKUP DATABASE eu_central_db TO 'nodelocal://1/eu_central_database_backup/';
----
NOTICE: setting eu-central-1 as the PRIMARY REGION as no PRIMARY REGION was specified
+exec-sql
+BACKUP DATABASE eu_central_db TO 'nodelocal://1/eu_central_database_backup/';
+----
+
# New cluster for a cluster backup.
new-server name=s4 share-io-dir=s1 allow-implicit-access localities=eu-central-1,eu-north-1
----
exec-sql
SET CLUSTER SETTING sql.defaults.primary_region = 'eu-north-1';
+----
+
+exec-sql
RESTORE FROM 'nodelocal://1/no_region_cluster_backup/';
----
NOTICE: setting the PRIMARY REGION as eu-north-1 on database defaultdb
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/restore-grants b/pkg/ccl/backupccl/testdata/backup-restore/restore-grants
index 78abdc998274..59617a755a0b 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/restore-grants
+++ b/pkg/ccl/backupccl/testdata/backup-restore/restore-grants
@@ -203,8 +203,14 @@ SELECT * FROM testuser_db.sc.othertable;
# Let's restore tables as admin and ensure that the table's privs are the same
# as the db it restores into.
exec-sql
-CREATE DATABASE restoredb;
+CREATE DATABASE restoredb
+----
+
+exec-sql
GRANT CREATE ON DATABASE restoredb TO user1;
+----
+
+exec-sql
RESTORE testdb.sc.othertable, testdb.testtable_greeting_usage, testdb.testtable_greeting_owner FROM 'nodelocal://1/test' WITH into_db='restoredb';
----
@@ -259,6 +265,9 @@ ALTER TYPE restoredb.greeting_owner ADD VALUE 'new' BEFORE 'howdy';
exec-sql
USE defaultdb;
DROP DATABASE testdb CASCADE;
+----
+
+exec-sql
RESTORE DATABASE testdb FROM 'nodelocal://0/test/';
----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/restore-permissions b/pkg/ccl/backupccl/testdata/backup-restore/restore-permissions
index d98c8aa85fc0..e7bfa75f7cf8 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/restore-permissions
+++ b/pkg/ccl/backupccl/testdata/backup-restore/restore-permissions
@@ -20,6 +20,9 @@ GRANT ADMIN TO testuser;
exec-sql user=testuser
DROP DATABASE d;
+----
+
+exec-sql user=testuser
RESTORE DATABASE d FROM 'nodelocal://0/test/';
----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/revision_history b/pkg/ccl/backupccl/testdata/backup-restore/revision_history
index 99a7740048d2..f003a5a62ab7 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/revision_history
+++ b/pkg/ccl/backupccl/testdata/backup-restore/revision_history
@@ -8,12 +8,18 @@ new-server name=s1
# descriptor will add the span for index 2 /Table/55/{2-3}. These spans should
# be allowed to overlap.
exec-sql
-CREATE DATABASE d;
+CREATE DATABASE d
+----
+
+exec-sql
CREATE TABLE d.t (a INT PRIMARY KEY, b INT, c INT);
CREATE INDEX test_idx_2 ON d.t(b);
CREATE INDEX test_idx_3 ON d.t(c);
DROP INDEX d.test_idx_2;
-BACKUP DATABASE d INTO 'nodelocal://0/my_backups' WITH revision_history;
----
NOTICE: the data for dropped indexes is reclaimed asynchronously
HINT: The reclamation delay can be customized in the zone configuration for the table.
+
+exec-sql
+BACKUP DATABASE d INTO 'nodelocal://0/my_backups' WITH revision_history;
+----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/temp-tables b/pkg/ccl/backupccl/testdata/backup-restore/temp-tables
index a846f97fe9ec..675c59589f01 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/temp-tables
+++ b/pkg/ccl/backupccl/testdata/backup-restore/temp-tables
@@ -47,13 +47,22 @@ BACKUP d1.* TO 'nodelocal://0/d1_star_backup/'
exec-sql
COMMENT ON TABLE temp_table IS 'should not show up in restore';
+----
+
+exec-sql
BACKUP TO 'nodelocal://0/full_cluster_backup/';
----
exec-sql
USE defaultdb;
-DROP DATABASE d1;
-RESTORE DATABASE d1 FROM 'nodelocal://0/d1_backup/';
+DROP DATABASE d1
+----
+
+exec-sql
+RESTORE DATABASE d1 FROM 'nodelocal://0/d1_backup/'
+----
+
+exec-sql
USE d1
----
@@ -75,8 +84,14 @@ perm_table
exec-sql
USE defaultdb;
-DROP DATABASE d1;
-RESTORE DATABASE d1 FROM 'nodelocal://0/d1_star_backup/';
+DROP DATABASE d1
+----
+
+exec-sql
+RESTORE DATABASE d1 FROM 'nodelocal://0/d1_star_backup/'
+----
+
+exec-sql
USE d1
----
@@ -102,6 +117,9 @@ new-server name=s2 share-io-dir=s1 temp-cleanup-freq=5s
exec-sql
USE defaultdb;
+----
+
+exec-sql
RESTORE FROM 'nodelocal://0/full_cluster_backup/';
----
diff --git a/pkg/ccl/backupccl/testdata/backup-restore/user-defined-types b/pkg/ccl/backupccl/testdata/backup-restore/user-defined-types
index 5ae804c8c149..4e6d0f1e9b26 100644
--- a/pkg/ccl/backupccl/testdata/backup-restore/user-defined-types
+++ b/pkg/ccl/backupccl/testdata/backup-restore/user-defined-types
@@ -133,7 +133,10 @@ BACKUP DATABASE d TO 'nodelocal://0/test/'
----
exec-sql
-DROP DATABASE d;
+DROP DATABASE d
+----
+
+exec-sql
RESTORE DATABASE d FROM 'nodelocal://0/test/';
----
diff --git a/pkg/ccl/benchccl/rttanalysisccl/multi_region_bench_test.go b/pkg/ccl/benchccl/rttanalysisccl/multi_region_bench_test.go
index 3227dba46bce..334e14127957 100644
--- a/pkg/ccl/benchccl/rttanalysisccl/multi_region_bench_test.go
+++ b/pkg/ccl/benchccl/rttanalysisccl/multi_region_bench_test.go
@@ -34,7 +34,7 @@ func TestBenchmarkExpectation(t *testing.T) { reg.RunExpectations(t) }
const (
multipleTableFixture = `
-CREATE DATABASE test PRIMARY REGION "us-east1" REGIONS "us-east1", "us-east2", "us-east3";
+BEGIN; CREATE DATABASE test PRIMARY REGION "us-east1" REGIONS "us-east1", "us-east2", "us-east3"; COMMIT;
USE test;
CREATE TABLE test11 (p int) LOCALITY REGIONAL BY TABLE IN "us-east1";
CREATE TABLE test12 (p int) LOCALITY REGIONAL BY TABLE IN "us-east1";
diff --git a/pkg/ccl/changefeedccl/changefeed_test.go b/pkg/ccl/changefeedccl/changefeed_test.go
index cd30f5030010..f9ca7a5c8dc3 100644
--- a/pkg/ccl/changefeedccl/changefeed_test.go
+++ b/pkg/ccl/changefeedccl/changefeed_test.go
@@ -5470,12 +5470,10 @@ func TestDistSenderRangeFeedPopulatesVirtualTable(t *testing.T) {
defer s.Stopper().Stop(context.Background())
sqlDB := sqlutils.MakeSQLRunner(db)
- sqlDB.Exec(t, `
-SET CLUSTER SETTING kv.rangefeed.enabled='true';
-CREATE TABLE tbl (a INT, b STRING);
-INSERT INTO tbl VALUES (1, 'one'), (2, 'two'), (3, 'three');
-CREATE CHANGEFEED FOR tbl INTO 'null://';
-`)
+ sqlDB.Exec(t, `SET CLUSTER SETTING kv.rangefeed.enabled='true';`)
+ sqlDB.Exec(t, `CREATE TABLE tbl (a INT, b STRING);`)
+ sqlDB.Exec(t, `INSERT INTO tbl VALUES (1, 'one'), (2, 'two'), (3, 'three');`)
+ sqlDB.Exec(t, `CREATE CHANGEFEED FOR tbl INTO 'null://';`)
var tableID int
sqlDB.QueryRow(t, "SELECT table_id FROM crdb_internal.tables WHERE name='tbl'").Scan(&tableID)
diff --git a/pkg/ccl/kvccl/kvfollowerreadsccl/testdata/boundedstaleness/single_row b/pkg/ccl/kvccl/kvfollowerreadsccl/testdata/boundedstaleness/single_row
index c7c027728cc1..32c0d719aa05 100644
--- a/pkg/ccl/kvccl/kvfollowerreadsccl/testdata/boundedstaleness/single_row
+++ b/pkg/ccl/kvccl/kvfollowerreadsccl/testdata/boundedstaleness/single_row
@@ -105,6 +105,9 @@ events (1 found):
exec idx=2
PREPARE max_staleness_prep AS SELECT pk FROM t AS OF SYSTEM TIME with_max_staleness('10s') WHERE pk = 1;
+----
+
+exec idx=2
PREPARE min_timestamp_prep AS SELECT pk FROM t AS OF SYSTEM TIME with_min_timestamp(now() - '10s') WHERE pk = 1
----
@@ -205,7 +208,13 @@ events (7 found):
# with the schema not existing if none of the followers have caught up.
exec
CREATE TABLE t2(pk INT PRIMARY KEY);
+----
+
+exec
INSERT INTO t2 VALUES (2);
+----
+
+exec
ALTER TABLE t2 ADD COLUMN new_col INT
----
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/alter_table_locality b/pkg/ccl/logictestccl/testdata/logic_test/alter_table_locality
index 53e12765e9df..2382d57571ed 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/alter_table_locality
+++ b/pkg/ccl/logictestccl/testdata/logic_test/alter_table_locality
@@ -518,6 +518,8 @@ created_as_global CREATE TABLE public.created_as_global (
# for REGIONAL BY ROW transformations.
statement ok
DROP TABLE created_as_global;
+
+statement ok
CREATE TABLE created_as_global (
pk int primary key,
i int,
@@ -526,6 +528,8 @@ CREATE TABLE created_as_global (
unique(i),
FAMILY (pk, i, b)
) LOCALITY GLOBAL;
+
+statement ok
INSERT INTO created_as_global VALUES (0, 1, 2)
query TTT
@@ -650,6 +654,8 @@ ap-southeast-2 1
# Drop the table and try again with the crdb_region column defined.
statement ok
DROP TABLE created_as_global;
+
+statement ok
CREATE TABLE created_as_global (
pk int primary key,
i int,
@@ -665,6 +671,8 @@ ALTER TABLE created_as_global SET LOCALITY REGIONAL BY ROW
statement ok
DROP TABLE created_as_global;
+
+statement ok
CREATE TABLE created_as_global (
pk int primary key,
i int,
@@ -674,6 +682,8 @@ CREATE TABLE created_as_global (
crdb_region crdb_internal_region,
FAMILY (pk, i, b, crdb_region)
) LOCALITY GLOBAL;
+
+statement ok
INSERT INTO created_as_global VALUES (0, 1, 2, 'us-east-1')
statement error cannot use column crdb_region for REGIONAL BY ROW table as it may contain NULL values
@@ -681,6 +691,8 @@ ALTER TABLE created_as_global SET LOCALITY REGIONAL BY ROW
statement ok
ALTER TABLE created_as_global ALTER COLUMN crdb_region SET NOT NULL;
+
+statement ok
ALTER TABLE created_as_global SET LOCALITY REGIONAL BY ROW
query TT
@@ -750,6 +762,8 @@ created_as_global CREATE TABLE public.created_as_global (
# Test altering to REGIONAL BY ROW AS
.
statement ok
DROP TABLE created_as_global;
+
+statement ok
CREATE TABLE created_as_global (
pk int primary key,
i int,
@@ -759,6 +773,8 @@ CREATE TABLE created_as_global (
cr crdb_internal_region,
FAMILY (pk, i, b, cr)
) LOCALITY GLOBAL;
+
+statement ok
INSERT INTO created_as_global VALUES (0, 1, 2, 'us-east-1')
statement error column "non_exist" does not exist
@@ -1316,6 +1332,8 @@ TABLE regional_by_table_no_region ALTER TABLE regional_by_table_no_region CONFI
# REGIONAL BY ROW transformations.
statement ok
DROP TABLE regional_by_table_no_region;
+
+statement ok
CREATE TABLE regional_by_table_no_region (
pk int primary key,
i int,
@@ -1324,6 +1342,8 @@ CREATE TABLE regional_by_table_no_region (
unique(i),
FAMILY (pk, i, b)
) LOCALITY REGIONAL BY TABLE;
+
+statement ok
INSERT INTO regional_by_table_no_region VALUES (0, 1, 2)
statement ok
@@ -1345,6 +1365,8 @@ regional_by_table_no_region CREATE TABLE public.regional_by_table_no_region (
statement ok
DROP TABLE regional_by_table_no_region;
+
+statement ok
CREATE TABLE regional_by_table_no_region (
pk int primary key,
i int,
@@ -1354,6 +1376,8 @@ CREATE TABLE regional_by_table_no_region (
cr crdb_internal_region NOT NULL NOT NULL,
FAMILY (pk, i, b, cr)
) LOCALITY REGIONAL BY TABLE;
+
+statement ok
INSERT INTO regional_by_table_no_region VALUES (0, 1, 2, 'us-east-1')
query TTT
@@ -1396,6 +1420,8 @@ DATABASE alter_locality_test ALTER DATABASE alter_locality_test CONFIGURE ZONE
# REGIONAL BY ROW AS transformations.
statement ok
DROP TABLE regional_by_table_no_region;
+
+statement ok
CREATE TABLE regional_by_table_no_region (
pk int primary key,
i int,
@@ -1405,6 +1431,8 @@ CREATE TABLE regional_by_table_no_region (
unique(i),
FAMILY (pk, i, b, cr)
) LOCALITY REGIONAL BY TABLE;
+
+statement ok
INSERT INTO regional_by_table_no_region VALUES (0, 1, 2, 'us-east-1')
statement ok
@@ -1669,6 +1697,8 @@ TABLE regional_by_table_in_us_east ALTER TABLE regional_by_table_in_us_east CON
# REGIONAL BY ROW transformations.
statement ok
DROP TABLE regional_by_table_in_us_east;
+
+statement ok
CREATE TABLE regional_by_table_in_us_east (
pk int PRIMARY KEY,
i int,
@@ -1677,7 +1707,11 @@ CREATE TABLE regional_by_table_in_us_east (
unique(i),
FAMILY (pk, i, b)
) LOCALITY REGIONAL BY TABLE IN "us-east-1";
+
+statement ok
INSERT INTO regional_by_table_in_us_east VALUES (0, 1, 2);
+
+statement ok
ALTER TABLE regional_by_table_in_us_east SET LOCALITY REGIONAL BY ROW
query TT
@@ -1734,6 +1768,8 @@ DATABASE alter_locality_test ALTER DATABASE alter_locality_test CONFIGURE ZONE
# REGIONAL BY ROW AS transformations.
statement ok
DROP TABLE regional_by_table_in_us_east;
+
+statement ok
CREATE TABLE regional_by_table_in_us_east (
pk int PRIMARY KEY,
i int,
@@ -1743,7 +1779,11 @@ CREATE TABLE regional_by_table_in_us_east (
cr crdb_internal_region NOT NULL NOT NULL,
FAMILY (pk, i, b, cr)
) LOCALITY REGIONAL BY TABLE IN "us-east-1";
+
+statement ok
INSERT INTO regional_by_table_in_us_east VALUES (0, 1, 2, 'us-east-1');
+
+statement ok
ALTER TABLE regional_by_table_in_us_east SET LOCALITY REGIONAL BY ROW AS "cr"
query TT
@@ -1834,13 +1874,19 @@ DATABASE alter_locality_test ALTER DATABASE alter_locality_test CONFIGURE ZONE
statement ok
DROP TABLE regional_by_row;
+
+statement ok
CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
i INT,
INDEX(i),
FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW;
+
+statement ok
INSERT INTO regional_by_row (pk, i) VALUES (1, 1);
+
+statement ok
ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY TABLE in "ap-southeast-2"
query TT
@@ -1875,13 +1921,19 @@ TABLE regional_by_row ALTER TABLE regional_by_row CONFIGURE ZONE USING
statement ok
DROP TABLE regional_by_row;
+
+statement ok
CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
i INT,
INDEX(i),
FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW;
+
+statement ok
INSERT INTO regional_by_row (pk, i) VALUES (1, 1);
+
+statement ok
ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY TABLE IN PRIMARY REGION
query TT
@@ -1916,13 +1968,19 @@ DATABASE alter_locality_test ALTER DATABASE alter_locality_test CONFIGURE ZONE
statement ok
DROP TABLE regional_by_row;
+
+statement ok
CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
i INT,
INDEX(i),
FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW;
+
+statement ok
INSERT INTO regional_by_row (pk, i) VALUES (1, 1);
+
+statement ok
ALTER TABLE regional_by_row SET LOCALITY GLOBAL
query TT
@@ -1958,13 +2016,19 @@ TABLE regional_by_row ALTER TABLE regional_by_row CONFIGURE ZONE USING
statement ok
DROP TABLE regional_by_row;
+
+statement ok
CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
i INT,
INDEX(i),
FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW;
+
+statement ok
INSERT INTO regional_by_row (pk, i) VALUES (1, 1);
+
+statement ok
ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY ROW
query TT
@@ -2126,7 +2190,11 @@ CREATE TABLE regional_by_row_to_regional_by_row_as (
INDEX(i),
FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW;
+
+statement ok
INSERT INTO regional_by_row_to_regional_by_row_as (pk, i) VALUES (1, 1);
+
+statement ok
ALTER TABLE regional_by_row_to_regional_by_row_as SET LOCALITY REGIONAL BY ROW AS "cr"
query TT
@@ -2234,6 +2302,8 @@ DATABASE alter_locality_test ALTER DATABASE alter_locality_test CONFIGURE ZONE
statement ok
DROP TABLE regional_by_row_as;
+
+statement ok
CREATE TABLE regional_by_row_as (
pk INT PRIMARY KEY,
i INT,
@@ -2241,7 +2311,11 @@ CREATE TABLE regional_by_row_as (
INDEX(i),
FAMILY (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS "cr";
+
+statement ok
INSERT INTO regional_by_row_as (pk, i) VALUES (1, 1);
+
+statement ok
ALTER TABLE regional_by_row_as SET LOCALITY REGIONAL BY TABLE in "ap-southeast-2"
query TT
@@ -2294,6 +2368,8 @@ TABLE regional_by_row_as ALTER TABLE regional_by_row_as CONFIGURE ZONE USING
statement ok
DROP TABLE regional_by_row_as;
+
+statement ok
CREATE TABLE regional_by_row_as (
pk INT PRIMARY KEY,
i INT,
@@ -2301,7 +2377,11 @@ CREATE TABLE regional_by_row_as (
INDEX(i),
FAMILY (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS "cr";
+
+statement ok
INSERT INTO regional_by_row_as (pk, i) VALUES (1, 1);
+
+statement ok
ALTER TABLE regional_by_row_as SET LOCALITY REGIONAL BY TABLE IN PRIMARY REGION
query TT
@@ -2354,6 +2434,8 @@ DATABASE alter_locality_test ALTER DATABASE alter_locality_test CONFIGURE ZONE
statement ok
DROP TABLE regional_by_row_as;
+
+statement ok
CREATE TABLE regional_by_row_as (
pk INT PRIMARY KEY,
i INT,
@@ -2361,7 +2443,11 @@ CREATE TABLE regional_by_row_as (
INDEX(i),
FAMILY (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS "cr";
+
+statement ok
INSERT INTO regional_by_row_as (pk, i) VALUES (1, 1);
+
+statement ok
ALTER TABLE regional_by_row_as SET LOCALITY GLOBAL
query TT
@@ -2421,6 +2507,8 @@ CREATE TABLE regional_by_row_as_to_regional_by_row (
INDEX(i),
FAMILY (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS "cr";
+
+statement ok
INSERT INTO regional_by_row_as_to_regional_by_row (pk, i) VALUES (1, 1);
ALTER TABLE regional_by_row_as_to_regional_by_row SET LOCALITY REGIONAL BY ROW
@@ -2475,6 +2563,8 @@ DATABASE alter_locality_test ALTER DATABASE alter_locality_test CONFIGURE ZONE
statement ok
DROP TABLE regional_by_row_as;
+
+statement ok
CREATE TABLE regional_by_row_as (
pk INT PRIMARY KEY,
i INT,
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/crdb_internal_tenant b/pkg/ccl/logictestccl/testdata/logic_test/crdb_internal_tenant
index 0c28ebb0b3e6..fdcd6165755f 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/crdb_internal_tenant
+++ b/pkg/ccl/logictestccl/testdata/logic_test/crdb_internal_tenant
@@ -468,8 +468,12 @@ SET application_name = 'test_max_retry'
# become different from 0.
statement OK
CREATE SEQUENCE s;
- SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h'::INTERVAL), 0);
- DROP SEQUENCE s
+
+statement OK
+SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h'::INTERVAL), 0);
+
+statement OK
+DROP SEQUENCE s
statement OK
RESET application_name
@@ -512,6 +516,8 @@ testclustername
# Regression for 41834.
statement ok
CREATE TABLE table41834 ();
+
+statement ok
SELECT
crdb_internal.encode_key(
-8912529861854991652,
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/multi_region b/pkg/ccl/logictestccl/testdata/logic_test/multi_region
index 0f506d15d014..a6eee7c1c0fb 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/multi_region
+++ b/pkg/ccl/logictestccl/testdata/logic_test/multi_region
@@ -78,8 +78,14 @@ us-east-1 us-east-1
statement ok
CREATE DATABASE deleted_database;
+
+statement ok
SET sql_safe_updates = false;
+
+statement ok
USE deleted_database;
+
+statement ok
DROP DATABASE deleted_database
statement error database.*deleted_database.*does not exist
@@ -1126,8 +1132,14 @@ RANGE default ALTER RANGE default CONFIGURE ZONE USING
# created before the first region was added to the multi-region DB.
statement ok
CREATE DATABASE start_off_non_multi_region;
+
+statement ok
CREATE TABLE start_off_non_multi_region.public.t(a INT);
+
+statement ok
ALTER DATABASE start_off_non_multi_region PRIMARY REGION "ca-central-1";
+
+statement ok
ALTER DATABASE start_off_non_multi_region ADD REGION "ap-southeast-2"
statement error pgcode 42P12 cannot drop region "ca-central-1"\nHINT: You must designate another region as the primary region using ALTER DATABASE start_off_non_multi_region PRIMARY REGION or remove all other regions before attempting to drop region "ca-central-1"
@@ -1333,9 +1345,17 @@ USE db_with_views_and_sequences
statement ok
CREATE TABLE t (id INT PRIMARY KEY, a INT, b INT);
+
+statement ok
INSERT INTO t VALUES (1, 2, 3), (4, 5, 6);
+
+statement ok
CREATE SEQUENCE s;
+
+statement ok
CREATE VIEW v AS SELECT id, a, b FROM t;
+
+statement ok
CREATE MATERIALIZED VIEW mat_view AS SELECT id, a, b FROM t
statement ok
@@ -1352,7 +1372,11 @@ mat_view GLOBAL
statement ok
CREATE SEQUENCE s2;
+
+statement ok
CREATE VIEW v2 AS SELECT id, a, b FROM t;
+
+statement ok
CREATE MATERIALIZED VIEW mat_view2 AS SELECT id, a, b FROM t
query TT colnames
@@ -1400,6 +1424,8 @@ subtest enum_name_clash
statement ok
CREATE DATABASE db_enum_name_clash;
+
+statement ok
CREATE TYPE db_enum_name_clash.crdb_internal_region AS ENUM ();
statement error pq: type "db_enum_name_clash.public.crdb_internal_region" already exists\nHINT: object "crdb_internal_regions" must be renamed or dropped before adding the primary region\nDETAIL: multi-region databases employ an internal enum called crdb_internal_region to manage regions which conflicts with the existing object
@@ -1409,6 +1435,8 @@ ALTER DATABASE db_enum_name_clash SET PRIMARY REGION "us-east-1"
# database.
statement ok
DROP TYPE db_enum_name_clash.crdb_internal_region;
+
+statement ok
ALTER DATABASE db_enum_name_clash SET PRIMARY REGION "us-east-1"
@@ -1418,8 +1446,12 @@ subtest regional_by_row_view
statement ok
CREATE DATABASE db;
+
+statement ok
USE db;
ALTER DATABASE db PRIMARY REGION "us-east-1";
+
+statement ok
CREATE TABLE kv (k INT PRIMARY KEY, v INT) LOCALITY REGIONAL BY ROW
statement ok
@@ -1433,6 +1465,8 @@ subtest create_table_as_regional_by_row
statement ok
CREATE DATABASE "mr-create-table-as" PRIMARY REGION "ap-southeast-2" REGIONS "ap-southeast-2", "ca-central-1", "us-east-1";
+
+statement ok
USE "mr-create-table-as"
statement ok
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/multi_region_backup b/pkg/ccl/logictestccl/testdata/logic_test/multi_region_backup
index dee4eddaa12e..1feb8950b511 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/multi_region_backup
+++ b/pkg/ccl/logictestccl/testdata/logic_test/multi_region_backup
@@ -376,7 +376,11 @@ ALTER DATABASE "mr-backup-2" CONFIGURE ZONE USING gc.ttlseconds = 1
statement ok
BACKUP DATABASE "mr-backup-1" TO 'nodelocal://1/mr-backup-1/';
+
+statement ok
BACKUP DATABASE "mr-backup-2" TO 'nodelocal://1/mr-backup-2/';
+
+statement ok
BACKUP DATABASE "mr-backup-1", "mr-backup-2" TO 'nodelocal://1/mr-backup-combined/'
query T
@@ -391,6 +395,8 @@ test
statement ok
DROP DATABASE "mr-backup-1";
+
+statement ok
DROP DATABASE "mr-backup-2"
query T
@@ -712,6 +718,8 @@ TABLE regional_by_table_in_ca_central_1 ALTER TABLE regional_by_table_in_ca_cen
statement ok
DROP DATABASE "mr-backup-1";
+
+statement ok
DROP DATABASE "mr-backup-2"
query T
@@ -1174,6 +1182,8 @@ TABLE global_table ALTER TABLE global_table CONFIGURE ZONE USING
statement ok
CREATE DATABASE non_mr_backup;
+
+statement ok
USE non_mr_backup
statement ok
@@ -1328,6 +1338,8 @@ CREATE DATABASE "mr-restore-1" primary region "ap-southeast-2" regions "us-east-
statement ok
RESTORE TABLE "mr-backup-2".global_table FROM 'nodelocal://1/mr-backup-2/' WITH into_db='mr-restore-1';
+
+statement ok
USE "mr-restore-1";
query TT
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/multi_region_privileges b/pkg/ccl/logictestccl/testdata/logic_test/multi_region_privileges
index 63eb12277b5b..eedd7315092a 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/multi_region_privileges
+++ b/pkg/ccl/logictestccl/testdata/logic_test/multi_region_privileges
@@ -4,9 +4,17 @@ user root
statement ok
CREATE DATABASE db;
+
+statement ok
CREATE TABLE db.t();
+
+statement ok
GRANT CREATE ON DATABASE db TO testuser;
+
+statement ok
CREATE TABLE db.t2();
+
+statement ok
ALTER USER testuser CREATEDB;
user testuser
@@ -66,6 +74,8 @@ user root
statement ok
CREATE DATABASE alter_db PRIMARY REGION "us-east-1";
+
+statement ok
CREATE TABLE alter_db.t();
user testuser
@@ -131,8 +141,14 @@ user testuser
statement ok
ALTER DATABASE alter_mr_db SET PRIMARY REGION "us-east-1";
+
+statement ok
ALTER DATABASE alter_mr_db SURVIVE ZONE FAILURE;
+
+statement ok
ALTER DATABASE alter_mr_db DROP REGION "ap-southeast-2";
+
+statement ok
ALTER DATABASE alter_mr_db ADD REGION "ap-southeast-2";
user root
@@ -146,8 +162,14 @@ user testuser
statement ok
ALTER DATABASE alter_mr_db SET PRIMARY REGION "us-east-1";
+
+statement ok
ALTER DATABASE alter_mr_db SURVIVE ZONE FAILURE;
+
+statement ok
ALTER DATABASE alter_mr_db DROP REGION "ap-southeast-2";
+
+statement ok
ALTER DATABASE alter_mr_db ADD REGION "ap-southeast-2";
user root
@@ -161,8 +183,14 @@ user testuser
statement ok
ALTER DATABASE alter_mr_db SET PRIMARY REGION "us-east-1";
+
+statement ok
ALTER DATABASE alter_mr_db SURVIVE ZONE FAILURE;
+
+statement ok
ALTER DATABASE alter_mr_db DROP REGION "ap-southeast-2";
+
+statement ok
ALTER DATABASE alter_mr_db ADD REGION "ap-southeast-2";
subtest add_drop_region_repartitioning_privs
@@ -171,12 +199,26 @@ user root
statement ok
CREATE DATABASE repartition_privs PRIMARY REGION "ca-central-1" REGIONS "us-east-1";
+
+statement ok
CREATE TABLE repartition_privs.rbr () LOCALITY REGIONAL BY ROW;
+
+statement ok
CREATE TABLE repartition_privs.regional() LOCALITY REGIONAL;
+
+statement ok
CREATE TABLE repartition_privs.global() LOCALITY GLOBAL;
+
+statement ok
CREATE VIEW repartition_privs.v AS SELECT 1;
+
+statement ok
CREATE SEQUENCE repartition_privs.seq;
+
+statement ok
GRANT CREATE ON DATABASE repartition_privs TO testuser;
+
+statement ok
CREATE TABLE repartition_privs.rbr2 () LOCALITY REGIONAL BY ROW
user testuser
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/multi_region_query_behavior b/pkg/ccl/logictestccl/testdata/logic_test/multi_region_query_behavior
index 8e178d21398a..06820c4687f1 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/multi_region_query_behavior
+++ b/pkg/ccl/logictestccl/testdata/logic_test/multi_region_query_behavior
@@ -9,6 +9,8 @@ SET CLUSTER SETTING kv.closed_timestamp.target_duration = '10ms';
statement ok
CREATE DATABASE multi_region_test_db PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2", "us-east-1";
+
+statement ok
USE multi_region_test_db
statement ok
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/multi_region_zone_configs b/pkg/ccl/logictestccl/testdata/logic_test/multi_region_zone_configs
index f91c132f0a58..5c68bc280972 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/multi_region_zone_configs
+++ b/pkg/ccl/logictestccl/testdata/logic_test/multi_region_zone_configs
@@ -17,11 +17,17 @@ SELECT crdb_internal.validate_multi_region_zone_configs()
# a zone config drop.
statement ok
CREATE DATABASE drop_region_db PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2";
+
+statement ok
USE drop_region_db
statement ok
CREATE TABLE global_table () LOCALITY GLOBAL;
+
+statement ok
CREATE TABLE global_table_custom_gc_ttl () LOCALITY GLOBAL;
+
+statement ok
ALTER TABLE global_table_custom_gc_ttl CONFIGURE ZONE USING gc.ttlseconds = 10
statement ok
@@ -535,7 +541,10 @@ TABLE regional_by_row ALTER TABLE regional_by_row CONFIGURE ZONE USING
lease_preferences = '[[+region=us-east-1]]'
statement ok
-DROP TABLE regional_by_row; CREATE TABLE regional_by_row (
+DROP TABLE regional_by_row
+
+statement ok
+CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
i INT,
INDEX idx(i),
@@ -775,10 +784,20 @@ DROP DATABASE "mr-zone-configs" CASCADE
# Test validation for initial SET PRIMARY REGION
statement ok
CREATE DATABASE initial_multiregion_db;
+
+statement ok
USE initial_multiregion_db;
+
+statement ok
CREATE TABLE tbl (a INT PRIMARY KEY, INDEX a_idx (a));
+
+statement ok
ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING gc.ttlseconds = 5;
+
+statement ok
ALTER TABLE tbl CONFIGURE ZONE USING gc.ttlseconds = 5;
+
+statement ok
ALTER INDEX tbl@a_idx CONFIGURE ZONE USING gc.ttlseconds = 5
statement ok
@@ -1689,6 +1708,8 @@ TABLE tbl10 ALTER TABLE tbl10 CONFIGURE ZONE USING
# Ensure that built-in no-ops on non-multi-region tables.
statement ok
CREATE DATABASE not_multi_region;
+
+statement ok
USE not_multi_region
statement ok
@@ -1736,6 +1757,8 @@ subtest reset_multi_region_zone_configs_database
statement ok
CREATE DATABASE "rebuild_zc_db" primary region "ca-central-1" regions "ap-southeast-2", "us-east-1";
+
+statement ok
USE "rebuild_zc_db"
query TT
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/partitioning_enum b/pkg/ccl/logictestccl/testdata/logic_test/partitioning_enum
index 5ac2d97e6b6e..26f4e6a29a20 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/partitioning_enum
+++ b/pkg/ccl/logictestccl/testdata/logic_test/partitioning_enum
@@ -61,7 +61,9 @@ subtest drop_enum_partitioning_value
statement ok
drop table if exists tbl;
-drop type if exists t;
+drop type if exists t
+
+statement ok
create type t as enum('a', 'b', 'c');
create table tbl (pk t PRIMARY KEY) PARTITION BY LIST (pk) (PARTITION "a" VALUES IN ('a'))
@@ -70,7 +72,9 @@ alter type t drop value 'a'
statement ok
drop table if exists tbl;
-drop type if exists t;
+drop type if exists t
+
+statement ok
create type t as enum('a', 'b', 'c');
create table tbl (i INT, k t, PRIMARY KEY (i, k)) PARTITION BY LIST (i) (PARTITION "one" VALUES IN (1) PARTITION BY RANGE (k) (PARTITION "a" VALUES FROM ('a') TO ('b')))
@@ -79,7 +83,9 @@ alter type t drop value 'a'
statement ok
drop table if exists tbl;
-drop type if exists t;
+drop type if exists t
+
+statement ok
create type t as enum('a', 'b', 'c');
create table tbl (i INT, k t, PRIMARY KEY (i, k), INDEX idx (k) PARTITION BY RANGE (k) (PARTITION "a" VALUES FROM ('a') TO ('b')))
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit b/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
index 43a2e0de4535..5249fa2427d8 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
+++ b/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
@@ -903,6 +903,8 @@ pk pk2 partition_by a b c d
# Regression tests for #59583.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (
pk INT,
pk2 INT NOT NULL,
@@ -913,6 +915,8 @@ CREATE TABLE t (
) PARTITION BY LIST (partition_by) (
PARTITION p1 VALUES IN (1)
);
+
+statement ok
INSERT INTO t VALUES (1,2,3,4,5),(11,12,13,14,15)
query IIIII rowsort
@@ -948,7 +952,11 @@ SELECT * FROM t@new_idx
# Tests adding a new UNIQUE index with implicit partitioning.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (partition_by INT, v INT);
+
+statement ok
INSERT INTO t VALUES (1, 1), (2, 1);
statement error could not create unique constraint "uniq_on_t"\nDETAIL: Key \(v\)=\(1\) is duplicated
@@ -967,10 +975,14 @@ CREATE UNIQUE INDEX uniq_on_t ON t(v) PARTITION BY LIST (partition_by) (
# Tests adding a UNIQUE index with PARTITION ALL BY implicit partitioning.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (partition_by INT, v INT) PARTITION ALL BY LIST (partition_by) (
PARTITION one VALUES IN (1),
PARTITION two VALUES IN (2)
);
+
+statement ok
INSERT INTO t VALUES (1, 1), (2, 1);
statement error could not create unique constraint "uniq_on_t"\nDETAIL: Key \(v\)=\(1\) is duplicated
@@ -983,7 +995,11 @@ CREATE UNIQUE INDEX uniq_on_t ON t(v)
# Tests adding a new partial UNIQUE index with implicit partitioning.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (partition_by INT, a INT, b INT);
+
+statement ok
INSERT INTO t VALUES (1, 1, 1), (1, 2, 2), (2, 1, 1), (2, 2, -2);
statement error could not create unique constraint "uniq_on_t"\nDETAIL: Key \(a\)=\(1\) is duplicated
@@ -1003,10 +1019,14 @@ CREATE UNIQUE INDEX uniq_on_t ON t(a) PARTITION BY LIST (partition_by) (
# partitioning.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (partition_by INT, a INT, b INT) PARTITION ALL BY LIST (partition_by) (
PARTITION one VALUES IN (1),
PARTITION two VALUES IN (2)
);
+
+statement ok
INSERT INTO t VALUES (1, 1, 1), (1, 2, 2), (2, 1, 1), (2, 2, -2);
statement error could not create unique constraint "uniq_on_t"\nDETAIL: Key \(a\)=\(1\) is duplicated
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
index 8e31ff360216..1cd0e76c9e77 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
+++ b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
@@ -846,6 +846,8 @@ PARTITION "us-east-1" OF TABLE t_regional_by_row ALTER PARTITION "us-east-1" OF
statement ok
CREATE DATABASE two_region_test_db PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2";
+
+statement ok
USE two_region_test_db
statement ok
@@ -876,6 +878,8 @@ ca-central-1 6
statement ok
CREATE DATABASE add_regions WITH PRIMARY REGION "ca-central-1";
+
+statement ok
USE add_regions
statement ok
@@ -1163,6 +1167,8 @@ DATABASE add_regions ALTER DATABASE add_regions CONFIGURE ZONE USING
statement ok
CREATE DATABASE add_regions_in_txn WITH PRIMARY REGION "ca-central-1";
+
+statement ok
USE add_regions_in_txn
statement ok
@@ -1252,7 +1258,9 @@ regional_by_row_like CREATE TABLE public.regional_by_
) LOCALITY REGIONAL BY TABLE IN PRIMARY REGION
statement ok
-DROP TABLE regional_by_row_like;
+DROP TABLE regional_by_row_like
+
+statement ok
CREATE TABLE regional_by_row_like (LIKE regional_by_row INCLUDING INDEXES)
query TT
@@ -1269,6 +1277,8 @@ regional_by_row_like CREATE TABLE public.regional_by_
statement ok
DROP TABLE regional_by_row_like;
+
+statement ok
CREATE TABLE regional_by_row_like (LIKE regional_by_row INCLUDING ALL)
query TT
@@ -1392,13 +1402,19 @@ regional_by_row_fk CREATE TABLE public.regional_by_row_fk (
statement ok
CREATE DATABASE drop_regions PRIMARY REGION "ca-central-1" REGIONS "us-east-1", "ap-southeast-2";
+
+statement ok
USE drop_regions;
+
+statement ok
CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
i INT,
INDEX(i),
FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW;
+
+statement ok
CREATE TABLE regional_by_row_as (
pk INT PRIMARY KEY,
i INT,
@@ -1644,7 +1660,11 @@ ALTER DATABASE drop_regions DROP REGION "ca-central-1";
# Drop the two regional by row tables and now the primary region can be removed.
statement ok
DROP TABLE regional_by_row;
+
+statement ok
DROP TABLE regional_by_row_as;
+
+statement ok
ALTER DATABASE drop_regions DROP REGION "ca-central-1";
##############################################
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_auto_rehoming b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_auto_rehoming
index 9b5abf91e337..1a8e56f40144 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_auto_rehoming
+++ b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_auto_rehoming
@@ -3,8 +3,14 @@
statement ok
SET experimental_enable_auto_rehoming = true;
CREATE DATABASE testdb PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2";
+
+statement ok
USE testdb;
+
+statement ok
CREATE TABLE rbr (p INT PRIMARY KEY, s STRING) LOCALITY REGIONAL BY ROW;
+
+statement ok
INSERT INTO rbr (p, s) VALUES (1, 'hi')
query TIT
@@ -72,8 +78,14 @@ SET on_update_rehome_row_enabled = true
# Re-homing still works even after locality change.
statement ok
DROP TABLE rbr;
+
+statement ok
CREATE TABLE rbr (p INT PRIMARY KEY, s STRING);
+
+statement ok
ALTER TABLE rbr SET LOCALITY REGIONAL BY ROW;
+
+statement ok
INSERT INTO rbr (p, s) VALUES (1, 'hi')
query TIT
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_query_behavior b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_query_behavior
index 27df75baa3f8..271b14825239 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_query_behavior
+++ b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_query_behavior
@@ -10,6 +10,8 @@ SET CLUSTER SETTING kv.closed_timestamp.target_duration = '10ms';
statement ok
CREATE DATABASE multi_region_test_db PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2", "us-east-1" SURVIVE REGION FAILURE;
+
+statement ok
USE multi_region_test_db
statement ok
@@ -2231,10 +2233,20 @@ subtest regressions
# ERROR: missing "crdb_region" primary key column.
statement ok
CREATE DATABASE single_region_test_db PRIMARY REGION "ap-southeast-2";
+
+statement ok
USE single_region_test_db;
+
+statement ok
CREATE TABLE t63109 (a INT, b STRING);
+
+statement ok
ALTER TABLE t63109 SET LOCALITY REGIONAL BY ROW;
+
+statement ok
INSERT INTO t63109 VALUES (1, 'one');
+
+statement ok
UPSERT INTO t63109 VALUES (1, 'two');
UPSERT INTO t63109 (crdb_region, a, b) VALUES ('ap-southeast-2', 1, 'three');
UPSERT INTO t63109 (a, b) VALUES (1, 'four');
@@ -2243,8 +2255,14 @@ UPSERT INTO t63109 (a, b) VALUES (1, 'four');
# even if the stats show zero rows.
statement ok
CREATE DATABASE db PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2", "us-east-1";
+
+statement ok
USE db;
+
+statement ok
CREATE TABLE t65064 (username STRING NOT NULL UNIQUE) LOCALITY REGIONAL BY ROW;
+
+statement ok
ALTER TABLE t65064 INJECT STATISTICS '[
{
"columns": ["username"],
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/super_regions b/pkg/ccl/logictestccl/testdata/logic_test/super_regions
index c36242c461c7..12ba356eee67 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/super_regions
+++ b/pkg/ccl/logictestccl/testdata/logic_test/super_regions
@@ -31,8 +31,14 @@ ALTER DATABASE db ADD SUPER REGION "test2" VALUES "us-east-1"
statement ok
CREATE DATABASE mr1 PRIMARY REGION "us-east-1";
+
+statement ok
CREATE TABLE mr1.rbt(x INT) LOCALITY REGIONAL BY TABLE;
+
+statement ok
CREATE TABLE mr1.rbr(x INT) LOCALITY REGIONAL BY ROW;
+
+statement ok
ALTER DATABASE mr1 ADD SUPER REGION "test" VALUES "us-east-1";
query TT
@@ -588,6 +594,8 @@ ALTER DATABASE db DROP REGION "us-east-1";
# Dropping primary region.
statement ok
CREATE DATABASE db2 PRIMARY REGION "ca-central-1";
+
+statement ok
ALTER DATABASE db2 ADD SUPER REGION "test" VALUES "ca-central-1";
statement error pq: region ca-central-1 is part of super region test
@@ -598,7 +606,11 @@ ALTER DATABASE db2 DROP REGION "ca-central-1";
# to be part of another super region.
statement ok
CREATE DATABASE db3 PRIMARY REGION "ca-central-1" REGIONS "us-east-1", "us-west-1";
+
+statement ok
ALTER DATABASE db3 ADD SUPER REGION "test1" VALUES "ca-central-1", "us-west-1";
+
+statement ok
ALTER DATABASE db3 ADD SUPER REGION "test2" VALUES "us-east-1";
statement ok
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/zone b/pkg/ccl/logictestccl/testdata/logic_test/zone
index 7201f7123194..060e74f6449e 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/zone
+++ b/pkg/ccl/logictestccl/testdata/logic_test/zone
@@ -582,17 +582,33 @@ CONSTRAINTS='[+region=us-east1, -region=us-east1]'
# names.
statement ok
CREATE DATABASE "my database";
+
+statement ok
USE "my database";
+
+statement ok
CREATE TABLE "my table" (x INT PRIMARY KEY) PARTITION BY LIST (x) (
PARTITION "my partition" VALUES IN (1)
);
+
+statement ok
CREATE INDEX "my index" ON "my table" (x) PARTITION BY LIST (x) (
PARTITION "my partition" VALUES IN (1)
);
+
+statement ok
ALTER DATABASE "my database" CONFIGURE ZONE USING num_replicas = 1;
+
+statement ok
ALTER TABLE "my table" CONFIGURE ZONE USING num_replicas = 1;
+
+statement ok
ALTER INDEX "my table"@"my index" CONFIGURE ZONE USING num_replicas = 1;
+
+statement ok
ALTER PARTITION "my partition" OF INDEX "my table"@"my table_pkey" CONFIGURE ZONE USING num_replicas = 1;
+
+statement ok
ALTER PARTITION "my partition" OF INDEX "my table"@"my index" CONFIGURE ZONE USING num_replicas = 1
query TTTTTT
@@ -750,9 +766,13 @@ subtest authorization
statement ok
CREATE DATABASE auth;
+
+statement ok
CREATE TABLE auth.t (x INT PRIMARY KEY) PARTITION BY LIST (x) (
PARTITION p VALUES IN (1)
);
+
+statement ok
CREATE INDEX x ON auth.t (x) PARTITION BY LIST (x) (
PARTITION p VALUES IN (1)
)
@@ -1060,6 +1080,8 @@ parent_modify NULL ALTER TABLE test.public.parent_modify CONFIGURE ZONE USING
# change don't drop zone configs on rewritten indexes.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY,
y INT NOT NULL,
@@ -1069,6 +1091,8 @@ CREATE TABLE t (
INDEX i2 (w),
FAMILY (x, y, z, w)
);
+
+statement ok
ALTER INDEX t@i1 PARTITION BY LIST (z) (
PARTITION p1 VALUES IN (1, 2),
PARTITION p2 VALUES IN (3, 4)
@@ -1077,10 +1101,14 @@ ALTER INDEX t@i2 PARTITION BY LIST (w) (
PARTITION p3 VALUES IN (5, 6),
PARTITION p4 VALUES IN (7, 8)
);
+
+statement ok
ALTER PARTITION p1 OF INDEX t@i1 CONFIGURE ZONE USING gc.ttlseconds = 15210;
ALTER PARTITION p2 OF INDEX t@i1 CONFIGURE ZONE USING gc.ttlseconds = 15213;
ALTER PARTITION p3 OF INDEX t@i2 CONFIGURE ZONE USING gc.ttlseconds = 15411;
ALTER PARTITION p4 OF INDEX t@i2 CONFIGURE ZONE USING gc.ttlseconds = 15418;
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
# Ensure that all the partitions of i1 and i2 still have their zone configs.
diff --git a/pkg/ccl/multiregionccl/regional_by_row_test.go b/pkg/ccl/multiregionccl/regional_by_row_test.go
index 379949222865..68bb68f4efdc 100644
--- a/pkg/ccl/multiregionccl/regional_by_row_test.go
+++ b/pkg/ccl/multiregionccl/regional_by_row_test.go
@@ -596,27 +596,21 @@ func TestIndexCleanupAfterAlterFromRegionalByRow(t *testing.T) {
)
defer cleanup()
- _, err := sqlDB.Exec(
- `CREATE DATABASE "mr-zone-configs" WITH PRIMARY REGION "us-east1" REGIONS "us-east2", "us-east3";
-USE "mr-zone-configs";
+ sqlRunner := sqlutils.MakeSQLRunner(sqlDB)
+ sqlRunner.Exec(t, `CREATE DATABASE "mr-zone-configs" WITH PRIMARY REGION "us-east1" REGIONS "us-east2","us-east3";`)
+ sqlRunner.Exec(t, `USE "mr-zone-configs";`)
+ sqlRunner.Exec(t, `
CREATE TABLE regional_by_row (
pk INT PRIMARY KEY,
region_col crdb_internal_region NOT NULL,
i INT,
INDEX(i)
) LOCALITY REGIONAL BY ROW`)
- require.NoError(t, err)
// Alter the table to REGIONAL BY TABLE, and then back to REGIONAL BY ROW, to
// create some indexes that need cleaning up.
- _, err = sqlDB.Exec(
- fmt.Sprintf(
- `ALTER TABLE regional_by_row SET LOCALITY %s;
- ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY ROW`,
- tc.locality,
- ),
- )
- require.NoError(t, err)
+ sqlRunner.Exec(t, fmt.Sprintf(`ALTER TABLE regional_by_row SET LOCALITY %s;`, tc.locality))
+ sqlRunner.Exec(t, `ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY ROW`)
// Validate that the indexes requiring cleanup exist.
type row struct {
@@ -626,7 +620,7 @@ CREATE TABLE regional_by_row (
for {
// First confirm that the schema change job has completed
- res := sqlDB.QueryRow(`WITH jobs AS (
+ res := sqlRunner.QueryRow(t, `WITH jobs AS (
SELECT status, crdb_internal.pb_to_json(
'cockroach.sql.jobs.jobspb.Payload',
payload,
@@ -638,11 +632,8 @@ CREATE TABLE regional_by_row (
FROM jobs
WHERE (job->>'schemaChange') IS NOT NULL AND status = 'running'`)
- require.NoError(t, res.Err())
-
numJobs := 0
- err = res.Scan(&numJobs)
- require.NoError(t, err)
+ res.Scan(&numJobs)
if numJobs == 0 {
break
}
@@ -661,14 +652,12 @@ CREATE TABLE regional_by_row (
FROM jobs
WHERE (job->>'schemaChangeGC') IS NOT NULL AND status = '%s'`
- res, err := sqlDB.Query(fmt.Sprintf(query, status))
- require.NoError(t, err)
+ res := sqlRunner.Query(t, fmt.Sprintf(query, status))
var rows []row
for res.Next() {
r := row{}
- err = res.Scan(&r.status, &r.details)
- require.NoError(t, err)
+ require.NoError(t, res.Scan(&r.status, &r.details))
rows = append(rows, r)
}
if err := res.Err(); err != nil {
@@ -689,7 +678,7 @@ CREATE TABLE regional_by_row (
expectedGCJobsForDrops := 4
expectedGCJobsForTempIndexes := 4
// Now check that we have the right number of index GC jobs pending.
- err = queryIndexGCJobsAndValidateCount(`running`, expectedGCJobsForDrops+expectedGCJobsForTempIndexes)
+ err := queryIndexGCJobsAndValidateCount(`running`, expectedGCJobsForDrops+expectedGCJobsForTempIndexes)
require.NoError(t, err)
err = queryIndexGCJobsAndValidateCount(`succeeded`, 0)
require.NoError(t, err)
@@ -707,8 +696,7 @@ CREATE TABLE regional_by_row (
require.NoError(t, err)
// Change gc.ttlseconds to speed up the cleanup.
- _, err = sqlDB.Exec(`ALTER TABLE regional_by_row CONFIGURE ZONE USING gc.ttlseconds = 1`)
- require.NoError(t, err)
+ _ = sqlRunner.Exec(t, `ALTER TABLE regional_by_row CONFIGURE ZONE USING gc.ttlseconds = 1`)
// Validate that indexes are cleaned up.
testutils.SucceedsSoon(t, queryAndEnsureThatIndexGCJobsSucceeded(expectedGCJobsForDrops+expectedGCJobsForTempIndexes))
diff --git a/pkg/ccl/partitionccl/drop_test.go b/pkg/ccl/partitionccl/drop_test.go
index 5615099ba619..5f55395ca2f5 100644
--- a/pkg/ccl/partitionccl/drop_test.go
+++ b/pkg/ccl/partitionccl/drop_test.go
@@ -196,18 +196,17 @@ SELECT job_id
tdb := sqlutils.MakeSQLRunner(tc.ServerConn(0))
+ tdb.Exec(t, `CREATE TYPE typ AS ENUM ('a', 'b', 'c')`)
tdb.Exec(t, `
- CREATE TYPE typ AS ENUM ('a', 'b', 'c');
- CREATE TABLE t (e typ PRIMARY KEY) PARTITION BY LIST (e) (
+ CREATE TABLE t (e typ PRIMARY KEY) PARTITION BY LIST (e) (
PARTITION a VALUES IN ('a'),
PARTITION b VALUES IN ('b'),
PARTITION c VALUES IN ('c')
- );
- CREATE INDEX idx ON t (e);
- ALTER PARTITION a OF TABLE t CONFIGURE ZONE USING range_min_bytes = 123456, range_max_bytes = 654321;
- ALTER INDEX t@idx CONFIGURE ZONE USING gc.ttlseconds = 1;
- DROP INDEX t@idx;
- `)
+ )`)
+ tdb.Exec(t, `CREATE INDEX idx ON t (e)`)
+ tdb.Exec(t, `ALTER PARTITION a OF TABLE t CONFIGURE ZONE USING range_min_bytes = 123456, range_max_bytes = 654321`)
+ tdb.Exec(t, `ALTER INDEX t@idx CONFIGURE ZONE USING gc.ttlseconds = 1`)
+ tdb.Exec(t, `DROP INDEX t@idx`)
waitForJobDone(t, tdb, "GC for DROP INDEX%idx")
})
@@ -237,28 +236,29 @@ SELECT job_id
tdb := sqlutils.MakeSQLRunner(tc.ServerConn(0))
+ tdb.Exec(t, `CREATE TYPE typ AS ENUM ('a', 'b', 'c')`)
tdb.Exec(t, `
- CREATE TYPE typ AS ENUM ('a', 'b', 'c');
- CREATE TABLE t (e typ PRIMARY KEY) PARTITION BY LIST (e) (
+ CREATE TABLE t (e typ PRIMARY KEY) PARTITION BY LIST (e) (
PARTITION a VALUES IN ('a'),
PARTITION b VALUES IN ('b'),
PARTITION c VALUES IN ('c')
- );
- CREATE INDEX idx
+ )`)
+ tdb.Exec(t, `
+ CREATE INDEX idx
ON t (e)
PARTITION BY LIST (e)
(
PARTITION ai VALUES IN ('a'),
PARTITION bi VALUES IN ('b'),
PARTITION ci VALUES IN ('c')
- );
- ALTER PARTITION ai OF INDEX t@idx CONFIGURE ZONE USING range_min_bytes = 123456, range_max_bytes = 654321;
- ALTER PARTITION a OF TABLE t CONFIGURE ZONE USING range_min_bytes = 123456, range_max_bytes = 654321;
- ALTER INDEX t@idx CONFIGURE ZONE USING gc.ttlseconds = 1;
- DROP INDEX t@idx;
- DROP TABLE t;
- DROP TYPE typ;
- `)
+ )`,
+ )
+ tdb.Exec(t, `ALTER PARTITION ai OF INDEX t@idx CONFIGURE ZONE USING range_min_bytes = 123456,range_max_bytes = 654321`)
+ tdb.Exec(t, `ALTER PARTITION a OF TABLE t CONFIGURE ZONE USING range_min_bytes = 123456, range_max_bytes = 654321`)
+ tdb.Exec(t, `ALTER INDEX t@idx CONFIGURE ZONE USING gc.ttlseconds = 1`)
+ tdb.Exec(t, `DROP INDEX t@idx`)
+ tdb.Exec(t, `DROP TABLE t`)
+ tdb.Exec(t, `DROP TYPE typ`)
waitForJobDone(t, tdb, "GC for DROP INDEX%idx")
tdb.Exec(t, `ALTER RANGE default CONFIGURE ZONE USING gc.ttlseconds = 1`)
diff --git a/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/list_partitions b/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/list_partitions
index 4c7c06ddbfcc..b98579e156d6 100644
--- a/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/list_partitions
+++ b/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/list_partitions
@@ -55,6 +55,9 @@ splits database=db table=list_partitions
# Try the same thing on a secondary index.
exec-sql
CREATE INDEX idx ON db.list_partitions (j);
+----
+
+exec-sql
ALTER INDEX db.list_partitions@idx PARTITION BY LIST (j) (
PARTITION one_and_five VALUES IN (2, 5),
PARTITION four_and_three VALUES IN (4, 3),
diff --git a/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/mixed_partitions b/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/mixed_partitions
index 463fae82b9af..24c784ff4f4f 100644
--- a/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/mixed_partitions
+++ b/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/mixed_partitions
@@ -42,6 +42,9 @@ splits database=db table=list_then_range_partitions
# Try the same thing on a secondary index.
exec-sql
CREATE INDEX idx ON db.list_then_range_partitions (C1, N2);
+----
+
+exec-sql
ALTER INDEX db.list_then_range_partitions@idx PARTITION BY LIST (C1) (
PARTITION P1C1 VALUES IN ('A', 'C')
PARTITION BY RANGE (N2) (
@@ -135,6 +138,9 @@ splits database=db table=list_then_list_then_range_partitions_mixed
# Try the same thing on a secondary index.
exec-sql
CREATE INDEX idx ON db.list_then_list_then_range_partitions_mixed (C1, C2, N3);
+----
+
+exec-sql
ALTER INDEX db.list_then_list_then_range_partitions_mixed@idx PARTITION BY LIST (C1) (
PARTITION P1C1 VALUES IN ('A', 'C'),
PARTITION P2C1 VALUES IN ('B', 'D')
diff --git a/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/multi_column_partitions b/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/multi_column_partitions
index e2d4a5212852..c2e1d4cf4d1f 100644
--- a/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/multi_column_partitions
+++ b/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/multi_column_partitions
@@ -35,6 +35,9 @@ splits database=db table=list_multi_column_partitions
# Try the same thing on a secondary index.
exec-sql
CREATE INDEX idx ON db.list_multi_column_partitions(i, j);
+----
+
+exec-sql
ALTER INDEX db.list_multi_column_partitions@idx PARTITION BY LIST (i, j) (
PARTITION two_and_default VALUES IN ((2, DEFAULT)),
PARTITION six_and_seven VALUES IN ((6, 7)),
diff --git a/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/range_partitions b/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/range_partitions
index 926e524d68b4..ed825a91c403 100644
--- a/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/range_partitions
+++ b/pkg/ccl/spanconfigccl/spanconfigsplitterccl/testdata/range_partitions
@@ -24,6 +24,9 @@ splits database=db table=range_partitions
# Try the same thing on a secondary index.
exec-sql
CREATE INDEX idx ON db.range_partitions (j);
+----
+
+exec-sql
ALTER INDEX db.range_partitions@idx PARTITION BY RANGE (j) (
PARTITION less_than_five VALUES FROM (minvalue) to (5),
PARTITION between_five_and_ten VALUES FROM (5) to (10),
diff --git a/pkg/ccl/spanconfigccl/spanconfigsqlwatcherccl/sqlwatcher_test.go b/pkg/ccl/spanconfigccl/spanconfigsqlwatcherccl/sqlwatcher_test.go
index adeb62e5fc9c..e7d3dc9d0769 100644
--- a/pkg/ccl/spanconfigccl/spanconfigsqlwatcherccl/sqlwatcher_test.go
+++ b/pkg/ccl/spanconfigccl/spanconfigsqlwatcherccl/sqlwatcher_test.go
@@ -10,6 +10,7 @@ package spanconfigsqlwatcherccl
import (
"context"
+ "strings"
"sync"
"sync/atomic"
"testing"
@@ -132,97 +133,117 @@ func TestSQLWatcherReactsToUpdates(t *testing.T) {
}()
testCases := []struct {
- stmt string
+ stmts []string
expectedIDs descpb.IDs
expectedPTSUpdates []spanconfig.ProtectedTimestampUpdate
}{
{
- stmt: "CREATE TABLE t()",
+ stmts: []string{"CREATE TABLE t()"},
expectedIDs: ids(1),
},
{
- stmt: "CREATE TABLE t2(); ALTER TABLE t2 CONFIGURE ZONE USING num_replicas = 3",
+ stmts: []string{
+ "CREATE TABLE t2();",
+ "ALTER TABLE t2 CONFIGURE ZONE USING num_replicas = 3",
+ },
expectedIDs: ids(2),
},
{
- stmt: "CREATE DATABASE d; CREATE TABLE d.t1(); CREATE TABLE d.t2()",
+ stmts: []string{
+ "CREATE DATABASE d;",
+ "CREATE TABLE d.t1();",
+ "CREATE TABLE d.t2()",
+ },
expectedIDs: ids(3, 4, 5, 6),
},
{
- stmt: "ALTER DATABASE d CONFIGURE ZONE USING num_replicas=5",
+ stmts: []string{"ALTER DATABASE d CONFIGURE ZONE USING num_replicas=5"},
expectedIDs: ids(3),
},
{
- stmt: "CREATE TABLE t3(); CREATE TABLE t4()",
+ stmts: []string{
+ "CREATE TABLE t3();",
+ "CREATE TABLE t4()",
+ },
expectedIDs: ids(7, 8),
},
{
- stmt: "ALTER TABLE t3 CONFIGURE ZONE USING num_replicas=5; CREATE TABLE t5(); DROP TABLE t4;",
+ stmts: []string{
+ "ALTER TABLE t3 CONFIGURE ZONE USING num_replicas=5;",
+ "CREATE TABLE t5();",
+ "DROP TABLE t4;",
+ },
expectedIDs: ids(7, 8, 9),
},
// Named zone tests.
{
- stmt: "ALTER RANGE DEFAULT CONFIGURE ZONE USING num_replicas = 7",
+ stmts: []string{"ALTER RANGE DEFAULT CONFIGURE ZONE USING num_replicas = 7"},
expectedIDs: descpb.IDs{keys.RootNamespaceID},
},
{
- stmt: "ALTER RANGE liveness CONFIGURE ZONE USING num_replicas = 7",
+ stmts: []string{"ALTER RANGE liveness CONFIGURE ZONE USING num_replicas = 7"},
expectedIDs: descpb.IDs{keys.LivenessRangesID},
},
{
- stmt: "ALTER RANGE meta CONFIGURE ZONE USING num_replicas = 7",
+ stmts: []string{"ALTER RANGE meta CONFIGURE ZONE USING num_replicas = 7"},
expectedIDs: descpb.IDs{keys.MetaRangesID},
},
{
- stmt: "ALTER RANGE system CONFIGURE ZONE USING num_replicas = 7",
+ stmts: []string{"ALTER RANGE system CONFIGURE ZONE USING num_replicas = 7"},
expectedIDs: descpb.IDs{keys.SystemRangesID},
},
{
- stmt: "ALTER RANGE timeseries CONFIGURE ZONE USING num_replicas = 7",
+ stmts: []string{"ALTER RANGE timeseries CONFIGURE ZONE USING num_replicas = 7"},
expectedIDs: descpb.IDs{keys.TimeseriesRangesID},
},
// Test that events on types/schemas are also captured.
{
- stmt: "CREATE DATABASE db; CREATE SCHEMA db.sc",
+ stmts: []string{
+ "CREATE DATABASE db;",
+ "CREATE SCHEMA db.sc",
+ },
// One ID each for the parent database, the public schema and the schema.
expectedIDs: ids(10, 11, 12),
},
{
- stmt: "CREATE TYPE typ AS ENUM()",
+ stmts: []string{"CREATE TYPE typ AS ENUM()"},
// One ID each for the enum and the array type.
expectedIDs: ids(13, 14),
},
// Test that pts updates are seen.
{
- stmt: "BACKUP TABLE t,t2 INTO 'nodelocal://1/foo'",
+ stmts: []string{"BACKUP TABLE t,t2 INTO 'nodelocal://1/foo'"},
expectedIDs: ids(1, 2),
},
{
- stmt: "BACKUP DATABASE d INTO 'nodelocal://1/foo'",
+ stmts: []string{"BACKUP DATABASE d INTO 'nodelocal://1/foo'"},
expectedIDs: ids(3),
},
{
- stmt: "BACKUP TABLE d.* INTO 'nodelocal://1/foo'",
+ stmts: []string{"BACKUP TABLE d.* INTO 'nodelocal://1/foo'"},
expectedIDs: ids(3),
},
{
- stmt: "BACKUP INTO 'nodelocal://1/foo'",
+ stmts: []string{"BACKUP INTO 'nodelocal://1/foo'"},
expectedPTSUpdates: []spanconfig.ProtectedTimestampUpdate{{ClusterTarget: true,
TenantTarget: roachpb.TenantID{}}},
},
{
- stmt: `
-SELECT crdb_internal.create_tenant(2);
-BACKUP TENANT 2 INTO 'nodelocal://1/foo'`,
+ stmts: []string{
+ "SELECT crdb_internal.create_tenant(2);",
+ "BACKUP TENANT 2 INTO 'nodelocal://1/foo'",
+ },
expectedPTSUpdates: []spanconfig.ProtectedTimestampUpdate{{ClusterTarget: false,
TenantTarget: roachpb.MakeTenantID(2)}},
},
}
for _, tc := range testCases {
- t.Run(tc.stmt, func(t *testing.T) {
+ t.Run(strings.Join(tc.stmts, "_"), func(t *testing.T) {
reset()
- tdb.Exec(t, tc.stmt)
+ for _, stmt := range tc.stmts {
+ tdb.Exec(t, stmt)
+ }
afterStmtTS := ts.Clock().Now()
testutils.SucceedsSoon(t, func() error {
diff --git a/pkg/ccl/telemetryccl/testdata/telemetry/multiregion b/pkg/ccl/telemetryccl/testdata/telemetry/multiregion
index 628047bf311d..70675df86173 100644
--- a/pkg/ccl/telemetryccl/testdata/telemetry/multiregion
+++ b/pkg/ccl/telemetryccl/testdata/telemetry/multiregion
@@ -301,6 +301,9 @@ sql.multiregion.alter_table.locality.from.regional_by_row.to.regional_by_table_i
exec
ALTER TABLE t5 SET LOCALITY REGIONAL BY ROW;
+----
+
+exec
ALTER TABLE t5 ADD COLUMN cr crdb_internal_region NOT NULL
----
diff --git a/pkg/cli/interactive_tests/test_exec_log.tcl b/pkg/cli/interactive_tests/test_exec_log.tcl
index 1bdbd2326293..3b7de6218bdc 100644
--- a/pkg/cli/interactive_tests/test_exec_log.tcl
+++ b/pkg/cli/interactive_tests/test_exec_log.tcl
@@ -84,12 +84,19 @@ eexpect 999
eexpect 999
eexpect root@
-# Two standalone statements that will want separate counters.
+# Two statements sent in a batch will have the same counter.
send "SELECT 660+6; SELECT 660+6;\r"
eexpect 666
eexpect 666
eexpect root@
+# Two standalone statements that will want separate counters.
+send "SELECT 550+5;\r"
+eexpect 555
+send "SELECT 550+5;\r"
+eexpect 555
+eexpect root@
+
flush_server_logs
# Now check the items are there in the log file. We need to iterate
@@ -100,17 +107,18 @@ flush_server_logs
# previous statement is also in the log file after this check
# succeeds.
system "for i in `seq 1 3`; do
- grep 'SELECT ..*660..* +' $logfile && exit 0;
+ grep 'SELECT ..*550..* +' $logfile && exit 0;
echo still waiting;
sleep 1;
done;
echo 'not finding two separate txn counter values?';
-grep 'SELECT ..*660..* +' $logfile;
+grep 'SELECT ..*550..* +' $logfile;
exit 1;"
# Two separate single-stmt txns.
-system "n=`grep 'SELECT ..*660..* +' $logfile | sed -e 's/.*TxnCounter.:\\(\[0-9\]*\\)/\\1/g' | uniq | wc -l`; if test \$n -ne 2; then echo unexpected \$n; exit 1; fi"
+system "n=`grep 'SELECT ..*550..* +' $logfile | sed -e 's/.*TxnCounter.:\\(\[0-9\]*\\)/\\1/g' | uniq | wc -l`; if test \$n -ne 2; then echo unexpected \$n; exit 1; fi"
# Same txns.
+system "n=`grep 'SELECT ..*660..* +' $logfile | sed -e 's/.*TxnCounter.:\\(\[0-9\]*\\)/\\1/g' | uniq | wc -l`; if test \$n -ne 1; then echo unexpected \$n; exit 1; fi"
system "n=`grep 'SELECT ..*770..* +' $logfile | sed -e 's/.*TxnCounter.:\\(\[0-9\]*\\)/\\1/g' | uniq | wc -l`; if test \$n -ne 1; then echo unexpected \$n; exit 1; fi"
system "n=`grep 'SELECT ..*880..* +' $logfile | sed -e 's/.*TxnCounter.:\\(\[0-9\]*\\)/\\1/g' | uniq | wc -l`; if test \$n -ne 1; then echo unexpected \$n; exit 1; fi"
system "n=`grep 'SELECT ..*990..* +' $logfile | sed -e 's/.*TxnCounter.:\\(\[0-9\]*\\)/\\1/g' | uniq | wc -l`; if test \$n -ne 1; then echo unexpected \$n; exit 1; fi"
diff --git a/pkg/internal/sqlsmith/setup.go b/pkg/internal/sqlsmith/setup.go
index 3f428e804798..e2de50f87a9c 100644
--- a/pkg/internal/sqlsmith/setup.go
+++ b/pkg/internal/sqlsmith/setup.go
@@ -108,7 +108,8 @@ func randTablesN(r *rand.Rand, n int) string {
const (
seedTable = `
-CREATE TYPE greeting AS ENUM ('hello', 'howdy', 'hi', 'good day', 'morning');
+BEGIN; CREATE TYPE greeting AS ENUM ('hello', 'howdy', 'hi', 'good day', 'morning'); COMMIT;
+BEGIN;
CREATE TABLE IF NOT EXISTS seed AS
SELECT
g::INT2 AS _int2,
@@ -130,6 +131,7 @@ CREATE TABLE IF NOT EXISTS seed AS
enum_range('hello'::greeting)[g] as _enum
FROM
generate_series(1, 5) AS g;
+COMMIT;
INSERT INTO seed DEFAULT VALUES;
CREATE INDEX on seed (_int8, _float8, _date);
diff --git a/pkg/jobs/jobs_test.go b/pkg/jobs/jobs_test.go
index e1a73a4ad682..44d7dbb5a73b 100644
--- a/pkg/jobs/jobs_test.go
+++ b/pkg/jobs/jobs_test.go
@@ -2040,9 +2040,10 @@ func TestShowJobsWithError(t *testing.T) {
// Create at least 6 rows, ensuring 3 rows are corrupted.
// Ensure there is at least one row in system.jobs.
- if _, err := sqlDB.Exec(`
- CREATE TABLE foo(x INT); ALTER TABLE foo ADD COLUMN y INT;
- `); err != nil {
+ if _, err := sqlDB.Exec(`CREATE TABLE foo(x INT);`); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := sqlDB.Exec(`ALTER TABLE foo ADD COLUMN y INT;`); err != nil {
t.Fatal(err)
}
// Get the id of the ADD COLUMN job to use later.
diff --git a/pkg/server/stats_test.go b/pkg/server/stats_test.go
index cd165579ef79..bedca43947fb 100644
--- a/pkg/server/stats_test.go
+++ b/pkg/server/stats_test.go
@@ -183,6 +183,7 @@ func TestSQLStatCollection(t *testing.T) {
s, sqlDB, _ := serverutils.StartServer(t, params)
defer s.Stopper().Stop(ctx)
+ sqlRunner := sqlutils.MakeSQLRunner(sqlDB)
sqlServer := s.(*TestServer).Server.sqlServer.pgServer.SQLServer
// Flush stats at the beginning of the test.
@@ -190,15 +191,11 @@ func TestSQLStatCollection(t *testing.T) {
sqlServer.GetReportedSQLStatsController().ResetLocalSQLStats(ctx)
// Execute some queries against the sqlDB to build up some stats.
- if _, err := sqlDB.Exec(`
- CREATE DATABASE t;
- CREATE TABLE t.test (x INT PRIMARY KEY);
- INSERT INTO t.test VALUES (1);
- INSERT INTO t.test VALUES (2);
- INSERT INTO t.test VALUES (3);
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `CREATE DATABASE t`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (x INT PRIMARY KEY);`)
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (1);`)
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (2);`)
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (3);`)
// Collect stats from the SQL server and ensure our queries are present.
stats, err := sqlServer.GetScrubbedStmtStats(ctx)
@@ -241,14 +238,10 @@ func TestSQLStatCollection(t *testing.T) {
}
// Make another query to the db.
- if _, err := sqlDB.Exec(`
- INSERT INTO t.test VALUES (4);
- INSERT INTO t.test VALUES (5);
- INSERT INTO t.test VALUES (6);
- CREATE USER us WITH PASSWORD 'pass';
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (4);`)
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (5);`)
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (6);`)
+ sqlRunner.Exec(t, `CREATE USER us WITH PASSWORD 'pass';`)
// Find and record the stats for our second query.
stats, err = sqlServer.GetScrubbedStmtStats(ctx)
@@ -294,15 +287,12 @@ func TestSQLStatCollection(t *testing.T) {
}
func populateStats(t *testing.T, sqlDB *gosql.DB) {
- if _, err := sqlDB.Exec(`
- CREATE DATABASE t;
- CREATE TABLE t.test (x INT PRIMARY KEY);
- INSERT INTO t.test VALUES (1);
- INSERT INTO t.test VALUES (2);
- INSERT INTO t.test VALUES (3);
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner := sqlutils.MakeSQLRunner(sqlDB)
+ sqlRunner.Exec(t, `CREATE DATABASE t;`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (x INT PRIMARY KEY);`)
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (1);`)
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (2);`)
+ sqlRunner.Exec(t, `INSERT INTO t.test VALUES (3);`)
}
func TestClusterResetSQLStats(t *testing.T) {
diff --git a/pkg/sql/alter_column_type_test.go b/pkg/sql/alter_column_type_test.go
index 5d666521f3a2..c206bbe45a7b 100644
--- a/pkg/sql/alter_column_type_test.go
+++ b/pkg/sql/alter_column_type_test.go
@@ -263,15 +263,12 @@ func TestAlterColumnTypeFailureRollback(t *testing.T) {
defer s.Stopper().Stop(ctx)
sqlDB.Exec(t, `SET enable_experimental_alter_column_type_general = true;`)
+ sqlDB.Exec(t, `CREATE DATABASE t;`)
+ sqlDB.Exec(t, `CREATE TABLE t.test (x STRING);`)
+ sqlDB.Exec(t, `INSERT INTO t.test VALUES ('1'), ('2'), ('HELLO');`)
expected := "pq: could not parse \"HELLO\" as type int: strconv.ParseInt: parsing \"HELLO\": invalid syntax"
-
- sqlDB.ExpectErr(t, expected, `
-CREATE DATABASE t;
-CREATE TABLE t.test (x STRING);
-INSERT INTO t.test VALUES ('1'), ('2'), ('HELLO');
-ALTER TABLE t.test ALTER COLUMN x TYPE INT;
-`)
+ sqlDB.ExpectErr(t, expected, `ALTER TABLE t.test ALTER COLUMN x TYPE INT;`)
// Ensure that the add column and column swap mutations are cleaned up.
testutils.SucceedsSoon(t, func() error {
@@ -300,12 +297,10 @@ func TestQueryIntToString(t *testing.T) {
sqlDB.Exec(t, `SET enable_experimental_alter_column_type_general = true;`)
- sqlDB.Exec(t, `
-CREATE DATABASE t;
-CREATE TABLE t.test (x INT, y INT, z INT);
-INSERT INTO t.test VALUES (1, 1, 1), (2, 2, 2);
-ALTER TABLE t.test ALTER COLUMN y TYPE STRING;
-`)
+ sqlDB.Exec(t, `CREATE DATABASE t;`)
+ sqlDB.Exec(t, `CREATE TABLE t.test (x INT, y INT, z INT);`)
+ sqlDB.Exec(t, `INSERT INTO t.test VALUES (1, 1, 1), (2, 2, 2);`)
+ sqlDB.Exec(t, `ALTER TABLE t.test ALTER COLUMN y TYPE STRING;`)
sqlDB.ExecSucceedsSoon(t, `INSERT INTO t.test VALUES (3, 'HELLO', 3);`)
diff --git a/pkg/sql/colfetcher/vectorized_batch_size_test.go b/pkg/sql/colfetcher/vectorized_batch_size_test.go
index 613af7a7e2ae..66f4e2de2586 100644
--- a/pkg/sql/colfetcher/vectorized_batch_size_test.go
+++ b/pkg/sql/colfetcher/vectorized_batch_size_test.go
@@ -148,11 +148,13 @@ func TestCFetcherLimitsOutputBatch(t *testing.T) {
// such setup the cFetcher will allocate an output batch of capacity 50, yet
// after setting the 7th or so row the footprint of the batch will exceed
// the memory limit. As a result, we will get around 7 batches.
- _, err := conn.ExecContext(ctx, `
-SET distsql_workmem='128KiB';
-CREATE TABLE t (a PRIMARY KEY, b) AS SELECT i, repeat('a', 16 * 1024) FROM generate_series(1, 50) AS g(i);
-ANALYZE t
-`)
+ _, err := conn.ExecContext(ctx, `SET distsql_workmem='128KiB';`)
+ assert.NoError(t, err)
+ _, err = conn.ExecContext(ctx, `
+CREATE TABLE t (a PRIMARY KEY, b) AS
+SELECT i, repeat('a', 16 * 1024) FROM generate_series(1, 50) AS g(i);`)
+ assert.NoError(t, err)
+ _, err = conn.ExecContext(ctx, `ANALYZE t`)
assert.NoError(t, err)
batchCountRegex := regexp.MustCompile(`vectorized batch count: (\d+)`)
diff --git a/pkg/sql/conn_executor.go b/pkg/sql/conn_executor.go
index d715ff0cc428..ae665e2dee47 100644
--- a/pkg/sql/conn_executor.go
+++ b/pkg/sql/conn_executor.go
@@ -1842,7 +1842,14 @@ func (ex *connExecutor) execCmd() error {
)
res = stmtRes
- canAutoCommit := ex.implicitTxn()
+ // In the simple protocol, autocommit only when this is the last statement
+ // in the batch. This matches the Postgres behavior. See
+ // "Multiple Statements in a Single Query" at
+ // https://www.postgresql.org/docs/14/protocol-flow.html.
+ // The behavior is configurable, in case users want to preserve the
+ // behavior from v21.2 and earlier.
+ implicitTxnForBatch := ex.sessionData().EnableImplicitTransactionForBatchStatements
+ canAutoCommit := ex.implicitTxn() && (tcmd.LastInBatch || !implicitTxnForBatch)
ev, payload, err = ex.execStmt(
ctx, tcmd.Statement, nil /* prepared */, nil /* pinfo */, stmtRes, canAutoCommit,
)
diff --git a/pkg/sql/conn_executor_exec.go b/pkg/sql/conn_executor_exec.go
index 063d6111dcee..ef0f77c22dc1 100644
--- a/pkg/sql/conn_executor_exec.go
+++ b/pkg/sql/conn_executor_exec.go
@@ -523,9 +523,8 @@ func (ex *connExecutor) execStmtInOpenState(
switch s := ast.(type) {
case *tree.BeginTransaction:
- // BEGIN is only allowed if we are in an implicit txn that was started
- // in the extended protocol.
- if isExtendedProtocol && os.ImplicitTxn.Get() {
+ // BEGIN is only allowed if we are in an implicit txn.
+ if os.ImplicitTxn.Get() {
ex.sessionDataStack.PushTopClone()
return eventTxnUpgradeToExplicit{}, nil, nil
}
diff --git a/pkg/sql/conn_executor_test.go b/pkg/sql/conn_executor_test.go
index c578330f7a04..a3ec4c9683ae 100644
--- a/pkg/sql/conn_executor_test.go
+++ b/pkg/sql/conn_executor_test.go
@@ -1270,8 +1270,11 @@ ALTER TABLE t1 ADD COLUMN b INT DEFAULT 1`,
}
for _, tc := range testCases {
- if _, err := sqlConn.Exec(tc.stmt); err != nil {
- require.NoError(t, err, "executing %s ", tc.stmt)
+ stmts := strings.Split(tc.stmt, ";")
+ for _, s := range stmts {
+ if _, err := sqlConn.Exec(s); err != nil {
+ require.NoError(t, err, "executing %s ", s)
+ }
}
rows, err := sqlConn.Query("SHOW LAST QUERY STATISTICS RETURNING parse_latency, plan_latency, exec_latency, service_latency, post_commit_jobs_latency")
diff --git a/pkg/sql/conn_io.go b/pkg/sql/conn_io.go
index 216c6c3104fc..04b4eea645e3 100644
--- a/pkg/sql/conn_io.go
+++ b/pkg/sql/conn_io.go
@@ -136,6 +136,10 @@ type ExecStmt struct {
// stats reporting.
ParseStart time.Time
ParseEnd time.Time
+
+ // LastInBatch indicates if this command contains the last query in a
+ // simple protocol Query message that contains a batch of 1 or more queries.
+ LastInBatch bool
}
// command implements the Command interface.
diff --git a/pkg/sql/delete_preserving_index_test.go b/pkg/sql/delete_preserving_index_test.go
index 9c1475e055d7..2738a28ef925 100644
--- a/pkg/sql/delete_preserving_index_test.go
+++ b/pkg/sql/delete_preserving_index_test.go
@@ -14,6 +14,7 @@ import (
"context"
"math"
"reflect"
+ "strings"
"sync"
"testing"
@@ -86,8 +87,11 @@ SET use_declarative_schema_changer = 'off';
defer server.Stopper().Stop(context.Background())
getRevisionsForTest := func(setupSQL, schemaChangeSQL, dataSQL string, deletePreservingEncoding bool) ([]kvclient.VersionedValues, []byte, error) {
- if _, err := sqlDB.Exec(setupSQL); err != nil {
- t.Fatal(err)
+ setupStmts := strings.Split(setupSQL, ";")
+ for _, stmt := range setupStmts {
+ if _, err := sqlDB.Exec(stmt); err != nil {
+ t.Fatal(err)
+ }
}
// Start the schema change but pause right before the backfill.
diff --git a/pkg/sql/descriptor_mutation_test.go b/pkg/sql/descriptor_mutation_test.go
index 07fe56f85ad9..35b0815d5a5d 100644
--- a/pkg/sql/descriptor_mutation_test.go
+++ b/pkg/sql/descriptor_mutation_test.go
@@ -239,17 +239,14 @@ func TestOperationsWithColumnMutation(t *testing.T) {
params, _ := tests.CreateTestServerParams()
server, sqlDB, kvDB := serverutils.StartServer(t, params)
defer server.Stopper().Stop(ctx)
+ sqlRunner := sqlutils.MakeSQLRunner(sqlDB)
// Fix the column families so the key counts below don't change if the
// family heuristics are updated.
// Add an index so that we test adding a column when a table has an index.
- if _, err := sqlDB.Exec(`
-CREATE DATABASE t;
-CREATE TABLE t.test (k VARCHAR PRIMARY KEY DEFAULT 'default', v VARCHAR, i VARCHAR DEFAULT 'i', FAMILY (k), FAMILY (v), FAMILY (i));
-CREATE INDEX allidx ON t.test (k, v);
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `CREATE DATABASE t;`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (k VARCHAR PRIMARY KEY DEFAULT 'default', v VARCHAR, i VARCHAR DEFAULT 'i',FAMILY (k), FAMILY (v), FAMILY (i));`)
+ sqlRunner.Exec(t, `CREATE INDEX allidx ON t.test (k, v);`)
// read table descriptor
tableDesc := desctestutils.TestingGetMutableExistingTableDescriptor(
@@ -266,13 +263,9 @@ CREATE INDEX allidx ON t.test (k, v);
func(t *testing.T) {
// Init table to start state.
- if _, err := sqlDB.Exec(`
-DROP TABLE t.test;
-CREATE TABLE t.test (k VARCHAR PRIMARY KEY DEFAULT 'default', v VARCHAR, i VARCHAR DEFAULT 'i', FAMILY (k), FAMILY (v), FAMILY (i));
-CREATE INDEX allidx ON t.test (k, v);
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `DROP TABLE t.test;`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (k VARCHAR PRIMARY KEY DEFAULT 'default', v VARCHAR,i VARCHAR DEFAULT 'i', FAMILY (k), FAMILY (v), FAMILY (i));`)
+ sqlRunner.Exec(t, `CREATE INDEX allidx ON t.test (k, v);`)
// read table descriptor
mTest.tableDesc = desctestutils.TestingGetMutableExistingTableDescriptor(
@@ -512,13 +505,10 @@ func TestOperationsWithIndexMutation(t *testing.T) {
params, _ := tests.CreateTestServerParams()
server, sqlDB, kvDB := serverutils.StartServer(t, params)
defer server.Stopper().Stop(context.Background())
+ sqlRunner := sqlutils.MakeSQLRunner(sqlDB)
- if _, err := sqlDB.Exec(`
-CREATE DATABASE t;
-CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, INDEX foo (v));
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `CREATE DATABASE t;`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, INDEX foo (v));`)
// read table descriptor
tableDesc := desctestutils.TestingGetMutableExistingTableDescriptor(
@@ -538,15 +528,9 @@ CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, INDEX foo (v));
} {
t.Run(fmt.Sprintf("upsert=%t/state=%v", useUpsert, state), func(t *testing.T) {
// Init table with some entries.
- if _, err := sqlDB.Exec(`TRUNCATE TABLE t.test`); err != nil {
- t.Fatal(err)
- }
- if _, err := sqlDB.Exec(`
-DROP TABLE t.test;
-CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, INDEX foo (v));
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `TRUNCATE TABLE t.test`)
+ sqlRunner.Exec(t, `DROP TABLE t.test;`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, INDEX foo (v));`)
// read table descriptor
mTest.tableDesc = desctestutils.TestingGetMutableExistingTableDescriptor(
kvDB, keys.SystemSQLCodec, "t", "test")
@@ -689,18 +673,15 @@ func TestOperationsWithColumnAndIndexMutation(t *testing.T) {
server, sqlDB, kvDB := serverutils.StartServer(t, params)
ctx := context.Background()
defer server.Stopper().Stop(ctx)
+ sqlRunner := sqlutils.MakeSQLRunner(sqlDB)
// Create a table with column i and an index on v and i. Fix the column
// families so the key counts below don't change if the family heuristics
// are updated.
// Add an index so that we test adding a column when a table has an index.
- if _, err := sqlDB.Exec(`
-CREATE DATABASE t;
-CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, i CHAR, INDEX foo (i, v), FAMILY (k), FAMILY (v), FAMILY (i));
-CREATE INDEX allidx ON t.test (k, v);
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `CREATE DATABASE t;`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, i CHAR, INDEX foo (i, v), FAMILY (k),FAMILY (v), FAMILY (i));`)
+ sqlRunner.Exec(t, `CREATE INDEX allidx ON t.test (k, v);`)
// read table descriptor
tableDesc := desctestutils.TestingGetMutableExistingTableDescriptor(
@@ -728,13 +709,9 @@ CREATE INDEX allidx ON t.test (k, v);
continue
}
// Init table to start state.
- if _, err := sqlDB.Exec(`
-DROP TABLE t.test;
-CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, i CHAR, INDEX foo (i, v), FAMILY (k), FAMILY (v), FAMILY (i));
-CREATE INDEX allidx ON t.test (k, v);
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `DROP TABLE t.test;`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (k CHAR PRIMARY KEY, v CHAR, i CHAR, INDEX foo (i, v), FAMILY (k),FAMILY (v), FAMILY (i));`)
+ sqlRunner.Exec(t, `CREATE INDEX allidx ON t.test (k, v);`)
if _, err := sqlDB.Exec(`TRUNCATE TABLE t.test`); err != nil {
t.Fatal(err)
}
diff --git a/pkg/sql/exec_util.go b/pkg/sql/exec_util.go
index 18f012cd2fea..6b676d2c1363 100644
--- a/pkg/sql/exec_util.go
+++ b/pkg/sql/exec_util.go
@@ -3174,6 +3174,10 @@ func (m *sessionDataMutator) SetCostScansWithDefaultColSize(val bool) {
m.data.CostScansWithDefaultColSize = val
}
+func (m *sessionDataMutator) SetEnableImplicitTransactionForBatchStatements(val bool) {
+ m.data.EnableImplicitTransactionForBatchStatements = val
+}
+
// Utility functions related to scrubbing sensitive information on SQL Stats.
// quantizeCounts ensures that the Count field in the
diff --git a/pkg/sql/export.go b/pkg/sql/export.go
index dc4645123700..f2ceaf37098a 100644
--- a/pkg/sql/export.go
+++ b/pkg/sql/export.go
@@ -123,8 +123,8 @@ func (ef *execFactory) ConstructExport(
return nil, err
}
- if !ef.planner.ExtendedEvalContext().TxnImplicit {
- return nil, errors.Errorf("EXPORT cannot be used inside a transaction")
+ if !ef.planner.IsAutoCommit() {
+ return nil, errors.Errorf("EXPORT cannot be used inside a multi-statement transaction")
}
if fileSuffix != csvSuffix && fileSuffix != parquetSuffix {
diff --git a/pkg/sql/importer/import_planning.go b/pkg/sql/importer/import_planning.go
index 25a2d94a0722..f52eb45aa235 100644
--- a/pkg/sql/importer/import_planning.go
+++ b/pkg/sql/importer/import_planning.go
@@ -372,8 +372,8 @@ func importPlanHook(
ctx, span := tracing.ChildSpan(ctx, importStmt.StatementTag())
defer span.Finish()
- if !(p.ExtendedEvalContext().TxnImplicit || isDetached) {
- return errors.Errorf("IMPORT cannot be used inside a transaction without DETACHED option")
+ if !(p.IsAutoCommit() || isDetached) {
+ return errors.Errorf("IMPORT cannot be used inside a multi-statement transaction without DETACHED option")
}
if optsErr != nil {
diff --git a/pkg/sql/importer/import_stmt_test.go b/pkg/sql/importer/import_stmt_test.go
index f2aa3e231a45..453dc52038bf 100644
--- a/pkg/sql/importer/import_stmt_test.go
+++ b/pkg/sql/importer/import_stmt_test.go
@@ -2730,7 +2730,7 @@ func TestExportImportRoundTrip(t *testing.T) {
sqlDB := sqlutils.MakeSQLRunner(conn)
tests := []struct {
- stmts string
+ stmts []string
tbl string
expected string
}{
@@ -2738,23 +2738,29 @@ func TestExportImportRoundTrip(t *testing.T) {
// need to differ across runs, so we let the test runner format the stmts field
// with a unique directory name per run.
{
- stmts: `EXPORT INTO CSV 'nodelocal://0/%[1]s' FROM SELECT ARRAY['a', 'b', 'c'];
- CREATE TABLE t (x TEXT[]);
- IMPORT INTO t CSV DATA ('nodelocal://0/%[1]s/export*-n*.0.csv')`,
+ stmts: []string{
+ `EXPORT INTO CSV 'nodelocal://0/%[1]s' FROM SELECT ARRAY['a', 'b', 'c']`,
+ `CREATE TABLE t (%[1]s TEXT[])`,
+ `IMPORT INTO t CSV DATA ('nodelocal://0/%[1]s/export*-n*.0.csv')`,
+ },
tbl: "t",
expected: `SELECT ARRAY['a', 'b', 'c']`,
},
{
- stmts: `EXPORT INTO CSV 'nodelocal://0/%[1]s' FROM SELECT ARRAY[b'abc', b'\141\142\143', b'\x61\x62\x63'];
- CREATE TABLE t (x BYTES[]);
- IMPORT INTO t CSV DATA ('nodelocal://0/%[1]s/export*-n*.0.csv')`,
+ stmts: []string{
+ `EXPORT INTO CSV 'nodelocal://0/%[1]s' FROM SELECT ARRAY[b'abc', b'\141\142\143', b'\x61\x62\x63']`,
+ `CREATE TABLE t (%[1]s BYTES[])`,
+ `IMPORT INTO t CSV DATA ('nodelocal://0/%[1]s/export*-n*.0.csv')`,
+ },
tbl: "t",
expected: `SELECT ARRAY[b'abc', b'\141\142\143', b'\x61\x62\x63']`,
},
{
- stmts: `EXPORT INTO CSV 'nodelocal://0/%[1]s' FROM SELECT 'dog' COLLATE en;
- CREATE TABLE t (x STRING COLLATE en);
- IMPORT INTO t CSV DATA ('nodelocal://0/%[1]s/export*-n*.0.csv')`,
+ stmts: []string{
+ `EXPORT INTO CSV 'nodelocal://0/%[1]s' FROM SELECT 'dog' COLLATE en`,
+ `CREATE TABLE t (%[1]s STRING COLLATE en)`,
+ `IMPORT INTO t CSV DATA ('nodelocal://0/%[1]s/export*-n*.0.csv')`,
+ },
tbl: "t",
expected: `SELECT 'dog' COLLATE en`,
},
@@ -2762,7 +2768,9 @@ func TestExportImportRoundTrip(t *testing.T) {
for i, test := range tests {
sqlDB.Exec(t, fmt.Sprintf(`DROP TABLE IF EXISTS %s`, test.tbl))
- sqlDB.Exec(t, fmt.Sprintf(test.stmts, fmt.Sprintf("run%d", i)))
+ for _, stmt := range test.stmts {
+ sqlDB.Exec(t, fmt.Sprintf(stmt, fmt.Sprintf("run%d", i)))
+ }
sqlDB.CheckQueryResults(t, fmt.Sprintf(`SELECT * FROM %s`, test.tbl), sqlDB.QueryStr(t, test.expected))
}
}
@@ -6606,7 +6614,7 @@ func TestDetachedImport(t *testing.T) {
}
err := crdb.ExecuteTx(ctx, connDB, nil, importWithoutDetached)
require.True(t,
- testutils.IsError(err, "IMPORT cannot be used inside a transaction without DETACHED option"))
+ testutils.IsError(err, "IMPORT cannot be used inside a multi-statement transaction without DETACHED option"))
// We can execute IMPORT under transaction with detached option.
importWithDetached := func(txn *gosql.Tx) error {
diff --git a/pkg/sql/logictest/testdata/logic_test/aggregate b/pkg/sql/logictest/testdata/logic_test/aggregate
index 76249b6b8eb5..2e871da54671 100644
--- a/pkg/sql/logictest/testdata/logic_test/aggregate
+++ b/pkg/sql/logictest/testdata/logic_test/aggregate
@@ -3164,6 +3164,8 @@ false
statement ok
TRUNCATE t_every;
+
+statement ok
INSERT INTO t_every VALUES (NULL), (NULL), (NULL)
query B
diff --git a/pkg/sql/logictest/testdata/logic_test/alter_column_type b/pkg/sql/logictest/testdata/logic_test/alter_column_type
index e52e882368e4..a16042abb952 100644
--- a/pkg/sql/logictest/testdata/logic_test/alter_column_type
+++ b/pkg/sql/logictest/testdata/logic_test/alter_column_type
@@ -232,9 +232,17 @@ SELECT * FROM t3 ORDER BY id
# Ensure ALTER COLUMN TYPE correctly changes the precision of TIMESTAMPTZ.
statement ok
CREATE TABLE t5 (x TIMESTAMPTZ(6));
+
+statement ok
INSERT INTO t5 VALUES ('2016-01-25 10:10:10.555555-05:00');
+
+statement ok
INSERT INTO t5 VALUES ('2016-01-26 10:10:10.555555-05:00');
+
+statement ok
ALTER TABLE t5 ALTER COLUMN x TYPE TIMESTAMPTZ(3);
+
+statement ok
INSERT INTO t5 VALUES ('2016-01-26 10:10:10.55-05:00');
query T
@@ -247,7 +255,11 @@ SELECT * FROM t5 ORDER BY x
# Ensure column families stay the same.
statement ok
CREATE TABLE t6(id INT, id2 INT, FAMILY f1 (id), FAMILY f2 (id2));
+
+statement ok
INSERT INTO t6 VALUES (1), (2), (3);
+
+statement ok
ALTER TABLE t6 ALTER COLUMN id2 TYPE STRING;
query TT
@@ -263,11 +275,14 @@ t6 CREATE TABLE public.t6 (
)
# Ensure the type of the default column is checked
-statement error default for column "x" cannot be cast automatically to type DATE
+statement ok
CREATE TABLE t7 (x INT DEFAULT 1, y INT);
+
+statement ok
INSERT INTO t7 (y) VALUES (1), (2), (3);
+
+statement error default for column "x" cannot be cast automatically to type DATE
ALTER TABLE t7 ALTER COLUMN x TYPE DATE;
-INSERT INTO t7 (y) VALUES (4);
# Ensure a runtime error correctly rolls back and the table is unchanged.
statement ok
@@ -323,7 +338,11 @@ ALTER TABLE uniq ALTER COLUMN x TYPE STRING
# Ensure we cannot change the column type of a column stored in a secondary index.
statement ok
CREATE TABLE t15 (x INT, y INT);
+
+statement ok
CREATE INDEX ON t15 (x) STORING (y);
+
+statement ok
INSERT INTO t15 VALUES (1, 1), (2, 2)
statement error pq: unimplemented: ALTER COLUMN TYPE requiring rewrite of on-disk data is currently not supported for columns that are part of an index
@@ -332,6 +351,8 @@ ALTER TABLE t15 ALTER COLUMN y TYPE STRING;
# Ensure ALTER COLUMN TYPE works for collated strings.
statement ok
CREATE TABLE t16 (x STRING);
+
+statement ok
INSERT INTO t16 VALUES ('Backhaus'), ('Bär'), ('Baz');
query T
@@ -377,6 +398,8 @@ t17 CREATE TABLE public.t17 (
# Ensure ALTER COLUMN TYPE fails if the column is part of an FK relationship.
statement ok
CREATE TABLE t18 (x INT NOT NULL PRIMARY KEY);
+
+statement ok
CREATE TABLE t19 (y INT NOT NULL REFERENCES t18 (x), INDEX(y));
statement error pq: unimplemented: ALTER COLUMN TYPE requiring rewrite of on-disk data is currently not supported for columns that are part of an index
@@ -388,6 +411,8 @@ ALTER TABLE t19 ALTER COLUMN y TYPE STRING
# Ensure ALTER COLUMN TYPE does not work inside a transaction.
statement ok
CREATE TABLE t20 (x INT);
+
+statement ok
BEGIN
statement error pq: unimplemented: ALTER COLUMN TYPE is not supported inside a transaction
@@ -431,6 +456,8 @@ true
# Ensure ALTER COLUMN TYPE rolls back if is not applicable to value in the column.
statement ok
CREATE TABLE t24 (x STRING);
+
+statement ok
INSERT INTO t24 VALUES ('1'), ('hello');
statement error pq: could not parse "hello" as type int: strconv.ParseInt: parsing "hello": invalid syntax
@@ -457,6 +484,8 @@ ALTER TABLE t25 ALTER COLUMN x TYPE STRING USING (x);
statement ok
CREATE TABLE t26 (x INT);
+
+statement ok
CREATE TABLE t27 (x INT);
# Ensure USING EXPRESSION cannot reference columns that do not exist in the
@@ -484,7 +513,11 @@ ALTER TABLE t27 ALTER COLUMN x TYPE STRING USING (x::STRING)
# converting to the same type.
statement ok
CREATE TABLE t28(x INT);
+
+statement ok
INSERT INTO t28 VALUES (1), (2), (3);
+
+statement ok
ALTER TABLE t28 ALTER COLUMN x TYPE INT USING (x * 5)
query I
@@ -498,7 +531,11 @@ SELECT x FROM t28 ORDER BY x
# error before running the online schema change.
statement ok
CREATE TABLE t29 (x INT8);
+
+statement ok
INSERT INTO t29 VALUES (1), (2), (3);
+
+statement ok
ALTER TABLE t29 ALTER COLUMN x TYPE INT4;
query I
@@ -512,6 +549,8 @@ SELECT x FROM t29 ORDER BY x
statement ok
CREATE TABLE parent_71089 (id INT PRIMARY KEY);
+
+statement ok
CREATE TABLE child_71089 (a INT, b INT REFERENCES parent_71089 (id) NOT NULL)
statement ok
@@ -522,6 +561,8 @@ ALTER TABLE child_71089 ALTER COLUMN a TYPE FLOAT;
# try the conversion and error out if the cast cannot be applied.
statement ok
CREATE TABLE t30 (x STRING);
+
+statement ok
INSERT INTO t30 VALUES (e'a\\01');
statement error pq: could not parse "a\\\\01" as type bytes: bytea encoded value ends with incomplete escape sequence
@@ -546,6 +587,8 @@ ALTER TABLE t29 ALTER COLUMN x TYPE INT2
statement ok
CREATE TABLE regression_54844 (i int8);
+
+statement ok
INSERT INTO regression_54844 VALUES (-9223372036854775807)
statement error integer out of range for type int2
diff --git a/pkg/sql/logictest/testdata/logic_test/alter_primary_key b/pkg/sql/logictest/testdata/logic_test/alter_primary_key
index ad43177b293b..507ee9674527 100644
--- a/pkg/sql/logictest/testdata/logic_test/alter_primary_key
+++ b/pkg/sql/logictest/testdata/logic_test/alter_primary_key
@@ -45,12 +45,20 @@ sql.schema.alter_table.alter_primary_key
# Test primary key changes on storing indexes with different column families (the randomizer will do this for us).
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY, y INT, z INT NOT NULL, w INT, v INT,
INDEX i1 (y) STORING (w, v), INDEX i2 (z) STORING (y, v)
);
+
+statement ok
INSERT INTO t VALUES (1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15);
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (z);
+
+statement ok
INSERT INTO t VALUES (16, 17, 18, 19, 20)
query III rowsort
@@ -72,6 +80,8 @@ SELECT y, z, v FROM t@i2
# Test that composite values are encoded correctly in covering indexes.
statement ok
CREATE TABLE t_composite (x INT PRIMARY KEY, y DECIMAL NOT NULL);
+
+statement ok
INSERT INTO t_composite VALUES (1, 1.0), (2, 1.001)
statement ok
@@ -92,9 +102,17 @@ subtest foreign_keys
# Test primary key changes on tables with inbound and outbound FK's.
statement ok
CREATE TABLE fk1 (x INT NOT NULL);
+
+statement ok
CREATE TABLE fk2 (x INT NOT NULL, UNIQUE INDEX i (x));
+
+statement ok
ALTER TABLE fk1 ADD CONSTRAINT fk FOREIGN KEY (x) REFERENCES fk2(x);
+
+statement ok
INSERT INTO fk2 VALUES (1);
+
+statement ok
INSERT INTO fk1 VALUES (1)
statement ok
@@ -102,6 +120,8 @@ ALTER TABLE fk1 ALTER PRIMARY KEY USING COLUMNS (x)
statement ok
INSERT INTO fk2 VALUES (2);
+
+statement ok
INSERT INTO fk1 VALUES (2)
statement ok
@@ -115,8 +135,14 @@ INSERT INTO fk1 VALUES (3)
statement ok
CREATE TABLE self (a INT PRIMARY KEY, x INT, y INT, z INT, w INT NOT NULL,
INDEX (x), UNIQUE INDEX (y), INDEX (z));
+
+statement ok
INSERT INTO self VALUES (1, 1, 1, 1, 1);
+
+statement ok
ALTER TABLE self ADD CONSTRAINT fk1 FOREIGN KEY (z) REFERENCES self (y);
+
+statement ok
ALTER TABLE self ADD CONSTRAINT fk2 FOREIGN KEY (x) REFERENCES self (y);
statement ok
@@ -129,19 +155,39 @@ INSERT INTO self VALUES (3, 2, 3, 2, 3)
# Set up a bunch of foreign key references pointing into and out of a table.
statement ok
CREATE TABLE t1 (x INT PRIMARY KEY, y INT NOT NULL, z INT, w INT, INDEX (y), INDEX (z), UNIQUE INDEX (w));
+
+statement ok
CREATE TABLE t2 (y INT, UNIQUE INDEX (y));
+
+statement ok
CREATE TABLE t3 (z INT, UNIQUE INDEX (z));
+
+statement ok
CREATE TABLE t4 (w INT, INDEX (w));
+
+statement ok
CREATE TABLE t5 (x INT, INDEX (x));
+
+statement ok
INSERT INTO t1 VALUES (1, 1, 1, 1);
INSERT INTO t2 VALUES (1);
INSERT INTO t3 VALUES (1);
INSERT INTO t4 VALUES (1);
INSERT INTO t5 VALUES (1);
+
+statement ok
ALTER TABLE t1 ADD CONSTRAINT fk1 FOREIGN KEY (y) REFERENCES t2(y);
+
+statement ok
ALTER TABLE t1 ADD CONSTRAINT fk2 FOREIGN KEY (z) REFERENCES t3(z);
+
+statement ok
ALTER TABLE t4 ADD CONSTRAINT fk3 FOREIGN KEY (w) REFERENCES t1(w);
+
+statement ok
ALTER TABLE t5 ADD CONSTRAINT fk4 FOREIGN KEY (x) REFERENCES t1(x);
+
+statement ok
ALTER TABLE t1 ALTER PRIMARY KEY USING COLUMNS (y)
statement ok
@@ -160,7 +206,11 @@ INSERT INTO t4 VALUES (101)
# Ensure that we still rewrite a primary index if the index column has name "rowid".
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (rowid INT PRIMARY KEY, y INT NOT NULL, FAMILY (rowid, y));
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
query TT
@@ -178,6 +228,8 @@ subtest index_rewrites
# Test that indexes that need to get rewritten indeed get rewritten.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY,
y INT NOT NULL, -- will be new primary key.
@@ -193,7 +245,11 @@ CREATE TABLE t (
INDEX i7 (z) USING HASH WITH (bucket_count=4), -- will be rewritten.
FAMILY (x, y, z, w, v)
);
+
+statement ok
INSERT INTO t VALUES (1, 2, 3, 4, '{}');
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
query TT
@@ -342,6 +398,8 @@ subtest hash_sharded
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY,
y INT NOT NULL,
@@ -349,7 +407,11 @@ CREATE TABLE t (
INDEX i1 (z) USING HASH WITH (bucket_count=5),
FAMILY (x, y, z)
);
+
+statement ok
INSERT INTO t VALUES (1, 2, 3);
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y) USING HASH WITH (bucket_count=10)
query TT
@@ -402,6 +464,8 @@ SELECT * FROM t@i1
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY USING HASH WITH (bucket_count=5),
y INT NOT NULL,
@@ -409,7 +473,11 @@ CREATE TABLE t (
INDEX i (z),
FAMILY (x, y, z)
);
+
+statement ok
INSERT INTO t VALUES (1, 2, 3);
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
query TT
@@ -439,6 +507,8 @@ SELECT * FROM t@i
# Ensure we don't rewrite default primary index even if its name isn't rowid.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (rowid INT NOT NULL);
query TT
@@ -469,15 +539,25 @@ subtest encoding_bug
# able to be updated and deleted with the primary index encoding.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL, z INT NOT NULL, FAMILY (x, y, z));
+
+statement ok
INSERT INTO t VALUES (1, 2, 3);
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (z);
+
+statement ok
UPDATE t SET y = 3 WHERE z = 3
# Test for #45363.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL)
statement ok
@@ -494,6 +574,8 @@ ROLLBACK
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL)
statement ok
@@ -512,6 +594,8 @@ subtest add_pk_rowid
# Tests for #45509.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY)
statement error pq: multiple primary keys for table "t" are not allowed
@@ -519,6 +603,8 @@ ALTER TABLE t ADD PRIMARY KEY (x)
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT NOT NULL)
statement ok
@@ -535,7 +621,11 @@ t CREATE TABLE public.t (
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT NOT NULL);
+
+statement ok
ALTER TABLE t ADD PRIMARY KEY (x) USING HASH WITH (bucket_count=4)
query TT
@@ -550,7 +640,11 @@ t CREATE TABLE public.t (
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT NOT NULL);
+
+statement ok
ALTER TABLE t ADD CONSTRAINT "my_pk" PRIMARY KEY (x)
query TT
@@ -571,6 +665,8 @@ ALTER TABLE t DROP CONSTRAINT "my_pk", ADD CONSTRAINT "i" PRIMARY KEY (x);
# Regression for #45362.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT NOT NULL)
statement ok
@@ -590,7 +686,11 @@ ROLLBACK
# TODO (rohany): This test might become obselete when #44923 is fixed.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT NOT NULL);
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (x)
query I
@@ -603,6 +703,8 @@ subtest add_drop_pk
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL, FAMILY (x), FAMILY (y))
statement error pq: relation "t" \([0-9]+\): unimplemented: primary key dropped without subsequent addition of new primary key in same transaction
@@ -638,6 +740,8 @@ ALTER TABLE t ADD CONSTRAINT IF NOT EXISTS "t_pkey" PRIMARY KEY (x)
# in the same transaction.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL, FAMILY (x), FAMILY (y))
statement ok
@@ -651,7 +755,11 @@ ALTER TABLE t ADD CONSTRAINT "t_pkey" PRIMARY KEY (y)
statement ok
ROLLBACK;
+
+statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL, FAMILY (x), FAMILY (y))
statement ok
@@ -681,6 +789,8 @@ t CREATE TABLE public.t (
# in any DML statements.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL)
statement ok
@@ -774,7 +884,11 @@ ROLLBACK
# as a DROP PRIMARY KEY get rolled back on failure.
statement ok
DROP TABLE IF EXISTS t1, t2 CASCADE;
+
+statement ok
CREATE TABLE t1 (x INT PRIMARY KEY, y INT NOT NULL);
+
+statement ok
CREATE TABLE t2 (x INT)
statement ok
@@ -795,6 +909,8 @@ SELECT * FROM t2
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL)
statement error pq: table "t" does not have a primary key, cannot perform ADD COLUMN z INT8 AS \(x \+ 1\) STORED
@@ -926,7 +1042,11 @@ SELECT index_id, index_name FROM crdb_internal.table_indexes WHERE descriptor_na
# count shouldn't cause the old primary key to be copied.
statement ok
DROP TABLE IF EXISTS t CASCADE;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY USING HASH WITH (bucket_count=2));
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (x) USING HASH WITH (bucket_count=3)
query TT
@@ -943,7 +1063,11 @@ t CREATE TABLE public.t (
# primary key to be copied.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT PRIMARY KEY USING HASH WITH (bucket_count=2), y INT NOT NULL, FAMILY (x, y));
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y) USING HASH WITH (bucket_count=2)
query TT
@@ -962,29 +1086,55 @@ t CREATE TABLE public.t (
# Regression for #49079.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT, y INT, z INT, PRIMARY KEY (x, y));
+
+statement ok
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y);
+
+statement ok
SET sql_safe_updates=false;
+
+statement ok
ALTER TABLE t DROP COLUMN z
# Regression for #54629.
statement ok
CREATE TABLE t54629 (c INT NOT NULL, UNIQUE INDEX (c));
+
+statement ok
ALTER TABLE t54629 ALTER PRIMARY KEY USING COLUMNS (c);
+
+statement ok
INSERT INTO t54629 VALUES (1);
+
+statement ok
DELETE FROM t54629 WHERE c = 1
statement ok
DROP TABLE t54629;
+
+statement ok
CREATE TABLE t54629(a INT PRIMARY KEY, c INT NOT NULL, UNIQUE INDEX (c));
+
+statement ok
ALTER TABLE t54629 ALTER PRIMARY KEY USING COLUMNS (c);
+
+statement ok
DROP INDEX t54629_a_key CASCADE;
+
+statement ok
INSERT INTO t54629 VALUES (1, 1);
+
+statement ok
DELETE FROM t54629 WHERE c = 1;
# Validate ALTER ADD PRIMARY KEY idempotence for #59307
statement ok
DROP TABLE t1 CASCADE;
+
+statement ok
create table t1(id integer not null, id2 integer not null, name varchar(32));
query TTT
@@ -1132,6 +1282,8 @@ subtest toggle_sharded_no_new_index
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (i INT PRIMARY KEY)
query TTT
@@ -1163,7 +1315,11 @@ t_pkey i ASC
# #71552).
statement ok
CREATE TABLE t71553 (a INT PRIMARY KEY, b INT NOT NULL);
+
+statement ok
INSERT INTO t71553 VALUES (1, 1);
+
+statement ok
ALTER TABLE t71553 ALTER PRIMARY KEY USING COLUMNS (b);
query II
@@ -1394,9 +1550,15 @@ subtest pkey-comment-drop
# Create a table with a primary key and add a comment on it.
statement ok
CREATE TABLE pkey_comment (a INT8, b INT8, c INT8, CONSTRAINT pkey PRIMARY KEY (a, b));
+
+statement ok
COMMENT ON INDEX pkey IS 'idx';
COMMENT ON CONSTRAINT pkey ON pkey_comment IS 'const';
+
+statement ok
CREATE UNIQUE INDEX i2 ON pkey_comment(c);
+
+statement ok
COMMENT ON INDEX i2 IS 'idx2';
COMMENT ON CONSTRAINT i2 ON pkey_comment IS 'idx3';
diff --git a/pkg/sql/logictest/testdata/logic_test/alter_table b/pkg/sql/logictest/testdata/logic_test/alter_table
index 64374d7cd197..ab682db27ef5 100644
--- a/pkg/sql/logictest/testdata/logic_test/alter_table
+++ b/pkg/sql/logictest/testdata/logic_test/alter_table
@@ -1186,6 +1186,8 @@ t3 CREATE TABLE public.t3 (
# Ensure that we still have the correct restrictions.
statement ok
DROP TABLE t1, t2 CASCADE;
+
+statement ok
CREATE TABLE t1 (x INT PRIMARY KEY);
CREATE TABLE t2 (x INT, y INT, INDEX i (x))
@@ -1203,7 +1205,11 @@ INSERT INTO t2 VALUES (1, 2)
# Test using ADD COL REFERENCES in a self referencing constraint.
statement ok
DROP TABLE t1 CASCADE;
+
+statement ok
CREATE TABLE t1 (x INT PRIMARY KEY);
+
+statement ok
ALTER TABLE t1 ADD COLUMN x2 INT REFERENCES t1 (x)
query TT
@@ -1294,6 +1300,8 @@ t2 CREATE TABLE public.t2 (
# Test the above on a table not created in the same txn.
statement ok
DROP TABLE t1, t2 CASCADE;
+
+statement ok
CREATE TABLE t1 (x INT PRIMARY KEY);
CREATE TABLE t2 (y INT)
@@ -1319,6 +1327,8 @@ t2 CREATE TABLE public.t2 (
# Test that an FK can use a newly created index.
statement ok
DROP TABLE t1, t2 CASCADE;
+
+statement ok
CREATE TABLE t1 (x INT PRIMARY KEY);
CREATE TABLE t2 (x INT)
@@ -1840,6 +1850,8 @@ subtest self_reference_fk_not_valid
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (i INT PRIMARY KEY, j INT);
ALTER TABLE t ADD CONSTRAINT fk FOREIGN KEY (j) REFERENCES t(i) NOT VALID;
@@ -1855,7 +1867,11 @@ subtest regression_67234
statement ok
CREATE TABLE t67234 (k INT PRIMARY KEY, a INT, b INT, FAMILY (k, a, b));
+
+statement ok
ALTER TABLE t67234 ADD CONSTRAINT t67234_c1 UNIQUE (a) WHERE b > 0;
+
+statement ok
ALTER TABLE t67234 ADD CONSTRAINT t67234_c2 UNIQUE WITHOUT INDEX (b) WHERE a > 0
query T
@@ -1890,6 +1906,8 @@ SELECT count(usage_count)
subtest generated_as_identity
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (a INT UNIQUE)
statement ok
@@ -1922,6 +1940,8 @@ DROP TABLE t
subtest generated_as_identity_with_seq_option
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (a INT UNIQUE)
statement ok
@@ -1955,6 +1975,8 @@ ALTER TABLE t ALTER COLUMN b TYPE numeric(10,2)
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (a INT UNIQUE)
statement ok
@@ -2009,6 +2031,8 @@ ALTER TABLE t ALTER COLUMN b TYPE numeric(10,2)
# Test we can assign a PRIMARY KEY overriding the existing rowid PRIMARY KEY.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (id INT NOT NULL)
statement ok
@@ -2026,6 +2050,8 @@ t CREATE TABLE public.t (
# Table has a PRIMARY KEY named index; check it errors when assinging PRIMARY KEY to id.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
id INT NOT NULL,
rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
@@ -2040,6 +2066,8 @@ ALTER TABLE t ADD CONSTRAINT t_pkey PRIMARY KEY (id)
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
id INT NOT NULL,
explicit_rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
@@ -2051,6 +2079,8 @@ ALTER TABLE t ADD CONSTRAINT t_pkey PRIMARY KEY (id)
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE public.t (
id INT8 NOT NULL,
rowid INT8 NOT VISIBLE NOT NULL,
@@ -2062,6 +2092,8 @@ ALTER TABLE t ADD CONSTRAINT t_pkey PRIMARY KEY (id)
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE public.t (
id INT8 NOT NULL,
rowid INT4 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
@@ -2110,6 +2142,8 @@ statement ok
CREATE TABLE IF NOT EXISTS multipleinstmt (
id INT8 DEFAULT nextval('multipleinstmt_seq') PRIMARY KEY, key STRING, value STRING
);
+
+statement ok
INSERT INTO multipleinstmt (key, value) VALUES ('a', 'a');
INSERT INTO multipleinstmt (key, value) VALUES ('b', 'b');
INSERT INTO multipleinstmt (key, value) VALUES ('c', 'c');
diff --git a/pkg/sql/logictest/testdata/logic_test/alter_type b/pkg/sql/logictest/testdata/logic_test/alter_type
index 96e4c6a401bc..db854f7368da 100644
--- a/pkg/sql/logictest/testdata/logic_test/alter_type
+++ b/pkg/sql/logictest/testdata/logic_test/alter_type
@@ -585,6 +585,8 @@ ALTER TYPE reg_64101 DROP VALUE 'a'
statement ok
DROP VIEW v_64101;
+
+statement ok
CREATE VIEW v_64101 AS SELECT ARRAY['c'::reg_64101]
statement ok
@@ -595,9 +597,17 @@ ALTER TYPE reg_64101 DROP VALUE 'c'
statement ok
CREATE TYPE typ_64101 AS ENUM('a', 'b', 'c');
+
+statement ok
CREATE TABLE t1_64101("bob""b" typ_64101);
+
+statement ok
CREATE TABLE t2_64101("bob""''b" typ_64101[]);
+
+statement ok
INSERT INTO t1_64101 VALUES ('a');
+
+statement ok
INSERT INTO t2_64101 VALUES(ARRAY['b'])
statement ok
diff --git a/pkg/sql/logictest/testdata/logic_test/array b/pkg/sql/logictest/testdata/logic_test/array
index 7e3bb8b96f44..f32598c3f9bc 100644
--- a/pkg/sql/logictest/testdata/logic_test/array
+++ b/pkg/sql/logictest/testdata/logic_test/array
@@ -1314,6 +1314,8 @@ subtest array_compare
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT[], y INT[], z STRING[])
statement error pq: unsupported comparison operator: <
@@ -1452,7 +1454,11 @@ SELECT x FROM t WHERE x > ARRAY[1] ORDER BY x
# Ensure that we can order by the arrays without any indexes.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT[]);
+
+statement ok
INSERT INTO t VALUES
(ARRAY[1]),
(ARRAY[5]),
@@ -1527,7 +1533,11 @@ SELECT x FROM tarray ORDER BY x
# Add multicolumn INDEX i (x, y, z) once #50659 is fixed.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT, y INT[], z INT);
+
+statement ok
INSERT INTO t VALUES
(1, ARRAY[1, 2, 3], 3),
(NULL, ARRAY[1, NULL, 3], NULL),
@@ -1551,7 +1561,11 @@ SELECT x, y, z FROM t WHERE x = 2 AND y < ARRAY[10] ORDER BY y
# Add parent PRIMARY KEY (x) once #50659 is fixed.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x STRING[]);
+
+statement ok
INSERT INTO t VALUES
(ARRAY['']),
(ARRAY['hello', 'hi\nthere']),
@@ -1576,7 +1590,11 @@ SELECT x FROM t WHERE x > ARRAY['hell'] AND x < ARRAY['i']
# Add parent PRIMARY KEY (x) once #50659 is fixed.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x BYTES[]);
+
+statement ok
INSERT INTO t VALUES
(ARRAY[b'\xFF', b'\x00']),
(ARRAY[NULL, b'\x01', b'\x01', NULL]),
@@ -1593,7 +1611,11 @@ SELECT x FROM t ORDER BY x
# Add parent PRIMARY KEY (x DESC) once #50659 is fixed.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x BYTES[]);
+
+statement ok
INSERT INTO t VALUES
(ARRAY[b'\xFF', b'\x00']),
(ARRAY[NULL, b'\x01', b'\x01', NULL]),
@@ -1610,7 +1632,11 @@ SELECT x FROM t ORDER BY x
# Add parent PRIMARY KEY (x, y) once #50659 is fixed.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT[], y INT[]);
+
+statement ok
INSERT INTO t VALUES
(ARRAY[1, 2], ARRAY[3, 4]),
(ARRAY[NULL, NULL], ARRAY[NULL, NULL]),
@@ -1657,8 +1683,14 @@ SELECT x, y FROM t WHERE x > ARRAY[NULL]:::INT[] ORDER BY y
# Add t1 and t2 PRIMARY KEY x once #50659 is fixed.
statement ok
DROP TABLE IF EXISTS t1, t2 CASCADE;
+
+statement ok
CREATE TABLE t1 (x INT[]);
+
+statement ok
CREATE TABLE t2 (x INT[]);
+
+statement ok
INSERT INTO t1 VALUES
(ARRAY[1, 2]),
(ARRAY[NULL]),
@@ -1691,7 +1723,11 @@ SELECT t1.x FROM t1 INNER MERGE JOIN t2 ON t1.x = t2.x
# Add INDEX (x) once #50659 is fixed.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT[]);
+
+statement ok
INSERT INTO t VALUES
(ARRAY[1, 2]),
(ARRAY[1, 2]),
@@ -1720,6 +1756,8 @@ END
# Test that string literals can be implicitly casted to array types
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (
a INT[],
b DECIMAL[],
@@ -1731,6 +1769,8 @@ CREATE TABLE t (
h INET[],
i VARBIT[],
j FLOAT[]);
+
+statement ok
INSERT INTO t VALUES (
'{1, 2}',
'{1.1, 2.2}',
@@ -1794,6 +1834,8 @@ CREATE TABLE kv (
k INT PRIMARY KEY,
v STRING
);
+
+statement ok
INSERT INTO kv VALUES (1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, null)
query T rowsort
@@ -2019,8 +2061,10 @@ SELECT array_remove(ARRAY[(1,'cat'),(2,'dog')], (3,'\xc03b4478eb'::BYTEA))
subtest regression_71394
-query T
+statement ok
PREPARE regression_71394 AS SELECT ARRAY[$1]::int[];
+
+query T
EXECUTE regression_71394(71394)
----
{71394}
@@ -2031,10 +2075,14 @@ subtest array_enums
statement ok
CREATE TYPE letter AS ENUM ('a', 'b', 'c');
+
+statement ok
CREATE TABLE kv_enum (
k INT PRIMARY KEY,
v letter
);
+
+statement ok
INSERT INTO kv_enum VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, NULL)
query T rowsort
diff --git a/pkg/sql/logictest/testdata/logic_test/cascade b/pkg/sql/logictest/testdata/logic_test/cascade
index 3870c5546f84..64739c791f51 100644
--- a/pkg/sql/logictest/testdata/logic_test/cascade
+++ b/pkg/sql/logictest/testdata/logic_test/cascade
@@ -41,8 +41,14 @@ CREATE TABLE grandchild (
g INT PRIMARY KEY,
c INT REFERENCES child(c)
);
+
+statement ok
INSERT INTO parent VALUES (1), (2);
+
+statement ok
INSERT INTO child VALUES (10, 1), (11, 1), (20, 2), (21, 2);
+
+statement ok
INSERT INTO grandchild VALUES (100, 10), (101, 10), (110, 11);
statement ok
@@ -72,8 +78,14 @@ CREATE TABLE grandchild (
g INT PRIMARY KEY,
c INT REFERENCES child(c) ON DELETE CASCADE
);
+
+statement ok
INSERT INTO parent VALUES (1), (2);
+
+statement ok
INSERT INTO child VALUES (10, 1), (11, 1), (20, 2), (21, 2);
+
+statement ok
INSERT INTO grandchild VALUES (100, 10), (101, 10), (110, 11), (200, 20)
statement ok
@@ -103,18 +115,26 @@ SELECT * FROM grandchild
statement ok
DROP TABLE grandchild;
+
+statement ok
DROP TABLE child;
+
+statement ok
DROP TABLE parent
# Delete cascade with multiple columns and multiple child tables.
statement ok
CREATE TABLE parent_multi (pa INT, pb INT, pc INT, UNIQUE INDEX (pa,pb,pc));
+
+statement ok
CREATE TABLE child_multi_1 (
c INT,
a INT,
b INT,
FOREIGN KEY (a,b,c) REFERENCES parent_multi(pa,pb,pc) ON DELETE CASCADE
);
+
+statement ok
CREATE TABLE child_multi_2 (
b INT,
c INT,
diff --git a/pkg/sql/logictest/testdata/logic_test/cast b/pkg/sql/logictest/testdata/logic_test/cast
index 402d361afe6c..82f2b6521dd4 100644
--- a/pkg/sql/logictest/testdata/logic_test/cast
+++ b/pkg/sql/logictest/testdata/logic_test/cast
@@ -951,6 +951,8 @@ INSERT INTO assn_cast_p VALUES (1.0, 10.0);
# Test ON UPDATE CASCADE.
statement ok
CREATE TABLE assn_cast_c (c INT PRIMARY KEY, p DECIMAL(10, 0) REFERENCES assn_cast_p(p) ON UPDATE CASCADE);
+
+statement ok
INSERT INTO assn_cast_c VALUES (1, 1.0);
statement error update on table "assn_cast_c" violates foreign key constraint "assn_cast_c_p_fkey"
@@ -966,7 +968,11 @@ SELECT * FROM assn_cast_c
statement ok
DROP TABLE assn_cast_c;
+
+statement ok
CREATE TABLE assn_cast_c (c INT PRIMARY KEY, d DECIMAL(10, 0) REFERENCES assn_cast_p(d) ON UPDATE CASCADE);
+
+statement ok
UPSERT INTO assn_cast_c VALUES (2, 10)
statement error update on table "assn_cast_c" violates foreign key constraint "assn_cast_c_d_fkey"
@@ -984,7 +990,11 @@ INSERT INTO assn_cast_p VALUES (2.0, 11.00) ON CONFLICT (d) DO UPDATE SET d = 12
# Test ON UPDATE SET DEFAULT.
statement ok
DROP TABLE assn_cast_c;
+
+statement ok
CREATE TABLE assn_cast_c (c INT PRIMARY KEY, p DECIMAL(10, 0) DEFAULT 3.1 REFERENCES assn_cast_p(p) ON UPDATE SET DEFAULT);
+
+statement ok
INSERT INTO assn_cast_c VALUES (2, 2.0);
statement error update on table "assn_cast_c" violates foreign key constraint "assn_cast_c_p_fkey"
@@ -1000,7 +1010,11 @@ SELECT * FROM assn_cast_c
statement ok
DROP TABLE assn_cast_c;
+
+statement ok
CREATE TABLE assn_cast_c (c INT PRIMARY KEY, d DECIMAL(10, 0) DEFAULT 3.1 REFERENCES assn_cast_p(d) ON UPDATE SET DEFAULT);
+
+statement ok
INSERT INTO assn_cast_c VALUES (2, 12)
statement error update on table "assn_cast_c" violates foreign key constraint "assn_cast_c_d_fkey"
@@ -1176,6 +1190,8 @@ SELECT t1.c0 FROM t1 WHERE t1.c0 BETWEEN t1.c0 AND INTERVAL '-1'::DECIMAL
# Regression test for incorrectly casting integers out of range (#64429).
statement ok
CREATE TABLE t64429 (_int8 INT8, _int4 INT4);
+
+statement ok
INSERT INTO t64429 VALUES (3000000000, 300000);
statement error integer out of range for type int2
@@ -1209,10 +1225,14 @@ CREATE TABLE t66067_a (
c CHAR(26),
CONSTRAINT c UNIQUE (c)
);
+
+statement ok
CREATE TABLE t66067_b (
a INT,
v VARCHAR(40)
);
+
+statement ok
INSERT INTO t66067_a VALUES (1, 'foo');
INSERT INTO t66067_b VALUES (1, 'bar');
@@ -1296,6 +1316,8 @@ f
statement ok
CREATE TABLE t73450 (c CHAR);
+
+statement ok
INSERT INTO t73450 VALUES ('f')
query T
diff --git a/pkg/sql/logictest/testdata/logic_test/column_families b/pkg/sql/logictest/testdata/logic_test/column_families
index 00458c80854b..7cbb94cce73b 100644
--- a/pkg/sql/logictest/testdata/logic_test/column_families
+++ b/pkg/sql/logictest/testdata/logic_test/column_families
@@ -37,7 +37,11 @@ SELECT y, z FROM t WHERE x = 2
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x DECIMAL PRIMARY KEY, y INT, FAMILY (y), FAMILY (x));
+
+statement ok
INSERT INTO t VALUES (5.607, 1), (5.6007, 2)
query TI rowsort
@@ -51,16 +55,22 @@ SELECT * FROM t
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x DECIMAL, y DECIMAL, z INT, FAMILY (z), FAMILY (y), FAMILY (x), PRIMARY KEY (x, y));
+
+statement ok
INSERT INTO t VALUES (1.00, 2.00, 1)
query TTI
SET tracing=on,kv,results;
SELECT * FROM t;
-SET tracing=off
----
1.00 2.00 1
+statement ok
+SET tracing=off
+
query T
SELECT message FROM [SHOW KV TRACE FOR SESSION] WHERE
message LIKE 'fetched: /t/t_pkey/%'
diff --git a/pkg/sql/logictest/testdata/logic_test/crdb_internal b/pkg/sql/logictest/testdata/logic_test/crdb_internal
index 8712bb00b449..ab152a39681d 100644
--- a/pkg/sql/logictest/testdata/logic_test/crdb_internal
+++ b/pkg/sql/logictest/testdata/logic_test/crdb_internal
@@ -708,8 +708,12 @@ SET application_name = 'test_max_retry'
# become different from 0.
statement OK
CREATE SEQUENCE s;
- SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h'::INTERVAL), 0);
- DROP SEQUENCE s
+
+statement OK
+SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h'::INTERVAL), 0);
+
+statement OK
+DROP SEQUENCE s
statement OK
RESET application_name
diff --git a/pkg/sql/logictest/testdata/logic_test/create_as b/pkg/sql/logictest/testdata/logic_test/create_as
index 9ace5116b5c8..c8c51ae8fe6c 100644
--- a/pkg/sql/logictest/testdata/logic_test/create_as
+++ b/pkg/sql/logictest/testdata/logic_test/create_as
@@ -112,15 +112,21 @@ statement error pq: value type unknown cannot be used for table columns
CREATE TABLE foo2 (x) AS (VALUES(NULL))
# Check nulls are handled properly (#13921)
+statement ok
+CREATE TABLE foo3 (x) AS VALUES (1), (NULL);
+
query I
-CREATE TABLE foo3 (x) AS VALUES (1), (NULL); SELECT * FROM foo3 ORDER BY x
+SELECT * FROM foo3 ORDER BY x
----
NULL
1
# Check that CREATE TABLE AS can use subqueries (#23002)
+statement ok
+CREATE TABLE foo4 (x) AS SELECT EXISTS(SELECT * FROM foo3 WHERE x IS NULL);
+
query B
-CREATE TABLE foo4 (x) AS SELECT EXISTS(SELECT * FROM foo3 WHERE x IS NULL); SELECT * FROM foo4
+SELECT * FROM foo4
----
true
@@ -368,6 +374,8 @@ ROLLBACK
# Test CREATE TABLE AS referring to a sequence.
statement ok
CREATE SEQUENCE seq;
+
+statement OK
CREATE TABLE tab_from_seq AS (SELECT nextval('seq'))
query I
diff --git a/pkg/sql/logictest/testdata/logic_test/create_statements b/pkg/sql/logictest/testdata/logic_test/create_statements
index d28ee17abb54..24c3bb772c88 100644
--- a/pkg/sql/logictest/testdata/logic_test/create_statements
+++ b/pkg/sql/logictest/testdata/logic_test/create_statements
@@ -6610,14 +6610,23 @@ CREATE INDEX a_idx ON a(b) WITH (fillfactor=50)
----
NOTICE: storage parameter "fillfactor" is ignored
+statement ok
+DROP TABLE a CASCADE;
+
query T noticetrace
-DROP TABLE a CASCADE; CREATE TABLE a (b INT) WITH (autovacuum_enabled=off)
+CREATE TABLE a (b INT) WITH (autovacuum_enabled=off)
----
NOTICE: storage parameter "autovacuum_enabled = 'off'" is ignored
+statement ok
+DROP TABLE a CASCADE;
+
query T noticetrace
-DROP TABLE a CASCADE; CREATE TABLE a (b INT) WITH (autovacuum_enabled=on)
+CREATE TABLE a (b INT) WITH (autovacuum_enabled=on)
----
+statement ok
+DROP TABLE a CASCADE;
+
statement error parameter "autovacuum_enabled" requires a Boolean value
-DROP TABLE a CASCADE; CREATE TABLE a (b INT) WITH (autovacuum_enabled='11')
+CREATE TABLE a (b INT) WITH (autovacuum_enabled='11')
diff --git a/pkg/sql/logictest/testdata/logic_test/create_table b/pkg/sql/logictest/testdata/logic_test/create_table
index 9e499e3d2d40..039042219dd2 100644
--- a/pkg/sql/logictest/testdata/logic_test/create_table
+++ b/pkg/sql/logictest/testdata/logic_test/create_table
@@ -347,7 +347,10 @@ like_hash CREATE TABLE public.like_hash (
)
statement ok
-DROP TABLE like_hash; CREATE TABLE like_hash (LIKE like_hash_base INCLUDING ALL)
+DROP TABLE like_hash;
+
+statement ok
+CREATE TABLE like_hash (LIKE like_hash_base INCLUDING ALL)
query TT
SHOW CREATE TABLE like_hash
@@ -362,6 +365,8 @@ like_hash CREATE TABLE public.like_hash (
statement ok
CREATE TABLE regression_67196 (pk INT PRIMARY KEY, hidden INT NOT VISIBLE);
+
+statement ok
CREATE TABLE regression_67196_like (LIKE regression_67196)
query TT
diff --git a/pkg/sql/logictest/testdata/logic_test/database b/pkg/sql/logictest/testdata/logic_test/database
index 52c46f7f1939..e90bc18c86cd 100644
--- a/pkg/sql/logictest/testdata/logic_test/database
+++ b/pkg/sql/logictest/testdata/logic_test/database
@@ -149,11 +149,21 @@ DROP DATABASE IF EXISTS b
statement ok
DROP DATABASE b2 CASCADE;
- DROP DATABASE b3 CASCADE;
- DROP DATABASE b4 CASCADE;
- DROP DATABASE b5 CASCADE;
- DROP DATABASE b6 CASCADE;
- DROP DATABASE b7 CASCADE
+
+statement ok
+DROP DATABASE b3 CASCADE;
+
+statement ok
+DROP DATABASE b4 CASCADE;
+
+statement ok
+DROP DATABASE b5 CASCADE;
+
+statement ok
+DROP DATABASE b6 CASCADE;
+
+statement ok
+DROP DATABASE b7 CASCADE
statement error pgcode 42601 empty database name
DROP DATABASE ""
diff --git a/pkg/sql/logictest/testdata/logic_test/datetime b/pkg/sql/logictest/testdata/logic_test/datetime
index 0adccbf095a0..1987bcb122ce 100644
--- a/pkg/sql/logictest/testdata/logic_test/datetime
+++ b/pkg/sql/logictest/testdata/logic_test/datetime
@@ -1893,6 +1893,8 @@ SELECT
statement ok
CREATE TABLE timestamp_datestyle_parse(pk SERIAL PRIMARY KEY, s string);
+
+statement ok
INSERT INTO timestamp_datestyle_parse VALUES
(1, '07-09-12 11:30:45.123'),
(2, '07-09-12')
@@ -1942,6 +1944,8 @@ SELECT
statement ok
CREATE TABLE time_datestyle_parse(pk SERIAL PRIMARY KEY, s string);
+
+statement ok
INSERT INTO time_datestyle_parse VALUES
(1, '2007-09-12 11:30:45.123+06'),
(2, '2007-09-12 11:30:45.123+03')
diff --git a/pkg/sql/logictest/testdata/logic_test/discard b/pkg/sql/logictest/testdata/logic_test/discard
index 776bb036fca4..7ce33dd80e40 100644
--- a/pkg/sql/logictest/testdata/logic_test/discard
+++ b/pkg/sql/logictest/testdata/logic_test/discard
@@ -19,8 +19,11 @@ SET timezone = 'Europe/Amsterdam'; SHOW TIMEZONE
----
Europe/Amsterdam
+statement ok
+DISCARD ALL;
+
query T
-DISCARD ALL; SHOW TIMEZONE
+SHOW TIMEZONE
----
UTC
@@ -29,8 +32,11 @@ SET TIME ZONE 'Europe/Amsterdam'; SHOW TIME ZONE
----
Europe/Amsterdam
+statement ok
+DISCARD ALL
+
query T
-DISCARD ALL; SHOW TIME ZONE
+SHOW TIME ZONE
----
UTC
diff --git a/pkg/sql/logictest/testdata/logic_test/distinct b/pkg/sql/logictest/testdata/logic_test/distinct
index 0739b06cf9fc..f218db9fb07b 100644
--- a/pkg/sql/logictest/testdata/logic_test/distinct
+++ b/pkg/sql/logictest/testdata/logic_test/distinct
@@ -200,7 +200,11 @@ SELECT DISTINCT (x) FROM t
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x DECIMAL);
+
+statement ok
INSERT INTO t VALUES (1.0), (1.00), (1.000)
# We want to ensure that this only returns 1 element. We don't
@@ -214,7 +218,11 @@ SELECT COUNT (*) FROM (SELECT DISTINCT (array[x]) FROM t)
# Regression for #46709.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (i INT, x INT, y INT, z STRING);
+
+statement ok
INSERT INTO t VALUES
(1, 1, 2, 'hello'),
(2, 1, 2, 'hello'),
diff --git a/pkg/sql/logictest/testdata/logic_test/distsql_stats b/pkg/sql/logictest/testdata/logic_test/distsql_stats
index 3ba067e61088..903dac6f5a2f 100644
--- a/pkg/sql/logictest/testdata/logic_test/distsql_stats
+++ b/pkg/sql/logictest/testdata/logic_test/distsql_stats
@@ -635,8 +635,14 @@ arr_stats_x {x} 4 3 1 false
# Test that enum columns always have histograms collected for them.
statement ok
CREATE TYPE e AS ENUM ('hello', 'howdy', 'hi');
+
+statement ok
CREATE TABLE et (x e, y e, PRIMARY KEY (x));
+
+statement ok
INSERT INTO et VALUES ('hello', 'hello'), ('howdy', 'howdy'), ('hi', 'hi');
+
+statement ok
CREATE STATISTICS s FROM et
query TTIIB colnames,rowsort
@@ -732,7 +738,11 @@ SET CLUSTER SETTING sql.stats.multi_column_collection.enabled = false
statement ok
CREATE TABLE prim (a INT, b INT, c INT, PRIMARY KEY (a, b, c));
+
+statement ok
INSERT INTO prim VALUES (1, 1, 1), (2, 2, 2), (3, 3, 3);
+
+statement ok
CREATE STATISTICS s FROM prim
query TTIIB colnames,rowsort
@@ -768,7 +778,11 @@ upper_bound range_rows distinct_range_rows equal_rows
# collected for them, with up to 200 buckets.
statement ok
CREATE TABLE sec (a INT, b INT, c INT, INDEX (a, b, c));
+
+statement ok
INSERT INTO sec VALUES (1, 1, 1), (2, 2, 2), (3, 3, 3);
+
+statement ok
CREATE STATISTICS s FROM sec
query TTIIB colnames,rowsort
@@ -813,7 +827,11 @@ CREATE TABLE partial (
INDEX (a) WHERE b > 0 OR c > 0,
INVERTED INDEX (j) WHERE d = 10
);
+
+statement ok
INSERT INTO partial VALUES (1, 1, 1, 1, '{"a": "b"}'), (2, 2, 2, 10, '{"c": "d"}'), (3, 3, 3, 1, '{"e": "f"}');
+
+statement ok
CREATE STATISTICS s FROM partial
query TTIIB colnames,rowsort
@@ -899,6 +917,8 @@ CREATE TABLE expression (
INVERTED INDEX j_a ((j->'a')),
INVERTED INDEX a_j_a (a, (j->'a'))
);
+
+statement ok
INSERT INTO expression VALUES (1, 1, '{"a": "b"}'), (2, 10, '{"c": "d"}'), (3, 1, '{"e": "f"}');
statement ok
@@ -926,7 +946,11 @@ s {rowid} 3 0 true
# up to 2 buckets.
statement ok
CREATE TABLE noind (a INT, b INT, c INT);
+
+statement ok
INSERT INTO noind VALUES (1, 1, 1), (2, 2, 2), (3, 3, 3);
+
+statement ok
CREATE STATISTICS s FROM noind
query TTIIB colnames,rowsort
@@ -965,7 +989,11 @@ CREATE TABLE geo_table (
geog GEOGRAPHY(GEOMETRY,4326) NULL,
geom GEOMETRY(GEOMETRY,3857) NULL
);
+
+statement ok
INSERT INTO geo_table VALUES (1, 'LINESTRING(0 0, 100 100)', ST_GeomFromText('LINESTRING(0 0, 100 100)', 3857));
+
+statement ok
CREATE STATISTICS s FROM geo_table;
query TB colnames
@@ -984,7 +1012,11 @@ column_names has_histogram
statement ok
CREATE INDEX geom_idx_1 ON geo_table USING GIST(geom) WITH (geometry_min_x=0, s2_max_level=15);
+
+statement ok
CREATE INDEX geog_idx_1 ON geo_table USING GIST(geog) WITH (s2_level_mod=3);
+
+statement ok
CREATE STATISTICS s FROM geo_table;
query TB colnames
@@ -1003,7 +1035,11 @@ column_names has_histogram
statement ok
CREATE INDEX geom_idx_2 ON geo_table USING GIST(geom) WITH (geometry_min_x=5);
+
+statement ok
CREATE INDEX geog_idx_2 ON geo_table USING GIST(geog);
+
+statement ok
CREATE STATISTICS s FROM geo_table;
query TB colnames
@@ -1034,6 +1070,8 @@ upper_bound
statement ok
DROP INDEX geo_table@geog_idx_1;
+
+statement ok
CREATE STATISTICS s FROM geo_table;
# Demonstrate that buckets change when the first chosen index is dropped.
@@ -1058,7 +1096,11 @@ CREATE TABLE multi_col (
j JSON,
INVERTED INDEX (s, j)
);
+
+statement ok
INSERT INTO multi_col VALUES (1, 'foo', '{"a": "b"}');
+
+statement ok
CREATE STATISTICS s FROM multi_col;
query TB colnames
@@ -1105,7 +1147,11 @@ SET CLUSTER SETTING sql.stats.multi_column_collection.enabled = false
# an error.
statement ok
CREATE TABLE all_null (k INT PRIMARY KEY, c INT);
+
+statement ok
INSERT INTO all_null VALUES (1, NULL);
+
+statement ok
CREATE STATISTICS s FROM all_null
query T
@@ -1155,8 +1201,14 @@ SELECT * FROM all_null WHERE c IS NOT NULL
# Regression for 58220.
statement ok
CREATE TYPE greeting AS ENUM ('hello', 'howdy', 'hi');
+
+statement ok
CREATE TABLE greeting_stats (x greeting PRIMARY KEY);
+
+statement ok
INSERT INTO greeting_stats VALUES ('hi');
+
+statement ok
CREATE STATISTICS s FROM greeting_stats
query T
@@ -1219,7 +1271,11 @@ CREATE TABLE t63387 (
j JSONB,
INDEX (i) WHERE j->>'a' = 'b'
);
+
+statement ok
INSERT INTO t63387 VALUES (1, '{}');
+
+statement ok
CREATE STATISTICS s FROM t63387;
# Regression test for #71080. Stats collection should succeed on tables with NOT
diff --git a/pkg/sql/logictest/testdata/logic_test/drop_database b/pkg/sql/logictest/testdata/logic_test/drop_database
index 7ed71a4bdd0d..f2df10bcd1f1 100644
--- a/pkg/sql/logictest/testdata/logic_test/drop_database
+++ b/pkg/sql/logictest/testdata/logic_test/drop_database
@@ -262,10 +262,16 @@ SET sql_safe_updates = FALSE; DROP DATABASE foo
# Check that the default databases can be dropped and re-created like any other.
statement OK
-DROP DATABASE defaultdb; DROP DATABASE postgres
+DROP DATABASE defaultdb;
+
+statement OK
+DROP DATABASE postgres
statement ok
-CREATE DATABASE defaultdb; CREATE DATABASE postgres
+CREATE DATABASE defaultdb;
+
+statement OK
+CREATE DATABASE postgres
# Test that an empty database doesn't get a GC job.
statement ok
diff --git a/pkg/sql/logictest/testdata/logic_test/drop_index b/pkg/sql/logictest/testdata/logic_test/drop_index
index f77d4fd6b43d..468450c378bd 100644
--- a/pkg/sql/logictest/testdata/logic_test/drop_index
+++ b/pkg/sql/logictest/testdata/logic_test/drop_index
@@ -287,10 +287,20 @@ subtest fk_drop
# there is another index that can satisfy the foreign key constraint.
statement ok
CREATE TABLE fk1 (x int);
+
+statement ok
CREATE TABLE fk2 (x int PRIMARY KEY);
+
+statement ok
CREATE INDEX i ON fk1 (x);
+
+statement ok
CREATE INDEX i2 ON fk1 (x);
+
+statement ok
ALTER TABLE fk1 ADD CONSTRAINT fk1 FOREIGN KEY (x) REFERENCES fk2 (x);
+
+statement ok
DROP INDEX fk1@i CASCADE
query TT
diff --git a/pkg/sql/logictest/testdata/logic_test/drop_type b/pkg/sql/logictest/testdata/logic_test/drop_type
index ff04a27481fb..2de2088194b8 100644
--- a/pkg/sql/logictest/testdata/logic_test/drop_type
+++ b/pkg/sql/logictest/testdata/logic_test/drop_type
@@ -5,6 +5,8 @@ SET enable_experimental_alter_column_type_general = true;
# Basic test -- create and drop a type.
statement ok
CREATE TYPE t AS ENUM ('hello');
+
+statement ok
DROP TYPE t
statement error type \"t\" does not exist
@@ -17,6 +19,8 @@ SELECT ARRAY['hello']::_t
# Try dropping a type within a transaction.
statement ok
CREATE TYPE t AS ENUM ('hello');
+
+statement ok
BEGIN;
DROP TYPE t;
@@ -73,6 +77,8 @@ DROP TYPE t
# Ensure that references to the array type are tracked.
statement ok
CREATE TYPE t AS ENUM ('hello');
+
+statement ok
ALTER TABLE t1 ADD COLUMN x t[]
statement error pq: cannot drop type "t" because other objects \(\[test.public.t1\]\) still depend on it
@@ -80,12 +86,18 @@ DROP TYPE t
statement ok
ALTER TABLE t1 DROP COLUMN x;
+
+statement ok
DROP TYPE t
# Altering a column's type to a UDT should pick up the reference.
statement ok
CREATE TYPE t AS ENUM ('hello');
+
+statement ok
ALTER TABLE t1 ADD COLUMN x STRING;
+
+statement ok
ALTER TABLE t1 ALTER COLUMN x SET DATA TYPE t
statement error pq: cannot drop type "t" because other objects \(\[test.public.t1\]\) still depend on it
@@ -101,6 +113,8 @@ DROP TYPE t
# Ensure that views track their type dependencies.
statement ok
CREATE TYPE t AS ENUM ('hello');
+
+statement ok
CREATE VIEW v AS SELECT 'hello':::t
statement error pq: cannot drop type "t" because other objects \(\[test.public.v\]\) still depend on it
@@ -116,8 +130,14 @@ DROP TYPE t
# default, computed and partial index predicates.
statement ok
CREATE TYPE t1 AS ENUM ('hello');
+
+statement ok
CREATE TYPE t2 AS ENUM ('howdy');
+
+statement ok
CREATE TYPE t3 AS ENUM ('hi');
+
+statement ok
CREATE TYPE t4 AS ENUM ('cheers')
# First, add all of those expressions in the CREATE statement.
@@ -144,18 +164,26 @@ DROP TYPE t4
# Now remove the schema elements and drop the types.
statement ok
DROP INDEX expr@i;
+
+statement ok
DROP TYPE t4
statement ok
ALTER TABLE expr DROP CONSTRAINT "check";
+
+statement ok
DROP TYPE t3
statement ok
ALTER TABLE expr DROP COLUMN y;
+
+statement ok
DROP TYPE t2
statement ok
ALTER TABLE expr DROP COLUMN x;
+
+statement ok
DROP TYPE t1
statement ok
@@ -164,9 +192,17 @@ DROP TABLE expr
# Now add all of these schema elements via ALTER commands.
statement ok
CREATE TABLE expr ();
+
+statement ok
CREATE TYPE t1 AS ENUM ('hello');
+
+statement ok
CREATE TYPE t2 AS ENUM ('howdy');
+
+statement ok
CREATE TYPE t3 AS ENUM ('hi');
+
+statement ok
CREATE TYPE t4 AS ENUM ('cheers')
# First try adding all of the schema elements in transactions and ensure that
@@ -215,8 +251,14 @@ ROLLBACK
# Now add all of the schema elements.
statement ok
ALTER TABLE expr ADD COLUMN x BOOL DEFAULT ('hello'::t1 = 'hello'::t1);
+
+statement ok
ALTER TABLE expr ADD COLUMN y STRING AS ('howdy'::t2::STRING) STORED;
+
+statement ok
ALTER TABLE expr ADD CONSTRAINT "check" CHECK ('hi'::t3::string = 'hi');
+
+statement ok
CREATE INDEX i ON expr (y) WHERE ('cheers'::t4 = 'cheers'::t4)
statement error pq: cannot drop type "t1" because other objects \(\[test.public.expr\]\) still depend on it
@@ -234,25 +276,39 @@ DROP TYPE t4
# Now remove the schema elements and drop the types.
statement ok
DROP INDEX expr@i;
+
+statement ok
DROP TYPE t4
statement ok
ALTER TABLE expr DROP CONSTRAINT "check";
+
+statement ok
DROP TYPE t3
statement ok
ALTER TABLE expr DROP COLUMN y;
+
+statement ok
DROP TYPE t2
statement ok
ALTER TABLE expr DROP COLUMN x;
+
+statement ok
DROP TYPE t1
# Check that truncated tables maintain their backreference.
statement ok
CREATE TYPE ty AS ENUM ('hello');
+
+statement ok
CREATE TABLE tab (x ty);
+
+statement ok
INSERT INTO tab VALUES ('hello');
+
+statement ok
TRUNCATE TABLE tab
statement error pq: cannot drop type "ty" because other objects \(\[test.public.tab\]\) still depend on it
@@ -261,6 +317,8 @@ DROP TYPE ty
# Ensure that we can drop a table then a type in the same txn.
statement ok
CREATE TYPE t AS ENUM ('hello');
+
+statement ok
CREATE TABLE tt (x t)
statement ok
@@ -272,6 +330,8 @@ COMMIT
# Tests for dropping a database that contains types.
statement ok
CREATE DATABASE d;
+
+statement ok
CREATE TYPE d.d_t AS ENUM ()
statement error pq: database \"d\" is not empty and RESTRICT was specified
@@ -295,8 +355,14 @@ SELECT * FROM system.descriptor WHERE id = $t_id OR id = $t_id + 1
# Test when some objects in the database use the types.
statement ok
CREATE DATABASE d;
+
+statement ok
CREATE TYPE d.d_t AS ENUM ('hello');
+
+statement ok
CREATE TABLE d.t1 (x d.d_t);
+
+statement ok
CREATE TABLE d.t2 (y d.d_t[])
let $t_id
@@ -316,10 +382,20 @@ SELECT * FROM system.descriptor WHERE id = $t_id OR id = $t_id + 1
# Create a database with a large number of types.
statement ok
CREATE DATABASE d;
+
+statement ok
CREATE TYPE d.d_type_1 AS ENUM ('hello');
+
+statement ok
CREATE TYPE d.d_type_2 AS ENUM ('hello');
+
+statement ok
CREATE TYPE d.d_type_3 AS ENUM ('hello');
+
+statement ok
CREATE TYPE d.d_type_4 AS ENUM ('hello');
+
+statement ok
CREATE TYPE d.d_type_5 AS ENUM ('hello')
statement ok
@@ -332,7 +408,11 @@ subtest regression_57187
statement ok
CREATE DATABASE d;
+
+statement ok
CREATE TYPE d."a 0
# Regression test for #49630.
statement ok
DROP TABLE empty;
+
+statement ok
CREATE TABLE xy (x INT PRIMARY KEY, y INT);
CREATE TABLE fk_ref (r INT NOT NULL REFERENCES xy (x));
CREATE TABLE empty (v INT);
+
+statement ok
INSERT INTO xy (VALUES (1, 1));
INSERT INTO fk_ref (VALUES (1));
diff --git a/pkg/sql/logictest/testdata/logic_test/manual_retry b/pkg/sql/logictest/testdata/logic_test/manual_retry
index 20c2c94ac1e2..6b7a086e3996 100644
--- a/pkg/sql/logictest/testdata/logic_test/manual_retry
+++ b/pkg/sql/logictest/testdata/logic_test/manual_retry
@@ -23,7 +23,9 @@ subtest automatic_retry
statement ok
CREATE SEQUENCE s;
- BEGIN TRANSACTION;
+
+statement ok
+BEGIN TRANSACTION;
SAVEPOINT cockroach_restart
# The SELECT 1 is necessary to take the session out of the AutoRetry state,
diff --git a/pkg/sql/logictest/testdata/logic_test/materialized_view b/pkg/sql/logictest/testdata/logic_test/materialized_view
index 6f27a5ffd23e..8ea9435b7393 100644
--- a/pkg/sql/logictest/testdata/logic_test/materialized_view
+++ b/pkg/sql/logictest/testdata/logic_test/materialized_view
@@ -103,8 +103,14 @@ TRUNCATE v
# runs into a uniqueness constraint violation.
statement ok
CREATE TABLE dup (x INT);
+
+statement ok
CREATE MATERIALIZED VIEW v_dup AS SELECT x FROM dup;
+
+statement ok
CREATE UNIQUE INDEX i ON v_dup (x);
+
+statement ok
INSERT INTO dup VALUES (1), (1);
statement error pq: duplicate key value violates unique constraint "i"\nDETAIL: Key \(x\)=\(1\) already exists\.
@@ -137,6 +143,8 @@ DROP MATERIALIZED VIEW normal_view
# an empty view.
statement ok
CREATE MATERIALIZED VIEW with_options AS SELECT 1;
+
+statement ok
REFRESH MATERIALIZED VIEW with_options WITH DATA
query I
diff --git a/pkg/sql/logictest/testdata/logic_test/multi_statement b/pkg/sql/logictest/testdata/logic_test/multi_statement
index 08a4a289f13d..f3fe3513d2b5 100644
--- a/pkg/sql/logictest/testdata/logic_test/multi_statement
+++ b/pkg/sql/logictest/testdata/logic_test/multi_statement
@@ -28,7 +28,7 @@ SELECT * FROM kv
a b
c d
-# second statement returns an error
+# second statement returns an error, and causes the whole batch to rollbacl
statement error duplicate key value violates unique constraint "kv_pkey"\nDETAIL: Key \(k\)=\('a'\) already exists\.
INSERT INTO kv (k,v) VALUES ('g', 'h'); INSERT INTO kv (k,v) VALUES ('a', 'b')
@@ -37,7 +37,6 @@ SELECT * FROM kv
----
a b
c d
-g h
# parse error runs nothing
statement error at or near "k": syntax error
@@ -48,7 +47,6 @@ SELECT * FROM kv
----
a b
c d
-g h
statement error pq: relation "x.y" does not exist
BEGIN; INSERT INTO x.y(a) VALUES (1); END
diff --git a/pkg/sql/logictest/testdata/logic_test/on_update b/pkg/sql/logictest/testdata/logic_test/on_update
index e26549538357..46f7b2d78aa8 100644
--- a/pkg/sql/logictest/testdata/logic_test/on_update
+++ b/pkg/sql/logictest/testdata/logic_test/on_update
@@ -303,6 +303,8 @@ DROP SEQUENCE seq_72116
statement ok
DROP TABLE table_72116;
+
+statement ok
CREATE TABLE table_72116 (a INT DEFAULT nextval('seq_72116') ON UPDATE NULL)
statement error pq: cannot drop sequence seq_72116 because other objects depend on it
@@ -310,7 +312,11 @@ DROP SEQUENCE seq_72116
statement ok
DROP TABLE table_72116;
+
+statement ok
CREATE TABLE table_72116 (a INT);
+
+statement ok
ALTER TABLE table_72116 ADD COLUMN b INT DEFAULT (1) ON UPDATE nextval('seq_72116')
statement error pq: cannot drop sequence seq_72116 because other objects depend on it
diff --git a/pkg/sql/logictest/testdata/logic_test/partial_index b/pkg/sql/logictest/testdata/logic_test/partial_index
index 368dbe01d70b..2208770966a1 100644
--- a/pkg/sql/logictest/testdata/logic_test/partial_index
+++ b/pkg/sql/logictest/testdata/logic_test/partial_index
@@ -863,15 +863,25 @@ INSERT INTO u VALUES (1, 1) ON CONFLICT (a) WHERE b < -1 DO NOTHING
# an arbiter.
statement ok
CREATE UNIQUE INDEX i2 ON u (b) WHERE 1 = 1;
+
+statement ok
INSERT INTO u VALUES (1, 1) ON CONFLICT (b) DO NOTHING;
+
+statement ok
DELETE FROM u;
+
+statement ok
DROP INDEX i2;
# An ON CONFLICT with any WHERE clause can use a unique non-partial index as an
# arbiter.
statement ok
CREATE UNIQUE INDEX i2 ON u (b);
+
+statement ok
INSERT INTO u VALUES (1, 1) ON CONFLICT (b) WHERE b > 0 DO NOTHING;
+
+statement ok
DROP INDEX i2;
# An ON CONFLICT with a WHERE clause can be use a unique partial index if the
@@ -889,6 +899,8 @@ SELECT * FROM u
# arbiters.
statement ok
CREATE UNIQUE INDEX i2 ON u (a) WHERE b < 0;
+
+statement ok
INSERT INTO u VALUES (-1, -1);
statement error pgcode 23505 duplicate key value violates unique constraint \"i2\"\nDETAIL: Key \(a\)=\(-1\) already exists\.
@@ -1425,7 +1437,11 @@ SELECT * FROM virt@idx WHERE c = 10
# computed columns.
statement ok
DELETE FROM virt;
+
+statement ok
DROP INDEX virt@idx;
+
+statement ok
CREATE UNIQUE INDEX idx ON virt (b) WHERE c > 10;
statement ok
diff --git a/pkg/sql/logictest/testdata/logic_test/pg_catalog b/pkg/sql/logictest/testdata/logic_test/pg_catalog
index fa572dd9eef5..545360c6d31a 100644
--- a/pkg/sql/logictest/testdata/logic_test/pg_catalog
+++ b/pkg/sql/logictest/testdata/logic_test/pg_catalog
@@ -4086,6 +4086,7 @@ distsql_workmem 64 MiB NULL
enable_experimental_alter_column_type_general off NULL NULL NULL string
enable_experimental_stream_replication off NULL NULL NULL string
enable_implicit_select_for_update on NULL NULL NULL string
+enable_implicit_transaction_for_batch_statements on NULL NULL NULL string
enable_insert_fast_path on NULL NULL NULL string
enable_multiregion_placement_policy off NULL NULL NULL string
enable_seqscan on NULL NULL NULL string
@@ -4204,6 +4205,7 @@ distsql_workmem 64 MiB NULL
enable_experimental_alter_column_type_general off NULL user NULL off off
enable_experimental_stream_replication off NULL user NULL off off
enable_implicit_select_for_update on NULL user NULL on on
+enable_implicit_transaction_for_batch_statements on NULL user NULL on on
enable_insert_fast_path on NULL user NULL on on
enable_multiregion_placement_policy off NULL user NULL off off
enable_seqscan on NULL user NULL on on
@@ -4317,6 +4319,7 @@ distsql_workmem NULL NULL NULL
enable_experimental_alter_column_type_general NULL NULL NULL NULL NULL
enable_experimental_stream_replication NULL NULL NULL NULL NULL
enable_implicit_select_for_update NULL NULL NULL NULL NULL
+enable_implicit_transaction_for_batch_statements NULL NULL NULL NULL NULL
enable_insert_fast_path NULL NULL NULL NULL NULL
enable_multiregion_placement_policy NULL NULL NULL NULL NULL
enable_seqscan NULL NULL NULL NULL NULL
@@ -4707,6 +4710,8 @@ conkey confkey
# Test an index of 3 referencing an index of 2.
statement ok
DROP TABLE b;
+
+statement ok
CREATE TABLE b (
id_b_1 INT,
id_b_2 INT,
@@ -4724,6 +4729,8 @@ conkey confkey
# Test an index of 3 referencing an index of 1.
statement ok
DROP TABLE b;
+
+statement ok
CREATE TABLE b (
id_b_1 INT,
id_b_2 INT,
@@ -4942,6 +4949,8 @@ SELECT adnum FROM pg_attrdef WHERE adrelid = 't46799'::REGCLASS
statement ok
ALTER TABLE t46799 DROP COLUMN y;
+
+statement ok
ALTER TABLE t46799 ADD COLUMN y INT DEFAULT 1;
# Make sure after adding and dropping the same column, the adnum for the re-added column increases.
diff --git a/pkg/sql/logictest/testdata/logic_test/prepare b/pkg/sql/logictest/testdata/logic_test/prepare
index b440aba76608..86473fcd2622 100644
--- a/pkg/sql/logictest/testdata/logic_test/prepare
+++ b/pkg/sql/logictest/testdata/logic_test/prepare
@@ -885,7 +885,10 @@ query error pq: column "b" does not exist
EXECUTE change_drop
statement ok
-ALTER TABLE othertable ADD COLUMN b INT; UPDATE othertable SET b=10
+ALTER TABLE othertable ADD COLUMN b INT;
+
+statement ok
+UPDATE othertable SET b=10
query II
EXECUTE change_drop
diff --git a/pkg/sql/logictest/testdata/logic_test/ranges b/pkg/sql/logictest/testdata/logic_test/ranges
index f35b36022fc8..f67616fea731 100644
Binary files a/pkg/sql/logictest/testdata/logic_test/ranges and b/pkg/sql/logictest/testdata/logic_test/ranges differ
diff --git a/pkg/sql/logictest/testdata/logic_test/reassign_owned_by b/pkg/sql/logictest/testdata/logic_test/reassign_owned_by
index 0f5689cd5a86..bea0112cef7e 100644
--- a/pkg/sql/logictest/testdata/logic_test/reassign_owned_by
+++ b/pkg/sql/logictest/testdata/logic_test/reassign_owned_by
@@ -7,7 +7,11 @@ REASSIGN OWNED BY fake_old_role TO new_role
statement ok
CREATE ROLE old_role;
+
+statement ok
GRANT CREATE ON DATABASE test TO old_role;
+
+statement ok
ALTER TABLE t OWNER TO old_role
user testuser
@@ -35,6 +39,8 @@ user root
statement ok
CREATE ROLE new_role;
+
+statement ok
GRANT CREATE ON DATABASE test TO new_role
user testuser
@@ -69,6 +75,8 @@ CREATE ROLE testuser2 WITH LOGIN;
# Create database for old role
statement ok
CREATE DATABASE d;
+
+statement ok
ALTER DATABASE d OWNER TO testuser
# Check ownership - testuser should own all objects just created
@@ -106,11 +114,15 @@ DROP ROLE testuser
# Can reassign from more than one old role to new role.
statement ok
use test;
+
+statement ok
CREATE ROLE testuser;
# Create schema for testuser and one for root.
statement ok
CREATE SCHEMA s1;
+
+statement ok
ALTER SCHEMA s1 OWNER TO testuser
statement ok
@@ -141,6 +153,8 @@ s2 3957504279
# Ensure testuser2 is new owner by dropping.
statement ok
DROP SCHEMA s1;
+
+statement ok
DROP SCHEMA s2
user root
diff --git a/pkg/sql/logictest/testdata/logic_test/rename_database b/pkg/sql/logictest/testdata/logic_test/rename_database
index e46a4a69e58d..b626c0cf4d1d 100644
--- a/pkg/sql/logictest/testdata/logic_test/rename_database
+++ b/pkg/sql/logictest/testdata/logic_test/rename_database
@@ -223,22 +223,53 @@ statement ok
ALTER DATABASE db1 RENAME TO db3
statement ok
-DROP DATABASE db2 CASCADE; DROP DATABASE db3 CASCADE
+DROP DATABASE db2 CASCADE;
statement ok
-CREATE DATABASE db1; CREATE SEQUENCE db1.a_seq; CREATE SEQUENCE db1.b_seq; USE db1;
+DROP DATABASE db3 CASCADE
+
+statement ok
+CREATE DATABASE db1;
+
+statement ok
+CREATE SEQUENCE db1.a_seq;
+CREATE SEQUENCE db1.b_seq;
+
+statement ok
+USE db1;
statement ok
CREATE TABLE db1.a (a int default nextval('a_seq') + nextval('b_seq') + 1); ALTER DATABASE db1 RENAME TO db2; USE db2;
statement ok
-DROP TABLE db2.a; CREATE TABLE db2.a (a int default nextval('a_seq') + nextval('db2.b_seq') + 1); ALTER DATABASE db2 RENAME TO db1; ALTER DATABASE db1 RENAME TO db2
+DROP TABLE db2.a;
+
+statement ok
+CREATE TABLE db2.a (a int default nextval('a_seq') + nextval('db2.b_seq') + 1);
+
+statement ok
+ALTER DATABASE db2 RENAME TO db1;
+
+statement ok
+ALTER DATABASE db1 RENAME TO db2
+
+statement ok
+DROP TABLE db2.a;
+
+statement ok
+CREATE TABLE db2.a (a int default nextval('a_seq') + nextval('db2.public.b_seq') + 1);
+
+statement ok
+ALTER DATABASE db2 RENAME TO db1; ALTER DATABASE db1 RENAME TO db2
+
+statement ok
+DROP TABLE db2.a;
statement ok
-DROP TABLE db2.a; CREATE TABLE db2.a (a int default nextval('a_seq') + nextval('db2.public.b_seq') + 1); ALTER DATABASE db2 RENAME TO db1; ALTER DATABASE db1 RENAME TO db2
+CREATE TABLE db2.a (a int default nextval('a_seq') + nextval('public.b_seq') + 1);
statement ok
-DROP TABLE db2.a; CREATE TABLE db2.a (a int default nextval('a_seq') + nextval('public.b_seq') + 1); ALTER DATABASE db2 RENAME TO db1
+ALTER DATABASE db2 RENAME TO db1
statement ok
USE defaultdb; DROP DATABASE db1 CASCADE
diff --git a/pkg/sql/logictest/testdata/logic_test/row_level_ttl b/pkg/sql/logictest/testdata/logic_test/row_level_ttl
index 785f64a007f9..ad42e95a6d32 100644
--- a/pkg/sql/logictest/testdata/logic_test/row_level_ttl
+++ b/pkg/sql/logictest/testdata/logic_test/row_level_ttl
@@ -153,6 +153,8 @@ WHERE label LIKE 'row-level-ttl-%'
# Ensure schedules are removed on DROP TABLE.
statement ok
DROP TABLE tbl;
+
+statement ok
CREATE TABLE tbl (
id INT PRIMARY KEY,
text TEXT,
@@ -177,6 +179,8 @@ WHERE label LIKE 'row-level-ttl-%'
# Create TTL on a different schema and ensure schedules are removed when dropped.
statement ok
CREATE SCHEMA drop_me;
+
+statement ok
CREATE TABLE drop_me.tbl () WITH (ttl_expire_after = '10 minutes'::interval);
CREATE TABLE drop_me.tbl2 () WITH (ttl_expire_after = '10 minutes'::interval)
@@ -198,7 +202,11 @@ WHERE label LIKE 'row-level-ttl-%'
# Create TTL on a different database and ensure schedules are removed when dropped.
statement ok
CREATE DATABASE drop_me;
+
+statement ok
USE drop_me;
+
+statement ok
CREATE TABLE tbl () WITH (ttl_expire_after = '10 minutes'::interval);
CREATE TABLE tbl2 () WITH (ttl_expire_after = '10 minutes'::interval)
@@ -374,6 +382,8 @@ ALTER TABLE no_ttl_table SET (ttl_label_metrics = true)
statement ok
DROP TABLE tbl;
+
+statement ok
CREATE TABLE tbl (
id INT PRIMARY KEY,
text TEXT,
@@ -442,6 +452,8 @@ CREATE TABLE public.tbl (
# Test adding to TTL table with crdb_internal_expiration already defined.
statement ok
DROP TABLE tbl;
+
+statement ok
CREATE TABLE tbl (
id INT PRIMARY KEY,
text TEXT,
@@ -493,6 +505,8 @@ ALTER TABLE tbl SET (ttl_expire_after = '10 minutes')
statement ok
DROP TABLE tbl;
+
+statement ok
CREATE TABLE tbl (id INT, text TEXT, PRIMARY KEY (id, text)) WITH (ttl_expire_after = '10 minutes')
statement error non-ascending ordering on PRIMARY KEYs are not supported
@@ -502,6 +516,8 @@ ALTER TABLE tbl ALTER PRIMARY KEY USING COLUMNS (id, text DESC)
# the schedule and TTL is setup correctly.
statement ok
DROP TABLE tbl;
+
+statement ok
CREATE TABLE tbl (
id INT PRIMARY KEY,
text TEXT,
diff --git a/pkg/sql/logictest/testdata/logic_test/secondary_index_column_families b/pkg/sql/logictest/testdata/logic_test/secondary_index_column_families
index 9488926a22d6..2360e2706e0c 100644
--- a/pkg/sql/logictest/testdata/logic_test/secondary_index_column_families
+++ b/pkg/sql/logictest/testdata/logic_test/secondary_index_column_families
@@ -19,6 +19,8 @@ SELECT y, z, w FROM t@i WHERE y = 2
# Test some cases around insert on conflict.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY,
y INT,
@@ -47,6 +49,8 @@ SELECT y, z, v FROM t@i
# Test some cases around upsert.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY,
y STRING,
@@ -55,6 +59,8 @@ CREATE TABLE t (
FAMILY (y), FAMILY (z), FAMILY (x, w),
INDEX i (y) STORING (z, w)
);
+
+statement ok
INSERT INTO t VALUES (1, '2', 3.0, 4), (5, '6', 7.00, 8);
UPSERT INTO t VALUES (9, '10', 11.000, 12), (1, '3', 5.0, 16)
@@ -68,6 +74,8 @@ SELECT y, z, w FROM t@i
# Test some cases around schema changes.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY,
y DECIMAL,
@@ -75,6 +83,8 @@ CREATE TABLE t (
w INT,
v INT
);
+
+statement ok
INSERT INTO t VALUES (1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15);
CREATE INDEX i ON t (y) STORING (z, w, v)
@@ -97,6 +107,8 @@ SELECT * FROM t
statement ok
ALTER TABLE t ADD COLUMN u INT DEFAULT (20) CREATE FAMILY new_fam;
+
+statement ok
CREATE INDEX i ON t (y) STORING (z, w, v, u)
query TIIII rowsort
diff --git a/pkg/sql/logictest/testdata/logic_test/set_role b/pkg/sql/logictest/testdata/logic_test/set_role
index e1dd05385943..9efa32fb2848 100644
--- a/pkg/sql/logictest/testdata/logic_test/set_role
+++ b/pkg/sql/logictest/testdata/logic_test/set_role
@@ -332,6 +332,8 @@ user root
statement ok
GRANT ADMIN TO testuser;
+
+statement ok
BEGIN;
SET LOCAL ROLE testuser
diff --git a/pkg/sql/logictest/testdata/logic_test/show_create_all_tables b/pkg/sql/logictest/testdata/logic_test/show_create_all_tables
index 24e1af7f1e1e..435ab630d1a1 100644
--- a/pkg/sql/logictest/testdata/logic_test/show_create_all_tables
+++ b/pkg/sql/logictest/testdata/logic_test/show_create_all_tables
@@ -227,18 +227,26 @@ ALTER TABLE public.c VALIDATE CONSTRAINT c_i_fkey;
# Test that a cycle between two tables is handled correctly.
statement ok
CREATE DATABASE test_cycle;
+
+statement ok
USE test_cycle;
+
+statement ok
CREATE TABLE loop_a (
id INT PRIMARY KEY,
b_id INT,
INDEX(b_id),
FAMILY f1 (id, b_id)
);
+
+statement ok
CREATE TABLE loop_b (
id INT PRIMARY KEY,
a_id INT REFERENCES loop_a ON DELETE CASCADE,
FAMILY f1 (id, a_id)
);
+
+statement ok
ALTER TABLE loop_a ADD CONSTRAINT b_id_delete_constraint
FOREIGN KEY (b_id) REFERENCES loop_b (id) ON DELETE CASCADE;
@@ -268,7 +276,11 @@ ALTER TABLE public.loop_a VALIDATE CONSTRAINT b_id_delete_constraint;
# Test that a primary key with a non-default name works.
statement ok
CREATE DATABASE test_primary_key;
+
+statement ok
USE test_primary_key;
+
+statement ok
CREATE TABLE test_primary_key.t (
i int,
CONSTRAINT pk_name PRIMARY KEY (i)
diff --git a/pkg/sql/logictest/testdata/logic_test/show_create_all_tables_builtin b/pkg/sql/logictest/testdata/logic_test/show_create_all_tables_builtin
index f9978c2ce40f..8e4008670695 100644
--- a/pkg/sql/logictest/testdata/logic_test/show_create_all_tables_builtin
+++ b/pkg/sql/logictest/testdata/logic_test/show_create_all_tables_builtin
@@ -222,18 +222,26 @@ ALTER TABLE public.c VALIDATE CONSTRAINT c_i_fkey;
# Test that a cycle between two tables is handled correctly.
statement ok
CREATE DATABASE test_cycle;
+
+statement ok
USE test_cycle;
+
+statement ok
CREATE TABLE loop_a (
id INT PRIMARY KEY,
b_id INT,
INDEX(b_id),
FAMILY f1 (id, b_id)
);
+
+statement ok
CREATE TABLE loop_b (
id INT PRIMARY KEY,
a_id INT REFERENCES loop_a ON DELETE CASCADE,
FAMILY f1 (id, a_id)
);
+
+statement ok
ALTER TABLE loop_a ADD CONSTRAINT b_id_delete_constraint
FOREIGN KEY (b_id) REFERENCES loop_b (id) ON DELETE CASCADE;
@@ -262,6 +270,8 @@ ALTER TABLE public.loop_a VALIDATE CONSTRAINT b_id_delete_constraint;
# Test that a primary key with a non-default name works.
statement ok
CREATE DATABASE test_primary_key;
+
+statement ok
CREATE TABLE test_primary_key.t (
i int,
CONSTRAINT pk_name PRIMARY KEY (i)
diff --git a/pkg/sql/logictest/testdata/logic_test/show_source b/pkg/sql/logictest/testdata/logic_test/show_source
index 06bc90cdd2dc..b0add7554fdf 100644
--- a/pkg/sql/logictest/testdata/logic_test/show_source
+++ b/pkg/sql/logictest/testdata/logic_test/show_source
@@ -55,6 +55,7 @@ distsql_workmem 64 MiB
enable_experimental_alter_column_type_general off
enable_experimental_stream_replication off
enable_implicit_select_for_update on
+enable_implicit_transaction_for_batch_statements on
enable_insert_fast_path on
enable_multiregion_placement_policy off
enable_seqscan on
@@ -424,8 +425,11 @@ SELECT start_key, end_key, replicas, lease_holder FROM [SHOW RANGES FROM TABLE s
start_key end_key replicas lease_holder
NULL NULL {1} 1
+statement ok
+CREATE INDEX ix ON foo(x)
+
query TTTI colnames
-CREATE INDEX ix ON foo(x); SELECT start_key, end_key, replicas, lease_holder FROM [SHOW RANGES FROM INDEX foo@ix]
+SELECT start_key, end_key, replicas, lease_holder FROM [SHOW RANGES FROM INDEX foo@ix]
----
start_key end_key replicas lease_holder
NULL NULL {1} 1
diff --git a/pkg/sql/logictest/testdata/logic_test/statement_statistics b/pkg/sql/logictest/testdata/logic_test/statement_statistics
index 9a047f9b1dc7..e313f0b1131e 100644
--- a/pkg/sql/logictest/testdata/logic_test/statement_statistics
+++ b/pkg/sql/logictest/testdata/logic_test/statement_statistics
@@ -23,7 +23,16 @@ true
# Check that node_statement_statistics report per statement
statement ok
-SET application_name = hello; SELECT 1; SELECT 1,2; SELECT 1
+SET application_name = hello;
+
+statement ok
+SELECT 1
+
+statement ok
+SELECT 1,2
+
+statement ok
+SELECT 1
# reset for other tests.
statement ok
@@ -32,8 +41,8 @@ SET application_name = ''
query TB
SELECT key, count >= 1 FROM crdb_internal.node_statement_statistics WHERE application_name = 'hello' AND key LIKE 'SELECT%' ORDER BY key
----
-SELECT _ true
-SELECT _, _ true
+SELECT _ true
+SELECT _, _ true
statement ok
CREATE TABLE test(x INT, y INT, z INT); INSERT INTO test(x, y, z) VALUES (0,0,0);
diff --git a/pkg/sql/logictest/testdata/logic_test/subquery_correlated b/pkg/sql/logictest/testdata/logic_test/subquery_correlated
index 71db1eb47665..68d8184462d3 100644
--- a/pkg/sql/logictest/testdata/logic_test/subquery_correlated
+++ b/pkg/sql/logictest/testdata/logic_test/subquery_correlated
@@ -1050,6 +1050,8 @@ CREATE TABLE groups(
id SERIAL PRIMARY KEY,
data JSONB
);
+
+statement ok
INSERT INTO groups(data) VALUES('{"name": "Group 1", "members": [{"name": "admin", "type": "USER"}, {"name": "user", "type": "USER"}]}');
INSERT INTO groups(data) VALUES('{"name": "Group 2", "members": [{"name": "admin2", "type": "USER"}]}');
@@ -1139,6 +1141,8 @@ CREATE TABLE users (
name VARCHAR(50),
PRIMARY KEY (id)
);
+
+statement ok
INSERT INTO users(id, name) VALUES (1, 'user1');
INSERT INTO users(id, name) VALUES (2, 'user2');
INSERT INTO users(id, name) VALUES (3, 'user3');
@@ -1151,6 +1155,8 @@ CREATE TABLE stuff (
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES users (id)
);
+
+statement ok
INSERT INTO stuff(id, date, user_id) VALUES (1, '2007-10-15'::DATE, 1);
INSERT INTO stuff(id, date, user_id) VALUES (2, '2007-12-15'::DATE, 1);
INSERT INTO stuff(id, date, user_id) VALUES (3, '2007-11-15'::DATE, 1);
diff --git a/pkg/sql/logictest/testdata/logic_test/temp_table b/pkg/sql/logictest/testdata/logic_test/temp_table
index 52cd8af5afee..6a384af02c8e 100644
--- a/pkg/sql/logictest/testdata/logic_test/temp_table
+++ b/pkg/sql/logictest/testdata/logic_test/temp_table
@@ -234,7 +234,10 @@ SELECT * FROM regression_47030
1
statement ok
-TRUNCATE regression_47030; INSERT INTO regression_47030 VALUES (2)
+TRUNCATE regression_47030
+
+statement ok
+INSERT INTO regression_47030 VALUES (2)
query I
SELECT * FROM regression_47030
diff --git a/pkg/sql/logictest/testdata/logic_test/truncate b/pkg/sql/logictest/testdata/logic_test/truncate
index 2b99034a5a8f..3cfe8343cf35 100644
--- a/pkg/sql/logictest/testdata/logic_test/truncate
+++ b/pkg/sql/logictest/testdata/logic_test/truncate
@@ -153,16 +153,38 @@ i3 NULL
# don't all start from 1.
statement ok
DROP TABLE t;
+
+statement ok
CREATE TABLE t (x INT, y INT, z INT);
+
+statement ok
ALTER TABLE t DROP COLUMN y;
+
+statement ok
ALTER TABLE t ADD COLUMN y INT;
+
+statement ok
ALTER TABLE t DROP COLUMN y;
+
+statement ok
ALTER TABLE t ADD COLUMN y INT;
+
+statement ok
CREATE INDEX i ON t (x);
+
+statement ok
DROP INDEX t@i;
+
+statement ok
CREATE INDEX i ON t (x);
+
+statement ok
DROP INDEX t@i;
+
+statement ok
CREATE INDEX i ON t (x);
+
+statement ok
COMMENT ON COLUMN t.y IS 'hello1';
COMMENT ON INDEX t@i IS 'hello2'
diff --git a/pkg/sql/logictest/testdata/logic_test/txn b/pkg/sql/logictest/testdata/logic_test/txn
index cdae56210e4d..ec660f10fde2 100644
--- a/pkg/sql/logictest/testdata/logic_test/txn
+++ b/pkg/sql/logictest/testdata/logic_test/txn
@@ -728,8 +728,10 @@ COMMIT
# We use a sequence to avoid busy-looping the test.
statement ok
CREATE SEQUENCE s;
- BEGIN TRANSACTION;
- SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h':::INTERVAL), 0)
+
+statement ok
+BEGIN TRANSACTION;
+SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h':::INTERVAL), 0)
# Demonstrate that the txn was indeed retried.
query I
@@ -739,13 +741,17 @@ SELECT currval('s')
statement ok
ROLLBACK;
- DROP SEQUENCE s
+
+statement ok
+DROP SEQUENCE s
# Automatic retries for the first batch even when that first batch comes after
# the BEGIN.
statement ok
CREATE SEQUENCE s;
- BEGIN TRANSACTION;
+
+statement ok
+BEGIN TRANSACTION;
statement ok
SELECT 1;
@@ -759,14 +765,18 @@ SELECT currval('s')
statement ok
ROLLBACK;
- DROP SEQUENCE s
+
+statement ok
+DROP SEQUENCE s
# Automatic retries for the first batch even when that first batch comes after
# the BEGIN and the BEGIN also has special statements that don't move the txn
# state out of the "AutoRetry" state.
statement ok
CREATE SEQUENCE s;
- BEGIN TRANSACTION;
+
+statement ok
+BEGIN TRANSACTION;
SAVEPOINT cockroach_restart;
SET TRANSACTION PRIORITY HIGH;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
@@ -792,12 +802,16 @@ high
statement ok
ROLLBACK;
- DROP SEQUENCE s
+
+statement ok
+DROP SEQUENCE s
# Like above, but the SAVEPOINT is its own batch.
statement ok
CREATE SEQUENCE s;
- BEGIN TRANSACTION
+
+statement ok
+BEGIN TRANSACTION
statement ok
SAVEPOINT cockroach_restart;
@@ -813,13 +827,17 @@ SELECT currval('s')
statement ok
ROLLBACK;
- DROP SEQUENCE s
+
+statement ok
+DROP SEQUENCE s
# Automatic retries for the first batch after an explicit restart.
statement ok
CREATE SEQUENCE s;
- BEGIN TRANSACTION;
+
+statement ok
+BEGIN TRANSACTION;
SAVEPOINT cockroach_restart;
SELECT 1;
@@ -841,7 +859,9 @@ SELECT currval('s')
statement ok
ROLLBACK;
- DROP SEQUENCE s
+
+statement ok
+DROP SEQUENCE s
# Test READ ONLY/WRITE syntax.
@@ -1124,7 +1144,11 @@ iso_8601
statement ok
TRUNCATE rewind_session_test;
+
+statement ok
SET intervalstyle = 'postgres';
+
+statement ok
BEGIN;
INSERT INTO rewind_session_test VALUES ('1 day 01:02:03'::interval::string);
SET LOCAL intervalstyle = 'iso_8601';
diff --git a/pkg/sql/logictest/testdata/logic_test/union b/pkg/sql/logictest/testdata/logic_test/union
index 405beb7fd34f..5829173daeb9 100644
--- a/pkg/sql/logictest/testdata/logic_test/union
+++ b/pkg/sql/logictest/testdata/logic_test/union
@@ -331,6 +331,8 @@ NULL
statement ok
DROP TABLE IF EXISTS t1, t2;
+
+statement ok
CREATE TABLE t1 (a INT[]);
CREATE TABLE t2 (b INT[]);
INSERT INTO t1 VALUES (ARRAY[1]), (ARRAY[2]), (NULL);
@@ -347,12 +349,18 @@ NULL
# Allow UNION of hidden and non-hidden columns.
statement ok
CREATE TABLE ab (a INT, b INT);
+
+statement ok
SELECT a, b, rowid FROM ab UNION VALUES (1, 2, 3);
+
+statement ok
DROP TABLE ab;
# Regression test for #59148.
statement ok
CREATE TABLE ab (a INT4, b INT8);
+
+statement ok
INSERT INTO ab VALUES (1, 1), (1, 2), (2, 1), (2, 2);
query I rowsort
@@ -374,6 +382,8 @@ DROP TABLE ab;
# between NULL and a tuple (#59611).
statement ok
CREATE TABLE t59611 (a INT);
+
+statement ok
INSERT INTO t59611 VALUES (1)
query T
@@ -557,6 +567,8 @@ SELECT a FROM ab UNION ALL SELECT x AS a FROM xy
statement ok
TRUNCATE ab;
TRUNCATE xy;
+
+statement ok
INSERT INTO ab VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5);
INSERT INTO xy VALUES (1, 1), (3, 3), (5, 5), (7, 7);
diff --git a/pkg/sql/logictest/testdata/logic_test/update b/pkg/sql/logictest/testdata/logic_test/update
index 1e2fcebebc63..4becf67c160c 100644
--- a/pkg/sql/logictest/testdata/logic_test/update
+++ b/pkg/sql/logictest/testdata/logic_test/update
@@ -387,8 +387,11 @@ UPDATE kv SET v = v + 1 ORDER BY v DESC LIMIT 3 RETURNING k,v
# Check that UPDATE properly supports LIMIT (MySQL extension)
+statement ok
+TRUNCATE kv;
+
statement count 3
-TRUNCATE kv; INSERT INTO kv VALUES (1, 2), (2, 3), (3, 4)
+INSERT INTO kv VALUES (1, 2), (2, 3), (3, 4)
query II
UPDATE kv SET v = v - 1 WHERE k < 10 ORDER BY k LIMIT 1 RETURNING k, v
diff --git a/pkg/sql/logictest/testdata/logic_test/upsert b/pkg/sql/logictest/testdata/logic_test/upsert
index 8de929c5cdee..21a616ddbb45 100644
--- a/pkg/sql/logictest/testdata/logic_test/upsert
+++ b/pkg/sql/logictest/testdata/logic_test/upsert
@@ -691,13 +691,19 @@ UPSERT INTO tc VALUES (1,2)
subtest regression_29497
statement ok
-CREATE TABLE t29497(x INT PRIMARY KEY); BEGIN; ALTER TABLE t29497 ADD COLUMN y INT NOT NULL DEFAULT 123
+CREATE TABLE t29497(x INT PRIMARY KEY);
+
+statement ok
+BEGIN; ALTER TABLE t29497 ADD COLUMN y INT NOT NULL DEFAULT 123
statement error UPSERT has more expressions than target columns
UPSERT INTO t29497 VALUES (1, 2)
statement ok
-ROLLBACK; BEGIN; ALTER TABLE t29497 ADD COLUMN y INT NOT NULL DEFAULT 123
+ROLLBACK;
+
+statement ok
+BEGIN; ALTER TABLE t29497 ADD COLUMN y INT NOT NULL DEFAULT 123
statement error column "y" does not exist
INSERT INTO t29497(x) VALUES (1) ON CONFLICT (x) DO UPDATE SET y = 456
diff --git a/pkg/sql/logictest/testdata/logic_test/vectorize b/pkg/sql/logictest/testdata/logic_test/vectorize
index 70dc51b17036..696b05ca8f31 100644
--- a/pkg/sql/logictest/testdata/logic_test/vectorize
+++ b/pkg/sql/logictest/testdata/logic_test/vectorize
@@ -836,6 +836,8 @@ CREATE TABLE t40732 AS SELECT g::INT8 AS _int8,
g::STRING AS _string,
g::STRING::BYTES AS _bytes
FROM generate_series(1, 5) AS g;
+
+statement ok
SET vectorize = experimental_always;
INSERT INTO t40732 DEFAULT VALUES;
@@ -1192,6 +1194,8 @@ CREATE TABLE t64793 AS
g % 2 = 1 AS _bool, g::STRING AS _string
FROM
ROWS FROM (generate_series(1, 5)) AS g;
+
+statement ok
SET vectorize=experimental_always;
INSERT INTO t64793 DEFAULT VALUES;
diff --git a/pkg/sql/logictest/testdata/logic_test/views b/pkg/sql/logictest/testdata/logic_test/views
index 12d034124ff8..16e8b680cd06 100644
--- a/pkg/sql/logictest/testdata/logic_test/views
+++ b/pkg/sql/logictest/testdata/logic_test/views
@@ -683,6 +683,8 @@ DROP TABLE t2
statement ok
CREATE INDEX i ON t2 (x);
CREATE INDEX i2 ON t2 (x);
+
+statement ok
CREATE OR REPLACE VIEW tview AS SELECT x AS x, x+1 AS x1, x+2 AS x2, x+3 AS x3 FROM t2@i
statement error pq: cannot drop index \"i\" because view \"tview\" depends on it
@@ -727,6 +729,8 @@ user root
# Only column a should be depended on in this case.
statement ok
DROP TABLE ab CASCADE;
+
+statement ok
CREATE TABLE ab (a INT, b INT);
CREATE VIEW vab (x) AS SELECT ab.a FROM ab, ab AS ab2
@@ -760,6 +764,8 @@ DROP TABLE toreg;
statement ok
DROP VIEW vregclass;
+
+statement ok
CREATE VIEW vregclass AS SELECT x FROM (SELECT CAST('toreg' AS regclass) AS x)
statement error pq: cannot drop relation "toreg" because view "vregclass" depends on it
@@ -767,6 +773,8 @@ DROP TABLE toreg;
statement ok
DROP VIEW vregclass;
+
+statement ok
CREATE SEQUENCE s_reg;
CREATE VIEW vregclass AS SELECT x FROM [SELECT 's_reg'::REGCLASS AS x]
@@ -777,11 +785,15 @@ DROP SEQUENCE s_reg
# a variable.
statement ok
DROP VIEW vregclass;
+
+statement ok
CREATE VIEW vregclass AS SELECT x::regclass FROM (SELECT 's_reg' AS x);
DROP SEQUENCE s_reg;
statement ok
DROP VIEW vregclass;
+
+statement ok
CREATE VIEW vregclass AS SELECT x::regclass FROM (SELECT 'does_not_exist' AS x);
statement error pq: relation "does_not_exist" does not exist
@@ -789,7 +801,11 @@ SELECT * FROM vregclass
statement ok
DROP VIEW vregclass;
+
+statement ok
CREATE table tregclass();
+
+statement ok
CREATE VIEW vregclass AS SELECT 1 FROM (SELECT 1) AS foo WHERE 'tregclass'::regclass = 'tregclass'::regclass;
statement error pq: cannot drop relation "tregclass" because view "vregclass" depends on it
diff --git a/pkg/sql/logictest/testdata/logic_test/window b/pkg/sql/logictest/testdata/logic_test/window
index 929b65baa112..09bc5f8b1916 100644
--- a/pkg/sql/logictest/testdata/logic_test/window
+++ b/pkg/sql/logictest/testdata/logic_test/window
@@ -4251,6 +4251,8 @@ NULL
# OFFSET PRECEDING or OFFSET FOLLOWING (#67975).
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x DATE);
INSERT INTO t VALUES ('5874897-01-01'::DATE), ('1999-01-08'::DATE);
SET vectorize=off;
@@ -4265,6 +4267,8 @@ RESET vectorize;
# shrinks.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (a INT);
INSERT INTO t VALUES (1), (-1), (NULL);
SET vectorize=off;
@@ -4285,6 +4289,8 @@ RESET vectorize;
# values.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (x INT, y STRING);
INSERT INTO t VALUES (1, 'NotNull'), (1, NULL), (1, NULL),
(2, 'NotNull'), (2, 'NotNull'), (2, 'NotNull'), (2, 'NotNull');
diff --git a/pkg/sql/logictest/testdata/logic_test/zigzag_join b/pkg/sql/logictest/testdata/logic_test/zigzag_join
index 77d7a29daaf0..85bfe28b8bb9 100644
--- a/pkg/sql/logictest/testdata/logic_test/zigzag_join
+++ b/pkg/sql/logictest/testdata/logic_test/zigzag_join
@@ -58,9 +58,13 @@ SET enable_zigzag_join = true
statement ok
DROP INDEX a@a_idx;
DROP INDEX a@b_idx;
+
+statement ok
CREATE INDEX c_idx ON a(c);
CREATE INDEX a_idx ON a(a);
CREATE INDEX b_idx ON a(b);
+
+statement ok
SELECT n,a,b FROM a WHERE a = 4 AND b = 1;
# Regression test for 48003 ("non-values node passed as fixed value to zigzag
diff --git a/pkg/sql/materialized_view_test.go b/pkg/sql/materialized_view_test.go
index c500c0c7a0d7..020ee9b43339 100644
--- a/pkg/sql/materialized_view_test.go
+++ b/pkg/sql/materialized_view_test.go
@@ -106,17 +106,14 @@ func TestMaterializedViewRefreshVisibility(t *testing.T) {
s, sqlDB, _ := serverutils.StartServer(t, params)
defer s.Stopper().Stop(ctx)
+ runner := sqlutils.MakeSQLRunner(sqlDB)
// Make a materialized view and update the data behind it.
- if _, err := sqlDB.Exec(`
-CREATE DATABASE t;
-CREATE TABLE t.t (x INT);
-INSERT INTO t.t VALUES (1), (2);
-CREATE MATERIALIZED VIEW t.v AS SELECT x FROM t.t;
-INSERT INTO t.t VALUES (3);
-`); err != nil {
- t.Fatal(err)
- }
+ runner.Exec(t, `CREATE DATABASE t;`)
+ runner.Exec(t, `CREATE TABLE t.t (x INT);`)
+ runner.Exec(t, `INSERT INTO t.t VALUES (1), (2);`)
+ runner.Exec(t, `CREATE MATERIALIZED VIEW t.v AS SELECT x FROM t.t;`)
+ runner.Exec(t, `INSERT INTO t.t VALUES (3);`)
// Start a refresh.
go func() {
@@ -129,7 +126,6 @@ INSERT INTO t.t VALUES (3);
<-waitForCommit
// Before the refresh commits, we shouldn't see any updated data.
- runner := sqlutils.MakeSQLRunner(sqlDB)
runner.CheckQueryResults(t, "SELECT * FROM t.v ORDER BY x", [][]string{{"1"}, {"2"}})
// Let the refresh commit.
diff --git a/pkg/sql/opt/exec/execbuilder/testdata/autocommit_nonmetamorphic b/pkg/sql/opt/exec/execbuilder/testdata/autocommit_nonmetamorphic
index 07bd096941a0..048e6748a7e7 100644
--- a/pkg/sql/opt/exec/execbuilder/testdata/autocommit_nonmetamorphic
+++ b/pkg/sql/opt/exec/execbuilder/testdata/autocommit_nonmetamorphic
@@ -33,6 +33,8 @@ true
statement ok
SET TRACING=ON;
INSERT INTO ab VALUES (1, 1);
+
+statement ok
SET TRACING=OFF
query TT
@@ -54,6 +56,8 @@ true
statement ok
SET TRACING=ON;
INSERT INTO ab VALUES (2, 2), (3, 3);
+
+statement ok
SET TRACING=OFF
query TT
@@ -102,6 +106,8 @@ true
statement ok
SET TRACING=ON;
INSERT INTO ab VALUES (6, 6), (7, 7) RETURNING a, b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -122,6 +128,8 @@ true
statement ok
SET TRACING=ON;
INSERT INTO ab VALUES (8, 8), (9, 9) RETURNING a < b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -145,6 +153,8 @@ false
statement ok
SET TRACING=ON;
INSERT INTO ab VALUES (10, 10), (11, 11) RETURNING a / b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -182,6 +192,8 @@ true
statement ok
SET TRACING=ON;
UPSERT INTO ab VALUES (1, 1);
+
+statement ok
SET TRACING=OFF
query TT
@@ -203,6 +215,8 @@ true
statement ok
SET TRACING=ON;
UPSERT INTO ab VALUES (2, 2), (3, 3);
+
+statement ok
SET TRACING=OFF
query TT
@@ -251,6 +265,8 @@ true
statement ok
SET TRACING=ON;
UPSERT INTO ab VALUES (6, 6), (7, 7) RETURNING a, b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -272,6 +288,8 @@ false
statement ok
SET TRACING=ON;
UPSERT INTO ab VALUES (8, 8), (9, 9) RETURNING a + b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -296,6 +314,8 @@ false
statement ok
SET TRACING=ON;
UPSERT INTO ab VALUES (10, 10), (11, 11) RETURNING a / b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -333,6 +353,8 @@ true
statement ok
SET TRACING=ON;
UPDATE ab SET b=b+1 WHERE a < 3;
+
+statement ok
SET TRACING=OFF
query TT
@@ -383,6 +405,8 @@ true
statement ok
SET TRACING=ON;
UPDATE ab SET b=b+1 WHERE a < 3 RETURNING a, b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -405,6 +429,8 @@ false
statement ok
SET TRACING=ON;
UPDATE ab SET b=b+1 WHERE a < 3 RETURNING a + b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -430,6 +456,8 @@ false
statement ok
SET TRACING=ON;
UPDATE ab SET b=b+1 WHERE a < 3 RETURNING a / b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -468,6 +496,8 @@ true
statement ok
SET TRACING=ON;
DELETE FROM ab WHERE a = 1;
+
+statement ok
SET TRACING=OFF
query TT
@@ -489,6 +519,8 @@ true
statement ok
SET TRACING=ON;
DELETE FROM ab WHERE a IN (2, 3);
+
+statement ok
SET TRACING=OFF
query TT
@@ -537,6 +569,8 @@ true
statement ok
SET TRACING=ON;
DELETE FROM ab WHERE a IN (6, 7) RETURNING a, b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -559,6 +593,8 @@ false
statement ok
SET TRACING=ON;
DELETE FROM ab WHERE a IN (8, 9) RETURNING a + b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -584,6 +620,8 @@ false
statement ok
SET TRACING=ON;
DELETE FROM ab WHERE a IN (10, 11) RETURNING a / b;
+
+statement ok
SET TRACING=OFF
query TT
@@ -633,6 +671,8 @@ false
statement ok
SET TRACING=ON;
INSERT INTO fk_child VALUES (1, 1), (2, 2);
+
+statement ok
SET TRACING=OFF
query TT
@@ -656,6 +696,8 @@ false
statement ok
SET TRACING=ON;
UPDATE fk_child SET b=b+1 WHERE a < 2;
+
+statement ok
SET TRACING=OFF
query TT
@@ -681,6 +723,8 @@ false
statement ok
SET TRACING=ON;
DELETE FROM fk_parent WHERE p = 3;
+
+statement ok
SET TRACING=OFF
query TT
@@ -698,7 +742,11 @@ dist sender send r44: sending batch 1 EndTxn to (n1,s1):1
# Test with a single cascade, which should use autocommit.
statement ok
DROP TABLE fk_child;
+
+statement ok
CREATE TABLE fk_child (a INT, b INT REFERENCES fk_parent(p) ON DELETE CASCADE, FAMILY f1 (a, b));
+
+statement ok
INSERT INTO fk_child VALUES (1, 1), (2, 2)
# Populate table descriptor cache.
@@ -708,6 +756,8 @@ SELECT * FROM fk_parent JOIN fk_child ON p = b
statement ok
SET TRACING=ON;
DELETE FROM fk_parent WHERE p = 2;
+
+statement ok
SET TRACING=OFF
query TT
@@ -738,6 +788,8 @@ SET TRACING=ON;
INSERT INTO ab (
SELECT a*10, b*10 FROM [ INSERT INTO ab VALUES (1, 1), (2, 2) RETURNING a, b ]
);
+
+statement ok
SET TRACING=OFF
query TT
@@ -763,6 +815,8 @@ statement ok
SET TRACING=ON;
WITH cte AS (INSERT INTO ab VALUES (3, 3), (4, 4) RETURNING a, b)
INSERT INTO ab (SELECT a*10, b*10 FROM cte);
+
+statement ok
SET TRACING=OFF
query TT
@@ -797,6 +851,8 @@ true
statement ok
SET tracing = on;
INSERT INTO guardrails VALUES (1);
+
+statement ok
SET tracing = off;
query TT
diff --git a/pkg/sql/opt/exec/execbuilder/testdata/delete b/pkg/sql/opt/exec/execbuilder/testdata/delete
index 136ceafc048c..a7f65a4a5ae7 100644
--- a/pkg/sql/opt/exec/execbuilder/testdata/delete
+++ b/pkg/sql/opt/exec/execbuilder/testdata/delete
@@ -242,7 +242,10 @@ statement ok
INSERT INTO a VALUES(5)
statement ok
-SET tracing = on,kv; DELETE FROM a WHERE a = 5; SET tracing = off
+SET tracing = on,kv; DELETE FROM a WHERE a = 5;
+
+statement ok
+SET tracing = off
query TT
SELECT operation, message FROM [SHOW KV TRACE FOR SESSION]
diff --git a/pkg/sql/opt/exec/execbuilder/testdata/secondary_index_column_families_nonmetamorphic b/pkg/sql/opt/exec/execbuilder/testdata/secondary_index_column_families_nonmetamorphic
index d0bddc697d1a..ed8e1f082157 100644
--- a/pkg/sql/opt/exec/execbuilder/testdata/secondary_index_column_families_nonmetamorphic
+++ b/pkg/sql/opt/exec/execbuilder/testdata/secondary_index_column_families_nonmetamorphic
@@ -232,6 +232,8 @@ CPut /Table/107/2/1/1/1 -> /TUPLE/2:2:Int/5 (replacing [10 35 4], if exists)
# Test composite datatypes.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY,
y DECIMAL,
@@ -269,6 +271,8 @@ vectorized: true
# Ensure that we always have a k/v in family 0.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY,
y INT,
@@ -292,6 +296,8 @@ Scan /Table/109/2/2/0
# Ensure that when backfilling an index we only insert the needed k/vs.
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY, y INT, z INT, w INT,
FAMILY (y), FAMILY (x), FAMILY (z), FAMILY (w)
@@ -327,6 +333,8 @@ fetched: /t/i/9/8 ->
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY, y INT, z INT, w INT,
FAMILY (y), FAMILY (x), FAMILY (z), FAMILY (w)
@@ -362,6 +370,8 @@ SELECT * FROM t@i
statement ok
DROP TABLE IF EXISTS t;
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY, y INT, a INT, b INT, c INT, d INT, e INT, f INT,
FAMILY (x), FAMILY (y), FAMILY (a, b), FAMILY (c, d), FAMILY (e), FAMILY (f),
@@ -458,12 +468,16 @@ SELECT * FROM t@i2
# Ensure that updating a row in the single family case still works.
statement ok
-DROP TABLE IF EXISTS t;
+DROP TABLE IF EXISTS t
+
+statement ok
CREATE TABLE t (
x INT PRIMARY KEY, y INT, z INT, w INT,
INDEX i (y) STORING (z, w),
FAMILY (x, y, z, w)
-);
+)
+
+statement ok
INSERT INTO t VALUES (1, 2, 3, 4)
# When the key is changed, we always delete and cput.
diff --git a/pkg/sql/opt/exec/execbuilder/testdata/select b/pkg/sql/opt/exec/execbuilder/testdata/select
index 3c38c32bf768..d29e1534c90a 100644
--- a/pkg/sql/opt/exec/execbuilder/testdata/select
+++ b/pkg/sql/opt/exec/execbuilder/testdata/select
@@ -5,7 +5,13 @@
# TODO(yuzefovich): clean up the tracing in the vectorized engine and remove
# adjustment of vectorize mode (#55821).
statement ok
-SET vectorize=off; SET tracing = on; BEGIN; SELECT 1; COMMIT; SELECT 2; SET tracing = off; RESET vectorize
+SET vectorize=off; SET tracing = on
+
+statement ok
+BEGIN; SELECT 1; COMMIT; SELECT 2
+
+statement ok
+SET tracing = off; RESET vectorize
# Inspect the trace: we exclude messages containing newlines as these
# may contain non-deterministic txn object descriptions.
@@ -20,22 +26,26 @@ FROM [SHOW TRACE FOR SESSION]
WHERE message LIKE '%SPAN START%' OR message LIKE '%pos%executing%';
----
0 === SPAN START: session recording === session recording
+1 === SPAN START: session tracing === session tracing
+1 [Open pos:?] executing Sync session tracing
+2 === SPAN START: commit sql txn === commit sql txn
0 [NoTxn pos:?] executing ExecStmt: BEGIN TRANSACTION session recording
-1 === SPAN START: sql txn === sql txn
-1 [Open pos:?] executing ExecStmt: SELECT 1 sql txn
-2 === SPAN START: sql query === sql query
-3 === SPAN START: consuming rows === consuming rows
-4 === SPAN START: flow === flow
-1 [Open pos:?] executing ExecStmt: COMMIT TRANSACTION sql txn
-5 === SPAN START: sql query === sql query
-6 === SPAN START: commit sql txn === commit sql txn
+3 === SPAN START: sql txn === sql txn
+3 [Open pos:?] executing ExecStmt: SELECT 1 sql txn
+4 === SPAN START: sql query === sql query
+5 === SPAN START: consuming rows === consuming rows
+6 === SPAN START: flow === flow
+3 [Open pos:?] executing ExecStmt: COMMIT TRANSACTION sql txn
+7 === SPAN START: sql query === sql query
+8 === SPAN START: commit sql txn === commit sql txn
0 [NoTxn pos:?] executing ExecStmt: SELECT 2 session recording
-7 === SPAN START: sql txn === sql txn
-7 [Open pos:?] executing ExecStmt: SELECT 2 sql txn
-8 === SPAN START: sql query === sql query
-9 === SPAN START: consuming rows === consuming rows
-10 === SPAN START: flow === flow
-11 === SPAN START: commit sql txn === commit sql txn
+9 === SPAN START: sql txn === sql txn
+9 [Open pos:?] executing ExecStmt: SELECT 2 sql txn
+10 === SPAN START: sql query === sql query
+11 === SPAN START: consuming rows === consuming rows
+12 === SPAN START: flow === flow
+13 === SPAN START: commit sql txn === commit sql txn
+0 [NoTxn pos:?] executing Sync session recording
0 [NoTxn pos:?] executing ExecStmt: SET TRACING = off session recording
statement ok
diff --git a/pkg/sql/opt/exec/execbuilder/testdata/show_trace_nonmetamorphic b/pkg/sql/opt/exec/execbuilder/testdata/show_trace_nonmetamorphic
index 887d1020dfb3..3e15752248e7 100644
--- a/pkg/sql/opt/exec/execbuilder/testdata/show_trace_nonmetamorphic
+++ b/pkg/sql/opt/exec/execbuilder/testdata/show_trace_nonmetamorphic
@@ -149,7 +149,10 @@ batch flow coordinator fast path completed
sql query rows affected: 1
statement ok
-SET tracing = on,kv,results; DROP TABLE t.kv2; SET tracing = off
+SET tracing = on,kv,results; DROP TABLE t.kv2
+
+statement ok
+SET tracing = off
query TT
$trace_query
@@ -159,7 +162,10 @@ commit sql txn Put /Table/3/1/109/2/1 -> table: table: 1));
INSERT INTO foo.a SELECT unnest(ARRAY[1,2,3,4,5]);
SET CLUSTER SETTING cluster.organization = 'ACME';
@@ -19,7 +22,6 @@ SELECT (1, 20, 30, 40) = (SELECT a, 1, 2, 3 FROM foo.a LIMIT 1);
error: pq: failed to satisfy CHECK constraint (a > 1:::INT8)
sql-stats
└── $ some app
- ├── [nodist] CREATE DATABASE _
├── [nodist] CREATE TABLE _ (_ INT8, CONSTRAINT _ CHECK (_ > _))
└── [failed,nodist] INSERT INTO _ SELECT unnest(ARRAY[_, _, __more3__])
diff --git a/pkg/sql/tests/data.go b/pkg/sql/tests/data.go
index 35f5c6854470..5d4634e3120d 100644
--- a/pkg/sql/tests/data.go
+++ b/pkg/sql/tests/data.go
@@ -48,13 +48,16 @@ func CheckKeyCountE(t *testing.T, kvDB *kv.DB, span roachpb.Span, numKeys int) e
func CreateKVTable(sqlDB *gosql.DB, name string, numRows int) error {
// Fix the column families so the key counts don't change if the family
// heuristics are updated.
- schema := fmt.Sprintf(`
- CREATE DATABASE IF NOT EXISTS t;
- CREATE TABLE t.%s (k INT PRIMARY KEY, v INT, FAMILY (k), FAMILY (v));
- CREATE INDEX foo on t.%s (v);`, name, name)
+ schemaStmts := []string{
+ `CREATE DATABASE IF NOT EXISTS t;`,
+ fmt.Sprintf(`CREATE TABLE t.%s (k INT PRIMARY KEY, v INT, FAMILY (k), FAMILY (v));`, name),
+ fmt.Sprintf(`CREATE INDEX foo on t.%s (v);`, name),
+ }
- if _, err := sqlDB.Exec(schema); err != nil {
- return err
+ for _, stmt := range schemaStmts {
+ if _, err := sqlDB.Exec(stmt); err != nil {
+ return err
+ }
}
// Bulk insert.
diff --git a/pkg/sql/trace_test.go b/pkg/sql/trace_test.go
index e9136b5d22e5..988567386d72 100644
--- a/pkg/sql/trace_test.go
+++ b/pkg/sql/trace_test.go
@@ -264,16 +264,17 @@ func TestTrace(t *testing.T) {
defer cluster.Stopper().Stop(context.Background())
clusterDB := cluster.ServerConn(0)
+ if _, err := clusterDB.Exec(`CREATE DATABASE test;`); err != nil {
+ t.Fatal(err)
+ }
if _, err := clusterDB.Exec(`
- CREATE DATABASE test;
-
--- test.foo is a single range table.
CREATE TABLE test.foo (id INT PRIMARY KEY);
-
--- test.bar is a multi-range table.
- CREATE TABLE test.bar (id INT PRIMARY KEY);
- ALTER TABLE test.bar SPLIT AT VALUES (5);
- `); err != nil {
+ CREATE TABLE test.bar (id INT PRIMARY KEY);`); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := clusterDB.Exec(`ALTER TABLE test.bar SPLIT AT VALUES (5);`); err != nil {
t.Fatal(err)
}
@@ -306,6 +307,10 @@ func TestTrace(t *testing.T) {
pgURL, cleanup := sqlutils.PGUrl(
t, cluster.Server(i).ServingSQLAddr(), "TestTrace", url.User(security.RootUser))
defer cleanup()
+ q := pgURL.Query()
+ // This makes it easier to test with the `tracing` sesssion var.
+ q.Add("enable_implicit_transaction_for_batch_statements", "false")
+ pgURL.RawQuery = q.Encode()
sqlDB, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
diff --git a/pkg/sql/txn_restart_test.go b/pkg/sql/txn_restart_test.go
index f4edd908ed54..b7574bedeb25 100644
--- a/pkg/sql/txn_restart_test.go
+++ b/pkg/sql/txn_restart_test.go
@@ -473,13 +473,10 @@ func TestTxnAutoRetry(t *testing.T) {
// lib/pq connection directly. As of Feb 2016, there's code in cli/sql_util.go to
// do that.
sqlDB.SetMaxOpenConns(1)
+ sqlRunner := sqlutils.MakeSQLRunner(sqlDB)
- if _, err := sqlDB.Exec(`
-CREATE DATABASE t;
-CREATE TABLE t.test (k INT PRIMARY KEY, v TEXT, t DECIMAL);
-`); err != nil {
- t.Fatal(err)
- }
+ sqlRunner.Exec(t, `CREATE DATABASE t;`)
+ sqlRunner.Exec(t, `CREATE TABLE t.test (k INT PRIMARY KEY, v TEXT, t DECIMAL);`)
// Set up error injection that causes retries.
magicVals := createFilterVals(nil, nil)
@@ -539,12 +536,16 @@ CREATE TABLE t.test (k INT PRIMARY KEY, v TEXT, t DECIMAL);
// current allocation count in monitor and checking that it has the
// same value at the beginning of each retry.
rows, err := sqlDB.Query(`
+BEGIN;
INSERT INTO t.public.test(k, v, t) VALUES (1, 'boulanger', cluster_logical_timestamp()) RETURNING 1;
+END;
BEGIN;
INSERT INTO t.public.test(k, v, t) VALUES (2, 'dromedary', cluster_logical_timestamp()) RETURNING 1;
INSERT INTO t.public.test(k, v, t) VALUES (3, 'fajita', cluster_logical_timestamp()) RETURNING 1;
END;
+BEGIN;
INSERT INTO t.public.test(k, v, t) VALUES (4, 'hooly', cluster_logical_timestamp()) RETURNING 1;
+END;
BEGIN;
INSERT INTO t.public.test(k, v, t) VALUES (5, 'josephine', cluster_logical_timestamp()) RETURNING 1;
INSERT INTO t.public.test(k, v, t) VALUES (6, 'laureal', cluster_logical_timestamp()) RETURNING 1;
diff --git a/pkg/sql/vars.go b/pkg/sql/vars.go
index a498bef1f5cc..eacf40c39e54 100644
--- a/pkg/sql/vars.go
+++ b/pkg/sql/vars.go
@@ -1973,6 +1973,23 @@ var varGen = map[string]sessionVar{
GlobalDefault: func(sv *settings.Values) string {
return formatBoolAsPostgresSetting(overrideAlterPrimaryRegionInSuperRegion.Get(sv))
}},
+
+ // CockroachDB extension.
+ `enable_implicit_transaction_for_batch_statements`: {
+ GetStringVal: makePostgresBoolGetStringValFn(`enable_implicit_transaction_for_batch_statements`),
+ Set: func(_ context.Context, m sessionDataMutator, s string) error {
+ b, err := paramparse.ParseBoolVar("enable_implicit_transaction_for_batch_statements", s)
+ if err != nil {
+ return err
+ }
+ m.SetEnableImplicitTransactionForBatchStatements(b)
+ return nil
+ },
+ Get: func(evalCtx *extendedEvalContext) (string, error) {
+ return formatBoolAsPostgresSetting(evalCtx.SessionData().EnableImplicitTransactionForBatchStatements), nil
+ },
+ GlobalDefault: globalTrue,
+ },
}
const compatErrMsg = "this parameter is currently recognized only for compatibility and has no effect in CockroachDB."
diff --git a/pkg/testutils/jobutils/jobs_verification.go b/pkg/testutils/jobutils/jobs_verification.go
index 823088faabba..d144302d137a 100644
--- a/pkg/testutils/jobutils/jobs_verification.go
+++ b/pkg/testutils/jobutils/jobs_verification.go
@@ -167,6 +167,8 @@ func verifySystemJob(
sort.Sort(expected.DescriptorIDs)
expected.Details = nil
if e, a := expected, actual; !reflect.DeepEqual(e, a) {
+ fmt.Printf("%+v\n", expected)
+ fmt.Printf("%+v\n", actual)
return errors.Errorf("job %d did not match:\n%s",
offset, strings.Join(pretty.Diff(e, a), "\n"))
}