if (count(($tmp = $stmt->fetchAll(PDO::FETCH_ASSOC))) != 2)
     	printf("[074] Expecting two rows, got %d rows\n", $tmp);
     */
 }
 prepex(57, $db, 'DELETE FROM test');
 prepex(58, $db, 'INSERT INTO test(id, label) VALUES (1, ?), (2, ?)', array('row1', 'row2'));
 /*
 TODO enable after fix
 $stmt = prepex(37, $db, 'SELECT id, label FROM \'test WHERE MATCH label AGAINST (:placeholder)',
 	array(':placeholder' => 'row'),
 	array('execute' => array('sqlstate' => '42000', 'mysql' => 1064)));
 */
 $stmt = prepex(59, $db, 'SELECT id, label AS "label" FROM test WHERE label = ?', array('row1'));
 $tmp = $stmt->fetchAll(PDO::FETCH_ASSOC);
 $exp = array(0 => array("id" => "1", "label" => "row1"));
 if (MySQLPDOTest::isPDOMySQLnd()) {
     // mysqlnd returns native types
     $exp[0]['id'] = 1;
 }
 if ($tmp !== $exp) {
     printf("[065] Results seem wrong. Please check dumps manually.\n");
     var_dump($exp);
     var_dump($tmp);
 }
 $sql = sprintf("SELECT id, label FROM test WHERE (label LIKE %s) AND (id = ?)", $db->quote('%ro%'));
 $stmt = prepex(60, $db, $sql, array(-1));
 if (count($tmp = $stmt->fetchAll(PDO::FETCH_ASSOC)) != 0) {
     printf("[061] Expecting zero rows, got %d rows\n", $tmp);
 }
 $sql = sprintf("SELECT id, label FROM test WHERE  (id = ?) OR (label LIKE %s)", $db->quote('%ro%'));
 $stmt = prepex(61, $db, $sql, array(1));
             printf("[%03d + 6] Expecting native type %s, %s\n", $offset, var_export($native_type, true), var_export($meta, true));
             return false;
         }
     }
     if (!is_null($pdo_type) && $meta['pdo_type'] != $pdo_type) {
         printf("[%03d + 6] Expecting PDO type %s got %s (%s)\n", $offset, $pdo_type, var_export($meta, true), var_export($meta['native_type']));
         return false;
     }
     return true;
 }
 $stmt = $db->prepare('SELECT @@sql_mode AS _mode');
 $stmt->execute();
 $row = $stmt->fetch(PDO::FETCH_ASSOC);
 $real_as_float = false === stristr($row['_mode'], "REAL_AS_FLOAT") ? false : true;
 $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
 $is_mysqlnd = MySQLPDOTest::isPDOMySQLnd();
 test_meta($db, 20, 'BIT(8)', 1, 'BIT', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 30, 'TINYINT', -127, 'TINY', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 40, 'TINYINT UNSIGNED', 255, 'TINY', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 50, 'BOOLEAN', 1, NULL, $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 60, 'SMALLINT', -32768, 'SHORT', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 70, 'SMALLINT UNSIGNED', 65535, 'SHORT', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 80, 'MEDIUMINT', -8388608, 'INT24', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 90, 'MEDIUMINT UNSIGNED', 16777215, 'INT24', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 100, 'INT', -2147483648, 'LONG', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 110, 'INT UNSIGNED', 4294967295, 'LONG', $is_mysqlnd ? PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 120, 'BIGINT', -9.223372036854776E+18, 'LONGLONG', $is_mysqlnd ? PHP_INT_SIZE == 4 ? PDO::PARAM_STR : PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 130, 'BIGINT UNSIGNED', 1.8446744073709552E+19, 'LONGLONG', $is_mysqlnd ? PHP_INT_SIZE == 4 ? PDO::PARAM_STR : PDO::PARAM_INT : PDO::PARAM_STR);
 test_meta($db, 130, 'REAL', -1.01, $real_as_float ? 'FLOAT' : 'DOUBLE', PDO::PARAM_STR);
 test_meta($db, 140, 'REAL UNSIGNED', 1.01, $real_as_float ? 'FLOAT' : 'DOUBLE', PDO::PARAM_STR);
 test_meta($db, 150, 'REAL ZEROFILL', -1.01, $real_as_float ? 'FLOAT' : 'DOUBLE', PDO::PARAM_STR);
function pdo_mysql_stmt_closecursor($db)
{
    // This one should fail. I let it fail to prove that closeCursor() makes a difference.
    // If no error messages gets printed do not know if proper usage of closeCursor() makes any
    // difference or not. That's why we need to cause an error here.
    $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
    $stmt1 = $db->query('SELECT id, label FROM test ORDER BY id ASC');
    // query() shall fail!
    $stmt2 = $db->query('SELECT id, label FROM test ORDER BY id ASC');
    $stmt1->closeCursor();
    // This is proper usage of closeCursor(). It shall prevent any further error messages.
    if (MySQLPDOTest::isPDOMySQLnd()) {
        $stmt1 = $db->query('SELECT id, label FROM test ORDER BY id ASC');
    } else {
        // see pdo_mysql_stmt_unbuffered_2050.phpt for an explanation
        unset($stmt1);
        $stmt1 = $db->query('SELECT id, label FROM test ORDER BY id ASC');
    }
    // fetch only the first rows and let closeCursor() clean up
    $row1 = $stmt1->fetch(PDO::FETCH_ASSOC);
    $stmt1->closeCursor();
    $stmt2 = $db->prepare('UPDATE test SET label = ? WHERE id = ?');
    $stmt2->bindValue(1, "z");
    $stmt2->bindValue(2, $row1['id']);
    $stmt2->execute();
    $stmt2->closeCursor();
    $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    // check if changing the fetch mode from unbuffered to buffered will
    // cause any harm to a statement created prior to the change
    $stmt1->execute();
    $row2 = $stmt1->fetch(PDO::FETCH_ASSOC);
    $stmt1->closeCursor();
    if (!isset($row2['label']) || 'z' !== $row2['label']) {
        printf("Expecting array(id => 1, label => z) got %s\n", var_export($row2, true));
    }
    unset($stmt1);
    $stmt1 = $db->query('SELECT id, label FROM test ORDER BY id ASC');
    // should work
    $stmt2 = $db->query('SELECT id, label FROM test ORDER BY id ASC');
    $stmt1->closeCursor();
    $stmt1 = $db->query('SELECT id, label FROM test ORDER BY id ASC');
    // fetch only the first rows and let closeCursor() clean up
    $row3 = $stmt1->fetch(PDO::FETCH_ASSOC);
    $stmt1->closeCursor();
    assert($row3 == $row2);
    $stmt2 = $db->prepare('UPDATE test SET label = ? WHERE id = ?');
    $stmt2->bindValue(1, "a");
    $stmt2->bindValue(2, $row1['id']);
    $stmt2->execute();
    $stmt2->closeCursor();
    $stmt1->execute();
    $row4 = $stmt1->fetch(PDO::FETCH_ASSOC);
    $stmt1->closeCursor();
    assert($row4 == $row1);
    $offset = 0;
    $stmt = $db->prepare('SELECT id, label FROM test WHERE id > ? ORDER BY id ASC LIMIT 2');
    $in = 0;
    if (!$stmt->bindParam(1, $in)) {
        printf("[%03d + 1] Cannot bind parameter, %s %s\n", $offset, $stmt->errorCode(), var_export($stmt->errorInfo(), true));
    }
    $stmt->execute();
    $id = $label = null;
    if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT)) {
        printf("[%03d + 2] Cannot bind integer column, %s %s\n", $offset, $stmt->errorCode(), var_export($stmt->errorInfo(), true));
    }
    if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR)) {
        printf("[%03d + 3] Cannot bind string column, %s %s\n", $offset, $stmt->errorCode(), var_export($stmt->errorInfo(), true));
    }
    while ($stmt->fetch(PDO::FETCH_BOUND)) {
        printf("in = %d -> id = %s (%s) / label = %s (%s)\n", $in, var_export($id, true), gettype($id), var_export($label, true), gettype($label));
    }
    $stmt->closeCursor();
    $stmt->execute();
}