-
Notifications
You must be signed in to change notification settings - Fork 5.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
lightning: fix auto_increment out-of-range error #34146
Changes from 1 commit
62c7c5e
061987b
95a2442
54b2dae
53c8056
23ca467
a14195f
a7a11b7
17b9c33
7ec3615
6959514
8635dc7
2a59d47
8879e8b
f726489
3190dc5
2f04407
7c7faa3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,7 @@ import ( | |
"context" | ||
"database/sql" | ||
"fmt" | ||
"math" | ||
"strconv" | ||
"strings" | ||
|
||
|
@@ -373,8 +374,12 @@ func ObtainNewCollationEnabled(ctx context.Context, g glue.SQLExecutor) (bool, e | |
// NOTE: since tidb can make sure the auto id is always be rebase even if the `incr` value is smaller | ||
// the the auto incremanet base in tidb side, we needn't fetch currently auto increment value here. | ||
// See: https://github.com/pingcap/tidb/blob/64698ef9a3358bfd0fdc323996bb7928a56cadca/ddl/ddl_api.go#L2528-L2533 | ||
func AlterAutoIncrement(ctx context.Context, g glue.SQLExecutor, tableName string, incr int64) error { | ||
logger := log.With(zap.String("table", tableName), zap.Int64("auto_increment", incr)) | ||
func AlterAutoIncrement(ctx context.Context, g glue.SQLExecutor, tableName string, incr uint64) error { | ||
logger := log.With(zap.String("table", tableName), zap.Uint64("auto_increment", incr)) | ||
if incr > math.MaxInt64 { | ||
logger.Warn("auto_increment out of the maximum value TiDB supports", zap.Uint64("auto_increment", incr)) | ||
return nil | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we need to set There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. MaxInt64 is a legal value in TiDB (i.e. you can insert (9223372036854775807, ....) to a table) whereas MaxInt64+1 is illegal, which will trigger the error, e.g.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Mostly yes. But in terms of the case shown in the linked issue, So I'm not trying to legalize auto-incr value that exceeds math.MaxInt64 but try to skip this syntax error and let Lightning fail by other clearer issues (such as data corruption, duplicate entry, etc.). As for the case in this issue, because Lightning doesn't try to write entries that are larger than 9223372036854775807, it will succeed. Failing by duplicate entries might be more intuitive in terms of the effectiveness of reporting the error. Syntax error is helpless... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could confirm whether data corruption or any other error can be reported when using local backend and auto_inc is overflow? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes. If the e.g. create a table with auto-incremental key: CREATE TABLE `test1` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
PRIMARY KEY (`a`),
UNIQUE KEY `id` (`id`)
) insert 256 rows (where only one column "a" in the source file), and get error:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "checksum mismatch" is hard for user to know what happened. How about checking overflow during encoding and give a clear error to user? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Yes. Actually I'm looking at it #28776. This PR only solves the unexpected syntax error. |
||
query := fmt.Sprintf("ALTER TABLE %s AUTO_INCREMENT=%d", tableName, incr) | ||
task := logger.Begin(zap.InfoLevel, "alter table auto_increment") | ||
err := g.ExecuteWithLog(ctx, query, "alter table auto_increment", logger) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since
incr > math.MaxInt64
can only happen when there is one row that there is one rwo explitly set the max-value, so here you should alter the auto increment value to the max value then. So the behavior then is the same as import via sql.Please also add a test case to ensure: Lightning local backend can successfully import data which explicitly set auto_increment row value to the max valid value according to tidb's restriction. After import, any new insert statement without explicitly set the auto_increment row will result with an error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll add a IT later. But it seems
alter table xxx auto_increment=math.MaxInt64
will lead to some unexpected errors (I've talked to the guys from sql-infra, it might be bugs of TiDB #34142). So I won't set it until they fix this issue (leave a TODO here, or perhaps I can usealter table xxx force ...
).