Skip to content

Commit 598e269

Browse files
committed
Merge branch 'pull-request/309' into PHP-5.3
2 parents 1c623e3 + bf4a034 commit 598e269

File tree

4 files changed

+110
-5
lines changed

4 files changed

+110
-5
lines changed

NEWS

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@ PHP NEWS
22
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33
?? ??? 2013, PHP 5.3.27
44

5+
- PDO_firebird:
6+
. Fixed bug #64037 (Firebird return wrong value for numeric field).
7+
(Matheus Degiovani, Matteo)
8+
. Fixed bug #62024 (Cannot insert second row with null using parametrized
9+
query). (patch by james@kenjim.com, Matheus Degiovani, Matteo)
10+
511
- PDO_pgsql:
6-
. Fixed Bug #64949 (Buffer overflow in _pdo_pgsql_error). (Remi)
12+
. Fixed bug #64949 (Buffer overflow in _pdo_pgsql_error). (Remi)
713

814
?? ??? 2013, PHP 5.3.26
915

ext/pdo_firebird/firebird_statement.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, /* {{
344344
if (n >= 0) {
345345
*len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d.%0*" LL_MASK "d",
346346
n / f, -var->sqlscale, n % f);
347-
} else if (n < -f) {
347+
} else if (n <= -f) {
348348
*len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d.%0*" LL_MASK "d",
349349
n / f, -var->sqlscale, -n % f);
350350
} else {
@@ -535,12 +535,14 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
535535
int force_null;
536536

537537
case IS_LONG:
538-
var->sqltype = sizeof(long) == 8 ? SQL_INT64 : SQL_LONG;
538+
/* keep the allow-NULL flag */
539+
var->sqltype = (sizeof(long) == 8 ? SQL_INT64 : SQL_LONG) | (var->sqltype & 1);
539540
var->sqldata = (void*)&Z_LVAL_P(param->parameter);
540541
var->sqllen = sizeof(long);
541542
break;
542543
case IS_DOUBLE:
543-
var->sqltype = SQL_DOUBLE;
544+
/* keep the allow-NULL flag */
545+
var->sqltype = SQL_DOUBLE | (var->sqltype & 1);
544546
var->sqldata = (void*)&Z_DVAL_P(param->parameter);
545547
var->sqllen = sizeof(double);
546548
break;
@@ -560,7 +562,8 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
560562
force_null = (Z_STRLEN_P(param->parameter) == 0);
561563
}
562564
if (!force_null) {
563-
var->sqltype = SQL_TEXT;
565+
/* keep the allow-NULL flag */
566+
var->sqltype = SQL_TEXT | (var->sqltype & 1);
564567
var->sqldata = Z_STRVAL_P(param->parameter);
565568
var->sqllen = Z_STRLEN_P(param->parameter);
566569
break;

ext/pdo_firebird/tests/bug_62024.phpt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
--TEST--
2+
Bug #62024 Cannot insert second row with null using parametrized query (Firebird PDO)
3+
--SKIPIF--
4+
<?php extension_loaded("pdo_firebird") or die("skip"); ?>
5+
<?php function_exists("ibase_query") or die("skip"); ?>
6+
--FILE--
7+
<?php
8+
9+
require("testdb.inc");
10+
11+
$dbh = new PDO("firebird:dbname=$test_base",$user,$password) or die;
12+
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
13+
$value = '2';
14+
@$dbh->exec('DROP TABLE test_insert');
15+
$dbh->exec("CREATE TABLE test_insert (ID INTEGER NOT NULL, TEXT VARCHAR(10))");
16+
17+
$dbh->commit();
18+
19+
//start actual test
20+
21+
$sql = "insert into test_insert (id, text) values (?, ?)";
22+
$sttmt = $dbh->prepare($sql);
23+
24+
$args_ok = array(1, "test1");
25+
$args_err = array(2, null);
26+
27+
$res = $sttmt->execute($args_ok);
28+
var_dump($res);
29+
30+
$res = $sttmt->execute($args_err);
31+
var_dump($res);
32+
33+
$dbh->commit();
34+
35+
36+
//teardown test data
37+
$sttmt = $dbh->prepare('DELETE FROM test_insert');
38+
$sttmt->execute();
39+
40+
$dbh->commit();
41+
42+
$dbh->exec('DROP TABLE test_insert');
43+
44+
unset($sttmt);
45+
unset($dbh);
46+
47+
?>
48+
--EXPECT--
49+
bool(true)
50+
bool(true)
51+

ext/pdo_firebird/tests/bug_64037.phpt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
--TEST--
2+
Bug #64037 Firebird return wrong value for numeric field
3+
--SKIPIF--
4+
<?php extension_loaded("pdo_firebird") or die("skip"); ?>
5+
<?php function_exists("ibase_query") or die("skip"); ?>
6+
--FILE--
7+
<?php
8+
9+
require("testdb.inc");
10+
11+
$dbh = new PDO("firebird:dbname=$test_base",$user,$password) or die;
12+
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
13+
$value = '2';
14+
@$dbh->exec('DROP TABLE price');
15+
$dbh->exec("CREATE TABLE PRICE (ID INTEGER NOT NULL, TEXT VARCHAR(10), COST NUMERIC(15, 2))");
16+
$dbh->exec("INSERT INTO PRICE (ID, TEXT, COST) VALUES (1, 'test', -1.0)");
17+
$dbh->exec("INSERT INTO PRICE (ID, TEXT, COST) VALUES (2, 'test', -0.99)");
18+
$dbh->exec("INSERT INTO PRICE (ID, TEXT, COST) VALUES (3, 'test', -1.01)");
19+
20+
$dbh->commit();
21+
22+
$query = "SELECT * from price order by ID";
23+
$stmt = $dbh->prepare($query);
24+
$stmt->execute();
25+
$rows = $stmt->fetchAll();
26+
var_dump($rows[0]['COST']);
27+
var_dump($rows[1]['COST']);
28+
var_dump($rows[2]['COST']);
29+
30+
31+
$stmt = $dbh->prepare('DELETE FROM price');
32+
$stmt->execute();
33+
34+
$dbh->commit();
35+
36+
$dbh->exec('DROP TABLE price');
37+
38+
unset($stmt);
39+
unset($dbh);
40+
41+
?>
42+
--EXPECT--
43+
string(5) "-1.00"
44+
string(5) "-0.99"
45+
string(5) "-1.01"

0 commit comments

Comments
 (0)