• Tom Lane's avatar
    Prevent to_number() from losing data when template doesn't match exactly. · e87d4965
    Tom Lane authored
    Non-data template patterns would consume characters whether or not those
    characters were what the pattern expected, for example
    	SELECT TO_NUMBER('1234', '9,999');
    produced 134 because the '2' got eaten by the comma pattern.  This seems
    undesirable, not least because it doesn't happen in Oracle.  For the ','
    and 'G' template patterns, we can fix this by consuming characters only
    if they match what the pattern would output.  For non-data patterns such
    as 'L' and 'TH', it seems impractical to tighten things up to the point of
    consuming only exact matches to what the pattern would output; but we can
    improve matters quite a lot by redefining the behavior as "consume only
    characters that aren't digits, signs, decimal point, or comma".
    
    Also, fix it so that the behavior is to consume the number of *characters*
    the pattern would output, not the number of *bytes*.  The old coding would
    do surprising things with non-ASCII currency symbols, for example.  (It
    would be good to apply that rule for literal text as well, but this commit
    only fixes it for non-data patterns.)
    
    Oliver Ford, reviewed by Thomas Munro and Nathan Wagner, and whacked around
    a bit more by me
    
    Discussion: https://postgr.es/m/CAGMVOdvpbMqPf9XWNzOwBpzJfErkydr_fEGhmuDGa015z97mwg@mail.gmail.com
    e87d4965
numeric.out 77.2 KB