@@ -485,9 +485,12 @@ func (this *Applier) ApplyIterationInsertQuery() (chunkSize int64, rowsAffected
485485 }
486486 defer tx .Rollback ()
487487 sessionQuery := fmt .Sprintf (`SET SESSION time_zone = '%s'` , this .migrationContext .ApplierTimeZone )
488+ sqlModeAddendum := `,NO_AUTO_VALUE_ON_ZERO`
488489 if ! this .migrationContext .SkipStrictMode {
489- sessionQuery += ", sql_mode = CONCAT(@@session.sql_mode, ',STRICT_ALL_TABLES')"
490+ sqlModeAddendum = fmt . Sprintf ( "%s,STRICT_ALL_TABLES" , sqlModeAddendum )
490491 }
492+ sessionQuery = fmt .Sprintf ("%s, sql_mode = CONCAT(@@session.sql_mode, ',%s')" , sessionQuery , sqlModeAddendum )
493+
491494 if _ , err := tx .Exec (sessionQuery ); err != nil {
492495 return nil , err
493496 }
@@ -1270,63 +1273,6 @@ func (this *Applier) buildDMLEventQuery(dmlEvent *binlog.BinlogDMLEvent) (result
12701273 return append (results , newDmlBuildResultError (fmt .Errorf ("Unknown dml event type: %+v" , dmlEvent .DML )))
12711274}
12721275
1273- // ApplyDMLEventQuery writes an entry to the ghost table, in response to an intercepted
1274- // original-table binlog event
1275- func (this * Applier ) ApplyDMLEventQuery (dmlEvent * binlog.BinlogDMLEvent ) error {
1276- for _ , buildResult := range this .buildDMLEventQuery (dmlEvent ) {
1277- if buildResult .err != nil {
1278- return buildResult .err
1279- }
1280- // TODO The below is in preparation for transactional writes on the ghost tables.
1281- // Such writes would be, for example:
1282- // - prepended with sql_mode setup
1283- // - prepended with time zone setup
1284- // - prepended with SET SQL_LOG_BIN=0
1285- // - prepended with SET FK_CHECKS=0
1286- // etc.
1287- //
1288- // a known problem: https://github.com/golang/go/issues/9373 -- bitint unsigned values, not supported in database/sql
1289- // is solved by silently converting unsigned bigints to string values.
1290- //
1291-
1292- err := func () error {
1293- tx , err := this .db .Begin ()
1294- if err != nil {
1295- return err
1296- }
1297- rollback := func (err error ) error {
1298- tx .Rollback ()
1299- return err
1300- }
1301- sessionQuery := fmt .Sprintf ("SET SESSION time_zone = '+00:00'" )
1302- if ! this .migrationContext .SkipStrictMode {
1303- sessionQuery += ", sql_mode = CONCAT(@@session.sql_mode, ',STRICT_ALL_TABLES')"
1304- }
1305- if _ , err := tx .Exec (sessionQuery ); err != nil {
1306- return rollback (err )
1307- }
1308- if _ , err := tx .Exec (buildResult .query , buildResult .args ... ); err != nil {
1309- return rollback (err )
1310- }
1311- if err := tx .Commit (); err != nil {
1312- return err
1313- }
1314- return nil
1315- }()
1316-
1317- if err != nil {
1318- err = fmt .Errorf ("%s; query=%s; args=%+v" , err .Error (), buildResult .query , buildResult .args )
1319- return log .Errore (err )
1320- }
1321- // no error
1322- atomic .AddInt64 (& this .migrationContext .TotalDMLEventsApplied , 1 )
1323- if this .migrationContext .CountTableRows {
1324- atomic .AddInt64 (& this .migrationContext .RowsDeltaEstimate , buildResult .rowsDelta )
1325- }
1326- }
1327- return nil
1328- }
1329-
13301276// ApplyDMLEventQueries applies multiple DML queries onto the _ghost_ table
13311277func (this * Applier ) ApplyDMLEventQueries (dmlEvents [](* binlog.BinlogDMLEvent )) error {
13321278
@@ -1344,9 +1290,13 @@ func (this *Applier) ApplyDMLEventQueries(dmlEvents [](*binlog.BinlogDMLEvent))
13441290 }
13451291
13461292 sessionQuery := "SET SESSION time_zone = '+00:00'"
1293+
1294+ sqlModeAddendum := `,NO_AUTO_VALUE_ON_ZERO`
13471295 if ! this .migrationContext .SkipStrictMode {
1348- sessionQuery += ", sql_mode = CONCAT(@@session.sql_mode, ',STRICT_ALL_TABLES')"
1296+ sqlModeAddendum = fmt . Sprintf ( "%s,STRICT_ALL_TABLES" , sqlModeAddendum )
13491297 }
1298+ sessionQuery = fmt .Sprintf ("%s, sql_mode = CONCAT(@@session.sql_mode, ',%s')" , sessionQuery , sqlModeAddendum )
1299+
13501300 if _ , err := tx .Exec (sessionQuery ); err != nil {
13511301 return rollback (err )
13521302 }
0 commit comments