1--TEST--
2Trying implicit reconnect after wait_timeout and KILL using mysqli_ping()
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifemb.inc');
7require_once('skipifconnectfailure.inc');
8if (stristr(mysqli_get_client_info(), 'mysqlnd'))
9	die("skip: test for libmysql");
10?>
11--INI--
12mysqli.reconnect=1
13--FILE--
14<?php
15	require_once("connect.inc");
16	require_once("table.inc");
17
18	if (!$link2 = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
19		printf("[001] Cannot create second database connection, [%d] %s\n",
20			mysqli_connect_errno(), mysqli_connect_error());
21
22	$thread_id_timeout = mysqli_thread_id($link);
23	$thread_id_control = mysqli_thread_id($link2);
24
25	if (!$res = mysqli_query($link2, "SHOW FULL PROCESSLIST"))
26		printf("[002] Cannot get full processlist, [%d] %s\n",
27			mysqli_errno($link2), mysqli_error($link));
28
29	$running_threads = array();
30	while ($row = mysqli_fetch_assoc($res))
31		$running_threads[$row['Id']] = $row;
32	mysqli_free_result($res);
33
34	if (!isset($running_threads[$thread_id_timeout]) ||
35			!isset($running_threads[$thread_id_control]))
36		printf("[003] Processlist is borked, [%d] %s\n",
37			mysqli_errno($link2), mysqli_error($link));
38
39	if (!mysqli_query($link, "SET SESSION wait_timeout = 2"))
40		printf("[004] Cannot set wait_timeout, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
41
42	if (!$res = mysqli_query($link, "SHOW VARIABLES LIKE 'wait_timeout'"))
43		printf("[005] Cannot check if wait_timeout has been set, [%d] %s\n",
44			mysqli_errno($link), mysqli_error($link));
45
46	if (!$row = mysqli_fetch_assoc($res))
47		printf("[006] Cannot get wait_timeout, [%d] %s\n",
48			mysqli_errno($link), mysqli_error($link));
49	mysqli_free_result($res);
50
51	if ($row['Value'] != 2)
52		printf("[007] Failed setting the wait_timeout, test will not work, [%d] %s\n",
53			mysqli_errno($link), mysqli_error($link));
54
55	// after 2+ seconds the server should kill the connection
56	sleep(3);
57
58	if (!$res = mysqli_query($link2, "SHOW FULL PROCESSLIST"))
59		printf("[008] Cannot get full processlist, [%d] %s\n",
60			mysqli_errno($link2), mysqli_error($link));
61
62	$running_threads = array();
63	while ($row = mysqli_fetch_assoc($res))
64		$running_threads[$row['Id']] = $row;
65	mysqli_free_result($res);
66
67	if (isset($running_threads[$thread_id_timeout]))
68		printf("[009] Server should have killed the timeout connection, [%d] %s\n",
69			mysqli_errno($link2), mysqli_error($link));
70
71	if (true !== mysqli_ping($link))
72		printf("[010] Reconnect should have happened");
73
74	if (!$res = mysqli_query($link, "SELECT DATABASE() as _dbname"))
75		printf("[011] Cannot get database name, [%d] %s\n",
76			mysqli_errno($link), mysqli_error($link));
77
78	if (!$row = mysqli_fetch_assoc($res))
79		printf("[012] Cannot get database name, [%d] %s\n",
80			mysqli_errno($link), mysqli_error($link));
81
82	mysqli_free_result($res);
83	if ($row['_dbname'] != $db)
84		printf("[013] Connection should has been made to DB/Schema '%s', expecting '%s', [%d] %s\n",
85			$row['_dbname'], $db, mysqli_errno($link), mysqli_error($link));
86
87	// ... and now we try KILL
88	$thread_id_timeout = mysqli_thread_id($link);
89
90	if (!mysqli_query($link2, sprintf('KILL %d', $thread_id_timeout)))
91		printf("[014] Cannot KILL timeout connection, [%d] %s\n", mysqli_errno($link2), mysqli_error($link2));
92	// Give the server a second to really kill the other thread...
93	sleep(1);
94
95	if (!$res = mysqli_query($link2, "SHOW FULL PROCESSLIST"))
96		printf("[015] Cannot get full processlist, [%d] %s\n",
97			mysqli_errno($link2), mysqli_error($link));
98
99	$running_threads = array();
100	while ($row = mysqli_fetch_assoc($res))
101		$running_threads[$row['Id']] = $row;
102	mysqli_free_result($res);
103
104	if (isset($running_threads[$thread_id_timeout]) ||
105			!isset($running_threads[$thread_id_control]))
106		printf("[016] Processlist is borked, [%d] %s\n",
107			mysqli_errno($link2), mysqli_error($link));
108
109	if (true !== ($tmp = mysqli_ping($link)))
110		printf("[017] Expecting boolean/true got %s/%s\n", gettype($tmp), $tmp);
111
112	if (!$res = mysqli_query($link, "SELECT DATABASE() as _dbname"))
113		printf("[018] Cannot get database name, [%d] %s\n",
114			mysqli_errno($link), mysqli_error($link));
115
116	if (!$row = mysqli_fetch_assoc($res))
117		printf("[019] Cannot get database name, [%d] %s\n",
118			mysqli_errno($link), mysqli_error($link));
119
120	mysqli_free_result($res);
121	if ($row['_dbname'] != $db)
122		printf("[020] Connection should has been made to DB/Schema '%s', expecting '%s', [%d] %s\n",
123			$row['_dbname'], $db, mysqli_errno($link), mysqli_error($link));
124
125	mysqli_close($link);
126	mysqli_close($link2);
127	print "done!";
128?>
129--EXPECTF--
130done!
131