]> granicus.if.org Git - php/commitdiff
Fixed bug #62024 (unable to run consecutive prepared querys with null values)
authorMatheus Degiovani <matheus@gigatron.com.br>
Fri, 22 Mar 2013 13:39:36 +0000 (10:39 -0300)
committerMatteo Beccati <matteo@beccati.com>
Fri, 31 May 2013 12:30:57 +0000 (14:30 +0200)
Credits to james@kenjim.com for the patch.

ext/pdo_firebird/firebird_statement.c
ext/pdo_firebird/tests/bug_62024.phpt [new file with mode: 0644]

index ffe9b3cb6396b43f214d9c74b737349a1b73cffa..e172133c885f0257aadd6750ae1b424e6959cdee 100644 (file)
@@ -535,12 +535,12 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
                                int force_null;
                                
                                case IS_LONG:
-                                       var->sqltype = sizeof(long) == 8 ? SQL_INT64 : SQL_LONG;
+                                       var->sqltype = (sizeof(long) == 8 ? SQL_INT64 : SQL_LONG) + (var->sqltype & 1);
                                        var->sqldata = (void*)&Z_LVAL_P(param->parameter);
                                        var->sqllen = sizeof(long);
                                        break;
                                case IS_DOUBLE:
-                                       var->sqltype = SQL_DOUBLE;
+                                       var->sqltype = SQL_DOUBLE + (var->sqltype & 1);
                                        var->sqldata = (void*)&Z_DVAL_P(param->parameter);
                                        var->sqllen = sizeof(double);
                                        break;
@@ -560,7 +560,7 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
                                                        force_null = (Z_STRLEN_P(param->parameter) == 0);
                                        }
                                        if (!force_null) {
-                                               var->sqltype = SQL_TEXT;
+                                               var->sqltype = SQL_TEXT + (var->sqltype & 1);
                                                var->sqldata = Z_STRVAL_P(param->parameter);
                                                var->sqllen      = Z_STRLEN_P(param->parameter);
                                                break;
diff --git a/ext/pdo_firebird/tests/bug_62024.phpt b/ext/pdo_firebird/tests/bug_62024.phpt
new file mode 100644 (file)
index 0000000..3daef68
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Bug #62024 Cannot insert second row with null using parametrized query (Firebird PDO)
+--SKIPIF--
+<?php extension_loaded("pdo_firebird") or die("skip"); ?>
+<?php function_exists("ibase_query") or die("skip"); ?>
+--FILE--
+<?php
+
+require("testdb.inc");
+
+$dbh = new PDO("firebird:dbname=$test_base",$user,$password) or die;
+$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
+$value = '2';
+@$dbh->exec('DROP TABLE test_insert');
+$dbh->exec("CREATE TABLE test_insert (ID INTEGER NOT NULL, TEXT VARCHAR(10))");
+
+$dbh->commit();
+
+//start actual test
+
+$sql = "insert into test_insert (id, text) values (?, ?)";
+$sttmt = $dbh->prepare($sql);
+
+$args_ok = [1, "test1"];
+$args_err = [2, null];
+
+$res = $sttmt->execute($args_ok);
+var_dump($res);
+
+$res = $sttmt->execute($args_err);
+var_dump($res);
+
+$dbh->commit();
+
+
+//teardown test data
+$sttmt = $dbh->prepare('DELETE FROM test_insert');
+$sttmt->execute();
+
+$dbh->commit();
+
+$dbh->exec('DROP TABLE test_insert');
+
+unset($sttmt);
+unset($dbh);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+