#37671 [Opn->Csd]: MySQLi extension fails to recognize BIT colums
| From: | iliaa@php.net | Date: | Wed, 07 Jun 2006 13:08:32 +0000 |
| Subject: | #37671 [Opn->Csd]: MySQLi extension fails to recognize BIT colums | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-98134@lists.php.net to get a copy of this message | ||
ID: 37671
Updated by: iliaa@php.net
Reported By: squasar at eternalviper dot net
-Status: Open
+Status: Closed
Bug Type: MySQLi related
Operating System: *
PHP Version: 5.1.4
New Comment:
BIT[(M)]
A bit-field type. M indicates the number of bits per value,
from 1 to 64. The default is 1 if M is omitted.
(From MySQL manual)
Previous Comments:
------------------------------------------------------------------------
[2006-06-07 04:43:39] squasar at eternalviper dot net
The patch applied to CVS does NOT fix the bug. The CVS patch
folds BIT handling into LONG types. This does not work; BIT
columns take a 64-bit type, NOT a 32-bit type. Please re-
examine the patch I supplied, which folds BIT handling into
LONGLONG types.
------------------------------------------------------------------------
[2006-06-04 14:57:14] iliaa@php.net
This bug has been fixed in CVS.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
Thank you for the report, and for helping us make PHP better.
------------------------------------------------------------------------
[2006-06-02 20:03:38] squasar at eternalviper dot net
With apologies for all the extra comments, here is a
somewhat better patch that allows for arbitrary values in a
BIT column. However, I do not believe this is ideal for a
bitfield type.
Index: ext/mysqli/mysqli_api.c
============================================================
=======
RCS file: /repository/php-src/ext/mysqli/mysqli_api.c,v
retrieving revision 1.118.2.22
diff -u -r1.118.2.22 mysqli_api.c
--- ext/mysqli/mysqli_api.c 5 Apr 2006 12:17:08 -0000
1.118.2.22
+++ ext/mysqli/mysqli_api.c 2 Jun 2006 20:02:17 -0000
@@ -303,10 +303,13 @@
break;
case MYSQL_TYPE_LONGLONG:
+#ifdef FIELD_TYPE_BIT
+ case MYSQL_TYPE_BIT:
+#endif
stmt->result.buf[ofs].type =
IS_STRING;
stmt->result.buf[ofs].buflen
= sizeof(my_ulonglong);
stmt->result.buf[ofs].val =
(char *)emalloc(stmt->result.buf[ofs].buflen);
- bind[ofs].buffer_type =
MYSQL_TYPE_LONGLONG;
+ bind[ofs].buffer_type =
col_type;
bind[ofs].buffer = stmt-
>result.buf[ofs].val;
bind[ofs].is_null = &stmt-
>result.is_null[ofs];
bind[ofs].buffer_length =
stmt->result.buf[ofs].buflen;
@@ -693,7 +696,11 @@
ZVAL_DOUBLE
(stmt->result.vars[i], *(double *)stmt->result.buf[i].val);
break;
case IS_STRING:
- if (stmt-
>stmt->bind[i].buffer_type == MYSQL_TYPE_LONGLONG) {
+ if (stmt-
>stmt->bind[i].buffer_type == MYSQL_TYPE_LONGLONG
+#ifdef FIELD_TYPE_BIT
+
|| stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_BIT
+#endif
+ ) {
my_bool uns= (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)?
1:0;
llval= *(my_ulonglong *) stmt->result.buf[i].val;
#if SIZEOF_LONG==8
------------------------------------------------------------------------
[2006-06-02 19:48:58] squasar at eternalviper dot net
Further note: The given patch only applies to code which
assumes that a BIT field is being used as a flag field (i.e. a
BIT(1) column). For larger BIT fields the patch is
insufficient.
------------------------------------------------------------------------
[2006-06-02 05:03:15] squasar at eternalviper dot net
The pasted reproduce code is syntactically incorrect. Here
is the correct version:
<?php
// Assume that $DATABASE is an open MySQLi connection to a
MySQL 5.0.x database
$DATABASE->query( "CREATE TABLE IF NOT EXISTS test_me
( test_col BIT NOT NULL )" );
$DATABASE->query( "INSERT INTO test_me VALUES ( 1 ), ( 0 ),
( 1 ), ( 0 )" );
( $statement = $DATABASE->prepare( "SELECT test_col FROM
test_me" ) );
$statement->execute();
$statement->bind_result( $bits );
while ( $statement->fetch() === TRUE )
debug_zval_dump( $bits );
$statement->close();
?>
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/37671
--
Edit this bug report at http://bugs.php.net/?id=37671&edit=1