--TEST-- PDO_OCI: PDOStatement->getColumnMeta --EXTENSIONS-- pdo pdo_oci --SKIPIF-- --FILE-- exec(<<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(<<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(<<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(<< --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!