From d08e0a46d2023cc6526460aa9472545fa080e839 Mon Sep 17 00:00:00 2001 From: Simonov Denis Date: Sun, 7 Apr 2019 15:07:31 +0300 Subject: [PATCH] Add support boolean datatype for PDO Firebird in input parameters --- ext/pdo_firebird/firebird_statement.c | 58 ++++++++++- ext/pdo_firebird/tests/bug_77863.phpt | 139 ++++++++++++++++++++++++++ 2 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 ext/pdo_firebird/tests/bug_77863.phpt diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c index 2dec82b0ba596..1f11921a27c35 100644 --- a/ext/pdo_firebird/firebird_statement.c +++ b/ext/pdo_firebird/firebird_statement.c @@ -608,6 +608,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: + if ((Z_STRLEN_P(parameter) == 0)) { + *(FB_BOOLEAN*)var->sqldata = FB_FALSE; + break; + } + + long lval; + double dval; + + 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; @@ -637,13 +691,13 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat case SQL_TIMESTAMP: case SQL_TYPE_DATE: case SQL_TYPE_TIME: - force_null = (Z_STRLEN_P(parameter) == 0); + force_null = (Z_STRLEN_P(parameter) == 0); } if (!force_null) { /* 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: diff --git a/ext/pdo_firebird/tests/bug_77863.phpt b/ext/pdo_firebird/tests/bug_77863.phpt new file mode 100644 index 0000000000000..a9bd438148e46 --- /dev/null +++ b/ext/pdo_firebird/tests/bug_77863.phpt @@ -0,0 +1,139 @@ +--TEST-- +PDO_Firebird: Bug #76488 PDO Firebird does not support boolean datatype in input parameters +--SKIPIF-- + +--FILE-- +prepare($sql); + + $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() . '
'; + 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 \ No newline at end of file