@@ -2,10 +2,24 @@ package sqlbuilder
2
2
3
3
type UpdateColumns map [* BasicColumn ]AsExpr
4
4
5
+ func (m UpdateColumns ) asFields () []UpdateField {
6
+ var a []UpdateField
7
+ for k , e := range m {
8
+ a = append (a , UpdateField {k , e })
9
+ }
10
+ return a
11
+ }
12
+
13
+ type UpdateField struct {
14
+ Name AsNamedShort
15
+ Value AsExpr
16
+ }
17
+
5
18
type UpdateStatement struct {
6
19
with []AsCommonTableExpression
7
20
target AsTableOrSubquery
8
- set UpdateColumns
21
+ columns UpdateColumns
22
+ fields []UpdateField
9
23
from AsTableOrSubquery
10
24
where AsExpr
11
25
returning []AsExpr
@@ -15,15 +29,16 @@ func (s *UpdateStatement) clone() *UpdateStatement {
15
29
return & UpdateStatement {
16
30
with : s .with ,
17
31
target : s .target ,
18
- set : s .set ,
32
+ columns : s .columns ,
33
+ fields : s .fields ,
19
34
from : s .from ,
20
35
where : s .where ,
21
36
returning : s .returning ,
22
37
}
23
38
}
24
39
25
40
func Update () * UpdateStatement {
26
- return & UpdateStatement {set : make (UpdateColumns )}
41
+ return & UpdateStatement {columns : make (UpdateColumns )}
27
42
}
28
43
29
44
func (s * UpdateStatement ) With (with ... AsCommonTableExpression ) * UpdateStatement {
@@ -52,27 +67,41 @@ func (s *UpdateStatement) GetTarget() AsTableOrSubquery {
52
67
return s .target
53
68
}
54
69
55
- func (s * UpdateStatement ) Set (set UpdateColumns ) * UpdateStatement {
70
+ func (s * UpdateStatement ) Set (columns UpdateColumns ) * UpdateStatement {
56
71
c := s .clone ()
57
- c .set = set
72
+ c .columns = columns
73
+ c .fields = nil
58
74
return c
59
75
}
60
76
61
77
func (s * UpdateStatement ) AndSet (column * BasicColumn , expr AsExpr ) * UpdateStatement {
62
78
c := s .clone ()
63
79
64
80
m := make (UpdateColumns )
65
- for k , e := range c .set {
81
+ for k , e := range c .columns {
66
82
m [k ] = e
67
83
}
68
84
69
85
m [column ] = expr
70
86
71
- c .set = m
87
+ c .columns = m
72
88
73
89
return c
74
90
}
75
91
92
+ func (s * UpdateStatement ) Fields (fields []UpdateField ) * UpdateStatement {
93
+ c := s .clone ()
94
+ c .columns = nil
95
+ c .fields = fields
96
+ return c
97
+ }
98
+
99
+ func (s * UpdateStatement ) AndField (field UpdateField ) * UpdateStatement {
100
+ c := s .clone ()
101
+ c .fields = append (c .fields [:], field )
102
+ return c
103
+ }
104
+
76
105
func (s * UpdateStatement ) From (from AsTableOrSubquery ) * UpdateStatement {
77
106
c := s .clone ()
78
107
c .from = from
@@ -109,10 +138,8 @@ func (q *UpdateStatement) AsStatement(s *Serializer) {
109
138
110
139
s .D ("UPDATE " ).F (q .target .AsTableOrSubquery ).D (" SET " )
111
140
112
- i := 0
113
- for k , e := range q .set {
114
- s .F (k .AsNamedShort ).D (" = " ).F (e .AsExpr ).DC (", " , i < len (q .set )- 1 )
115
- i ++
141
+ for i , f := range append (q .columns .asFields (), q .fields ... ) {
142
+ s .DC (", " , i != 0 ).F (f .Name .AsNamedShort ).D (" = " ).F (f .Value .AsExpr )
116
143
}
117
144
118
145
if q .from != nil {
0 commit comments