Skip to content

Commit 9d69acb

Browse files
craig[bot]dt
craig[bot]
andcommitted
Merge #29306
29306: importccl: allow mysql AUTO_INCREMENT without start val r=dt a=dt for empty tables, mysqldump does not emit the AUTO_INCREMENT=X comment on the CREATE TABLE. Previously we used this comment to determine if we'd make a sequence to allow auto_increment default expressions on individual columns in the table definition. However for empty tables, this meant those columns would then error since we thought we were not going to support the sequence. Instead, look for any auto_increments first to determine if we need the sequence, then handle the individual column defs. Release note: none. Fixes #29300. Co-authored-by: David Taylor <[email protected]>
2 parents 30031b2 + 15c83f8 commit 9d69acb

9 files changed

+44
-27
lines changed

pkg/ccl/importccl/mysql_testdata_helpers_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ func genMysqlTestdata(t *testing.T, dump func()) {
248248
KEY ki (k, i)
249249
)`,
250250
`CREATE TABLE third (
251-
i INT PRIMARY KEY,
251+
i INT PRIMARY KEY AUTO_INCREMENT,
252252
a INT, b INT, C INT,
253253
FOREIGN KEY (a, b) REFERENCES second (i, k) ON DELETE RESTRICT ON UPDATE RESTRICT,
254254
FOREIGN KEY (c) REFERENCES third (i) ON UPDATE CASCADE

pkg/ccl/importccl/read_import_mysql.go

+31-16
Original file line numberDiff line numberDiff line change
@@ -309,29 +309,46 @@ func mysqlTableToCockroach(
309309

310310
const seqOpt = "auto_increment="
311311
var seqName string
312-
var seqDesc *sqlbase.TableDescriptor
312+
var startingValue int64
313313
for _, opt := range strings.Fields(strings.ToLower(in.Options)) {
314314
if strings.HasPrefix(opt, seqOpt) {
315+
seqName = name + "_auto_inc"
315316
i, err := strconv.Atoi(strings.TrimPrefix(opt, seqOpt))
316317
if err != nil {
317318
return nil, nil, errors.Wrapf(err, "parsing AUTO_INCREMENT value")
318319
}
319-
i64 := int64(i)
320-
seqVals[id] = i64
321-
priv := sqlbase.NewDefaultPrivilegeDescriptor()
322-
opts := tree.SequenceOptions{{Name: tree.SeqOptStart, IntVal: &i64}}
323-
seqName = name + "_auto_inc"
324-
desc, err := sql.MakeSequenceTableDesc(seqName, opts, parentID, id, time, priv, nil)
325-
if err != nil {
326-
return nil, nil, err
327-
}
328-
seqDesc = &desc
329-
fks.resolver[seqName] = seqDesc
330-
id++
320+
startingValue = int64(i)
331321
break
332322
}
333323
}
334324

325+
if seqName == "" {
326+
for _, raw := range in.Columns {
327+
if raw.Type.Autoincrement {
328+
seqName = name + "_auto_inc"
329+
break
330+
}
331+
}
332+
}
333+
334+
var seqDesc *sqlbase.TableDescriptor
335+
// If we have an auto-increment seq, create it and increment the id.
336+
if seqName != "" {
337+
priv := sqlbase.NewDefaultPrivilegeDescriptor()
338+
var opts tree.SequenceOptions
339+
if startingValue != 0 {
340+
opts = tree.SequenceOptions{{Name: tree.SeqOptStart, IntVal: &startingValue}}
341+
seqVals[id] = startingValue
342+
}
343+
desc, err := sql.MakeSequenceTableDesc(seqName, opts, parentID, id, time, priv, nil)
344+
if err != nil {
345+
return nil, nil, err
346+
}
347+
seqDesc = &desc
348+
fks.resolver[seqName] = seqDesc
349+
id++
350+
}
351+
335352
tblName := tree.MakeUnqualifiedTableName(tree.Name(name))
336353
stmt := &tree.CreateTable{
337354
Table: tree.NormalizableTableName{TableNameReference: &tblName},
@@ -345,9 +362,7 @@ func mysqlTableToCockroach(
345362
return nil, nil, err
346363
}
347364
if raw.Type.Autoincrement {
348-
if seqName == "" {
349-
return nil, nil, errors.Errorf("column %q specifies AUTO_INCREMENT but table options did not include it", def.Name)
350-
}
365+
351366
expr, err := parser.ParseExpr(fmt.Sprintf("nextval('%s':::STRING)", seqName))
352367
if err != nil {
353368
return nil, nil, err

pkg/ccl/importccl/read_import_mysql_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ func TestMysqldumpSchemaReader(t *testing.T) {
199199

200200
t.Run("third-in-multi", func(t *testing.T) {
201201
skip := fkHandler{allowed: true, skip: true, resolver: make(fkResolver)}
202-
expected := descForTable(t, readFile(t, `third.cockroach-schema.sql`), expectedParent, 51, skip)
202+
expected := descForTable(t, readFile(t, `third.cockroach-schema.sql`), expectedParent, 52, skip)
203203
got := readMysqlCreateFrom(t, files.wholeDB, "third", 51, skip)
204204
compareTables(t, expected, got)
205205
})

pkg/ccl/importccl/testdata/mysqldump/db.sql

+3-3
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ CREATE TABLE `everything` (
8888

8989
LOCK TABLES `everything` WRITE;
9090
/*!40000 ALTER TABLE `everything` DISABLE KEYS */;
91-
INSERT INTO `everything` VALUES (1,'c',NULL,NULL,'Small','bin\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,NULL,'2000-01-01 00:00:00',NULL,'2018-08-17 02:54:28',NULL,NULL,NULL,-12.345,-2,NULL,NULL,NULL,NULL,NULL,-1.5,NULL,NULL,NULL,NULL,NULL,'{\"a\": \"b\", \"c\": {\"d\": [\"e\", 11, null]}}'),(2,'c2',NULL,NULL,'Large','bin2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,NULL,'2000-01-01 00:00:00',NULL,'2018-08-17 02:54:28',NULL,NULL,NULL,12.345,3,NULL,NULL,NULL,NULL,NULL,1.2,NULL,NULL,NULL,NULL,NULL,'{}');
91+
INSERT INTO `everything` VALUES (1,'c',NULL,NULL,'Small','bin\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,NULL,'2000-01-01 00:00:00',NULL,'2018-08-29 19:49:30',NULL,NULL,NULL,-12.345,-2,NULL,NULL,NULL,NULL,NULL,-1.5,NULL,NULL,NULL,NULL,NULL,'{\"a\": \"b\", \"c\": {\"d\": [\"e\", 11, null]}}'),(2,'c2',NULL,NULL,'Large','bin2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,NULL,'2000-01-01 00:00:00',NULL,'2018-08-29 19:49:30',NULL,NULL,NULL,12.345,3,NULL,NULL,NULL,NULL,NULL,1.2,NULL,NULL,NULL,NULL,NULL,'{}');
9292
/*!40000 ALTER TABLE `everything` ENABLE KEYS */;
9393
UNLOCK TABLES;
9494

@@ -125,7 +125,7 @@ DROP TABLE IF EXISTS `third`;
125125
/*!40101 SET @saved_cs_client = @@character_set_client */;
126126
/*!40101 SET character_set_client = utf8 */;
127127
CREATE TABLE `third` (
128-
`i` int(11) NOT NULL,
128+
`i` int(11) NOT NULL AUTO_INCREMENT,
129129
`a` int(11) DEFAULT NULL,
130130
`b` int(11) DEFAULT NULL,
131131
`C` int(11) DEFAULT NULL,
@@ -155,4 +155,4 @@ UNLOCK TABLES;
155155
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
156156
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
157157

158-
-- Dump completed on 2018-08-17 2:54:28
158+
-- Dump completed on 2018-08-29 19:49:30

pkg/ccl/importccl/testdata/mysqldump/everything.sql

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ CREATE TABLE `everything` (
6161

6262
LOCK TABLES `everything` WRITE;
6363
/*!40000 ALTER TABLE `everything` DISABLE KEYS */;
64-
INSERT INTO `everything` VALUES (1,'c',NULL,NULL,'Small','bin\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,NULL,'2000-01-01 00:00:00',NULL,'2018-08-17 02:54:28',NULL,NULL,NULL,-12.345,-2,NULL,NULL,NULL,NULL,NULL,-1.5,NULL,NULL,NULL,NULL,NULL,'{\"a\": \"b\", \"c\": {\"d\": [\"e\", 11, null]}}'),(2,'c2',NULL,NULL,'Large','bin2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,NULL,'2000-01-01 00:00:00',NULL,'2018-08-17 02:54:28',NULL,NULL,NULL,12.345,3,NULL,NULL,NULL,NULL,NULL,1.2,NULL,NULL,NULL,NULL,NULL,'{}');
64+
INSERT INTO `everything` VALUES (1,'c',NULL,NULL,'Small','bin\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,NULL,'2000-01-01 00:00:00',NULL,'2018-08-29 19:49:30',NULL,NULL,NULL,-12.345,-2,NULL,NULL,NULL,NULL,NULL,-1.5,NULL,NULL,NULL,NULL,NULL,'{\"a\": \"b\", \"c\": {\"d\": [\"e\", 11, null]}}'),(2,'c2',NULL,NULL,'Large','bin2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,NULL,'2000-01-01 00:00:00',NULL,'2018-08-29 19:49:30',NULL,NULL,NULL,12.345,3,NULL,NULL,NULL,NULL,NULL,1.2,NULL,NULL,NULL,NULL,NULL,'{}');
6565
/*!40000 ALTER TABLE `everything` ENABLE KEYS */;
6666
UNLOCK TABLES;
6767
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -74,4 +74,4 @@ UNLOCK TABLES;
7474
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
7575
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
7676

77-
-- Dump completed on 2018-08-17 2:54:28
77+
-- Dump completed on 2018-08-29 19:49:30

pkg/ccl/importccl/testdata/mysqldump/second.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,4 @@ UNLOCK TABLES;
5151
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
5252
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
5353

54-
-- Dump completed on 2018-08-17 2:54:28
54+
-- Dump completed on 2018-08-29 19:49:30

pkg/ccl/importccl/testdata/mysqldump/simple.cockroach-schema.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CREATE SEQUENCe simple_auto_inc;
1+
CREATE SEQUENCE simple_auto_inc;
22

33
CREATE TABLE simple (
44
i INT4 PRIMARY KEY DEFAULT nextval('simple_auto_inc':::string),

pkg/ccl/importccl/testdata/mysqldump/simple.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,4 @@ UNLOCK TABLES;
4949
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
5050
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
5151

52-
-- Dump completed on 2018-08-17 2:54:28
52+
-- Dump completed on 2018-08-29 19:49:30

pkg/ccl/importccl/testdata/mysqldump/third.cockroach-schema.sql

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
CREATE SEQUENCE third_auto_inc;
2+
13
CREATE TABLE third (
2-
i INT4 PRIMARY KEY,
4+
i INT4 NOT NULL DEFAULT nextval('third_auto_inc':::STRING) PRIMARY KEY,
35
a INT4,
46
b INT4,
57
c INT4,

0 commit comments

Comments
 (0)