Skip to content

Commit 6be549c

Browse files
harshit-gangalkamil-gwozdz
authored andcommitted
allow innodb_lock_wait_timeout as system variable (vitessio#16574)
Signed-off-by: Harshit Gangal <[email protected]>
1 parent c04466f commit 6be549c

File tree

5 files changed

+90
-2
lines changed

5 files changed

+90
-2
lines changed

go/test/endtoend/vtgate/reservedconn/sysvar_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,3 +459,35 @@ func TestSysVarTxIsolation(t *testing.T) {
459459
// second run, to ensuring the setting is applied on the session and not just on next query after settings.
460460
utils.AssertContains(t, conn, "select @@transaction_isolation, connection_id()", `SERIALIZABLE`)
461461
}
462+
463+
// TestSysVarInnodbWaitTimeout tests the innodb_lock_wait_timeout system variable
464+
func TestSysVarInnodbWaitTimeout(t *testing.T) {
465+
conn, err := mysql.Connect(context.Background(), &vtParams)
466+
require.NoError(t, err)
467+
defer conn.Close()
468+
469+
// default from mysql
470+
utils.AssertMatches(t, conn, "select @@innodb_lock_wait_timeout", `[[UINT64(20)]]`)
471+
utils.AssertMatches(t, conn, "select @@global.innodb_lock_wait_timeout", `[[UINT64(20)]]`)
472+
// ensuring it goes to mysql
473+
utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout", `UINT64(20)`)
474+
utils.AssertContains(t, conn, "select @@global.innodb_lock_wait_timeout", `UINT64(20)`)
475+
476+
// setting to different value.
477+
utils.Exec(t, conn, "set @@innodb_lock_wait_timeout = 120")
478+
utils.AssertMatches(t, conn, "select @@innodb_lock_wait_timeout", `[[INT64(120)]]`)
479+
// ensuring it goes to mysql
480+
utils.AssertContains(t, conn, "select @@global.innodb_lock_wait_timeout, connection_id()", `UINT64(20)`)
481+
utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout, connection_id()", `INT64(120)`)
482+
// second run, to ensuring the setting is applied on the session and not just on next query after settings.
483+
utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout, connection_id()", `INT64(120)`)
484+
485+
// changing setting to different value.
486+
utils.Exec(t, conn, "set @@innodb_lock_wait_timeout = 240")
487+
utils.AssertMatches(t, conn, "select @@innodb_lock_wait_timeout", `[[INT64(240)]]`)
488+
// ensuring it goes to mysql
489+
utils.AssertContains(t, conn, "select @@global.innodb_lock_wait_timeout, connection_id()", `UINT64(20)`)
490+
utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout, connection_id()", `INT64(240)`)
491+
// second run, to ensuring the setting is applied on the session and not just on next query after settings.
492+
utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout, connection_id()", `INT64(240)`)
493+
}

go/vt/sqlparser/ast_rewriting.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,12 @@ func (er *astRewriter) rewriteVariable(cursor *Cursor, node *Variable) {
301301
if v, isSet := cursor.Parent().(*SetExpr); isSet && v.Var == node {
302302
return
303303
}
304+
// no rewriting for global scope variable.
305+
// this should be returned from the underlying database.
304306
switch node.Scope {
305307
case VariableScope:
306308
er.udvRewrite(cursor, node)
307-
case GlobalScope, SessionScope, NextTxScope:
309+
case SessionScope, NextTxScope:
308310
er.sysVarRewrite(cursor, node)
309311
}
310312
}

go/vt/sysvars/sysvars.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ var (
191191
{Name: ForeignKeyChecks, IsBoolean: true, SupportSetVar: true},
192192
{Name: "group_concat_max_len", SupportSetVar: true},
193193
{Name: "information_schema_stats_expiry"},
194+
{Name: "innodb_lock_wait_timeout"},
194195
{Name: "max_heap_table_size", SupportSetVar: true},
195196
{Name: "max_seeks_for_key", SupportSetVar: true},
196197
{Name: "max_tmp_tables"},
@@ -246,7 +247,6 @@ var (
246247
{Name: "collation_server"},
247248
{Name: "completion_type"},
248249
{Name: "div_precision_increment", SupportSetVar: true},
249-
{Name: "innodb_lock_wait_timeout"},
250250
{Name: "interactive_timeout"},
251251
{Name: "lc_time_names"},
252252
{Name: "lock_wait_timeout", SupportSetVar: true},

go/vt/vtgate/executor_select_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4394,3 +4394,50 @@ func TestStreamJoinQuery(t *testing.T) {
43944394
utils.MustMatch(t, wantResult.Rows[idx], result.Rows[idx], "mismatched on: ", strconv.Itoa(idx))
43954395
}
43964396
}
4397+
4398+
// TestSysVarGlobalAndSession tests that global and session variables are set correctly.
4399+
// It also tests that setting a global variable does not affect the session variable and vice versa.
4400+
// Also, test what happens on running select @@global and select @@session for a system variable.
4401+
func TestSysVarGlobalAndSession(t *testing.T) {
4402+
executor, sbc1, _, _, _ := createExecutorEnv(t)
4403+
executor.normalize = true
4404+
session := NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, SystemVariables: map[string]string{}})
4405+
4406+
sbc1.SetResults([]*sqltypes.Result{
4407+
sqltypes.MakeTestResult(sqltypes.MakeTestFields("innodb_lock_wait_timeout", "uint64"), "20"),
4408+
sqltypes.MakeTestResult(sqltypes.MakeTestFields("innodb_lock_wait_timeout", "uint64"), "20"),
4409+
sqltypes.MakeTestResult(sqltypes.MakeTestFields("1", "int64")),
4410+
sqltypes.MakeTestResult(sqltypes.MakeTestFields("new", "uint64"), "40"),
4411+
sqltypes.MakeTestResult(sqltypes.MakeTestFields("reserve_execute", "uint64")),
4412+
sqltypes.MakeTestResult(sqltypes.MakeTestFields("@@global.innodb_lock_wait_timeout", "uint64"), "20"),
4413+
})
4414+
qr, err := executor.Execute(context.Background(), nil, "TestSetStmt", session,
4415+
"select @@innodb_lock_wait_timeout", nil)
4416+
require.NoError(t, err)
4417+
require.Equal(t, `[[UINT64(20)]]`, fmt.Sprintf("%v", qr.Rows))
4418+
4419+
qr, err = executor.Execute(context.Background(), nil, "TestSetStmt", session,
4420+
"select @@global.innodb_lock_wait_timeout", nil)
4421+
require.NoError(t, err)
4422+
require.Equal(t, `[[UINT64(20)]]`, fmt.Sprintf("%v", qr.Rows))
4423+
4424+
_, err = executor.Execute(context.Background(), nil, "TestSetStmt", session,
4425+
"set @@global.innodb_lock_wait_timeout = 120", nil)
4426+
require.NoError(t, err)
4427+
require.Empty(t, session.SystemVariables["innodb_lock_wait_timeout"])
4428+
4429+
_, err = executor.Execute(context.Background(), nil, "TestSetStmt", session,
4430+
"set @@innodb_lock_wait_timeout = 40", nil)
4431+
require.NoError(t, err)
4432+
require.EqualValues(t, "40", session.SystemVariables["innodb_lock_wait_timeout"])
4433+
4434+
qr, err = executor.Execute(context.Background(), nil, "TestSetStmt", session,
4435+
"select @@innodb_lock_wait_timeout", nil)
4436+
require.NoError(t, err)
4437+
require.Equal(t, `[[INT64(40)]]`, fmt.Sprintf("%v", qr.Rows))
4438+
4439+
qr, err = executor.Execute(context.Background(), nil, "TestSetStmt", session,
4440+
"select @@global.innodb_lock_wait_timeout", nil)
4441+
require.NoError(t, err)
4442+
require.Equal(t, `[[UINT64(20)]]`, fmt.Sprintf("%v", qr.Rows))
4443+
}

go/vt/vtgate/executor_set_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,13 @@ func TestExecutorSetOp(t *testing.T) {
364364
in: "set tx_isolation = 'read-committed'",
365365
sysVars: map[string]string{"tx_isolation": "'read-committed'"},
366366
result: returnResult("tx_isolation", "varchar", "read-committed"),
367+
}, {
368+
in: "set @@innodb_lock_wait_timeout=120",
369+
sysVars: map[string]string{"innodb_lock_wait_timeout": "120"},
370+
result: returnResult("innodb_lock_wait_timeout", "int64", "120"),
371+
}, {
372+
in: "set @@global.innodb_lock_wait_timeout=120",
373+
result: returnResult("innodb_lock_wait_timeout", "int64", "120"),
367374
}}
368375
for _, tcase := range testcases {
369376
t.Run(tcase.in, func(t *testing.T) {

0 commit comments

Comments
 (0)