Skip to content

Commit 851570c

Browse files
authored
Merge pull request #154400 from jeffswenson/backport24.1-154399
release-24.1: backup: restore must skip temporary tables
2 parents 34681c6 + de44cb3 commit 851570c

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

pkg/ccl/backupccl/restore_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package backupccl
77

88
import (
99
"context"
10+
gosql "database/sql"
1011
"testing"
1112
"time"
1213

@@ -58,3 +59,49 @@ func TestRestoreWithOpenTransaction(t *testing.T) {
5859

5960
userConn.Exec(t, "COMMIT")
6061
}
62+
63+
func TestRestoreDuplicateTempTables(t *testing.T) {
64+
defer leaktest.AfterTest(t)()
65+
defer log.Scope(t).Close(t)
66+
67+
// This is a regression test for #153722. It verifies that restoring a backup
68+
// that contains two temporary tables with the same name does not cause the
69+
// restore to fail with an error of the form: "restoring 17 TableDescriptors
70+
// from 4 databases: restoring table desc and namespace entries: table
71+
// already exists"
72+
73+
clusterSize := 1
74+
tc, sqlDB, _, cleanupFn := backuptestutils.StartBackupRestoreTestCluster(t, clusterSize)
75+
defer cleanupFn()
76+
77+
sqlDB.Exec(t, `SET experimental_enable_temp_tables=true`)
78+
sqlDB.Exec(t, `CREATE DATABASE test_db`)
79+
sqlDB.Exec(t, `USE test_db`)
80+
sqlDB.Exec(t, `CREATE TABLE permanent_table (id INT PRIMARY KEY, name TEXT)`)
81+
82+
sessions := make([]*gosql.DB, 2)
83+
for i := range sessions {
84+
sessions[i] = tc.Servers[0].SQLConn(t)
85+
sql := sqlutils.MakeSQLRunner(sessions[i])
86+
sql.Exec(t, `SET experimental_enable_temp_tables=true`)
87+
sql.Exec(t, `USE test_db`)
88+
sql.Exec(t, `CREATE TEMP TABLE duplicate_temp (id INT PRIMARY KEY, value TEXT)`)
89+
sql.Exec(t, `INSERT INTO duplicate_temp VALUES (1, 'value')`)
90+
}
91+
92+
sqlDB.Exec(t, `BACKUP INTO 'nodelocal://1/duplicate_temp_backup'`)
93+
94+
for _, session := range sessions {
95+
require.NoError(t, session.Close())
96+
}
97+
98+
// The cluster must be empty for a full cluster restore.
99+
sqlDB.Exec(t, `DROP DATABASE test_db CASCADE`)
100+
sqlDB.Exec(t, `RESTORE FROM LATEST IN 'nodelocal://1/duplicate_temp_backup'`)
101+
102+
sqlDB.Exec(t, `DROP DATABASE test_db CASCADE`)
103+
sqlDB.Exec(t, `RESTORE DATABASE test_db FROM LATEST IN 'nodelocal://1/duplicate_temp_backup'`)
104+
105+
result := sqlDB.QueryStr(t, `SELECT table_name FROM [SHOW TABLES] ORDER BY table_name`)
106+
require.Equal(t, [][]string{{"permanent_table"}}, result)
107+
}

pkg/ccl/backupccl/targets.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,10 @@ func fullClusterTargetsRestore(
306306
var filteredDescs []catalog.Descriptor
307307
var filteredDBs []catalog.DatabaseDescriptor
308308
for _, desc := range fullClusterDescs {
309+
if table, ok := desc.(catalog.TableDescriptor); ok && table.IsTemporary() {
310+
// TODO(jeffswenson): We should move this filtering into backup.
311+
continue
312+
}
309313
if desc.GetID() != keys.SystemDatabaseID {
310314
filteredDescs = append(filteredDescs, desc)
311315
}
@@ -382,7 +386,6 @@ func selectTargets(
382386
}
383387

384388
if descriptorCoverage == tree.AllDescriptors {
385-
386389
tables, dbs, patterns, err := fullClusterTargetsRestore(ctx, allDescs, lastBackupManifest)
387390
return tables, dbs, patterns, nil, err
388391
}

0 commit comments

Comments
 (0)