L.S. In order to wrap this up: apparently there's a feature / bug (choose one) in any ARM core earlier than v5 due to which a float will be stored in big endian quad order. The processor in this particular case is an SA1110, which is default little endian while having a v4 core..... (and thus is 'swapping' the quads).
> [Doug Currie] So for your ARM FP library, the code goes from For the part that reads the data it's just semantics, really, but I'm using the patch now (against v3.2.3): --- vdbeaux.c_orig 2005-08-22 21:32:53.000000000 +0200 +++ vdbeaux.c 2005-08-22 21:39:46.000000000 +0200 @@ -1649,7 +1649,11 @@ } len = i = sqlite3VdbeSerialTypeLen(serial_type); while( i-- ){ - buf[i] = (v&0xFF); + if( serial_type==7 ){ + buf[(i+4)%8] = (v&0xFF); + }else{ + buf[i] = (v&0xFF); + } v >>= 8; } return len; @@ -1708,18 +1712,20 @@ pMem->flags = MEM_Int; return 6; } - case 6: /* 8-byte signed integer */ - case 7: { /* IEEE floating point */ + case 6: { /* 8-byte signed integer */ 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; - } + pMem->i = *(i64*)&x; + pMem->flags = MEM_Int; + return 8; + } + case 7: { /* IEEE floating point */ + u64 x = (buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7]; + u32 y = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; + x = (x<<32) | y; + pMem->r = *(double*)&x; + pMem->flags = MEM_Real; return 8; } default: { >> [D. Richard Hipp] The code shown was for reading the database. >> You'll also need to find and fix the spot where the database is written > Obviously, but thanks for the heads-up anyway ;);) The patch above includes that. -- Best, Frank.