Don't build IN condition if value implemented Valuer interface, #3517
This commit is contained in:
		
							parent
							
								
									1a526e6802
								
							
						
					
					
						commit
						5228735915
					
				
							
								
								
									
										16
									
								
								statement.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								statement.go
									
									
									
									
									
								
							| @ -299,12 +299,18 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) (c | ||||
| 				reflectValue := reflect.Indirect(reflect.ValueOf(v[key])) | ||||
| 				switch reflectValue.Kind() { | ||||
| 				case reflect.Slice, reflect.Array: | ||||
| 					values := make([]interface{}, reflectValue.Len()) | ||||
| 					for i := 0; i < reflectValue.Len(); i++ { | ||||
| 						values[i] = reflectValue.Index(i).Interface() | ||||
| 					} | ||||
| 					if _, ok := v[key].(driver.Valuer); ok { | ||||
| 						conds = append(conds, clause.Eq{Column: key, Value: v[key]}) | ||||
| 					} else if _, ok := v[key].(Valuer); ok { | ||||
| 						conds = append(conds, clause.Eq{Column: key, Value: v[key]}) | ||||
| 					} else { | ||||
| 						values := make([]interface{}, reflectValue.Len()) | ||||
| 						for i := 0; i < reflectValue.Len(); i++ { | ||||
| 							values[i] = reflectValue.Index(i).Interface() | ||||
| 						} | ||||
| 
 | ||||
| 					conds = append(conds, clause.IN{Column: key, Values: values}) | ||||
| 						conds = append(conds, clause.IN{Column: key, Values: values}) | ||||
| 					} | ||||
| 				default: | ||||
| 					conds = append(conds, clause.Eq{Column: key, Value: v[key]}) | ||||
| 				} | ||||
|  | ||||
| @ -345,6 +345,11 @@ func TestNot(t *testing.T) { | ||||
| 		t.Fatalf("Build NOT condition, but got %v", result.Statement.SQL.String()) | ||||
| 	} | ||||
| 
 | ||||
| 	result = dryDB.Where(map[string]interface{}{"name": []string{"jinzhu", "jinzhu 2"}}).Find(&User{}) | ||||
| 	if !regexp.MustCompile("SELECT \\* FROM .*users.* WHERE .*name.* IN \\(.+,.+\\)").MatchString(result.Statement.SQL.String()) { | ||||
| 		t.Fatalf("Build NOT condition, but got %v", result.Statement.SQL.String()) | ||||
| 	} | ||||
| 
 | ||||
| 	result = dryDB.Not("name = ?", "jinzhu").Find(&User{}) | ||||
| 	if !regexp.MustCompile("SELECT \\* FROM .*users.* WHERE NOT.*name.* = .+").MatchString(result.Statement.SQL.String()) { | ||||
| 		t.Fatalf("Build NOT condition, but got %v", result.Statement.SQL.String()) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu