-
-
Notifications
You must be signed in to change notification settings - Fork 347
Closed
Description
Describe the feature
UpdateSimple, UpdateColumnSimple的columns参数传入nil时会panic
do.go:
// UpdateSimple ...
func (d *DO) UpdateSimple(columns ...field.AssignExpr) (info ResultInfo, err error) {
if len(columns) == 0 {
return
}
tx := d.db
if d.backfillData != nil {
tx = tx.Model(d.backfillData)
}
result := tx.Clauses(d.assignSet(columns)).Omit("*").Updates(map[string]interface{}{})
return ResultInfo{RowsAffected: result.RowsAffected, Error: result.Error}, result.Error
}
...
// assignSet fetch all set
func (d *DO) assignSet(exprs []field.AssignExpr) (set clause.Set) {
for _, expr := range exprs {
// will panic if expr is nil
column := clause.Column{Table: d.alias, Name: string(expr.ColumnName())}
switch e := expr.AssignExpr().(type) {
case clause.Expr:
set = append(set, clause.Assignment{Column: column, Value: e})
case clause.Eq:
set = append(set, clause.Assignment{Column: column, Value: e.Value})
case clause.Set:
set = append(set, e...)
}
}
stmt := d.db.Session(&gorm.Session{}).Statement
stmt.Dest = map[string]interface{}{}
return append(set, callbacks.ConvertToAssignments(stmt)...)
}
Where方法中condToExpression过滤了nil的condition,希望UpdateSimple和Where方法保持一致,生成clause时过滤掉nil
func condToExpression(conds []Condition) ([]clause.Expression, error) {
if len(conds) == 0 {
return nil, nil
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
if cond == nil {
continue
}
if err := cond.CondError(); err != nil {
return nil, err
}
switch cond.(type) {
case *condContainer, field.Expr, SubQuery:
default:
return nil, fmt.Errorf("unsupported condition: %+v", cond)
}
switch e := cond.BeCond().(type) {
case []clause.Expression:
exprs = append(exprs, e...)
case clause.Expression:
exprs = append(exprs, e)
}
}
return exprs, nil
}
Metadata
Metadata
Assignees
Labels
No labels