public inbox for [email protected]  
help / color / mirror / Atom feed
From: Tim Starling <[email protected]>
To: Laurenz Albe <[email protected]>
To: Tom Lane <[email protected]>
Cc: [email protected]
Subject: Re: Upsert error "column reference is ambiguous"
Date: Tue, 29 Apr 2025 21:07:47 +1000
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
References: <[email protected]>
	<[email protected]>
	<[email protected]>
	<[email protected]>
	<[email protected]>
	<[email protected]>

On 29/4/25 16:36, Laurenz Albe wrote:
> On Tue, 2025-04-29 at 08:36 +1000, Tim Starling wrote:
>> My code would be like
>>
>> function upsert( $table, $names, $values, $key, $set ) {
>>       if ( $this->type === 'mysql' ) {
>>           $conflict = 'ON DUPLICATE KEY UPDATE';
>>       } else {
>>           $conflict = "ON CONFLICT ($key) DO UPDATE SET";
>>       }
>>       return $this->query( "INSERT INTO $table ($names) " .
>>           "VALUES ($values) $conflict $set" );
>> }
>>
>> The parameters are a little bit more structured than that, but that
>> gives you the idea.
> 
> Another litle "if" to cater for PostgreSQL's "EXCLUDED." would be
> such a big problem?

I don't understand what you mean. EXCLUDED is not needed. "$table." 
needs to be prefixed to every column reference in the string $set. How 
do you find the column references amongst the string literals, 
function calls, etc.? You would need to parse the expression.

This is a public interface and there may be callers in code that I 
don't have access to.

Part of the reason for wanting to replace the existing emulation with 
a native upsert is to simplify the code. Parsing the expression is 
definitely not a simplification.

-- Tim Starling






view thread (12+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected], [email protected]
  Subject: Re: Upsert error "column reference is ambiguous"
  In-Reply-To: <[email protected]>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox