Skip to content

Commit 5e6cb16

Browse files
authored
session: load variables before parsing SQL (#51466)
close #51387
1 parent 61b66aa commit 5e6cb16

File tree

4 files changed

+45
-1
lines changed

4 files changed

+45
-1
lines changed

pkg/server/internal/testserverclient/server_client.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package testserverclient
1616

1717
import (
1818
"bytes"
19+
"context"
1920
"database/sql"
2021
"encoding/json"
2122
"fmt"
@@ -2629,4 +2630,35 @@ func (cli *TestServerClient) RunTestInfoschemaClientErrors(t *testing.T) {
26292630
})
26302631
}
26312632

2633+
func (cli *TestServerClient) RunTestSQLModeIsLoadedBeforeQuery(t *testing.T) {
2634+
cli.RunTests(t, nil, func(dbt *testkit.DBTestKit) {
2635+
ctx := context.Background()
2636+
2637+
conn, err := dbt.GetDB().Conn(ctx)
2638+
require.NoError(t, err)
2639+
_, err = conn.ExecContext(ctx, "set global sql_mode='NO_BACKSLASH_ESCAPES';")
2640+
require.NoError(t, err)
2641+
_, err = conn.ExecContext(ctx, `
2642+
CREATE TABLE t1 (
2643+
id bigint(20) NOT NULL,
2644+
t text DEFAULT NULL,
2645+
PRIMARY KEY (id)
2646+
);`)
2647+
require.NoError(t, err)
2648+
2649+
// use another new connection
2650+
conn1, err := dbt.GetDB().Conn(ctx)
2651+
require.NoError(t, err)
2652+
_, err = conn1.ExecContext(ctx, "insert into t1 values (1, 'ab\\\\c');")
2653+
require.NoError(t, err)
2654+
result, err := conn1.QueryContext(ctx, "select t from t1 where id = 1;")
2655+
require.NoError(t, err)
2656+
require.True(t, result.Next())
2657+
var tStr string
2658+
require.NoError(t, result.Scan(&tStr))
2659+
2660+
require.Equal(t, "ab\\\\c", tStr)
2661+
})
2662+
}
2663+
26322664
//revive:enable:exported

pkg/server/tests/commontest/BUILD.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ go_test(
88
"tidb_test.go",
99
],
1010
flaky = True,
11-
shard_count = 47,
11+
shard_count = 48,
1212
deps = [
1313
"//pkg/config",
1414
"//pkg/ddl/util",

pkg/server/tests/commontest/tidb_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3067,3 +3067,8 @@ func TestPrepareCount(t *testing.T) {
30673067
require.Equal(t, prepareCnt, atomic.LoadInt64(&variable.PreparedStmtCount))
30683068
require.NoError(t, qctx.Close())
30693069
}
3070+
3071+
func TestSQLModeIsLoadedBeforeQuery(t *testing.T) {
3072+
ts := servertestkit.CreateTidbTestSuite(t)
3073+
ts.RunTestSQLModeIsLoadedBeforeQuery(t)
3074+
}

pkg/session/session.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,6 +1652,13 @@ func (s *session) Execute(ctx context.Context, sql string) (recordSets []sqlexec
16521652
func (s *session) Parse(ctx context.Context, sql string) ([]ast.StmtNode, error) {
16531653
logutil.Logger(ctx).Debug("parse", zap.String("sql", sql))
16541654
parseStartTime := time.Now()
1655+
1656+
// Load the session variables to the context.
1657+
// This is necessary for the parser to get the current sql_mode.
1658+
if err := s.loadCommonGlobalVariablesIfNeeded(); err != nil {
1659+
return nil, err
1660+
}
1661+
16551662
stmts, warns, err := s.ParseSQL(ctx, sql, s.sessionVars.GetParseParams()...)
16561663
if err != nil {
16571664
s.rollbackOnError(ctx)

0 commit comments

Comments
 (0)