haskell-beam/beam

onConflictUpdateSetWhere has wrong type?

开放

#644 创建于 2022年11月7日

 (3 条评论) (0 个反应) (0 位负责人)Haskell (191 个派生)auto 404
docsgood first issue

仓库指标

星标
 (631 个星标)
PR 合并指标
 (PR 指标待抓取)

描述

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 :)

贡献者指南