uw                                       Thu, 24 Mar 2011 13:40:06 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=309648

Log:
Limit test with 65k params, should crash mysqlnd

Changed paths:
    A   
php/php-src/branches/PHP_5_3/ext/mysqli/tests/mysqli_stmt_bind_limits.phpt
    A   php/php-src/trunk/ext/mysqli/tests/mysqli_stmt_bind_limits.phpt

Added: 
php/php-src/branches/PHP_5_3/ext/mysqli/tests/mysqli_stmt_bind_limits.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqli/tests/mysqli_stmt_bind_limits.phpt  
                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/mysqli/tests/mysqli_stmt_bind_limits.phpt  
2011-03-24 13:40:06 UTC (rev 309648)
@@ -0,0 +1,122 @@
+--TEST--
+Bind limits
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifemb.inc');
+require_once('skipifconnectfailure.inc');
+?>
+--FILE--
+<?php
+       require_once("connect.inc");
+
+       function bind_many($offset, $link, $num_params, $rows, $eval = true) {
+
+               $drop = "DROP TABLE IF EXISTS test";
+               $create = "CREATE TABLE test(id INT AUTO_INCREMENT PRIMARY KEY, 
";
+               $insert = "INSERT INTO test";
+               $columns = "";
+               $values = "";
+               $stmt_params = "";
+               $params = array();
+               for ($i = 0; $i < $num_params; $i++) {
+                       $create                 .= "col" . $i . " INT, ";
+                       $columns                .= "col" . $i . ", ";
+                       $values                 .= "?, ";
+                       $stmt_params    .= '$params[' . $i . '], ';
+                       for ($j = 0; $j < $rows; $j++)
+                         $params[($j * $rows) + $i] = $i;
+               }
+               $create = substr($create, 0, -2) . ")";
+
+               $stmt_types = str_repeat("i", $num_params * $rows);
+               $stmt_params = substr(str_repeat($stmt_params, $rows), 0, -2);
+               $values = substr($values, 0, -2);
+               $insert .= "(" . substr($columns, 0, -2) . ") VALUES ";
+               $insert .= substr(str_repeat("(" . $values . "), ", $rows), 0, 
-2);
+
+               $stmt_bind_param = 'return mysqli_stmt_bind_param($stmt, "' . 
$stmt_types . '", ' . $stmt_params . ');';
+
+               printf("Testing %d columns with %d rows...\n", $num_params, 
$rows);
+
+               if (!$link->query($drop) || !$link->query($create)) {
+                       printf("[%03d + 01] [%d] %s\n", $offset, $link->errno, 
$link->error);
+                       return false;
+               }
+               printf("... table created\n");
+
+               if (!$stmt = $link->prepare($insert)) {
+                       printf("[%03d + 02] [%d] %s\n", $offset, $link->errno, 
$link->error);
+                       return false;
+               }
+               if ($stmt->param_count != $num_params * $rows) {
+                         printf("[%03d + 03] Parameter count should be %d but 
got %d\n", $offset, $num_params * $rows, $stmt->param_count);
+                       return false;
+               }
+               printf("... statement with %d parameters prepared\n", 
$stmt->param_count);
+
+               if ($eval) {
+                       if (!eval($stmt_bind_param)) {
+                               printf("[%03d + 03] [%d] %s\n", $offset, 
$stmt->errno, $stmt->error);
+                               return false;
+                       }
+               } else {
+                       $param_ref = array($stmt_types);
+                       for ($i = 0; $i < $rows; $i++)
+                               for ($j = 0; $j < $num_params; $j++)
+                                       $param_ref[] = &$params[($i * $rows) + 
$j];
+
+                       if (!call_user_func_array(array($stmt, 'bind_param'), 
$param_ref)) {
+                               printf("[%03d + 03] [%d] %s\n", $offset, 
$stmt->errno, $stmt->error);
+                               return false;
+                       }
+               }
+               if ($stmt->param_count != $num_params * $rows) {
+                        printf("[%03d + 03] Parameter count should be %d but 
got %d\n", $offset, $num_params * $rows, $stmt->param_count);
+                       return false;
+               }
+
+               if (!$stmt->execute()) {
+                       printf("[%03d + 04] [%d] %s\n", $offset, $stmt->errno, 
$stmt->error);
+                       return false;
+               }
+               printf("Statement done\n");
+
+               $stmt->close();
+
+               if (!($res = $link->query("SELECT * FROM test"))) {
+                       printf("[%03d + 05] [%d] %s\n", $offset, $link->errno, 
$link->error);
+                       return false;
+               }
+
+               $row = $res->fetch_row();
+               $res->close();
+
+               for ($i = 0; $i < $num_params; $i++) {
+                       if ($row[$i + 1] != $i) {
+                               printf("[%03d + 06] [%d] %s\n", $offset, 
$link->errno, $link->error);
+                       }
+               }
+
+               return true;
+       }
+
+       if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, 
$socket)) {
+               printf("[001] Cannot connect to the server using host=%s, 
user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
+                       $host, $user, $db, $port, $socket);
+       }
+
+       var_dump(bind_many(10, $link, 273, 240, true));
+       var_dump(bind_many(20, $link, 273, 240, false));
+       mysqli_close($link);
+       print "done!";
+?>
+--CLEAN--
+<?php
+require_once("clean_table.inc");
+?>
+--XFAIL--
+Statement limits hit, should crash
+--EXPECTF--
+TODO
+done!
\ No newline at end of file

Added: php/php-src/trunk/ext/mysqli/tests/mysqli_stmt_bind_limits.phpt
===================================================================
--- php/php-src/trunk/ext/mysqli/tests/mysqli_stmt_bind_limits.phpt             
                (rev 0)
+++ php/php-src/trunk/ext/mysqli/tests/mysqli_stmt_bind_limits.phpt     
2011-03-24 13:40:06 UTC (rev 309648)
@@ -0,0 +1,122 @@
+--TEST--
+Bind limits
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifemb.inc');
+require_once('skipifconnectfailure.inc');
+?>
+--FILE--
+<?php
+       require_once("connect.inc");
+
+       function bind_many($offset, $link, $num_params, $rows, $eval = true) {
+
+               $drop = "DROP TABLE IF EXISTS test";
+               $create = "CREATE TABLE test(id INT AUTO_INCREMENT PRIMARY KEY, 
";
+               $insert = "INSERT INTO test";
+               $columns = "";
+               $values = "";
+               $stmt_params = "";
+               $params = array();
+               for ($i = 0; $i < $num_params; $i++) {
+                       $create                 .= "col" . $i . " INT, ";
+                       $columns                .= "col" . $i . ", ";
+                       $values                 .= "?, ";
+                       $stmt_params    .= '$params[' . $i . '], ';
+                       for ($j = 0; $j < $rows; $j++)
+                         $params[($j * $rows) + $i] = $i;
+               }
+               $create = substr($create, 0, -2) . ")";
+
+               $stmt_types = str_repeat("i", $num_params * $rows);
+               $stmt_params = substr(str_repeat($stmt_params, $rows), 0, -2);
+               $values = substr($values, 0, -2);
+               $insert .= "(" . substr($columns, 0, -2) . ") VALUES ";
+               $insert .= substr(str_repeat("(" . $values . "), ", $rows), 0, 
-2);
+
+               $stmt_bind_param = 'return mysqli_stmt_bind_param($stmt, "' . 
$stmt_types . '", ' . $stmt_params . ');';
+
+               printf("Testing %d columns with %d rows...\n", $num_params, 
$rows);
+
+               if (!$link->query($drop) || !$link->query($create)) {
+                       printf("[%03d + 01] [%d] %s\n", $offset, $link->errno, 
$link->error);
+                       return false;
+               }
+               printf("... table created\n");
+
+               if (!$stmt = $link->prepare($insert)) {
+                       printf("[%03d + 02] [%d] %s\n", $offset, $link->errno, 
$link->error);
+                       return false;
+               }
+               if ($stmt->param_count != $num_params * $rows) {
+                         printf("[%03d + 03] Parameter count should be %d but 
got %d\n", $offset, $num_params * $rows, $stmt->param_count);
+                       return false;
+               }
+               printf("... statement with %d parameters prepared\n", 
$stmt->param_count);
+
+               if ($eval) {
+                       if (!eval($stmt_bind_param)) {
+                               printf("[%03d + 03] [%d] %s\n", $offset, 
$stmt->errno, $stmt->error);
+                               return false;
+                       }
+               } else {
+                       $param_ref = array($stmt_types);
+                       for ($i = 0; $i < $rows; $i++)
+                               for ($j = 0; $j < $num_params; $j++)
+                                       $param_ref[] = &$params[($i * $rows) + 
$j];
+
+                       if (!call_user_func_array(array($stmt, 'bind_param'), 
$param_ref)) {
+                               printf("[%03d + 03] [%d] %s\n", $offset, 
$stmt->errno, $stmt->error);
+                               return false;
+                       }
+               }
+               if ($stmt->param_count != $num_params * $rows) {
+                        printf("[%03d + 03] Parameter count should be %d but 
got %d\n", $offset, $num_params * $rows, $stmt->param_count);
+                       return false;
+               }
+
+               if (!$stmt->execute()) {
+                       printf("[%03d + 04] [%d] %s\n", $offset, $stmt->errno, 
$stmt->error);
+                       return false;
+               }
+               printf("Statement done\n");
+
+               $stmt->close();
+
+               if (!($res = $link->query("SELECT * FROM test"))) {
+                       printf("[%03d + 05] [%d] %s\n", $offset, $link->errno, 
$link->error);
+                       return false;
+               }
+
+               $row = $res->fetch_row();
+               $res->close();
+
+               for ($i = 0; $i < $num_params; $i++) {
+                       if ($row[$i + 1] != $i) {
+                               printf("[%03d + 06] [%d] %s\n", $offset, 
$link->errno, $link->error);
+                       }
+               }
+
+               return true;
+       }
+
+       if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, 
$socket)) {
+               printf("[001] Cannot connect to the server using host=%s, 
user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
+                       $host, $user, $db, $port, $socket);
+       }
+
+       var_dump(bind_many(10, $link, 273, 240, true));
+       var_dump(bind_many(20, $link, 273, 240, false));
+       mysqli_close($link);
+       print "done!";
+?>
+--CLEAN--
+<?php
+require_once("clean_table.inc");
+?>
+--XFAIL--
+Statement limits hit, should crash
+--EXPECTF--
+TODO
+done!
\ No newline at end of file

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to