Fix Select with specific symbol, close #3157
This commit is contained in:
		
							parent
							
								
									58e3241544
								
							
						
					
					
						commit
						362779575c
					
				| @ -60,11 +60,11 @@ func (db *DB) Table(name string) (tx *DB) { | ||||
| 
 | ||||
| // Distinct specify distinct fields that you want querying
 | ||||
| func (db *DB) Distinct(args ...interface{}) (tx *DB) { | ||||
| 	tx = db | ||||
| 	tx = db.getInstance() | ||||
| 	tx.Statement.Distinct = true | ||||
| 	if len(args) > 0 { | ||||
| 		tx = tx.Select(args[0], args[1:]...) | ||||
| 	} | ||||
| 	tx.Statement.Distinct = true | ||||
| 	return tx | ||||
| } | ||||
| 
 | ||||
| @ -102,6 +102,7 @@ func (db *DB) Select(query interface{}, args ...interface{}) (tx *DB) { | ||||
| 					tx.Statement.Selects = append(tx.Statement.Selects, arg...) | ||||
| 				default: | ||||
| 					tx.Statement.AddClause(clause.Select{ | ||||
| 						Distinct:   db.Statement.Distinct, | ||||
| 						Expression: clause.Expr{SQL: v, Vars: args}, | ||||
| 					}) | ||||
| 					return | ||||
| @ -109,6 +110,7 @@ func (db *DB) Select(query interface{}, args ...interface{}) (tx *DB) { | ||||
| 			} | ||||
| 		} else { | ||||
| 			tx.Statement.AddClause(clause.Select{ | ||||
| 				Distinct:   db.Statement.Distinct, | ||||
| 				Expression: clause.Expr{SQL: v, Vars: args}, | ||||
| 			}) | ||||
| 		} | ||||
|  | ||||
| @ -30,6 +30,14 @@ func (s Select) Build(builder Builder) { | ||||
| 
 | ||||
| func (s Select) MergeClause(clause *Clause) { | ||||
| 	if s.Expression != nil { | ||||
| 		if s.Distinct { | ||||
| 			if expr, ok := s.Expression.(Expr); ok { | ||||
| 				expr.SQL = "DISTINCT " + expr.SQL | ||||
| 				clause.Expression = expr | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		clause.Expression = s.Expression | ||||
| 	} else { | ||||
| 		clause.Expression = s | ||||
|  | ||||
| @ -1,8 +1,10 @@ | ||||
| package tests_test | ||||
| 
 | ||||
| import ( | ||||
| 	"regexp" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"gorm.io/gorm" | ||||
| 	. "gorm.io/gorm/utils/tests" | ||||
| ) | ||||
| 
 | ||||
| @ -57,4 +59,10 @@ func TestDistinct(t *testing.T) { | ||||
| 	if err := DB.Model(&User{}).Distinct("name").Where("name like ?", "distinct%").Count(&count).Error; err != nil || count != 3 { | ||||
| 		t.Errorf("failed to query users count, got error: %v, count %v", err, count) | ||||
| 	} | ||||
| 
 | ||||
| 	dryDB := DB.Session(&gorm.Session{DryRun: true}) | ||||
| 	r := dryDB.Distinct("u.id, u.*").Table("user_speaks as s").Joins("inner join users as u on u.id = s.user_id").Where("s.language_code ='US' or s.language_code ='ES'").Find(&User{}) | ||||
| 	if !regexp.MustCompile(`SELECT DISTINCT u\.id, u\.\* FROM user_speaks as s inner join users as u`).MatchString(r.Statement.SQL.String()) { | ||||
| 		t.Fatalf("Build Distinct with u.*, but got %v", r.Statement.SQL.String()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu