Skip to content

Commit df6ca45

Browse files
Matheus Degiovanimbeccati
Matheus Degiovani
authored andcommitted
Fixed bug #62024 (unable to run consecutive prepared querys with null values)
Credits to james@kenjim.com for the patch.
1 parent 65d233f commit df6ca45

File tree

2 files changed

+54
-3
lines changed

2 files changed

+54
-3
lines changed

ext/pdo_firebird/firebird_statement.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -535,12 +535,12 @@ 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+
var->sqltype = (sizeof(long) == 8 ? SQL_INT64 : SQL_LONG) + (var->sqltype & 1);
539539
var->sqldata = (void*)&Z_LVAL_P(param->parameter);
540540
var->sqllen = sizeof(long);
541541
break;
542542
case IS_DOUBLE:
543-
var->sqltype = SQL_DOUBLE;
543+
var->sqltype = SQL_DOUBLE + (var->sqltype & 1);
544544
var->sqldata = (void*)&Z_DVAL_P(param->parameter);
545545
var->sqllen = sizeof(double);
546546
break;
@@ -560,7 +560,7 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
560560
force_null = (Z_STRLEN_P(param->parameter) == 0);
561561
}
562562
if (!force_null) {
563-
var->sqltype = SQL_TEXT;
563+
var->sqltype = SQL_TEXT + (var->sqltype & 1);
564564
var->sqldata = Z_STRVAL_P(param->parameter);
565565
var->sqllen = Z_STRLEN_P(param->parameter);
566566
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 = [1, "test1"];
25+
$args_err = [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+

0 commit comments

Comments
 (0)