on_conflict.go 903 B

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