From: | Akash Kava <ackava(at)gmail(dot)com> |
---|---|
To: | Pantelis Theodosiou <ypercube(at)gmail(dot)com> |
Cc: | pgsql-bugs(at)lists(dot)postgresql(dot)org |
Subject: | Re: BUG #18138: Using limit on VALUES causes type conversion to fail. |
Date: | 2023-09-28 15:04:54 |
Message-ID: | CAOixk+kO32zeLZvGHkCSJue+ZUNAKb=g+ewbJajXmQztHf6DZQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
Hi,
Thanks for the reply, but if you try the values with parameters, using some
library like node-pg or postgres c# connector, it fails when we
parameterize the query.
insert into avatar(username, url, is_public)
values ($1,$2,$3)
limit 1 ;
Or the values are coming from some other table. The problem is with `limit`
not how you send the values.
Thank you,
- Akash Kava
On Thu, Sep 28, 2023 at 8:17 PM Pantelis Theodosiou <ypercube(at)gmail(dot)com>
wrote:
>
>
> On Thu, Sep 28, 2023 at 1:48 PM PG Bug reporting form <
> noreply(at)postgresql(dot)org> wrote:
>
>> The following bug has been logged on the website:
>>
>> Bug reference: 18138
>> Logged by: Akash Kava
>> Email address: ackava(at)gmail(dot)com
>> PostgreSQL version: 15.4
>> Operating system: alpine
>> Description:
>>
>> Doing UPSERT is not easy and I know it is a complicated process. However,
>> since UPDATE has a WHERE clause, there is no way we can do conditional
>> INSERT.
>>
>> But I was able to find a workaround, using LIMIT keyword with VALUES. I am
>> aware of the ON CONFLICT clause, but the issue with ON CONFLICT is, it
>> increases identity every time we want to update a row.
>>
>> INSERT INTO the_table(column_1, column_2)
>> VALUES ($1, $2)
>> LIMIT LEAST((SELECT 1 FROM the_table WHERE key_1 = $3),2)-1
>>
>> Basically this is a part of a larger query I have explained here.
>> https://stackoverflow.com/a/77190090/85597
>>
>> This works as expected except for boolean and date fields.
>>
>> Here is the example,
>> https://www.db-fiddle.com/f/g4LMVToHjrbYTDXT4MB1K/2
>>
>> insert into avatar(username,url,is_public)
>> values ('a','b', 'true');
>>
>> insert into avatar(username,url)
>> values ('a1','b')
>> limit LEAST((SELECT 1 FROM avatar),2)-1;
>>
>> insert into avatar(username,url,is_public)
>> values ('a2','b', 'true')
>> limit LEAST((SELECT 1 FROM avatar),2)-1;
>>
>> The problem occurs when we are sending data from node-postgres library.
>>
>> Is there any work around? IF this will work correctly, we will be able to
>> use UPSERT easily without having gaps in identity sequences
>>
>
> A smaller example would be that this works and inserts the row:
>
> insert into avatar(username, url, is_public)
> values ('a','b', 'true');
>
> while you get the error with:
>
> insert into avatar(username, url, is_public)
> values ('a2','b', 'true')
> limit 1 ;
>
> I am not sure if this would be classified as a bug since you are putting
> quotes around the boolean value.
> Without quotes it would work fine:
>
> insert into avatar(username, url, is_public)
> values ('a1','b', true)
> limit 1 ;
>
> or if you explicitly converted to the type of the column:
>
> insert into avatar(username, url, is_public)
> values ('a2','b', 'true'::boolean)
> limit 1 ;
>
> Best regards
>
> Pantelis Theodosiou
>
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2023-09-28 15:57:36 | Re: BUG #18138: Using limit on VALUES causes type conversion to fail. |
Previous Message | Tom Lane | 2023-09-28 14:57:39 | Re: Broken type checking for empty subqueries |