...
1 package sqlgen
2
3 import (
4 "github.com/doug-martin/goqu/v9/exp"
5 "github.com/doug-martin/goqu/v9/internal/errors"
6 "github.com/doug-martin/goqu/v9/internal/sb"
7 )
8
9 type (
10
11
12 DeleteSQLGenerator interface {
13 Dialect() string
14 Generate(b sb.SQLBuilder, clauses exp.DeleteClauses)
15 }
16
17
18
19 deleteSQLGenerator struct {
20 CommonSQLGenerator
21 }
22 )
23
24 var ErrNoSourceForDelete = errors.New("no source found when generating delete sql")
25
26 func NewDeleteSQLGenerator(dialect string, do *SQLDialectOptions) DeleteSQLGenerator {
27 return &deleteSQLGenerator{NewCommonSQLGenerator(dialect, do)}
28 }
29
30 func (dsg *deleteSQLGenerator) Generate(b sb.SQLBuilder, clauses exp.DeleteClauses) {
31 if !clauses.HasFrom() {
32 b.SetError(ErrNoSourceForDelete)
33 return
34 }
35 for _, f := range dsg.DialectOptions().DeleteSQLOrder {
36 if b.Error() != nil {
37 return
38 }
39 switch f {
40 case CommonTableSQLFragment:
41 dsg.ExpressionSQLGenerator().Generate(b, clauses.CommonTables())
42 case DeleteBeginSQLFragment:
43 dsg.DeleteBeginSQL(
44 b, exp.NewColumnListExpression(clauses.From()), !(clauses.HasLimit() || clauses.HasOrder()),
45 )
46 case FromSQLFragment:
47 dsg.FromSQL(b, exp.NewColumnListExpression(clauses.From()))
48 case WhereSQLFragment:
49 dsg.WhereSQL(b, clauses.Where())
50 case OrderSQLFragment:
51 if dsg.DialectOptions().SupportsOrderByOnDelete {
52 dsg.OrderSQL(b, clauses.Order())
53 }
54 case LimitSQLFragment:
55 if dsg.DialectOptions().SupportsLimitOnDelete {
56 dsg.LimitSQL(b, clauses.Limit())
57 }
58 case ReturningSQLFragment:
59 dsg.ReturningSQL(b, clauses.Returning())
60 default:
61 b.SetError(ErrNotSupportedFragment("DELETE", f))
62 }
63 }
64 }
65
66
67 func (dsg *deleteSQLGenerator) DeleteBeginSQL(b sb.SQLBuilder, from exp.ColumnListExpression, multiTable bool) {
68 b.Write(dsg.DialectOptions().DeleteClause)
69 if multiTable && dsg.DialectOptions().SupportsDeleteTableHint {
70 dsg.SourcesSQL(b, from)
71 }
72 }
73
View as plain text