@@ -14,6 +14,7 @@ import (
14
14
"github.com/stretchr/testify/require"
15
15
"github.com/stretchr/testify/suite"
16
16
17
+ "github.com/goccy/go-json"
17
18
"github.com/go-mysql-org/go-mysql/client"
18
19
"github.com/go-mysql-org/go-mysql/mysql"
19
20
"github.com/go-mysql-org/go-mysql/test_util"
@@ -464,3 +465,80 @@ func (t *testSyncerSuite) TestMysqlBinlogCodec() {
464
465
require .NoError (t .T (), err )
465
466
}
466
467
}
468
+
469
+ func (t * testSyncerSuite ) TestFloatWithTrailingZeros () {
470
+ t .setupTest (mysql .MySQLFlavor )
471
+
472
+ str := `DROP TABLE IF EXISTS test_float_zeros`
473
+ t .testExecute (str )
474
+
475
+ // Create table with JSON column containing float values
476
+ str = `CREATE TABLE test_float_zeros (
477
+ id INT PRIMARY KEY,
478
+ json_val JSON
479
+ )`
480
+ t .testExecute (str )
481
+
482
+ // Test with useFloatWithTrailingZero = true
483
+ t .b .cfg .UseFloatWithTrailingZero = true
484
+ t .testFloatWithTrailingZerosCase (true )
485
+
486
+ // Test with useFloatWithTrailingZero = false
487
+ t .b .cfg .UseFloatWithTrailingZero = false
488
+ t .testFloatWithTrailingZerosCase (false )
489
+ }
490
+
491
+ func (t * testSyncerSuite ) testFloatWithTrailingZerosCase (useTrailingZero bool ) {
492
+ // Insert values with trailing zeros in JSON
493
+ t .testExecute (`INSERT INTO test_float_zeros VALUES (1, '{"f": 5.1}')` )
494
+ t .testExecute (`INSERT INTO test_float_zeros VALUES (2, '{"f": 1.100}')` )
495
+
496
+ // Get current position
497
+ r , err := t .c .Execute ("SHOW MASTER STATUS" )
498
+ require .NoError (t .T (), err )
499
+ binFile , _ := r .GetString (0 , 0 )
500
+ binPos , _ := r .GetInt (0 , 1 )
501
+
502
+ // Start syncing from current position
503
+ s , err := t .b .StartSync (mysql.Position {Name : binFile , Pos : uint32 (binPos )})
504
+ require .NoError (t .T (), err )
505
+
506
+ // Insert another row to trigger binlog events
507
+ t .testExecute (`INSERT INTO test_float_zeros VALUES (3, '{"f": 3.0}')` )
508
+
509
+ ctx , cancel := context .WithTimeout (context .Background (), 2 * time .Second )
510
+ defer cancel ()
511
+
512
+ for {
513
+ evt , err := s .GetEvent (ctx )
514
+ require .NoError (t .T (), err )
515
+
516
+ // We're interested in RowsEvent
517
+ if evt .Header .EventType != WRITE_ROWS_EVENTv2 {
518
+ continue
519
+ }
520
+
521
+ // Type assert to RowsEvent
522
+ rowsEvent := evt .Event .(* RowsEvent )
523
+ for _ , row := range rowsEvent .Rows {
524
+ // The third row should contain our test values
525
+ if row [0 ].(int32 ) == 3 {
526
+ // Get the JSON value from binlog
527
+ jsonVal := row [1 ].([]byte )
528
+ var data struct {
529
+ F float64 `json:"f"`
530
+ }
531
+ err := json .Unmarshal (jsonVal , & data )
532
+ require .NoError (t .T (), err )
533
+
534
+ // Check if trailing zero is preserved based on useFloatWithTrailingZero
535
+ if useTrailingZero {
536
+ require .Equal (t .T (), "3.0" , fmt .Sprintf ("%.1f" , data .F ))
537
+ } else {
538
+ require .Equal (t .T (), "3" , fmt .Sprintf ("%.1f" , data .F ))
539
+ }
540
+ return
541
+ }
542
+ }
543
+ }
544
+ }
0 commit comments