On Thu, 2005-08-18 at 12:24 -0400, D. Richard Hipp wrote:
> On Thu, 2005-08-18 at 18:04 +0200, Frank van Vugt wrote:
> > L.S.
> >
> > It looks like there's something wrong with the endiannes when using sqlite3
> > (v3.2.2) on an ARM architecture (SA1100 nanoboard) while storing floating
> > point data.
> >
>
> SQLite assumes float point values are stored in the IEEE 64-bit
> format with the same byte order as the machine integer.
I misspoke.
SQLite tries to store everything on disk as big-endian. That
means it always byte swaps on little-endian machines (basically,
ix86) and omits byte swapping for big-endian machines (which is
to say, everything other than ix86.) The byte swapping happens
for integers *and* floating-point numbers.
Here is the code that reads from the disk, for example.
buf[0]..buf[7] has been loaded with 8 bytes of floating point
or integer data taken from the disk.
case 6: /* 8-byte signed integer */
case 7: { /* IEEE floating point */
u64 x = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3];
u32 y = (buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7];
x = (x<<32) | y;
if( serial_type==6 ){
pMem->i = *(i64*)&x;
pMem->flags = MEM_Int;
}else{
pMem->r = *(double*)&x;
pMem->flags = MEM_Real;
}
If this is incorrect, then I have a very serious problem...
--
D. Richard Hipp <[EMAIL PROTECTED]>