jet/mysql/dialect.go

109 lines
2.9 KiB
Go
Raw Normal View History

2019-08-03 14:10:47 +02:00
package mysql
import (
"github.com/go-jet/jet/internal/jet"
)
var Dialect = NewDialect()
func NewDialect() jet.Dialect {
serializeOverrides := map[string]jet.SerializeOverride{}
serializeOverrides["IS DISTINCT FROM"] = mysql_IS_DISTINCT_FROM
serializeOverrides["IS NOT DISTINCT FROM"] = mysql_IS_NOT_DISTINCT_FROM
serializeOverrides["/"] = mysql_DIVISION
serializeOverrides["#"] = mysql_BIT_XOR
serializeOverrides[jet.StringConcatOperator] = mysql_CONCAT_operator
2019-08-03 14:10:47 +02:00
mySQLDialectParams := jet.DialectParams{
Name: "MySQL",
PackageName: "mysql",
SerializeOverrides: serializeOverrides,
AliasQuoteChar: '"',
IdentifierQuoteChar: '`',
ArgumentPlaceholder: func(int) string {
return "?"
},
}
return jet.NewDialect(mySQLDialectParams)
}
func mysql_BIT_XOR(expressions ...jet.Expression) jet.SerializeFunc {
return func(statement jet.StatementType, out *jet.SqlBuilder, options ...jet.SerializeOption) {
if len(expressions) != 2 {
panic("jet: invalid number of expressions for operator XOR")
}
2019-08-03 14:10:47 +02:00
lhs := expressions[0]
rhs := expressions[1]
2019-08-03 14:10:47 +02:00
jet.Serialize(lhs, statement, out, options...)
2019-08-03 14:10:47 +02:00
out.WriteString("^")
2019-08-03 14:10:47 +02:00
jet.Serialize(rhs, statement, out, options...)
2019-08-03 14:10:47 +02:00
}
}
func mysql_CONCAT_operator(expressions ...jet.Expression) jet.SerializeFunc {
return func(statement jet.StatementType, out *jet.SqlBuilder, options ...jet.SerializeOption) {
2019-08-03 14:10:47 +02:00
if len(expressions) != 2 {
panic("jet: invalid number of expressions for operator CONCAT")
2019-08-03 14:10:47 +02:00
}
out.WriteString("CONCAT(")
2019-08-03 14:10:47 +02:00
jet.Serialize(expressions[0], statement, out, options...)
2019-08-03 14:10:47 +02:00
out.WriteString(", ")
2019-08-03 14:10:47 +02:00
jet.Serialize(expressions[1], statement, out, options...)
out.WriteString(")")
2019-08-03 14:10:47 +02:00
}
}
func mysql_DIVISION(expressions ...jet.Expression) jet.SerializeFunc {
return func(statement jet.StatementType, out *jet.SqlBuilder, options ...jet.SerializeOption) {
2019-08-03 14:10:47 +02:00
if len(expressions) != 2 {
panic("jet: invalid number of expressions for operator DIV")
2019-08-03 14:10:47 +02:00
}
lhs := expressions[0]
rhs := expressions[1]
jet.Serialize(lhs, statement, out, options...)
2019-08-03 14:10:47 +02:00
_, isLhsInt := lhs.(IntegerExpression)
_, isRhsInt := rhs.(IntegerExpression)
if isLhsInt && isRhsInt {
out.WriteString("DIV")
} else {
out.WriteString("/")
}
jet.Serialize(rhs, statement, out, options...)
2019-08-03 14:10:47 +02:00
}
}
func mysql_IS_NOT_DISTINCT_FROM(expressions ...jet.Expression) jet.SerializeFunc {
return func(statement jet.StatementType, out *jet.SqlBuilder, options ...jet.SerializeOption) {
2019-08-03 14:10:47 +02:00
if len(expressions) != 2 {
panic("jet: invalid number of expressions for operator")
2019-08-03 14:10:47 +02:00
}
jet.Serialize(expressions[0], statement, out)
2019-08-03 14:10:47 +02:00
out.WriteString("<=>")
jet.Serialize(expressions[1], statement, out)
2019-08-03 14:10:47 +02:00
}
}
func mysql_IS_DISTINCT_FROM(expressions ...jet.Expression) jet.SerializeFunc {
return func(statement jet.StatementType, out *jet.SqlBuilder, options ...jet.SerializeOption) {
out.WriteString("NOT(")
mysql_IS_NOT_DISTINCT_FROM(expressions...)(statement, out, options...)
out.WriteString(")")
2019-08-03 14:10:47 +02:00
}
}