Hi,
On 2020-11-19 02:49:20 +0300, Andy S wrote:
> Oh! What a gem I mined in sources:
>
> branch: REL_11_STABLE
> src/backend/executor/nodeModifyTable.c:
> * BEFORE ROW INSERT Triggers.
> *
> * Note: We fire BEFORE ROW TRIGGERS for every attempted insertion
> in an
> * INSERT ... ON CONFLICT statement. We cannot check for constraint
> * violations before firing these triggers, because they can change
> the
> * values to insert. Also, they can run arbitrary user-defined
> code with
> * side-effects that we can't cancel by just not inserting the
> tuple.
> */
>
> Still not the place where ON CONFLICT could be validated on per-row
> basis?
On conflict arbiter determination happens much earlier - and that can't,
as I have explained earlier, really be changed. We need to know which
index etc this applies to during parse analysis, not during execution
time. This happens as part of transformOnConflictClause() called from
transformInsertStmt().
Greetings,
Andres Freund