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")
}
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 {
out.NewLine()
if i > 0 {
@ -210,12 +202,6 @@ func (s *ClauseSetStmtOperator) Serialize(statementType StatementType, out *SqlB
selectStmt.serialize(statementType, out)
}
if wrap {
out.DecreaseIdent()
out.NewLine()
out.WriteString(")")
}
s.OrderBy.Serialize(statementType, out)
s.Limit.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 {
Name string
Show bool
InNewLine bool
}
func (d *ClauseOptional) Serialize(statementType StatementType, out *SqlBuilder) {
if !d.Show {
return
}
if d.InNewLine {
out.NewLine()
}
out.WriteString(d.Name)
}

View file

@ -23,6 +23,7 @@ type SelectStatement interface {
LIMIT(limit int64) SelectStatement
OFFSET(offset int64) SelectStatement
FOR(lock SelectLock) SelectStatement
LOCK_IN_SHARE_MODE() SelectStatement
UNION(rhs SelectStatement) SetStatement
UNION_ALL(rhs SelectStatement) SetStatement
@ -39,7 +40,7 @@ func newSelectStatement(table ReadableTable, projections []jet.Projection) Selec
newSelect := &selectStatementImpl{}
newSelect.ExpressionStatementImpl.StatementImpl = jet.NewStatementImpl(Dialect, jet.SelectStatementType, newSelect, &newSelect.Select,
&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
@ -47,6 +48,8 @@ func newSelectStatement(table ReadableTable, projections []jet.Projection) Selec
newSelect.From.Table = table
newSelect.Limit.Count = -1
newSelect.Offset.Count = -1
newSelect.ShareLock.Name = "LOCK IN SHARE MODE"
newSelect.ShareLock.InNewLine = true
newSelect.setOperatorsImpl.parent = newSelect
@ -66,6 +69,7 @@ type selectStatementImpl struct {
Limit jet.ClauseLimit
Offset jet.ClauseOffset
For jet.ClauseFor
ShareLock jet.ClauseOptional
}
func (s *selectStatementImpl) DISTINCT() SelectStatement {
@ -113,6 +117,11 @@ func (s *selectStatementImpl) FOR(lock SelectLock) SelectStatement {
return s
}
func (s *selectStatementImpl) LOCK_IN_SHARE_MODE() SelectStatement {
s.ShareLock.Show = true
return s
}
func (s *selectStatementImpl) AsTable(alias string) SelectTable {
return newSelectTable(s, alias)
}

View file

@ -124,3 +124,11 @@ FROM db.table1
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.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.AssertJSON(t, dest, allTypesJson)
}
@ -788,6 +794,19 @@ LIMIT ?;
//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, `
{
"Date": "2009-11-17T00:00:00Z",
@ -799,6 +818,8 @@ LIMIT ?;
"TimestampT": "2009-11-17T19:34:58.351387Z"
}
`)
}
}
var allTypesJson = `

View file

@ -2,6 +2,7 @@ package mysql
import (
"database/sql"
"flag"
"github.com/go-jet/jet/tests/dbconfig"
_ "github.com/go-sql-driver/mysql"
@ -13,6 +14,19 @@ import (
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) {
defer profile.Start().Stop()

View file

@ -174,6 +174,10 @@ func TestSubQuery(t *testing.T) {
}
func TestSelectAndUnionInProjection(t *testing.T) {
if sourceIsMariaDB() {
return
}
expectedSQL := `
SELECT payment.payment_id AS "payment.payment_id",
(
@ -181,7 +185,6 @@ SELECT payment.payment_id AS "payment.payment_id",
FROM dvds.customer
LIMIT ?
),
(
(
(
SELECT payment.payment_id AS "payment.payment_id"
@ -196,7 +199,6 @@ SELECT payment.payment_id AS "payment.payment_id",
LIMIT ?
OFFSET ?
)
)
LIMIT ?
)
FROM dvds.payment
@ -223,19 +225,17 @@ LIMIT ?;
func TestSelectUNION(t *testing.T) {
expectedSQL := `
(
(
SELECT payment.payment_id AS "payment.payment_id"
FROM dvds.payment
LIMIT ?
OFFSET ?
)
UNION
(
)
UNION
(
SELECT payment.payment_id AS "payment.payment_id"
FROM dvds.payment
LIMIT ?
OFFSET ?
)
)
LIMIT ?;
`
@ -260,19 +260,17 @@ LIMIT ?;
func TestSelectUNION_ALL(t *testing.T) {
expectedSQL := `
(
(
SELECT payment.payment_id AS "payment.payment_id"
FROM dvds.payment
LIMIT ?
OFFSET ?
)
UNION ALL
(
)
UNION ALL
(
SELECT payment.payment_id AS "payment.payment_id"
FROM dvds.payment
LIMIT ?
OFFSET ?
)
)
ORDER BY "payment.payment_id"
LIMIT ?
@ -408,6 +406,11 @@ LIMIT ?;
}
func getRowLockTestData() map[SelectLock]string {
if sourceIsMariaDB() {
return map[SelectLock]string{
UPDATE(): "UPDATE",
}
}
return map[SelectLock]string{
UPDATE(): "UPDATE",
SHARE(): "SHARE",
@ -455,6 +458,10 @@ FOR`
assert.NilError(t, err)
}
if sourceIsMariaDB() {
return
}
for lockType, lockTypeStr := range getRowLockTestData() {
query.FOR(lockType.SKIP_LOCKED())
@ -496,3 +503,23 @@ SELECT true,
err := query.Query(db, &struct{}{})
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())
testutils.AssertDebugStatementSql(t, stmt, `
(
(
SELECT "Album"."AlbumId" AS "Album.AlbumId",
"Album"."Title" AS "Album.Title",
"Album"."ArtistId" AS "Album.ArtistId"
FROM chinook."Album"
WHERE "Album"."AlbumId" = 1
)
UNION ALL
(
)
UNION ALL
(
SELECT "Album"."AlbumId" AS "Album.AlbumId",
"Album"."Title" AS "Album.Title",
"Album"."ArtistId" AS "Album.ArtistId"
FROM chinook."Album"
WHERE "Album"."AlbumId" = 2
)
)
ORDER BY "Album.AlbumId";
`, int64(1), int64(2))

View file

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