mysqli_explain_metadata.phpt 5.9 KB

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