#48724 [Opn]: getColumnMeta() doesn't return native_type for BIT, TINYINT and YEAR

From: Date: Fri, 03 Jul 2009 15:39:20 +0000
Subject: #48724 [Opn]: getColumnMeta() doesn't return native_type for BIT, TINYINT and YEAR
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-139215@lists.php.net to get a copy of this message
ID: 48724 User updated by: an0nym at narod dot ru Reported By: an0nym at narod dot ru Status: Open Bug Type: PDO related Operating System: * PHP Version: 5.3.0 New Comment: > 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. Previous Comments: ------------------------------------------------------------------------ [2009-07-03 15:31:27] 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 14:29:33] uw@php.net According to the test behaviour is not to set for certain types. This is what you get. ------------------------------------------------------------------------ [2009-07-03 14:28:26] 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:13:41] 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 13:27:23] 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? ------------------------------------------------------------------------ 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/48724 -- Edit this bug report at http://bugs.php.net/?id=48724&edit=1

« previous php.bugs (#139215) next »