@@ -5,11 +5,22 @@ mysqli_fetch_field() - flags/field->flags
5
5
require_once ('skipif.inc ' );
6
6
require_once ('skipifemb.inc ' );
7
7
require_once ('skipifconnectfailure.inc ' );
8
+
9
+ require_once ('connect.inc ' );
10
+ if (!$ link = mysqli_connect ($ host , $ user , $ passwd , $ db , $ port , $ socket ))
11
+ die (printf ("skip: [%d] %s \n" , mysqli_connect_errno (), mysqli_connect_error ()));
12
+
13
+ if (mysqli_get_server_version ($ link ) < 50041 )
14
+ die ("skip: Due to many MySQL Server differences, the test requires 5.0.41+ " );
15
+
16
+ mysqli_close ($ link );
8
17
?>
9
18
--FILE--
10
19
<?php
11
20
include "connect.inc " ;
12
21
22
+ /* TODO: mysqli.c needs to export a few more constants - see all the defined() calls! */
23
+
13
24
$ flags = array (
14
25
MYSQLI_NOT_NULL_FLAG => 'NOT_NULL ' ,
15
26
MYSQLI_PRI_KEY_FLAG => 'PRI_KEY ' ,
@@ -23,12 +34,19 @@ require_once('skipifconnectfailure.inc');
23
34
MYSQLI_SET_FLAG => 'SET ' ,
24
35
MYSQLI_NUM_FLAG => 'NUM ' ,
25
36
MYSQLI_PART_KEY_FLAG => 'PART_KEY ' ,
26
- MYSQLI_GROUP_FLAG => 'MYSQLI_GROUP_FLAG '
27
- // MYSQLI_NO_DEFAULT_VALUE_FLAG
28
- // MYSQLI_BINARY_FLAG
29
- // MYSQLI_ENUM_FLAG
37
+ // MYSQLI_GROUP_FLAG => 'MYSQLI_GROUP_FLAG' - internal usage only
38
+ ( defined ( ' MYSQLI_NO_DEFAULT_VALUE_FLAG ' ) ? MYSQLI_NO_DEFAULT_VALUE_FLAG : 4096 ) => ' NO_DEFAULT_VALUE ' ,
39
+ ( defined ( ' MYSQLI_BINARY_FLAG ' ) ? MYSQLI_BINARY_FLAG : 128 ) => ' BINARY ' ,
40
+ ( defined ( ' MYSQLI_ENUM_FLAG ' ) ? MYSQLI_ENUM_FLAG : 256 ) => ' ENUM ' ,
30
41
// MYSQLI_BINCMP_FLAG
31
42
);
43
+
44
+ // 5.1.24 / 6.0.4+
45
+ if (defined ('MYSQLI_ON_UPDATE_NOW ' ))
46
+ $ flags [MYSQLI_ON_UPDATE_NOW ] = 'ON_UPDATE_NOW ' ;
47
+ else
48
+ $ flags [8192 ] = 'ON_UPDATE_NOW ' ;
49
+
32
50
krsort ($ flags );
33
51
34
52
$ columns = array (
@@ -37,13 +55,13 @@ require_once('skipifconnectfailure.inc');
37
55
'INT NOT NULL DEFAULT 1 ' => 'NOT_NULL NUM ' ,
38
56
'INT UNSIGNED DEFAULT NULL ' => 'UNSIGNED NUM ' ,
39
57
'INT UNSIGNED NOT NULL ' => 'NOT_NULL UNSIGNED NO_DEFAULT_VALUE NUM ' ,
40
- 'INT UNSIGNED NOT NULL DEFAULT 1 ' => 'NOT_NULL UNSIGNED NULL ' ,
58
+ 'INT UNSIGNED NOT NULL DEFAULT 1 ' => 'NOT_NULL UNSIGNED NUM ' ,
41
59
'INT UNSIGNED ZEROFILL DEFAULT NULL ' => 'UNSIGNED ZEROFILL NUM ' ,
42
60
'INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ' => 'NOT_NULL PRI_KEY UNSIGNED AUTO_INCREMENT NUM PART_KEY ' ,
43
61
'CHAR(1) DEFAULT NULL ' => '' ,
44
62
'CHAR(1) NOT NULL ' => 'NOT_NULL NO_DEFAULT_VALUE ' ,
45
63
'TIMESTAMP NOT NULL ' => 'NOT_NULL UNSIGNED ZEROFILL BINARY TIMESTAMP ' ,
46
- 'VARBINARY(127) DEFAULT NULL ' => 'NOT_NULL BINARY ' ,
64
+ 'VARBINARY(127) DEFAULT NULL ' => 'BINARY ' ,
47
65
'BLOB ' => 'BLOB BINARY ' ,
48
66
'TINYBLOB ' => 'BLOB BINARY ' ,
49
67
'MEDIUMBLOB ' => 'BLOB BINARY ' ,
@@ -67,10 +85,9 @@ require_once('skipifconnectfailure.inc');
67
85
);
68
86
69
87
function checkFlags ($ reported_flags , $ expected_flags , $ flags ) {
70
-
71
88
$ found_flags = $ unexpected_flags = '' ;
72
89
foreach ($ flags as $ code => $ name ) {
73
- if ($ code >= $ reported_flags ) {
90
+ if ($ reported_flags >= $ code ) {
74
91
$ reported_flags -= $ code ;
75
92
$ found_flags .= $ name . ' ' ;
76
93
if (stristr ($ expected_flags , $ name )) {
@@ -118,13 +135,57 @@ require_once('skipifconnectfailure.inc');
118
135
continue ;
119
136
}
120
137
138
+ /*
139
+ TODO
140
+ Unfortunately different server versions give you slightly different
141
+ results.The test does not yet fully reflect all server changes/bugs etc.
142
+ */
143
+ switch ($ column_def ) {
144
+ case 'TIMESTAMP NOT NULL ' :
145
+ // http://bugs.mysql.com/bug.php?id=30081 - new flag introduced in 5.1.24/6.0.4
146
+ $ version = mysqli_get_server_version ($ link );
147
+ if ((($ version > 50122 ) && ($ version < 60000 )) ||
148
+ ($ version >= 60004 )) {
149
+ // new flag ON_UPDATE_NOW_FLAG (8192)
150
+ $ expected_flags .= ' ON_UPDATE_NOW ' ;
151
+ }
152
+ break ;
153
+
154
+ case 'INT UNSIGNED NOT NULL ' :
155
+ case 'INT NOT NULL ' :
156
+ case 'CHAR(1) NOT NULL ' :
157
+ case 'SET("one", "two") NOT NULL ' :
158
+ case 'ENUM("one", "two") NOT NULL ' :
159
+ $ version = mysqli_get_server_version ($ link );
160
+ if ($ version < 50000 ) {
161
+ // TODO - check exact version!
162
+ $ expected_flags = trim (str_replace ('NO_DEFAULT_VALUE ' , '' , $ expected_flags ));
163
+ }
164
+ break ;
165
+
166
+ case 'BIT ' :
167
+ $ version = mysqli_get_server_version ($ link );
168
+ if ($ version <= 50105 ) {
169
+ // TODO - check exact version!
170
+ $ expected_flags = trim (str_replace ('UNSIGNED ' , '' , $ expected_flags ));
171
+ }
172
+
173
+ default :
174
+ break ;
175
+ }
176
+
121
177
list ($ missing_flags , $ unexpected_flags , $ flags_found ) = checkFlags ($ field ->flags , $ expected_flags , $ flags );
122
- if ($ unexpected_flags )
178
+ if ($ unexpected_flags ) {
123
179
printf ("[006] Found unexpected flags '%s' for %s, found '%s' \n" ,
124
180
$ unexpected_flags , $ column_def , $ flags_found );
125
- if ($ missing_flags )
181
+ }
182
+ if ($ missing_flags ) {
126
183
printf ("[007] The flags '%s' have not been reported for %s, found '%s' \n" ,
127
184
$ missing_flags , $ column_def , $ flags_found );
185
+ var_dump ($ create );
186
+ var_dump (mysqli_get_server_version ($ link ));
187
+ die ($ missing_flags );
188
+ }
128
189
129
190
mysqli_free_result ($ res );
130
191
}
0 commit comments