1--TEST-- 2mysqli_stmt_bind_result() 3--SKIPIF-- 4<?php 5require_once('skipif.inc'); 6require_once('skipifconnectfailure.inc'); 7?> 8--FILE-- 9<?php 10 require_once("connect.inc"); 11 12 function dec32bin($dec, $bits) { 13 14 $maxval = pow(2, $bits); 15 $bin = ''; 16 for ($bitval = $maxval; $bitval >= 1; $bitval = $bitval / 2) { 17 if (($dec / $bitval) >= 1) { 18 $bin .= '1'; 19 $dec -= $bitval; 20 } else { 21 $bin .= '0'; 22 } 23 } 24 return $bin; 25 } 26 27 if (!$link_ins = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) 28 printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", 29 $host, $user, $db, $port, $socket); 30 31 if (!$link_sel = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) 32 printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", 33 $host, $user, $db, $port, $socket); 34 35 for ($bits = 1; $bits <= 46; $bits++) { 36 37 if (1 == $bits) 38 $max_value = 1; 39 else 40 $max_value = pow(2, $bits) - 1; 41 42 if (!mysqli_query($link_ins, "DROP TABLE IF EXISTS test")) { 43 printf("[003 - %d] [%d] %s\n", $bits, mysqli_errno($link_ins), mysqli_error($link_ins)); 44 } 45 46 if (!mysqli_query($link_ins, sprintf("CREATE TABLE test(id BIGINT, bit_value BIT(%d) NOT NULL, bit_null BIT(%d) DEFAULT NULL) ENGINE = %s", $bits, $bits, $engine))) { 47 // don't bail - column type might not be supported by the server, ignore this 48 continue; 49 } 50 if (!$stmt_ins = mysqli_stmt_init($link_ins)) { 51 printf("[004 - %d] [%d] %s\n", $bits, mysqli_errno($link_ins), mysqli_error($link_ins)); 52 continue; 53 } 54 55 if (!mysqli_stmt_prepare($stmt_ins, "INSERT INTO test(id, bit_value) VALUES (?, ?)")) { 56 printf("[005 - %d] [%d] %s\n", $bits, mysqli_stmt_errno($stmt_ins), mysqli_stmt_error($stmt_ins)); 57 mysqli_stmt_close($stmt_ins); 58 continue; 59 } 60 61 if (!($stmt_sel = mysqli_stmt_init($link_sel))) { 62 printf("[006 - %d] [%d] %s\n", $bits, mysqli_errno($link_sel), mysqli_error($link_sel)); 63 mysqli_stmt_close($stmt_ins); 64 continue; 65 } 66 67 $tests = 0; 68 $rand_max = mt_getrandmax(); 69 while ($tests < 10) { 70 71 $tests++; 72 if (1 == $tests) 73 $value = 0; 74 else if (2 == $tests) 75 $value = $max_value; 76 else { 77 if ($max_value > $rand_max) { 78 $max_loops = floor($max_value/$rand_max); 79 $num_loops = mt_rand(1, $max_loops); 80 $value = 0; 81 for ($i = 0; $i < $num_loops; $i++) 82 $value += mt_rand(0, $rand_max); 83 } else { 84 $value = mt_rand(0, $max_value); 85 } 86 } 87 88 $bin = ($bits < 32) ? decbin($value) : dec32bin($value, $bits); 89 for ($i = 0; ($i < strlen($bin)) && ($bin[$i] == '0'); $i++) 90 ; 91 $bin2 = substr($bin, $i, strlen($bin)); 92 93 if (!mysqli_stmt_bind_param($stmt_ins, "dd", $value, $value)) { 94 printf("[007 - %d] [%d] %s\n", $bits, mysqli_stmt_errno($stmt_ins), mysqli_stmt_error($stmt_ins)); 95 mysqli_stmt_close($stmt_ins); 96 continue; 97 } 98 if (!mysqli_stmt_execute($stmt_ins)) { 99 printf("[008 - %d] [%d] %s\n", $bits, mysqli_stmt_errno($stmt_ins), mysqli_stmt_error($stmt_ins)); 100 break; 101 } 102 $sql = sprintf("SELECT id, BIN(bit_value) AS _bin, bit_value, bit_value + 0 AS _bit_value0, bit_null FROM test WHERE id = %s", $value); 103 if ((!mysqli_stmt_prepare($stmt_sel, $sql)) || 104 (!mysqli_stmt_execute($stmt_sel))) { 105 printf("[009 - %d] [%d] %s\n", $bits, mysqli_stmt_errno($stmt_sel), mysqli_stmt_error($stmt_sel)); 106 break; 107 } 108 109 $row = array('id' => -1, '_bin' => - 1, 'bit_value' => -1, '_bit_value0' => -1, 'bit_null' => -1); 110 if (!mysqli_stmt_bind_result($stmt_sel, $row['id'], $row['_bin'], $row['bit_value'], $row['_bit_value0'], $row['bit_null'])) { 111 printf("[010 - %d] [%d] %s\n", $bits, mysqli_stmt_errno($stmt_sel), mysqli_stmt_error($stmt_sel)); 112 break; 113 } 114 115 if (!($ret = mysqli_stmt_fetch($stmt_sel))) { 116 printf("[011 - %d] mysqli_stmt_fetch() has failed for %d bits - ret = %s/%s, [%d] %s, [%d] %s\n", 117 $bits, $bits, 118 gettype($ret), $ret, 119 mysqli_stmt_errno($stmt_sel), mysqli_stmt_error($stmt_sel), 120 mysqli_errno($link_sel), mysqli_errno($link_sel) 121 ); 122 break; 123 } 124 125 if (($value != $row['id']) || (($bin != $row['_bin']) && ($bin2 != $row['_bin']))) { 126 debug_zval_dump($row); 127 printf("[012 - %d] Insert of %s in BIT(%d) column might have failed. id = %s, bin = %s (%s/%s)\n", 128 $bits, $value, $bits, $row['id'], $row['_bin'], $bin, $bin2); 129 break; 130 } 131 if ($value != $row['bit_value']) { 132 debug_zval_dump($row); 133 printf("[013 - %d] Expecting %s got %s\n", $bits, $value, $row['bit_value']); 134 break; 135 } 136 137 if (null !== $row['bit_null']) { 138 debug_zval_dump($row); 139 printf("[014 - %d] Expecting null got %s/%s\n", $bits, gettype($row['bit_value']), $row['bit_value']); 140 break; 141 } 142 143 } 144 145 mysqli_stmt_close($stmt_ins); 146 mysqli_stmt_close($stmt_sel); 147 } 148 149 mysqli_close($link_ins); 150 mysqli_close($link_sel); 151 print "done!"; 152?> 153--CLEAN-- 154<?php 155 require_once("clean_table.inc"); 156?> 157--EXPECT-- 158done! 159