summaryrefslogtreecommitdiff
path: root/ext/pdo_firebird
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pdo_firebird')
-rw-r--r--ext/pdo_firebird/firebird_statement.c34
-rw-r--r--ext/pdo_firebird/tests/bug_72583.phpt21
-rw-r--r--ext/pdo_firebird/tests/execute.phpt4
3 files changed, 52 insertions, 7 deletions
diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c
index c83ba38db5..3feeedf39f 100644
--- a/ext/pdo_firebird/firebird_statement.c
+++ b/ext/pdo_firebird/firebird_statement.c
@@ -217,7 +217,23 @@ static int firebird_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
}
memmove(cp, var->aliasname, var->aliasname_length);
*(cp+var->aliasname_length) = '\0';
- col->param_type = PDO_PARAM_STR;
+
+ if (var->sqlscale < 0) {
+ col->param_type = PDO_PARAM_STR;
+ } else {
+ switch (var->sqltype & ~1) {
+ case SQL_SHORT:
+ case SQL_LONG:
+#if SIZEOF_ZEND_LONG >= 8
+ case SQL_INT64:
+#endif
+ col->param_type = PDO_PARAM_INT;
+ break;
+ default:
+ col->param_type = PDO_PARAM_STR;
+ break;
+ }
+ }
return 1;
}
@@ -373,16 +389,24 @@ static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, /* {{
*len = var->sqllen;
break;
case SQL_SHORT:
- *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
- *len = slprintf(*ptr, CHAR_BUF_LEN, "%d", *(short*)var->sqldata);
+ *len = sizeof(zend_long);
+ *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
+ *(zend_long *)*ptr = *(short*)var->sqldata;
break;
case SQL_LONG:
- *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
- *len = slprintf(*ptr, CHAR_BUF_LEN, "%d", *(ISC_LONG*)var->sqldata);
+ *len = sizeof(zend_long);
+ *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
+ *(zend_long *)*ptr = *(ISC_LONG*)var->sqldata;
break;
case SQL_INT64:
+#if SIZEOF_ZEND_LONG >= 8
+ *len = sizeof(zend_long);
+ *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
+ *(zend_long *)*ptr = *(ISC_INT64*)var->sqldata;
+#else
*ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
*len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d", *(ISC_INT64*)var->sqldata);
+#endif
break;
case SQL_FLOAT:
*ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
diff --git a/ext/pdo_firebird/tests/bug_72583.phpt b/ext/pdo_firebird/tests/bug_72583.phpt
new file mode 100644
index 0000000000..6aa94a7dc2
--- /dev/null
+++ b/ext/pdo_firebird/tests/bug_72583.phpt
@@ -0,0 +1,21 @@
+--TEST--
+PDO_Firebird: Feature 72583 Fetch integers as php integers not as strings
+--SKIPIF--
+<?php if (!extension_loaded('interbase') || !extension_loaded('pdo_firebird')) die('skip'); ?>
+--FILE--
+<?php
+require 'testdb.inc';
+$C = new PDO('firebird:dbname='.$test_base, $user, $password) or die;
+@$C->exec('drop table atable');
+$C->exec('create table atable (aint integer, asmi smallint)');
+$C->exec('insert into atable values (1, -1)');
+$S = $C->prepare('select aint, asmi from atable');
+$S->execute();
+$D = $S->fetch(PDO::FETCH_NUM);
+echo gettype($D[0])."\n".gettype($D[1]);
+unset($S);
+unset($C);
+?>
+--EXPECT--
+integer
+integer
diff --git a/ext/pdo_firebird/tests/execute.phpt b/ext/pdo_firebird/tests/execute.phpt
index 896347e935..3cec9e3aa8 100644
--- a/ext/pdo_firebird/tests/execute.phpt
+++ b/ext/pdo_firebird/tests/execute.phpt
@@ -50,9 +50,9 @@ bool(true)
int(1)
array(6) {
["ID"]=>
- string(1) "1"
+ int(1)
[0]=>
- string(1) "1"
+ int(1)
["TEXT"]=>
string(3) "bla"
[1]=>