Skip to content

Commit 3893590

Browse files
authored
planner: Fix load stats failure when stats file contains with null (#57818) (#59173)
close #53966
1 parent e4df874 commit 3893590

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

executor/load_stats.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ func (e *LoadStatsInfo) Update(data []byte) error {
8282
if err := json.Unmarshal(data, jsonTbl); err != nil {
8383
return errors.Trace(err)
8484
}
85+
// Check the `jsonTbl` in cases where the stats file with `null`.
86+
if jsonTbl.TableName == "" && jsonTbl.Columns == nil {
87+
return nil
88+
}
8589
do := domain.GetDomain(e.Ctx)
8690
h := do.StatsHandle()
8791
if h == nil {

server/statistics_handler_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,3 +275,57 @@ func checkData(t *testing.T, path string, client *testServerClient) {
275275
require.Equal(t, int64(4), count)
276276
require.NoError(t, rows.Close())
277277
}
278+
279+
// fix issue 53966
280+
func TestLoadNullStatsFile(t *testing.T) {
281+
// Setting up the mock store
282+
store := testkit.CreateMockStore(t)
283+
284+
// Creating a new TiDB driver and client
285+
driver := NewTiDBDriver(store)
286+
client := newTestServerClient()
287+
cfg := newTestConfig()
288+
cfg.Port = client.port
289+
cfg.Status.StatusPort = client.statusPort
290+
cfg.Status.ReportStatus = true
291+
cfg.Socket = fmt.Sprintf("/tmp/tidb-mock-%d.sock", time.Now().UnixNano())
292+
RunInGoTestChan = make(chan struct{})
293+
server, err := NewServer(cfg, driver)
294+
require.NoError(t, err)
295+
defer server.Close()
296+
go func() {
297+
err := server.Run(nil)
298+
require.NoError(t, err)
299+
}()
300+
<-RunInGoTestChan
301+
client.port = getPortFromTCPAddr(server.listener.Addr())
302+
client.statusPort = getPortFromTCPAddr(server.statusListener.Addr())
303+
client.waitUntilServerOnline()
304+
305+
// Creating the stats file
306+
path := "/tmp/stats.json"
307+
fp, err := os.Create(path)
308+
require.NoError(t, err)
309+
require.NotNil(t, fp)
310+
defer func() {
311+
require.NoError(t, fp.Close())
312+
require.NoError(t, os.Remove(path))
313+
}()
314+
fp.Write([]byte("null"))
315+
require.NoError(t, err)
316+
317+
// Connecting to the database and executing SQL commands
318+
db, err := sql.Open("mysql", client.getDSN(func(config *mysql.Config) {
319+
config.AllowAllFiles = true
320+
config.Params["sql_mode"] = "''"
321+
}))
322+
323+
require.NoError(t, err, "Error connecting")
324+
tk := testkit.NewDBTestKit(t, db)
325+
defer func() {
326+
err := db.Close()
327+
require.NoError(t, err)
328+
}()
329+
tk.MustExec("use test")
330+
tk.MustExec(fmt.Sprintf("load stats '%s'", path))
331+
}

0 commit comments

Comments
 (0)