Skip to content

Commit ad7aeb2

Browse files
committed
set sql_mode before ALTERing ghost table
Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>
1 parent 8c4f832 commit ad7aeb2

File tree

1 file changed

+47
-26
lines changed

1 file changed

+47
-26
lines changed

go/logic/applier.go

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
121139
func (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

Comments
 (0)