Annotation of embedaddon/php/ext/mysqli/tests/mysqli_fetch_field_flags.phpt, revision 1.1
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:
! 87: function checkFlags($reported_flags, $expected_flags, $flags) {
! 88: $found_flags = $unexpected_flags = '';
! 89: foreach ($flags as $code => $name) {
! 90: if ($reported_flags >= $code) {
! 91: $reported_flags -= $code;
! 92: $found_flags .= $name . ' ';
! 93: if (stristr($expected_flags, $name)) {
! 94: $expected_flags = trim(str_ireplace($name, '', $expected_flags));
! 95: } else {
! 96: $unexpected_flags .= $name . ' ';
! 97: }
! 98: }
! 99: }
! 100:
! 101: return array($expected_flags, $unexpected_flags, $found_flags);
! 102: }
! 103:
! 104: if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
! 105: printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
! 106:
! 107: foreach ($columns as $column_def => $expected_flags) {
! 108: if (!mysqli_query($link, 'DROP TABLE IF EXISTS test')) {
! 109: printf("[002] %s [%d] %s\n", $column_def,
! 110: mysqli_errno($link), mysqli_error($link));
! 111: continue;
! 112: }
! 113:
! 114: $create = sprintf('CREATE TABLE test(id INT, col1 %s)', $column_def);
! 115: if (!mysqli_query($link, $create)) {
! 116: // Server might not support it - skip
! 117: continue;
! 118: }
! 119:
! 120: if (!$res = mysqli_query($link, 'SELECT * FROM test')) {
! 121: printf("[003] Can't select from table, %s [%d] %s\n", $column_def,
! 122: mysqli_errno($link), mysqli_error($link));
! 123: continue;
! 124: }
! 125:
! 126: $field = mysqli_fetch_field_direct($res, 1);
! 127: if (!is_object($field)) {
! 128: printf("[004] Fetching the meta data failed, %s [%d] %s\n", $column_def,
! 129: mysqli_errno($link), mysqli_error($link));
! 130: continue;
! 131: }
! 132: if ($field->name != 'col1') {
! 133: printf("[005] Field information seems wrong, %s [%d] %s\n", $column_def,
! 134: mysqli_errno($link), mysqli_error($link));
! 135: continue;
! 136: }
! 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) && ($version != 50200)) ||
! 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 <= 50114 && $version > 50100) || ($version == 50200)) {
! 169: // TODO - check exact version!
! 170: $expected_flags = trim(str_replace('UNSIGNED', '', $expected_flags));
! 171: }
! 172:
! 173: default:
! 174: break;
! 175: }
! 176:
! 177: list($missing_flags, $unexpected_flags, $flags_found) = checkFlags($field->flags, $expected_flags, $flags);
! 178: if ($unexpected_flags) {
! 179: printf("[006] Found unexpected flags '%s' for %s, found '%s' with MySQL %s'\n",
! 180: $unexpected_flags, $column_def, $flags_found, mysqli_get_server_version($link));
! 181: }
! 182: if ($missing_flags) {
! 183: printf("[007] The flags '%s' have not been reported for %s, found '%s'\n",
! 184: $missing_flags, $column_def, $flags_found);
! 185: var_dump($create);
! 186: var_dump(mysqli_get_server_version($link));
! 187: die($missing_flags);
! 188: }
! 189:
! 190: mysqli_free_result($res);
! 191: }
! 192:
! 193: if (!mysqli_query($link, 'DROP TABLE IF EXISTS test')) {
! 194: printf("[008] %s [%d] %s\n", $column_def,
! 195: mysqli_errno($link), mysqli_error($link));
! 196: continue;
! 197: }
! 198:
! 199: $column_def = array('col1 CHAR(1)', 'col2 CHAR(2)','INDEX idx_col1_col2(col1, col2)');
! 200: $expected_flags = array('col1' => 'MULTIPLE_KEY PART_KEY', 'col2' => 'PART_KEY');
! 201: $create = 'CREATE TABLE test(id INT, ';
! 202: foreach ($column_def as $k => $v) {
! 203: $create .= sprintf('%s, ', $v);
! 204: }
! 205: $create = sprintf('%s)', substr($create, 0, -2));
! 206:
! 207: if (mysqli_query($link, $create)) {
! 208: if (!$res = mysqli_query($link, 'SELECT * FROM test')) {
! 209: printf("[009] Cannot run SELECT, [%d] %s\n",
! 210: mysqli_errno($link), mysqli_error($link));
! 211: }
! 212: // id column - skip it
! 213: $field = mysqli_fetch_field($res);
! 214: while ($field = mysqli_fetch_field($res)) {
! 215: if (!isset($expected_flags[$field->name])) {
! 216: printf("[010] Found unexpected field '%s'\n", $field->name);
! 217: continue;
! 218: }
! 219: list($missing_flags, $unexpected_flags, $flags_found) = checkFlags($field->flags, $expected_flags[$field->name], $flags);
! 220: if ($unexpected_flags)
! 221: printf("[011] Found unexpected flags '%s' for %s, found '%s'\n",
! 222: $unexpected_flags, $field->name, $flags_found);
! 223: if ($missing_flags)
! 224: printf("[012] The flags '%s' have not been reported for %s, found '%s'\n",
! 225: $missing_flags, $field->name, $flags_found);
! 226: }
! 227: }
! 228:
! 229: mysqli_close($link);
! 230: print "done!";
! 231: ?>
! 232: --CLEAN--
! 233: <?php
! 234: require_once("clean_table.inc");
! 235: ?>
! 236: --EXPECTF--
! 237: done!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>