Re: BUG #15533: error on upsert when used in a fuction and a function parameter has the same name as the column

From: Pantelis Theodosiou <ypercube(at)gmail(dot)com>
To: lulzimbilali(at)gmail(dot)com, pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: Re: BUG #15533: error on upsert when used in a fuction and a function parameter has the same name as the column
Date: 2018-11-30 23:05:40
Message-ID: CAE3TBxzoE9H8jY8L0fJ=BV2e7sHvSFEUaExYFqrVixBZG6x6qQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

I don't think this is a bug.

You can decide how conflicts are resolved with the pgplsql parameter
variable_conflict:

CREATE OR REPLACE FUNCTION log_tst(id int, info text)
RETURNS void AS
$$
#variable_conflict use_column
BEGIN

INSERT INTO tst (id, info)
VALUES (log_tst.id, log_tst.info)
--ON CONFLICT DO NOTHING
ON CONFLICT (id) DO UPDATE
SET info = log_tst.info ;
END $$
LANGUAGE plpgsql;

See the documentation:
https://www.postgresql.org/docs/current/plpgsql-implementation.html

Pantelis Theodosio

On Fri, Nov 30, 2018 at 8:18 PM PG Bug reporting form <
noreply(at)postgresql(dot)org> wrote:

> The following bug has been logged on the website:
>
> Bug reference: 15533
> Logged by: Lulzim Bilali
> Email address: lulzimbilali(at)gmail(dot)com
> PostgreSQL version: 11.1
> Operating system: Ubuntu 18.04
> Description:
>
> Can't use `ON CONFLICT DO UPDATE` in a function which has a parameter with
> the same name as the column where the unique key is.
>
> Here is the error I get.
>
> Query execution failed
>
> Reason:
> SQL Error [42702]: ERROR: column reference "id" is ambiguous
> Detail: It could refer to either a PL/pgSQL variable or a table
> column.
> Where: PL/pgSQL function log_tst(integer,text) line 4 at SQL
> statement
>
> the test code I'm using:
>
>
> --DROP TABLE IF EXISTS tst;
> CREATE TABLE tst (
> id int UNIQUE,
> info text
> );
>
> --DROP FUNCTION IF EXISTS log_tst;
> CREATE OR REPLACE FUNCTION log_tst(id int, info text) RETURNS void AS
> $$
> BEGIN
>
> INSERT INTO tst (id, info)
> VALUES (log_tst.id, log_tst.info)
> --ON CONFLICT DO NOTHING
> ON CONFLICT (id) DO UPDATE
> SET info = log_tst.info
> ;
> END $$
> LANGUAGE plpgsql;
>
> SELECT log_tst(1, 'changed');
>
> I would expect it to work since we can't use a parameter to check the
> uniqueness even if we want (or can we!?), so PostgreSQL should know to use
> the column instead.
>
> Lulzim
>
>

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message 小威 2018-12-01 02:49:41 Re: BUG #15528: on v11.0 version still get error "ERROR: catalog is missing 1 attribute(s) for relid 6855092"
Previous Message PG Bug reporting form 2018-11-30 20:17:20 BUG #15533: error on upsert when used in a fuction and a function parameter has the same name as the column