I noticed that this function's type is
onConflictUpdateSetWhere :: Beamable table
=> (forall s. table (QField s) -> table (QExpr be s) -> QAssignment be s)
-> (forall s. table (QField s) -> table (QExpr be s) -> QExpr be s Bool)
-> SqlConflictAction be table
The first callback controls the assignments for the ON CONFLICT UPDATE clause, while the second callback controls the WHERE. It has two arguments,
table (QField s) -- this represents the existing tabletable (QExpr be s) -- this represents the "excluded" row, i.e. the one that would have been inserted if there were no conflict.I'm confused about the first argument. Shouldn't it be a table (QExpr be s) instead of table (QField s)? If the purpose is to use it to write a QExpr be s Bool, then it seems wrong for it to have this QField type (unless there's a conversion function I'm missing).
I'm also comparing it with functions like conflictingFieldsWhere, which also use the table (QExpr be s) type.
Please let me know if I'm missing something obvious :)