diff --git a/contrib/intarray/_int_bool.c b/contrib/intarray/_int_bool.c index 4382f882939..abac3ced433 100644 --- a/contrib/intarray/_int_bool.c +++ b/contrib/intarray/_int_bool.c @@ -90,12 +90,13 @@ gettoken(WORKSTATE *state, int32 *val) else { long lval; + char *endptr; nnn[innn] = '\0'; errno = 0; - lval = strtol(nnn, NULL, 0); + lval = strtol(nnn, &endptr, 10); *val = (int32) lval; - if (errno != 0 || (long) *val != lval) + if (errno != 0 || *endptr != '\0' || (long) *val != lval) return ERR; state->state = WAITOPERATOR; return (state->count && *(state->buf) == '\0') diff --git a/contrib/intarray/expected/_int.out b/contrib/intarray/expected/_int.out index fb4086a95ca..4a2ecba8081 100644 --- a/contrib/intarray/expected/_int.out +++ b/contrib/intarray/expected/_int.out @@ -398,6 +398,16 @@ SELECT '1&(2&(4&(5|!6)))'::query_int; 1 & 2 & 4 & ( 5 | !6 ) (1 row) +SELECT '010'::query_int; -- decimal, not octal + query_int +----------- + 10 +(1 row) + +SELECT '-'::query_int; -- syntax error +ERROR: syntax error +LINE 1: SELECT '-'::query_int; + ^ -- Test for overflow of the int16 "left" field in findoprnd(). -- This query uses a balanced binary tree to avoid using too much stack. DO $$ diff --git a/contrib/intarray/sql/_int.sql b/contrib/intarray/sql/_int.sql index 0d30914725e..7a1d07e15d1 100644 --- a/contrib/intarray/sql/_int.sql +++ b/contrib/intarray/sql/_int.sql @@ -74,6 +74,8 @@ SELECT '1&(2&(4&(5&6)))'::query_int; SELECT '1&2&4&5&6'::query_int; SELECT '1&(2&(4&(5|6)))'::query_int; SELECT '1&(2&(4&(5|!6)))'::query_int; +SELECT '010'::query_int; -- decimal, not octal +SELECT '-'::query_int; -- syntax error -- Test for overflow of the int16 "left" field in findoprnd(). -- This query uses a balanced binary tree to avoid using too much stack.