Additional tests for 'ON CONFLICT DO NOTHING without conflict target does not appear in generated SQL' bug.
This commit is contained in:
parent
60d8f15513
commit
39de87671e
5 changed files with 71 additions and 3 deletions
|
|
@ -1,3 +1,3 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
const version = "v2.10.1"
|
const version = "v2.11.1"
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package postgres
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-jet/jet/v2/internal/jet"
|
"github.com/go-jet/jet/v2/internal/jet"
|
||||||
|
"github.com/go-jet/jet/v2/internal/utils/is"
|
||||||
)
|
)
|
||||||
|
|
||||||
type onConflict interface {
|
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) {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package sqlite
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-jet/jet/v2/internal/jet"
|
"github.com/go-jet/jet/v2/internal/jet"
|
||||||
|
"github.com/go-jet/jet/v2/internal/utils/is"
|
||||||
)
|
)
|
||||||
|
|
||||||
type onConflict interface {
|
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) {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,24 @@ func TestInsertOnConflict(t *testing.T) {
|
||||||
t.Run("do nothing", func(t *testing.T) {
|
t.Run("do nothing", func(t *testing.T) {
|
||||||
employee := model.Employee{EmployeeID: rand.Int31()}
|
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).
|
stmt := Employee.INSERT(Employee.AllColumns).
|
||||||
MODEL(employee).
|
MODEL(employee).
|
||||||
MODEL(employee).
|
MODEL(employee).
|
||||||
|
|
@ -207,6 +225,21 @@ ON CONFLICT (id) WHERE (id * 2) > 10 DO UPDATE
|
||||||
|
|
||||||
testutils.AssertExecAndRollback(t, stmt, db, 1)
|
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) {
|
func TestInsertModelObject(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -267,6 +267,24 @@ func TestInsertOnConflict(t *testing.T) {
|
||||||
t.Run("do nothing", func(t *testing.T) {
|
t.Run("do nothing", func(t *testing.T) {
|
||||||
link := model.Link{ID: rand.Int31()}
|
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).
|
stmt := Link.INSERT(Link.AllColumns).
|
||||||
MODEL(link).
|
MODEL(link).
|
||||||
MODEL(link).
|
MODEL(link).
|
||||||
|
|
@ -341,6 +359,21 @@ ON CONFLICT (id) WHERE (id * 2) > 10 DO UPDATE
|
||||||
testutils.AssertExecAndRollback(t, stmt, sampleDB)
|
testutils.AssertExecAndRollback(t, stmt, sampleDB)
|
||||||
requireLogged(t, stmt)
|
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) {
|
func TestInsertContextDeadlineExceeded(t *testing.T) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue