summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/sqlite3/sqlite3.c11
-rw-r--r--ext/sqlite3/tests/bug63921-32bit.phpt2
-rw-r--r--ext/sqlite3/tests/bug63921-64bit.phpt2
-rw-r--r--ext/sqlite3/tests/bug73333.phpt26
4 files changed, 37 insertions, 4 deletions
diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c
index 54ec73d6ac..80d6b897f1 100644
--- a/ext/sqlite3/sqlite3.c
+++ b/ext/sqlite3/sqlite3.c
@@ -591,14 +591,21 @@ PHP_METHOD(sqlite3, query)
static zval* sqlite_value_to_zval(sqlite3_stmt *stmt, int column) /* {{{ */
{
zval *data;
+ sqlite3_int64 val;
+
MAKE_STD_ZVAL(data);
switch (sqlite3_column_type(stmt, column)) {
case SQLITE_INTEGER:
- if ((sqlite3_column_int64(stmt, column)) >= INT_MAX || sqlite3_column_int64(stmt, column) <= INT_MIN) {
+ val = sqlite3_column_int64(stmt, column);
+#if LONG_MAX <= 2147483647
+ if (val > LONG_MAX || val < LONG_MIN) {
ZVAL_STRINGL(data, (char *)sqlite3_column_text(stmt, column), sqlite3_column_bytes(stmt, column), 1);
} else {
- ZVAL_LONG(data, sqlite3_column_int64(stmt, column));
+#endif
+ ZVAL_LONG(data, val);
+#if LONG_MAX <= 2147483647
}
+#endif
break;
case SQLITE_FLOAT:
diff --git a/ext/sqlite3/tests/bug63921-32bit.phpt b/ext/sqlite3/tests/bug63921-32bit.phpt
index 8c1c6b9414..d2cc7b2002 100644
--- a/ext/sqlite3/tests/bug63921-32bit.phpt
+++ b/ext/sqlite3/tests/bug63921-32bit.phpt
@@ -24,4 +24,4 @@ var_dump($num,$result[0]);
?>
--EXPECT--
int(2147483647)
-string(10) "2147483647"
+int(2147483647)
diff --git a/ext/sqlite3/tests/bug63921-64bit.phpt b/ext/sqlite3/tests/bug63921-64bit.phpt
index 8e821fd2d0..d6c539e185 100644
--- a/ext/sqlite3/tests/bug63921-64bit.phpt
+++ b/ext/sqlite3/tests/bug63921-64bit.phpt
@@ -24,4 +24,4 @@ var_dump($num,$result[0]);
?>
--EXPECT--
int(100004313234244)
-string(15) "100004313234244"
+int(100004313234244)
diff --git a/ext/sqlite3/tests/bug73333.phpt b/ext/sqlite3/tests/bug73333.phpt
new file mode 100644
index 0000000000..7315751810
--- /dev/null
+++ b/ext/sqlite3/tests/bug73333.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #73333 (2147483647 is fetched as string)
+--SKIPIF--
+<?php
+if (!extension_loaded('sqlite3')) die('skip sqlite3 extension not available');
+?>
+--FILE--
+<?php
+if (!defined('PHP_INT_MIN')) define('PHP_INT_MIN', -PHP_INT_MAX-1);
+
+$db = new SQLite3(':memory:');
+$db->exec('CREATE TABLE foo (bar INT)');
+foreach ([PHP_INT_MIN, PHP_INT_MAX] as $value) {
+ $db->exec("INSERT INTO foo VALUES ($value)");
+}
+
+$res = $db->query('SELECT bar FROM foo');
+while (($row = $res->fetchArray(SQLITE3_NUM)) !== false) {
+ echo gettype($row[0]), PHP_EOL;
+}
+?>
+===DONE===
+--EXPECT--
+integer
+integer
+===DONE===