php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #48724 getColumnMeta() doesn't return native_type for BIT, TINYINT and YEAR
Submitted: 2009-06-29 18:02 UTC Modified: 2013-01-30 16:41 UTC
Votes:12
Avg. Score:4.4 ± 0.9
Reproduced:10 of 11 (90.9%)
Same Version:5 (50.0%)
Same OS:8 (80.0%)
From: an0nym at narod dot ru Assigned: mysql
Status: Closed Package: PDO related
PHP Version: 5.3.0 OS: *
Private report: No CVE-ID:
 [2009-06-29 18:02 UTC] an0nym at narod dot ru
Description:
------------
PDOStatement::getColumnMeta() doesn't return native_type for BIT, 
TINYINT and YEAR type columns (these should be 'BIT', 'TINY' and 'YEAR' 
respectively). 

This bug was partly discussed within bug #46533, but that bug is 
generally about another thing. 

Reproduce code:
---------------
$DB=new PDO('mysql:host=localhost;dbname=test','anyone','anyone');
$DB->exec('CREATE TABLE `test`(
	 `bit` bit(1)
	,`tinyint` tinyint
	,`year` year)');
$DB->exec('INSERT INTO `test` VALUES(1,1,2000)');
$statement=$DB->query('SELECT `bit`,`tinyint`,`year` FROM `test`');
$bit=$statement->getColumnMeta(0);
$tinyint=$statement->getColumnMeta(1);
$year=$statement->getColumnMeta(2);
var_dump(isset($bit['native_type']),isset($tinyint['native_type']),isset($year['native_type']));

Expected result:
----------------
bool(true) bool(true) bool(true)

Actual result:
--------------
bool(false) bool(false) bool(false)

Patches

fix-bug-48724.patch (last revision 2012-04-13 12:06 UTC) by tony2001@php.net)

Add a Patch

Pull Requests

Pull requests:

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-06-30 15:33 UTC] an0nym at narod dot ru
Tested - this bug remains actual with PHP 5.3.0 and mysqlnd.
 [2009-07-03 13:27 UTC] uw@php.net
Warning

This function is EXPERIMENTAL. The behaviour of this function, its name, and surrounding documentation may change without notice in a future release of PHP. This function should be used at your own risk. 

http://de2.php.net/manual/en/pdostatement.getcolumnmeta.php

How can there be a bug if behaviour is undefined?
 [2009-07-03 14:13 UTC] an0nym at narod dot ru
If function has expected behaviour for 35 of 38 cases (that's how many 
different types has MySQL), it is rather clear how should it behave for 
remaining 3. 

> How can there be a bug if behaviour is undefined? 
Behaviour is not undefined. According to the link you provided, 
behaviour can be changed without notice, but on the moment of writing it 
is surely defined and has a bug.
 [2009-07-03 14:28 UTC] uw@php.net
libmysql and mysqlnd behave the same way. If this is decided to be considered as a bug it is not a mysqlnd bug.







------------ libmysql -----------------------

nixnutz@ulflinux:~/src/login/php5> sapi/cli/php -i | grep -C5 pdo_mysql
PDO

PDO support => enabled
PDO drivers => mysql, sqlite, sqlite2

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => 5.1.35

pdo_sqlite
nixnutz@ulflinux:~/src/login/php5> sapi/cli/php -i | grep configure
Configure Command =>  './configure'  '--with-pdo-mysql=/usr/local/mysql/bin/mysql_config'

nixnutz@ulflinux:~/src/login/php5> sapi/cli/php pdo.php

int(0)
int(0)
object(PDOStatement)#2 (1) {
  ["queryString"]=>
  string(36) "SELECT cbit,ctinyint,cyear FROM test"
}
array(6) {
  ["flags"]=>
  array(0) {
  }
  ["table"]=>
  string(4) "test"
  ["name"]=>
  string(5) "cyear"
  ["len"]=>
  int(4)
  ["precision"]=>
  int(0)
  ["pdo_type"]=>
  int(2)
}
bool(false)
bool(false)
bool(false)
array(1) {
  [0]=>
  array(2) {
    ["VERSION()"]=>
    string(6) "5.1.35"
    [0]=>
    string(6) "5.1.35"
  }
}


------ mysqlnd --------------------

nixnutz@ulflinux:~/src/login/php5> sapi/cli/php -i | grep configure
Configure Command =>  './configure'  '--with-pdo-mysql=mysqlnd' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--enable-debug'
nixnutz@ulflinux:~/src/login/php5> sapi/cli/php -i | grep -C5 pdo_mysql
PDO

PDO support => enabled
PDO drivers => mysql, sqlite, sqlite2

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $
Persistent cache => enabled
put_hits => 0
--
size => 2000
free_items => 2000
references => 2

Directive => Local Value => Master Value
pdo_mysql.cache_size => 2000 => 2000
pdo_mysql.debug => no value => no value
pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock

pdo_sqlite

PDO Driver for SQLite 3.x => enabled
SQLite Library => 3.6.16
nixnutz@ulflinux:~/src/login/php5> sapi/cli/php pdo.php

int(0)
int(0)
object(PDOStatement)#2 (1) {
  ["queryString"]=>
  string(36) "SELECT cbit,ctinyint,cyear FROM test"
}
array(6) {
  ["pdo_type"]=>
  int(2)
  ["flags"]=>
  array(0) {
  }
  ["table"]=>
  string(4) "test"
  ["name"]=>
  string(5) "cyear"
  ["len"]=>
  int(4)
  ["precision"]=>
  int(0)
}
bool(false)
bool(false)
bool(false)
array(1) {
  [0]=>
  array(2) {
    ["VERSION()"]=>
    string(6) "5.1.35"
    [0]=>
    string(6) "5.1.35"
  }
}


 [2009-07-03 14:29 UTC] uw@php.net
According to the test behaviour is not to set for certain types. This is what you get.
 [2009-07-03 15:31 UTC] an0nym at narod dot ru
Tell me then, why MySQLi is OK with all the types while PDO is not? 
Nevertheless, it is not just OK, but it is EQUAL in behaviour for all 
the types except TINYINT, BIT and YEAR. 

Don't tell me, please, MySQLi type and PDO native type refer to 
different things. I'm almost sure they don't. At least they shouldn't. 

<?php $PDO=new 
PDO('mysql:host=localhost;dbname=test','anyone','anyone');
$PDO->exec("CREATE TABLE `test`(
	 `tinyint` TINYINT NOT NULL
	,`smallint` SMALLINT NOT NULL
	,`mediumint` MEDIUMINT NOT NULL
	,`int` INT NOT NULL
	,`bigint` BIGINT NOT NULL
	,`decimal` DECIMAL NOT NULL
	,`float` FLOAT NOT NULL
	,`double` DOUBLE NOT NULL
	,`bit` BIT(1) NOT NULL
	,`date` DATE NOT NULL
	,`datetime` DATETIME NOT NULL
	,`timestamp` TIMESTAMP NOT NULL
	,`time` TIME NOT NULL
	,`year` YEAR NOT NULL
	,`char` CHAR(1) NOT NULL
	,`varchar` VARCHAR(1) NOT NULL
	,`tinytext` TINYTEXT NOT NULL
	,`text` TEXT NOT NULL
	,`mediumtext` MEDIUMTEXT NOT NULL
	,`longtext` LONGTEXT NOT NULL
	,`binary` BINARY(1) NOT NULL
	,`varbinary` VARBINARY(1) NOT NULL
	,`tinyblob` TINYBLOB NOT NULL
	,`mediumblob` MEDIUMBLOB NOT NULL
	,`blob` BLOB NOT NULL
	,`longblob` LONGBLOB NOT NULL
	,`enum` ENUM('') NOT NULL
	,`set` SET('') NOT NULL)");
$PDO->exec('INSERT INTO `test`(`tinyint`) VALUES(0)');
$PDO_statement=$PDO->query('SELECT * FROM `test`');
$PDO_fields=array();
for($i=0,$n=$PDO_statement->columnCount();$i<$n;++$i){
	$PDO_fields[]=$PDO_statement->getColumnMeta($i);
}
$MySQLi=new mysqli('localhost','anyone','anyone','test');
$MySQLi_result=$MySQLi->query('SELECT * FROM `test`');
$MySQLi_fields=$MySQLi_result->fetch_fields();
$bug_fields=array();
for($i=0,$n=count($PDO_fields);$i<$n;++$i){
	if(!isset($PDO_fields[$i]['native_type'])
		 or 
constant('MYSQLI_TYPE_'.$PDO_fields[$i]['native_type'])!=$MySQLi_field
s[$i]->type){
		$bug_fields[]=$PDO_fields[$i]['name'];
	}
}
var_dump($bug_fields);
$PDO->exec('DROP TABLE `test`'); ?>
 [2009-07-03 15:39 UTC] an0nym at narod dot ru
> libmysql and mysqlnd behave the same way. If this is decided to be
considered as a bug it is not a mysqlnd bug. 
I agree. This is not a libmysql or mysqlnd bug. This is a PDO (or 
PDO_MySQL) bug.
 [2009-07-03 16:17 UTC] uw@php.net
You are free to write a patch. 

I refuse to work on stuff that has no specification and which may go into any direction. That typically ends up in a backwards compatibility nightmare, which in particular for an abstraction like PDO makes no sense to me.

The patch may be rather simple. But watch out for different values returned by different MySQL versions.
 [2009-07-03 16:30 UTC] an0nym at narod dot ru
Poor MySQLi developers... they've managed to solve this problem without 
specification. 

Poor you... you've spent sooo many time for nothing developing this 
function, which works in 35 of 38 cases - this stuff has no 
specification! Wait for a specification - you have a good excuse! 

Bye.
 [2009-07-03 16:57 UTC] uw@php.net
You are free to patch it. 

Bye.
 [2012-04-13 12:06 UTC] tony2001@php.net
The following patch has been added/updated:

Patch Name: fix-bug-48724.patch
Revision:   1334318775
URL:        https://bugs.php.net/patch-display.php?bug=48724&patch=fix-bug-48724.patch&revision=1334318775
 [2012-04-16 12:12 UTC] tony2001@php.net
Ulf, could you pls check if the attached patch is correct?
Thanks.
 [2012-04-16 12:12 UTC] tony2001@php.net
-Status: Open +Status: Assigned
 [2013-01-18 21:52 UTC] stas@php.net
-Assigned To: +Assigned To: uw
 [2013-01-30 16:41 UTC] uw@php.net
-Assigned To: uw +Assigned To: mysql
 [2013-06-17 07:42 UTC] stas@php.net
Automatic comment on behalf of tony@daylessday.org
Revision: http://git.php.net/?p=php-src.git;a=commit;h=95cc763a1484c4922f6577c10de937299dc8c8e0
Log: fix bug #48724
 [2013-06-17 07:42 UTC] stas@php.net
-Status: Assigned +Status: Closed
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Wed Apr 16 13:02:46 2014 UTC