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