felipe Thu Oct 16 00:45:22 2008 UTC
Added files: (Branch: PHP_5_2)
/php-src/ext/pgsql/tests pg_delete_001.phpt pg_insert_001.phpt
pg_meta_data_001.phpt pg_select_001.phpt
pg_update_001.phpt
Modified files:
/php-src NEWS
/php-src/ext/pgsql pgsql.c
Log:
MFH:
- Fixed:
. Memory leak in pg_delete() when using PGSQL_DML_STRING.
. Bug #24679 (pg_insert problem!)
. Bug #35996 (pg_meta_data should take the schema into account)
. Bug #40808 (pg_insert problem)
. Bug #42078 (pg_meta_data mix tables metadata from different schemas)
- Improved:
. Error messages
- Added:
. Tests
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1257&r2=1.2027.2.547.2.1258&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.1257 php-src/NEWS:1.2027.2.547.2.1258
--- php-src/NEWS:1.2027.2.547.2.1257 Tue Oct 14 23:40:25 2008
+++ php-src/NEWS Thu Oct 16 00:45:21 2008
@@ -14,7 +14,10 @@
after end of stream). (Keisial at gmail dot com, Greg)
- Fixed bug #44251, #41125 (PDO + quote() + prepare() can result in segfault).
(tsteiner at nerdclub dot net)
+- Fixed bug #42078 (pg_meta_data mix tables metadata from different schemas).
+ (Felipe)
- Fixed bug #37100 (data is returned truncated with BINARY CURSOR). (Tony)
+- Fixed bug #24679 (pg_* functions doesn't work using schema). (Felipe)
09 Oct 2008, PHP 5.2.7RC1
- Reverted fix for bug #44197 due to behaviour change in minor version.
http://cvs.php.net/viewvc.cgi/php-src/ext/pgsql/pgsql.c?r1=1.331.2.13.2.31&r2=1.331.2.13.2.32&diff_format=u
Index: php-src/ext/pgsql/pgsql.c
diff -u php-src/ext/pgsql/pgsql.c:1.331.2.13.2.31
php-src/ext/pgsql/pgsql.c:1.331.2.13.2.32
--- php-src/ext/pgsql/pgsql.c:1.331.2.13.2.31 Wed Oct 15 13:34:45 2008
+++ php-src/ext/pgsql/pgsql.c Thu Oct 16 00:45:21 2008
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: pgsql.c,v 1.331.2.13.2.31 2008/10/15 13:34:45 felipe Exp $ */
+/* $Id: pgsql.c,v 1.331.2.13.2.32 2008/10/16 00:45:21 felipe Exp $ */
#include <stdlib.h>
@@ -4411,27 +4411,47 @@
PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name,
zval *meta TSRMLS_DC)
{
PGresult *pg_result;
- char *tmp_name;
+ char *src, *tmp_name, *tmp_name2 = NULL;
smart_str querystr = {0};
int new_len;
int i, num_rows;
zval *elem;
+ if (!*table_name) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The table name
must be specified");
+ return FAILURE;
+ }
+
+ src = estrdup(table_name);
+ tmp_name = php_strtok_r(src, ".", &tmp_name2);
+
+ if (!*tmp_name2) {
+ /* Default schema */
+ tmp_name2 = tmp_name;
+ tmp_name = "public";
+ }
+
smart_str_appends(&querystr,
"SELECT a.attname, a.attnum, t.typname, a.attlen,
a.attnotNULL, a.atthasdef, a.attndims "
- "FROM pg_class as c, pg_attribute a, pg_type t "
+ "FROM pg_class as c, pg_attribute a, pg_type t,
pg_namespace n "
"WHERE a.attnum > 0 AND a.attrelid = c.oid AND
c.relname = '");
+ tmp_name2 = php_addslashes(tmp_name2, strlen(tmp_name2), &new_len, 0
TSRMLS_CC);
+ smart_str_appendl(&querystr, tmp_name2, new_len);
- tmp_name = php_addslashes((char *)table_name, strlen(table_name),
&new_len, 0 TSRMLS_CC);
+ smart_str_appends(&querystr, "' AND c.relnamespace = n.oid AND
n.nspname = '");
+ tmp_name = php_addslashes(tmp_name, strlen(tmp_name), &new_len, 0
TSRMLS_CC);
smart_str_appendl(&querystr, tmp_name, new_len);
- efree(tmp_name);
smart_str_appends(&querystr, "' AND a.atttypid = t.oid ORDER BY
a.attnum;");
smart_str_0(&querystr);
+ efree(tmp_name2);
+ efree(tmp_name);
+ efree(src);
+
pg_result = PQexec(pg_link, querystr.c);
if (PQresultStatus(pg_result) != PGRES_TUPLES_OK || (num_rows =
PQntuples(pg_result)) == 0) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Failed to query
meta_data for '%s' table %s", table_name, querystr.c);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Table '%s' doesn't
exists", table_name);
smart_str_free(&querystr);
PQclear(pg_result);
return FAILURE;
@@ -5346,7 +5366,7 @@
PQclear(pg_result);
return 0;
} else {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Failed to
execute '%s'", querystr->c);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s",
PQresultErrorMessage(pg_result));
PQclear(pg_result);
}
}
@@ -5697,7 +5717,7 @@
FREE_ZVAL(ids_converted);
}
if (ret == SUCCESS && (opt & PGSQL_DML_STRING)) {
- *sql = estrdup(querystr.c);
+ *sql = querystr.c;
}
else {
smart_str_free(&querystr);
http://cvs.php.net/viewvc.cgi/php-src/ext/pgsql/tests/pg_delete_001.phpt?view=markup&rev=1.1
Index: php-src/ext/pgsql/tests/pg_delete_001.phpt
+++ php-src/ext/pgsql/tests/pg_delete_001.phpt
--TEST--
PostgreSQL pg_delete() - basic test using schema
--SKIPIF--
<?php include("skipif.inc"); ?>
--FILE--
<?php
include('config.inc');
$conn = pg_connect($conn_str);
pg_query('CREATE SCHEMA phptests');
pg_query('CREATE TABLE foo (id INT, id2 INT)');
pg_query('CREATE TABLE phptests.foo (id INT, id2 INT)');
pg_insert($conn, 'foo', array('id' => 1, 'id2' => 1));
pg_insert($conn, 'foo', array('id' => 1, 'id2' => 2));
pg_insert($conn, 'foo', array('id' => 1, 'id2' => 2));
pg_insert($conn, 'foo', array('id' => 3, 'id2' => 3));
pg_insert($conn, 'phptests.foo', array('id' => 1, 'id2' => 1));
pg_insert($conn, 'phptests.foo', array('id' => 1, 'id2' => 2));
pg_insert($conn, 'phptests.foo', array('id' => 2, 'id2' => 3));
pg_insert($conn, 'phptests.foo', array('id' => 2, 'id2' => 3));
pg_delete($conn, 'foo', array('id' => 1, 'id2' => 0));
pg_delete($conn, 'foo', array('id' => 1, 'id2' => 2));
var_dump(pg_delete($conn, 'foo', array('id' => 1, 'id2' => 2),
PGSQL_DML_STRING));
pg_delete($conn, 'phptests.foo', array('id' => 2, 'id2' => 1));
pg_delete($conn, 'phptests.foo', array('id' => 2, 'id2' => 3));
var_dump(pg_delete($conn, 'phptests.foo', array('id' => 2, 'id2' => 3),
PGSQL_DML_STRING));
var_dump(pg_fetch_all(pg_query('SELECT * FROM foo')));
var_dump(pg_fetch_all(pg_query('SELECT * FROM phptests.foo')));
/* Inexistent */
pg_delete($conn, 'bar', array('id' => 1, 'id2' => 2));
var_dump(pg_delete($conn, 'bar', array('id' => 1, 'id2' => 2),
PGSQL_DML_STRING));
pg_query('DROP TABLE foo');
pg_query('DROP TABLE phptests.foo');
pg_query('DROP SCHEMA phptests');
?>
--EXPECTF--
string(37) "DELETE FROM foo WHERE id=1 AND id2=2;"
string(46) "DELETE FROM phptests.foo WHERE id=2 AND id2=3;"
array(2) {
[0]=>
array(2) {
["id"]=>
string(1) "1"
["id2"]=>
string(1) "1"
}
[1]=>
array(2) {
["id"]=>
string(1) "3"
["id2"]=>
string(1) "3"
}
}
array(2) {
[0]=>
array(2) {
["id"]=>
string(1) "1"
["id2"]=>
string(1) "1"
}
[1]=>
array(2) {
["id"]=>
string(1) "1"
["id2"]=>
string(1) "2"
}
}
Warning: pg_delete(): Table 'bar' doesn't exists in %s on line %d
Warning: pg_delete(): Table 'bar' doesn't exists in %s on line %d
bool(false)
http://cvs.php.net/viewvc.cgi/php-src/ext/pgsql/tests/pg_insert_001.phpt?view=markup&rev=1.1
Index: php-src/ext/pgsql/tests/pg_insert_001.phpt
+++ php-src/ext/pgsql/tests/pg_insert_001.phpt
--TEST--
PostgreSQL pg_select() - basic test using schema
--SKIPIF--
<?php include("skipif.inc"); ?>
--FILE--
<?php
include('config.inc');
$conn = pg_connect($conn_str);
pg_query('CREATE SCHEMA phptests');
pg_query('CREATE TABLE phptests.foo (id INT, id2 INT)');
pg_insert($conn, 'foo', array('id' => 1, 'id2' => 1));
pg_insert($conn, 'phptests.foo', array('id' => 1, 'id2' => 2));
var_dump(pg_insert($conn, 'phptests.foo', array('id' => 1, 'id2' => 2),
PGSQL_DML_STRING));
var_dump(pg_select($conn, 'phptests.foo', array('id' => 1)));
pg_query('DROP TABLE phptests.foo');
pg_query('DROP SCHEMA phptests');
?>
--EXPECTF--
Warning: pg_insert(): Table 'foo' doesn't exists in %s on line %d
string(47) "INSERT INTO phptests.foo (id,id2) VALUES (1,2);"
array(1) {
[0]=>
array(2) {
["id"]=>
string(1) "1"
["id2"]=>
string(1) "2"
}
}
http://cvs.php.net/viewvc.cgi/php-src/ext/pgsql/tests/pg_meta_data_001.phpt?view=markup&rev=1.1
Index: php-src/ext/pgsql/tests/pg_meta_data_001.phpt
+++ php-src/ext/pgsql/tests/pg_meta_data_001.phpt
--TEST--
PostgreSQL pg_meta_data() - basic test using schema
--SKIPIF--
<?php include("skipif.inc"); ?>
--FILE--
<?php
include('config.inc');
$conn = pg_connect($conn_str);
pg_query('CREATE SCHEMA phptests');
pg_query('CREATE TABLE phptests.foo (id INT, id2 INT)');
pg_query('CREATE TABLE foo (id INT, id3 INT)');
var_dump(pg_meta_data($conn, 'foo'));
var_dump(pg_meta_data($conn, 'phptests.foo'));
pg_query('DROP TABLE foo');
pg_query('DROP TABLE phptests.foo');
pg_query('DROP SCHEMA phptests');
?>
--EXPECT--
array(2) {
["id"]=>
array(6) {
["num"]=>
int(1)
["type"]=>
string(4) "int4"
["len"]=>
int(4)
["not null"]=>
bool(false)
["has default"]=>
bool(false)
["array dims"]=>
int(0)
}
["id3"]=>
array(6) {
["num"]=>
int(2)
["type"]=>
string(4) "int4"
["len"]=>
int(4)
["not null"]=>
bool(false)
["has default"]=>
bool(false)
["array dims"]=>
int(0)
}
}
array(2) {
["id"]=>
array(6) {
["num"]=>
int(1)
["type"]=>
string(4) "int4"
["len"]=>
int(4)
["not null"]=>
bool(false)
["has default"]=>
bool(false)
["array dims"]=>
int(0)
}
["id2"]=>
array(6) {
["num"]=>
int(2)
["type"]=>
string(4) "int4"
["len"]=>
int(4)
["not null"]=>
bool(false)
["has default"]=>
bool(false)
["array dims"]=>
int(0)
}
}
http://cvs.php.net/viewvc.cgi/php-src/ext/pgsql/tests/pg_select_001.phpt?view=markup&rev=1.1
Index: php-src/ext/pgsql/tests/pg_select_001.phpt
+++ php-src/ext/pgsql/tests/pg_select_001.phpt
--TEST--
PostgreSQL pg_select() - basic test using schema
--SKIPIF--
<?php include("skipif.inc"); ?>
--FILE--
<?php
include('config.inc');
$conn = pg_connect($conn_str);
pg_query('CREATE SCHEMA phptests');
pg_query('CREATE TABLE phptests.foo (id INT, id2 INT)');
pg_query('INSERT INTO phptests.foo VALUES (1,2), (2,3)');
pg_query('CREATE TABLE phptests.bar (id4 INT, id3 INT)');
pg_query('INSERT INTO phptests.bar VALUES (4,5), (6,7)');
/* Inexistent table */
var_dump(pg_select($conn, 'foo', array('id' => 1)));
/* Existent column */
var_dump(pg_select($conn, 'phptests.foo', array('id' => 1)));
/* Testing with inexistent column */
var_dump(pg_select($conn, 'phptests.bar', array('id' => 1)));
/* Existent column */
var_dump(pg_select($conn, 'phptests.bar', array('id4' => 4)));
pg_query('DROP TABLE phptests.foo');
pg_query('DROP TABLE phptests.bar');
pg_query('DROP SCHEMA phptests');
?>
--EXPECTF--
Warning: pg_select(): Table 'foo' doesn't exists in %s on line %d
bool(false)
array(1) {
[0]=>
array(2) {
["id"]=>
string(1) "1"
["id2"]=>
string(1) "2"
}
}
Notice: pg_select(): Invalid field name (id) in values in %s on line %d
bool(false)
array(1) {
[0]=>
array(2) {
["id4"]=>
string(1) "4"
["id3"]=>
string(1) "5"
}
}
http://cvs.php.net/viewvc.cgi/php-src/ext/pgsql/tests/pg_update_001.phpt?view=markup&rev=1.1
Index: php-src/ext/pgsql/tests/pg_update_001.phpt
+++ php-src/ext/pgsql/tests/pg_update_001.phpt
--TEST--
PostgreSQL pg_update() - basic test using schema
--SKIPIF--
<?php include("skipif.inc"); ?>
--FILE--
<?php
include('config.inc');
$conn = pg_connect($conn_str);
pg_query('CREATE SCHEMA phptests');
pg_query('CREATE TABLE foo (id INT, id2 INT)');
pg_query('CREATE TABLE phptests.foo (id INT, id2 INT)');
pg_insert($conn, 'foo', array('id' => 1, 'id2' => 1));
pg_insert($conn, 'phptests.foo', array('id' => 1, 'id2' => 2));
pg_update($conn, 'foo', array('id' => 10), array('id' => 1));
var_dump(pg_update($conn, 'foo', array('id' => 10), array('id' => 1),
PGSQL_DML_STRING));
pg_update($conn, 'phptests.foo', array('id' => 100), array('id2' => 2));
var_dump(pg_update($conn, 'phptests.foo', array('id' => 100), array('id2' =>
2), PGSQL_DML_STRING));
$rs = pg_query('SELECT * FROM foo UNION SELECT * FROM phptests.foo');
while ($row = pg_fetch_assoc($rs)) {
var_dump($row);
}
pg_query('DROP TABLE foo');
pg_query('DROP TABLE phptests.foo');
pg_query('DROP SCHEMA phptests');
?>
--EXPECT--
string(32) "UPDATE foo SET id=10 WHERE id=1;"
string(43) "UPDATE phptests.foo SET id=100 WHERE id2=2;"
array(2) {
["id"]=>
string(2) "10"
["id2"]=>
string(1) "1"
}
array(2) {
["id"]=>
string(3) "100"
["id2"]=>
string(1) "2"
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php