@@ -117,6 +117,24 @@ func (this *Applier) validateAndReadTimeZone() error {
117117 return nil
118118}
119119
120+ // generateSqlModeQuery return a `sql_mode = ...` query, to be wrapped with a `set session` or `set global`,
121+ // based on gh-ost configuration:
122+ // - User may skip strict mode
123+ // - User may allow zero dats or zero in dates
124+ func (this * Applier ) generateSqlModeQuery () string {
125+ sqlModeAddendum := `,NO_AUTO_VALUE_ON_ZERO`
126+ if ! this .migrationContext .SkipStrictMode {
127+ sqlModeAddendum = fmt .Sprintf ("%s,STRICT_ALL_TABLES" , sqlModeAddendum )
128+ }
129+ sqlModeQuery := fmt .Sprintf ("CONCAT(@@session.sql_mode, ',%s')" , sqlModeAddendum )
130+ if this .migrationContext .AllowZeroInDate {
131+ sqlModeQuery = fmt .Sprintf ("REPLACE(REPLACE(%s, 'NO_ZERO_IN_DATE', ''), 'NO_ZERO_DATE', '')" , sqlModeQuery )
132+ }
133+ sqlModeQuery = fmt .Sprintf ("sql_mode = %s" , sqlModeQuery )
134+
135+ return sqlModeQuery
136+ }
137+
120138// readTableColumns reads table columns on applier
121139func (this * Applier ) readTableColumns () (err error ) {
122140 this .migrationContext .Log .Infof ("Examining table structure on applier" )
@@ -201,11 +219,33 @@ func (this *Applier) AlterGhost() error {
201219 sql .EscapeName (this .migrationContext .GetGhostTableName ()),
202220 )
203221 this .migrationContext .Log .Debugf ("ALTER statement: %s" , query )
204- if _ , err := sqlutils .ExecNoPrepare (this .db , query ); err != nil {
205- return err
206- }
207- this .migrationContext .Log .Infof ("Ghost table altered" )
208- return nil
222+
223+ err := func () error {
224+ tx , err := this .db .Begin ()
225+ if err != nil {
226+ return err
227+ }
228+ defer tx .Rollback ()
229+
230+ sessionQuery := fmt .Sprintf (`SET SESSION time_zone = '%s'` , this .migrationContext .ApplierTimeZone )
231+ sessionQuery = fmt .Sprintf ("%s, %s" , sessionQuery , this .generateSqlModeQuery ())
232+
233+ if _ , err := tx .Exec (sessionQuery ); err != nil {
234+ return err
235+ }
236+ if _ , err := tx .Exec (query ); err != nil {
237+ return err
238+ }
239+ this .migrationContext .Log .Infof ("Ghost table altered" )
240+ if err := tx .Commit (); err != nil {
241+ // Neither SET SESSION nor ALTER are really transactional, so strictly speaking
242+ // there's no need to commit; but let's do this the legit way anyway.
243+ return err
244+ }
245+ return nil
246+ }()
247+
248+ return err
209249}
210250
211251// AlterGhost applies `alter` statement on ghost table
@@ -513,16 +553,7 @@ func (this *Applier) ApplyIterationInsertQuery() (chunkSize int64, rowsAffected
513553 defer tx .Rollback ()
514554
515555 sessionQuery := fmt .Sprintf (`SET SESSION time_zone = '%s'` , this .migrationContext .ApplierTimeZone )
516- sqlModeAddendum := `,NO_AUTO_VALUE_ON_ZERO`
517- if ! this .migrationContext .SkipStrictMode {
518- sqlModeAddendum = fmt .Sprintf ("%s,STRICT_ALL_TABLES" , sqlModeAddendum )
519- }
520- sqlModeQuery := fmt .Sprintf ("CONCAT(@@session.sql_mode, ',%s')" , sqlModeAddendum )
521- if this .migrationContext .AllowZeroInDate {
522- sqlModeQuery = fmt .Sprintf ("REPLACE(REPLACE(%s, 'NO_ZERO_IN_DATE', ''), 'NO_ZERO_DATE', '')" , sqlModeQuery )
523- }
524- sqlModeQuery = fmt .Sprintf ("sql_mode = %s" , sqlModeQuery )
525- sessionQuery = fmt .Sprintf ("%s, %s" , sessionQuery , sqlModeQuery )
556+ sessionQuery = fmt .Sprintf ("%s, %s" , sessionQuery , this .generateSqlModeQuery ())
526557
527558 if _ , err := tx .Exec (sessionQuery ); err != nil {
528559 return nil , err
@@ -1035,17 +1066,7 @@ func (this *Applier) ApplyDMLEventQueries(dmlEvents [](*binlog.BinlogDMLEvent))
10351066 }
10361067
10371068 sessionQuery := "SET SESSION time_zone = '+00:00'"
1038-
1039- sqlModeAddendum := `,NO_AUTO_VALUE_ON_ZERO`
1040- if ! this .migrationContext .SkipStrictMode {
1041- sqlModeAddendum = fmt .Sprintf ("%s,STRICT_ALL_TABLES" , sqlModeAddendum )
1042- }
1043- sqlModeQuery := fmt .Sprintf ("CONCAT(@@session.sql_mode, ',%s')" , sqlModeAddendum )
1044- if this .migrationContext .AllowZeroInDate {
1045- sqlModeQuery = fmt .Sprintf ("REPLACE(REPLACE(%s, 'NO_ZERO_IN_DATE', ''), 'NO_ZERO_DATE', '')" , sqlModeQuery )
1046- }
1047- sqlModeQuery = fmt .Sprintf ("sql_mode = %s" , sqlModeQuery )
1048- sessionQuery = fmt .Sprintf ("%s, %s" , sessionQuery , sqlModeQuery )
1069+ sessionQuery = fmt .Sprintf ("%s, %s" , sessionQuery , this .generateSqlModeQuery ())
10491070
10501071 if _ , err := tx .Exec (sessionQuery ); err != nil {
10511072 return rollback (err )
0 commit comments