Skip to content

Commit 909b08b

Browse files
authored
reintroduce last_insert_id discrepancy (#2886)
1 parent be58f51 commit 909b08b

File tree

5 files changed

+41
-18
lines changed

5 files changed

+41
-18
lines changed

enginetest/queries/insert_queries.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ var InsertQueries = []WriteQueryTest{
571571
},
572572
{
573573
WriteQuery: "INSERT INTO auto_increment_tbl values (5, 44)",
574-
ExpectedWriteResult: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 0}}},
574+
ExpectedWriteResult: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 5}}},
575575
SelectQuery: "SELECT * FROM auto_increment_tbl ORDER BY pk",
576576
ExpectedSelect: []sql.Row{
577577
{1, 11},
@@ -629,7 +629,7 @@ var InsertQueries = []WriteQueryTest{
629629
},
630630
{
631631
WriteQuery: `INSERT INTO auto_increment_tbl VALUES ('4', 44)`,
632-
ExpectedWriteResult: []sql.Row{{types.NewOkResult(1)}},
632+
ExpectedWriteResult: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 4}}},
633633
SelectQuery: `SELECT * from auto_increment_tbl where pk=4`,
634634
ExpectedSelect: []sql.Row{
635635
{4, 44},
@@ -1354,7 +1354,7 @@ var InsertScripts = []ScriptTest{
13541354
{
13551355
Query: "insert into auto values (1)",
13561356
Expected: []sql.Row{
1357-
{types.OkResult{RowsAffected: 1, InsertID: 0}},
1357+
{types.OkResult{RowsAffected: 1, InsertID: 1}},
13581358
},
13591359
},
13601360
{
@@ -1373,7 +1373,7 @@ var InsertScripts = []ScriptTest{
13731373
{
13741374
Query: "insert into auto_pk values (0), (1), (NULL), ()",
13751375
Expected: []sql.Row{
1376-
{types.OkResult{RowsAffected: 4, InsertID: 2}},
1376+
{types.OkResult{RowsAffected: 4}},
13771377
},
13781378
},
13791379
{
@@ -2804,7 +2804,7 @@ var InsertIgnoreScripts = []ScriptTest{
28042804
},
28052805
{
28062806
Query: "insert ignore into test_table values (1, 'invalid'), (2, 'bye'), (3, null)",
2807-
Expected: []sql.Row{{types.OkResult{RowsAffected: 3}}},
2807+
Expected: []sql.Row{{types.OkResult{RowsAffected: 3, InsertID: 1}}},
28082808
//ExpectedWarning: mysql.ERWarnDataTruncated, // TODO: incorrect code
28092809
},
28102810
{

enginetest/queries/script_queries.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package queries
1616

1717
import (
18+
"math"
1819
"time"
1920

2021
"github.com/dolthub/vitess/go/sqltypes"
@@ -2057,7 +2058,7 @@ CREATE TABLE tab3 (
20572058
},
20582059
{
20592060
Query: "insert into a (x,y) values (1,1)",
2060-
Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 0}}},
2061+
Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 1}}},
20612062
},
20622063
{
20632064
Query: "select last_insert_id()",
@@ -2082,7 +2083,7 @@ CREATE TABLE tab3 (
20822083
},
20832084
{
20842085
Query: "insert into b (x) values (1), (2)",
2085-
Expected: []sql.Row{{types.OkResult{RowsAffected: 2, InsertID: 3}}},
2086+
Expected: []sql.Row{{types.OkResult{RowsAffected: 2, InsertID: 0}}},
20862087
},
20872088
{
20882089
// The above query doesn't have an auto increment column, so last_insert_id is unchanged
@@ -2093,7 +2094,7 @@ CREATE TABLE tab3 (
20932094
Query: "insert into a (x, y) values (-100, 10)",
20942095
Expected: []sql.Row{{types.OkResult{
20952096
RowsAffected: 1,
2096-
InsertID: 3,
2097+
InsertID: math.MaxUint64 - 100 + 1,
20972098
}}},
20982099
},
20992100
{
@@ -2105,7 +2106,7 @@ CREATE TABLE tab3 (
21052106
Query: "insert into a (x, y) values (100, 10)",
21062107
Expected: []sql.Row{{types.OkResult{
21072108
RowsAffected: 1,
2108-
InsertID: 3,
2109+
InsertID: 100,
21092110
}}},
21102111
},
21112112
{
@@ -2200,7 +2201,7 @@ CREATE TABLE tab3 (
22002201

22012202
{
22022203
Query: "insert into t(pk) values (10), (default);",
2203-
Expected: []sql.Row{{types.OkResult{RowsAffected: 2, InsertID: 11}}},
2204+
Expected: []sql.Row{{types.OkResult{RowsAffected: 2, InsertID: 10}}},
22042205
},
22052206
{
22062207
Query: "select last_insert_id()",
@@ -2224,7 +2225,7 @@ CREATE TABLE tab3 (
22242225

22252226
{
22262227
Query: "insert into t(pk) values (20), (default), (default);",
2227-
Expected: []sql.Row{{types.OkResult{RowsAffected: 3, InsertID: 21}}},
2228+
Expected: []sql.Row{{types.OkResult{RowsAffected: 3, InsertID: 20}}},
22282229
},
22292230
{
22302231
Query: "select last_insert_id()",

enginetest/queries/transaction_queries.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ var TransactionTests = []TransactionTest{
837837
// Client a does a skip ahead
838838
{
839839
Query: "/* client a */ insert into t values (10, 10)",
840-
Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 12}}},
840+
Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 10}}},
841841
},
842842
{
843843
Query: "/* client b */ insert into t (y) values (11)",
@@ -846,7 +846,7 @@ var TransactionTests = []TransactionTest{
846846
// Client c skips ahead
847847
{
848848
Query: "/* client c */ insert into t values (50, 50)",
849-
Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 11}}},
849+
Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 50}}},
850850
},
851851
{
852852
Query: "/* client b */ insert into t (y) values (51)",

enginetest/queries/trigger_queries.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2592,7 +2592,11 @@ end;`,
25922592
},
25932593
{
25942594
Query: "INSERT INTO `film` VALUES (3,'ADAPTATION HOLES','An Astounding Reflection in A Baloon Factory'),(4,'AFFAIR PREJUDICE','A Fanciful Documentary in A Shark Tank')",
2595-
Expected: []sql.Row{{types.OkResult{RowsAffected: 2, InsertID: 0}}},
2595+
Expected: []sql.Row{{types.OkResult{RowsAffected: 2, InsertID: 3}}},
2596+
},
2597+
{
2598+
Query: "SELECT last_insert_id();",
2599+
Expected: []sql.Row{{uint64(0)}},
25962600
},
25972601
{
25982602
Query: "SELECT COUNT(*) FROM film",
@@ -2653,7 +2657,11 @@ INSERT INTO t0 (v1, v2) VALUES (i, s); END;`,
26532657
{
26542658
SkipResultCheckOnServerEngine: true, // call depends on stored procedure stmt for whether to use 'query' or 'exec' from go sql driver.
26552659
Query: "CALL add_entry(4, 'aaa');",
2656-
Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 1}}},
2660+
Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 3}}},
2661+
},
2662+
{
2663+
Query: "SELECT last_insert_id();",
2664+
Expected: []sql.Row{{uint64(1)}},
26572665
},
26582666
{
26592667
Query: "SELECT * FROM t0;",

sql/rowexec/dml_iters.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,19 @@ type insertRowHandler struct {
338338

339339
func (i *insertRowHandler) handleRowUpdate(row sql.Row) error {
340340
i.rowsAffected++
341+
if !i.updatedAutoIncrementValue {
342+
i.updatedAutoIncrementValue = true
343+
if i.lastInsertIdGetter != nil {
344+
i.lastInsertId = uint64(i.lastInsertIdGetter(row))
345+
}
346+
}
341347
return nil
342348
}
343349

350+
func (i *insertRowHandler) getLastInsertId() uint64 {
351+
return i.lastInsertId
352+
}
353+
344354
func (i *insertRowHandler) okResult() types.OkResult {
345355
return types.OkResult{
346356
RowsAffected: uint64(i.rowsAffected),
@@ -564,7 +574,9 @@ func getRowHandler(clientFoundRowsToggled bool, iter sql.RowIter) accumulatorRow
564574
if i.updater != nil {
565575
return &onDuplicateUpdateHandler{schema: i.schema, clientFoundRowsCapability: clientFoundRowsToggled}
566576
}
567-
return &insertRowHandler{}
577+
return &insertRowHandler{
578+
lastInsertIdGetter: i.getAutoIncVal,
579+
}
568580
case *deleteIter:
569581
return &deleteRowHandler{}
570582
default:
@@ -636,10 +648,12 @@ func (a *accumulatorIter) Next(ctx *sql.Context) (r sql.Row, err error) {
636648
// For some update accumulators, we don't accurately track the last insert ID in the handler and need to set
637649
// it manually in the result by getting it from the session. This doesn't work correctly in all cases and needs
638650
// to be fixed. See comment in buildRowUpdateAccumulator in rowexec/dml.go
639-
switch a.updateRowHandler.(type) {
640-
case *onDuplicateUpdateHandler, *replaceRowHandler, *insertRowHandler:
651+
switch rowHandler := a.updateRowHandler.(type) {
652+
case *onDuplicateUpdateHandler, *replaceRowHandler:
641653
lastInsertId := ctx.Session.GetLastQueryInfoInt(sql.LastInsertId)
642654
res.InsertID = uint64(lastInsertId)
655+
case *insertRowHandler:
656+
res.InsertID = rowHandler.lastInsertId
643657
}
644658

645659
// By definition, ROW_COUNT() is equal to RowsAffected.

0 commit comments

Comments
 (0)