summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2016-06-01 11:52:46 +0200
committerAnatol Belski <ab@php.net>2016-06-01 11:55:35 +0200
commit79b978db9a9fd129366818968b203d50b983f596 (patch)
tree2631262e5092e282dc672cd7dda9b74e3e059ddf
parentaf8fa8e937418756dfc18c59475ca348f8af654e (diff)
downloadphp-git-79b978db9a9fd129366818968b203d50b983f596.tar.gz
Add test for bug #72294
-rw-r--r--ext/pdo_pgsql/tests/bug72294.phpt149
1 files changed, 149 insertions, 0 deletions
diff --git a/ext/pdo_pgsql/tests/bug72294.phpt b/ext/pdo_pgsql/tests/bug72294.phpt
new file mode 100644
index 0000000000..d6bb661733
--- /dev/null
+++ b/ext/pdo_pgsql/tests/bug72294.phpt
@@ -0,0 +1,149 @@
+--TEST--
+Bug #72294 Segmentation fault/invalid pointer in connection with pgsql_stmt_dtor
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+
+function handleError($errno, $errstr, $errfile, $errline)
+{
+ if (!($errno & error_reporting())) {
+ return false;
+ }
+
+ throw new RuntimeException( $errstr, $errno );
+}
+
+abstract class PHPUnit_Framework_TestCase
+{
+ private $name = null;
+ private $result;
+
+ public function run(PHPUnit_Framework_TestResult $result = null)
+ {
+ $result->run($this);
+ }
+
+ public function runBare()
+ {
+ $class = new ReflectionClass($this);
+ $method = $class->getMethod($this->name);
+ $method->invoke($this);
+
+ if( $x ) {
+ }
+ }
+
+ public function setName($name)
+ {
+ $this->name = $name;
+ }
+}
+
+class PHPUnit_Framework_TestFailure
+{
+ private $testName;
+
+ protected $failedTest;
+
+ protected $thrownException;
+
+ public function __construct( $failedTest, $t)
+ {
+ if ($failedTest instanceof PHPUnit_Framework_SelfDescribing) {
+ $this->testName = $failedTest->toString();
+ } else {
+ $this->testName = get_class($failedTest);
+ }
+
+ $this->thrownException = $t;
+ }
+}
+
+class PHPUnit_Framework_TestResult
+{
+ public function run( $test)
+ {
+ $error = false;
+
+ $oldErrorHandler = set_error_handler(
+ 'handleError',
+ E_ALL | E_STRICT
+ );
+
+ try {
+ $test->runBare();
+ } catch (RuntimeException $e) {
+ $error = true;
+ }
+
+ restore_error_handler();
+
+ if ($error === true) {
+ $this->errors[] = new PHPUnit_Framework_TestFailure($test, $e);
+ }
+ }
+}
+
+$result = new PHPUnit_Framework_TestResult();
+
+class PreparedStatementCache
+{
+ private $cached_statements = array();
+
+ public function prepare( $pdo, $sql )
+ {
+ //return $pdo->prepare( $sql );
+ $this->cached_statements[$sql] = $pdo->prepare( $sql );
+
+ return $this->cached_statements[$sql];
+ }
+}
+
+class DatabaseTest extends PHPUnit_Framework_TestCase
+{
+ public function testIt()
+ {
+ $pdo = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+
+ $prepared_statement_cache = new PreparedStatementCache( $pdo );
+
+ for( $i = 1; $i <= 300; ++$i ) {
+ $statement = $prepared_statement_cache->prepare( $pdo, <<<SQL
+ SELECT $i;
+SQL
+ );
+ $statement->execute();
+ }
+ }
+
+ public function test_construct()
+ {
+ $pdo = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+
+ $pdo->exec( 'CREATE TEMPORARY TABLE temp_table ( test_column INT NOT NULL );' );
+
+ $this->cache = new PreparedStatementCache( $pdo );
+
+ $statement = $this->cache->prepare( $pdo, 'SELECT * FROM temp_table WHERE test_column > 0' );
+ $statement->execute();
+ }
+}
+
+$test = new DatabaseTest();
+$test->setName( 'testIt' );
+$test->run( $result );
+$test->setName( 'test_construct' );
+$test->run( $result );
+
+?>
+==NOCRASH==
+--EXPECT--
+==NOCRASH==
+