Hello, On 2016-03-14 13:25, Clemens Ladisch wrote: > Cezary H. Noweta wrote: >> Is your opinion > > Why would my opinion matter, as opposed to what SQLite actually does?
Because, SQLite behaves in a bit strange manner, which is opposite to extreme carefulness of SQLite in other areas. I'm trying to know if this behavior (or not so determined behavior) is intentional. SQLite's public domain source could be an endorsement to the official documentation, but under condition that the code's behavior is intentional and bug free --- this is what I am trying to lay down. >> that ``SELECT CAST(col AS INTEGER);'' should return (not so) random >> result set, and receiving any INTEGER should mean that a source string >> could have trillion or more possible values? > > The documentation does not specify how the textual representation of an > out-of-range integer is to be converted, so anything SQLite does can be > considered correct. I do not agree. Due to ``lang_expr.html#castexpr'': ``When casting a TEXT value to INTEGER, the longest possible prefix of the value that can be interpreted as an integer number is extracted from the TEXT value and the remainder ignored.'' Now, the algorithm is: (1) calculate value MOD 2^64; (2) return MAX(the (1)'s value, LARGEST_INT64). It looks a bit random with bias into LARGEST_INT64 direction. 1. Why REALs out of range are saturated to <SMALLEST_INT64, LARGEST_INT64> range, while TEXT integers are not (which is not documented)? 2. Why REAL => INTEGER conversion is extremely accurate described together with a previous versions' behavior and a rationale for it, while TEXT => INTEGER conversion is not? Pro for your consideration of correctness would be using of a textual comparision with -SMALLEST_INT64 in ``sqlite3Atoi64()'', however the comparision is made under certain condition that a number was exactly 18 digits long, so it could be reduced to ``return u-1>LARGEST_INT64 ? 1 : !neg && u-1==LARGEST_INT64 ? 2 : 0;'', which, in turn, cancels any rationales for using a textual comparision. Maybe somebody should put ``if ( i > 19 * incr || u > LARGEST_INT64 ) {'' instead of ``if( u>LARGEST_INT64 ){'' in mentioned ``sqlite3Atoi64()''? It would be nice to know that source STRING (or at least the leading digits as mentioned in the doc) was perfect INTEGER after non-distinctive number (i.e. != SMALLEST_INT64, LARGEST_INT64, 0) has been received from CAST, would not it be? -- best regards Cezary H. Noweta