diff --git a/test/functional/pdo_sqlsrv/PDO94_Extend1.phpt b/test/functional/pdo_sqlsrv/PDO94_Extend1.phpt index 3920d93c..cfe413d3 100644 --- a/test/functional/pdo_sqlsrv/PDO94_Extend1.phpt +++ b/test/functional/pdo_sqlsrv/PDO94_Extend1.phpt @@ -5,7 +5,14 @@ Verification of capabilities for extending PDO. --ENV-- PHPT_EXEC=true --SKIPIF-- - + --FILE-- test1); var_dump($this->test2); $this->test2 = 22; - } + } - function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args) + function query(string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false { echo __METHOD__ . "()\n"; $stmt = parent::prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement'))); diff --git a/test/functional/pdo_sqlsrv/PDO94_Extend1_p7.phpt b/test/functional/pdo_sqlsrv/PDO94_Extend1_p7.phpt new file mode 100644 index 00000000..0bdafa65 --- /dev/null +++ b/test/functional/pdo_sqlsrv/PDO94_Extend1_p7.phpt @@ -0,0 +1,140 @@ +--TEST-- +Extending PDO Test #1 +--DESCRIPTION-- +Verification of capabilities for extending PDO. +--ENV-- +PHPT_EXEC=true +--SKIPIF-- += 80000) { + die("skip Test designed for PHP 7.*"); +} +?> +--FILE-- +test(); + var_dump($conn1); + + // Prepare test table + DropTable($conn1, $tableName); + $conn1->query("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10))"); + $conn1->query("INSERT INTO [$tableName] VALUES(0, 'A')"); + $conn1->query("INSERT INTO [$tableName] VALUES(1, 'B')"); + + // Retrieve test data via a direct query + $stmt1 = ExecuteQuery($conn1, "SELECT val, id FROM [$tableName]"); + $result = $stmt1->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_UNIQUE); + var_dump($result); + + + // Cleanup + DropTable($conn1, $tableName); + $stmt1 = null; + $conn1 = null; + + EndTest($testName); +} + +class ExPDO extends PDO +{ + public $test1 = 1; + + function __destruct() + { + echo __METHOD__ . "()\n"; + } + + function test() + { + $this->test2 = 2; + var_dump($this->test1); + var_dump($this->test2); + $this->test2 = 22; + } + + function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args) + { + echo __METHOD__ . "()\n"; + $stmt = parent::prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement'))); + $stmt->execute(); + return ($stmt); + } +} + +class ExPDOStatement extends PDOStatement +{ + protected function __construct() + { + echo __METHOD__ . "()\n"; + } + + function __destruct() + { + echo __METHOD__ . "()\n"; + } +} + + + +//-------------------------------------------------------------------- +// Repro +// +//-------------------------------------------------------------------- +function Repro() +{ + + try + { + Extend(); + } + catch (Exception $e) + { + echo $e->getMessage(); + } +} + +Repro(); + +?> +--EXPECTF-- +int(1) +int(2) +object(ExPDO)#%d (2) { + ["test1"]=> + int(1) + ["test2"]=> + int(22) +} +ExPDO::query() +ExPDOStatement::__construct() +ExPDOStatement::__destruct() +ExPDO::query() +ExPDOStatement::__construct() +ExPDOStatement::__destruct() +ExPDO::query() +ExPDOStatement::__construct() +ExPDOStatement::__destruct() +ExPDO::query() +ExPDOStatement::__construct() +array(2) { + ["A"]=> + string(1) "0" + ["B"]=> + string(1) "1" +} +ExPDOStatement::__destruct() +ExPDO::__destruct() +Test "PDO - Extension" completed successfully. \ No newline at end of file diff --git a/test/functional/pdo_sqlsrv/PDO95_Extend2.phpt b/test/functional/pdo_sqlsrv/PDO95_Extend2.phpt index f387be22..74530b7d 100644 --- a/test/functional/pdo_sqlsrv/PDO95_Extend2.phpt +++ b/test/functional/pdo_sqlsrv/PDO95_Extend2.phpt @@ -5,7 +5,14 @@ Verification of capabilities for extending PDO. --ENV-- PHPT_EXEC=true --SKIPIF-- - + --FILE-- protocol(); $args = func_get_args(); return (call_user_func_array(array($this, 'parent::exec'), $args)); } - public function query($statement, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args) + function query(string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false { $this->protocol(); $args = func_get_args(); diff --git a/test/functional/pdo_sqlsrv/PDO95_Extend2_p7.phpt b/test/functional/pdo_sqlsrv/PDO95_Extend2_p7.phpt new file mode 100644 index 00000000..694d3a7f --- /dev/null +++ b/test/functional/pdo_sqlsrv/PDO95_Extend2_p7.phpt @@ -0,0 +1,141 @@ +--TEST-- +Extending PDO Test #1 +--DESCRIPTION-- +Verification of capabilities for extending PDO. +--ENV-- +PHPT_EXEC=true +--SKIPIF-- += 80000) { + die("skip Test designed for PHP 7.*"); +} +?> +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); + + DropTable($conn2, "tmp_table"); + $conn2->exec("CREATE TABLE tmp_table (id INT)"); + $conn2->exec("INSERT INTO tmp_table (id) VALUES (1), (2)"); + $stmt1 = $conn2->query("SELECT * FROM tmp_table ORDER BY id ASC"); + var_dump($stmt1->fetchAll(PDO::FETCH_ASSOC)); + var_dump($stmt1->fetch()); + $conn2->intercept_call(); + + // Cleanup + DropTable($conn2, "tmp_table"); + $stmt1 = null; + $conn2 = null; + + EndTest($testName); +} + +class ExPDO extends PDO +{ + public function __construct() + { + $this->protocol(); + $args = func_get_args(); + return (call_user_func_array(array($this, 'parent::__construct'), $args)); + } + + public function exec($args1) + { + $this->protocol(); + $args = func_get_args(); + return (call_user_func_array(array($this, 'parent::exec'), $args)); + } + + public function query($statement, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args) + { + $this->protocol(); + $args = func_get_args(); + return (call_user_func_array(array($this, 'parent::query'), $args)); + } + + public function __call($method, $args) + { + print "__call(".var_export($method, true).", ".var_export($args, true).")\n"; + } + + private function protocol() + { + $stack = debug_backtrace(); + if (!isset($stack[1])) + { + return; + } + printf("%s(", $stack[1]['function']); + $args = ''; + foreach ($stack[1]['args'] as $k => $v) + { + $args .= sprintf("%s, ", var_export($v, true)); + } + if ($args != '') + { + printf("%s", substr($args, 0, -2)); + } + printf(")\n"); + } +} + + +//-------------------------------------------------------------------- +// Repro +// +//-------------------------------------------------------------------- +function Repro() +{ + + try + { + Extend(); + } + catch (Exception $e) + { + echo $e->getMessage(); + } +} + +Repro(); + +?> +--EXPECTF-- +__construct('%s', '%s', '%s') +exec('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(%s) AND type in (N\'U\')) DROP TABLE %s') +exec('CREATE TABLE %s (id INT)') +exec('INSERT INTO %s (id) VALUES (1), (2)') +query('SELECT * FROM %s ORDER BY id ASC') +array(2) { + [0]=> + array(1) { + ["id"]=> + string(1) "1" + } + [1]=> + array(1) { + ["id"]=> + string(1) "2" + } +} +bool(false) +__call('intercept_call', array ( +)) +exec('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(%s) AND type in (N\'U\')) DROP TABLE %s') +Test "PDO - Extension" completed successfully. \ No newline at end of file diff --git a/test/functional/pdo_sqlsrv/PDO96_Extend3.phpt b/test/functional/pdo_sqlsrv/PDO96_Extend3.phpt index 1a80cc6f..4da5eada 100644 --- a/test/functional/pdo_sqlsrv/PDO96_Extend3.phpt +++ b/test/functional/pdo_sqlsrv/PDO96_Extend3.phpt @@ -5,7 +5,14 @@ Verification of capabilities for extending PDO. --ENV-- PHPT_EXEC=true --SKIPIF-- - + --FILE-- prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this)))); diff --git a/test/functional/pdo_sqlsrv/PDO96_Extend3_p7.phpt b/test/functional/pdo_sqlsrv/PDO96_Extend3_p7.phpt new file mode 100644 index 00000000..f6ec2d48 --- /dev/null +++ b/test/functional/pdo_sqlsrv/PDO96_Extend3_p7.phpt @@ -0,0 +1,152 @@ +--TEST-- +Extending PDO Test #2 +--DESCRIPTION-- +Verification of capabilities for extending PDO. +--ENV-- +PHPT_EXEC=true +--SKIPIF-- += 80000) { + die("skip Test designed for PHP 7.*"); +} +?> +--FILE-- +exec("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))"); + $stmt1 = $conn1->prepare("INSERT INTO [$tableName] VALUES(?, ?, ?)"); + var_dump(get_class($stmt1)); + foreach ($data as $row) + { + $stmt1->execute($row); + } + unset($stmt1); + + // Retrieve test data via a direct query + $stmt1 = $conn1->query("SELECT * FROM [$tableName]"); + var_dump(get_class($stmt1)); + var_dump(get_class($stmt1->dbh)); + foreach($stmt1 as $obj) + { + var_dump($obj); + } + + echo "===DONE===\n"; + + // Cleanup + DropTable($conn1, $tableName); + $stmt1 = null; + $conn1 = null; + + EndTest($testName); +} + +class ExPDO extends PDO +{ + function __destruct() + { + echo __METHOD__ . "()\n"; + } + + function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args) + { + echo __METHOD__ . "()\n"; + $stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this)))); + $stmt->setFetchMode(PDO::FETCH_ASSOC); + $stmt->execute(); + return ($stmt); + } +} + +class ExPDOStatement extends PDOStatement +{ + public $dbh; + + protected function __construct($dbh) + { + $this->dbh = $dbh; + echo __METHOD__ . "()\n"; + } + + function __destruct() + { + echo __METHOD__ . "()\n"; + } +} + + +//-------------------------------------------------------------------- +// Repro +// +//-------------------------------------------------------------------- +function Repro() +{ + + try + { + Extend(); + } + catch (Exception $e) + { + echo $e->getMessage(); + } +} + +Repro(); + +?> +--EXPECT-- +string(5) "ExPDO" +string(12) "PDOStatement" +ExPDO::query() +ExPDOStatement::__construct() +string(14) "ExPDOStatement" +string(5) "ExPDO" +array(3) { + ["id"]=> + string(2) "10" + ["val"]=> + string(3) "Abc" + ["val2"]=> + string(3) "zxy" +} +array(3) { + ["id"]=> + string(2) "20" + ["val"]=> + string(3) "Def" + ["val2"]=> + string(3) "wvu" +} +array(3) { + ["id"]=> + string(2) "30" + ["val"]=> + string(3) "Ghi" + ["val2"]=> + string(3) "tsr" +} +===DONE=== +ExPDOStatement::__destruct() +ExPDO::__destruct() +Test "PDO - Extension" completed successfully. \ No newline at end of file diff --git a/test/functional/pdo_sqlsrv/PDO97_Extend4.phpt b/test/functional/pdo_sqlsrv/PDO97_Extend4.phpt index 03f31288..646f8121 100644 --- a/test/functional/pdo_sqlsrv/PDO97_Extend4.phpt +++ b/test/functional/pdo_sqlsrv/PDO97_Extend4.phpt @@ -5,7 +5,14 @@ Verification of capabilities for extending PDO. --ENV-- PHPT_EXEC=true --SKIPIF-- - + --FILE-- prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this)))); @@ -91,10 +98,10 @@ class ExPDOStatement extends PDOStatement echo __METHOD__ . "()\n"; } - function execute($params = array()) + function execute(?array $params = null) : bool { echo __METHOD__ . "()\n"; - parent::execute(); + return parent::execute(); } } diff --git a/test/functional/pdo_sqlsrv/PDO97_Extend4_p7.phpt b/test/functional/pdo_sqlsrv/PDO97_Extend4_p7.phpt new file mode 100644 index 00000000..37859513 --- /dev/null +++ b/test/functional/pdo_sqlsrv/PDO97_Extend4_p7.phpt @@ -0,0 +1,166 @@ +--TEST-- +Extending PDO Test #3 +--DESCRIPTION-- +Verification of capabilities for extending PDO. +--ENV-- +PHPT_EXEC=true +--SKIPIF-- += 80000) { + die("skip Test designed for PHP 7.*"); +} +?> +--FILE-- +exec("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))"); + $stmt1 = $conn1->prepare("INSERT INTO [$tableName] VALUES(?, ?, ?)"); + var_dump(get_class($stmt1)); + foreach ($data as $row) + { + $stmt1->execute($row); + } + unset($stmt1); + + echo "===QUERY===\n"; + + // Retrieve test data via a direct query + $stmt1 = $conn1->query("SELECT * FROM [$tableName]"); + var_dump(get_class($stmt1)); + var_dump(get_class($stmt1->dbh)); + + echo "===FOREACH===\n"; + + foreach($stmt1 as $obj) + { + var_dump($obj); + } + + echo "===DONE===\n"; + + // Cleanup + DropTable($conn1, $tableName); + $stmt1 = null; + $conn1 = null; + + EndTest($testName); +} + +class ExPDO extends PDO +{ + function __destruct() + { + echo __METHOD__ . "()\n"; + } + + function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args) + { + echo __METHOD__ . "()\n"; + $stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this)))); + $stmt->setFetchMode(PDO::FETCH_ASSOC); + $stmt->execute(); + return ($stmt); + } +} + +class ExPDOStatement extends PDOStatement +{ + public $dbh; + + protected function __construct($dbh) + { + $this->dbh = $dbh; + echo __METHOD__ . "()\n"; + } + + function __destruct() + { + echo __METHOD__ . "()\n"; + } + + function execute($params = array()) + { + echo __METHOD__ . "()\n"; + parent::execute(); + } +} + + +//-------------------------------------------------------------------- +// Repro +// +//-------------------------------------------------------------------- +function Repro() +{ + + try + { + Extend(); + } + catch (Exception $e) + { + echo $e->getMessage(); + } +} + +Repro(); + +?> +--EXPECT-- +string(5) "ExPDO" +string(12) "PDOStatement" +===QUERY=== +ExPDO::query() +ExPDOStatement::__construct() +ExPDOStatement::execute() +string(14) "ExPDOStatement" +string(5) "ExPDO" +===FOREACH=== +array(3) { + ["id"]=> + string(2) "10" + ["val"]=> + string(3) "Abc" + ["val2"]=> + string(3) "zxy" +} +array(3) { + ["id"]=> + string(2) "20" + ["val"]=> + string(3) "Def" + ["val2"]=> + string(3) "wvu" +} +array(3) { + ["id"]=> + string(2) "30" + ["val"]=> + string(3) "Ghi" + ["val2"]=> + string(3) "tsr" +} +===DONE=== +ExPDOStatement::__destruct() +ExPDO::__destruct() +Test "PDO - Extension" completed successfully. \ No newline at end of file diff --git a/test/functional/pdo_sqlsrv/PDO98_Extend5.phpt b/test/functional/pdo_sqlsrv/PDO98_Extend5.phpt index a3e9c94b..e28c7f01 100644 --- a/test/functional/pdo_sqlsrv/PDO98_Extend5.phpt +++ b/test/functional/pdo_sqlsrv/PDO98_Extend5.phpt @@ -5,7 +5,14 @@ Verification of capabilities for extending PDO. --ENV-- PHPT_EXEC=true --SKIPIF-- - + --FILE-- = 80000) { + die("skip Test designed for PHP 7.*"); +} +?> +--FILE-- +exec("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))"); + $stmt1 = $conn1->prepare("INSERT INTO [$tableName] VALUES(?, ?, ?)"); + var_dump(get_class($stmt1)); + foreach ($data as $row) + { + $stmt1->execute($row); + } + unset($stmt1); + + echo "===QUERY===\n"; + + // Retrieve test data via a direct query + var_dump($conn1->getAttribute(PDO::ATTR_STATEMENT_CLASS)); + $conn1->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('ExPDOStatement', array($conn1))); + var_dump($conn1->getAttribute(PDO::ATTR_STATEMENT_CLASS)); + $stmt1 = $conn1->query("SELECT * FROM [$tableName]"); + var_dump(get_class($stmt1)); + var_dump(get_class($stmt1->dbh)); + + echo "===FOREACH===\n"; + + foreach($stmt1 as $obj) + { + var_dump($obj); + } + + echo "===DONE===\n"; + + // Cleanup + DropTable($conn1, $tableName); + $stmt1 = null; + $conn1 = null; + + EndTest($testName); +} + +class ExPDO extends PDO +{ + function __destruct() + { + echo __METHOD__ . "()\n"; + } + + function query($sql, $fetch_style = PDO::FETCH_BOTH,...$fetch_mode_args) + { + echo __METHOD__ . "()\n"; + $stmt = parent::query($sql); + return ($stmt); + } +} + +class ExPDOStatement extends PDOStatement +{ + public $dbh; + + protected function __construct($dbh) + { + $this->dbh = $dbh; + $this->setFetchMode(PDO::FETCH_ASSOC); + echo __METHOD__ . "()\n"; + } + + function __destruct() + { + echo __METHOD__ . "()\n"; + } + + function execute($params = array()) + { + echo __METHOD__ . "()\n"; + parent::execute(); + } +} + + +//-------------------------------------------------------------------- +// Repro +// +//-------------------------------------------------------------------- +function Repro() +{ + + try + { + Extend(); + } + catch (Exception $e) + { + echo $e->getMessage(); + } +} + +Repro(); + +?> +--EXPECTF-- +string(5) "ExPDO" +string(12) "PDOStatement" +===QUERY=== +array(1) { + [0]=> + string(12) "PDOStatement" +} +array(2) { + [0]=> + string(14) "ExPDOStatement" + [1]=> + array(1) { + [0]=> + object(ExPDO)#%d (0) { + } + } +} +ExPDO::query() +ExPDOStatement::__construct() +string(14) "ExPDOStatement" +string(5) "ExPDO" +===FOREACH=== +array(3) { + ["id"]=> + string(2) "10" + ["val"]=> + string(3) "Abc" + ["val2"]=> + string(3) "zxy" +} +array(3) { + ["id"]=> + string(2) "20" + ["val"]=> + string(3) "Def" + ["val2"]=> + string(3) "wvu" +} +array(3) { + ["id"]=> + string(2) "30" + ["val"]=> + string(3) "Ghi" + ["val2"]=> + string(3) "tsr" +} +===DONE=== +ExPDOStatement::__destruct() +Test "PDO - Extension" completed successfully. +ExPDO::__destruct() \ No newline at end of file