From ce6fc8609b26a7538dca840b2de5427a146445d4 Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Mon, 21 Nov 2022 16:46:45 -0800 Subject: [PATCH] [bun:sqlite] fix truncating to int32 in results (now truncates to int52) TODO: bigint --- src/bun.js/bindings/sqlite/JSSQLStatement.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/bun.js/bindings/sqlite/JSSQLStatement.cpp b/src/bun.js/bindings/sqlite/JSSQLStatement.cpp index 8fc6ac77a75f0..524c131af8f0c 100644 --- a/src/bun.js/bindings/sqlite/JSSQLStatement.cpp +++ b/src/bun.js/bindings/sqlite/JSSQLStatement.cpp @@ -992,14 +992,19 @@ static inline JSC::JSValue constructResultObject(JSC::JSGlobalObject* lexicalGlo switch (sqlite3_column_type(stmt, i)) { case SQLITE_INTEGER: { - result->putDirect(vm, name, jsNumber(sqlite3_column_int(stmt, i)), 0); + // https://github.com/oven-sh/bun/issues/1536 + result->putDirect(vm, name, jsNumber(sqlite3_column_int64(stmt, i)), 0); break; } case SQLITE_FLOAT: { result->putDirect(vm, name, jsNumber(sqlite3_column_double(stmt, i)), 0); break; } - case SQLITE_TEXT: { + // > Note that the SQLITE_TEXT constant was also used in SQLite version + // > 2 for a completely different meaning. Software that links against + // > both SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, + // > not SQLITE_TEXT. + case SQLITE3_TEXT: { size_t len = sqlite3_column_bytes(stmt, i); const unsigned char* text = len > 0 ? sqlite3_column_text(stmt, i) : nullptr; @@ -1042,13 +1047,18 @@ static inline JSC::JSArray* constructResultRow(JSC::JSGlobalObject* lexicalGloba switch (sqlite3_column_type(stmt, i)) { case SQLITE_INTEGER: { - result->initializeIndex(scope, i, jsNumber(sqlite3_column_int(stmt, i))); + // https://github.com/oven-sh/bun/issues/1536 + result->initializeIndex(scope, i, jsNumber(sqlite3_column_int64(stmt, i))); break; } case SQLITE_FLOAT: { result->initializeIndex(scope, i, jsNumber(sqlite3_column_double(stmt, i))); break; } + // > Note that the SQLITE_TEXT constant was also used in SQLite version + // > 2 for a completely different meaning. Software that links against + // > both SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, + // > not SQLITE_TEXT. case SQLITE_TEXT: { size_t len = sqlite3_column_bytes(stmt, i); const unsigned char* text = len > 0 ? sqlite3_column_text(stmt, i) : nullptr;