Fix integration tests.

This commit is contained in:
zer0sub 2019-05-01 18:23:19 +02:00
parent eccc17dc8a
commit 5c05214ba1
5 changed files with 102 additions and 18 deletions

View file

@ -60,6 +60,20 @@ func newBinaryExpression(lhs, rhs Expression, operator []byte, parent ...Express
return binaryExpression
}
func isSimpleOperand(expression Expression) bool {
if _, ok := expression.(*literalExpression); ok {
return true
}
if _, ok := expression.(Column); ok {
return true
}
if _, ok := expression.(FuncExpression); ok {
return true
}
return false
}
func (c *binaryExpression) Serialize(out *queryData, options ...serializeOption) error {
if c.lhs == nil {
return errors.Newf("nil lhs.")
@ -68,10 +82,9 @@ func (c *binaryExpression) Serialize(out *queryData, options ...serializeOption)
return errors.Newf("nil rhs.")
}
_, literalLeft := c.lhs.(*literalExpression)
_, literalRight := c.rhs.(*literalExpression)
wrap := !isSimpleOperand(c.lhs) && !isSimpleOperand(c.rhs)
if !literalLeft && !literalRight {
if wrap {
out.WriteString("(")
}
@ -85,7 +98,7 @@ func (c *binaryExpression) Serialize(out *queryData, options ...serializeOption)
return err
}
if !literalLeft && !literalRight {
if wrap {
out.WriteString(")")
}

View file

@ -81,8 +81,8 @@ func (us *setStatementImpl) OFFSET(offset int64) SetStatement {
}
func (us *setStatementImpl) Serialize(out *queryData, options ...serializeOption) error {
if len(us.selects) == 0 {
return errors.Newf("UNION statement must have at least one SELECT")
if len(us.selects) < 2 {
return errors.Newf("UNION statement must have at least two SELECT statements.")
}
out.WriteString("(")

View file

@ -1 +1,71 @@
package sqlbuilder
import (
"fmt"
"gotest.tools/assert"
"testing"
)
func TestUnionNoSelect(t *testing.T) {
query, args, err := UNION().Sql()
assert.Assert(t, err != nil)
//fmt.Println(err.Error())
fmt.Print(query, args)
}
func TestUnionOneSelect(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
).Sql()
assert.Assert(t, err != nil)
fmt.Println(err.Error())
fmt.Println(query)
fmt.Println(args)
}
func TestUnionTwoSelect(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
table2.SELECT(table2Col3),
).Sql()
assert.NilError(t, err)
assert.Equal(t, query, `((SELECT table1.col1 AS "table1.col1" FROM db.table1) UNION (SELECT table2.col3 AS "table2.col3" FROM db.table2))`)
assert.Equal(t, len(args), 0)
}
func TestUnionThreeSelect(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
table2.SELECT(table2Col3),
table3.SELECT(table3Col1),
).Sql()
assert.NilError(t, err)
assert.Equal(t, query, `((SELECT table1.col1 AS "table1.col1" FROM db.table1) UNION (SELECT table2.col3 AS "table2.col3" FROM db.table2) UNION (SELECT table3.col1 AS "table3.col1" FROM db.table3))`)
assert.Equal(t, len(args), 0)
}
func TestUnionWithOrderBy(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
table2.SELECT(table2Col3),
).ORDER_BY(table1Col1.Asc()).Sql()
assert.NilError(t, err)
assert.Equal(t, query, `((SELECT table1.col1 AS "table1.col1" FROM db.table1) UNION (SELECT table2.col3 AS "table2.col3" FROM db.table2)) ORDER BY table1.col1 ASC`)
assert.Equal(t, len(args), 0)
}
func TestUnionWithLimit(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
table2.SELECT(table2Col3),
).LIMIT(10).OFFSET(11).Sql()
assert.NilError(t, err)
assert.Equal(t, query, `((SELECT table1.col1 AS "table1.col1" FROM db.table1) UNION (SELECT table2.col3 AS "table2.col3" FROM db.table2)) LIMIT $1 OFFSET $2`)
assert.Equal(t, len(args), 2)
}