From: | Asim Praveen <pasim(at)vmware(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
Cc: | Georgios <gkokolatos(at)protonmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | Re: [PATCH] - Provide robust alternatives for replace_string |
Date: | 2020-08-05 07:08:41 |
Message-ID: | FD546689-FA22-4605-98AB-4A8AA95DFF76@vmware.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
> On 03-Aug-2020, at 8:36 PM, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> wrote:
>
> On 2020-Aug-03, Asim Praveen wrote:
>
>> Thank you Alvaro for reviewing the patch!
>>
>>> On 01-Aug-2020, at 7:22 AM, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> wrote:
>>>
>>> What happens if a replacement string happens to be split in the middle
>>> by the fgets buffering? I think it'll fail to be replaced. This
>>> applies to both versions.
>>
>> Can a string to be replaced be split across multiple lines in the source file? If I understand correctly, fgets reads one line from input file at a time. If I do not, in the worst case, we will get an un-replaced string in the output, such as “(at)abs_dir@“ and it should be easily detected by a failing diff.
>
> I meant what if the line is longer than 1023 chars and the replace
> marker starts at byte 1021, for example. Then the first fgets would get
> "@ab" and the second fgets would get "s_dir@" and none would see it as
> replaceable.
>
Please find attached a StringInfo based solution to this problem. It uses fgetln instead of fgets such that a line is read in full, without ever splitting it.
Asim
Attachment | Content-Type | Size |
---|---|---|
0001-Use-a-stringInfo-instead-of-a-char-for-replace_strin.patch | application/octet-stream | 3.3 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Konstantin Knizhnik | 2020-08-05 07:08:45 | Re: LSM tree for Postgres |
Previous Message | Konstantin Knizhnik | 2020-08-05 06:13:12 | Re: LSM tree for Postgres |