summaryrefslogtreecommitdiff
path: root/ext/mysqli/tests/bug49442.phpt
blob: f20cbb1b1184611d688950d68ade5009acc7b0f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
--TEST--
Bug #49422 (mysqlnd: mysqli_real_connect() and LOAD DATA INFILE crash)
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifconnectfailure.inc');

$link = mysqli_init();
if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) {
	die(sprintf("skip Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));
}

include_once("local_infile_tools.inc");
if ($msg = check_local_infile_support($link, $engine))
	die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error));

mysqli_close($link);
?>
--INI--
mysqli.allow_local_infile=1
mysqli.allow_persistent=1
mysqli.max_persistent=1
--FILE--
<?php
	include ("connect.inc");

	$link = mysqli_init();
	if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) {
		printf("[001] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
	}

	if (!mysqli_query($link, 'DROP TABLE IF EXISTS test')) {
		printf("[002] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link));
	}

	if (!mysqli_query($link, 'CREATE TABLE test(id INT, label CHAR(1), PRIMARY KEY(id)) ENGINE=' . $engine)) {
		printf("[003] Failed to create test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link));
	}

	include("local_infile_tools.inc");
	$file = create_standard_csv(4);

	if (!@mysqli_query($link, sprintf("LOAD DATA LOCAL INFILE '%s'
			INTO TABLE test
			FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\''
			LINES TERMINATED BY '\n'",
			mysqli_real_escape_string($link, $file)))) {
			printf("[005] [%d] %s\n",  mysqli_errno($link), mysqli_error($link));
	}

	if (!$res = mysqli_query($link, "SELECT * FROM test ORDER BY id"))
		printf("[006] [%d] %s\n",  mysqli_errno($link), mysqli_error($link));

	$rows = array();
	while ($row = mysqli_fetch_assoc($res)) {
		var_dump($row);
		$rows[] = $row;
	}

	mysqli_free_result($res);

	mysqli_query($link, "DELETE FROM test");
	mysqli_close($link);

	if ($IS_MYSQLND) {
		/*
			mysqlnd makes a connection created through mysql_init()/mysqli_real_connect() always a 'persistent' one.
			At this point 'persistent' is not to be confused with what a user calls a 'persistent' - in this case
			'persistent' means that mysqlnd uses malloc() instead of emalloc(). nothing else. ext/mysqli will
			not consider it as a 'persistent' connection in a user sense, ext/mysqli will not appy max_persistent etc.
			Its only about malloc() vs. emalloc().

			However, the bug is about malloc() and efree(). You can make make mysqlnd use malloc() by either using
			pconnect or mysql_init() - so we should test pconnect as well..
		*/
		$host = 'p:' . $host;
		if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
			printf("[007] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
		}

		/* bug happened during query processing */
		if (!@mysqli_query($link, sprintf("LOAD DATA LOCAL INFILE '%s'
			INTO TABLE test
			FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\''
			LINES TERMINATED BY '\n'",
			mysqli_real_escape_string($link, $file)))) {
			printf("[008] [%d] %s\n",  mysqli_errno($link), mysqli_error($link));
		}

		/* we survived? that's good enough... */

		if (!$res = mysqli_query($link, "SELECT * FROM test ORDER BY id"))
			printf("[009] [%d] %s\n",  mysqli_errno($link), mysqli_error($link));

		$i = 0;
		while ($row = mysqli_fetch_assoc($res)) {
			if (($row['id'] != $rows[$i]['id']) || ($row['label'] != $rows[$i]['label'])) {
				printf("[010] Wrong values, check manually!\n");
			}
			$i++;
		}
		mysqli_close($link);
	}

	print "done!";
?>
--CLEAN--
<?php
	require_once("clean_table.inc");
?>
--EXPECT--
array(2) {
  ["id"]=>
  string(2) "97"
  ["label"]=>
  string(1) "x"
}
array(2) {
  ["id"]=>
  string(2) "98"
  ["label"]=>
  string(1) "y"
}
array(2) {
  ["id"]=>
  string(2) "99"
  ["label"]=>
  string(1) "z"
}
done!