diff options
author | Anatol Belski <ab@php.net> | 2017-01-06 18:12:52 +0100 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2017-01-06 18:12:52 +0100 |
commit | 847e1f97dab8afcac8d7eb71a75892a4e756583c (patch) | |
tree | fe1294355802ee5710b9a0e02ee7bdd8d0861852 /ext/pdo_firebird | |
parent | c50f61b9b06d65ed2391e7751a2adbdf8db91754 (diff) | |
parent | 826122fa8e1db4a0deee3830660ae3b8b5626534 (diff) | |
download | php-git-847e1f97dab8afcac8d7eb71a75892a4e756583c.tar.gz |
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0:
Return integer field types as native integers instead of strings
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]=> |