]> granicus.if.org Git - php/commitdiff
Request #77863: PDO firebird support type Boolean in input parameters
authorSimonov Denis <sim-mail@list.ru>
Tue, 10 Sep 2019 07:22:26 +0000 (09:22 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Tue, 10 Sep 2019 07:22:26 +0000 (09:22 +0200)
NEWS
ext/pdo_firebird/firebird_statement.c
ext/pdo_firebird/tests/bug_77863.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index c976a6b2c9d185d459174b77ec29720ad521ad5f..695ec84407fbeca0c5407415bb572f4ed6317b56 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,10 @@ PHP                                                                        NEWS
 - PCRE:
   . Fixed bug #78349 (Bundled pcre2 library missing LICENCE file). (Peter Kokot)
 
+- PDO_Firebird:
+  . Implemented FR #77863 (PDO firebird support type Boolean in input
+    parameters). (Simonov Denis)
+
 - PDO_MySQL:
   . Fixed bug #41997 (SP call yields additional empty result set). (cmb)
 
index aee748d0e14bb8cf12ec754c7069a15532e50a3b..75d7221923265c228005d852c60ace1460f0e4bc 100644 (file)
@@ -611,6 +611,60 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
                                }
                        }
 
+#ifdef SQL_BOOLEAN
+                       /* keep native BOOLEAN type */
+                       if ((var->sqltype & ~1) == SQL_BOOLEAN) {
+                               switch (Z_TYPE_P(parameter)) {
+                                       case IS_LONG:
+                                       case IS_DOUBLE:
+                                       case IS_TRUE:
+                                       case IS_FALSE:
+                                               *(FB_BOOLEAN*)var->sqldata = zend_is_true(parameter) ? FB_TRUE : FB_FALSE;
+                                               break;
+                                       case IS_STRING:
+                                               {
+                                                       zend_long lval;
+                                                       double dval;
+                                               
+                                                       if ((Z_STRLEN_P(parameter) == 0)) {
+                                                               *(FB_BOOLEAN*)var->sqldata = FB_FALSE;
+                                                               break;
+                                                       }
+
+                                                       switch (is_numeric_string(Z_STRVAL_P(parameter), Z_STRLEN_P(parameter), &lval, &dval, 0)) {
+                                                               case IS_LONG:
+                                                                       *(FB_BOOLEAN*)var->sqldata = (lval != 0) ? FB_TRUE : FB_FALSE;
+                                                                       break;
+                                                               case IS_DOUBLE:
+                                                                       *(FB_BOOLEAN*)var->sqldata = (dval != 0) ? FB_TRUE : FB_FALSE;
+                                                                       break;
+                                                               default:
+                                                                       if (!zend_binary_strncasecmp(Z_STRVAL_P(parameter), Z_STRLEN_P(parameter), "true", 4, 4)) {
+                                                                               *(FB_BOOLEAN*)var->sqldata = FB_TRUE;
+                                                                       } else if (!zend_binary_strncasecmp(Z_STRVAL_P(parameter), Z_STRLEN_P(parameter), "false", 5, 5)) {
+                                                                               *(FB_BOOLEAN*)var->sqldata = FB_FALSE;
+                                                                       } else {
+                                                                               strcpy(stmt->error_code, "HY105");
+                                                                               S->H->last_app_error = "Cannot convert string to boolean";
+                                                                               return 0;
+                                                                       }
+
+                                                       }
+                                               }
+                                               break;
+                                       case IS_NULL:
+                                               *var->sqlind = -1;
+                                               break;
+                                       default:
+                                               strcpy(stmt->error_code, "HY105");
+                                               S->H->last_app_error = "Binding arrays/objects is not supported";
+                                               return 0;
+                               }
+                               break;
+                       }
+#endif
+                       
+
                        /* check if a NULL should be inserted */
                        switch (Z_TYPE_P(parameter)) {
                                int force_null;
@@ -646,7 +700,7 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
                                                /* keep the allow-NULL flag */
                                                var->sqltype = SQL_TEXT | (var->sqltype & 1);
                                                var->sqldata = Z_STRVAL_P(parameter);
-                                               var->sqllen      = Z_STRLEN_P(parameter);
+                                               var->sqllen = Z_STRLEN_P(parameter);
                                                break;
                                        }
                                case IS_NULL:
@@ -666,9 +720,9 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
                        break;
 
                case PDO_PARAM_EVT_FETCH_POST:
-                        if (param->paramno == -1) {
-                            return 0;
-                        }
+                       if (param->paramno == -1) {
+                               return 0;
+                       }
                        if (param->is_param) {
                                break;
                        }
@@ -696,13 +750,13 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
                                                        break;
                                                }
                                        case PDO_PARAM_EVT_NORMALIZE:
-                                                        if (!param->is_param) {
-                                                                 char *s = ZSTR_VAL(param->name);
-                                                                 while (*s != '\0') {
-                                                                          *s = toupper(*s);
-                                                                               s++;
-                                                                 }
-                                                        }
+                                               if (!param->is_param) {
+                                                       char *s = ZSTR_VAL(param->name);
+                                                       while (*s != '\0') {
+                                                               *s = toupper(*s);
+                                                               s++;
+                                                       }
+                                               }
                                                break;
                                        default:
                                                ZVAL_NULL(parameter);
diff --git a/ext/pdo_firebird/tests/bug_77863.phpt b/ext/pdo_firebird/tests/bug_77863.phpt
new file mode 100644 (file)
index 0000000..a133de5
--- /dev/null
@@ -0,0 +1,135 @@
+--TEST--
+PDO_Firebird: Bug #76488 PDO Firebird does not support boolean datatype in input parameters
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+
+require 'testdb.inc';
+
+$sql = <<<SQL
+with t(b, s) as (
+  select true, 'true' from rdb\$database
+  union all
+  select false, 'false' from rdb\$database
+  union all
+  select unknown, 'unknown' from rdb\$database
+)
+select trim(s) as s from t where b is not distinct from :p
+SQL;
+
+try {
+  $query = $dbh->prepare($sql);
+
+  // PDO::PARAM_BOOL
+  $query->bindValue('p', 0, PDO::PARAM_BOOL);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 1, PDO::PARAM_BOOL);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', false, PDO::PARAM_BOOL);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', true, PDO::PARAM_BOOL);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 'false', PDO::PARAM_BOOL);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 'True', PDO::PARAM_BOOL);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', null, PDO::PARAM_BOOL);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  // PDO::PARAM_STR
+  $query->bindValue('p', false, PDO::PARAM_STR);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', true, PDO::PARAM_STR);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 0, PDO::PARAM_STR);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 1, PDO::PARAM_STR);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 'false', PDO::PARAM_STR);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 'true', PDO::PARAM_STR);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', null, PDO::PARAM_STR);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  // PDO::PARAM_INT
+  $query->bindValue('p', false, PDO::PARAM_INT);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', true, PDO::PARAM_INT);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 0, PDO::PARAM_INT);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 1, PDO::PARAM_INT);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 'false', PDO::PARAM_INT);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  $query->bindValue('p', 'true', PDO::PARAM_INT);
+  $query->execute();
+  var_dump($query->fetchColumn(0));
+
+  echo "OK\n";
+}
+catch(Exception $e) {
+       echo $e->getMessage() . '<br>';
+       echo $e->getTraceAsString();
+}
+?>
+--EXPECT--
+string(5) "false"
+string(4) "true"
+string(5) "false"
+string(4) "true"
+string(5) "false"
+string(4) "true"
+string(7) "unknown"
+string(5) "false"
+string(4) "true"
+string(5) "false"
+string(4) "true"
+string(5) "false"
+string(4) "true"
+string(7) "unknown"
+string(5) "false"
+string(4) "true"
+string(5) "false"
+string(4) "true"
+string(5) "false"
+string(4) "true"
+OK