MariaDB tests fix.

This commit is contained in:
go-jet 2019-08-15 11:59:17 +02:00
parent bf3ec27f68
commit 0dbdbb9220
8 changed files with 170 additions and 118 deletions

View file

@ -184,14 +184,6 @@ func (s *ClauseSetStmtOperator) Serialize(statementType StatementType, out *SqlB
panic("jet: UNION Statement must contain at least two SELECT statements") panic("jet: UNION Statement must contain at least two SELECT statements")
} }
wrap := s.OrderBy.List != nil || s.Limit.Count >= 0 || s.Offset.Count >= 0
if wrap {
out.NewLine()
out.WriteString("(")
out.IncreaseIdent()
}
for i, selectStmt := range s.Selects { for i, selectStmt := range s.Selects {
out.NewLine() out.NewLine()
if i > 0 { if i > 0 {
@ -210,12 +202,6 @@ func (s *ClauseSetStmtOperator) Serialize(statementType StatementType, out *SqlB
selectStmt.serialize(statementType, out) selectStmt.serialize(statementType, out)
} }
if wrap {
out.DecreaseIdent()
out.NewLine()
out.WriteString(")")
}
s.OrderBy.Serialize(statementType, out) s.OrderBy.Serialize(statementType, out)
s.Limit.Serialize(statementType, out) s.Limit.Serialize(statementType, out)
s.Offset.Serialize(statementType, out) s.Offset.Serialize(statementType, out)
@ -391,26 +377,19 @@ func (d *ClauseStatementBegin) Serialize(statementType StatementType, out *SqlBu
} }
} }
type ClauseString struct {
Name string
Data string
}
func (d *ClauseString) Serialize(statementType StatementType, out *SqlBuilder) {
out.NewLine()
out.WriteString(d.Name)
out.WriteString(d.Data)
}
type ClauseOptional struct { type ClauseOptional struct {
Name string Name string
Show bool Show bool
InNewLine bool
} }
func (d *ClauseOptional) Serialize(statementType StatementType, out *SqlBuilder) { func (d *ClauseOptional) Serialize(statementType StatementType, out *SqlBuilder) {
if !d.Show { if !d.Show {
return return
} }
if d.InNewLine {
out.NewLine()
}
out.WriteString(d.Name) out.WriteString(d.Name)
} }

View file

@ -23,6 +23,7 @@ type SelectStatement interface {
LIMIT(limit int64) SelectStatement LIMIT(limit int64) SelectStatement
OFFSET(offset int64) SelectStatement OFFSET(offset int64) SelectStatement
FOR(lock SelectLock) SelectStatement FOR(lock SelectLock) SelectStatement
LOCK_IN_SHARE_MODE() SelectStatement
UNION(rhs SelectStatement) SetStatement UNION(rhs SelectStatement) SetStatement
UNION_ALL(rhs SelectStatement) SetStatement UNION_ALL(rhs SelectStatement) SetStatement
@ -39,7 +40,7 @@ func newSelectStatement(table ReadableTable, projections []jet.Projection) Selec
newSelect := &selectStatementImpl{} newSelect := &selectStatementImpl{}
newSelect.ExpressionStatementImpl.StatementImpl = jet.NewStatementImpl(Dialect, jet.SelectStatementType, newSelect, &newSelect.Select, newSelect.ExpressionStatementImpl.StatementImpl = jet.NewStatementImpl(Dialect, jet.SelectStatementType, newSelect, &newSelect.Select,
&newSelect.From, &newSelect.Where, &newSelect.GroupBy, &newSelect.Having, &newSelect.OrderBy, &newSelect.From, &newSelect.Where, &newSelect.GroupBy, &newSelect.Having, &newSelect.OrderBy,
&newSelect.Limit, &newSelect.Offset, &newSelect.For) &newSelect.Limit, &newSelect.Offset, &newSelect.For, &newSelect.ShareLock)
newSelect.ExpressionStatementImpl.ExpressionInterfaceImpl.Parent = newSelect newSelect.ExpressionStatementImpl.ExpressionInterfaceImpl.Parent = newSelect
@ -47,6 +48,8 @@ func newSelectStatement(table ReadableTable, projections []jet.Projection) Selec
newSelect.From.Table = table newSelect.From.Table = table
newSelect.Limit.Count = -1 newSelect.Limit.Count = -1
newSelect.Offset.Count = -1 newSelect.Offset.Count = -1
newSelect.ShareLock.Name = "LOCK IN SHARE MODE"
newSelect.ShareLock.InNewLine = true
newSelect.setOperatorsImpl.parent = newSelect newSelect.setOperatorsImpl.parent = newSelect
@ -57,15 +60,16 @@ type selectStatementImpl struct {
jet.ExpressionStatementImpl jet.ExpressionStatementImpl
setOperatorsImpl setOperatorsImpl
Select jet.ClauseSelect Select jet.ClauseSelect
From jet.ClauseFrom From jet.ClauseFrom
Where jet.ClauseWhere Where jet.ClauseWhere
GroupBy jet.ClauseGroupBy GroupBy jet.ClauseGroupBy
Having jet.ClauseHaving Having jet.ClauseHaving
OrderBy jet.ClauseOrderBy OrderBy jet.ClauseOrderBy
Limit jet.ClauseLimit Limit jet.ClauseLimit
Offset jet.ClauseOffset Offset jet.ClauseOffset
For jet.ClauseFor For jet.ClauseFor
ShareLock jet.ClauseOptional
} }
func (s *selectStatementImpl) DISTINCT() SelectStatement { func (s *selectStatementImpl) DISTINCT() SelectStatement {
@ -113,6 +117,11 @@ func (s *selectStatementImpl) FOR(lock SelectLock) SelectStatement {
return s return s
} }
func (s *selectStatementImpl) LOCK_IN_SHARE_MODE() SelectStatement {
s.ShareLock.Show = true
return s
}
func (s *selectStatementImpl) AsTable(alias string) SelectTable { func (s *selectStatementImpl) AsTable(alias string) SelectTable {
return newSelectTable(s, alias) return newSelectTable(s, alias)
} }

View file

@ -124,3 +124,11 @@ FROM db.table1
FOR SHARE NOWAIT; FOR SHARE NOWAIT;
`) `)
} }
func TestSelect_LOCK_IN_SHARE_MODE(t *testing.T) {
testutils.AssertStatementSql(t, SELECT(table1ColBool).FROM(table1).LOCK_IN_SHARE_MODE(), `
SELECT table1.col_bool AS "table1.col_bool"
FROM db.table1
LOCK IN SHARE MODE;
`)
}

View file

@ -26,6 +26,12 @@ func TestAllTypes(t *testing.T) {
assert.NilError(t, err) assert.NilError(t, err)
assert.Equal(t, len(dest), 2)
if sourceIsMariaDB() { // MariaDB saves current timestamp in a case of NULL value insert
dest[1].TimestampPtr = nil
}
//testutils.PrintJson(dest) //testutils.PrintJson(dest)
testutils.AssertJSON(t, dest, allTypesJson) testutils.AssertJSON(t, dest, allTypesJson)
} }
@ -788,7 +794,20 @@ LIMIT ?;
//testutils.PrintJson(dest) //testutils.PrintJson(dest)
testutils.AssertJSON(t, dest, ` if sourceIsMariaDB() {
testutils.AssertJSON(t, dest, `
{
"Date": "2009-11-17T00:00:00Z",
"DateT": "2009-11-17T00:00:00Z",
"Time": "0000-01-01T20:34:58Z",
"TimeT": "0000-01-01T19:34:58Z",
"DateTime": "2009-11-17T19:34:58Z",
"Timestamp": "2019-08-06T10:10:30Z",
"TimestampT": "2009-11-17T19:34:58Z"
}
`)
} else {
testutils.AssertJSON(t, dest, `
{ {
"Date": "2009-11-17T00:00:00Z", "Date": "2009-11-17T00:00:00Z",
"DateT": "2009-11-17T00:00:00Z", "DateT": "2009-11-17T00:00:00Z",
@ -799,6 +818,8 @@ LIMIT ?;
"TimestampT": "2009-11-17T19:34:58.351387Z" "TimestampT": "2009-11-17T19:34:58.351387Z"
} }
`) `)
}
} }
var allTypesJson = ` var allTypesJson = `

View file

@ -2,6 +2,7 @@ package mysql
import ( import (
"database/sql" "database/sql"
"flag"
"github.com/go-jet/jet/tests/dbconfig" "github.com/go-jet/jet/tests/dbconfig"
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
@ -13,6 +14,19 @@ import (
var db *sql.DB var db *sql.DB
var source string
const MariaDB = "MariaDB"
func init() {
flag.StringVar(&source, "source", "", "MySQL or MariaDB")
flag.Parse()
}
func sourceIsMariaDB() bool {
return source == MariaDB
}
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
defer profile.Start().Stop() defer profile.Start().Stop()

View file

@ -174,6 +174,10 @@ func TestSubQuery(t *testing.T) {
} }
func TestSelectAndUnionInProjection(t *testing.T) { func TestSelectAndUnionInProjection(t *testing.T) {
if sourceIsMariaDB() {
return
}
expectedSQL := ` expectedSQL := `
SELECT payment.payment_id AS "payment.payment_id", SELECT payment.payment_id AS "payment.payment_id",
( (
@ -183,19 +187,17 @@ SELECT payment.payment_id AS "payment.payment_id",
), ),
( (
( (
( SELECT payment.payment_id AS "payment.payment_id"
SELECT payment.payment_id AS "payment.payment_id" FROM dvds.payment
FROM dvds.payment LIMIT ?
LIMIT ? OFFSET ?
OFFSET ? )
) UNION
UNION (
( SELECT payment.payment_id AS "payment.payment_id"
SELECT payment.payment_id AS "payment.payment_id" FROM dvds.payment
FROM dvds.payment LIMIT ?
LIMIT ? OFFSET ?
OFFSET ?
)
) )
LIMIT ? LIMIT ?
) )
@ -223,19 +225,17 @@ LIMIT ?;
func TestSelectUNION(t *testing.T) { func TestSelectUNION(t *testing.T) {
expectedSQL := ` expectedSQL := `
( (
( SELECT payment.payment_id AS "payment.payment_id"
SELECT payment.payment_id AS "payment.payment_id" FROM dvds.payment
FROM dvds.payment LIMIT ?
LIMIT ? OFFSET ?
OFFSET ? )
) UNION
UNION (
( SELECT payment.payment_id AS "payment.payment_id"
SELECT payment.payment_id AS "payment.payment_id" FROM dvds.payment
FROM dvds.payment LIMIT ?
LIMIT ? OFFSET ?
OFFSET ?
)
) )
LIMIT ?; LIMIT ?;
` `
@ -260,19 +260,17 @@ LIMIT ?;
func TestSelectUNION_ALL(t *testing.T) { func TestSelectUNION_ALL(t *testing.T) {
expectedSQL := ` expectedSQL := `
( (
( SELECT payment.payment_id AS "payment.payment_id"
SELECT payment.payment_id AS "payment.payment_id" FROM dvds.payment
FROM dvds.payment LIMIT ?
LIMIT ? OFFSET ?
OFFSET ? )
) UNION ALL
UNION ALL (
( SELECT payment.payment_id AS "payment.payment_id"
SELECT payment.payment_id AS "payment.payment_id" FROM dvds.payment
FROM dvds.payment LIMIT ?
LIMIT ? OFFSET ?
OFFSET ?
)
) )
ORDER BY "payment.payment_id" ORDER BY "payment.payment_id"
LIMIT ? LIMIT ?
@ -408,6 +406,11 @@ LIMIT ?;
} }
func getRowLockTestData() map[SelectLock]string { func getRowLockTestData() map[SelectLock]string {
if sourceIsMariaDB() {
return map[SelectLock]string{
UPDATE(): "UPDATE",
}
}
return map[SelectLock]string{ return map[SelectLock]string{
UPDATE(): "UPDATE", UPDATE(): "UPDATE",
SHARE(): "SHARE", SHARE(): "SHARE",
@ -455,6 +458,10 @@ FOR`
assert.NilError(t, err) assert.NilError(t, err)
} }
if sourceIsMariaDB() {
return
}
for lockType, lockTypeStr := range getRowLockTestData() { for lockType, lockTypeStr := range getRowLockTestData() {
query.FOR(lockType.SKIP_LOCKED()) query.FOR(lockType.SKIP_LOCKED())
@ -496,3 +503,23 @@ SELECT true,
err := query.Query(db, &struct{}{}) err := query.Query(db, &struct{}{})
assert.NilError(t, err) assert.NilError(t, err)
} }
func TestLockInShareMode(t *testing.T) {
expectedSQL := `
SELECT *
FROM dvds.address
LIMIT 3
OFFSET 1
LOCK IN SHARE MODE;
`
query := Address.
SELECT(STAR).
LIMIT(3).
OFFSET(1).
LOCK_IN_SHARE_MODE()
testutils.AssertDebugStatementSql(t, query, expectedSQL)
err := query.Query(db, &struct{}{})
assert.NilError(t, err)
}

View file

@ -215,21 +215,19 @@ func TestUnionForQuotedNames(t *testing.T) {
//fmt.Println(stmt.DebugSql()) //fmt.Println(stmt.DebugSql())
testutils.AssertDebugStatementSql(t, stmt, ` testutils.AssertDebugStatementSql(t, stmt, `
( (
( SELECT "Album"."AlbumId" AS "Album.AlbumId",
SELECT "Album"."AlbumId" AS "Album.AlbumId", "Album"."Title" AS "Album.Title",
"Album"."Title" AS "Album.Title", "Album"."ArtistId" AS "Album.ArtistId"
"Album"."ArtistId" AS "Album.ArtistId" FROM chinook."Album"
FROM chinook."Album" WHERE "Album"."AlbumId" = 1
WHERE "Album"."AlbumId" = 1 )
) UNION ALL
UNION ALL (
( SELECT "Album"."AlbumId" AS "Album.AlbumId",
SELECT "Album"."AlbumId" AS "Album.AlbumId", "Album"."Title" AS "Album.Title",
"Album"."Title" AS "Album.Title", "Album"."ArtistId" AS "Album.ArtistId"
"Album"."ArtistId" AS "Album.ArtistId" FROM chinook."Album"
FROM chinook."Album" WHERE "Album"."AlbumId" = 2
WHERE "Album"."AlbumId" = 2
)
) )
ORDER BY "Album.AlbumId"; ORDER BY "Album.AlbumId";
`, int64(1), int64(2)) `, int64(1), int64(2))

View file

@ -128,19 +128,17 @@ SELECT payment.payment_id AS "payment.payment_id",
), ),
( (
( (
( SELECT payment.payment_id AS "payment.payment_id"
SELECT payment.payment_id AS "payment.payment_id" FROM dvds.payment
FROM dvds.payment LIMIT 1
LIMIT 1 OFFSET 10
OFFSET 10 )
) UNION
UNION (
( SELECT payment.payment_id AS "payment.payment_id"
SELECT payment.payment_id AS "payment.payment_id" FROM dvds.payment
FROM dvds.payment LIMIT 1
LIMIT 1 OFFSET 2
OFFSET 2
)
) )
LIMIT 1 LIMIT 1
) )
@ -1217,19 +1215,17 @@ ORDER BY payment.payment_date ASC;
func TestUnion(t *testing.T) { func TestUnion(t *testing.T) {
expectedQuery := ` expectedQuery := `
( (
( SELECT payment.payment_id AS "payment.payment_id",
SELECT payment.payment_id AS "payment.payment_id", payment.amount AS "payment.amount"
payment.amount AS "payment.amount" FROM dvds.payment
FROM dvds.payment WHERE payment.amount <= 100
WHERE payment.amount <= 100 )
) UNION ALL
UNION ALL (
( SELECT payment.payment_id AS "payment.payment_id",
SELECT payment.payment_id AS "payment.payment_id", payment.amount AS "payment.amount"
payment.amount AS "payment.amount" FROM dvds.payment
FROM dvds.payment WHERE payment.amount >= 200
WHERE payment.amount >= 200
)
) )
ORDER BY "payment.payment_id" ASC, "payment.amount" DESC ORDER BY "payment.payment_id" ASC, "payment.amount" DESC
LIMIT 10 LIMIT 10