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