@@ -1146,6 +1146,189 @@ func TestPlanChanges(t *testing.T) {
11461146 },
11471147 wantErr : true ,
11481148 },
1149+ // AUTO_RANDOM with shard bits.
1150+ {
1151+ version : "5.7.25-TiDB-v6.1.0" ,
1152+ changes : []schema.Change {
1153+ func () * schema.AddTable {
1154+ t := & schema.Table {
1155+ Name : "users" ,
1156+ Columns : []* schema.Column {
1157+ {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 5 }}},
1158+ {Name : "name" , Type : & schema.ColumnType {Type : & schema.StringType {T : "varchar" , Size : 255 }}},
1159+ },
1160+ }
1161+ t .PrimaryKey = & schema.Index {Parts : []* schema.IndexPart {{C : t .Columns [0 ]}}}
1162+ return & schema.AddTable {T : t }
1163+ }(),
1164+ },
1165+ wantPlan : & migrate.Plan {
1166+ Reversible : true ,
1167+ Changes : []* migrate.Change {{Cmd : "CREATE TABLE `users` (`id` bigint NOT NULL AUTO_RANDOM(5), `name` varchar(255) NOT NULL, PRIMARY KEY (`id`))" , Reverse : "DROP TABLE `users`" }},
1168+ },
1169+ },
1170+ // AUTO_RANDOM with zero ShardBits (placeholder) should not emit AUTO_RANDOM in SQL.
1171+ {
1172+ version : "5.7.25-TiDB-v6.1.0" ,
1173+ changes : []schema.Change {
1174+ func () * schema.AddTable {
1175+ t := & schema.Table {
1176+ Name : "users" ,
1177+ Columns : []* schema.Column {
1178+ {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {}}},
1179+ },
1180+ }
1181+ t .PrimaryKey = & schema.Index {Parts : []* schema.IndexPart {{C : t .Columns [0 ]}}}
1182+ return & schema.AddTable {T : t }
1183+ }(),
1184+ },
1185+ wantPlan : & migrate.Plan {
1186+ Reversible : true ,
1187+ Changes : []* migrate.Change {{Cmd : "CREATE TABLE `users` (`id` bigint NOT NULL, PRIMARY KEY (`id`))" , Reverse : "DROP TABLE `users`" }},
1188+ },
1189+ },
1190+ // AUTO_RANDOM with min shard bits (boundary).
1191+ {
1192+ version : "5.7.25-TiDB-v6.1.0" ,
1193+ changes : []schema.Change {
1194+ func () * schema.AddTable {
1195+ t := & schema.Table {
1196+ Name : "users" ,
1197+ Columns : []* schema.Column {
1198+ {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 1 }}},
1199+ },
1200+ }
1201+ t .PrimaryKey = & schema.Index {Parts : []* schema.IndexPart {{C : t .Columns [0 ]}}}
1202+ return & schema.AddTable {T : t }
1203+ }(),
1204+ },
1205+ wantPlan : & migrate.Plan {
1206+ Reversible : true ,
1207+ Changes : []* migrate.Change {{Cmd : "CREATE TABLE `users` (`id` bigint NOT NULL AUTO_RANDOM(1), PRIMARY KEY (`id`))" , Reverse : "DROP TABLE `users`" }},
1208+ },
1209+ },
1210+ // AUTO_RANDOM with max shard bits (boundary).
1211+ {
1212+ version : "5.7.25-TiDB-v6.1.0" ,
1213+ changes : []schema.Change {
1214+ func () * schema.AddTable {
1215+ t := & schema.Table {
1216+ Name : "users" ,
1217+ Columns : []* schema.Column {
1218+ {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 15 }}},
1219+ },
1220+ }
1221+ t .PrimaryKey = & schema.Index {Parts : []* schema.IndexPart {{C : t .Columns [0 ]}}}
1222+ return & schema.AddTable {T : t }
1223+ }(),
1224+ },
1225+ wantPlan : & migrate.Plan {
1226+ Reversible : true ,
1227+ Changes : []* migrate.Change {{Cmd : "CREATE TABLE `users` (`id` bigint NOT NULL AUTO_RANDOM(15), PRIMARY KEY (`id`))" , Reverse : "DROP TABLE `users`" }},
1228+ },
1229+ },
1230+ // AUTO_RANDOM with shard and range bits.
1231+ {
1232+ version : "5.7.25-TiDB-v6.1.0" ,
1233+ changes : []schema.Change {
1234+ func () * schema.AddTable {
1235+ t := & schema.Table {
1236+ Name : "users" ,
1237+ Columns : []* schema.Column {
1238+ {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 5 , RangeBits : 32 }}},
1239+ },
1240+ }
1241+ t .PrimaryKey = & schema.Index {Parts : []* schema.IndexPart {{C : t .Columns [0 ]}}}
1242+ return & schema.AddTable {T : t }
1243+ }(),
1244+ },
1245+ wantPlan : & migrate.Plan {
1246+ Reversible : true ,
1247+ Changes : []* migrate.Change {{Cmd : "CREATE TABLE `users` (`id` bigint NOT NULL AUTO_RANDOM(5, 32), PRIMARY KEY (`id`))" , Reverse : "DROP TABLE `users`" }},
1248+ },
1249+ },
1250+ // AUTO_RANDOM with range bits = 64 (default, should not emit range).
1251+ {
1252+ version : "5.7.25-TiDB-v6.1.0" ,
1253+ changes : []schema.Change {
1254+ func () * schema.AddTable {
1255+ t := & schema.Table {
1256+ Name : "users" ,
1257+ Columns : []* schema.Column {
1258+ {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 5 , RangeBits : 64 }}},
1259+ },
1260+ }
1261+ t .PrimaryKey = & schema.Index {Parts : []* schema.IndexPart {{C : t .Columns [0 ]}}}
1262+ return & schema.AddTable {T : t }
1263+ }(),
1264+ },
1265+ wantPlan : & migrate.Plan {
1266+ Reversible : true ,
1267+ Changes : []* migrate.Change {{Cmd : "CREATE TABLE `users` (`id` bigint NOT NULL AUTO_RANDOM(5), PRIMARY KEY (`id`))" , Reverse : "DROP TABLE `users`" }},
1268+ },
1269+ },
1270+ // ALTER TABLE: add AUTO_RANDOM to an existing column.
1271+ {
1272+ version : "5.7.25-TiDB-v6.1.0" ,
1273+ changes : []schema.Change {
1274+ & schema.ModifyTable {
1275+ T : & schema.Table {
1276+ Name : "users" ,
1277+ Columns : []* schema.Column {
1278+ {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 5 }}},
1279+ },
1280+ },
1281+ Changes : []schema.Change {
1282+ & schema.ModifyColumn {
1283+ Change : schema .ChangeAttr ,
1284+ From : & schema.Column {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}},
1285+ To : & schema.Column {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 5 }}},
1286+ },
1287+ },
1288+ },
1289+ },
1290+ wantPlan : & migrate.Plan {
1291+ Reversible : true ,
1292+ Transactional : false ,
1293+ Changes : []* migrate.Change {
1294+ {
1295+ Cmd : "ALTER TABLE `users` MODIFY COLUMN `id` bigint NOT NULL AUTO_RANDOM(5)" ,
1296+ Reverse : "ALTER TABLE `users` MODIFY COLUMN `id` bigint NOT NULL" ,
1297+ },
1298+ },
1299+ },
1300+ },
1301+ // ALTER TABLE: change AUTO_RANDOM shard bits.
1302+ {
1303+ version : "5.7.25-TiDB-v6.1.0" ,
1304+ changes : []schema.Change {
1305+ & schema.ModifyTable {
1306+ T : & schema.Table {
1307+ Name : "users" ,
1308+ Columns : []* schema.Column {
1309+ {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 10 }}},
1310+ },
1311+ },
1312+ Changes : []schema.Change {
1313+ & schema.ModifyColumn {
1314+ Change : schema .ChangeAttr ,
1315+ From : & schema.Column {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 5 }}},
1316+ To : & schema.Column {Name : "id" , Type : & schema.ColumnType {Type : & schema.IntegerType {T : "bigint" }}, Attrs : []schema.Attr {& AutoRandom {ShardBits : 10 }}},
1317+ },
1318+ },
1319+ },
1320+ },
1321+ wantPlan : & migrate.Plan {
1322+ Reversible : true ,
1323+ Transactional : false ,
1324+ Changes : []* migrate.Change {
1325+ {
1326+ Cmd : "ALTER TABLE `users` MODIFY COLUMN `id` bigint NOT NULL AUTO_RANDOM(10)" ,
1327+ Reverse : "ALTER TABLE `users` MODIFY COLUMN `id` bigint NOT NULL AUTO_RANDOM(5)" ,
1328+ },
1329+ },
1330+ },
1331+ },
11491332 }
11501333 for i , tt := range tests {
11511334 t .Run (strconv .Itoa (i ), func (t * testing.T ) {
0 commit comments