--- /dev/null
+--TEST--
+SELECT column, FORMAT(...) AS _format
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifemb.inc');
+require_once('skipifconnectfailure.inc');
+?>
+--INI--
+memory_limit=83886080
+--FILE--
+<?php
+ require_once("connect.inc");
+
+ function create_table($link, $column, $min, $max, $engine, $offset) {
+
+ if (!mysqli_query($link, 'DROP TABLE IF EXISTS test')) {
+ printf("[%03d] Cannot drop table test, [%d] %s\n",
+ $offset,
+ mysqli_errno($link), mysqli_error($link));
+ return array();
+ }
+ print "$column\n";
+
+ $sql = sprintf("CREATE TABLE test(id INT AUTO_INCREMENT PRIMARY KEY, col1 %s) ENGINE=%s",
+ $column, $engine);
+ if (!mysqli_query($link, $sql)) {
+ printf("[%03d] Cannot create table test, [%d] %s\n",
+ $offset + 1,
+ mysqli_errno($link), mysqli_error($link));
+ return array();
+ }
+
+ $values = array();
+ for ($i = 1; $i <= 100; $i++) {
+ $col1 = mt_rand($min, $max);
+ $values[$i] = $col1;
+ $sql = sprintf("INSERT INTO test(id, col1) VALUES (%d, %f)",
+ $i, $col1);
+ if (!mysqli_query($link, $sql)) {
+ printf("[%03d] Cannot insert data, [%d] %s\n",
+ $offset + 2,
+ mysqli_errno($link), mysqli_error($link));
+ return array();
+ }
+ }
+
+ return $values;
+ }
+
+ function test_format($link, $format, $from, $order_by, $expected, $offset) {
+
+ if (!$stmt = mysqli_stmt_init($link)) {
+ printf("[%03d] Cannot create PS, [%d] %s\n",
+ $offset,
+ mysqli_errno($link), mysqli_error($link));
+ return false;
+ }
+ print "$format\n";
+
+ if ($order_by)
+ $sql = sprintf('SELECT %s AS _format FROM %s ORDER BY %s', $format, $from, $order_by);
+ else
+ $sql = sprintf('SELECT %s AS _format FROM %s', $format, $from);
+
+ if (!mysqli_stmt_prepare($stmt, $sql)) {
+ printf("[%03d] Cannot prepare PS, [%d] %s\n",
+ $offset + 1,
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+
+ if (!mysqli_stmt_execute($stmt)) {
+ printf("[%03d] Cannot execute PS, [%d] %s\n",
+ $offset + 2,
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+
+ if (!mysqli_stmt_store_result($stmt)) {
+ printf("[%03d] Cannot store result set, [%d] %s\n",
+ $offset + 3,
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+
+ if (!is_array($expected)) {
+
+ $result = null;
+ if (!mysqli_stmt_bind_result($stmt, $result)) {
+ printf("[%03d] Cannot bind result, [%d] %s\n",
+ $offset + 4,
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+
+ if (!mysqli_stmt_fetch($stmt)) {
+ printf("[%03d] Cannot fetch result,, [%d] %s\n",
+ $offset + 5,
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+
+ if ($result !== $expected) {
+ printf("[%03d] Expecting %s/%s got %s/%s with %s - %s.\n",
+ $offset + 6,
+ gettype($expected), $expected,
+ gettype($result), $result,
+ $format, $sql);
+ }
+
+ } else {
+
+ $order_by_col = $result = null;
+ if (!is_null($order_by)) {
+ if (!mysqli_stmt_bind_result($stmt, $order_by_col, $result)) {
+ printf("[%03d] Cannot bind result, [%d] %s\n",
+ $offset + 7,
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+ } else {
+ if (!mysqli_stmt_bind_result($stmt, $result)) {
+ printf("[%03d] Cannot bind result, [%d] %s\n",
+ $offset + 7,
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+ }
+
+ if (!empty($expected))
+ reset($expected);
+ while ((list($k, $v) = each($expected)) && mysqli_stmt_fetch($stmt)) {
+ if (!empty($expected)) {
+ if ($result !== $v) {
+ printf("[%03d] Row %d - expecting %s/%s got %s/%s [%s] with %s - %s.\n",
+ $offset + 8,
+ $k,
+ gettype($v), $v,
+ gettype($result), $result,
+ $order_by_col,
+ $format, $sql);
+ }
+ }
+ }
+
+ }
+
+ mysqli_stmt_free_result($stmt);
+ mysqli_stmt_close($stmt);
+
+ return true;
+ }
+
+ if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket))
+ printf("[001] Cannot connect - [%d] %s\n",
+ mysqli_connect_errno(),
+ mysqli_connect_error());
+
+ /* create new table and select from it */
+ $expected = create_table($link, 'FLOAT', -10000, 10000, $engine, 90);
+ foreach ($expected as $k => $v)
+ $expected[$k] = number_format(round($v), 0, '.', ',');
+ test_format($link, 'FORMAT(col1, 0)', 'test', NULL, array(), 100);
+
+ $expected = create_table($link, 'FLOAT', -10000, 10000, $engine, 110);
+ foreach ($expected as $k => $v)
+ $expected[$k] = number_format(round($v), 0, '.', ',');
+ test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 120);
+
+ $expected = create_table($link, 'FLOAT UNSIGNED', 0, 10000, $engine, 130);
+ foreach ($expected as $k => $v)
+ $expected[$k] = number_format(round($v), 0, '.', ',');
+ test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 140);
+
+ $expected = create_table($link, 'DECIMAL(5,0)', -1000, 1000, $engine, 150);
+ foreach ($expected as $k => $v)
+ $expected[$k] = number_format(round($v), 0, '.', ',');
+ test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 160);
+
+ mysqli_close($link);
+ print "done!";
+?>
+--EXPECTF--
+FLOAT
+FORMAT(col1, 0)
+FLOAT
+id AS order_by_col, FORMAT(col1, 0)
+FLOAT UNSIGNED
+id AS order_by_col, FORMAT(col1, 0)
+DECIMAL(5,0)
+id AS order_by_col, FORMAT(col1, 0)
+done!
\ No newline at end of file
--- /dev/null
+--TEST--
+mysqli_real_connect() - persistent connections
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifemb.inc');
+require_once('skipifconnectfailure.inc');
+require_once('connect.inc');
+if (!$IS_MYSQLND)
+ die("skip mysqlnd only test");
+?>
+--INI--
+mysqli.allow_persistent=1
+mysqli.max_persistent=10
+--FILE--
+<?php
+ require_once("connect.inc");
+ $host = 'p:' . $host;
+
+ if (!$link = mysqli_init())
+ printf("[002] mysqli_init() failed\n");
+
+ if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket))
+ printf("[003] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
+ $host, $user, $db, $port, $socket);
+
+ mysqli_close($link);
+ if (!$link = mysqli_init())
+ printf("[004] mysqli_init() failed\n");
+
+ if (false !== ($tmp = mysqli_real_connect($link, $host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)))
+ printf("[005] Expecting boolean/false got %s/%s. Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n", gettype($tmp), $tmp, $host, $user . 'unknown_really', $db, $port, $socket);
+
+ // Run the following tests without an anoynmous MySQL user and use a password for the test user!
+ ini_set('mysqli.default_socket', $socket);
+ if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port)) {
+ printf("[006] Usage of mysqli.default_socket failed\n");
+ } else {
+ mysqli_close($link);
+ if (!$link = mysqli_init())
+ printf("[007] mysqli_init() failed\n");
+ }
+
+ ini_set('mysqli.default_port', $port);
+ if (!mysqli_real_connect($link, $host, $user, $passwd, $db)) {
+ printf("[008] Usage of mysqli.default_port failed\n");
+ } else {
+ mysqli_close($link);
+ if (!$link = mysqli_init())
+ printf("[009] mysqli_init() failed\n");
+ }
+
+ ini_set('mysqli.default_pw', $passwd);
+ if (!mysqli_real_connect($link, $host, $user)) {
+ printf("[010] Usage of mysqli.default_pw failed\n") ;
+ } else {
+ mysqli_close($link);
+ if (!$link = mysqli_init())
+ printf("[011] mysqli_init() failed\n");
+ }
+
+ ini_set('mysqli.default_user', $user);
+ if (!mysqli_real_connect($link, $host)) {
+ printf("[012] Usage of mysqli.default_user failed\n") ;
+ } else {
+ mysqli_close($link);
+ if (!$link = mysqli_init())
+ printf("[011] mysqli_init() failed\n");
+ }
+
+ ini_set('mysqli.default_host', $host);
+ if (!mysqli_real_connect($link)) {
+ printf("[014] Usage of mysqli.default_host failed\n") ;
+ } else {
+ mysqli_close($link);
+ if (!$link = mysqli_init())
+ printf("[015] mysqli_init() failed\n");
+ }
+
+ // CLIENT_MULTI_STATEMENTS - should be disabled silently
+ if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, 65536))
+ printf("[016] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if ($res = mysqli_query($link, "SELECT 1 AS a; SELECT 2 AS b")) {
+ printf("[017] Should have failed. CLIENT_MULTI_STATEMENT should have been disabled.\n");
+ var_dump($res->num_rows);
+ mysqli_next_result($link);
+ $res = mysqli_store_result($link);
+ var_dump($res->num_rows);
+ }
+
+
+ mysqli_close($link);
+ if (!$link = mysqli_init())
+ printf("[018] mysqli_init() failed\n");
+
+ if (ini_get('open_basedir')) {
+ // CLIENT_LOCAL_FILES should be blocked - but how to test it ?!
+
+ if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, 128))
+ printf("[019] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ $filename = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'mysqli_real_connect_phpt';
+ if (!$fp = fopen($filename, 'w'))
+ printf("[020] Cannot open temporary file %s\n", $filename);
+
+ fwrite($fp, '100;z');
+ fclose($fp);
+
+ // how do we test if gets forbidden because of a missing right or the flag, this test is partly bogus ?
+ if (mysqli_query($link, "LOAD DATA LOCAL INFILE '$filename' INTO TABLE test FIELDS TERMINATED BY ';'"))
+ printf("[021] LOAD DATA INFILE should have been forbidden!\n");
+
+ unlink($filename);
+ }
+
+ mysqli_close($link);
+
+ if ($IS_MYSQLND) {
+ ini_set('mysqli.default_host', 'p:' . $host);
+ $link = mysqli_init();
+ if (!@mysqli_real_connect($link)) {
+ printf("[022] Usage of mysqli.default_host=p:%s (persistent) failed\n", $host) ;
+ } else {
+ if (!$res = mysqli_query($link, "SELECT 'mysqli.default_host (persistent)' AS 'testing'"))
+ printf("[023] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ $tmp = mysqli_fetch_assoc($res);
+ if ($tmp['testing'] !== 'mysqli.default_host (persistent)') {
+ printf("[024] Result looks strange - check manually, [%d] %s\n",
+ mysqli_errno($link), mysqli_error($link));
+ var_dump($tmp);
+ }
+ mysqli_free_result($res);
+ mysqli_close($link);
+ }
+
+ ini_set('mysqli.default_host', 'p:');
+ $link = mysqli_init();
+ if (@mysqli_real_sconnect($link)) {
+ printf("[025] Usage of mysqli.default_host=p: did not fail\n") ;
+ mysqli_close($link);
+ }
+ }
+
+ if (NULL !== ($tmp = mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)))
+ printf("[026] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
+
+ print "done!";
+?>
+--EXPECTF--
+Warning: mysqli_real_connect(): (%d/%d): Access denied for user '%s'@'%s' (using password: YES) in %s on line %d
+done!
\ No newline at end of file