Fix #1663 #1952

Merged
lunny merged 3 commits from lunny/fix_1663 into master 2021-06-14 03:23:06 +00:00

View File

@ -208,20 +208,18 @@ func (statement *Statement) quote(s string) string {
// And add Where & and statement // And add Where & and statement
func (statement *Statement) And(query interface{}, args ...interface{}) *Statement { func (statement *Statement) And(query interface{}, args ...interface{}) *Statement {
switch query.(type) { switch qr := query.(type) {
case string: case string:
cond := builder.Expr(query.(string), args...) cond := builder.Expr(qr, args...)
statement.cond = statement.cond.And(cond) statement.cond = statement.cond.And(cond)
case map[string]interface{}: case map[string]interface{}:
queryMap := query.(map[string]interface{}) cond := make(builder.Eq)
newMap := make(map[string]interface{}) for k, v := range qr {
for k, v := range queryMap { cond[statement.quote(k)] = v
newMap[statement.quote(k)] = v
} }
statement.cond = statement.cond.And(builder.Eq(newMap))
case builder.Cond:
cond := query.(builder.Cond)
statement.cond = statement.cond.And(cond) statement.cond = statement.cond.And(cond)
case builder.Cond:
statement.cond = statement.cond.And(qr)
for _, v := range args { for _, v := range args {
if vv, ok := v.(builder.Cond); ok { if vv, ok := v.(builder.Cond); ok {
statement.cond = statement.cond.And(vv) statement.cond = statement.cond.And(vv)
@ -236,23 +234,25 @@ func (statement *Statement) And(query interface{}, args ...interface{}) *Stateme
// Or add Where & Or statement // Or add Where & Or statement
func (statement *Statement) Or(query interface{}, args ...interface{}) *Statement { func (statement *Statement) Or(query interface{}, args ...interface{}) *Statement {
switch query.(type) { switch qr := query.(type) {
case string: case string:
cond := builder.Expr(query.(string), args...) cond := builder.Expr(qr, args...)
statement.cond = statement.cond.Or(cond) statement.cond = statement.cond.Or(cond)
case map[string]interface{}: case map[string]interface{}:
cond := builder.Eq(query.(map[string]interface{})) cond := make(builder.Eq)
for k, v := range qr {
cond[statement.quote(k)] = v
}
statement.cond = statement.cond.Or(cond) statement.cond = statement.cond.Or(cond)
case builder.Cond: case builder.Cond:
cond := query.(builder.Cond) statement.cond = statement.cond.Or(qr)
statement.cond = statement.cond.Or(cond)
for _, v := range args { for _, v := range args {
if vv, ok := v.(builder.Cond); ok { if vv, ok := v.(builder.Cond); ok {
statement.cond = statement.cond.Or(vv) statement.cond = statement.cond.Or(vv)
} }
} }
default: default:
// TODO: not support condition type statement.LastError = ErrConditionType
} }
return statement return statement
} }