on_conflict.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package clause
  2. type OnConflict struct {
  3. Columns []Column
  4. Where Where
  5. TargetWhere Where
  6. OnConstraint string
  7. DoNothing bool
  8. DoUpdates Set
  9. UpdateAll bool
  10. }
  11. func (OnConflict) Name() string {
  12. return "ON CONFLICT"
  13. }
  14. // Build build onConflict clause
  15. func (onConflict OnConflict) Build(builder Builder) {
  16. if len(onConflict.Columns) > 0 {
  17. builder.WriteByte('(')
  18. for idx, column := range onConflict.Columns {
  19. if idx > 0 {
  20. builder.WriteByte(',')
  21. }
  22. builder.WriteQuoted(column)
  23. }
  24. builder.WriteString(`) `)
  25. }
  26. if len(onConflict.TargetWhere.Exprs) > 0 {
  27. builder.WriteString(" WHERE ")
  28. onConflict.TargetWhere.Build(builder)
  29. builder.WriteByte(' ')
  30. }
  31. if onConflict.OnConstraint != "" {
  32. builder.WriteString("ON CONSTRAINT ")
  33. builder.WriteString(onConflict.OnConstraint)
  34. builder.WriteByte(' ')
  35. }
  36. if onConflict.DoNothing {
  37. builder.WriteString("DO NOTHING")
  38. } else {
  39. builder.WriteString("DO UPDATE SET ")
  40. onConflict.DoUpdates.Build(builder)
  41. }
  42. if len(onConflict.Where.Exprs) > 0 {
  43. builder.WriteString(" WHERE ")
  44. onConflict.Where.Build(builder)
  45. builder.WriteByte(' ')
  46. }
  47. }
  48. // MergeClause merge onConflict clauses
  49. func (onConflict OnConflict) MergeClause(clause *Clause) {
  50. clause.Expression = onConflict
  51. }