diff --git a/internal/jet/cast.go b/internal/jet/cast.go index 4d1c0dd..9e7f277 100644 --- a/internal/jet/cast.go +++ b/internal/jet/cast.go @@ -76,8 +76,8 @@ func (b *castExpression) serialize(statement StatementType, out *SqlBuilder, opt expression := b.expression castType := b.cast - if castOverride := out.Dialect.CastOverride(); castOverride != nil { - return castOverride(expression, castType)(statement, out, options...) + if castOverride := out.Dialect.SerializeOverride("CAST"); castOverride != nil { + return castOverride(expression, String(castType))(statement, out, options...) } out.WriteString("CAST(") diff --git a/internal/jet/dialects.go b/internal/jet/dialects.go index 9f730b7..e85b818 100644 --- a/internal/jet/dialects.go +++ b/internal/jet/dialects.go @@ -18,7 +18,6 @@ type Dialect interface { Name() string PackageName() string SerializeOverride(operator string) SerializeOverride - CastOverride() CastOverride AliasQuoteChar() byte IdentifierQuoteChar() byte ArgumentPlaceholder() QueryPlaceholderFunc @@ -31,14 +30,12 @@ type SerializeOverride func(expressions ...Expression) SerializeFunc type QueryPlaceholderFunc func(ord int) string -type CastOverride func(expression Expression, castType string) SerializeFunc type UpdateAssigmentFunc func(columns []IColumn, values []Clause, out *SqlBuilder) (err error) type DialectParams struct { Name string PackageName string SerializeOverrides map[string]SerializeOverride - CastOverride CastOverride AliasQuoteChar byte IdentifierQuoteChar byte ArgumentPlaceholder QueryPlaceholderFunc @@ -52,7 +49,6 @@ func NewDialect(params DialectParams) Dialect { name: params.Name, packageName: params.PackageName, serializeOverrides: params.SerializeOverrides, - castOverride: params.CastOverride, aliasQuoteChar: params.AliasQuoteChar, identifierQuoteChar: params.IdentifierQuoteChar, argumentPlaceholder: params.ArgumentPlaceholder, @@ -65,7 +61,6 @@ type dialectImpl struct { name string packageName string serializeOverrides map[string]SerializeOverride - castOverride CastOverride aliasQuoteChar byte identifierQuoteChar byte argumentPlaceholder QueryPlaceholderFunc @@ -86,10 +81,6 @@ func (d *dialectImpl) SerializeOverride(operator string) SerializeOverride { return d.serializeOverrides[operator] } -func (d *dialectImpl) CastOverride() CastOverride { - return d.castOverride -} - func (d *dialectImpl) AliasQuoteChar() byte { return d.aliasQuoteChar } diff --git a/postgres/dialect.go b/postgres/dialect.go index f7e1ec3..0fbfba1 100644 --- a/postgres/dialect.go +++ b/postgres/dialect.go @@ -13,11 +13,11 @@ func NewDialect() jet.Dialect { serializeOverrides := map[string]jet.SerializeOverride{} serializeOverrides["REGEXP_LIKE"] = postgres_REGEXP_LIKE_function + serializeOverrides["CAST"] = postgresCAST dialectParams := jet.DialectParams{ Name: "PostgreSQL", PackageName: "postgres", - CastOverride: castFunc, SerializeOverrides: serializeOverrides, AliasQuoteChar: '"', IdentifierQuoteChar: '"', @@ -31,8 +31,26 @@ func NewDialect() jet.Dialect { return jet.NewDialect(dialectParams) } -func castFunc(expression jet.Expression, castType string) jet.SerializeFunc { +func postgresCAST(expressions ...jet.Expression) jet.SerializeFunc { return func(statement jet.StatementType, out *jet.SqlBuilder, options ...jet.SerializeOption) error { + if len(expressions) < 2 { + return errors.New("jet: invalid number of expressions for operator") + } + + expression := expressions[0] + + litExpr, ok := expressions[1].(jet.LiteralExpression) + + if !ok { + return errors.New("jet: cast invalid cast type") + } + + castType, ok := litExpr.Value().(string) + + if !ok { + return errors.New("jet: cast type is not string") + } + if err := jet.Serialize(expression, statement, out, options...); err != nil { return err }