Bug #52234 mysql tries to allocate 4294967296 bytes when fetching longtext via php-mysqli
Submitted: 19 Mar 2010 20:28 Modified: 25 Mar 2010 7:09
Reporter: Moritz Schönauer Email Updates:
Status: Not a Bug Impact on me:
None 
Category:MySQL Server: Data Types Severity:S3 (Non-critical)
Version:5.1.44 OS:Linux (gentoo)
Assigned to: CPU Architecture:Any
Tags: allocate, longtext, mysqli, php, prepared

[19 Mar 2010 20:28] Moritz Schönauer
Description:
I wanted to fetch some lines in a php script via mysqli-prepared-statement and got this error:
Allowed memory size of 134217728 bytes exhausted (tried to allocate 4294967296 bytes)
I was confused because php reportet that this error occured at bind_result.
After some time I figured out that it works when I turn one field with LONGTEXT type to VARCHAR, for example.

here is a link to my php-script:
http://paste.minad.de/?nid=216

How to repeat:
I can repeat this by fetching a LONGTEXT type field with a mysqli-prepared-statment.
[22 Mar 2010 7:58] Sveta Smirnova
Thank you for the report.

Please provide output of SHOW CREATE TABLE news and SELECT length(BLOB_FIELD) from news.
[23 Mar 2010 10:43] Moritz Schönauer
SHOW CREATE TABLE news
CREATE TABLE `news` ( `n_id` int(13) NOT NULL AUTO_INCREMENT, `n_title` varchar(50) NOT NULL, `n_note` longtext NOT NULL, `n_time` varchar(107) NOT NULL, `n_author` int(13) NOT NULL, PRIMARY KEY (`n_id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

SELECT length(n_note) from news
5
[23 Mar 2010 13:48] Sveta Smirnova
Thank you for the feedback.

I can not repeat described behavior. Please also provide compete PHP code demonstrating the problem including code used to connect to the database and create statement.
[23 Mar 2010 15:34] Moritz Schönauer
<?php
class db {

private $db;

  function __construct() {
    require('#db.php');
    $this->db = new mysqli($host, $user, $pass, $database);
  }

  function __destruct() {
    if(is_object($this->db)) $this->db->close();
  }

  function news_read($limit = 0) {
    if($limit == 0) $qry = "SELECT * FROM news ORDER BY n_id DESC";
    else $qry = "SELECT * FROM news ORDER BY n_id DESC LIMIT $limit";
    $stmt = $this->db->prepare($qry);
    $stmt->execute();
    $stmt->bind_result($n_id,$n_title,$n_note,$n_time,$n_author);
    while($stmt->fetch()) {
      $news = array(id => $n_id, title => $n_title, note => $n_note, time => $n_time, author => $n_author);
      $array[] = $news;
    }
    return $array;
  }

}

$db = new db;
$db->news_read();

?>

maybe it is caused by php?
minad ~ # php --version
PHP 5.2.13-pl0-gentoo (cli) (built: Mar 22 2010 18:46:54)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
[24 Mar 2010 6:08] Sveta Smirnova
Thank you for the feedback.

> maybe it is caused by php?

Yes, this can be the cause: still no error in my environment.

But this can be caused by specific MySQL settings too. Please send us your my.cnf content also.
[24 Mar 2010 13:32] Moritz Schönauer
http://paste.pocoo.org/show/193248/  <-- my.cnf

i tried reinstalling of php and mysql, too, but without success.
[24 Mar 2010 22:35] Sveta Smirnova
Thank you for the feedback.

Problem is PHP of version 5.2.13: I just tried and bug is repeatable as described. While with different version of PHP (5.3 from outdated development sources) bug is not repeatable. Please open bug in PHP bugs database.
[25 Mar 2010 7:09] Moritz Schönauer
thank you!