mirror of
https://github.com/ACSPRI/queXS
synced 2024-04-02 12:12:16 +00:00
274 lines
5.9 KiB
PHP
274 lines
5.9 KiB
PHP
--TEST--
|
|
DB_driver::quote
|
|
--INI--
|
|
error_reporting = 2047
|
|
--SKIPIF--
|
|
<?php chdir(dirname(__FILE__)); require_once './skipif.inc'; ?>
|
|
--FILE--
|
|
<?php
|
|
require_once './connect.inc';
|
|
require_once './droptable.inc';
|
|
|
|
|
|
/**
|
|
* Local error callback handler.
|
|
*
|
|
* Drops the phptest table, prints out an error message and kills the
|
|
* process.
|
|
*
|
|
* @param object $o PEAR error object automatically passed to this method
|
|
* @return void
|
|
* @see PEAR::setErrorHandling()
|
|
*/
|
|
function pe($o) {
|
|
global $dbh;
|
|
|
|
$dbh->setErrorHandling(PEAR_ERROR_RETURN);
|
|
drop_table($dbh, 'pearquote');
|
|
|
|
die($o->toString());
|
|
}
|
|
|
|
// DBMS boolean column type simulation...
|
|
$boolean_col_type = array(
|
|
'dbase' => 'Logical',
|
|
'fbsql' => 'BOOLEAN',
|
|
'ibase' => 'SMALLINT',
|
|
'ifx' => 'SMALLINT',
|
|
'msql' => 'INTEGER',
|
|
'mssql' => 'BIT',
|
|
'mysql' => 'TINYINT(1)',
|
|
'mysqli' => 'TINYINT(1)',
|
|
'oci8' => 'NUMBER(1)',
|
|
'odbc' => 'SMALLINT',
|
|
'pgsql' => 'BOOLEAN',
|
|
'sqlite' => 'INTEGER',
|
|
'sybase' => 'TINYINT',
|
|
);
|
|
|
|
// adjust things for specific DBMS's
|
|
|
|
if ($dbh->phptype == 'odbc') {
|
|
if ($dbh->dbsyntax == 'odbc') {
|
|
$type = $dbh->phptype;
|
|
} else {
|
|
$type = $dbh->dbsyntax;
|
|
}
|
|
} else {
|
|
$type = $dbh->phptype;
|
|
}
|
|
|
|
switch ($type) {
|
|
case 'access':
|
|
$decimal = 'SINGLE';
|
|
$null = '';
|
|
$chr = 'VARCHAR(8)';
|
|
$identifier = 'q\ut "dnt';
|
|
break;
|
|
case 'db2':
|
|
case 'ibase':
|
|
$decimal = 'DECIMAL(3,1)';
|
|
$null = '';
|
|
$chr = 'VARCHAR(8)';
|
|
$identifier = 'q\ut] "dn[t';
|
|
break;
|
|
case 'ifx':
|
|
// doing this for ifx to keep certain versions happy
|
|
$decimal = 'DECIMAL(3,1)';
|
|
$null = '';
|
|
$chr = 'CHAR(8)';
|
|
$identifier = '';
|
|
break;
|
|
case 'msql':
|
|
$decimal = 'REAL';
|
|
$null = '';
|
|
$chr = 'CHAR(8)';
|
|
$identifier = '';
|
|
break;
|
|
case 'fbsql':
|
|
case 'oci8':
|
|
$decimal = 'DECIMAL(3,1)';
|
|
$null = '';
|
|
$chr = 'VARCHAR(8)';
|
|
$identifier = 'q\ut] dn[t';
|
|
break;
|
|
default:
|
|
$decimal = 'DECIMAL(3,1)';
|
|
$null = 'NULL';
|
|
$chr = 'VARCHAR(8)';
|
|
$identifier = 'q\ut] "dn[t';
|
|
}
|
|
|
|
$dbh->setErrorHandling(PEAR_ERROR_RETURN);
|
|
drop_table($dbh, 'pearquote');
|
|
|
|
|
|
if ($identifier) {
|
|
switch ($dbh->phptype) {
|
|
case 'sybase':
|
|
$res = $dbh->query('set quoted_identifier on');
|
|
if (DB::isError($res) ) {
|
|
pe($res);
|
|
}
|
|
break;
|
|
default:
|
|
}
|
|
$create = $dbh->query("
|
|
CREATE TABLE pearquote (
|
|
n $decimal $null,
|
|
s $chr $null,
|
|
" . $dbh->quoteIdentifier($identifier) . " $decimal $null,
|
|
b {$boolean_col_type[$dbh->phptype]} $null
|
|
)
|
|
");
|
|
|
|
if (DB::isError($create) ) {
|
|
pe($create);
|
|
}
|
|
|
|
$info = $dbh->tableInfo('pearquote');
|
|
if (DB::isError($info) ) {
|
|
if ($info->code == DB_ERROR_NOT_CAPABLE) {
|
|
print "Got outcome expected from delimited identifier.\n";
|
|
} else {
|
|
print "tableInfo() failed.\n";
|
|
}
|
|
} else {
|
|
if ($identifier == $info[2]['name']) {
|
|
print "Got outcome expected from delimited identifier.\n";
|
|
// print "COLUMN NAME IS: {$info[2]['name']}\n";
|
|
} else {
|
|
print "Expected column name: '$identifier' ... ";
|
|
print "Actual column name: '{$info[2]['name']}'\n";
|
|
}
|
|
}
|
|
|
|
} else {
|
|
$dbh->query("
|
|
CREATE TABLE pearquote (
|
|
n $decimal $null,
|
|
s $chr $null,
|
|
plainidentifier $decimal $null,
|
|
b {$boolean_col_type[$dbh->phptype]} $null
|
|
)
|
|
");
|
|
print "Got outcome expected from delimited identifier.\n";
|
|
}
|
|
|
|
|
|
$dbh->setErrorHandling(PEAR_ERROR_CALLBACK, 'pe');
|
|
|
|
|
|
$strings = array(
|
|
"'",
|
|
"\"",
|
|
"\\",
|
|
"%",
|
|
"_",
|
|
"''",
|
|
"\"\"",
|
|
"\\\\",
|
|
"\\'\\'",
|
|
"\\\"\\\""
|
|
);
|
|
|
|
$nums = array(
|
|
12.3,
|
|
15,
|
|
);
|
|
|
|
$bools = array(
|
|
TRUE,
|
|
FALSE,
|
|
);
|
|
|
|
|
|
echo "String escape test: ";
|
|
foreach ($strings as $s) {
|
|
$quoted = $dbh->quoteSmart($s);
|
|
$dbh->query("INSERT INTO pearquote (s) VALUES ($quoted)");
|
|
}
|
|
$diff = array_diff($strings, $res = $dbh->getCol("SELECT s FROM pearquote"));
|
|
if (count($diff) > 0) {
|
|
echo "FAIL";
|
|
print_r($strings);
|
|
print_r($res);
|
|
} else {
|
|
echo "OK";
|
|
}
|
|
|
|
$dbh->query("DELETE FROM pearquote");
|
|
|
|
|
|
echo "\nNumber escape test: ";
|
|
foreach ($nums as $n) {
|
|
$quoted = $dbh->quoteSmart($n);
|
|
$dbh->query("INSERT INTO pearquote (n) VALUES ($quoted)");
|
|
}
|
|
|
|
$diff = array();
|
|
$res =& $dbh->getCol('SELECT n FROM pearquote ORDER BY n');
|
|
foreach ($nums as $key => $val) {
|
|
if ($val != $res[$key]) {
|
|
$diff[] = "$val != {$res[$key]}";
|
|
}
|
|
}
|
|
|
|
if (count($diff) > 0) {
|
|
echo "FAIL\n";
|
|
print_r($diff);
|
|
} else {
|
|
echo 'OK';
|
|
}
|
|
|
|
$dbh->query('DELETE FROM pearquote');
|
|
|
|
|
|
echo "\nBoolean escape test: ";
|
|
$i = 1;
|
|
foreach ($bools as $b) {
|
|
$quoted = $dbh->quoteSmart($b);
|
|
$dbh->query("INSERT INTO pearquote (n, b) VALUES ($i, $quoted)");
|
|
$i++;
|
|
}
|
|
|
|
$diff = array();
|
|
$res =& $dbh->getCol('SELECT b, n FROM pearquote ORDER BY n');
|
|
foreach ($bools as $key => $val) {
|
|
if ($val === true) {
|
|
if ($res[$key] == 1 || $res[$key] == true ||
|
|
substr(strtolower($res[$key]), 0, 1) == 't')
|
|
{
|
|
// good
|
|
} else {
|
|
$diff[] = "in:true != out:{$res[$key]}";
|
|
}
|
|
} else {
|
|
if ($res[$key] == 0 || $res[$key] == false ||
|
|
substr(strtolower($res[$key]), 0, 1) == 'f')
|
|
{
|
|
// good
|
|
} else {
|
|
$diff[] = "in:false != out:{$res[$key]}";
|
|
}
|
|
}
|
|
}
|
|
|
|
if (count($diff) > 0) {
|
|
echo "FAIL\n";
|
|
print_r($diff);
|
|
} else {
|
|
echo "OK\n";
|
|
}
|
|
|
|
|
|
$dbh->setErrorHandling(PEAR_ERROR_RETURN);
|
|
drop_table($dbh, 'pearquote');
|
|
|
|
?>
|
|
--EXPECT--
|
|
Got outcome expected from delimited identifier.
|
|
String escape test: OK
|
|
Number escape test: OK
|
|
Boolean escape test: OK
|