Added:

  mysqli_fetch_assoc_zerofill.phpt
    checks for UNSIGNED ZEROFILL

  mysqli_stmt_bind_result_zerofill.phpt
    checks for UNSIGNED ZEROFILL

  mysqli_stmt_bind_param_call_user_func.phpt
    Needs to be refined once http://bugs.php.net/bug.php?id=43568
    has been closed and a decision has been made on call_user_func_array().
    There seems to be a BC break between 5_2 -> 5_3 .
    Johannes has an eye on it

Modified:

  mysqli_change_user_insert_id.phpt
    skip test for buggy MySQL Server versions

  mysqli_insert_id.phpt
    added additional checks
This commit is contained in:
Ulf Wendel 2008-01-04 18:20:53 +00:00
parent 0b26f6fe7e
commit f316766afe
5 changed files with 589 additions and 3 deletions

View File

@ -5,6 +5,15 @@ mysqli_change_user() - LAST_INSERT_ID()
require_once('skipif.inc');
require_once('skipifemb.inc');
require_once('skipifconnectfailure.inc');
require_once('connect.inc');
if (!$IS_MYSQLND) {
if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket))
die("skip Can't test server version, might hit known bug http://bugs.mysql.com/bug.php?id=30472");
if (mysqli_get_client_version($link) < 50123)
/* TODO - check wich version got the patch */
die(sprintf("skip libmysql %s should have bug http://bugs.mysql.com/bug.php?id=30472", mysqli_get_client_version($link)));
mysqli_close($link);
}
?>
--FILE--
<?php

View File

@ -0,0 +1,74 @@
--TEST--
mysqli_fetch_assoc() - ZEROFILL
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifemb.inc');
require_once('skipifconnectfailure.inc');
?>
--FILE--
<?php
require_once('connect.inc');
require_once('table.inc');
function zerofill($offset, $link, $datatype, $insert = 1) {
mysqli_query($link, 'ALTER TABLE test DROP zero');
$sql = sprintf('ALTER TABLE test ADD zero %s UNSIGNED ZEROFILL', $datatype);
if (!mysqli_query($link, $sql)) {
// no worries - server might not support it
return true;
}
if (!mysqli_query($link, sprintf('UPDATE test SET zero = %s', $insert))) {
printf("[%03d] UPDATE failed, [%d] %s\n",
$offset, mysqli_errno($link), mysqli_error($link));
return false;
}
if (!($res = mysqli_query($link, 'SELECT zero FROM test LIMIT 1'))) {
printf("[%03d] SELECT failed, [%d] %s\n",
$offset, mysqli_errno($link), mysqli_error($link));
return false;
}
$row = mysqli_fetch_assoc($res);
$meta = mysqli_fetch_fields($res);
mysqli_free_result($res);
$meta = $meta[0];
$length = $meta->length;
if ($length > strlen($insert)) {
$expected = str_repeat('0', $length - strlen($insert));
$expected .= $insert;
if ($expected !== $row['zero']) {
printf("[%03d] Expecting '%s' got '%s'\n", $offset, $expected, $row['zero']);
return false;
}
} else if ($length <= 1) {
printf("[%03d] Length reported is too small to run test\n", $offset);
return false;
}
return true;
}
zerofill(2, $link, 'TINYINT');
zerofill(3, $link, 'SMALLINT');
zerofill(4, $link, 'MEDIUMINT');
zerofill(5, $link, 'INT');
zerofill(6, $link, 'INTEGER');
zerofill(7, $link, 'BIGINT');
zerofill(8, $link, 'FLOAT');
zerofill(9, $link, 'DOUBLE');
zerofill(10, $link, 'DOUBLE PRECISION');
zerofill(11, $link, 'DECIMAL');
zerofill(12, $link, 'DEC');
mysqli_close($link);
print "done!";
?>
--EXPECTF--
done!

View File

@ -1,9 +1,9 @@
--TEST--
mysqli_insert_id()
--SKIPIF--
<?php
<?php
require_once('skipif.inc');
require_once('skipifemb.inc');
require_once('skipifemb.inc');
require_once('skipifconnectfailure.inc');
?>
--FILE--
@ -104,7 +104,7 @@ require_once('skipifconnectfailure.inc');
mysqli_free_result($res);
if ($next_id != $row['last_id']) {
printf("[018] Something is wrong, check manually. Expecting %s got %s.\n",
printf("[019] Something is wrong, check manually. Expecting %s got %s.\n",
$next_id, $row['last_id']);
break;
}
@ -112,6 +112,18 @@ require_once('skipifconnectfailure.inc');
mysqli_query($link, "UNLOCK TABLE test");
}
if (!$res = mysqli_query($link, "INSERT INTO test(id, label) VALUES (1000, 'a')")) {
printf("[020] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
}
if (1000 !== ($tmp = mysqli_insert_id($link)))
printf("[021] Expecting int/1000, got %s/%s\n", gettype($tmp), $tmp);
if (!$res = mysqli_query($link, "INSERT INTO test(label) VALUES ('b'), ('c')")) {
printf("[022] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
}
if (1000 >= ($tmp = mysqli_insert_id($link)))
printf("[023] Expecting int/>1000, got %s/%s\n", gettype($tmp), $tmp);
mysqli_close($link);
var_dump(mysqli_insert_id($link));

View File

@ -0,0 +1,398 @@
--TEST--
mysqli_stmt_bind_param used with call_user_func_array() (see also bug #43568)
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifemb.inc');
require_once('skipifconnectfailure.inc');
// TODO remove once a decision has been made on call_user_func_array()
if (version_compare(PHP_VERSION, '5.3.0-dev') == -1)
die("skip needs PHP 5.3.0-dev+, see http://bugs.php.net/bug.php?id=43568");
?>
--FILE--
<?php
require('connect.inc');
require('table.inc');
if (!$stmt = mysqli_stmt_init($link))
printf("[001] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[002] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = 1;
if (!mysqli_stmt_bind_param($stmt, 'i', $id) ||
!mysqli_stmt_execute($stmt))
printf("[003] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[004] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Regular, procedural, using variables\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$types = 'i';
$id = 1;
$params = array(
0 => &$stmt,
1 => &$types,
2 => &$id
);
if (!call_user_func_array('mysqli_stmt_bind_param', $params))
printf("[007] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[008] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[009] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, procedural, using references for everything\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[010] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[011] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$types = 'i';
$id = 1;
$params = array(
0 => &$types,
1 => &$id
);
if (!call_user_func_array(array($stmt, 'bind_param'), $params))
printf("[012] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[013] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[014] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, object oriented, using references for everything\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[015] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[016] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$types = 'i';
$id = 1;
$params = array(
0 => $types,
1 => &$id
);
if (!call_user_func_array(array($stmt, 'bind_param'), $params))
printf("[017] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[018] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[019] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, object oriented, using variable for types. using references for bound parameter\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[020] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[021] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = 1;
$params = array(
0 => 'i',
1 => &$id
);
if (!call_user_func_array(array($stmt, 'bind_param'), $params))
printf("[022] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[023] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[024] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, object oriented, using constant for types. using references for bound parameter\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[025] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$types = 'i';
$id = 1;
$params = array(
0 => &$stmt,
1 => $types,
2 => &$id
);
if (!call_user_func_array('mysqli_stmt_bind_param', $params))
printf("[027] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[029] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, procedural, using references for everything but using variable for types\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[025] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$types = 'i';
$id = 1;
$params = array(
0 => $stmt,
1 => $types,
2 => &$id
);
if (!call_user_func_array('mysqli_stmt_bind_param', $params))
printf("[027] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[029] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, procedural, using references for bound parameter, using variables for resource and types\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[030] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[031] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$types = 'i';
$id = 1;
$params = array(
0 => $stmt,
1 => $types,
2 => &$id
);
if (!call_user_func_array('mysqli_stmt_bind_param', $params))
printf("[032] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[033] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[034] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, procedural, using references for bound parameter, using variables for resource and types\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[035] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[036] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = 1;
$params = array(
0 => $stmt,
1 => 'i',
2 => &$id
);
if (!call_user_func_array('mysqli_stmt_bind_param', $params))
printf("[037] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[038] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[039] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types\n";
var_dump($id);
var_dump($label);
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[040] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[041] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = 1;
if (!call_user_func_array('mysqli_stmt_bind_param', array($stmt, 'i', &$id)))
printf("[042] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[043] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = $label = null;
if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
(true !== mysqli_stmt_fetch($stmt)))
printf("[044] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
print "Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types, array\n";
var_dump($id);
var_dump($label);
//
// Any of those shall fail - see also bugs.php.net/43568
//
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[045] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[046] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$id = 1;
$params = array(
0 => 'i',
1 => $id
);
if (call_user_func_array(array($stmt, 'bind_param'), $params))
printf("[047] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[048] [%d] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)\n", mysqli_stmt_errno($stmt));
mysqli_stmt_close($stmt);
if (!$stmt = mysqli_stmt_init($link))
printf("[049] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
printf("[050] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
$types = 'i';
$id = 1;
$params = array(
0 => $stmt,
1 => 'i',
2 => $id
);
if (call_user_func_array('mysqli_stmt_bind_param', $params))
printf("[051] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!mysqli_stmt_execute($stmt))
printf("[052] [%d] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)\n", mysqli_stmt_errno($stmt));
print "done!";
?>
--EXPECTF--
Regular, procedural, using variables
int(1)
string(1) "a"
Call user func, procedural, using references for everything
int(1)
string(1) "a"
Call user func, object oriented, using references for everything
int(1)
string(1) "a"
Call user func, object oriented, using variable for types. using references for bound parameter
int(1)
string(1) "a"
Call user func, object oriented, using constant for types. using references for bound parameter
int(1)
string(1) "a"
Call user func, procedural, using references for everything but using variable for types
int(1)
string(1) "a"
Call user func, procedural, using references for bound parameter, using variables for resource and types
int(1)
string(1) "a"
Call user func, procedural, using references for bound parameter, using variables for resource and types
int(1)
string(1) "a"
Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types
int(1)
string(1) "a"
Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types, array
int(1)
string(1) "a"
[048] [2031] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)
[052] [2031] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)
done!
--UEXPECTF--
Regular, procedural, using variables
int(1)
unicode(1) "a"
Call user func, procedural, using references for everything
int(1)
unicode(1) "a"
Call user func, object oriented, using references for everything
int(1)
unicode(1) "a"
Call user func, object oriented, using variable for types. using references for bound parameter
int(1)
unicode(1) "a"
Call user func, object oriented, using constant for types. using references for bound parameter
int(1)
unicode(1) "a"
Call user func, procedural, using references for everything but using variable for types
int(1)
unicode(1) "a"
Call user func, procedural, using references for bound parameter, using variables for resource and types
int(1)
unicode(1) "a"
Call user func, procedural, using references for bound parameter, using variables for resource and types
int(1)
unicode(1) "a"
Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types
int(1)
unicode(1) "a"
Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types, array
int(1)
unicode(1) "a"
[048] [2031] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)
[052] [2031] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)
done!

View File

@ -0,0 +1,93 @@
--TEST--
mysqli_stmt_bind_result() - ZEROFILL
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifemb.inc');
require_once('skipifconnectfailure.inc');
?>
--FILE--
<?php
require_once('connect.inc');
require_once('table.inc');
function zerofill($offset, $link, $datatype, $insert = 1) {
mysqli_query($link, 'ALTER TABLE test DROP zero');
$sql = sprintf('ALTER TABLE test ADD zero %s UNSIGNED ZEROFILL', $datatype);
if (!mysqli_query($link, $sql)) {
// no worries - server might not support it
return true;
}
if (!mysqli_query($link, sprintf('UPDATE test SET zero = %s', $insert))) {
printf("[%03d] UPDATE failed, [%d] %s\n",
$offset, mysqli_errno($link), mysqli_error($link));
return false;
}
if (!($stmt = mysqli_prepare($link, 'SELECT zero FROM test LIMIT 1'))) {
printf("[%03d] SELECT failed, [%d] %s\n",
$offset, mysqli_errno($link), mysqli_error($link));
return false;
}
$result = null;
if (!mysqli_stmt_bind_result($stmt, $result)) {
printf("[%03d] Bind failed, [%d] %s\n",
mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
return false;
}
if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt)) {
printf("[%03d] Execute or fetch failed, [%d] %s\n",
mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
return false;
}
$res = mysqli_stmt_result_metadata($stmt);
$meta = mysqli_fetch_fields($res);
mysqli_stmt_free_result($stmt);
$meta = $meta[0];
$length = $meta->length;
if ($length > strlen($insert)) {
$expected = str_repeat('0', $length - strlen($insert));
$expected .= $insert;
if ($expected !== $result) {
printf("[%03d] Expecting '%s' got '%s'\n", $offset, $expected, $result);
return false;
}
} else if ($length <= 1) {
printf("[%03d] Length reported is too small to run test\n", $offset);
return false;
}
return true;
}
/*
We map those to PHP numeric types -
no padding/filling done. Neither with libmysql nor with mysqlnd.
zerofill(2, $link, 'TINYINT');
zerofill(3, $link, 'SMALLINT');
zerofill(4, $link, 'MEDIUMINT');
zerofill(5, $link, 'INT');
zerofill(6, $link, 'INTEGER');
zerofill(7, $link, 'BIGINT');
zerofill(8, $link, 'FLOAT');
zerofill(9, $link, 'DOUBLE');
zerofill(10, $link, 'DOUBLE PRECISION');
*/
zerofill(11, $link, 'DECIMAL');
zerofill(12, $link, 'DEC');
mysqli_close($link);
print "done!";
?>
--EXPECTF--
done!