Skip to content

Commit 5c065af

Browse files
committed
Fix read_double
1 parent 3cbb991 commit 5c065af

1 file changed

Lines changed: 15 additions & 2 deletions

File tree

src/sqlite_index_blaster.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -701,8 +701,21 @@ class sqlite_index_blaster : public btree_handler<sqlite_index_blaster> {
701701
return ret;
702702
}
703703

704-
double read_double(const uint8_t *ptr) {
705-
return (double) *ptr; // TODO: assuming little endian?
704+
double read_double(const uint8_t *data) {
705+
uint64_t value;
706+
std::memcpy(&value, data, sizeof(uint64_t)); // read 8 bytes from data pointer
707+
// SQLite stores 64-bit reals as big-endian integers
708+
value = ((value & 0xff00000000000000ull) >> 56) | // byte 1 -> byte 8
709+
((value & 0x00ff000000000000ull) >> 40) | // byte 2 -> byte 7
710+
((value & 0x0000ff0000000000ull) >> 24) | // byte 3 -> byte 6
711+
((value & 0x000000ff00000000ull) >> 8) | // byte 4 -> byte 5
712+
((value & 0x00000000ff000000ull) << 8) | // byte 5 -> byte 4
713+
((value & 0x0000000000ff0000ull) << 24) | // byte 6 -> byte 3
714+
((value & 0x000000000000ff00ull) << 40) | // byte 7 -> byte 2
715+
((value & 0x00000000000000ffull) << 56); // byte 8 -> byte 1
716+
double result;
717+
std::memcpy(&result, &value, sizeof(double)); // convert the integer to a double
718+
return result;
706719
}
707720

708721
// See .h file for API description

0 commit comments

Comments
 (0)