@@ -248,6 +248,55 @@ func prepareData4PlanReplayer(t *testing.T, client *testserverclient.TestServerC
248
248
return filename , filename3
249
249
}
250
250
251
+ func TestIssue56458 (t * testing.T ) {
252
+ store := testkit .CreateMockStore (t )
253
+ dom , err := session .GetDomain (store )
254
+ require .NoError (t , err )
255
+ // 1. setup and prepare plan replayer files by manual command and capture
256
+ server , client := prepareServerAndClientForTest (t , store , dom )
257
+ defer server .Close ()
258
+
259
+ filename := prepareData4Issue56458 (t , client , dom )
260
+ defer os .RemoveAll (replayer .GetPlanReplayerDirName ())
261
+
262
+ // 2. check the contents of the plan replayer zip files.
263
+ var filesInReplayer []string
264
+ collectFileNameAndAssertFileSize := func (f * zip.File ) {
265
+ // collect file name
266
+ filesInReplayer = append (filesInReplayer , f .Name )
267
+ }
268
+
269
+ // 2-1. check the plan replayer file from manual command
270
+ resp0 , err := client .FetchStatus (filepath .Join ("/plan_replayer/dump/" , filename ))
271
+ require .NoError (t , err )
272
+ defer func () {
273
+ require .NoError (t , resp0 .Body .Close ())
274
+ }()
275
+ body , err := io .ReadAll (resp0 .Body )
276
+ require .NoError (t , err )
277
+ forEachFileInZipBytes (t , body , collectFileNameAndAssertFileSize )
278
+ slices .Sort (filesInReplayer )
279
+ require .Equal (t , []string {
280
+ "config.toml" ,
281
+ "debug_trace/debug_trace0.json" ,
282
+ "explain.txt" ,
283
+ "global_bindings.sql" ,
284
+ "meta.txt" ,
285
+ "schema/planreplayer.t.schema.txt" ,
286
+ "schema/planreplayer.v.schema.txt" ,
287
+ "schema/schema_meta.txt" ,
288
+ "session_bindings.sql" ,
289
+ "sql/sql0.sql" ,
290
+ "sql_meta.toml" ,
291
+ "stats/planreplayer.t.json" ,
292
+ "stats/planreplayer.v.json" ,
293
+ "statsMem/planreplayer.t.txt" ,
294
+ "statsMem/planreplayer.v.txt" ,
295
+ "table_tiflash_replica.txt" ,
296
+ "variables.toml" ,
297
+ }, filesInReplayer )
298
+ }
299
+
251
300
func TestIssue43192 (t * testing.T ) {
252
301
store := testkit .CreateMockStore (t )
253
302
dom , err := session .GetDomain (store )
@@ -343,6 +392,33 @@ func prepareData4Issue43192(t *testing.T, client *testserverclient.TestServerCli
343
392
return filename
344
393
}
345
394
395
+ func prepareData4Issue56458 (t * testing.T , client * testserverclient.TestServerClient , dom * domain.Domain ) string {
396
+ h := dom .StatsHandle ()
397
+ db , err := sql .Open ("mysql" , client .GetDSN ())
398
+ require .NoError (t , err , "Error connecting" )
399
+ defer func () {
400
+ err := db .Close ()
401
+ require .NoError (t , err )
402
+ }()
403
+ tk := testkit .NewDBTestKit (t , db )
404
+
405
+ tk .MustExec ("create database planReplayer" )
406
+ tk .MustExec ("use planReplayer" )
407
+ tk .MustExec ("CREATE TABLE v(id INT PRIMARY KEY AUTO_INCREMENT);" )
408
+ tk .MustExec ("create table t(a int, b int, INDEX ia (a), INDEX ib (b), author_id int, FOREIGN KEY (author_id) REFERENCES v(id) ON DELETE CASCADE);" )
409
+ err = h .HandleDDLEvent (<- h .DDLEventCh ())
410
+ require .NoError (t , err )
411
+ tk .MustExec ("create global binding for select a, b from t where a in (1, 2, 3) using select a, b from t use index (ib) where a in (1, 2, 3)" )
412
+ rows := tk .MustQuery ("plan replayer dump explain select a, b from t where a in (1, 2, 3)" )
413
+ require .True (t , rows .Next (), "unexpected data" )
414
+ var filename string
415
+ require .NoError (t , rows .Scan (& filename ))
416
+ require .NoError (t , rows .Close ())
417
+ rows = tk .MustQuery ("select @@tidb_last_plan_replayer_token" )
418
+ require .True (t , rows .Next (), "unexpected data" )
419
+ return filename
420
+ }
421
+
346
422
func forEachFileInZipBytes (t * testing.T , b []byte , fn func (file * zip.File )) {
347
423
br := bytes .NewReader (b )
348
424
z , err := zip .NewReader (br , int64 (len (b )))
0 commit comments