on_conflict.go 1.3 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 onConflict.OnConstraint != "" {
  17. builder.WriteString("ON CONSTRAINT ")
  18. builder.WriteString(onConflict.OnConstraint)
  19. builder.WriteByte(' ')
  20. } else {
  21. if len(onConflict.Columns) > 0 {
  22. builder.WriteByte('(')
  23. for idx, column := range onConflict.Columns {
  24. if idx > 0 {
  25. builder.WriteByte(',')
  26. }
  27. builder.WriteQuoted(column)
  28. }
  29. builder.WriteString(`) `)
  30. }
  31. if len(onConflict.TargetWhere.Exprs) > 0 {
  32. builder.WriteString(" WHERE ")
  33. onConflict.TargetWhere.Build(builder)
  34. builder.WriteByte(' ')
  35. }
  36. }
  37. if onConflict.DoNothing {
  38. builder.WriteString("DO NOTHING")
  39. } else {
  40. builder.WriteString("DO UPDATE SET ")
  41. onConflict.DoUpdates.Build(builder)
  42. }
  43. if len(onConflict.Where.Exprs) > 0 {
  44. builder.WriteString(" WHERE ")
  45. onConflict.Where.Build(builder)
  46. builder.WriteByte(' ')
  47. }
  48. }
  49. // MergeClause merge onConflict clauses
  50. func (onConflict OnConflict) MergeClause(clause *Clause) {
  51. clause.Expression = onConflict
  52. }