Hi Peter, /* process digits */ + if (ptr[0] == '0' && (ptr[1] == 'x' || ptr[1] == 'X')) + { + ptr += 2; + while (*ptr && isxdigit((unsigned char) *ptr)) + { + int8 digit = hexlookup[(unsigned char) *ptr]; + + if (unlikely(pg_mul_s16_overflow(tmp, 16, &tmp)) || + unlikely(pg_sub_s16_overflow(tmp, digit, &tmp))) + goto out_of_range; + + ptr++; + } + } + else if (ptr[0] == '0' && (ptr[1] == 'o' || ptr[1] == 'O')) + { + ptr += 2; + + while (*ptr && (*ptr >= '0' && *ptr <= '7')) + { + int8 digit = (*ptr++ - '0'); + + if (unlikely(pg_mul_s16_overflow(tmp, 8, &tmp)) || + unlikely(pg_sub_s16_overflow(tmp, digit, &tmp))) + goto out_of_range; + } + } + else if (ptr[0] == '0' && (ptr[1] == 'b' || ptr[1] == 'B')) + { + ptr += 2; + + while (*ptr && (*ptr >= '0' && *ptr <= '1')) + { + int8 digit = (*ptr++ - '0'); + + if (unlikely(pg_mul_s16_overflow(tmp, 2, &tmp)) || + unlikely(pg_sub_s16_overflow(tmp, digit, &tmp))) + goto out_of_range; + } + } + else + { while (*ptr && isdigit((unsigned char) *ptr)) { int8 digit = (*ptr++ - '0'); @@ -128,6 +181,7 @@ pg_strtoint16(const char *s) unlikely(pg_sub_s16_overflow(tmp, digit, &tmp))) goto out_of_range; } + }
What do you think if we move these code into a static inline function? like: static inline char* process_digits(char *ptr, int32 *result) { ... } On Mon, Oct 10, 2022 at 10:17 PM Peter Eisentraut <peter.eisentr...@enterprisedb.com> wrote: > > On 16.02.22 11:11, Peter Eisentraut wrote: > > The remaining patches are material for PG16 at this point, and I will > > set the commit fest item to returned with feedback in the meantime. > > Time to continue with this. > > Attached is a rebased and cleaned up patch for non-decimal integer > literals. (I don't include the underscores-in-numeric literals patch. > I'm keeping that for later.) > > Two open issues from my notes: > > Technically, numeric_in() should be made aware of this, but that seems > relatively complicated and maybe not necessary for the first iteration. > > Taking another look around ecpg to see how this interacts with C-syntax > integer literals. I'm not aware of any particular issues, but it's > understandably tricky. > > Other than that, this seems pretty complete as a start. -- Regards Junwang Zhao