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