Skip to content

Commit 3d1ab23

Browse files
authored
add more join tests (go-xorm#23)
1 parent dc54521 commit 3d1ab23

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed

builder_select_test.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"github.com/stretchr/testify/assert"
1212
)
1313

14-
func TestBuilderSelect(t *testing.T) {
14+
func TestBuilder_Select(t *testing.T) {
1515
sql, args, err := Select("c, d").From("table1").ToSQL()
1616
assert.NoError(t, err)
1717
fmt.Println(sql, args)
@@ -23,7 +23,30 @@ func TestBuilderSelect(t *testing.T) {
2323
sql, args, err = Select("c, d").From("table1").LeftJoin("table2", Eq{"table1.id": 1}.And(Lt{"table2.id": 3})).
2424
RightJoin("table3", "table2.id = table3.tid").Where(Eq{"a": 1}).ToSQL()
2525
assert.NoError(t, err)
26-
fmt.Println(sql, args)
26+
assert.EqualValues(t, "SELECT c, d FROM table1 LEFT JOIN table2 ON table1.id=? AND table2.id<? RIGHT JOIN table3 ON table2.id = table3.tid WHERE a=?",
27+
sql)
28+
assert.EqualValues(t, []interface{}{1, 3, 1}, args)
29+
30+
sql, args, err = Select("c, d").From("table1").LeftJoin("table2", Eq{"table1.id": 1}.And(Lt{"table2.id": 3})).
31+
FullJoin("table3", "table2.id = table3.tid").Where(Eq{"a": 1}).ToSQL()
32+
assert.NoError(t, err)
33+
assert.EqualValues(t, "SELECT c, d FROM table1 LEFT JOIN table2 ON table1.id=? AND table2.id<? FULL JOIN table3 ON table2.id = table3.tid WHERE a=?",
34+
sql)
35+
assert.EqualValues(t, []interface{}{1, 3, 1}, args)
36+
37+
sql, args, err = Select("c, d").From("table1").LeftJoin("table2", Eq{"table1.id": 1}.And(Lt{"table2.id": 3})).
38+
CrossJoin("table3", "table2.id = table3.tid").Where(Eq{"a": 1}).ToSQL()
39+
assert.NoError(t, err)
40+
assert.EqualValues(t, "SELECT c, d FROM table1 LEFT JOIN table2 ON table1.id=? AND table2.id<? CROSS JOIN table3 ON table2.id = table3.tid WHERE a=?",
41+
sql)
42+
assert.EqualValues(t, []interface{}{1, 3, 1}, args)
43+
44+
sql, args, err = Select("c, d").From("table1").LeftJoin("table2", Eq{"table1.id": 1}.And(Lt{"table2.id": 3})).
45+
InnerJoin("table3", "table2.id = table3.tid").Where(Eq{"a": 1}).ToSQL()
46+
assert.NoError(t, err)
47+
assert.EqualValues(t, "SELECT c, d FROM table1 LEFT JOIN table2 ON table1.id=? AND table2.id<? INNER JOIN table3 ON table2.id = table3.tid WHERE a=?",
48+
sql)
49+
assert.EqualValues(t, []interface{}{1, 3, 1}, args)
2750
}
2851

2952
func TestBuilderSelectGroupBy(t *testing.T) {

builder_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,13 @@ func TestExprCond(t *testing.T) {
451451
b := Select("id").From("table1").Where(expr{sql: "a=? OR b=?", args: []interface{}{1, 2}}).Where(Or(Eq{"c": 3}, Eq{"d": 4}))
452452
sql, args, err := b.ToSQL()
453453
assert.NoError(t, err)
454+
assert.EqualValues(t, "table1", b.TableName())
454455
assert.EqualValues(t, "SELECT id FROM table1 WHERE (a=? OR b=?) AND (c=? OR d=?)", sql)
455456
assert.EqualValues(t, []interface{}{1, 2, 3, 4}, args)
456457
}
458+
459+
func TestBuilderToBindedSQL(t *testing.T) {
460+
newSQL, err := Select("id").From("table").Where(In("a", 1, 2)).ToBindedSQL()
461+
assert.NoError(t, err)
462+
assert.EqualValues(t, "SELECT id FROM table WHERE a IN (1,2)", newSQL)
463+
}

sql.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ func noSQLQuoteNeeded(a interface{}) bool {
9292
// ConvertToBindedSQL will convert SQL and args to a binded SQL
9393
func ConvertToBindedSQL(sql string, args []interface{}) (string, error) {
9494
buf := StringBuilder{}
95-
var j, start = 0, 0
96-
for i := 0; i < len(sql); i++ {
95+
var i, j, start int
96+
for ; i < len(sql); i++ {
9797
if sql[i] == '?' {
9898
_, err := buf.WriteString(sql[start:i])
9999
if err != nil {
@@ -116,14 +116,18 @@ func ConvertToBindedSQL(sql string, args []interface{}) (string, error) {
116116
j = j + 1
117117
}
118118
}
119+
_, err := buf.WriteString(sql[start:])
120+
if err != nil {
121+
return "", err
122+
}
119123
return buf.String(), nil
120124
}
121125

122126
// ConvertPlaceholder replaces ? to $1, $2 ... or :1, :2 ... according prefix
123127
func ConvertPlaceholder(sql, prefix string) (string, error) {
124128
buf := StringBuilder{}
125-
var j, start = 0, 0
126-
for i := 0; i < len(sql); i++ {
129+
var i, j, start int
130+
for ; i < len(sql); i++ {
127131
if sql[i] == '?' {
128132
_, err := buf.WriteString(sql[start:i])
129133
if err != nil {
@@ -143,5 +147,9 @@ func ConvertPlaceholder(sql, prefix string) (string, error) {
143147
}
144148
}
145149
}
150+
_, err := buf.WriteString(sql[start:])
151+
if err != nil {
152+
return "", err
153+
}
146154
return buf.String(), nil
147155
}

sql_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ func TestBindedSQLConverter(t *testing.T) {
3535
assert.Error(t, err)
3636
assert.EqualValues(t, ErrNeedMoreArguments, err)
3737

38+
newSQL, err = ToBindedSQL(Select("id").From("table").Where(In("a", 1, 2)))
39+
assert.NoError(t, err)
40+
assert.EqualValues(t, "SELECT id FROM table WHERE a IN (1,2)", newSQL)
41+
3842
newSQL, err = ToBindedSQL(1)
3943
assert.Error(t, err)
4044
assert.EqualValues(t, ErrNotSupportType, err)

0 commit comments

Comments
 (0)