Skip to content

Commit

Permalink
fix: Skip virtual fields on UPSERTs (#405)
Browse files Browse the repository at this point in the history
As with UPDATEs and INSERTs, all kinds of virtual fields should be
skipped when forwarding inbound in payload data to UPSERT statements.
  • Loading branch information
danjoa authored Jan 9, 2024
1 parent c98a964 commit 1a05dcb
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions db-service/lib/cqn2sql.js
Original file line number Diff line number Diff line change
Expand Up @@ -620,15 +620,16 @@ class CQN2SQLRenderer {
* @returns {string} SQL
*/
UPSERT(q) {
let { UPSERT } = q,
sql = this.INSERT({ __proto__: q, INSERT: UPSERT })
const { UPSERT } = q
const elements = q.target?.elements || {}
let sql = this.INSERT({ __proto__: q, INSERT: UPSERT })
let keys = q.target?.keys
if (!keys) return (this.sql = sql) // REVISIT: We should converge q.target and q._target
keys = Object.keys(keys).filter(k => !keys[k].isAssociation)

let updateColumns = q.UPSERT.entries ? Object.keys(q.UPSERT.entries[0]) : this.columns
updateColumns = updateColumns
.filter(c => !keys.includes(c))
.filter(c => c in elements && !elements[c].virtual && !elements[c].value && !elements[c].isAssociation && !keys.includes(c))
.map(c => `${this.quote(c)} = excluded.${this.quote(c)}`)

// temporal data
Expand Down

0 comments on commit 1a05dcb

Please sign in to comment.