334 lines
12 KiB
PHP
334 lines
12 KiB
PHP
--TEST--
|
|
PDO_OCI: PDOStatement->getColumnMeta
|
|
--SKIPIF--
|
|
<?php
|
|
if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
|
|
require(__DIR__ . '/../../pdo/tests/pdo_test.inc');
|
|
PDOTest::skip();
|
|
?>
|
|
--FILE--
|
|
<?php
|
|
|
|
echo "Preparations before the test\n";
|
|
|
|
require(__DIR__ . '/../../pdo/tests/pdo_test.inc');
|
|
try {
|
|
$db = PDOTest::factory();
|
|
$db->exec(<<<SQL
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP TABLE test';
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
IF SQLCODE != -942 THEN
|
|
RAISE;
|
|
END IF;
|
|
END;
|
|
SQL
|
|
);
|
|
$db->exec("CREATE TABLE test(id INT)");
|
|
|
|
$db->beginTransaction();
|
|
|
|
$stmt = $db->prepare('SELECT id FROM test ORDER BY id ASC');
|
|
|
|
echo "Test 1. calling function with invalid parameters\n";
|
|
|
|
// execute() has not been called yet
|
|
// NOTE: no warning
|
|
$tmp = $stmt->getColumnMeta(0);
|
|
printf(" 1.1 Expecting false got %s\n", var_export($tmp, true));
|
|
|
|
echo(" 1.2 ");
|
|
$stmt->execute();
|
|
// PDOStatement::getColumnMeta() expects exactly 1 argument, 0 given in
|
|
try {
|
|
$tmp = $stmt->getColumnMeta();
|
|
} catch (ArgumentCountError $e) {
|
|
if (false !== $tmp) {
|
|
printf("[1.2] Expecting false got %s\n", var_export($tmp, true));
|
|
}
|
|
echo $e->getMessage(), "\n";
|
|
}
|
|
|
|
// invalid offset
|
|
echo " 1.3 ";
|
|
try {
|
|
$tmp = $stmt->getColumnMeta(-1);
|
|
} catch (ValueError $e) {
|
|
if (false !== $tmp) {
|
|
printf("[1.3] Expecting false got %s\n", var_export($tmp, true));
|
|
}
|
|
echo $e->getMessage(), "\n";
|
|
}
|
|
|
|
// PDOStatement::getColumnMeta(): Argument #1 must be of type int, array given in
|
|
echo " 1.4 ";
|
|
try {
|
|
$tmp = $stmt->getColumnMeta(array());
|
|
} catch (TypeError $e) {
|
|
if (false !== $tmp)
|
|
printf("[1.4] Expecting false got %s\n", var_export($tmp, true));
|
|
echo $e->getMessage(), "\n";
|
|
}
|
|
|
|
// PDOStatement::getColumnMeta() expects exactly 1 argument, 2 given in
|
|
echo " 1.5 ";
|
|
try {
|
|
$tmp = $stmt->getColumnMeta(1, 1);
|
|
} catch (ArgumentCountError $e) {
|
|
if (false !== $tmp)
|
|
printf("[1.5] Expecting false got %s\n", var_export($tmp, true));
|
|
echo $e->getMessage(), "\n";
|
|
}
|
|
|
|
// invalid offset
|
|
$tmp = $stmt->getColumnMeta(1);
|
|
printf(" 1.6 Expecting false because of invalid offset got %s\n", var_export($tmp, true));
|
|
|
|
echo "Test 2. testing return values\n";
|
|
echo "Test 2.1 testing array returned\n";
|
|
|
|
$stmt = $db->prepare('SELECT id FROM test ORDER BY id ASC');
|
|
$stmt->execute();
|
|
$native = $stmt->getColumnMeta(0);
|
|
if (count($native) == 0) {
|
|
printf("[008] Meta data seems wrong, %s / %s\n",
|
|
var_export($native, true), var_export($emulated, true));
|
|
}
|
|
|
|
|
|
function test_return($meta, $offset, $native_type, $pdo_type){
|
|
if (empty($meta)) {
|
|
printf("[%03d + 2] getColumnMeta() failed, %d - %s\n", $offset,
|
|
$stmt->errorCode(), var_export($stmt->errorInfo(), true));
|
|
return false;
|
|
}
|
|
$elements = array('flags', 'scale', 'name', 'len', 'precision', 'pdo_type');
|
|
foreach ($elements as $k => $element)
|
|
if (!isset($meta[$element])) {
|
|
printf("[%03d + 3] Element %s missing, %s\n", $offset,
|
|
$element, var_export($meta, true));
|
|
return false;
|
|
}
|
|
|
|
if (!is_null($native_type)) {
|
|
if (!isset($meta['native_type'])) {
|
|
printf("[%03d + 4] Element native_type missing, %s\n", $offset,
|
|
var_export($meta, true));
|
|
return false;
|
|
}
|
|
|
|
if (!is_array($native_type))
|
|
$native_type = array($native_type);
|
|
|
|
$found = false;
|
|
foreach ($native_type as $k => $type) {
|
|
if ($meta['native_type'] == $type) {
|
|
$found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!$found) {
|
|
printf("[%03d + 5] Expecting native type %s, %s\n", $offset,
|
|
var_export($native_type, true), var_export($meta, true));
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (!is_null($pdo_type) && ($meta['pdo_type'] != $pdo_type)) {
|
|
printf("[%03d + 6] Expecting PDO type %s got %s (%s)\n", $offset,
|
|
$pdo_type, var_export($meta, true), var_export($meta['native_type']));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
function test_meta(&$db, $offset, $sql_type, $value, $native_type, $pdo_type) {
|
|
|
|
$db->exec(<<<SQL
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP TABLE test';
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
IF SQLCODE != -942 THEN
|
|
RAISE;
|
|
END IF;
|
|
END;
|
|
SQL
|
|
);
|
|
|
|
$sql = sprintf('CREATE TABLE test(id INT, label %s)', $sql_type);
|
|
$stmt = $db->prepare($sql);
|
|
$stmt->execute();
|
|
|
|
if (!$db->exec(sprintf("INSERT INTO test(id, label) VALUES (1, '%s')", $value))) {
|
|
printf("[%03d] + 1] Insert failed, %d - %s\n", $offset,
|
|
$db->errorCode(), var_export($db->errorInfo(), true));
|
|
return false;
|
|
}
|
|
|
|
$stmt = $db->prepare('SELECT id, label FROM test');
|
|
$stmt->execute();
|
|
$meta = $stmt->getColumnMeta(1);
|
|
return test_return($meta, $offset, $native_type, $pdo_type);
|
|
}
|
|
|
|
echo "Test 2.2 testing numeric columns\n";
|
|
|
|
test_meta($db, 20, 'NUMBER' , 0 , 'NUMBER', PDO::PARAM_STR);
|
|
test_meta($db, 30, 'NUMBER' , 256 , 'NUMBER', PDO::PARAM_STR);
|
|
test_meta($db, 40, 'INT' , 256 , 'NUMBER', PDO::PARAM_STR);
|
|
test_meta($db, 50, 'INTEGER' , 256 , 'NUMBER', PDO::PARAM_STR);
|
|
test_meta($db, 60, 'NUMBER' , 256.01 , 'NUMBER', PDO::PARAM_STR);
|
|
test_meta($db, 70, 'NUMBER' , -8388608 , 'NUMBER', PDO::PARAM_STR);
|
|
|
|
test_meta($db, 80, 'NUMBER' , 2147483648 , 'NUMBER', PDO::PARAM_STR);
|
|
test_meta($db, 90, 'NUMBER' , 4294967295 , 'NUMBER', PDO::PARAM_STR);
|
|
|
|
test_meta($db, 100, 'DEC' , 1.01 , 'NUMBER' , PDO::PARAM_STR);
|
|
test_meta($db, 110, 'DECIMAL' , 1.01 , 'NUMBER' , PDO::PARAM_STR);
|
|
test_meta($db, 120, 'FLOAT' , 1.01 , 'FLOAT' , PDO::PARAM_STR);
|
|
test_meta($db, 130, 'DOUBLE PRECISION', 1.01 , 'FLOAT' , PDO::PARAM_STR);
|
|
test_meta($db, 140, 'BINARY_FLOAT' , 1.01 , 'BINARY_FLOAT' , PDO::PARAM_STR);
|
|
test_meta($db, 150, 'BINARY_DOUBLE' , 1.01 , 'BINARY_DOUBLE', PDO::PARAM_STR);
|
|
|
|
echo "Test 2.3 testing temporal columns\n";
|
|
|
|
$db->exec("alter session set nls_date_format='YYYY-MM-DD'");
|
|
test_meta($db, 160, 'DATE' , '2008-04-23' , 'DATE', PDO::PARAM_STR);
|
|
|
|
echo "Test 2.4 testing string columns\n";
|
|
|
|
test_meta($db, 170, 'CHAR(1)' , 'a' , 'CHAR' , PDO::PARAM_STR);
|
|
test_meta($db, 180, 'CHAR(10)' , '0123456789' , 'CHAR' , PDO::PARAM_STR);
|
|
test_meta($db, 190, 'CHAR(255)' , str_repeat('z', 255) , 'CHAR' , PDO::PARAM_STR);
|
|
test_meta($db, 200, 'VARCHAR(1)' , 'a' , 'VARCHAR2' , PDO::PARAM_STR);
|
|
test_meta($db, 210, 'VARCHAR(10)' , '0123456789' , 'VARCHAR2' , PDO::PARAM_STR);
|
|
test_meta($db, 220, 'VARCHAR(255)' , str_repeat('z', 255) , 'VARCHAR2' , PDO::PARAM_STR);
|
|
test_meta($db, 230, 'VARCHAR2(1)' , 'a' , 'VARCHAR2' , PDO::PARAM_STR);
|
|
test_meta($db, 240, 'VARCHAR2(10)' , '0123456789' , 'VARCHAR2' , PDO::PARAM_STR);
|
|
test_meta($db, 250, 'VARCHAR2(255)' , str_repeat('z', 255) , 'VARCHAR2' , PDO::PARAM_STR);
|
|
|
|
test_meta($db, 260, 'NCHAR(1)' , 'a' , 'NCHAR' , PDO::PARAM_STR);
|
|
test_meta($db, 270, 'NCHAR(10)' , '0123456789' , 'NCHAR' , PDO::PARAM_STR);
|
|
test_meta($db, 280, 'NCHAR(255)' , str_repeat('z', 255) , 'NCHAR' , PDO::PARAM_STR);
|
|
test_meta($db, 290, 'NVARCHAR2(1)' , 'a' , 'NVARCHAR2', PDO::PARAM_STR);
|
|
test_meta($db, 300, 'NVARCHAR2(10)' , '0123456789' , 'NVARCHAR2', PDO::PARAM_STR);
|
|
test_meta($db, 310, 'NVARCHAR2(255)', str_repeat('z', 255) , 'NVARCHAR2', PDO::PARAM_STR);
|
|
|
|
echo "Test 2.5 testing lobs columns\n";
|
|
|
|
test_meta($db, 320, 'CLOB' , str_repeat('b', 255) , 'CLOB' , PDO::PARAM_LOB);
|
|
test_meta($db, 330, 'BLOB' , str_repeat('b', 256) , 'BLOB' , PDO::PARAM_LOB);
|
|
test_meta($db, 340, 'NCLOB' , str_repeat('b', 255) , 'NCLOB' , PDO::PARAM_LOB);
|
|
|
|
test_meta($db, 350, 'LONG' , str_repeat('b', 256) , 'LONG' , PDO::PARAM_STR);
|
|
test_meta($db, 360, 'LONG RAW' , str_repeat('b', 256) , 'LONG RAW', PDO::PARAM_STR);
|
|
test_meta($db, 370, 'RAW(256)' , str_repeat('b', 256) , 'RAW' , PDO::PARAM_STR);
|
|
|
|
|
|
$db->exec(<<<SQL
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP TABLE test';
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
IF SQLCODE != -942 THEN
|
|
RAISE;
|
|
END IF;
|
|
END;
|
|
SQL
|
|
);
|
|
echo "Test 2.6 testing function return\n";
|
|
|
|
$stmt = $db->query('SELECT count(*) FROM dual');
|
|
$meta = $stmt->getColumnMeta(0);
|
|
test_return($meta, 380, 'NUMBER', PDO::PARAM_STR);
|
|
$stmt = $db->query("SELECT TO_DATE('2008-04-23') FROM dual");
|
|
$meta = $stmt->getColumnMeta(0);
|
|
test_return($meta, 390, 'DATE', PDO::PARAM_STR);
|
|
$stmt = $db->query("SELECT TO_CHAR(542) FROM dual");
|
|
$meta = $stmt->getColumnMeta(0);
|
|
test_return($meta, 400, 'VARCHAR2', PDO::PARAM_STR);
|
|
|
|
|
|
echo "Test 2.7 testing flags returned\n";
|
|
|
|
$sql = sprintf('CREATE TABLE test(id INT NOT NULL, label INT NULL)');
|
|
$stmt = $db->prepare($sql);
|
|
$stmt->execute();
|
|
$db->exec('INSERT INTO test(id, label) VALUES (1, 1)');
|
|
$stmt = $db->query('SELECT id, label FROM test');
|
|
$meta = $stmt->getColumnMeta(0);
|
|
// verify the flags array contains a not_null flag and not nullable flags
|
|
if (!isset($meta['flags'])) {
|
|
printf("[1001] No flags contained in metadata %s\n", var_export($meta, true));
|
|
} else {
|
|
$flags = $meta['flags'];
|
|
$found = false;
|
|
foreach ($flags as $k => $flag) {
|
|
if ($flag == 'not_null')
|
|
$found = true;
|
|
if ($flag == 'nullable')
|
|
printf("[1003] Flags seem wrong %s\n", var_export($meta, true));
|
|
}
|
|
if (!$found)
|
|
printf("[1002] Flags seem wrong %s\n", var_export($meta, true));
|
|
}
|
|
$meta = $stmt->getColumnMeta(1);
|
|
// verify the flags array contains a nullable flag and not not_null flags
|
|
if (!isset($meta['flags'])) {
|
|
printf("[1003] No flags contained in metadata %s\n", var_export($meta, true));
|
|
} else {
|
|
$flags = $meta['flags'];
|
|
$found = false;
|
|
foreach ($flags as $k => $flag) {
|
|
if ($flag == 'not_null')
|
|
printf("[1004] Flags seem wrong %s\n", var_export($meta, true));
|
|
if ($flag == 'nullable')
|
|
$found = true;
|
|
}
|
|
if (!$found)
|
|
printf("[1005] Flags seem wrong %s\n", var_export($meta, true));
|
|
}
|
|
|
|
} catch (PDOException $e) {
|
|
// we should never get here, we use warnings, but never trust a system...
|
|
printf("[001] %s, [%s} %s\n",
|
|
$e->getMessage(), $db->errorInfo(), implode(' ', $db->errorInfo()));
|
|
}
|
|
|
|
$db->exec(<<<SQL
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP TABLE test';
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
IF SQLCODE != -942 THEN
|
|
RAISE;
|
|
END IF;
|
|
END;
|
|
SQL
|
|
);
|
|
print "done!";
|
|
?>
|
|
--EXPECT--
|
|
Preparations before the test
|
|
Test 1. calling function with invalid parameters
|
|
1.1 Expecting false got false
|
|
1.2 PDOStatement::getColumnMeta() expects exactly 1 argument, 0 given
|
|
1.3 PDOStatement::getColumnMeta(): Argument #1 ($column) must be greater than or equal to 0
|
|
1.4 PDOStatement::getColumnMeta(): Argument #1 ($column) must be of type int, array given
|
|
1.5 PDOStatement::getColumnMeta() expects exactly 1 argument, 2 given
|
|
1.6 Expecting false because of invalid offset got false
|
|
Test 2. testing return values
|
|
Test 2.1 testing array returned
|
|
Test 2.2 testing numeric columns
|
|
Test 2.3 testing temporal columns
|
|
Test 2.4 testing string columns
|
|
Test 2.5 testing lobs columns
|
|
Test 2.6 testing function return
|
|
Test 2.7 testing flags returned
|
|
done!
|