Hi,

I have a table with an integer column 'userid'. But I am not seeing an out
of range error when trying to get an id larger than possible in integer:

db=# explain select * from users where userid =
21474836472871287898765456789::numeric;
                                QUERY PLAN
--------------------------------------------------------------------------
 Seq Scan on users  (cost=0.00..4047620.36 rows=431750 width=301)
   Filter: ((userid)::numeric = '21474836472871287898765456789'::numeric)
(2 rows)

I do see an error when using a bind variable though, just not in psql.
Also, when putting it in quotes or explicitly casting it to integer, I do
get the our of range message:

db=# select * from users where userid =
21474836472344567898765456789::integer;
ERROR:  integer out of range

db=# explain select * from users where userid = '21474737377373737373';
ERROR:  value "21474737377373737373" is out of range for type integer
LINE 1: ...lain select * from users where userid = '214747373...
                                                             ^
db=# explain select * from users where userid = '2147';
                                QUERY PLAN
---------------------------------------------------------------------------
 Index Scan using userid_pkey on users  (cost=0.57..8.59 rows=1 width=301)
   Index Cond: (userid = 2147)

It seems when on psql and querying for a numeric type, postgres is not
checking the type of the column, but instead converting into the numeric
type that best matches the length:

db=# explain select * from users where userid = 2147473737737373;
                                QUERY PLAN
---------------------------------------------------------------------------
 Index Scan using userid_pkey on users  (cost=0.57..8.59 rows=1 width=301)
   Index Cond: (userid = '2147473737737373'::bigint)
(2 rows)

db=# explain select * from users where userid = 21474737377373737373;
                            QUERY PLAN
------------------------------------------------------------------
 Seq Scan on users  (cost=0.00..4047620.36 rows=431750 width=301)
   Filter: ((userid)::numeric = '21474737377373737373'::numeric)
(2 rows)

Why is it that postgres checks the data type of the column when value is in
quotes vs not checking when no quotes are used?

Thanks,

-- 
Payal Singh

Reply via email to