PHP  
 PHP_5_6
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

Test Failure Report for ext/mysqli/tests/mysqli_fetch_field_flags.phpt ('mysqli_fetch_field() - flags/field->flags')

Script

1: <?php
2:     
require_once("connect.inc");
3:
4:
/* TODO: mysqli.c needs to export a few more constants - see all the defined() calls! */
5:
6:     
$flags = array(
7:         
MYSQLI_NOT_NULL_FLAG => 'NOT_NULL',
8:         
MYSQLI_PRI_KEY_FLAG => 'PRI_KEY',
9:         
MYSQLI_UNIQUE_KEY_FLAG => 'UNIQUE_KEY',
10:         
MYSQLI_MULTIPLE_KEY_FLAG => 'MULTIPLE_KEY',
11:         
MYSQLI_BLOB_FLAG => 'BLOB',
12:         
MYSQLI_UNSIGNED_FLAG    => 'UNSIGNED',
13:         
MYSQLI_ZEROFILL_FLAG => 'ZEROFILL',
14:         
MYSQLI_AUTO_INCREMENT_FLAG => 'AUTO_INCREMENT',
15:         
MYSQLI_TIMESTAMP_FLAG    => 'TIMESTAMP',
16:         
MYSQLI_SET_FLAG    => 'SET',
17:         
MYSQLI_NUM_FLAG => 'NUM',
18:         
MYSQLI_PART_KEY_FLAG => 'PART_KEY',
19:         
// MYSQLI_GROUP_FLAG => 'MYSQLI_GROUP_FLAG' - internal usage only
20:         
(defined('MYSQLI_NO_DEFAULT_VALUE_FLAG') ? MYSQLI_NO_DEFAULT_VALUE_FLAG 4096) => 'NO_DEFAULT_VALUE',
21:         (
defined('MYSQLI_BINARY_FLAG') ? MYSQLI_BINARY_FLAG 128) => 'BINARY',
22:         (
defined('MYSQLI_ENUM_FLAG') ? MYSQLI_ENUM_FLAG 256) => 'ENUM',
23:         
// MYSQLI_BINCMP_FLAG
24:     
);
25:
26:     
// 5.1.24 / 6.0.4+
27:     
if (defined('MYSQLI_ON_UPDATE_NOW'))
28:         
$flags[MYSQLI_ON_UPDATE_NOW] = 'ON_UPDATE_NOW';
29:     else
30:         
$flags[8192] = 'ON_UPDATE_NOW';
31:
32:     
krsort($flags);
33:
34:     
$columns = array(
35:         
'INT DEFAULT NULL' => 'NUM',
36:         
'INT NOT NULL' => 'NOT_NULL NO_DEFAULT_VALUE NUM',
37:         
'INT NOT NULL DEFAULT 1' => 'NOT_NULL NUM',
38:         
'INT UNSIGNED DEFAULT NULL' => 'UNSIGNED NUM',
39:         
'INT UNSIGNED NOT NULL'    => 'NOT_NULL UNSIGNED NO_DEFAULT_VALUE NUM',
40:         
'INT UNSIGNED NOT NULL DEFAULT 1' => 'NOT_NULL UNSIGNED NUM',
41:         
'INT UNSIGNED ZEROFILL DEFAULT NULL' => 'UNSIGNED ZEROFILL NUM',
42:         
'INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY' => 'NOT_NULL PRI_KEY UNSIGNED AUTO_INCREMENT NUM PART_KEY',
43:         
'CHAR(1) DEFAULT NULL'    => '',
44:         
'CHAR(1) NOT NULL' => 'NOT_NULL NO_DEFAULT_VALUE',
45:         
'TIMESTAMP NOT NULL' => 'NOT_NULL UNSIGNED ZEROFILL BINARY TIMESTAMP',
46:         
'VARBINARY(127) DEFAULT NULL' => 'BINARY',
47:         
'BLOB'    => 'BLOB BINARY',
48:         
'TINYBLOB'    => 'BLOB BINARY',
49:         
'MEDIUMBLOB'    => 'BLOB BINARY',
50:         
'LONGBLOB'    => 'BLOB BINARY',
51:         
'TEXT'    => 'BLOB',
52:         
'TINYTEXT'    => 'BLOB',
53:         
'MEDIUMTEXT'    => 'BLOB',
54:         
'LONGTEXT'    => 'BLOB',
55:         
'SET("one", "two")'    => 'SET',
56:         
'SET("one", "two") NOT NULL'    => 'NOT_NULL SET NO_DEFAULT_VALUE',
57:         
'SET("one", "two") NOT NULL DEFAULT "one"'    => 'NOT_NULL SET',
58:         
'ENUM("one", "two")'    => 'ENUM',
59:         
'ENUM("one", "two") NOT NULL' => 'NOT_NULL ENUM NO_DEFAULT_VALUE',
60:         
'ENUM("one", "two") NOT NULL DEFAULT "one"' => 'NOT_NULL ENUM',
61:         
'TINYINT UNIQUE' => 'UNIQUE_KEY NUM PART_KEY',
62:         
'SMALLINT UNIQUE' => 'UNIQUE_KEY NUM PART_KEY',
63:         
'MEDIUMINT UNIQUE DEFAULT 1' => 'UNIQUE_KEY NUM PART_KEY',
64:         
'BIGINT UNSIGNED UNIQUE DEFAULT 100' => 'UNIQUE_KEY UNSIGNED NUM PART_KEY',
65:         
'BIT' => 'UNSIGNED',
66:         
'VARCHAR(2) NOT NULL PRIMARY KEY' => 'NOT_NULL PRI_KEY NO_DEFAULT_VALUE PART_KEY'
67:     
);
68:
69:
70:
71:     function 
checkFlags($reported_flags$expected_flags$flags) {
72:         
$found_flags $unexpected_flags '';
73:         foreach (
$flags as $code => $name) {
74:             if (
$reported_flags >= $code) {
75:                 
$reported_flags -= $code;
76:                 
$found_flags .= $name ' ';
77:                 if (
stristr($expected_flags$name)) {
78:                     
$expected_flags trim(str_ireplace($name''$expected_flags));
79:                 } else {
80:                     
$unexpected_flags .= $name ' ';
81:                 }
82:             }
83:         }
84:
85:         return array(
$expected_flags$unexpected_flags$found_flags);
86:     }
87:
88:     if (!
$link my_mysqli_connect($host$user$passwd$db$port$socket))
89:         
printf("[001] [%d] %s\n"mysqli_connect_errno(), mysqli_connect_error());
90:
91:     if (
mysqli_get_server_version($link) > 50600) {
92:         
$columns['TIMESTAMP NOT NULL'] = 'ON_UPDATE_NOW TIMESTAMP BINARY NOT_NULL';
93:     }
94:
95:     foreach (
$columns as $column_def => $expected_flags) {
96:         if (!
mysqli_query($link'DROP TABLE IF EXISTS test')) {
97:             
printf("[002] %s [%d] %s\n"$column_def,
98:                 
mysqli_errno($link), mysqli_error($link));
99:             continue;
100:         }
101:
102:         
$create sprintf('CREATE TABLE test(id INT, col1 %s)'$column_def);
103:         if (!
mysqli_query($link$create)) {
104:             
// Server might not support it - skip
105:             
continue;
106:         }
107:
108:         if (!
$res mysqli_query($link'SELECT * FROM test')) {
109:             
printf("[003] Can't select from table, %s [%d] %s\n"$column_def,
110:                 
mysqli_errno($link), mysqli_error($link));
111:             continue;
112:         }
113:
114:         
$field mysqli_fetch_field_direct($res1);
115:         if (!
is_object($field)) {
116:             
printf("[004] Fetching the meta data failed, %s [%d] %s\n"$column_def,
117:                 
mysqli_errno($link), mysqli_error($link));
118:             continue;
119:         }
120:         if (
$field->name != 'col1') {
121:             
printf("[005] Field information seems wrong, %s [%d] %s\n"$column_def,
122:                 
mysqli_errno($link), mysqli_error($link));
123:             continue;
124:         }
125:
126:         
/*
127:         TODO
128:         Unfortunately different server versions give you slightly different
129:         results.The test does not yet fully reflect all server changes/bugs etc.
130:         */
131:         
switch ($column_def) {
132:             case 
'TIMESTAMP NOT NULL':
133:                 
// http://bugs.mysql.com/bug.php?id=30081 - new flag introduced in 5.1.24/6.0.4
134:                 
$version mysqli_get_server_version($link);
135:                 if (((
$version >  50122) && ($version 60000) && ($version != 50200)) ||
136:                         (
$version >= 60004)) {
137:                     
// new flag ON_UPDATE_NOW_FLAG (8192)
138:                     
$expected_flags .= ' ON_UPDATE_NOW';
139:                 }
140:                 break;
141:
142:             case 
'INT UNSIGNED NOT NULL':
143:             case 
'INT NOT NULL':
144:             case 
'CHAR(1) NOT NULL':
145:             case 
'SET("one", "two") NOT NULL':
146:             case 
'ENUM("one", "two") NOT NULL':
147:                 
$version mysqli_get_server_version($link);
148:                 if (
$version 50000) {
149:                     
// TODO - check exact version!
150:                     
$expected_flags trim(str_replace('NO_DEFAULT_VALUE'''$expected_flags));
151:                 }
152:                 break;
153:
154:             case 
'BIT':
155:                 
$version mysqli_get_server_version($link);
156:                 if ((
$version <= 50114 && $version 50100) || ($version == 50200)) {
157:                     
// TODO - check exact version!
158:                     
$expected_flags trim(str_replace('UNSIGNED'''$expected_flags));
159:                 }
160:
161:             default:
162:                 break;
163:         }
164:
165:         list(
$missing_flags$unexpected_flags$flags_found) = checkFlags($field->flags$expected_flags$flags);
166:         if (
$unexpected_flags) {
167:             
printf("[006] Found unexpected flags '%s' for %s, found '%s' with MySQL %s'\n",
168:                 
$unexpected_flags$column_def$flags_foundmysqli_get_server_version($link));
169:         }
170:         if (
$missing_flags) {
171:             
printf("[007] The flags '%s' have not been reported for %s, found '%s'\n",
172:                 
$missing_flags$column_def$flags_found);
173:             
var_dump($create);
174:             
var_dump(mysqli_get_server_version($link));
175:             die(
$missing_flags);
176:         }
177:
178:         
mysqli_free_result($res);
179:     }
180:
181:     if (!
mysqli_query($link'DROP TABLE IF EXISTS test')) {
182:         
printf("[008] %s [%d] %s\n"$column_def,
183:             
mysqli_errno($link), mysqli_error($link));
184:     }
185:
186:     
$column_def = array('col1 CHAR(1)''col2 CHAR(2)','INDEX idx_col1_col2(col1, col2)');
187:     
$expected_flags = array('col1' => 'MULTIPLE_KEY PART_KEY''col2' => 'PART_KEY');
188:     
$create 'CREATE TABLE test(id INT, ';
189:     foreach (
$column_def as $k => $v) {
190:         
$create .= sprintf('%s, '$v);
191:     }
192:     
$create sprintf('%s)'substr($create0, -2));
193:
194:     if (
mysqli_query($link$create)) {
195:         if (!
$res mysqli_query($link'SELECT * FROM test')) {
196:             
printf("[009] Cannot run SELECT, [%d] %s\n",
197:                 
mysqli_errno($link), mysqli_error($link));
198:         }
199:         
// id column - skip it
200:         
$field mysqli_fetch_field($res);
201:         while (
$field mysqli_fetch_field($res)) {
202:             if (!isset(
$expected_flags[$field->name])) {
203:                 
printf("[010] Found unexpected field '%s'\n"$field->name);
204:             }
205:             list(
$missing_flags$unexpected_flags$flags_found) = checkFlags($field->flags$expected_flags[$field->name], $flags);
206:             if (
$unexpected_flags)
207:                 
printf("[011] Found unexpected flags '%s' for %s, found '%s'\n",
208:                     
$unexpected_flags$field->name$flags_found);
209:             if (
$missing_flags)
210:                 
printf("[012] The flags '%s' have not been reported for %s, found '%s'\n",
211:                     
$missing_flags$field->name$flags_found);
212:         }
213:     }
214:
215:     
mysqli_close($link);
216:     print 
"done!";
217:
?>
218:

Expected

done!

Output

Out of memory

Diff

001+ Out of memory
001- done!

 

Generated at Mon, 27 Nov 2017 05:04:32 +0000 (15 days ago)

Copyright © 2005-2017 The PHP Group
All rights reserved.