Re: [HACKERS] Fix number skipping in to_number

Oliver Ford <ojford@gmail.com>

From: Oliver Ford <ojford@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Thomas Munro <thomas.munro@enterprisedb.com>, Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2017-11-13T16:18:44Z
Lists: pgsql-hackers

Attachments

On Sun, Nov 12, 2017 at 7:00 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Oliver Ford <ojford@gmail.com> writes:
>> [ 0001-apply-number-v3.patch ]
>
> I looked at this patch briefly and have a couple of comments:
>
> * It seems entirely wrong to be matching to L_thousands_sep in the
> NUM_COMMA case; that format code is by definition not locale aware,
> so it should be matching to plain ',' independently of locale.

Ok I've changed it to just search for a comma.

> * Don't we need to fix the NUM_L (currency symbol) case in the
> same manner?  (The NUM_D and NUM_S cases are handled in
> NUM_numpart_from_char and seem ok at a quick glance.)

Yes you get the same skipping if you do:

select to_number('12','L99');
 to_number
-----------
         2

However, this case is not as easy to fix as you can't do a simple
string comparison like with the group separator. The currency symbol
for the locale can be " " but if we do a comparison, it won't match if
the symbol specified is "$" or "£" (so will end up missing characters
at the end of the supplied string). Could we apply the attached patch
and then put fixing it for currency on the TODO list?

> * I'm not in love with the noadd flag.  Other places in this
> switch that want to skip the final increment do it with
> "continue", and I think this should do likewise.

I've changed to continue in the latest patch. All existing tests pass.

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Improve to_date/to_number/to_timestamp behavior with multibyte characters.

  2. Prevent to_number() from losing data when template doesn't match exactly.