diff --git a/cmd/jet/version.go b/cmd/jet/version.go index 051263b..3300008 100644 --- a/cmd/jet/version.go +++ b/cmd/jet/version.go @@ -1,3 +1,3 @@ package main -const version = "v2.10.1" +const version = "v2.11.1" diff --git a/postgres/clause.go b/postgres/clause.go index b5b121e..3025c5b 100644 --- a/postgres/clause.go +++ b/postgres/clause.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/go-jet/jet/v2/internal/jet" + "github.com/go-jet/jet/v2/internal/utils/is" ) type onConflict interface { @@ -44,7 +45,7 @@ func (o *onConflictClause) DO_UPDATE(action conflictAction) InsertStatement { } func (o *onConflictClause) Serialize(statementType jet.StatementType, out *jet.SQLBuilder, options ...jet.SerializeOption) { - if len(o.indexExpressions) == 0 && o.constraint == "" && o.do != jet.Keyword("DO NOTHING") { + if is.Nil(o.do) { return } diff --git a/sqlite/on_conflict_clause.go b/sqlite/on_conflict_clause.go index 1e2ec8f..e867a6f 100644 --- a/sqlite/on_conflict_clause.go +++ b/sqlite/on_conflict_clause.go @@ -2,6 +2,7 @@ package sqlite import ( "github.com/go-jet/jet/v2/internal/jet" + "github.com/go-jet/jet/v2/internal/utils/is" ) type onConflict interface { @@ -37,7 +38,7 @@ func (o *onConflictClause) DO_UPDATE(action conflictAction) InsertStatement { } func (o *onConflictClause) Serialize(statementType jet.StatementType, out *jet.SQLBuilder, options ...jet.SerializeOption) { - if len(o.indexExpressions) == 0 && o.do == nil { + if is.Nil(o.do) { return } diff --git a/tests/postgres/insert_test.go b/tests/postgres/insert_test.go index e34405e..a079091 100644 --- a/tests/postgres/insert_test.go +++ b/tests/postgres/insert_test.go @@ -87,6 +87,24 @@ func TestInsertOnConflict(t *testing.T) { t.Run("do nothing", func(t *testing.T) { employee := model.Employee{EmployeeID: rand.Int31()} + stmt := Employee.INSERT(Employee.AllColumns). + MODEL(employee). + MODEL(employee). + ON_CONFLICT().DO_NOTHING() + + testutils.AssertStatementSql(t, stmt, ` +INSERT INTO test_sample.employee (employee_id, first_name, last_name, employment_date, manager_id) +VALUES ($1, $2, $3, $4, $5), + ($6, $7, $8, $9, $10) +ON CONFLICT DO NOTHING; +`) + testutils.AssertExecAndRollback(t, stmt, db, 1) + requireLogged(t, stmt) + }) + + t.Run("do nothing with index", func(t *testing.T) { + employee := model.Employee{EmployeeID: rand.Int31()} + stmt := Employee.INSERT(Employee.AllColumns). MODEL(employee). MODEL(employee). @@ -207,6 +225,21 @@ ON CONFLICT (id) WHERE (id * 2) > 10 DO UPDATE testutils.AssertExecAndRollback(t, stmt, db, 1) }) + + t.Run("nil action removes ON CONFLICT clause", func(t *testing.T) { + employee := model.Employee{EmployeeID: rand.Int31()} + + stmt := Employee.INSERT(Employee.AllColumns). + MODEL(employee). + ON_CONFLICT().DO_UPDATE(nil) + + testutils.AssertStatementSql(t, stmt, ` +INSERT INTO test_sample.employee (employee_id, first_name, last_name, employment_date, manager_id) +VALUES ($1, $2, $3, $4, $5); +`) + testutils.AssertExecAndRollback(t, stmt, db, 1) + requireLogged(t, stmt) + }) } func TestInsertModelObject(t *testing.T) { diff --git a/tests/sqlite/insert_test.go b/tests/sqlite/insert_test.go index e1b3a54..776d546 100644 --- a/tests/sqlite/insert_test.go +++ b/tests/sqlite/insert_test.go @@ -267,6 +267,24 @@ func TestInsertOnConflict(t *testing.T) { t.Run("do nothing", func(t *testing.T) { link := model.Link{ID: rand.Int31()} + stmt := Link.INSERT(Link.AllColumns). + MODEL(link). + MODEL(link). + ON_CONFLICT().DO_NOTHING() + + testutils.AssertStatementSql(t, stmt, ` +INSERT INTO link (id, url, name, description) +VALUES (?, ?, ?, ?), + (?, ?, ?, ?) +ON CONFLICT DO NOTHING; +`) + testutils.AssertExecAndRollback(t, stmt, sampleDB, 1) + requireLogged(t, stmt) + }) + + t.Run("do nothing with index", func(t *testing.T) { + link := model.Link{ID: rand.Int31()} + stmt := Link.INSERT(Link.AllColumns). MODEL(link). MODEL(link). @@ -341,6 +359,21 @@ ON CONFLICT (id) WHERE (id * 2) > 10 DO UPDATE testutils.AssertExecAndRollback(t, stmt, sampleDB) requireLogged(t, stmt) }) + + t.Run("nil action removes ON CONFLICT clause", func(t *testing.T) { + link := model.Link{ID: rand.Int31()} + + stmt := Link.INSERT(Link.AllColumns). + MODEL(link). + ON_CONFLICT().DO_UPDATE(nil) + + testutils.AssertStatementSql(t, stmt, ` +INSERT INTO link (id, url, name, description) +VALUES (?, ?, ?, ?); +`) + testutils.AssertExecAndRollback(t, stmt, sampleDB, 1) + requireLogged(t, stmt) + }) } func TestInsertContextDeadlineExceeded(t *testing.T) {