In parameterized statements integer literals, like Int(num), are replaced with a placeholders. For some expressions, postgres interpreter will not have enough information to deduce the type. If this is the case postgres returns an error. Int8, Int16, Int32.... functions now will add automatic type cast over a placeholder, so type deduction is always possible.
35 lines
1.1 KiB
Go
35 lines
1.1 KiB
Go
package postgres
|
|
|
|
import "testing"
|
|
|
|
func TestOnConflict(t *testing.T) {
|
|
|
|
assertClauseSerialize(t, &onConflictClause{}, "")
|
|
|
|
onConflict := &onConflictClause{}
|
|
onConflict.DO_NOTHING()
|
|
assertClauseSerialize(t, onConflict, "")
|
|
|
|
onConflict = &onConflictClause{indexExpressions: ColumnList{table1ColBool}}
|
|
onConflict.DO_NOTHING()
|
|
assertClauseSerialize(t, onConflict, `
|
|
ON CONFLICT (col_bool) DO NOTHING`)
|
|
|
|
onConflict = &onConflictClause{indexExpressions: ColumnList{table1ColBool}}
|
|
onConflict.ON_CONSTRAINT("table_pkey").DO_NOTHING()
|
|
assertClauseSerialize(t, onConflict, `
|
|
ON CONFLICT (col_bool) ON CONSTRAINT table_pkey DO NOTHING`)
|
|
|
|
onConflict = &onConflictClause{indexExpressions: ColumnList{table1ColBool, table2ColFloat}}
|
|
onConflict.WHERE(table2ColFloat.ADD(table1ColInt).GT(table1ColFloat)).
|
|
DO_UPDATE(
|
|
SET(table1ColBool.SET(Bool(true)),
|
|
table1ColInt.SET(Int(11))).
|
|
WHERE(table2ColFloat.GT(Float(11.1))),
|
|
)
|
|
assertClauseSerialize(t, onConflict, `
|
|
ON CONFLICT (col_bool, col_float) WHERE (col_float + col_int) > col_float DO UPDATE
|
|
SET col_bool = $1::boolean,
|
|
col_int = $2
|
|
WHERE table2.col_float > $3`)
|
|
}
|