Hello,
On 2018-01-25 19:54, petern wrote:
CREATE TABLE IF NOT EXISTS a (a INTEGER);
INTEGER == NUMERIC in case of column declarations.
-- Note however, the constant table expression works fine...
SELECT CAST(column1 AS INTEGER) FROM (VALUES
('9000000000000000001'),('9000000000000000001 '));
-- "CAST(column1 AS INTEGER)"
-- 9000000000000000001
-- 9000000000000000001
This is due a fact that ``CAST AS INTEGER'' blindly calls ``Atoi64()''
and returns its result.
INTEGER/FLOAT handling/recognition is a bit more complicated in other
places, what causes that '9000000000000000001 ' will become 9e18.
For the same reason ``CAST ('9000000000000000001X' AS INTEGER)'' gives
INT 9000000000000000001, while ``SELECT CAST ('9000000000000000001X' AS
NUMERIC);'' gives FLOAT 9e18.
Due to a bit disordered treatment of values, my own patch involves many
changes. The ``concise'' patch, which I proposed in my original post,
eliminates: (1) (mod 2^64) bug, and (2) an erratic treatment of INTs and
FLOATs in some (not all) places. It changes only one line and adds one,
and does not change affinity/type system at all. (As opposed to my
``long'' version patch).
1. IMHO (mod 2^64) bug is serious. Speculative example: my app has a
dangerous number ``1234'' and is checking input text against it; then
``295147905179352827090'' -- OK, go on -- says my app; then suddenly
``CAST('295147905179352827090' AS INTEGER)'' ==> BOOM: 1234.
2. STRING to be INT must be reacting to ``attention'' command
immediately (even small, chaste space at the end will bother); to be
FLOAT, it can carousel from dusk till next dusk all the time.
There was no noticeable side effects (besides a performance) in old
32bit INT days, however now, 10 bits of each INT can be going to a vacuum.
-- best regards
Cezary H. Noweta
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users