haskell-beam/beam

onConflictUpdateSetWhere has wrong type?

Ouverte

#644 ouverte le 7 nov. 2022

 (3 commentaires) (0 réaction) (0 personne assignée)Haskell (191 forks)auto 404
docsgood first issue

Métriques du dépôt

Stars
 (631 étoiles)
Métriques de merge PR
 (Métriques PR en attente)

Description

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 table
  • table (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 :)

Guide contributeur