1--TEST-- 2EXPLAIN - metadata 3--SKIPIF-- 4<?php 5require_once('skipif.inc'); 6require_once('skipifconnectfailure.inc'); 7require_once("connect.inc"); 8if (!$IS_MYSQLND) 9 die("skip Open libmysql/MySQL issue http://bugs.mysql.com/?id=62350"); 10?> 11--FILE-- 12<?php 13 require_once('connect.inc'); 14 require_once('table.inc'); 15 16 if (!$res = mysqli_query($link, 'EXPLAIN SELECT t1.*, t2.* FROM test AS t1, test AS t2')) 17 printf("[001] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); 18 19 $num_rows = 0; 20 $num_fields = 0; 21 $field_names = array(); 22 if (!$row = mysqli_fetch_assoc($res)) { 23 printf("[002] Expecting result but got no data [%d] %s\n", 24 mysqli_errno($link), mysqli_error($link)); 25 } else { 26 $num_rows++; 27 $num_fields = count($row); 28 foreach ($row as $name => $value) 29 $field_names[$name] = gettype($value); 30 } 31 32 while ($row = mysqli_fetch_assoc($res)) 33 $num_rows++; 34 35 if (($tmp = mysqli_num_rows($res)) !== $num_rows) { 36 printf("[003] Expecting int/%d got %s/%s\n", 37 $num_rows, gettype($tmp), $tmp); 38 } 39 if (($tmp = mysqli_field_count($link)) !== $num_fields) { 40 printf("[004] Expecting int/%d got %s/%s\n", 41 $num_fields, gettype($tmp), $tmp); 42 } 43 $fields = mysqli_fetch_fields($res); 44 if (($tmp = count($fields)) !== $num_fields) { 45 printf("[005] Expecting int/%d got %s/%s\n", 46 $num_fields, gettype($tmp), $tmp); 47 } 48 49 foreach ($fields as $k => $field) { 50 $field->max_length = 0;// change it or we will get diff error 51 if (isset($field_names[$field->name])) { 52 unset($field_names[$field->name]); 53 } else { 54 printf("[006] Unexpected field '%s', dumping info\n"); 55 var_dump($field); 56 } 57 } 58 if (!empty($field_names)) { 59 printf("[007] Field descriptions missing for the following columns\n"); 60 var_dump($field_names); 61 } 62 63 mysqli_free_result($res); 64 65 $stmt = mysqli_stmt_init($link); 66 /* Depending on your version, the MySQL server migit not support this */ 67 if ($stmt->prepare('EXPLAIN SELECT t1.*, t2.* FROM test AS t1, test AS t2') && $stmt->execute()) { 68 if (!mysqli_stmt_store_result($stmt)) 69 printf("[008] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 70 71 if (!$res_meta = mysqli_stmt_result_metadata($stmt)) 72 printf("[009] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 73 74 if (($tmp = mysqli_stmt_num_rows($stmt)) !== $num_rows) { 75 printf("[010] Expecting int/%d got %s/%s\n", 76 $num_rows, gettype($tmp), $tmp); 77 } 78 if (($tmp = mysqli_stmt_field_count($stmt)) !== $num_fields) { 79 printf("[011] Expecting int/%d got %s/%s\n", 80 $num_fields, gettype($tmp), $tmp); 81 } 82 if (($tmp = mysqli_field_count($link)) !== $num_fields) { 83 printf("[013] Expecting int/%d got %s/%s\n", 84 $num_fields, gettype($tmp), $tmp); 85 } 86 if (($tmp = $res_meta->field_count) !== $num_fields) { 87 printf("[014] Expecting int/%d got %s/%s\n", 88 $num_fields, gettype($tmp), $tmp); 89 } 90 $fields_res_meta = mysqli_fetch_fields($res_meta); 91 if (($tmp = count($fields_res_meta)) !== $num_fields) 92 printf("[015] Expecting int/%d got %s/%s\n", 93 $num_fields, gettype($tmp), $tmp); 94 95 if ($fields_res_meta != $fields) { 96 printf("[016] Prepared Statement metadata differs from normal metadata, dumping\n"); 97 var_dump($fields_res_meta); 98 var_dump($fields); 99 } 100 101 if (function_exists('mysqli_stmt_get_result') && 102 $stmt->prepare('EXPLAIN SELECT t1.*, t2.* FROM test AS t1, test AS t2') && 103 $stmt->execute()) { 104 if (!$res_stmt = mysqli_stmt_get_result($stmt)) { 105 printf("[017] Cannot fetch result from PS [%d] %s\n", 106 mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 107 } 108 if (($tmp = mysqli_num_rows($res_stmt)) !== $num_rows) { 109 printf("[018] Expecting int/%d got %s/%s\n", 110 $num_rows, gettype($tmp), $tmp); 111 } 112 if ((mysqli_stmt_num_rows($stmt)) !== 0) { 113 printf("[019] Expecting int/0 got %s/%s\n", gettype($tmp), $tmp); 114 } 115 if (($tmp = mysqli_stmt_field_count($stmt)) !== $num_fields) { 116 printf("[020] Expecting int/%d got %s/%s\n", 117 $num_fields, gettype($tmp), $tmp); 118 119 } 120 if (($tmp = $res_stmt->field_count) !== $num_fields) { 121 printf("[021] Expecting int/%d got %s/%s\n", 122 $num_fields, gettype($tmp), $tmp); 123 } 124 125 $fields_stmt = mysqli_fetch_fields($res_stmt); 126 if (($tmp = count($fields_stmt)) !== $num_fields) { 127 printf("[022] Expecting int/%d got %s/%s\n", 128 $num_fields, gettype($tmp), $tmp); 129 } 130 reset($fields); 131 foreach ($fields_stmt as $fields_stmt_val) { 132 $fields_val = current($fields); 133 next($fields); 134 unset($fields_stmt_val->max_length); 135 unset($fields_val->max_length); 136 if ($fields_stmt_val != $fields_val) { 137 printf("[023] PS mysqli_stmt_get_result() metadata seems wrong, dumping\n"); 138 var_dump($fields_stmt_val); 139 var_dump($fields_val); 140 } 141 } 142/* 143 if ($fields_stmt != $fields) { 144 printf("[023] PS mysqli_stmt_get_result() metadata seems wrong, dumping\n"); 145 var_dump($fields_stmt); 146 var_dump($fields); 147 } 148*/ 149 mysqli_free_result($res_stmt); 150 } 151 } 152 mysqli_stmt_close($stmt); 153 154 mysqli_close($link); 155 print "done!"; 156?> 157--CLEAN-- 158<?php 159 require_once("clean_table.inc"); 160?> 161--EXPECT-- 162done! 163