resolve conflicts
This commit is contained in:
		
						commit
						5bfc042ba9
					
				@ -502,7 +502,7 @@ func (association *Association) buildCondition() *DB {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if association.Relationship.JoinTable != nil {
 | 
						if association.Relationship.JoinTable != nil {
 | 
				
			||||||
		if !tx.Statement.Unscoped && len(association.Relationship.JoinTable.QueryClauses) > 0 {
 | 
							if !tx.Statement.Unscoped && len(association.Relationship.JoinTable.QueryClauses) > 0 {
 | 
				
			||||||
			joinStmt := Statement{DB: tx, Schema: association.Relationship.JoinTable, Table: association.Relationship.JoinTable.Table, Clauses: map[string]clause.Clause{}}
 | 
								joinStmt := Statement{DB: tx, Context: tx.Statement.Context, Schema: association.Relationship.JoinTable, Table: association.Relationship.JoinTable.Table, Clauses: map[string]clause.Clause{}}
 | 
				
			||||||
			for _, queryClause := range association.Relationship.JoinTable.QueryClauses {
 | 
								for _, queryClause := range association.Relationship.JoinTable.QueryClauses {
 | 
				
			||||||
				joinStmt.AddClause(queryClause)
 | 
									joinStmt.AddClause(queryClause)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
				
			|||||||
@ -96,12 +96,12 @@ func BuildQuerySQL(db *gorm.DB) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// inline joins
 | 
							// inline joins
 | 
				
			||||||
		joins := []clause.Join{}
 | 
							fromClause := clause.From{}
 | 
				
			||||||
		if fromClause, ok := db.Statement.Clauses["FROM"].Expression.(clause.From); ok {
 | 
							if v, ok := db.Statement.Clauses["FROM"].Expression.(clause.From); ok {
 | 
				
			||||||
			joins = fromClause.Joins
 | 
								fromClause = v
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(db.Statement.Joins) != 0 || len(joins) != 0 {
 | 
							if len(db.Statement.Joins) != 0 || len(fromClause.Joins) != 0 {
 | 
				
			||||||
			if len(db.Statement.Selects) == 0 && len(db.Statement.Omits) == 0 && db.Statement.Schema != nil {
 | 
								if len(db.Statement.Selects) == 0 && len(db.Statement.Omits) == 0 && db.Statement.Schema != nil {
 | 
				
			||||||
				clauseSelect.Columns = make([]clause.Column, len(db.Statement.Schema.DBNames))
 | 
									clauseSelect.Columns = make([]clause.Column, len(db.Statement.Schema.DBNames))
 | 
				
			||||||
				for idx, dbName := range db.Statement.Schema.DBNames {
 | 
									for idx, dbName := range db.Statement.Schema.DBNames {
 | 
				
			||||||
@ -111,7 +111,7 @@ func BuildQuerySQL(db *gorm.DB) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			for _, join := range db.Statement.Joins {
 | 
								for _, join := range db.Statement.Joins {
 | 
				
			||||||
				if db.Statement.Schema == nil {
 | 
									if db.Statement.Schema == nil {
 | 
				
			||||||
					joins = append(joins, clause.Join{
 | 
										fromClause.Joins = append(fromClause.Joins, clause.Join{
 | 
				
			||||||
						Expression: clause.NamedExpr{SQL: join.Name, Vars: join.Conds},
 | 
											Expression: clause.NamedExpr{SQL: join.Name, Vars: join.Conds},
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				} else if relation, ok := db.Statement.Schema.Relationships.Relations[join.Name]; ok {
 | 
									} else if relation, ok := db.Statement.Schema.Relationships.Relations[join.Name]; ok {
 | 
				
			||||||
@ -176,19 +176,19 @@ func BuildQuerySQL(db *gorm.DB) {
 | 
				
			|||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					joins = append(joins, clause.Join{
 | 
										fromClause.Joins = append(fromClause.Joins, clause.Join{
 | 
				
			||||||
						Type:  clause.LeftJoin,
 | 
											Type:  clause.LeftJoin,
 | 
				
			||||||
						Table: clause.Table{Name: relation.FieldSchema.Table, Alias: tableAliasName},
 | 
											Table: clause.Table{Name: relation.FieldSchema.Table, Alias: tableAliasName},
 | 
				
			||||||
						ON:    clause.Where{Exprs: exprs},
 | 
											ON:    clause.Where{Exprs: exprs},
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					joins = append(joins, clause.Join{
 | 
										fromClause.Joins = append(fromClause.Joins, clause.Join{
 | 
				
			||||||
						Expression: clause.NamedExpr{SQL: join.Name, Vars: join.Conds},
 | 
											Expression: clause.NamedExpr{SQL: join.Name, Vars: join.Conds},
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			db.Statement.AddClause(clause.From{Joins: joins})
 | 
								db.Statement.AddClause(fromClause)
 | 
				
			||||||
			db.Statement.Joins = nil
 | 
								db.Statement.Joins = nil
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			db.Statement.AddClauseIfNotExists(clause.From{})
 | 
								db.Statement.AddClauseIfNotExists(clause.From{})
 | 
				
			||||||
 | 
				
			|||||||
@ -207,7 +207,7 @@ func (db *DB) FindInBatches(dest interface{}, batchSize int, fc func(tx *DB, bat
 | 
				
			|||||||
	return tx
 | 
						return tx
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (tx *DB) assignInterfacesToValue(values ...interface{}) {
 | 
					func (db *DB) assignInterfacesToValue(values ...interface{}) {
 | 
				
			||||||
	for _, value := range values {
 | 
						for _, value := range values {
 | 
				
			||||||
		switch v := value.(type) {
 | 
							switch v := value.(type) {
 | 
				
			||||||
		case []clause.Expression:
 | 
							case []clause.Expression:
 | 
				
			||||||
@ -215,40 +215,40 @@ func (tx *DB) assignInterfacesToValue(values ...interface{}) {
 | 
				
			|||||||
				if eq, ok := expr.(clause.Eq); ok {
 | 
									if eq, ok := expr.(clause.Eq); ok {
 | 
				
			||||||
					switch column := eq.Column.(type) {
 | 
										switch column := eq.Column.(type) {
 | 
				
			||||||
					case string:
 | 
										case string:
 | 
				
			||||||
						if field := tx.Statement.Schema.LookUpField(column); field != nil {
 | 
											if field := db.Statement.Schema.LookUpField(column); field != nil {
 | 
				
			||||||
							tx.AddError(field.Set(tx.Statement.Context, tx.Statement.ReflectValue, eq.Value))
 | 
												db.AddError(field.Set(db.Statement.Context, db.Statement.ReflectValue, eq.Value))
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					case clause.Column:
 | 
										case clause.Column:
 | 
				
			||||||
						if field := tx.Statement.Schema.LookUpField(column.Name); field != nil {
 | 
											if field := db.Statement.Schema.LookUpField(column.Name); field != nil {
 | 
				
			||||||
							tx.AddError(field.Set(tx.Statement.Context, tx.Statement.ReflectValue, eq.Value))
 | 
												db.AddError(field.Set(db.Statement.Context, db.Statement.ReflectValue, eq.Value))
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} else if andCond, okk := expr.(clause.AndConditions); okk {
 | 
									} else if andCond, okk := expr.(clause.AndConditions); okk {
 | 
				
			||||||
					tx.assignInterfacesToValue(andCond.Exprs)
 | 
										db.assignInterfacesToValue(andCond.Exprs)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		case clause.Expression, map[string]string, map[interface{}]interface{}, map[string]interface{}:
 | 
							case clause.Expression, map[string]string, map[interface{}]interface{}, map[string]interface{}:
 | 
				
			||||||
			if exprs := tx.Statement.BuildCondition(value); len(exprs) > 0 {
 | 
								if exprs := db.Statement.BuildCondition(value); len(exprs) > 0 {
 | 
				
			||||||
				tx.assignInterfacesToValue(exprs)
 | 
									db.assignInterfacesToValue(exprs)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			if s, err := schema.Parse(value, tx.cacheStore, tx.NamingStrategy); err == nil {
 | 
								if s, err := schema.Parse(value, db.cacheStore, db.NamingStrategy); err == nil {
 | 
				
			||||||
				reflectValue := reflect.Indirect(reflect.ValueOf(value))
 | 
									reflectValue := reflect.Indirect(reflect.ValueOf(value))
 | 
				
			||||||
				switch reflectValue.Kind() {
 | 
									switch reflectValue.Kind() {
 | 
				
			||||||
				case reflect.Struct:
 | 
									case reflect.Struct:
 | 
				
			||||||
					for _, f := range s.Fields {
 | 
										for _, f := range s.Fields {
 | 
				
			||||||
						if f.Readable {
 | 
											if f.Readable {
 | 
				
			||||||
							if v, isZero := f.ValueOf(tx.Statement.Context, reflectValue); !isZero {
 | 
												if v, isZero := f.ValueOf(db.Statement.Context, reflectValue); !isZero {
 | 
				
			||||||
								if field := tx.Statement.Schema.LookUpField(f.Name); field != nil {
 | 
													if field := db.Statement.Schema.LookUpField(f.Name); field != nil {
 | 
				
			||||||
									tx.AddError(field.Set(tx.Statement.Context, tx.Statement.ReflectValue, v))
 | 
														db.AddError(field.Set(db.Statement.Context, db.Statement.ReflectValue, v))
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else if len(values) > 0 {
 | 
								} else if len(values) > 0 {
 | 
				
			||||||
				if exprs := tx.Statement.BuildCondition(values[0], values[1:]...); len(exprs) > 0 {
 | 
									if exprs := db.Statement.BuildCondition(values[0], values[1:]...); len(exprs) > 0 {
 | 
				
			||||||
					tx.assignInterfacesToValue(exprs)
 | 
										db.assignInterfacesToValue(exprs)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								gorm.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								gorm.go
									
									
									
									
									
								
							@ -124,8 +124,8 @@ func Open(dialector Dialector, opts ...Option) (db *DB, err error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	for _, opt := range opts {
 | 
						for _, opt := range opts {
 | 
				
			||||||
		if opt != nil {
 | 
							if opt != nil {
 | 
				
			||||||
			if err := opt.Apply(config); err != nil {
 | 
								if applyErr := opt.Apply(config); applyErr != nil {
 | 
				
			||||||
				return nil, err
 | 
									return nil, applyErr
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			defer func(opt Option) {
 | 
								defer func(opt Option) {
 | 
				
			||||||
				if errr := opt.AfterInitialize(db); errr != nil {
 | 
									if errr := opt.AfterInitialize(db); errr != nil {
 | 
				
			||||||
 | 
				
			|||||||
@ -275,7 +275,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
 | 
				
			|||||||
		field.DataType = DataType(dataTyper.GormDataType())
 | 
							field.DataType = DataType(dataTyper.GormDataType())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
 | 
						if v, ok := field.TagSettings["AUTOCREATETIME"]; (ok && utils.CheckTruth(v)) || (!ok && field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
 | 
				
			||||||
		if field.DataType == Time {
 | 
							if field.DataType == Time {
 | 
				
			||||||
			field.AutoCreateTime = UnixTime
 | 
								field.AutoCreateTime = UnixTime
 | 
				
			||||||
		} else if strings.ToUpper(v) == "NANO" {
 | 
							} else if strings.ToUpper(v) == "NANO" {
 | 
				
			||||||
@ -287,7 +287,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok || (field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
 | 
						if v, ok := field.TagSettings["AUTOUPDATETIME"]; (ok && utils.CheckTruth(v)) || (!ok && field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
 | 
				
			||||||
		if field.DataType == Time {
 | 
							if field.DataType == Time {
 | 
				
			||||||
			field.AutoUpdateTime = UnixTime
 | 
								field.AutoUpdateTime = UnixTime
 | 
				
			||||||
		} else if strings.ToUpper(v) == "NANO" {
 | 
							} else if strings.ToUpper(v) == "NANO" {
 | 
				
			||||||
 | 
				
			|||||||
@ -263,7 +263,6 @@ func TestSaveHasManyCircularReference(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestAssociationError(t *testing.T) {
 | 
					func TestAssociationError(t *testing.T) {
 | 
				
			||||||
	DB = DB.Debug()
 | 
					 | 
				
			||||||
	user := *GetUser("TestAssociationError", Config{Pets: 2, Company: true, Account: true, Languages: 2})
 | 
						user := *GetUser("TestAssociationError", Config{Pets: 2, Company: true, Account: true, Languages: 2})
 | 
				
			||||||
	DB.Create(&user)
 | 
						DB.Create(&user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ require (
 | 
				
			|||||||
	github.com/jinzhu/now v1.1.5
 | 
						github.com/jinzhu/now v1.1.5
 | 
				
			||||||
	github.com/lib/pq v1.10.4
 | 
						github.com/lib/pq v1.10.4
 | 
				
			||||||
	github.com/mattn/go-sqlite3 v1.14.12 // indirect
 | 
						github.com/mattn/go-sqlite3 v1.14.12 // indirect
 | 
				
			||||||
	golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 // indirect
 | 
						golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
 | 
				
			||||||
	gorm.io/driver/mysql v1.3.2
 | 
						gorm.io/driver/mysql v1.3.2
 | 
				
			||||||
	gorm.io/driver/postgres v1.3.1
 | 
						gorm.io/driver/postgres v1.3.1
 | 
				
			||||||
	gorm.io/driver/sqlite v1.3.1
 | 
						gorm.io/driver/sqlite v1.3.1
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user