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