@@ -152,31 +152,14 @@ func (stmt *UpdateStmt) ToSQL(rebind bool) (asSQL string, bindings []interface{}
152152 if stmt .SelectStmt != nil && stmt .SelectStmtAlias != "" {
153153 selectSQL , selectBindings := stmt .SelectStmt .ToSQL (false )
154154 selectSQL = "(" + selectSQL + ") AS " + stmt .SelectStmtAlias + " "
155+
155156 clauses = append (clauses , "FROM " )
156157 clauses = append (clauses , selectSQL )
157158 bindings = append (bindings , selectBindings ... )
158159 } else if len (stmt .MultipleValues .Values ) > 0 {
159- // add the FROM
160- clauses = append (clauses , "FROM" )
161- var multipleValues []string
162- for _ , multipleVals := range stmt .MultipleValues .Values {
163- placeholders , bindingsToAdd := parseInsertValues (multipleVals )
164- bindings = append (bindings , bindingsToAdd ... )
165- multipleValues = append (multipleValues , "(" + strings .Join (placeholders , ", " )+ ")" )
166- }
167-
168- clauses = append (clauses , fmt .Sprintf ("(VALUES %s) AS %s(%s)" ,
169- strings .Join (multipleValues , ", " ),
170- stmt .MultipleValues .As ,
171- strings .Join (stmt .MultipleValues .Columns , ", " ),
172- ))
173-
174- if len (stmt .MultipleValues .Where ) > 0 {
175- whereClause , whereBindings := parseConditions (stmt .MultipleValues .Where )
176- bindings = append (bindings , whereBindings ... )
177- clauses = append (clauses , fmt .Sprintf ("WHERE %s" , whereClause ))
178- }
179-
160+ addClauses , addBindings := stmt .addUpdateFrom ()
161+ clauses = append (clauses , addClauses ... )
162+ bindings = append (bindings , addBindings ... )
180163 }
181164
182165 if len (stmt .Conditions ) > 0 {
@@ -202,6 +185,35 @@ func (stmt *UpdateStmt) ToSQL(rebind bool) (asSQL string, bindings []interface{}
202185 return asSQL , bindings
203186}
204187
188+ func (stmt * UpdateStmt ) addUpdateFrom () (
189+ clauses []string ,
190+ bindings []interface {},
191+ ) {
192+ clauses = append (clauses , "FROM" )
193+
194+ multipleValues := make ([]string , len (stmt .MultipleValues .Values ))
195+
196+ for i , multipleVals := range stmt .MultipleValues .Values {
197+ placeholders , bindingsToAdd := parseInsertValues (multipleVals )
198+ bindings = append (bindings , bindingsToAdd ... )
199+ multipleValues [i ] = "(" + strings .Join (placeholders , ", " ) + ")"
200+ }
201+
202+ clauses = append (clauses , fmt .Sprintf ("(VALUES %s) AS %s(%s)" ,
203+ strings .Join (multipleValues , ", " ),
204+ stmt .MultipleValues .As ,
205+ strings .Join (stmt .MultipleValues .Columns , ", " ),
206+ ))
207+
208+ if len (stmt .MultipleValues .Where ) > 0 {
209+ whereClause , whereBindings := parseConditions (stmt .MultipleValues .Where )
210+ bindings = append (bindings , whereBindings ... )
211+ clauses = append (clauses , fmt .Sprintf ("WHERE %s" , whereClause ))
212+ }
213+
214+ return clauses , bindings
215+ }
216+
205217// Exec executes the UPDATE statement, returning the standard
206218// sql.Result struct and an error if the query failed.
207219func (stmt * UpdateStmt ) Exec () (res sql.Result , err error ) {
0 commit comments