1--TEST--
2mysql_field_flags()
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifconnectfailure.inc');
7?>
8--FILE--
9<?php
10include "connect.inc";
11
12$tmp    = NULL;
13$link   = NULL;
14
15if (!is_null($tmp = @mysql_field_flags()))
16	printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
17
18if (null !== ($tmp = @mysql_field_flags($link)))
19	printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
20
21require('table.inc');
22if (!$res = mysql_query("SELECT id, label FROM test ORDER BY id LIMIT 2", $link)) {
23	printf("[003] [%d] %s\n", mysql_errno($link), mysql_error($link));
24}
25
26if (NULL !== ($tmp = mysql_field_flags($res)))
27	printf("[004] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
28
29if (false !== ($tmp = mysql_field_flags($res, -1)))
30	printf("[005] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
31
32if (!is_string($tmp = mysql_field_flags($res, 0)) || empty($tmp))
33	printf("[006] Expecting non empty string, got %s/%s\n", gettype($tmp), $tmp);
34
35if ((version_compare(PHP_VERSION, '5.9.9', '>') == 1) && !is_unicode($tmp)) {
36	printf("[007] Check the unicode support!\n");
37	var_inspect($tmp);
38}
39
40if (false !== ($tmp = mysql_field_flags($res, 2)))
41	printf("[008] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
42
43mysql_free_result($res);
44
45$version = mysql_get_server_info($link);
46if (!preg_match('@(\d+)\.(\d+)\.(\d+)@ism', $version, $matches))
47	printf("[009] Cannot get server version\n");
48$version = ($matches[1] * 1000) + ($matches[2] * 100) + $matches[3];
49
50$tables = array(
51	'label INT, UNIQUE KEY (label)'                         =>  array(
52								array('label', '1'),
53								'label' => array(($version < 5000) ? 'multiple_key' : 'unique_key')
54								),
55	'labela INT, label2 CHAR(1), KEY keyname (labela, label2)'      =>  array(
56								array('labela, label2', "1, 'a'"),
57								'labela' => array('multiple_key'),
58								),
59	'label1 BLOB'                                           =>  array(
60								array('label1', "'blob'"),
61								'label1' => array('blob', 'binary'),
62								),
63	'label1 INT UNSIGNED'                                   =>  array(
64								array('label1', '100'),
65								'label1' => array('unsigned'),
66								),
67	'label1 INT UNSIGNED NOT NULL AUTO INCREMENT'           =>  array(
68								array('label1', '100'),
69								'label1' => array('auto_increment',
70										'unsigned'),
71								),
72	'label1 ENUM("a", "b")'                                 =>  array(
73								array('label1', "'a'"),
74								'label1' => array('enum'),
75								),
76	'label1 SET("a", "b")'                                  =>  array(
77								array('label1', "'a'"),
78								'label1' => array('set'),
79								),
80	'label1 TIMESTAMP'                                      =>  array(
81								array('label1', sprintf("'%s'", @date("Y-m-d H:i:s"))),
82								'label1' => array(
83										'timestamp',
84										'binary',
85										'not_null'),
86								),
87);
88
89if ($version < 5600) {
90	$tables['label1 TIMESTAMP']['label1'][] = 'zerofill';
91	$tables['label1 TIMESTAMP']['label1'][] = 'unsigned';
92}
93
94
95foreach ($tables as $columns => $expected) {
96	if (!mysql_query("DROP TABLE IF EXISTS test", $link)) {
97		printf("[010/%s] [%d] %s\n", $columns, mysql_errno($link), mysql_error($link));
98		continue;
99	}
100	$sql = sprintf("CREATE TABLE test(id INT, %s) ENGINE = %s", $columns, $engine);
101		if (!@mysql_query($sql, $link)) {
102		// server or engine might not support this
103		continue;
104	}
105
106	reset($expected);
107	list($k, $values) = each($expected);
108	$sql = sprintf("INSERT INTO test(id, %s) VALUES (1, %s)", $values[0], $values[1]);
109	if (!mysql_query($sql, $link)) {
110		printf("[011/%s] '%s', [%d] %s\n", $columns, $sql, mysql_errno($link), mysql_error($link));
111		continue;
112	}
113
114	if (!$res = mysql_query(sprintf("SELECT id, %s FROM test", $values[0]), $link)) {
115		printf("[012/%s] [%d] %s\n", $columns, mysql_errno($link), mysql_error($link));
116		continue;
117	}
118
119	$i = 1;
120	while (list($field, $flags) = each($expected)) {
121		$tmp = mysql_field_flags($res, $i++);
122
123		foreach ($flags as $k => $flag) {
124		if (!preg_match(sprintf('@\s*%s\s*@ismU', $flag), $tmp)) {
125			printf("[013/%s] Field '%s', flag '%s' not found, [%d] %s\n", $columns, $field, $flag, mysql_errno($link), mysql_error($link));
126		}
127	}
128		foreach ($flags as $k => $flag) {
129			$tmp = preg_replace(sprintf('@\s*%s\s*@ismU', $flag), '', $tmp);
130		}
131		if ('' != $tmp)
132			printf("[014/%s] Field '%s', unexpected flags '%s' found, [%d] %s\n", $columns, $field, $tmp, mysql_errno($link), mysql_error($link));
133	}
134	mysql_free_result($res);
135}
136
137var_dump(mysql_field_flags($res, 0));
138
139mysql_close($link);
140print "done!";
141?>
142--CLEAN--
143<?php
144require_once("clean_table.inc");
145?>
146--EXPECTF--
147Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in %s on line %d
148
149Warning: mysql_field_flags() expects exactly 2 parameters, 1 given in %s on line %d
150
151Warning: mysql_field_flags(): Field -1 is invalid for MySQL result index %d in %s on line %d
152
153Warning: mysql_field_flags(): Field 2 is invalid for MySQL result index %d in %s on line %d
154
155Warning: mysql_field_flags(): %d is not a valid MySQL result resource in %s on line %d
156bool(false)
157done!
158