summaryrefslogtreecommitdiff
path: root/vendor/github.com/uptrace/bun/schema/table.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/uptrace/bun/schema/table.go')
-rw-r--r--vendor/github.com/uptrace/bun/schema/table.go37
1 files changed, 30 insertions, 7 deletions
diff --git a/vendor/github.com/uptrace/bun/schema/table.go b/vendor/github.com/uptrace/bun/schema/table.go
index 9eb7d1bfe..cd0ff20b2 100644
--- a/vendor/github.com/uptrace/bun/schema/table.go
+++ b/vendor/github.com/uptrace/bun/schema/table.go
@@ -4,6 +4,7 @@ import (
"database/sql"
"fmt"
"reflect"
+ "strconv"
"strings"
"sync"
"time"
@@ -806,18 +807,38 @@ func (t *Table) m2mRelation(field *Field) *Relation {
return rel
}
-func (t *Table) inlineFields(field *Field, seen map[reflect.Type]struct{}) {
- if seen == nil {
- seen = map[reflect.Type]struct{}{t.Type: {}}
+type seenKey struct {
+ Table reflect.Type
+ FieldIndex string
+}
+
+type seenMap map[seenKey]struct{}
+
+func NewSeenKey(table reflect.Type, fieldIndex []int) (key seenKey) {
+ key.Table = table
+ for _, index := range fieldIndex {
+ key.FieldIndex += strconv.Itoa(index) + "-"
}
+ return key
+}
- if _, ok := seen[field.IndirectType]; ok {
- return
+func (s seenMap) Clone() seenMap {
+ t := make(seenMap)
+ for k, v := range s {
+ t[k] = v
+ }
+ return t
+}
+
+func (t *Table) inlineFields(field *Field, seen seenMap) {
+ if seen == nil {
+ seen = make(seenMap)
}
- seen[field.IndirectType] = struct{}{}
joinTable := t.dialect.Tables().Ref(field.IndirectType)
for _, f := range joinTable.allFields {
+ key := NewSeenKey(joinTable.Type, f.Index)
+
f = f.Clone()
f.GoName = field.GoName + "_" + f.GoName
f.Name = field.Name + "__" + f.Name
@@ -834,7 +855,9 @@ func (t *Table) inlineFields(field *Field, seen map[reflect.Type]struct{}) {
continue
}
- if _, ok := seen[f.IndirectType]; !ok {
+ if _, ok := seen[key]; !ok {
+ seen = seen.Clone()
+ seen[key] = struct{}{}
t.inlineFields(f, seen)
}
}