summaryrefslogtreecommitdiff
path: root/ext/pgsql/tests
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pgsql/tests')
-rw-r--r--ext/pgsql/tests/01createdb.phpt28
-rw-r--r--ext/pgsql/tests/02connection.phpt59
-rw-r--r--ext/pgsql/tests/03sync_query.phpt73
-rw-r--r--ext/pgsql/tests/04async_query.phpt65
-rw-r--r--ext/pgsql/tests/05large_object.phpt82
-rw-r--r--ext/pgsql/tests/06copy.phpt22
-rw-r--r--ext/pgsql/tests/07optional.phpt24
-rw-r--r--ext/pgsql/tests/08escape.phpt95
-rw-r--r--ext/pgsql/tests/09notice.phpt38
-rw-r--r--ext/pgsql/tests/10pg_convert.phpt29
-rw-r--r--ext/pgsql/tests/10pg_convert_85.phpt29
-rw-r--r--ext/pgsql/tests/11pg_meta_data.phpt64
-rw-r--r--ext/pgsql/tests/12pg_insert.phpt24
-rw-r--r--ext/pgsql/tests/12pg_insert_85.phpt24
-rw-r--r--ext/pgsql/tests/13pg_select.phpt37
-rw-r--r--ext/pgsql/tests/13pg_select_85.phpt37
-rw-r--r--ext/pgsql/tests/14pg_update.phpt25
-rw-r--r--ext/pgsql/tests/14pg_update_85.phpt25
-rw-r--r--ext/pgsql/tests/15pg_delete.phpt23
-rw-r--r--ext/pgsql/tests/16pg_result_status.phpt19
-rw-r--r--ext/pgsql/tests/17result.phpt67
-rw-r--r--ext/pgsql/tests/18pg_escape_bytea.phpt28
-rw-r--r--ext/pgsql/tests/19pg_ping.phpt15
-rw-r--r--ext/pgsql/tests/20pg_get_pid.phpt17
-rw-r--r--ext/pgsql/tests/21pg_get_notify.phpt20
-rw-r--r--ext/pgsql/tests/22pg_fetch_object.phpt37
-rw-r--r--ext/pgsql/tests/23sync_query_params.phpt59
-rw-r--r--ext/pgsql/tests/24sync_query_prepared.phpt65
-rw-r--r--ext/pgsql/tests/25async_query_params.phpt70
-rw-r--r--ext/pgsql/tests/26async_query_prepared.phpt106
-rw-r--r--ext/pgsql/tests/27large_object_oid.phpt47
-rw-r--r--ext/pgsql/tests/28large_object_import_oid.phpt48
-rw-r--r--ext/pgsql/tests/80_bug14383.phpt52
-rw-r--r--ext/pgsql/tests/80_bug24499.phpt66
-rw-r--r--ext/pgsql/tests/80_bug27597.phpt60
-rw-r--r--ext/pgsql/tests/80_bug32223.phpt58
-rw-r--r--ext/pgsql/tests/80_bug32223b.phpt60
-rw-r--r--ext/pgsql/tests/80_bug36625.phpt49
-rw-r--r--ext/pgsql/tests/80_bug39971.phpt30
-rw-r--r--ext/pgsql/tests/80_bug42783.phpt34
-rw-r--r--ext/pgsql/tests/98old_api.phpt33
-rw-r--r--ext/pgsql/tests/9999dropdb.phpt18
-rw-r--r--ext/pgsql/tests/README16
-rw-r--r--ext/pgsql/tests/bug37100.phpt46
-rw-r--r--ext/pgsql/tests/bug37100_85.phpt46
-rw-r--r--ext/pgsql/tests/bug47199.phpt67
-rw-r--r--ext/pgsql/tests/bug60244.phpt57
-rw-r--r--ext/pgsql/tests/config.inc12
-rw-r--r--ext/pgsql/tests/lcmess.inc21
-rw-r--r--ext/pgsql/tests/pg_delete_001.phpt86
-rw-r--r--ext/pgsql/tests/pg_insert_001.phpt40
-rw-r--r--ext/pgsql/tests/pg_meta_data_001.phpt92
-rw-r--r--ext/pgsql/tests/pg_select_001.phpt63
-rw-r--r--ext/pgsql/tests/pg_update_001.phpt51
-rw-r--r--ext/pgsql/tests/php.gifbin0 -> 3872 bytes
-rw-r--r--ext/pgsql/tests/skipif.inc32
56 files changed, 2490 insertions, 0 deletions
diff --git a/ext/pgsql/tests/01createdb.phpt b/ext/pgsql/tests/01createdb.phpt
new file mode 100644
index 0000000..1584939
--- /dev/null
+++ b/ext/pgsql/tests/01createdb.phpt
@@ -0,0 +1,28 @@
+--TEST--
+PostgreSQL create db
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+// create test table
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+if (!@pg_num_rows(@pg_query($db, "SELECT * FROM ".$table_name)))
+{
+ @pg_query($db,$table_def); // Create table here
+ for ($i=0; $i < $num_test_record; $i++) {
+ pg_query($db,"INSERT INTO ".$table_name." VALUES ($i, 'ABC');");
+ }
+}
+else {
+ echo pg_last_error()."\n";
+}
+
+pg_close($db);
+
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/02connection.phpt b/ext/pgsql/tests/02connection.phpt
new file mode 100644
index 0000000..234427b
--- /dev/null
+++ b/ext/pgsql/tests/02connection.phpt
@@ -0,0 +1,59 @@
+--TEST--
+PostgreSQL connection
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+// connection function tests
+
+include('config.inc');
+
+$db = pg_pconnect($conn_str);
+var_dump($db);
+
+if (pg_connection_status($db) != PGSQL_CONNECTION_OK)
+{
+ echo "pg_connection_status() error\n";
+}
+if (!pg_connection_reset($db))
+{
+ echo "pg_connection_reset() error\n";
+}
+if (pg_connection_busy($db))
+{
+ echo "pg_connection_busy() error\n";
+}
+if (function_exists('pg_transaction_status')) {
+ if (pg_transaction_status($db) != PGSQL_TRANSACTION_IDLE)
+ {
+ echo "pg_transaction_status() error\n";
+ }
+}
+if (false === pg_host($db))
+{
+ echo "pg_host() error\n";
+}
+if (!pg_dbname($db))
+{
+ echo "pg_dbname() error\n";
+}
+if (!pg_port($db))
+{
+ echo "pg_port() error\n";
+}
+if (pg_tty($db))
+{
+ echo "pg_tty() error\n";
+}
+if (pg_options($db))
+{
+ echo "pg_options() error\n";
+}
+
+pg_close($db);
+
+?>
+===DONE===
+--EXPECTF--
+resource(%d) of type (pgsql link%s)
+===DONE===
diff --git a/ext/pgsql/tests/03sync_query.phpt b/ext/pgsql/tests/03sync_query.phpt
new file mode 100644
index 0000000..afb6bb4
--- /dev/null
+++ b/ext/pgsql/tests/03sync_query.phpt
@@ -0,0 +1,73 @@
+--TEST--
+PostgreSQL sync query
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+$result = pg_query($db, "SELECT * FROM ".$table_name.";");
+if (!($rows = pg_num_rows($result)))
+{
+ echo "pg_num_row() error\n";
+}
+for ($i=0; $i < $rows; $i++)
+{
+ pg_fetch_array($result, $i, PGSQL_NUM);
+}
+for ($i=0; $i < $rows; $i++)
+{
+ pg_fetch_object($result);
+}
+for ($i=0; $i < $rows; $i++)
+{
+ pg_fetch_row($result, $i);
+}
+for ($i=0; $i < $rows; $i++)
+{
+ pg_fetch_result($result, $i, 0);
+}
+
+pg_result_error($result);
+if (function_exists('pg_result_error_field')) {
+ pg_result_error_field($result, PGSQL_DIAG_SEVERITY);
+ pg_result_error_field($result, PGSQL_DIAG_SQLSTATE);
+ pg_result_error_field($result, PGSQL_DIAG_MESSAGE_PRIMARY);
+ pg_result_error_field($result, PGSQL_DIAG_MESSAGE_DETAIL);
+ pg_result_error_field($result, PGSQL_DIAG_MESSAGE_HINT);
+ pg_result_error_field($result, PGSQL_DIAG_STATEMENT_POSITION);
+ if (defined('PGSQL_DIAG_INTERNAL_POSITION'))
+ {
+ pg_result_error_field($result, PGSQL_DIAG_INTERNAL_POSITION);
+ }
+ if (defined('PGSQL_DIAG_INTERNAL_QUERY'))
+ {
+ pg_result_error_field($result, PGSQL_DIAG_INTERNAL_QUERY);
+ }
+ pg_result_error_field($result, PGSQL_DIAG_CONTEXT);
+ pg_result_error_field($result, PGSQL_DIAG_SOURCE_FILE);
+ pg_result_error_field($result, PGSQL_DIAG_SOURCE_LINE);
+ pg_result_error_field($result, PGSQL_DIAG_SOURCE_FUNCTION);
+}
+pg_num_rows(pg_query($db, "SELECT * FROM ".$table_name.";"));
+pg_num_fields(pg_query($db, "SELECT * FROM ".$table_name.";"));
+pg_field_name($result, 0);
+pg_field_num($result, $field_name);
+pg_field_size($result, 0);
+pg_field_type($result, 0);
+pg_field_prtlen($result, 0);
+pg_field_is_null($result, 0);
+
+$result = pg_query($db, "INSERT INTO ".$table_name." VALUES (9999, 'ABC');");
+pg_last_oid($result);
+
+pg_free_result($result);
+pg_close($db);
+
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/04async_query.phpt b/ext/pgsql/tests/04async_query.phpt
new file mode 100644
index 0000000..7711240
--- /dev/null
+++ b/ext/pgsql/tests/04async_query.phpt
@@ -0,0 +1,65 @@
+--TEST--
+PostgreSQL async query
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+if (!pg_send_query($db, "SELECT * FROM ".$table_name.";")) {
+ echo "pg_send_query() error\n";
+}
+while(pg_connection_busy($db)); // busy wait: intended
+if (pg_connection_status($db) === PGSQL_CONNECTION_BAD) {
+ echo "pg_connection_status() error\n";
+}
+if (!($result = pg_get_result($db)))
+{
+ echo "pg_get_result() error\n";
+}
+
+if (!($rows = pg_num_rows($result))) {
+ echo "pg_num_rows() error\n";
+}
+for ($i=0; $i < $rows; $i++)
+{
+ pg_fetch_array($result, $i, PGSQL_NUM);
+}
+for ($i=0; $i < $rows; $i++)
+{
+ pg_fetch_object($result);
+}
+for ($i=0; $i < $rows; $i++)
+{
+ pg_fetch_row($result, $i);
+}
+for ($i=0; $i < $rows; $i++)
+{
+ pg_fetch_result($result, $i, 0);
+}
+
+pg_num_rows(pg_query($db, "SELECT * FROM ".$table_name.";"));
+pg_num_fields(pg_query($db, "SELECT * FROM ".$table_name.";"));
+pg_field_name($result, 0);
+pg_field_num($result, $field_name);
+pg_field_size($result, 0);
+pg_field_type($result, 0);
+pg_field_prtlen($result, 0);
+pg_field_is_null($result, 0);
+
+if (!pg_send_query($db, "INSERT INTO ".$table_name." VALUES (8888, 'GGG');"))
+{
+ echo "pg_send_query() error\n";
+}
+
+pg_last_oid($result);
+pg_free_result($result);
+
+
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/05large_object.phpt b/ext/pgsql/tests/05large_object.phpt
new file mode 100644
index 0000000..a6f3019
--- /dev/null
+++ b/ext/pgsql/tests/05large_object.phpt
@@ -0,0 +1,82 @@
+--TEST--
+PostgreSQL large object
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+echo "create/write/close LO\n";
+pg_exec ($db, "begin");
+$oid = pg_lo_create ($db);
+if (!$oid) echo ("pg_lo_create() error\n");
+$handle = pg_lo_open ($db, $oid, "w");
+if (!$handle) echo ("pg_lo_open() error\n");
+pg_lo_write ($handle, "large object data\n");
+pg_lo_close ($handle);
+pg_exec ($db, "commit");
+
+echo "open/read/tell/seek/close LO\n";
+pg_exec ($db, "begin");
+$handle = pg_lo_open ($db, $oid, "w");
+pg_lo_read($handle, 100);
+pg_lo_tell($handle);
+pg_lo_seek($handle, 2);
+pg_lo_close($handle);
+pg_exec ($db, "commit");
+
+echo "open/read_all/close LO\n";
+pg_exec ($db, "begin");
+$handle = pg_lo_open ($db, $oid, "w");
+pg_lo_read_all($handle);
+if (pg_last_error()) echo "pg_lo_read_all() error\n".pg_last_error();
+pg_lo_close($handle);
+pg_exec ($db, "commit");
+
+echo "unlink LO\n";
+pg_exec ($db, "begin");
+pg_lo_unlink($db, $oid) or print("pg_lo_unlink() error 1\n");
+pg_exec ($db, "commit");
+
+// more pg_lo_unlink() tests
+echo "Test without connection\n";
+pg_exec ($db, "begin");
+$oid = pg_lo_create ($db) or print("pg_lo_create() error\n");
+pg_lo_unlink($oid) or print("pg_lo_unlink() error 2\n");
+pg_exec ($db, "commit");
+
+echo "Test with string oid value\n";
+pg_exec ($db, "begin");
+$oid = pg_lo_create ($db) or print("pg_lo_create() error\n");
+pg_lo_unlink($db, (string)$oid) or print("pg_lo_unlink() error 3\n");
+pg_exec ($db, "commit");
+
+echo "import/export LO\n";
+$path = dirname(__FILE__) . '/';
+pg_query($db, 'begin');
+$oid = pg_lo_import($db, $path . 'php.gif');
+pg_query($db, 'commit');
+pg_query($db, 'begin');
+@unlink($path . 'php.gif.exported');
+pg_lo_export($oid, $path . 'php.gif.exported', $db);
+if (!file_exists($path . 'php.gif.exported')) {
+ echo "Export failed\n";
+}
+@unlink($path . 'php.gif.exported');
+pg_query($db, 'commit');
+
+echo "OK";
+?>
+--EXPECT--
+create/write/close LO
+open/read/tell/seek/close LO
+open/read_all/close LO
+large object data
+unlink LO
+Test without connection
+Test with string oid value
+import/export LO
+OK
diff --git a/ext/pgsql/tests/06copy.phpt b/ext/pgsql/tests/06copy.phpt
new file mode 100644
index 0000000..bed783a
--- /dev/null
+++ b/ext/pgsql/tests/06copy.phpt
@@ -0,0 +1,22 @@
+--TEST--
+PostgreSQL copy functions
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+$rows = pg_copy_to($db, $table_name);
+
+pg_query($db, "DELETE FROM $table_name");
+
+pg_copy_from($db, $table_name, $rows);
+
+echo "OK";
+
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/07optional.phpt b/ext/pgsql/tests/07optional.phpt
new file mode 100644
index 0000000..9fa6f16
--- /dev/null
+++ b/ext/pgsql/tests/07optional.phpt
@@ -0,0 +1,24 @@
+--TEST--
+PostgreSQL optional functions
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+// optional functions
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+$enc = pg_client_encoding($db);
+
+pg_set_client_encoding($db, $enc);
+
+if (function_exists('pg_set_error_verbosity')) {
+ pg_set_error_verbosity(PGSQL_ERRORS_TERSE);
+ pg_set_error_verbosity(PGSQL_ERRORS_DEFAULT);
+ pg_set_error_verbosity(PGSQL_ERRORS_VERBOSE);
+}
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/08escape.phpt b/ext/pgsql/tests/08escape.phpt
new file mode 100644
index 0000000..90b4ed8
--- /dev/null
+++ b/ext/pgsql/tests/08escape.phpt
@@ -0,0 +1,95 @@
+--TEST--
+PostgreSQL escape functions
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+
+include 'config.inc';
+define('FILE_NAME', dirname(__FILE__) . '/php.gif');
+
+// pg_escape_string() test
+$before = "ABC\\ABC\'";
+$expect = "ABC\\\\ABC\\'";
+$expect2 = "ABC\\\\ABC\\\\''"; //the way escape string differs from PostgreSQL 9.0
+$after = pg_escape_string($before);
+if ($expect === $after || $expect2 === $after) {
+ echo "pg_escape_string() is Ok\n";
+}
+else {
+ echo "pg_escape_string() is NOT Ok\n";
+ var_dump($before);
+ var_dump($after);
+ var_dump($expect);
+}
+
+// pg_escape_bytea() test
+$before = "ABC\\ABC";
+$expect = "ABC\\\\\\\\ABC";
+$after = pg_escape_bytea($before);
+if ($expect === $after) {
+ echo "pg_escape_bytea() is Ok\n";
+}
+else {
+ echo "pg_escape_byte() is NOT Ok\n";
+ var_dump($before);
+ var_dump($after);
+ var_dump($expect);
+}
+
+// Test using database
+$data = file_get_contents(FILE_NAME);
+$db = pg_connect($conn_str);
+
+// Insert binary to DB
+$escaped_data = pg_escape_bytea($data);
+pg_query("DELETE FROM ".$table_name." WHERE num = -9999;");
+$sql = "INSERT INTO ".$table_name." (num, bin) VALUES (-9999, CAST ('".$escaped_data."' AS BYTEA));";
+pg_query($db, $sql);
+
+// Retrieve binary from DB
+$sql = "SELECT bin::bytea FROM ".$table_name." WHERE num = -9999";
+$result = pg_query($db, $sql);
+$row = pg_fetch_array($result, 0, PGSQL_ASSOC);
+
+if ($data === pg_unescape_bytea($row['bin'])) {
+ echo "pg_escape_bytea() actually works with database\n";
+}
+else {
+ echo "pg_escape_bytea() is broken\n";
+}
+
+// pg_escape_literal/pg_escape_identifier
+$before = "ABC\\ABC\'";
+$expect = " E'ABC\\\\ABC\\\\'''";
+$after = pg_escape_literal($before);
+if ($expect === $after) {
+ echo "pg_escape_literal() is Ok\n";
+}
+else {
+ echo "pg_escape_literal() is NOT Ok\n";
+ var_dump($before);
+ var_dump($after);
+ var_dump($expect);
+}
+
+$before = "ABC\\ABC\'";
+$expect = "\"ABC\ABC\'\"";
+$after = pg_escape_identifier($before);
+if ($expect === $after) {
+ echo "pg_escape_identifier() is Ok\n";
+}
+else {
+ echo "pg_escape_identifier() is NOT Ok\n";
+ var_dump($before);
+ var_dump($after);
+ var_dump($expect);
+}
+
+?>
+--EXPECT--
+pg_escape_string() is Ok
+pg_escape_bytea() is Ok
+pg_escape_bytea() actually works with database
+pg_escape_literal() is Ok
+pg_escape_identifier() is Ok \ No newline at end of file
diff --git a/ext/pgsql/tests/09notice.phpt b/ext/pgsql/tests/09notice.phpt
new file mode 100644
index 0000000..3167069
--- /dev/null
+++ b/ext/pgsql/tests/09notice.phpt
@@ -0,0 +1,38 @@
+--TEST--
+PostgreSQL notice function
+--SKIPIF--
+<?php
+
+include("skipif.inc");
+
+_skip_lc_messages();
+
+?>
+--INI--
+pgsql.log_notice=1
+pgsql.ignore_notices=0
+--FILE--
+<?php
+include 'config.inc';
+include 'lcmess.inc';
+
+$db = pg_connect($conn_str);
+
+_set_lc_messages();
+
+pg_query($db, "BEGIN;");
+pg_query($db, "BEGIN;");
+
+$msg = pg_last_notice($db);
+if ($msg === FALSE) {
+ echo "Cannot find notice message in hash\n";
+ var_dump($msg);
+}
+echo $msg."\n";
+echo "pg_last_notice() is Ok\n";
+
+?>
+--EXPECTF--
+Notice: pg_query(): %s already a transaction in progress in %s on line %d
+%s already a transaction in progress
+pg_last_notice() is Ok
diff --git a/ext/pgsql/tests/10pg_convert.phpt b/ext/pgsql/tests/10pg_convert.phpt
new file mode 100644
index 0000000..73bf2b6
--- /dev/null
+++ b/ext/pgsql/tests/10pg_convert.phpt
@@ -0,0 +1,29 @@
+--TEST--
+PostgreSQL pg_convert()
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '>=');
+?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+
+$fields = array('num'=>'1234', 'str'=>'AAA', 'bin'=>'BBB');
+$converted = pg_convert($db, $table_name, $fields);
+
+var_dump($converted);
+?>
+--EXPECT--
+array(3) {
+ ["num"]=>
+ string(4) "1234"
+ ["str"]=>
+ string(5) "'AAA'"
+ ["bin"]=>
+ string(5) "'BBB'"
+}
diff --git a/ext/pgsql/tests/10pg_convert_85.phpt b/ext/pgsql/tests/10pg_convert_85.phpt
new file mode 100644
index 0000000..4f1c92b
--- /dev/null
+++ b/ext/pgsql/tests/10pg_convert_85.phpt
@@ -0,0 +1,29 @@
+--TEST--
+PostgreSQL pg_convert() (8.5+)
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '<');
+?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+
+$fields = array('num'=>'1234', 'str'=>'AAA', 'bin'=>'BBB');
+$converted = pg_convert($db, $table_name, $fields);
+
+var_dump($converted);
+?>
+--EXPECT--
+array(3) {
+ ["num"]=>
+ string(4) "1234"
+ ["str"]=>
+ string(5) "'AAA'"
+ ["bin"]=>
+ string(11) "'\\x424242'"
+}
diff --git a/ext/pgsql/tests/11pg_meta_data.phpt b/ext/pgsql/tests/11pg_meta_data.phpt
new file mode 100644
index 0000000..a7f8ed4
--- /dev/null
+++ b/ext/pgsql/tests/11pg_meta_data.phpt
@@ -0,0 +1,64 @@
+--TEST--
+PostgreSQL pg_metadata()
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+
+$meta = pg_meta_data($db, $table_name);
+
+var_dump($meta);
+?>
+--EXPECT--
+array(3) {
+ ["num"]=>
+ array(6) {
+ ["num"]=>
+ int(1)
+ ["type"]=>
+ string(4) "int4"
+ ["len"]=>
+ int(4)
+ ["not null"]=>
+ bool(false)
+ ["has default"]=>
+ bool(false)
+ ["array dims"]=>
+ int(0)
+ }
+ ["str"]=>
+ array(6) {
+ ["num"]=>
+ int(2)
+ ["type"]=>
+ string(4) "text"
+ ["len"]=>
+ int(-1)
+ ["not null"]=>
+ bool(false)
+ ["has default"]=>
+ bool(false)
+ ["array dims"]=>
+ int(0)
+ }
+ ["bin"]=>
+ array(6) {
+ ["num"]=>
+ int(3)
+ ["type"]=>
+ string(5) "bytea"
+ ["len"]=>
+ int(-1)
+ ["not null"]=>
+ bool(false)
+ ["has default"]=>
+ bool(false)
+ ["array dims"]=>
+ int(0)
+ }
+}
diff --git a/ext/pgsql/tests/12pg_insert.phpt b/ext/pgsql/tests/12pg_insert.phpt
new file mode 100644
index 0000000..f5cd868
--- /dev/null
+++ b/ext/pgsql/tests/12pg_insert.phpt
@@ -0,0 +1,24 @@
+--TEST--
+PostgreSQL pg_insert()
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '>=');
+?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+$fields = array('num'=>'1234', 'str'=>'AAA', 'bin'=>'BBB');
+
+pg_insert($db, $table_name, $fields) or print "Error in test 1\n";
+echo pg_insert($db, $table_name, $fields, PGSQL_DML_STRING)."\n";
+
+echo "Ok\n";
+?>
+--EXPECT--
+INSERT INTO php_pgsql_test (num,str,bin) VALUES (1234,'AAA','BBB');
+Ok
diff --git a/ext/pgsql/tests/12pg_insert_85.phpt b/ext/pgsql/tests/12pg_insert_85.phpt
new file mode 100644
index 0000000..a85dea0
--- /dev/null
+++ b/ext/pgsql/tests/12pg_insert_85.phpt
@@ -0,0 +1,24 @@
+--TEST--
+PostgreSQL pg_insert() (8.5+)
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '<');
+?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+$fields = array('num'=>'1234', 'str'=>'AAA', 'bin'=>'BBB');
+
+pg_insert($db, $table_name, $fields) or print "Error in test 1\n";
+echo pg_insert($db, $table_name, $fields, PGSQL_DML_STRING)."\n";
+
+echo "Ok\n";
+?>
+--EXPECT--
+INSERT INTO php_pgsql_test (num,str,bin) VALUES (1234,'AAA','\\x424242');
+Ok
diff --git a/ext/pgsql/tests/13pg_select.phpt b/ext/pgsql/tests/13pg_select.phpt
new file mode 100644
index 0000000..f1504a8
--- /dev/null
+++ b/ext/pgsql/tests/13pg_select.phpt
@@ -0,0 +1,37 @@
+--TEST--
+PostgreSQL pg_select()
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '>=');
+?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+$fields = array('num'=>'1234', 'str'=>'ABC', 'bin'=>'XYZ');
+$ids = array('num'=>'1234');
+
+$res = pg_select($db, $table_name, $ids) or print "Error\n";
+var_dump($res);
+echo pg_select($db, $table_name, $ids, PGSQL_DML_STRING)."\n";
+echo "Ok\n";
+
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ array(3) {
+ ["num"]=>
+ string(4) "1234"
+ ["str"]=>
+ string(3) "AAA"
+ ["bin"]=>
+ string(3) "BBB"
+ }
+}
+SELECT * FROM php_pgsql_test WHERE num=1234;
+Ok
diff --git a/ext/pgsql/tests/13pg_select_85.phpt b/ext/pgsql/tests/13pg_select_85.phpt
new file mode 100644
index 0000000..e6d86bd
--- /dev/null
+++ b/ext/pgsql/tests/13pg_select_85.phpt
@@ -0,0 +1,37 @@
+--TEST--
+PostgreSQL pg_select() (8.5+)
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '<');
+?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+$fields = array('num'=>'1234', 'str'=>'ABC', 'bin'=>'XYZ');
+$ids = array('num'=>'1234');
+
+$res = pg_select($db, $table_name, $ids) or print "Error\n";
+var_dump($res);
+echo pg_select($db, $table_name, $ids, PGSQL_DML_STRING)."\n";
+echo "Ok\n";
+
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ array(3) {
+ ["num"]=>
+ string(4) "1234"
+ ["str"]=>
+ string(3) "AAA"
+ ["bin"]=>
+ string(8) "\x424242"
+ }
+}
+SELECT * FROM php_pgsql_test WHERE num=1234;
+Ok
diff --git a/ext/pgsql/tests/14pg_update.phpt b/ext/pgsql/tests/14pg_update.phpt
new file mode 100644
index 0000000..b41dd1a
--- /dev/null
+++ b/ext/pgsql/tests/14pg_update.phpt
@@ -0,0 +1,25 @@
+--TEST--
+PostgreSQL pg_update()
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '>=');
+?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+$fields = array('num'=>'1234', 'str'=>'ABC', 'bin'=>'XYZ');
+$ids = array('num'=>'1234');
+
+pg_update($db, $table_name, $fields, $ids) or print "Error in test 1\n";
+echo pg_update($db, $table_name, $fields, $ids, PGSQL_DML_STRING)."\n";
+
+echo "Ok\n";
+?>
+--EXPECT--
+UPDATE php_pgsql_test SET num=1234,str='ABC',bin='XYZ' WHERE num=1234;
+Ok
diff --git a/ext/pgsql/tests/14pg_update_85.phpt b/ext/pgsql/tests/14pg_update_85.phpt
new file mode 100644
index 0000000..f1c77ea
--- /dev/null
+++ b/ext/pgsql/tests/14pg_update_85.phpt
@@ -0,0 +1,25 @@
+--TEST--
+PostgreSQL pg_update() (8.5+)
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '<');
+?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+$fields = array('num'=>'1234', 'str'=>'ABC', 'bin'=>'XYZ');
+$ids = array('num'=>'1234');
+
+pg_update($db, $table_name, $fields, $ids) or print "Error in test 1\n";
+echo pg_update($db, $table_name, $fields, $ids, PGSQL_DML_STRING)."\n";
+
+echo "Ok\n";
+?>
+--EXPECT--
+UPDATE php_pgsql_test SET num=1234,str='ABC',bin='\\x58595a' WHERE num=1234;
+Ok
diff --git a/ext/pgsql/tests/15pg_delete.phpt b/ext/pgsql/tests/15pg_delete.phpt
new file mode 100644
index 0000000..e35f4ba
--- /dev/null
+++ b/ext/pgsql/tests/15pg_delete.phpt
@@ -0,0 +1,23 @@
+--TEST--
+PostgreSQL pg_delete()
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+
+$fields = array('num'=>'1234', 'str'=>'XXX', 'bin'=>'YYY');
+$ids = array('num'=>'1234');
+if (!pg_delete($db, $table_name, $ids)) {
+ echo "Error\n";
+}
+else {
+ echo "Ok\n";
+}
+?>
+--EXPECT--
+Ok
diff --git a/ext/pgsql/tests/16pg_result_status.phpt b/ext/pgsql/tests/16pg_result_status.phpt
new file mode 100644
index 0000000..268dc9f
--- /dev/null
+++ b/ext/pgsql/tests/16pg_result_status.phpt
@@ -0,0 +1,19 @@
+--TEST--
+PostgreSQL pg_result_status()
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+
+$sql = "SELECT * FROM ".$table_name." WHERE num = -2";
+$result = pg_query($db, "BEGIN;END");
+
+echo pg_result_status($result)."\n";
+echo pg_result_status($result, PGSQL_STATUS_STRING)."\n";
+?>
+--EXPECT--
+1
+COMMIT
diff --git a/ext/pgsql/tests/17result.phpt b/ext/pgsql/tests/17result.phpt
new file mode 100644
index 0000000..c3f9959
--- /dev/null
+++ b/ext/pgsql/tests/17result.phpt
@@ -0,0 +1,67 @@
+--TEST--
+PostgreSQL pg_fetch_*() functions
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+
+$sql = "SELECT * FROM $table_name";
+$result = pg_query($db, $sql) or die('Cannot qeury db');
+$rows = pg_num_rows($result);
+
+var_dump(pg_result_seek($result, 1));
+var_dump(pg_fetch_object($result));
+var_dump(pg_fetch_array($result, 1));
+var_dump(pg_fetch_row($result, 1));
+var_dump(pg_fetch_assoc($result, 1));
+var_dump(pg_result_seek($result, 0));
+
+echo "Ok\n";
+?>
+--EXPECT--
+bool(true)
+object(stdClass)#1 (3) {
+ ["num"]=>
+ string(1) "1"
+ ["str"]=>
+ string(3) "ABC"
+ ["bin"]=>
+ NULL
+}
+array(6) {
+ [0]=>
+ string(1) "1"
+ ["num"]=>
+ string(1) "1"
+ [1]=>
+ string(3) "ABC"
+ ["str"]=>
+ string(3) "ABC"
+ [2]=>
+ NULL
+ ["bin"]=>
+ NULL
+}
+array(3) {
+ [0]=>
+ string(1) "1"
+ [1]=>
+ string(3) "ABC"
+ [2]=>
+ NULL
+}
+array(3) {
+ ["num"]=>
+ string(1) "1"
+ ["str"]=>
+ string(3) "ABC"
+ ["bin"]=>
+ NULL
+}
+bool(true)
+Ok
diff --git a/ext/pgsql/tests/18pg_escape_bytea.phpt b/ext/pgsql/tests/18pg_escape_bytea.phpt
new file mode 100644
index 0000000..43f98c4
--- /dev/null
+++ b/ext/pgsql/tests/18pg_escape_bytea.phpt
@@ -0,0 +1,28 @@
+--TEST--
+PostgreSQL pg_escape_bytea() functions
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+// optional functions
+
+include('config.inc');
+
+$image = file_get_contents(dirname(__FILE__) . '/php.gif');
+$esc_image = pg_escape_bytea($image);
+
+$db = pg_connect($conn_str);
+pg_query($db, 'INSERT INTO '.$table_name.' (num, bin) VALUES (9876, \''.$esc_image.'\');');
+$result = pg_query($db, 'SELECT * FROM '.$table_name.' WHERE num = 9876');
+$rows = pg_fetch_all($result);
+$unesc_image = pg_unescape_bytea($rows[0]['bin']);
+
+if ($unesc_image !== $image) {
+ echo "NG";
+}
+else {
+ echo "OK";
+}
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/19pg_ping.phpt b/ext/pgsql/tests/19pg_ping.phpt
new file mode 100644
index 0000000..9059bde
--- /dev/null
+++ b/ext/pgsql/tests/19pg_ping.phpt
@@ -0,0 +1,15 @@
+--TEST--
+PostgreSQL pg_ping() functions
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+// optional functions
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+var_dump(pg_ping($db));
+?>
+--EXPECT--
+bool(true)
diff --git a/ext/pgsql/tests/20pg_get_pid.phpt b/ext/pgsql/tests/20pg_get_pid.phpt
new file mode 100644
index 0000000..06cdfa8
--- /dev/null
+++ b/ext/pgsql/tests/20pg_get_pid.phpt
@@ -0,0 +1,17 @@
+--TEST--
+PostgreSQL pg_get_pid() functions
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+// optional functions
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+$pid = pg_get_pid($db);
+
+is_integer($pid) ? print 'OK' : print 'NG';
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/21pg_get_notify.phpt b/ext/pgsql/tests/21pg_get_notify.phpt
new file mode 100644
index 0000000..9171fc0
--- /dev/null
+++ b/ext/pgsql/tests/21pg_get_notify.phpt
@@ -0,0 +1,20 @@
+--TEST--
+PostgreSQL pg_get_notify() functions
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+// optional functions
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+pg_query($db, 'LISTEN test_msg');
+pg_query($db, 'NOTIFY test_msg');
+
+$msg = pg_get_notify($db);
+
+isset($msg['message'],$msg['pid']) ? print 'OK' : print 'NG';
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/22pg_fetch_object.phpt b/ext/pgsql/tests/22pg_fetch_object.phpt
new file mode 100644
index 0000000..76a3fbe
--- /dev/null
+++ b/ext/pgsql/tests/22pg_fetch_object.phpt
@@ -0,0 +1,37 @@
+--TEST--
+PostgreSQL pg_fetch_object()
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+include 'config.inc';
+
+class test_class {
+ function __construct($arg1, $arg2) {
+ echo __METHOD__ . "($arg1,$arg2)\n";
+ }
+}
+
+$db = pg_connect($conn_str);
+
+$sql = "SELECT * FROM $table_name WHERE num = 0";
+$result = pg_query($db, $sql) or die('Cannot qeury db');
+$rows = pg_num_rows($result);
+
+var_dump(pg_fetch_object($result, NULL, 'test_class', array(1, 2)));
+
+echo "Ok\n";
+?>
+--EXPECT--
+test_class::__construct(1,2)
+object(test_class)#1 (3) {
+ ["num"]=>
+ string(1) "0"
+ ["str"]=>
+ string(3) "ABC"
+ ["bin"]=>
+ NULL
+}
+Ok
diff --git a/ext/pgsql/tests/23sync_query_params.phpt b/ext/pgsql/tests/23sync_query_params.phpt
new file mode 100644
index 0000000..6959cd7
--- /dev/null
+++ b/ext/pgsql/tests/23sync_query_params.phpt
@@ -0,0 +1,59 @@
+--TEST--
+PostgreSQL sync query params
+--SKIPIF--
+<?php
+include("skipif.inc");
+if (!function_exists('pg_query_params')) die('skip function pg_query_params() does not exist');
+?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+$version = pg_version($db);
+if ($version['protocol'] >= 3) {
+ $result = pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num > \$1;", array(100));
+ if (!($rows = pg_num_rows($result)))
+ {
+ echo "pg_num_row() error\n";
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_array($result, $i, PGSQL_NUM);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_object($result);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_row($result, $i);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_result($result, $i, 0);
+ }
+
+ pg_result_error($result);
+ pg_num_rows(pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num > \$1;", array(100)));
+ pg_num_fields(pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num > \$1;", array(100)));
+ pg_field_name($result, 0);
+ pg_field_num($result, $field_name);
+ pg_field_size($result, 0);
+ pg_field_type($result, 0);
+ pg_field_prtlen($result, 0);
+ pg_field_is_null($result, 0);
+
+ $result = pg_query_params($db, "INSERT INTO ".$table_name." VALUES (\$1, \$2);", array(9999, "A'BC"));
+ pg_last_oid($result);
+
+ pg_free_result($result);
+}
+pg_close($db);
+
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/24sync_query_prepared.phpt b/ext/pgsql/tests/24sync_query_prepared.phpt
new file mode 100644
index 0000000..ea8f146
--- /dev/null
+++ b/ext/pgsql/tests/24sync_query_prepared.phpt
@@ -0,0 +1,65 @@
+--TEST--
+PostgreSQL sync prepared queries
+--SKIPIF--
+<?php
+include("skipif.inc");
+if (!function_exists('pg_prepare')) die('skip function pg_prepare() does not exist');
+?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+$version = pg_version($db);
+if ($version['protocol'] >= 3) {
+ $result = pg_prepare($db, "php_test", "SELECT * FROM ".$table_name." WHERE num > \$1;");
+ pg_result_error($result);
+ pg_free_result($result);
+ $result = pg_execute($db, "php_test", array(100));
+ if (!($rows = pg_num_rows($result)))
+ {
+ echo "pg_num_row() error\n";
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_array($result, $i, PGSQL_NUM);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_object($result);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_row($result, $i);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_result($result, $i, 0);
+ }
+
+ pg_result_error($result);
+ pg_num_rows(pg_execute($db, "php_test", array(100)));
+ pg_num_fields(pg_execute($db, "php_test", array(100)));
+ pg_field_name($result, 0);
+ pg_field_num($result, $field_name);
+ pg_field_size($result, 0);
+ pg_field_type($result, 0);
+ pg_field_prtlen($result, 0);
+ pg_field_is_null($result, 0);
+
+ $result = pg_prepare($db, "php_test2", "INSERT INTO ".$table_name." VALUES (\$1, \$2);");
+ pg_result_error($result);
+ pg_free_result($result);
+ $result = pg_execute($db, "php_test2", array(9999, "A'BC"));
+ pg_last_oid($result);
+
+ pg_free_result($result);
+}
+pg_close($db);
+
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/25async_query_params.phpt b/ext/pgsql/tests/25async_query_params.phpt
new file mode 100644
index 0000000..6e7dafe
--- /dev/null
+++ b/ext/pgsql/tests/25async_query_params.phpt
@@ -0,0 +1,70 @@
+--TEST--
+PostgreSQL async query params
+--SKIPIF--
+<?php
+include("skipif.inc");
+if (!function_exists('pg_send_query_params')) die('skip function pg_send_query_params() does not exist');
+?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+$version = pg_version($db);
+if ($version['protocol'] >= 3) {
+ if (!pg_send_query_params($db, "SELECT * FROM ".$table_name." WHERE num > \$1;", array(100))) {
+ echo "pg_send_query_params() error\n";
+ }
+ while(pg_connection_busy($db)); // busy wait: intended
+ if (pg_connection_status($db) === PGSQL_CONNECTION_BAD) {
+ echo "pg_connection_status() error\n";
+ }
+ if (!($result = pg_get_result($db)))
+ {
+ echo "pg_get_result() error\n";
+ }
+ if (!($rows = pg_num_rows($result))) {
+ echo "pg_num_rows() error\n";
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_array($result, $i, PGSQL_NUM);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_object($result);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_row($result, $i);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_result($result, $i, 0);
+ }
+
+ pg_num_rows(pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num > \$1;", array(100)));
+ pg_num_fields(pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num > \$1;", array(100)));
+ pg_field_name($result, 0);
+ pg_field_num($result, $field_name);
+ pg_field_size($result, 0);
+ pg_field_type($result, 0);
+ pg_field_prtlen($result, 0);
+ pg_field_is_null($result, 0);
+
+ if (!pg_send_query_params($db, "INSERT INTO ".$table_name." VALUES (\$1, \$2);", array(9999, "A'BC")))
+ {
+ echo "pg_send_query_params() error\n";
+ }
+
+ pg_last_oid($result);
+ pg_free_result($result);
+}
+pg_close($db);
+
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/26async_query_prepared.phpt b/ext/pgsql/tests/26async_query_prepared.phpt
new file mode 100644
index 0000000..bda363b
--- /dev/null
+++ b/ext/pgsql/tests/26async_query_prepared.phpt
@@ -0,0 +1,106 @@
+--TEST--
+PostgreSQL async prepared queries
+--SKIPIF--
+<?php
+include("skipif.inc");
+if (!function_exists('pg_send_prepare')) die('skip function pg_send_prepare() does not exist');
+?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+$version = pg_version($db);
+if ($version['protocol'] >= 3) {
+ if (!pg_send_prepare($db, 'php_test', "SELECT * FROM ".$table_name." WHERE num > \$1;")) {
+ echo "pg_send_prepare() error\n";
+ }
+ while(pg_connection_busy($db)); // busy wait: intended
+ if (pg_connection_status($db) === PGSQL_CONNECTION_BAD) {
+ echo "pg_connection_status() error\n";
+ }
+ if (!($result = pg_get_result($db)))
+ {
+ echo "pg_get_result() error\n";
+ }
+ pg_free_result($result);
+
+ if (!pg_send_execute($db, 'php_test', array(100))) {
+ echo "pg_send_execute() error\n";
+ }
+ while(pg_connection_busy($db)); // busy wait: intended
+ if (pg_connection_status($db) === PGSQL_CONNECTION_BAD) {
+ echo "pg_connection_status() error\n";
+ }
+ if (!($result = pg_get_result($db)))
+ {
+ echo "pg_get_result() error\n";
+ }
+
+ if (!($rows = pg_num_rows($result))) {
+ echo "pg_num_rows() error\n";
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_array($result, $i, PGSQL_NUM);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_object($result);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_row($result, $i);
+ }
+ for ($i=0; $i < $rows; $i++)
+ {
+ pg_fetch_result($result, $i, 0);
+ }
+
+ pg_num_rows(pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num > \$1;", array(100)));
+ pg_num_fields(pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num > \$1;", array(100)));
+ pg_field_name($result, 0);
+ pg_field_num($result, $field_name);
+ pg_field_size($result, 0);
+ pg_field_type($result, 0);
+ pg_field_prtlen($result, 0);
+ pg_field_is_null($result, 0);
+
+ if (!pg_send_prepare($db, "php_test2", "INSERT INTO ".$table_name." VALUES (\$1, \$2);"))
+ {
+ echo "pg_send_prepare() error\n";
+ }
+ while(pg_connection_busy($db)); // busy wait: intended
+ if (pg_connection_status($db) === PGSQL_CONNECTION_BAD) {
+ echo "pg_connection_status() error\n";
+ }
+ if (!($result = pg_get_result($db)))
+ {
+ echo "pg_get_result() error\n";
+ }
+ pg_free_result($result);
+
+ if (!pg_send_execute($db, "php_test2", array(9999, "A'BC")))
+ {
+ echo "pg_send_execute() error\n";
+ }
+ while(pg_connection_busy($db)); // busy wait: intended
+ if (pg_connection_status($db) === PGSQL_CONNECTION_BAD) {
+ echo "pg_connection_status() error\n";
+ }
+ if (!($result = pg_get_result($db)))
+ {
+ echo "pg_get_result() error\n";
+ }
+
+ pg_last_oid($result);
+ pg_free_result($result);
+}
+pg_close($db);
+
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/27large_object_oid.phpt b/ext/pgsql/tests/27large_object_oid.phpt
new file mode 100644
index 0000000..0a469bc
--- /dev/null
+++ b/ext/pgsql/tests/27large_object_oid.phpt
@@ -0,0 +1,47 @@
+--TEST--
+PostgreSQL create large object with given oid
+--SKIPIF--
+<?php
+include("skipif.inc");
+$v = pg_version($conn);
+if (version_compare("8.3", $v["client"]) > 0) die("skip - requires pg client >= 8.3\n");
+if (version_compare("8.3", $v["server"]) > 0) die("skip - requires pg server >= 8.3\n");
+?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+echo "create LO from int\n";
+pg_exec ($db, "begin");
+$oid = pg_lo_create ($db, 21000);
+if (!$oid) echo ("pg_lo_create() error\n");
+if ($oid != 21000) echo ("pg_lo_create() wrong id\n");
+pg_lo_unlink ($db, $oid);
+pg_exec ($db, "commit");
+
+echo "create LO from string\n";
+pg_exec ($db, "begin");
+$oid = pg_lo_create ($db, "21001");
+if (!$oid) echo ("pg_lo_create() error\n");
+if ($oid != 21001) echo ("pg_lo_create() wrong id\n");
+pg_lo_unlink ($db, $oid);
+pg_exec ($db, "commit");
+
+echo "create LO using default connection\n";
+pg_exec ("begin");
+$oid = pg_lo_create (21002);
+if (!$oid) echo ("pg_lo_create() error\n");
+if ($oid != 21002) echo ("pg_lo_create() wrong id\n");
+pg_lo_unlink ($oid);
+pg_exec ("commit");
+
+echo "OK";
+?>
+--EXPECT--
+create LO from int
+create LO from string
+create LO using default connection
+OK
diff --git a/ext/pgsql/tests/28large_object_import_oid.phpt b/ext/pgsql/tests/28large_object_import_oid.phpt
new file mode 100644
index 0000000..323d179
--- /dev/null
+++ b/ext/pgsql/tests/28large_object_import_oid.phpt
@@ -0,0 +1,48 @@
+--TEST--
+PostgreSQL import large object with given oid
+--SKIPIF--
+<?php
+include("skipif.inc");
+$v = pg_version($conn);
+if (version_compare("8.4devel", $v["client"]) > 0) die("skip - requires pg client >= 8.4\n");
+if (version_compare("8.4devel", $v["server"]) > 0) die("skip - requires pg server >= 8.4\n");
+?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+
+echo "import LO from int\n";
+pg_exec($db, 'begin');
+$oid = pg_lo_import($db, __FILE__, 21003);
+if (!$oid) echo ("pg_lo_import() error\n");
+if ($oid != 21003) echo ("pg_lo_import() wrong id\n");
+pg_lo_unlink ($db, $oid);
+pg_exec($db, 'commit');
+
+echo "import LO from string\n";
+pg_exec($db, 'begin');
+$oid = pg_lo_import($db, __FILE__, "21004");
+if (!$oid) echo ("pg_lo_import() error\n");
+if ($oid != 21004) echo ("pg_lo_import() wrong id\n");
+pg_lo_unlink ($db, $oid);
+pg_exec($db, 'commit');
+
+echo "import LO using default connection\n";
+pg_exec('begin');
+$oid = pg_lo_import($db, __FILE__, 21005);
+if (!$oid) echo ("pg_lo_import() error\n");
+if ($oid != 21005) echo ("pg_lo_import() wrong id\n");
+pg_lo_unlink ($oid);
+pg_exec('commit');
+
+
+echo "OK";
+?>
+--EXPECT--
+import LO from int
+import LO from string
+import LO using default connection
+OK
diff --git a/ext/pgsql/tests/80_bug14383.phpt b/ext/pgsql/tests/80_bug14383.phpt
new file mode 100644
index 0000000..a736f34
--- /dev/null
+++ b/ext/pgsql/tests/80_bug14383.phpt
@@ -0,0 +1,52 @@
+--TEST--
+Bug #14383 (using postgres with DBA causes DBA not to be able to find any keys)
+--SKIPIF--
+<?php
+require_once(dirname(__FILE__).'/../../dba/tests/skipif.inc');
+require_once('skipif.inc');
+?>
+--FILE--
+<?php
+require_once('config.inc');
+
+$dbh = @pg_connect($conn_str);
+if (!$dbh) {
+ die ("Could not connect to the server");
+}
+pg_close($dbh);
+
+require_once(dirname(__FILE__).'/../../dba/tests/test.inc');
+require_once(dirname(__FILE__).'/../../dba/tests/dba_handler.inc');
+
+?>
+--EXPECTF--
+database handler: %s
+3NYNYY
+Content String 2
+Content 2 replaced
+Read during write:%sallowed
+Content 2 replaced 2nd time
+The 6th value
+array(3) {
+ ["key number 6"]=>
+ string(13) "The 6th value"
+ ["key2"]=>
+ string(27) "Content 2 replaced 2nd time"
+ ["key5"]=>
+ string(23) "The last content string"
+}
+--NO-LOCK--
+3NYNYY
+Content String 2
+Content 2 replaced
+Read during write: not allowed
+Content 2 replaced 2nd time
+The 6th value
+array(3) {
+ ["key number 6"]=>
+ string(13) "The 6th value"
+ ["key2"]=>
+ string(27) "Content 2 replaced 2nd time"
+ ["key5"]=>
+ string(23) "The last content string"
+}
diff --git a/ext/pgsql/tests/80_bug24499.phpt b/ext/pgsql/tests/80_bug24499.phpt
new file mode 100644
index 0000000..32e789d
--- /dev/null
+++ b/ext/pgsql/tests/80_bug24499.phpt
@@ -0,0 +1,66 @@
+--TEST--
+Bug #24499 (Notice: Undefined property: stdClass::)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+?>
+--FILE--
+<?php
+
+require_once('config.inc');
+
+$dbh = @pg_connect($conn_str);
+if (!$dbh) {
+ die ("Could not connect to the server");
+}
+
+@pg_query("DROP SEQUENCE id_id_seq");
+@pg_query("DROP TABLE id");
+pg_query("CREATE TABLE id (id SERIAL, t INT)");
+
+for ($i=0; $i<4; $i++) {
+ pg_query("INSERT INTO id (t) VALUES ($i)");
+}
+
+class Id
+{
+ public $id;
+
+ public function getId()
+ {
+ global $dbh;
+
+ $q = pg_query($dbh, "SELECT id FROM id");
+ print_r(pg_fetch_array($q));
+ print_r(pg_fetch_array($q));
+ $id = pg_fetch_object($q);
+ var_dump($id);
+ return $id->id;
+ }
+}
+
+$id = new Id();
+var_dump($id->getId());
+
+pg_close($dbh);
+
+echo "Done\n";
+
+?>
+--EXPECTF--
+Array
+(
+ [0] => 1
+ [id] => 1
+)
+Array
+(
+ [0] => 2
+ [id] => 2
+)
+object(stdClass)#%d (1) {
+ ["id"]=>
+ string(1) "3"
+}
+string(1) "3"
+Done
diff --git a/ext/pgsql/tests/80_bug27597.phpt b/ext/pgsql/tests/80_bug27597.phpt
new file mode 100644
index 0000000..7d5b5db
--- /dev/null
+++ b/ext/pgsql/tests/80_bug27597.phpt
@@ -0,0 +1,60 @@
+--TEST--
+Bug #27597 (pg_fetch_array not returning false)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+?>
+--FILE--
+<?php
+
+require_once(dirname(__FILE__) . '/config.inc');
+
+$dbh = @pg_connect($conn_str);
+if (!$dbh) {
+ die ("Could not connect to the server");
+}
+
+@pg_query("DROP TABLE id");
+pg_query("CREATE TABLE id (id INT)");
+
+for ($i=0; $i<4; $i++) {
+ pg_query("INSERT INTO id (id) VALUES ($i)");
+}
+
+function xi_fetch_array($res, $type = PGSQL_ASSOC) {
+ $a = pg_fetch_array($res, NULL, $type) ;
+ return $a ;
+}
+
+$res = pg_query("SELECT * FROM id");
+$i = 0; // endless-loop protection
+while($row = xi_fetch_array($res)) {
+ print_r($row);
+ if ($i++ > 4) {
+ echo "ENDLESS-LOOP";
+ exit(1);
+ }
+}
+
+pg_close($dbh);
+
+?>
+===DONE===
+--EXPECTF--
+Array
+(
+ [id] => 0
+)
+Array
+(
+ [id] => 1
+)
+Array
+(
+ [id] => 2
+)
+Array
+(
+ [id] => 3
+)
+===DONE===
diff --git a/ext/pgsql/tests/80_bug32223.phpt b/ext/pgsql/tests/80_bug32223.phpt
new file mode 100644
index 0000000..573742c
--- /dev/null
+++ b/ext/pgsql/tests/80_bug32223.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Bug #32223 (weird behaviour of pg_last_notice)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+
+_skip_lc_messages();
+
+@pg_query($conn, "CREATE LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL'");
+$res = @pg_query($conn, "CREATE OR REPLACE FUNCTION test_notice() RETURNS boolean AS '
+begin
+ RAISE NOTICE ''11111'';
+ return ''f'';
+end;
+' LANGUAGE plpgsql;");
+if (!$res) die('skip PLPGSQL not available');
+?>
+--FILE--
+<?php
+
+require_once('config.inc');
+require_once('lcmess.inc');
+
+$dbh = @pg_connect($conn_str);
+if (!$dbh) {
+ die ("Could not connect to the server");
+}
+
+_set_lc_messages();
+
+$res = pg_query($dbh, "CREATE OR REPLACE FUNCTION test_notice() RETURNS boolean AS '
+begin
+ RAISE NOTICE ''11111'';
+ return ''f'';
+end;
+' LANGUAGE plpgsql;");
+
+
+$res = pg_query($dbh, 'SELECT test_notice()');
+$row = pg_fetch_row($res, 0);
+var_dump($row);
+pg_free_result($res);
+if ($row[0] == 'f')
+{
+ var_dump(pg_last_notice($dbh));
+}
+
+pg_close($dbh);
+
+?>
+===DONE===
+--EXPECTF--
+array(1) {
+ [0]=>
+ string(1) "f"
+}
+string(14) "NOTICE: 11111"
+===DONE===
diff --git a/ext/pgsql/tests/80_bug32223b.phpt b/ext/pgsql/tests/80_bug32223b.phpt
new file mode 100644
index 0000000..aada3f0
--- /dev/null
+++ b/ext/pgsql/tests/80_bug32223b.phpt
@@ -0,0 +1,60 @@
+--TEST--
+Bug #32223 (weird behaviour of pg_last_notice using define)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+
+_skip_lc_messages();
+
+@pg_query($conn, "CREATE LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL'");
+$res = @pg_query($conn, "CREATE OR REPLACE FUNCTION test_notice() RETURNS boolean AS '
+begin
+ RAISE NOTICE ''11111'';
+ return ''f'';
+end;
+' LANGUAGE plpgsql;");
+if (!$res) die('skip PLPGSQL not available');
+?>
+--FILE--
+<?php
+
+require_once('config.inc');
+require_once('lcmess.inc');
+
+define('dbh', pg_connect($conn_str));
+if (!dbh) {
+ die ("Could not connect to the server");
+}
+
+_set_lc_messages();
+
+$res = pg_query(dbh, "CREATE OR REPLACE FUNCTION test_notice() RETURNS boolean AS '
+begin
+ RAISE NOTICE ''11111'';
+ return ''f'';
+end;
+' LANGUAGE plpgsql;");
+
+function tester() {
+ $res = pg_query(dbh, 'SELECT test_notice()');
+ $row = pg_fetch_row($res, 0);
+ var_dump($row);
+ pg_free_result($res);
+ if ($row[0] == 'f')
+ {
+ var_dump(pg_last_notice(dbh));
+ }
+}
+tester();
+
+pg_close(dbh);
+
+?>
+===DONE===
+--EXPECTF--
+array(1) {
+ [0]=>
+ string(1) "f"
+}
+string(14) "NOTICE: 11111"
+===DONE===
diff --git a/ext/pgsql/tests/80_bug36625.phpt b/ext/pgsql/tests/80_bug36625.phpt
new file mode 100644
index 0000000..a95cea7
--- /dev/null
+++ b/ext/pgsql/tests/80_bug36625.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Bug #36625 (pg_trace() does not work)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+?>
+--FILE--
+<?php
+
+require_once('config.inc');
+
+$dbh = @pg_connect($conn_str);
+if (!$dbh) {
+ die ('Could not connect to the server');
+}
+
+$tracefile = dirname(__FILE__) . '/trace.tmp';
+
+@unlink($tracefile);
+var_dump(file_exists($tracefile));
+
+pg_trace($tracefile, 'w', $dbh);
+$res = pg_query($dbh, 'select 1');
+var_dump($res);
+pg_close($dbh);
+
+$found = 0;
+function search_trace_file($line)
+{
+ if (strpos($line, '"select 1"') !== false || strpos($line, "'select 1'") !== false) {
+ $GLOBALS['found']++;
+ }
+}
+
+$trace = file($tracefile);
+array_walk($trace, 'search_trace_file');
+var_dump($found > 0);
+var_dump(file_exists($tracefile));
+
+?>
+===DONE===
+--CLEAN--
+<?php unlink($tracefile); ?>
+--EXPECTF--
+bool(false)
+resource(%d) of type (pgsql result)
+bool(true)
+bool(true)
+===DONE===
diff --git a/ext/pgsql/tests/80_bug39971.phpt b/ext/pgsql/tests/80_bug39971.phpt
new file mode 100644
index 0000000..45d2631
--- /dev/null
+++ b/ext/pgsql/tests/80_bug39971.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #39971 (pg_insert/pg_update do not allow now() to be used for timestamp fields)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+?>
+--FILE--
+<?php
+
+require_once('config.inc');
+
+$dbh = @pg_connect($conn_str);
+if (!$dbh) {
+ die ("Could not connect to the server");
+}
+
+pg_query("CREATE TABLE php_test (id SERIAL, tm timestamp NOT NULL)");
+
+$values = array('tm' => 'now()');
+pg_insert($dbh, 'php_test', $values);
+
+$ids = array('id' => 1);
+pg_update($dbh, 'php_test', $values, $ids);
+
+pg_query($dbh, "DROP TABLE php_test");
+pg_close($dbh);
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/ext/pgsql/tests/80_bug42783.phpt b/ext/pgsql/tests/80_bug42783.phpt
new file mode 100644
index 0000000..575e527
--- /dev/null
+++ b/ext/pgsql/tests/80_bug42783.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Bug #42783 (pg_insert() does not support an empty value array)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+?>
+--FILE--
+<?php
+
+require_once('config.inc');
+
+$dbh = @pg_connect($conn_str);
+if (!$dbh) {
+ die ("Could not connect to the server");
+}
+
+pg_query("CREATE TABLE php_test (id SERIAL PRIMARY KEY, time TIMESTAMP NOT NULL DEFAULT now())");
+
+pg_insert($dbh, 'php_test', array());
+
+var_dump(pg_fetch_assoc(pg_query("SELECT * FROM php_test")));
+
+pg_query($dbh, "DROP TABLE php_test");
+pg_close($dbh);
+?>
+===DONE===
+--EXPECTF--
+array(2) {
+ ["id"]=>
+ string(%d) "%d"
+ ["time"]=>
+ string(%d) "%s"
+}
+===DONE===
diff --git a/ext/pgsql/tests/98old_api.phpt b/ext/pgsql/tests/98old_api.phpt
new file mode 100644
index 0000000..b391097
--- /dev/null
+++ b/ext/pgsql/tests/98old_api.phpt
@@ -0,0 +1,33 @@
+--TEST--
+PostgreSQL old api
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+$result = pg_exec("SELECT * FROM ".$table_name);
+pg_numrows($result);
+pg_numfields($result);
+pg_fieldname($result, 0);
+pg_fieldsize($result, 0);
+pg_fieldtype($result, 0);
+pg_fieldprtlen($result, 0);
+pg_fieldisnull($result, 0);
+
+pg_result($result,0,0);
+$result = pg_exec("INSERT INTO ".$table_name." VALUES (7777, 'KKK')");
+$oid = pg_getlastoid($result);
+pg_freeresult($result);
+pg_errormessage();
+$result = pg_exec("UPDATE ".$table_name." SET str = 'QQQ' WHERE str like 'RGD';");
+pg_cmdtuples($result);
+
+
+
+echo "OK";
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/9999dropdb.phpt b/ext/pgsql/tests/9999dropdb.phpt
new file mode 100644
index 0000000..c60eeda
--- /dev/null
+++ b/ext/pgsql/tests/9999dropdb.phpt
@@ -0,0 +1,18 @@
+--TEST--
+PostgreSQL drop db
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+// drop test table
+
+include('config.inc');
+
+$db = pg_connect($conn_str);
+pg_query($db, "DROP TABLE ".$table_name);
+
+echo "OK";
+
+?>
+--EXPECT--
+OK
diff --git a/ext/pgsql/tests/README b/ext/pgsql/tests/README
new file mode 100644
index 0000000..1a29a34
--- /dev/null
+++ b/ext/pgsql/tests/README
@@ -0,0 +1,16 @@
+Test scripts assumes:
+ - PostgreSQL server is installed locally
+ - there is a PostgreSQL account for the users running the test scripts
+ - there is database named "test"
+
+For instance, if your login name is 'testuser', you should have PostgreSQL
+user account named 'testuser' and grant that user access to the database
+'test'.
+
+If you have account and database, type "createdb test" from command prompt
+to create the database to execute the test scripts. By executing the above
+command as the same user running the tests you ensure that the user is
+granted access to the database.
+
+If you find problems in PostgreSQL module, please mail to
+intenals@lists.php.net, helly@php.net or yohgaki@php.net.
diff --git a/ext/pgsql/tests/bug37100.phpt b/ext/pgsql/tests/bug37100.phpt
new file mode 100644
index 0000000..fa6b9ba
--- /dev/null
+++ b/ext/pgsql/tests/bug37100.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Bug #37100 (data is returned truncated with BINARY CURSOR)
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '>=');
+?>
+--FILE--
+<?php
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+
+@pg_query('DROP TABLE test_bug');
+
+pg_query('CREATE TABLE test_bug (binfield byteA) ;');
+pg_query("INSERT INTO test_bug VALUES (decode('0103AA000812','hex'))");
+
+
+$data = pg_query("SELECT binfield FROM test_bug");
+$res = pg_fetch_result($data,0);
+var_dump($res);
+var_dump(bin2hex(pg_unescape_bytea($res)));
+
+$sql = "BEGIN; DECLARE mycursor BINARY CURSOR FOR SELECT binfield FROM test_bug; FETCH ALL IN mycursor;";
+
+$data = pg_query($sql);
+$res = pg_fetch_result($data,0);
+
+var_dump(strlen($res));
+var_dump(bin2hex($res));
+
+pg_close($db);
+
+$db = pg_connect($conn_str);
+pg_query('DROP TABLE test_bug');
+pg_close($db);
+
+
+?>
+--EXPECT--
+string(24) "\001\003\252\000\010\022"
+string(12) "0103aa000812"
+int(6)
+string(12) "0103aa000812"
diff --git a/ext/pgsql/tests/bug37100_85.phpt b/ext/pgsql/tests/bug37100_85.phpt
new file mode 100644
index 0000000..aa24776
--- /dev/null
+++ b/ext/pgsql/tests/bug37100_85.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Bug #37100 (data is returned truncated with BINARY CURSOR) (8.5+)
+--SKIPIF--
+<?php
+include("skipif.inc");
+skip_server_version('8.5dev', '<');
+?>
+--FILE--
+<?php
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+
+@pg_query('DROP TABLE test_bug');
+
+pg_query('CREATE TABLE test_bug (binfield byteA) ;');
+pg_query("INSERT INTO test_bug VALUES (decode('0103AA000812','hex'))");
+
+
+$data = pg_query("SELECT binfield FROM test_bug");
+$res = pg_fetch_result($data,0);
+var_dump($res);
+var_dump(bin2hex(pg_unescape_bytea($res)));
+
+$sql = "BEGIN; DECLARE mycursor BINARY CURSOR FOR SELECT binfield FROM test_bug; FETCH ALL IN mycursor;";
+
+$data = pg_query($sql);
+$res = pg_fetch_result($data,0);
+
+var_dump(strlen($res));
+var_dump(bin2hex($res));
+
+pg_close($db);
+
+$db = pg_connect($conn_str);
+pg_query('DROP TABLE test_bug');
+pg_close($db);
+
+
+?>
+--EXPECT--
+string(14) "\x0103aa000812"
+string(12) "0103aa000812"
+int(6)
+string(12) "0103aa000812"
diff --git a/ext/pgsql/tests/bug47199.phpt b/ext/pgsql/tests/bug47199.phpt
new file mode 100644
index 0000000..5bfac0b
--- /dev/null
+++ b/ext/pgsql/tests/bug47199.phpt
@@ -0,0 +1,67 @@
+--TEST--
+Bug #47199 (pg_delete fails on NULL)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+?>
+--FILE--
+<?php
+
+require_once('config.inc');
+
+$dbh = pg_connect($conn_str);
+$tbl_name = 'test_47199';
+@pg_query("DROP TABLE $tbl_name");
+pg_query("CREATE TABLE $tbl_name (null_field INT, not_null_field INT NOT NULL)");
+
+pg_insert($dbh, $tbl_name, array('null_field' => null, 'not_null_field' => 1));
+pg_insert($dbh, $tbl_name, array('null_field' => null, 'not_null_field' => 2));
+
+var_dump(pg_fetch_all(pg_query('SELECT * FROM '. $tbl_name)));
+
+$query = pg_delete($dbh, $tbl_name, array('null_field' => NULL,'not_null_field' => 2), PGSQL_DML_STRING|PGSQL_DML_EXEC);
+
+echo $query, "\n";
+
+$query = pg_update($dbh, $tbl_name, array('null_field' => NULL, 'not_null_field' => 0), array('not_null_field' => 1, 'null_field' => ''), PGSQL_DML_STRING|PGSQL_DML_EXEC);
+
+echo $query, "\n";
+
+var_dump(pg_fetch_all(pg_query('SELECT * FROM '. $tbl_name)));
+
+@pg_query("DROP TABLE $tbl_name");
+pg_close($dbh);
+
+echo PHP_EOL."Done".PHP_EOL;
+
+?>
+--EXPECTF--
+array(2) {
+ [0]=>
+ array(2) {
+ ["null_field"]=>
+ NULL
+ ["not_null_field"]=>
+ string(1) "1"
+ }
+ [1]=>
+ array(2) {
+ ["null_field"]=>
+ NULL
+ ["not_null_field"]=>
+ string(1) "2"
+ }
+}
+DELETE FROM test_47199 WHERE null_field IS NULL AND not_null_field=2;
+UPDATE test_47199 SET null_field=NULL,not_null_field=0 WHERE not_null_field=1 AND null_field IS NULL;
+array(1) {
+ [0]=>
+ array(2) {
+ ["null_field"]=>
+ NULL
+ ["not_null_field"]=>
+ string(1) "0"
+ }
+}
+
+Done \ No newline at end of file
diff --git a/ext/pgsql/tests/bug60244.phpt b/ext/pgsql/tests/bug60244.phpt
new file mode 100644
index 0000000..94568b6
--- /dev/null
+++ b/ext/pgsql/tests/bug60244.phpt
@@ -0,0 +1,57 @@
+--TEST--
+Bug #60244 (pg_fetch_* functions do not validate that row param is >0)
+--SKIPIF--
+<?php
+include("skipif.inc");
+?>
+--FILE--
+<?php
+
+include 'config.inc';
+
+$db = pg_connect($conn_str);
+$result = pg_query("select 'a' union select 'b'");
+
+var_dump(pg_fetch_array($result, -1));
+var_dump(pg_fetch_assoc($result, -1));
+var_dump(pg_fetch_object($result, -1));
+var_dump(pg_fetch_row($result, -1));
+
+var_dump(pg_fetch_array($result, 0));
+var_dump(pg_fetch_assoc($result, 0));
+var_dump(pg_fetch_object($result, 0));
+var_dump(pg_fetch_row($result, 0));
+
+pg_close($db);
+
+?>
+--EXPECTF--
+Warning: pg_fetch_array(): The row parameter must be greater or equal to zero in %sbug60244.php on line %d
+bool(false)
+
+Warning: pg_fetch_assoc(): The row parameter must be greater or equal to zero in %sbug60244.php on line %d
+bool(false)
+
+Warning: pg_fetch_object(): The row parameter must be greater or equal to zero in %sbug60244.php on line %d
+bool(false)
+
+Warning: pg_fetch_row(): The row parameter must be greater or equal to zero in %sbug60244.php on line %d
+bool(false)
+array(2) {
+ [0]=>
+ string(1) "a"
+ ["?column?"]=>
+ string(1) "a"
+}
+array(1) {
+ ["?column?"]=>
+ string(1) "a"
+}
+object(stdClass)#1 (1) {
+ ["?column?"]=>
+ string(1) "a"
+}
+array(1) {
+ [0]=>
+ string(1) "a"
+}
diff --git a/ext/pgsql/tests/config.inc b/ext/pgsql/tests/config.inc
new file mode 100644
index 0000000..2b5f05a
--- /dev/null
+++ b/ext/pgsql/tests/config.inc
@@ -0,0 +1,12 @@
+<?php
+// These vars are used to connect db and create test table.
+// values can be set to meet your environment
+
+$conn_str = "host=localhost dbname=test"; // connection string
+$table_name = "php_pgsql_test"; // test table that should be exist
+$num_test_record = 1000; // Number of records to create
+
+$table_def = "CREATE TABLE php_pgsql_test (num int, str text, bin bytea);"; // Test table
+$field_name = "num"; // For pg_field_num()
+
+?> \ No newline at end of file
diff --git a/ext/pgsql/tests/lcmess.inc b/ext/pgsql/tests/lcmess.inc
new file mode 100644
index 0000000..6e0ac25
--- /dev/null
+++ b/ext/pgsql/tests/lcmess.inc
@@ -0,0 +1,21 @@
+<?php
+
+function _skip_lc_messages($lc_messages = 'C')
+{
+ if (!_set_lc_messages($lc_messages)) {
+ die("skip Cannot set LC_MESSAGES to '{$lc_messages}'\n");
+ }
+}
+
+function _set_lc_messages($lc_messages = 'C')
+{
+ if (pg_result(pg_query("SHOW LC_MESSAGES"), 0, 0) != $lc_messages) {
+ if (!@pg_exec("SET LC_MESSAGES='{$lc_messages}'")) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+?>
diff --git a/ext/pgsql/tests/pg_delete_001.phpt b/ext/pgsql/tests/pg_delete_001.phpt
new file mode 100644
index 0000000..abb65be
--- /dev/null
+++ b/ext/pgsql/tests/pg_delete_001.phpt
@@ -0,0 +1,86 @@
+--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)
diff --git a/ext/pgsql/tests/pg_insert_001.phpt b/ext/pgsql/tests/pg_insert_001.phpt
new file mode 100644
index 0000000..7d27219
--- /dev/null
+++ b/ext/pgsql/tests/pg_insert_001.phpt
@@ -0,0 +1,40 @@
+--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"
+ }
+}
diff --git a/ext/pgsql/tests/pg_meta_data_001.phpt b/ext/pgsql/tests/pg_meta_data_001.phpt
new file mode 100644
index 0000000..2841de8
--- /dev/null
+++ b/ext/pgsql/tests/pg_meta_data_001.phpt
@@ -0,0 +1,92 @@
+--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)
+ }
+}
diff --git a/ext/pgsql/tests/pg_select_001.phpt b/ext/pgsql/tests/pg_select_001.phpt
new file mode 100644
index 0000000..9bcf130
--- /dev/null
+++ b/ext/pgsql/tests/pg_select_001.phpt
@@ -0,0 +1,63 @@
+--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)');
+pg_query('INSERT INTO phptests.foo VALUES (2,3)');
+
+pg_query('CREATE TABLE phptests.bar (id4 INT, id3 INT)');
+pg_query('INSERT INTO phptests.bar VALUES (4,5)');
+pg_query('INSERT INTO phptests.bar VALUES (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"
+ }
+}
diff --git a/ext/pgsql/tests/pg_update_001.phpt b/ext/pgsql/tests/pg_update_001.phpt
new file mode 100644
index 0000000..95fa692
--- /dev/null
+++ b/ext/pgsql/tests/pg_update_001.phpt
@@ -0,0 +1,51 @@
+--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"
+}
diff --git a/ext/pgsql/tests/php.gif b/ext/pgsql/tests/php.gif
new file mode 100644
index 0000000..7beda43
--- /dev/null
+++ b/ext/pgsql/tests/php.gif
Binary files differ
diff --git a/ext/pgsql/tests/skipif.inc b/ext/pgsql/tests/skipif.inc
new file mode 100644
index 0000000..7c5153e
--- /dev/null
+++ b/ext/pgsql/tests/skipif.inc
@@ -0,0 +1,32 @@
+<?php
+// This script prints "skip" unless:
+// * the pgsql extension is built-in or loadable, AND
+// * there is a database called "test" accessible
+// with no username/password, AND
+// * we have create/drop privileges on the entire "test"
+// database
+
+include("config.inc");
+include("lcmess.inc");
+
+if (!extension_loaded("pgsql")) {
+ die("skip\n");
+}
+$conn = @pg_connect($conn_str);
+if (!is_resource($conn)) {
+ die("skip could not connect\n");
+}
+
+function skip_server_version($version, $op = '<') { _skip_version('server', $version, $op); }
+function skip_client_version($version, $op = '<') { _skip_version('client', $version, $op); }
+
+
+function _skip_version($type, $version, $op)
+{
+ $pg = pg_parameter_status($type.'_version');
+ if (version_compare($pg, $version, $op)) {
+ die("skip {$type} version {$pg} is {$op} {$version}\n");
+ }
+}
+
+?>