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
@ -66,6 +69,7 @@ type selectStatementImpl struct {
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,6 +794,19 @@ LIMIT ?;
//testutils.PrintJson(dest) //testutils.PrintJson(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, ` testutils.AssertJSON(t, dest, `
{ {
"Date": "2009-11-17T00:00:00Z", "Date": "2009-11-17T00:00:00Z",
@ -801,6 +820,8 @@ LIMIT ?;
`) `)
} }
}
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",
( (
@ -181,7 +185,6 @@ SELECT payment.payment_id AS "payment.payment_id",
FROM dvds.customer FROM dvds.customer
LIMIT ? LIMIT ?
), ),
(
( (
( (
SELECT payment.payment_id AS "payment.payment_id" SELECT payment.payment_id AS "payment.payment_id"
@ -196,7 +199,6 @@ SELECT payment.payment_id AS "payment.payment_id",
LIMIT ? LIMIT ?
OFFSET ? OFFSET ?
) )
)
LIMIT ? LIMIT ?
) )
FROM dvds.payment FROM dvds.payment
@ -222,7 +224,6 @@ 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
@ -236,7 +237,6 @@ func TestSelectUNION(t *testing.T) {
LIMIT ? LIMIT ?
OFFSET ? OFFSET ?
) )
)
LIMIT ?; LIMIT ?;
` `
query := UNION( query := UNION(
@ -259,7 +259,6 @@ 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
@ -273,7 +272,6 @@ func TestSelectUNION_ALL(t *testing.T) {
LIMIT ? LIMIT ?
OFFSET ? OFFSET ?
) )
)
ORDER BY "payment.payment_id" ORDER BY "payment.payment_id"
LIMIT ? LIMIT ?
OFFSET ?; OFFSET ?;
@ -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

@ -214,7 +214,6 @@ 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",
@ -230,7 +229,6 @@ func TestUnionForQuotedNames(t *testing.T) {
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

@ -126,7 +126,6 @@ SELECT payment.payment_id AS "payment.payment_id",
FROM dvds.customer FROM dvds.customer
LIMIT 1 LIMIT 1
), ),
(
( (
( (
SELECT payment.payment_id AS "payment.payment_id" SELECT payment.payment_id AS "payment.payment_id"
@ -141,7 +140,6 @@ SELECT payment.payment_id AS "payment.payment_id",
LIMIT 1 LIMIT 1
OFFSET 2 OFFSET 2
) )
)
LIMIT 1 LIMIT 1
) )
FROM dvds.payment FROM dvds.payment
@ -1216,7 +1214,6 @@ 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"
@ -1230,7 +1227,6 @@ func TestUnion(t *testing.T) {
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
OFFSET 20; OFFSET 20;