diff options
Diffstat (limited to 'ext/pdo_firebird')
-rw-r--r-- | ext/pdo_firebird/firebird_statement.c | 34 | ||||
-rw-r--r-- | ext/pdo_firebird/tests/bug_72583.phpt | 21 | ||||
-rw-r--r-- | ext/pdo_firebird/tests/execute.phpt | 4 |
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]=> |