jet/dialects.go

168 lines
4.1 KiB
Go
Raw Normal View History

package jet
import (
"github.com/pkg/errors"
"strconv"
)
var (
2019-07-31 18:43:54 +02:00
Default = MySQL
PostgreSQL = newPostgresDialect()
2019-07-29 18:08:53 +02:00
MySQL = newMySQLDialect()
)
func newPostgresDialect() Dialect {
postgresDialect := newDialect("PostgreSQL", "postgres")
postgresDialect.CastOverride = postgresCAST
postgresDialect.AliasQuoteChar = '"'
postgresDialect.IdentifierQuoteChar = '"'
postgresDialect.ArgumentPlaceholder = func(ord int) string {
return "$" + strconv.Itoa(ord)
}
return postgresDialect
}
func newMySQLDialect() Dialect {
mySQLDialect := newDialect("MySQL", "mysql")
2019-07-30 11:18:12 +02:00
mySQLDialect.SerializeOverrides["IS DISTINCT FROM"] = mysql_IS_DISTINCT_FROM
mySQLDialect.SerializeOverrides["IS NOT DISTINCT FROM"] = mysql_IS_NOT_DISTINCT_FROM
2019-07-31 13:02:30 +02:00
mySQLDialect.SerializeOverrides["/"] = mysql_DIVISION
mySQLDialect.SerializeOverrides["#"] = mysql_BIT_XOR
mySQLDialect.AliasQuoteChar = '"'
mySQLDialect.IdentifierQuoteChar = '"'
mySQLDialect.ArgumentPlaceholder = func(int) string {
return "?"
}
return mySQLDialect
}
type Dialect struct {
Name string
PackageName string
2019-07-30 11:18:12 +02:00
SerializeOverrides map[string]serializeOverride
CastOverride castOverride
AliasQuoteChar byte
IdentifierQuoteChar byte
ArgumentPlaceholder queryPlaceholderFunc
}
func (d *Dialect) serializeOverride(operator string) serializeOverride {
2019-07-30 11:18:12 +02:00
return d.SerializeOverrides[operator]
}
type queryPlaceholderFunc func(ord int) string
func newDialect(name, packageName string) Dialect {
newDialect := Dialect{
Name: name,
PackageName: packageName,
}
2019-07-30 11:18:12 +02:00
newDialect.SerializeOverrides = make(map[string]serializeOverride)
return newDialect
}
2019-07-31 13:02:30 +02:00
func mysql_BIT_XOR(expressions ...Expression) serializeFunc {
return func(statement statementType, out *sqlBuilder, options ...serializeOption) error {
if len(expressions) != 2 {
return errors.New("Invalid number of expressions for operator")
}
lhs := expressions[0]
rhs := expressions[1]
if err := lhs.serialize(statement, out, options...); err != nil {
return err
}
out.writeString("^")
if err := rhs.serialize(statement, out, options...); err != nil {
return err
}
return nil
}
}
func mysql_DIVISION(expressions ...Expression) serializeFunc {
return func(statement statementType, out *sqlBuilder, options ...serializeOption) error {
if len(expressions) != 2 {
return errors.New("Invalid number of expressions for operator")
}
lhs := expressions[0]
rhs := expressions[1]
if err := lhs.serialize(statement, out, options...); err != nil {
return err
}
_, isLhsInt := lhs.(IntegerExpression)
_, isRhsInt := rhs.(IntegerExpression)
if isLhsInt && isRhsInt {
out.writeString("DIV")
} else {
out.writeString("/")
}
if err := rhs.serialize(statement, out, options...); err != nil {
return err
}
return nil
}
}
2019-07-30 11:18:12 +02:00
func mysql_IS_NOT_DISTINCT_FROM(expressions ...Expression) serializeFunc {
return func(statement statementType, out *sqlBuilder, options ...serializeOption) error {
if len(expressions) != 2 {
return errors.New("Invalid number of expressions for operator")
}
if err := expressions[0].serialize(statement, out); err != nil {
return err
}
2019-07-30 11:18:12 +02:00
out.writeString("<=>")
if err := expressions[1].serialize(statement, out); err != nil {
return err
}
return nil
}
}
2019-07-30 11:18:12 +02:00
func mysql_IS_DISTINCT_FROM(expressions ...Expression) serializeFunc {
return func(statement statementType, out *sqlBuilder, options ...serializeOption) error {
out.writeString("NOT")
err := mysql_IS_NOT_DISTINCT_FROM(expressions...)(statement, out, options...)
if err != nil {
return err
}
return nil
}
}
func postgresCAST(expression Expression, castType string) serializeFunc {
return func(statement statementType, out *sqlBuilder, options ...serializeOption) error {
if err := expression.serialize(statement, out, options...); err != nil {
return err
}
out.writeString("::" + castType)
return nil
}
}
type serializeFunc func(statement statementType, out *sqlBuilder, options ...serializeOption) error
type serializeOverride func(expressions ...Expression) serializeFunc
type castOverride func(expression Expression, castType string) serializeFunc