MariaDB tests fix.

This commit is contained in:
go-jet 2019-08-15 13:54:05 +02:00
parent ec462dce81
commit e0a1eff493
14 changed files with 108 additions and 68 deletions

View file

@ -39,7 +39,7 @@ func (b *castExpression) serialize(statement StatementType, out *SqlBuilder, opt
expression := b.expression expression := b.expression
castType := b.cast castType := b.cast
if castOverride := out.Dialect.SerializeOverride("CAST"); castOverride != nil { if castOverride := out.Dialect.OperatorSerializeOverride("CAST"); castOverride != nil {
castOverride(expression, String(castType))(statement, out, options...) castOverride(expression, String(castType))(statement, out, options...)
return return
} }

View file

@ -3,7 +3,8 @@ package jet
type Dialect interface { type Dialect interface {
Name() string Name() string
PackageName() string PackageName() string
SerializeOverride(operator string) SerializeOverride OperatorSerializeOverride(operator string) SerializeOverride
FunctionSerializeOverride(function string) SerializeOverride
AliasQuoteChar() byte AliasQuoteChar() byte
IdentifierQuoteChar() byte IdentifierQuoteChar() byte
ArgumentPlaceholder() QueryPlaceholderFunc ArgumentPlaceholder() QueryPlaceholderFunc
@ -16,7 +17,8 @@ type QueryPlaceholderFunc func(ord int) string
type DialectParams struct { type DialectParams struct {
Name string Name string
PackageName string PackageName string
SerializeOverrides map[string]SerializeOverride OperatorSerializeOverrides map[string]SerializeOverride
FunctionSerializeOverrides map[string]SerializeOverride
AliasQuoteChar byte AliasQuoteChar byte
IdentifierQuoteChar byte IdentifierQuoteChar byte
ArgumentPlaceholder QueryPlaceholderFunc ArgumentPlaceholder QueryPlaceholderFunc
@ -26,7 +28,8 @@ func NewDialect(params DialectParams) Dialect {
return &dialectImpl{ return &dialectImpl{
name: params.Name, name: params.Name,
packageName: params.PackageName, packageName: params.PackageName,
serializeOverrides: params.SerializeOverrides, operatorSerializeOverrides: params.OperatorSerializeOverrides,
functionSerializeOverrides: params.FunctionSerializeOverrides,
aliasQuoteChar: params.AliasQuoteChar, aliasQuoteChar: params.AliasQuoteChar,
identifierQuoteChar: params.IdentifierQuoteChar, identifierQuoteChar: params.IdentifierQuoteChar,
argumentPlaceholder: params.ArgumentPlaceholder, argumentPlaceholder: params.ArgumentPlaceholder,
@ -36,7 +39,8 @@ func NewDialect(params DialectParams) Dialect {
type dialectImpl struct { type dialectImpl struct {
name string name string
packageName string packageName string
serializeOverrides map[string]SerializeOverride operatorSerializeOverrides map[string]SerializeOverride
functionSerializeOverrides map[string]SerializeOverride
aliasQuoteChar byte aliasQuoteChar byte
identifierQuoteChar byte identifierQuoteChar byte
argumentPlaceholder QueryPlaceholderFunc argumentPlaceholder QueryPlaceholderFunc
@ -52,8 +56,18 @@ func (d *dialectImpl) PackageName() string {
return d.packageName return d.packageName
} }
func (d *dialectImpl) SerializeOverride(operator string) SerializeOverride { func (d *dialectImpl) OperatorSerializeOverride(operator string) SerializeOverride {
return d.serializeOverrides[operator] if d.operatorSerializeOverrides == nil {
return nil
}
return d.operatorSerializeOverrides[operator]
}
func (d *dialectImpl) FunctionSerializeOverride(function string) SerializeOverride {
if d.functionSerializeOverrides == nil {
return nil
}
return d.functionSerializeOverrides[function]
} }
func (d *dialectImpl) AliasQuoteChar() byte { func (d *dialectImpl) AliasQuoteChar() byte {

View file

@ -110,7 +110,7 @@ func (c *binaryOpExpression) serialize(statement StatementType, out *SqlBuilder,
out.WriteString("(") out.WriteString("(")
} }
if serializeOverride := out.Dialect.SerializeOverride(c.operator); serializeOverride != nil { if serializeOverride := out.Dialect.OperatorSerializeOverride(c.operator); serializeOverride != nil {
serializeOverrideFunc := serializeOverride(c.lhs, c.rhs, c.additionalParam) serializeOverrideFunc := serializeOverride(c.lhs, c.rhs, c.additionalParam)
serializeOverrideFunc(statement, out, options...) serializeOverrideFunc(statement, out, options...)
} else { } else {

View file

@ -505,7 +505,7 @@ func newFunc(name string, expressions []Expression, parent Expression) *funcExpr
} }
func (f *funcExpressionImpl) serialize(statement StatementType, out *SqlBuilder, options ...SerializeOption) { func (f *funcExpressionImpl) serialize(statement StatementType, out *SqlBuilder, options ...SerializeOption) {
if serializeOverride := out.Dialect.SerializeOverride(f.name); serializeOverride != nil { if serializeOverride := out.Dialect.FunctionSerializeOverride(f.name); serializeOverride != nil {
serializeOverrideFunc := serializeOverride(f.expressions...) serializeOverrideFunc := serializeOverride(f.expressions...)
serializeOverrideFunc(statement, out, options...) serializeOverrideFunc(statement, out, options...)
return return

View file

@ -3,7 +3,7 @@ package mysql
import "github.com/go-jet/jet/internal/jet" import "github.com/go-jet/jet/internal/jet"
type DeleteStatement interface { type DeleteStatement interface {
jet.Statement Statement
WHERE(expression BoolExpression) DeleteStatement WHERE(expression BoolExpression) DeleteStatement
ORDER_BY(orderByClauses ...jet.OrderByClause) DeleteStatement ORDER_BY(orderByClauses ...jet.OrderByClause) DeleteStatement

View file

@ -8,19 +8,19 @@ var Dialect = NewDialect()
func NewDialect() jet.Dialect { func NewDialect() jet.Dialect {
serializeOverrides := map[string]jet.SerializeOverride{} operatorSerializeOverrides := map[string]jet.SerializeOverride{}
serializeOverrides[jet.StringRegexpLikeOperator] = mysql_REGEXP_LIKE_operator operatorSerializeOverrides[jet.StringRegexpLikeOperator] = mysql_REGEXP_LIKE_operator
serializeOverrides[jet.StringNotRegexpLikeOperator] = mysql_NOT_REGEXP_LIKE_operator operatorSerializeOverrides[jet.StringNotRegexpLikeOperator] = mysql_NOT_REGEXP_LIKE_operator
serializeOverrides["IS DISTINCT FROM"] = mysql_IS_DISTINCT_FROM operatorSerializeOverrides["IS DISTINCT FROM"] = mysql_IS_DISTINCT_FROM
serializeOverrides["IS NOT DISTINCT FROM"] = mysql_IS_NOT_DISTINCT_FROM operatorSerializeOverrides["IS NOT DISTINCT FROM"] = mysql_IS_NOT_DISTINCT_FROM
serializeOverrides["/"] = mysql_DIVISION operatorSerializeOverrides["/"] = mysql_DIVISION
serializeOverrides["#"] = mysql_BIT_XOR operatorSerializeOverrides["#"] = mysql_BIT_XOR
serializeOverrides[jet.StringConcatOperator] = mysql_CONCAT_operator operatorSerializeOverrides[jet.StringConcatOperator] = mysql_CONCAT_operator
mySQLDialectParams := jet.DialectParams{ mySQLDialectParams := jet.DialectParams{
Name: "MySQL", Name: "MySQL",
PackageName: "mysql", PackageName: "mysql",
SerializeOverrides: serializeOverrides, OperatorSerializeOverrides: operatorSerializeOverrides,
AliasQuoteChar: '"', AliasQuoteChar: '"',
IdentifierQuoteChar: '`', IdentifierQuoteChar: '`',
ArgumentPlaceholder: func(int) string { ArgumentPlaceholder: func(int) string {

View file

@ -30,7 +30,3 @@ var DateTimeExp = jet.TimestampExp
var TimestampExp = jet.TimestampExp var TimestampExp = jet.TimestampExp
var Raw = jet.Raw var Raw = jet.Raw
var NewEnumValue = jet.NewEnumValue
type Statement jet.Statement

View file

@ -4,7 +4,7 @@ import "github.com/go-jet/jet/internal/jet"
// InsertStatement is interface for SQL INSERT statements // InsertStatement is interface for SQL INSERT statements
type InsertStatement interface { type InsertStatement interface {
jet.Statement Statement
// Insert row of values // Insert row of values
VALUES(value interface{}, values ...interface{}) InsertStatement VALUES(value interface{}, values ...interface{}) InsertStatement

View file

@ -10,9 +10,9 @@ var (
) )
type SelectStatement interface { type SelectStatement interface {
jet.Statement Statement
jet.HasProjections jet.HasProjections
jet.Expression Expression
DISTINCT() SelectStatement DISTINCT() SelectStatement
FROM(table ReadableTable) SelectStatement FROM(table ReadableTable) SelectStatement
@ -32,11 +32,21 @@ type SelectStatement interface {
} }
//SELECT creates new SelectStatement with list of projections //SELECT creates new SelectStatement with list of projections
func SELECT(projection jet.Projection, projections ...jet.Projection) SelectStatement { func SELECT(projection Projection, projections ...Projection) SelectStatement {
return newSelectStatement(nil, append([]jet.Projection{projection}, projections...)) return newSelectStatement(nil, append([]Projection{projection}, projections...))
} }
func newSelectStatement(table ReadableTable, projections []jet.Projection) SelectStatement { func toJetProjectionList(projections []Projection) []jet.Projection {
ret := []jet.Projection{}
for _, projection := range projections {
ret = append(ret, projection)
}
return ret
}
func newSelectStatement(table ReadableTable, projections []Projection) SelectStatement {
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,
@ -44,7 +54,7 @@ func newSelectStatement(table ReadableTable, projections []jet.Projection) Selec
newSelect.ExpressionStatementImpl.ExpressionInterfaceImpl.Parent = newSelect newSelect.ExpressionStatementImpl.ExpressionInterfaceImpl.Parent = newSelect
newSelect.Select.Projections = projections newSelect.Select.Projections = toJetProjectionList(projections)
newSelect.From.Table = table newSelect.From.Table = table
newSelect.Limit.Count = -1 newSelect.Limit.Count = -1
newSelect.Offset.Count = -1 newSelect.Offset.Count = -1

View file

@ -14,7 +14,7 @@ type Table interface {
type readableTable interface { type readableTable interface {
// Generates a select query on the current tableName. // Generates a select query on the current tableName.
SELECT(projection jet.Projection, projections ...jet.Projection) SelectStatement SELECT(projection Projection, projections ...Projection) SelectStatement
// Creates a inner join tableName Expression using onCondition. // Creates a inner join tableName Expression using onCondition.
INNER_JOIN(table ReadableTable, onCondition BoolExpression) joinSelectUpdateTable INNER_JOIN(table ReadableTable, onCondition BoolExpression) joinSelectUpdateTable
@ -47,8 +47,8 @@ type readableTableInterfaceImpl struct {
} }
// Generates a select query on the current tableName. // Generates a select query on the current tableName.
func (r *readableTableInterfaceImpl) SELECT(projection1 jet.Projection, projections ...jet.Projection) SelectStatement { func (r *readableTableInterfaceImpl) SELECT(projection1 Projection, projections ...Projection) SelectStatement {
return newSelectStatement(r.parent, append([]jet.Projection{projection1}, projections...)) return newSelectStatement(r.parent, append([]Projection{projection1}, projections...))
} }
// Creates a inner join tableName Expression using onCondition. // Creates a inner join tableName Expression using onCondition.

8
mysql/types.go Normal file
View file

@ -0,0 +1,8 @@
package mysql
import "github.com/go-jet/jet/internal/jet"
type Statement jet.Statement
type Projection jet.Projection
var NewEnumValue = jet.NewEnumValue

View file

@ -9,15 +9,15 @@ var Dialect = NewDialect()
func NewDialect() jet.Dialect { func NewDialect() jet.Dialect {
serializeOverrides := map[string]jet.SerializeOverride{} operatorSerializeOverrides := map[string]jet.SerializeOverride{}
serializeOverrides[jet.StringRegexpLikeOperator] = postgres_REGEXP_LIKE_operator operatorSerializeOverrides[jet.StringRegexpLikeOperator] = postgres_REGEXP_LIKE_operator
serializeOverrides[jet.StringNotRegexpLikeOperator] = postgres_NOT_REGEXP_LIKE_operator operatorSerializeOverrides[jet.StringNotRegexpLikeOperator] = postgres_NOT_REGEXP_LIKE_operator
serializeOverrides["CAST"] = postgresCAST operatorSerializeOverrides["CAST"] = postgresCAST
dialectParams := jet.DialectParams{ dialectParams := jet.DialectParams{
Name: "PostgreSQL", Name: "PostgreSQL",
PackageName: "postgres", PackageName: "postgres",
SerializeOverrides: serializeOverrides, OperatorSerializeOverrides: operatorSerializeOverrides,
AliasQuoteChar: '"', AliasQuoteChar: '"',
IdentifierQuoteChar: '"', IdentifierQuoteChar: '"',
ArgumentPlaceholder: func(ord int) string { ArgumentPlaceholder: func(ord int) string {

View file

@ -433,7 +433,8 @@ LIMIT ?;
} }
func TestStringOperators(t *testing.T) { func TestStringOperators(t *testing.T) {
query := AllTypes.SELECT(
var projectionList = []Projection{
AllTypes.Text.EQ(AllTypes.Char), AllTypes.Text.EQ(AllTypes.Char),
AllTypes.Text.EQ(String("Text")), AllTypes.Text.EQ(String("Text")),
AllTypes.Text.NOT_EQ(AllTypes.VarCharPtr), AllTypes.Text.NOT_EQ(AllTypes.VarCharPtr),
@ -478,17 +479,24 @@ func TestStringOperators(t *testing.T) {
REVERSE(AllTypes.VarCharPtr), REVERSE(AllTypes.VarCharPtr),
SUBSTR(AllTypes.CharPtr, Int(3)), SUBSTR(AllTypes.CharPtr, Int(3)),
SUBSTR(AllTypes.CharPtr, Int(3), Int(2)), SUBSTR(AllTypes.CharPtr, Int(3), Int(2)),
}
if !sourceIsMariaDB() {
projectionList = append(projectionList, []Projection{
REGEXP_LIKE(String("ABA"), String("aba")), REGEXP_LIKE(String("ABA"), String("aba")),
REGEXP_LIKE(String("ABA"), String("aba"), "i"), REGEXP_LIKE(String("ABA"), String("aba"), "i"),
REGEXP_LIKE(AllTypes.Text, String("aba"), "i"), REGEXP_LIKE(AllTypes.Text, String("aba"), "i"),
) }...)
}
//_, args, _ := query.Sql() //_, args, _ := query.Sql()
//fmt.Println(query.Sql()) //fmt.Println(query.Sql())
//fmt.Println(args[15]) //fmt.Println(args[15])
// fmt.Println(query.Sql()) query := SELECT(projectionList[0], projectionList[1:]...).
FROM(AllTypes)
fmt.Println(query.DebugSql())
err := query.Query(db, &struct{}{}) err := query.Query(db, &struct{}{})
@ -765,7 +773,7 @@ func TestTimeLiterals(t *testing.T) {
TimestampT(timeT).AS("timestampT"), TimestampT(timeT).AS("timestampT"),
).FROM(AllTypes).LIMIT(1) ).FROM(AllTypes).LIMIT(1)
fmt.Println(query.DebugSql()) //fmt.Println(query.DebugSql())
testutils.AssertStatementSql(t, query, ` testutils.AssertStatementSql(t, query, `
SELECT CAST(? AS DATE) AS "date", SELECT CAST(? AS DATE) AS "date",

View file

@ -69,6 +69,10 @@ ORDER BY actor.actor_id;
} }
func TestSelectGroupByHaving(t *testing.T) { func TestSelectGroupByHaving(t *testing.T) {
if sourceIsMariaDB() {
return
}
expectedSQL := ` expectedSQL := `
SELECT customer.customer_id AS "customer.customer_id", SELECT customer.customer_id AS "customer.customer_id",
customer.store_id AS "customer.store_id", customer.store_id AS "customer.store_id",