summaryrefslogtreecommitdiff
path: root/ext/sybase_ct/tests
diff options
context:
space:
mode:
Diffstat (limited to 'ext/sybase_ct/tests')
-rw-r--r--ext/sybase_ct/tests/bug22403.phpt88
-rw-r--r--ext/sybase_ct/tests/bug26407.phpt91
-rw-r--r--ext/sybase_ct/tests/bug27843.phpt54
-rw-r--r--ext/sybase_ct/tests/bug28354.phpt46
-rw-r--r--ext/sybase_ct/tests/bug29064.phpt143
-rw-r--r--ext/sybase_ct/tests/bug30312-withfree.phpt34
-rw-r--r--ext/sybase_ct/tests/bug30312.phpt27
-rw-r--r--ext/sybase_ct/tests/bug43578.phpt65
-rw-r--r--ext/sybase_ct/tests/bug6339.phpt24
-rw-r--r--ext/sybase_ct/tests/skipif.inc13
-rw-r--r--ext/sybase_ct/tests/test.inc86
-rw-r--r--ext/sybase_ct/tests/test_appname.phpt55
-rw-r--r--ext/sybase_ct/tests/test_close.phpt25
-rw-r--r--ext/sybase_ct/tests/test_close_default.phpt21
-rw-r--r--ext/sybase_ct/tests/test_close_notopen.phpt18
-rw-r--r--ext/sybase_ct/tests/test_connect.phpt19
-rw-r--r--ext/sybase_ct/tests/test_connection_caching.phpt26
-rw-r--r--ext/sybase_ct/tests/test_connectionbased_msghandler.phpt27
-rw-r--r--ext/sybase_ct/tests/test_fetch_object.phpt74
-rw-r--r--ext/sybase_ct/tests/test_fields.phpt76
-rw-r--r--ext/sybase_ct/tests/test_long.phpt80
-rw-r--r--ext/sybase_ct/tests/test_msghandler.phpt43
-rw-r--r--ext/sybase_ct/tests/test_msghandler_handled.phpt69
-rw-r--r--ext/sybase_ct/tests/test_query_nostore.phpt98
-rw-r--r--ext/sybase_ct/tests/test_types.phpt87
-rw-r--r--ext/sybase_ct/tests/test_unbuffered_no_full_fetch.phpt44
-rw-r--r--ext/sybase_ct/tests/test_unbuffered_query.phpt57
27 files changed, 1490 insertions, 0 deletions
diff --git a/ext/sybase_ct/tests/bug22403.phpt b/ext/sybase_ct/tests/bug22403.phpt
new file mode 100644
index 0000000..20d5248
--- /dev/null
+++ b/ext/sybase_ct/tests/bug22403.phpt
@@ -0,0 +1,88 @@
+--TEST--
+Sybase-CT bug #22403 (crash when executing a stored procedure without parameters)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+ sybase_set_message_handler('sybase_msg_handler');
+ error_reporting(error_reporting() & !E_NOTICE); // Suppress notices
+
+ // Check if stored procedure already exists
+ $sp_name= 'phpt_bug22403';
+ var_dump(sybase_select_db(TEMPDB, $db));
+ if (!sybase_select_single($db, 'select object_id("'.$sp_name.'")')) {
+ echo "Stored procedure {$sp_name} not found, creating\n";
+ var_dump(sybase_query('
+ create proc '.$sp_name.' (@param int)
+ as
+ begin
+ select @param
+ select @param + 1
+ return @param
+ end
+ '));
+ } else {
+ echo "Stored procedure {$sp_name} found, using\n";
+ var_dump(TRUE);
+ }
+
+ // These don't work
+ var_dump(sybase_select_ex($db, 'exec '.$sp_name));
+ var_dump(sybase_select_ex($db, 'exec '.$sp_name.' "foo"'));
+ var_dump(sybase_select_ex($db, 'exec does_not_exist'));
+
+ // These do
+ var_dump(sybase_select_ex($db, 'exec '.$sp_name.' NULL'));
+ var_dump(sybase_select_ex($db, 'exec '.$sp_name.' 1'));
+
+ // Clean up after ourselves
+ var_dump(sybase_query('drop proc '.$sp_name));
+
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+Stored procedure %s
+bool(true)
+>>> Query: exec %s
+*** Caught Sybase Server Message #201 [Severity 16, state 2] at line 0
+ %s
+<<< Return: boolean
+bool(false)
+>>> Query: exec %s "foo"
+*** Caught Sybase Server Message #257 [Severity 16, state 1] at line 0
+ %s
+<<< Return: boolean
+bool(false)
+>>> Query: exec does_not_exist
+*** Caught Sybase Server Message #2812 [Severity 16, state %d] at line 1
+ %s
+<<< Return: boolean
+bool(false)
+>>> Query: exec %s NULL
+<<< Return: resource
+array(1) {
+ [0]=>
+ array(1) {
+ ["computed"]=>
+ NULL
+ }
+}
+>>> Query: exec %s 1
+<<< Return: resource
+array(1) {
+ [0]=>
+ array(1) {
+ ["computed"]=>
+ int(1)
+ }
+}
+bool(true)
diff --git a/ext/sybase_ct/tests/bug26407.phpt b/ext/sybase_ct/tests/bug26407.phpt
new file mode 100644
index 0000000..35bf6df
--- /dev/null
+++ b/ext/sybase_ct/tests/bug26407.phpt
@@ -0,0 +1,91 @@
+--TEST--
+Sybase-CT bug #26407 (Result set fetching broken around transactions)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+
+ // Create temporary table
+ $table= 'phpt_bug26407';
+ var_dump(sybase_query('create table #'.$table.' ( the_big_answer int )', $db));
+
+ // I
+ var_dump(sybase_select_ex($db, '
+ begin transaction
+ -- anything producing a result set here will fail;
+ -- however, print or update statements will work
+ select "foo"
+ commit
+ -- anything afterwards will fail, too
+ '));
+
+ // II
+ var_dump(sybase_select_ex($db, '
+ begin transaction
+ -- no result returned...
+ update #'.$table.' set the_big_answer=42
+ commit
+ '));
+
+ // III
+ var_dump(sybase_select_ex($db, '
+ select "foo"
+ begin transaction
+ -- do anything, even return a result set
+ commit
+ select "bar"
+ '));
+
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+>>> Query:
+ begin transaction
+ -- anything producing a result set here will fail;
+ -- however, print or update statements will work
+ select "foo"
+ commit
+ -- anything afterwards will fail, too
+
+<<< Return: resource
+array(1) {
+ [0]=>
+ array(1) {
+ ["computed"]=>
+ string(3) "foo"
+ }
+}
+>>> Query:
+ begin transaction
+ -- no result returned...
+ update #phpt_bug26407 set the_big_answer=42
+ commit
+
+<<< Return: boolean
+bool(true)
+>>> Query:
+ select "foo"
+ begin transaction
+ -- do anything, even return a result set
+ commit
+ select "bar"
+
+
+Notice: sybase_query(): Sybase: Unexpected results, cancelling current in %stest.inc on line %d
+<<< Return: resource
+array(1) {
+ [0]=>
+ array(1) {
+ ["computed"]=>
+ string(3) "foo"
+ }
+}
diff --git a/ext/sybase_ct/tests/bug27843.phpt b/ext/sybase_ct/tests/bug27843.phpt
new file mode 100644
index 0000000..861d1f9
--- /dev/null
+++ b/ext/sybase_ct/tests/bug27843.phpt
@@ -0,0 +1,54 @@
+--TEST--
+Sybase-CT bug #27843 (notices when query is a stored procedure)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+
+ // Check if stored procedure already exists
+ $sp_name= 'phpt_bug27843';
+ var_dump(sybase_select_db(TEMPDB, $db));
+ if (!sybase_select_single($db, 'select object_id("'.$sp_name.'")')) {
+ echo "Stored procedure {$sp_name} not found, creating\n";
+ var_dump(sybase_query('
+ create proc '.$sp_name.'
+ as
+ begin
+ select 1
+ end
+ '));
+ } else {
+ echo "Stored procedure {$sp_name} found, using\n";
+ var_dump(TRUE);
+ }
+
+ // Execute stored procedure
+ var_dump(sybase_select_ex($db, 'exec '.$sp_name));
+
+ // Clean up after ourselves
+ var_dump(sybase_query('drop proc '.$sp_name, $db));
+
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+Stored procedure %s
+bool(true)
+>>> Query: exec phpt_bug27843
+<<< Return: resource
+array(1) {
+ [0]=>
+ array(1) {
+ ["computed"]=>
+ int(1)
+ }
+}
+bool(true)
diff --git a/ext/sybase_ct/tests/bug28354.phpt b/ext/sybase_ct/tests/bug28354.phpt
new file mode 100644
index 0000000..018f7bd
--- /dev/null
+++ b/ext/sybase_ct/tests/bug28354.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Sybase-CT bug #28354 (sybase_free_result crash)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+ sybase_set_message_handler('sybase_msg_handler');
+ error_reporting(error_reporting() & !E_NOTICE); // Suppress notices
+
+ // Check if stored procedure already exists
+ $sp_name= 'phpt_bug28354';
+ var_dump(sybase_select_db(TEMPDB, $db));
+ if (!sybase_select_single($db, 'select object_id("'.$sp_name.'")')) {
+ echo "Stored procedure {$sp_name} not found, creating\n";
+ var_dump(sybase_query('
+ create proc '.$sp_name.' as begin
+ select @@version
+ end
+ '));
+ } else {
+ echo "Stored procedure {$sp_name} found, using\n";
+ var_dump(TRUE);
+ }
+
+ $r= sybase_query('exec '.$sp_name, $db);
+ $i= 0;
+ while ($row= sybase_fetch_row($r)) {
+ var_dump($i++, $row[0]);
+ }
+ sybase_free_result($r);
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+Stored procedure %s
+bool(true)
+int(0)
+string(%d) "%s"
diff --git a/ext/sybase_ct/tests/bug29064.phpt b/ext/sybase_ct/tests/bug29064.phpt
new file mode 100644
index 0000000..df13d28
--- /dev/null
+++ b/ext/sybase_ct/tests/bug29064.phpt
@@ -0,0 +1,143 @@
+--TEST--
+Sybase-CT bug #29064 (Exact numeric/decimal/money datatypes lose precision)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+
+ // Create a temporary table and fill it with test values
+ var_dump(sybase_query('
+ create table #test (
+ test_decimal decimal(38, 6) null,
+ test_numeric numeric(38, 12) null,
+ test_money money null,
+ test_bigint decimal(38, 0) null,
+ test_int int null,
+ test_smallmoney smallmoney null,
+ test_smallint smallint null,
+ test_tinyint tinyint null,
+ test_real float null,
+ test_double float null
+ )
+ ', $db));
+ var_dump(sybase_query('
+ insert into #test (
+ test_decimal,
+ test_numeric,
+ test_money,
+ test_bigint,
+ test_int,
+ test_smallmoney,
+ test_smallint,
+ test_tinyint,
+ test_real,
+ test_double
+ ) values (
+ 12345678901234567890123456789012.123456,
+ 12345678901234567890123456.123456789012,
+ 123456789012345.1234,
+ 12345678901234567890123456789012345678,
+ 1234567890,
+ 123456.1234,
+ 12345,
+ 123,
+ 123456789.12345679,
+ 123456789.12345679
+ )
+ ', $db));
+ var_dump(sybase_query('
+ insert into #test (
+ test_decimal,
+ test_numeric,
+ test_money,
+ test_bigint,
+ test_int,
+ test_smallmoney,
+ test_smallint,
+ test_tinyint,
+ test_real,
+ test_double
+ ) values (
+ -12345678901234567890123456789012.123456,
+ -12345678901234567890123456.123456789012,
+ -123456789012345.1234,
+ -12345678901234567890123456789012345678,
+ -1234567890,
+ -123456.1234,
+ -12345,
+ 255,
+ -123456789.12345679,
+ -123456789.12345679
+ )
+ ', $db));
+
+ // Select the data
+ var_dump(sybase_select_ex($db, 'select * from #test'));
+
+ // Clean up and close connection
+ var_dump(sybase_query('drop table #test', $db));
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+>>> Query: select * from #test
+<<< Return: resource
+array(2) {
+ [0]=>
+ array(10) {
+ ["test_decimal"]=>
+ string(39) "12345678901234567890123456789012.123456"
+ ["test_numeric"]=>
+ string(39) "12345678901234567890123456.123456789012"
+ ["test_money"]=>
+ string(18) "123456789012345.12"
+ ["test_bigint"]=>
+ string(38) "12345678901234567890123456789012345678"
+ ["test_int"]=>
+ int(1234567890)
+ ["test_smallmoney"]=>
+ float(123456.12)
+ ["test_smallint"]=>
+ int(12345)
+ ["test_tinyint"]=>
+ int(123)
+ ["test_real"]=>
+ string(18) "123456789.12345679"
+ ["test_double"]=>
+ string(18) "123456789.12345679"
+ }
+ [1]=>
+ array(10) {
+ ["test_decimal"]=>
+ string(40) "-12345678901234567890123456789012.123456"
+ ["test_numeric"]=>
+ string(40) "-12345678901234567890123456.123456789012"
+ ["test_money"]=>
+ string(19) "-123456789012345.12"
+ ["test_bigint"]=>
+ string(39) "-12345678901234567890123456789012345678"
+ ["test_int"]=>
+ int(-1234567890)
+ ["test_smallmoney"]=>
+ float(-123456.12)
+ ["test_smallint"]=>
+ int(-12345)
+ ["test_tinyint"]=>
+ int(255)
+ ["test_real"]=>
+ string(19) "-123456789.12345679"
+ ["test_double"]=>
+ string(19) "-123456789.12345679"
+ }
+}
+bool(true)
diff --git a/ext/sybase_ct/tests/bug30312-withfree.phpt b/ext/sybase_ct/tests/bug30312-withfree.phpt
new file mode 100644
index 0000000..0017865
--- /dev/null
+++ b/ext/sybase_ct/tests/bug30312-withfree.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Sybase-CT bug #30312 (sybase_unbuffered_query calls, with free)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+ error_reporting(error_reporting() & !E_NOTICE); // Suppress notices
+
+ $db= sybase_connect_ex();
+
+ $query= sybase_unbuffered_query('select datepart(yy, getdate())');
+ $array= sybase_fetch_row($query);
+ var_dump($array[0]);
+ sybase_free_result($query);
+
+ $query= sybase_unbuffered_query('select datepart(mm, getdate()), datepart(dd, getdate())');
+ $array= sybase_fetch_row($query);
+ var_dump($array);
+ sybase_free_result($query);
+?>
+--EXPECTF--
+int(%d)
+array(2) {
+ [0]=>
+ int(%d)
+ [1]=>
+ int(%d)
+}
diff --git a/ext/sybase_ct/tests/bug30312.phpt b/ext/sybase_ct/tests/bug30312.phpt
new file mode 100644
index 0000000..273b579
--- /dev/null
+++ b/ext/sybase_ct/tests/bug30312.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Sybase-CT bug #30312 (sybase_unbuffered_query calls)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+ error_reporting(error_reporting() & !E_NOTICE); // Suppress notices
+
+ $db= sybase_connect_ex();
+
+ $query= sybase_unbuffered_query('select datepart(yy, getdate())');
+ $array= sybase_fetch_array($query);
+ var_dump($array[0]);
+
+ $query= sybase_unbuffered_query('select datepart(yy, getdate())');
+ $array= sybase_fetch_array($query);
+ var_dump($array[0]);
+?>
+--EXPECTF--
+int(%d)
+int(%d)
diff --git a/ext/sybase_ct/tests/bug43578.phpt b/ext/sybase_ct/tests/bug43578.phpt
new file mode 100644
index 0000000..e840402
--- /dev/null
+++ b/ext/sybase_ct/tests/bug43578.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Sybase-CT bug #43578 (Incurred fault #6 - if returned textfield ist empty)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+
+ // Create a temporary table and fill it with test values
+ var_dump(sybase_query('
+ create table #Resource (
+ Resource_ID int,
+ DC_Rights text null
+ )
+ ', $db));
+ var_dump(sybase_query('insert into #Resource values (123, NULL)', $db));
+ var_dump(sybase_query('insert into #Resource values (124, "")', $db));
+
+ // Select non-existant
+ var_dump(sybase_select_ex($db, 'select DC_Rights from #Resource where Resource_ID = 122'));
+
+ // Select null
+ var_dump(sybase_select_ex($db, 'select DC_Rights from #Resource where Resource_ID = 123'));
+
+ // Select empty
+ var_dump(sybase_select_ex($db, 'select DC_Rights from #Resource where Resource_ID = 124'));
+
+ // Clean up and close connection
+ var_dump(sybase_query('drop table #Resource', $db));
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+>>> Query: select DC_Rights from #Resource where Resource_ID = 122
+<<< Return: resource
+array(0) {
+}
+>>> Query: select DC_Rights from #Resource where Resource_ID = 123
+<<< Return: resource
+array(1) {
+ [0]=>
+ array(1) {
+ ["DC_Rights"]=>
+ NULL
+ }
+}
+>>> Query: select DC_Rights from #Resource where Resource_ID = 124
+<<< Return: resource
+array(1) {
+ [0]=>
+ array(1) {
+ ["DC_Rights"]=>
+ string(1) " "
+ }
+}
+bool(true)
diff --git a/ext/sybase_ct/tests/bug6339.phpt b/ext/sybase_ct/tests/bug6339.phpt
new file mode 100644
index 0000000..3b0a072
--- /dev/null
+++ b/ext/sybase_ct/tests/bug6339.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Sybase-CT bug #6339 (invalid Sybase-link resource)
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ // Suppress "Changed database context" warnings
+ sybase_min_server_severity(11);
+ sybase_connect(HOST, USER, PASSWORD);
+ var_dump(sybase_fetch_row(sybase_query('select 1')));
+ sybase_close();
+?>
+--EXPECTF--
+array(1) {
+ [0]=>
+ int(1)
+}
diff --git a/ext/sybase_ct/tests/skipif.inc b/ext/sybase_ct/tests/skipif.inc
new file mode 100644
index 0000000..55bf53a
--- /dev/null
+++ b/ext/sybase_ct/tests/skipif.inc
@@ -0,0 +1,13 @@
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require 'test.inc';
+
+ if (!extension_loaded('sybase_ct')) die('skip Sybase-CT extension not loaded');
+
+ sybase_min_server_severity(11);
+ if (!@sybase_connect(HOST, USER, PASSWORD)) die('skip Unable to connect');
+?>
diff --git a/ext/sybase_ct/tests/test.inc b/ext/sybase_ct/tests/test.inc
new file mode 100644
index 0000000..8dd2f7f
--- /dev/null
+++ b/ext/sybase_ct/tests/test.inc
@@ -0,0 +1,86 @@
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ // Change if needed
+ define('HOST', getenv('PHP_SYBASE_HOST'));
+ define('USER', getenv('PHP_SYBASE_USER'));
+ define('PASSWORD', getenv('PHP_SYBASE_PASS'));
+ define('TEMPDB', 'tempdb');
+
+ // {{{ bool sybase_msg_handler(int msgnumber, int severity, int state, int line, string text)
+ // Handles server messages
+ function sybase_msg_handler($msgnumber, $severity, $state, $line, $text) {
+ printf(
+ "*** Caught Sybase Server Message #%d [Severity %d, state %d] at line %d\n '%s'\n",
+ $msgnumber,
+ $severity,
+ $state,
+ $line,
+ chop($text)
+ );
+ }
+ // }}}
+
+ // {{{ public class sybase
+ class sybase {
+
+ // {{{ public static bool static_handler(int msgnumber, int severity, int state, int line, string text)
+ // Handles server messages
+ static function static_handler($msgnumber, $severity, $state, $line, $text) {
+ return sybase_msg_handler($msgnumber, $severity, $state, $line, $text);
+ }
+ // }}}
+
+ // {{{ public bool static_handler(int msgnumber, int severity, int state, int line, string text)
+ // Handles server messages
+ function handler($msgnumber, $severity, $state, $line, $text) {
+ return sybase_msg_handler($msgnumber, $severity, $state, $line, $text);
+ }
+ // }}}
+ }
+ // }}}
+
+ // {{{ void sybase_set_messagehandler_ex(string handler)
+ // Sets the sybase message handler and dumps the result
+ function sybase_set_messagehandler_ex($handler) {
+ var_dump(sybase_set_message_handler($handler));
+ }
+
+ // {{{ resource sybase_connect_ex(string charset= NULL, string appname= NULL, bool new= FALSE)
+ // Connect to the sybase server using the defines HOST, USER and PASSWORD
+ function sybase_connect_ex($charset= NULL, $appname= NULL, $new= FALSE) {
+ sybase_min_server_severity(11); // Suppress "changed database context"
+ if (!($db= sybase_connect(HOST, USER, PASSWORD, $charset ? $charset : 'iso_1', $appname, $new))) {
+ die('Connect to '.USER.'@'.HOST.' failed (using password: '.(PASSWORD ? 'yes' : 'no').')');
+ }
+ return $db;
+ }
+ // }}}
+
+ // {{{ void sybase_select_ex(resource dbh, string query)
+ // Returns all fetched rows from an SQL query
+ function sybase_select_ex($dbh, $query) {
+ printf(">>> Query: %s\n", $query);
+ $h= sybase_query($query, $dbh);
+ printf("<<< Return: %s\n", gettype($h));
+ flush();
+ if (!is_resource($h)) return $h;
+
+ $return= array();
+ while ($row= sybase_fetch_assoc($h)) {
+ $return[]= $row;
+ }
+ return $return;
+ }
+
+ // {{{ mixed sybase_select_single(resource dbh, string query)
+ // Fires an SQL query and returns the first value from the first row
+ function sybase_select_single($dbh, $query) {
+ $a = sybase_fetch_row(sybase_query($query, $dbh));
+ return array_shift($a);
+ }
+ // }}}
+?>
diff --git a/ext/sybase_ct/tests/test_appname.phpt b/ext/sybase_ct/tests/test_appname.phpt
new file mode 100644
index 0000000..71f5c32
--- /dev/null
+++ b/ext/sybase_ct/tests/test_appname.phpt
@@ -0,0 +1,55 @@
+--TEST--
+Sybase-CT application name
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ // {{{ bool compare_string(string expect, string actual)
+ // Compares expect to a trimmed version of actual
+ function compare_string($expect, $actual) {
+ $trimmed= rtrim($actual, ' ');
+ return (0 == strncmp($expect, $trimmed, strlen($trimmed)));
+ }
+ // }}}
+
+ $program_name= 'phpt_test';
+ $hostname= 'php.net';
+ ini_set('sybct.hostname', $hostname);
+
+ $db= sybase_connect_ex(NULL, $program_name);
+ $r= sybase_select_ex($db, '
+ select
+ hostname,
+ program_name
+ from
+ master..sysprocesses
+ where
+ program_name = "'.$program_name.'"'
+ );
+
+ var_dump(
+ compare_string($program_name, $r[0]['program_name']),
+ compare_string($hostname, $r[0]['hostname'])
+ );
+
+ sybase_close($db);
+?>
+--EXPECTF--
+>>> Query:
+ select
+ hostname,
+ program_name
+ from
+ master..sysprocesses
+ where
+ program_name = "phpt_test"
+<<< Return: resource
+bool(true)
+bool(true)
diff --git a/ext/sybase_ct/tests/test_close.phpt b/ext/sybase_ct/tests/test_close.phpt
new file mode 100644
index 0000000..e2c3ebc
--- /dev/null
+++ b/ext/sybase_ct/tests/test_close.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Sybase-CT close
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+ var_dump($db);
+ sybase_close($db);
+ var_dump($db);
+ var_dump(sybase_query('select getdate()', $db));
+?>
+--EXPECTF--
+resource(%d) of type (sybase-ct link)
+resource(%d) of type (Unknown)
+
+Warning: sybase_query(): %d is not a valid Sybase-Link resource in %s on line %d
+bool(false)
diff --git a/ext/sybase_ct/tests/test_close_default.phpt b/ext/sybase_ct/tests/test_close_default.phpt
new file mode 100644
index 0000000..a726a47
--- /dev/null
+++ b/ext/sybase_ct/tests/test_close_default.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Sybase-CT close default connection
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ sybase_connect_ex();
+ sybase_close();
+ var_dump(sybase_query('select getdate()'));
+?>
+--EXPECTF--
+
+Warning: sybase_query(): Sybase: No connection in %s on line %d
+bool(false)
diff --git a/ext/sybase_ct/tests/test_close_notopen.phpt b/ext/sybase_ct/tests/test_close_notopen.phpt
new file mode 100644
index 0000000..13b4571
--- /dev/null
+++ b/ext/sybase_ct/tests/test_close_notopen.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Sybase-CT close not open
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ sybase_close();
+?>
+--EXPECTF--
+
+Warning: sybase_close(): Sybase: No connection to close in %s on line %d
diff --git a/ext/sybase_ct/tests/test_connect.phpt b/ext/sybase_ct/tests/test_connect.phpt
new file mode 100644
index 0000000..e1e3eea
--- /dev/null
+++ b/ext/sybase_ct/tests/test_connect.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Sybase-CT connectivity
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+ var_dump($db);
+ sybase_close($db);
+?>
+--EXPECTF--
+resource(%d) of type (sybase-ct link)
diff --git a/ext/sybase_ct/tests/test_connection_caching.phpt b/ext/sybase_ct/tests/test_connection_caching.phpt
new file mode 100644
index 0000000..d59aede
--- /dev/null
+++ b/ext/sybase_ct/tests/test_connection_caching.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Sybase-CT connection caching
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db1= sybase_connect_ex();
+ $db2= sybase_connect_ex();
+ $db3= sybase_connect_ex(NULL, NULL, $new= TRUE);
+ var_dump($db1, $db2, $db3, (string)$db1 == (string)$db2, (string)$db2 == (string)$db3);
+ sybase_close($db1);
+
+?>
+--EXPECTF--
+resource(%d) of type (sybase-ct link)
+resource(%d) of type (sybase-ct link)
+resource(%d) of type (sybase-ct link)
+bool(true)
+bool(false)
diff --git a/ext/sybase_ct/tests/test_connectionbased_msghandler.phpt b/ext/sybase_ct/tests/test_connectionbased_msghandler.phpt
new file mode 100644
index 0000000..72e6b3a
--- /dev/null
+++ b/ext/sybase_ct/tests/test_connectionbased_msghandler.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Sybase-CT connection-based server message handler
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+ var_dump($db);
+ var_dump(sybase_set_message_handler('sybase_msg_handler', $db));
+ var_dump(sybase_select_ex($db, 'select getdate(NULL)'));
+ sybase_close($db);
+?>
+--EXPECTF--
+resource(%d) of type (sybase-ct link)
+bool(true)
+>>> Query: select getdate(NULL)
+*** Caught Sybase Server Message #%d [Severity %d, state %d] at line %d
+ %s
+<<< Return: boolean
+bool(false)
diff --git a/ext/sybase_ct/tests/test_fetch_object.phpt b/ext/sybase_ct/tests/test_fetch_object.phpt
new file mode 100644
index 0000000..c23658f
--- /dev/null
+++ b/ext/sybase_ct/tests/test_fetch_object.phpt
@@ -0,0 +1,74 @@
+--TEST--
+Sybase-CT sybase_fetch_object
+--SKIPIF--
+<?php
+ require('skipif.inc');
+?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ // {{{ class article
+ class article { }
+ // }}}
+
+ // {{{ resource fetch_object(resource db, [mixed arg= NULL])
+ // Fetches a resultset and returns it as an object
+ function fetch_object($db, $arg= NULL) {
+ return sybase_fetch_object(sybase_query('select
+ 1 as "id",
+ "Hello" as "caption",
+ "timm" as "author",
+ getdate() as "lastchange"
+ ', $db), $arg);
+ }
+ // }}}
+
+ $db= sybase_connect_ex();
+
+ // Test with stdClass
+ var_export(fetch_object($db)); echo "\n";
+
+ // Test with userland class
+ var_export(fetch_object($db, 'article')); echo "\n";
+
+ // Test with object
+ var_export(fetch_object($db, new article())); echo "\n";
+
+ // Test with non-existant class
+ var_export(fetch_object($db, '***')); echo "\n";
+
+ sybase_close($db);
+?>
+--EXPECTF--
+stdClass::__set_state(array(
+ 'id' => 1,
+ 'caption' => 'Hello',
+ 'author' => 'timm',
+ 'lastchange' => '%s',
+))
+article::__set_state(array(
+ 'id' => 1,
+ 'caption' => 'Hello',
+ 'author' => 'timm',
+ 'lastchange' => '%s',
+))
+article::__set_state(array(
+ 'id' => 1,
+ 'caption' => 'Hello',
+ 'author' => 'timm',
+ 'lastchange' => '%s',
+))
+
+Notice: sybase_fetch_object(): Sybase: Class *** has not been declared in %stest_fetch_object.php on line %d
+stdClass::__set_state(array(
+ 'id' => 1,
+ 'caption' => 'Hello',
+ 'author' => 'timm',
+ 'lastchange' => '%s',
+))
diff --git a/ext/sybase_ct/tests/test_fields.phpt b/ext/sybase_ct/tests/test_fields.phpt
new file mode 100644
index 0000000..46e932b
--- /dev/null
+++ b/ext/sybase_ct/tests/test_fields.phpt
@@ -0,0 +1,76 @@
+--TEST--
+Sybase-CT sybase_field_* functions
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+
+ // Issue a query
+ $q= sybase_unbuffered_query('select
+ 1 as "id",
+ "Hello" as "caption",
+ "timm" as "author",
+ getdate() as "lastchange"
+ ', $db, FALSE);
+ var_dump($q);
+
+ var_dump(sybase_num_fields($q));
+
+ // Go through each field, dumping it
+ while ($field= sybase_fetch_field($q)) {
+ var_export($field); echo "\n";
+ }
+
+ // Seek to the second field and fetch it
+ var_dump(sybase_field_seek($q, 1));
+ var_export(sybase_fetch_field($q)); echo "\n";
+
+ sybase_close($db);
+?>
+--EXPECTF--
+resource(%d) of type (sybase-ct result)
+int(4)
+stdClass::__set_state(array(
+ 'name' => 'id',
+ 'max_length' => 11,
+ 'column_source' => '',
+ 'numeric' => 1,
+ 'type' => 'int',
+))
+stdClass::__set_state(array(
+ 'name' => 'caption',
+ 'max_length' => 5,
+ 'column_source' => '',
+ 'numeric' => 0,
+ 'type' => 'string',
+))
+stdClass::__set_state(array(
+ 'name' => 'author',
+ 'max_length' => 4,
+ 'column_source' => '',
+ 'numeric' => 0,
+ 'type' => 'string',
+))
+stdClass::__set_state(array(
+ 'name' => 'lastchange',
+ 'max_length' => 29,
+ 'column_source' => '',
+ 'numeric' => 0,
+ 'type' => 'datetime',
+))
+bool(true)
+stdClass::__set_state(array(
+ 'name' => 'caption',
+ 'max_length' => 5,
+ 'column_source' => '',
+ 'numeric' => 0,
+ 'type' => 'string',
+))
diff --git a/ext/sybase_ct/tests/test_long.phpt b/ext/sybase_ct/tests/test_long.phpt
new file mode 100644
index 0000000..de59bb9
--- /dev/null
+++ b/ext/sybase_ct/tests/test_long.phpt
@@ -0,0 +1,80 @@
+--TEST--
+Sybase-CT select LONG_MAX / LONG_MIN
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ define('LONG_MAX', is_int(2147483648) ? 9223372036854775807 : 2147483647);
+ define('LONG_MIN', -LONG_MAX - 1);
+
+ $db= sybase_connect_ex();
+ var_dump(sybase_select_db(TEMPDB, $db));
+
+ // Create table and insert some values
+ var_dump(sybase_query('create table test_long (value numeric(20, 0))'));
+ var_dump(sybase_query('insert test_long values ('.(LONG_MAX - 1).')'));
+ var_dump(sybase_query('insert test_long values ('.(LONG_MAX).')'));
+ var_dump(sybase_query('insert test_long values ('.(LONG_MAX + 1).')'));
+ var_dump(sybase_query('insert test_long values ('.(LONG_MIN + 1).')'));
+ var_dump(sybase_query('insert test_long values ('.(LONG_MIN).')'));
+ var_dump(sybase_query('insert test_long values ('.(LONG_MIN - 1).')'));
+
+ // Select values
+ var_dump(sybase_select_ex($db, 'select value from test_long'));
+
+ // Drop table
+ var_dump(sybase_query('drop table test_long'));
+
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+>>> Query: select value from test_long
+<<< Return: resource
+array(6) {
+ [0]=>
+ array(1) {
+ ["value"]=>
+ int(%s)
+ }
+ [1]=>
+ array(1) {
+ ["value"]=>
+ int(%s)
+ }
+ [2]=>
+ array(1) {
+ ["value"]=>
+ float(%s)
+ }
+ [3]=>
+ array(1) {
+ ["value"]=>
+ int(-%s)
+ }
+ [4]=>
+ array(1) {
+ ["value"]=>
+ int(-%s)
+ }
+ [5]=>
+ array(1) {
+ ["value"]=>
+ float(-%s)
+ }
+}
+bool(true)
diff --git a/ext/sybase_ct/tests/test_msghandler.phpt b/ext/sybase_ct/tests/test_msghandler.phpt
new file mode 100644
index 0000000..afe97cb
--- /dev/null
+++ b/ext/sybase_ct/tests/test_msghandler.phpt
@@ -0,0 +1,43 @@
+--TEST--
+Sybase-CT server message handler
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+
+ echo 'Nonexistant: '; sybase_set_messagehandler_ex('function_does_not_exist');
+ echo 'Static method: '; sybase_set_messagehandler_ex(array('sybase', 'static_handler'));
+ echo 'Instance method: '; sybase_set_messagehandler_ex(array(new sybase(), 'handler'));
+ echo 'Lambda function: '; sybase_set_messagehandler_ex(create_function('', 'return FALSE;'));
+ echo 'Unset: '; sybase_set_messagehandler_ex(NULL);
+ echo 'Incorrect type: '; sybase_set_messagehandler_ex(1);
+ echo 'Function: '; sybase_set_messagehandler_ex('sybase_msg_handler');
+
+ var_dump(sybase_select_ex($db, 'select getdate(NULL)'));
+ sybase_close($db);
+?>
+--EXPECTF--
+Nonexistant:
+Warning: sybase_set_message_handler() expects parameter 1 to be a valid callback, function 'function_does_not_exist' not found or invalid function name in %stest.inc on line %d
+NULL
+Static method: bool(true)
+Instance method: bool(true)
+Lambda function: bool(true)
+Unset: bool(true)
+Incorrect type:
+Warning: sybase_set_message_handler() expects parameter 1 to be a valid callback, no array or string given in %stest.inc on line %d
+NULL
+Function: bool(true)
+>>> Query: select getdate(NULL)
+*** Caught Sybase Server Message #%d [Severity %d, state %d] at line %d
+ %s
+<<< Return: boolean
+bool(false)
diff --git a/ext/sybase_ct/tests/test_msghandler_handled.phpt b/ext/sybase_ct/tests/test_msghandler_handled.phpt
new file mode 100644
index 0000000..5952c3b
--- /dev/null
+++ b/ext/sybase_ct/tests/test_msghandler_handled.phpt
@@ -0,0 +1,69 @@
+--TEST--
+Sybase-CT server message handler
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ // {{{ bool sybase_msg_handler(int msgnumber, int severity, int state, int line, string text)
+ // Handles server messages
+ function user_message_handler($msgnumber, $severity, $state, $line, $text) {
+ switch ($msgnumber) {
+ case 0: // print message
+ printf("!!! %s\n", trim($text));
+ return;
+
+ case 174: // The function 'GETDATE' requires 0 arguments.
+ case 11021: // Function GETDATE invoked with wrong number or type of argument(s)
+ printf("*** Caught '%s'\n", trim($text));
+ return;
+ }
+ printf("Cannot handle message #%d\n", $msgnumber);
+ return FALSE; // Indicate we can't handle this
+ }
+ // }}}
+
+ sybase_set_messagehandler_ex('user_message_handler');
+ $db= sybase_connect_ex();
+ sybase_min_server_severity(0);
+
+ // These are handled
+ var_dump(sybase_select_ex($db, 'select getdate(NULL)'));
+ var_dump(sybase_select_ex($db, 'print "Hi"'));
+
+ // These aren't
+ var_dump(sybase_select_ex($db, 'use NULL'));
+ var_dump(sybase_select_ex($db, 'select convert(datetime, "notadate")'));
+
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+>>> Query: select getdate(NULL)
+*** Caught '%s'
+<<< Return: boolean
+bool(false)
+>>> Query: print "Hi"
+!!! Hi
+<<< Return: boolean
+bool(true)
+>>> Query: use NULL
+Cannot handle message #156
+
+Warning: sybase_query(): Sybase: Server message: Incorrect syntax near the keyword 'NULL'.
+ (severity 15, procedure N/A) in %s on line %d
+<<< Return: boolean
+bool(false)
+>>> Query: select convert(datetime, "notadate")
+Cannot handle message #249
+
+Warning: sybase_query(): Sybase: Server message: Syntax error during explicit conversion of VARCHAR value 'notadate' to a DATETIME field.
+ (severity 16, procedure N/A) in %s on line %d
+<<< Return: boolean
+bool(false)
diff --git a/ext/sybase_ct/tests/test_query_nostore.phpt b/ext/sybase_ct/tests/test_query_nostore.phpt
new file mode 100644
index 0000000..9d717ec
--- /dev/null
+++ b/ext/sybase_ct/tests/test_query_nostore.phpt
@@ -0,0 +1,98 @@
+--TEST--
+Sybase-CT query without storing
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+
+ // Create test table and insert some data
+ var_dump(sybase_query('
+ create table #test (
+ id numeric(10, 0) primary key not null,
+ caption varchar(255) not null,
+ author varchar(50) not null,
+ link varchar(255) null,
+ lastchange datetime default getdate() null
+ )
+ ', $db));
+ var_dump(sybase_query('insert into #test (
+ id, caption, author
+ ) values (
+ 1, "Hello", "timm"
+ )
+ ', $db));
+ var_dump(sybase_query('insert into #test (
+ id, caption, author, link
+ ) values (
+ 2, "World", "thekid", "http://thekid.de/"
+ )
+ ', $db));
+ var_dump(sybase_query('insert into #test (
+ id, caption, author
+ ) values (
+ 3, "PHP", "friebe"
+ )
+ ', $db));
+
+ // Fetch data
+ $q= sybase_unbuffered_query('select * from #test order by id', $db, FALSE);
+ var_dump($q);
+ while ($row= sybase_fetch_assoc($q)) {
+ var_dump($row);
+ }
+
+ // Clean up and close connection
+ var_dump(sybase_query('drop table #test'));
+ sybase_close($db);
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+resource(%d) of type (sybase-ct result)
+array(5) {
+ ["id"]=>
+ int(1)
+ ["caption"]=>
+ string(5) "Hello"
+ ["author"]=>
+ string(4) "timm"
+ ["link"]=>
+ NULL
+ ["lastchange"]=>
+ string(%d) "%s"
+}
+array(5) {
+ ["id"]=>
+ int(2)
+ ["caption"]=>
+ string(5) "World"
+ ["author"]=>
+ string(6) "thekid"
+ ["link"]=>
+ string(17) "http://thekid.de/"
+ ["lastchange"]=>
+ string(%d) "%s"
+}
+array(5) {
+ ["id"]=>
+ int(3)
+ ["caption"]=>
+ string(3) "PHP"
+ ["author"]=>
+ string(6) "friebe"
+ ["link"]=>
+ NULL
+ ["lastchange"]=>
+ string(%d) "%s"
+}
+bool(true)
diff --git a/ext/sybase_ct/tests/test_types.phpt b/ext/sybase_ct/tests/test_types.phpt
new file mode 100644
index 0000000..735c02d
--- /dev/null
+++ b/ext/sybase_ct/tests/test_types.phpt
@@ -0,0 +1,87 @@
+--TEST--
+Sybase-CT select and types
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ define('LONG_MAX', is_int(2147483648) ? 9223372036854775807 : 2147483647);
+ define('LONG_MIN', -LONG_MAX - 1);
+
+ $db= sybase_connect_ex();
+ var_dump(sybase_select_ex($db, 'select
+ 1 as "integer",
+ '.(LONG_MIN).' as "integer_min",
+ '.(LONG_MIN - 1).' as "integer_min_exceed",
+ '.(LONG_MAX).' as "integer_max",
+ '.(LONG_MAX + 1).' as "integer_max_exceed",
+ 1.0 as "float",
+ 12345678901234567890123456789012.123456 as "large_float",
+ $22.36 as "money",
+ "Binford" as "string",
+ convert(datetime, "2004-01-23") as "date",
+ NULL as "null",
+ convert(bit, 1) as "bit",
+ convert(smalldatetime, "2004-01-23") as "smalldate",
+ convert(char(10), "char") as "char10"
+ '));
+
+ sybase_close($db);
+?>
+--EXPECTF--
+>>> Query: select
+ 1 as "integer",
+ -%s as "integer_min",
+ -%s as "integer_min_exceed",
+ %s as "integer_max",
+ %s as "integer_max_exceed",
+ 1.0 as "float",
+ 12345678901234567890123456789012.123456 as "large_float",
+ $22.36 as "money",
+ "Binford" as "string",
+ convert(datetime, "2004-01-23") as "date",
+ NULL as "null",
+ convert(bit, 1) as "bit",
+ convert(smalldatetime, "2004-01-23") as "smalldate",
+ convert(char(10), "char") as "char10"
+
+<<< Return: resource
+array(1) {
+ [0]=>
+ array(%d) {
+ ["integer"]=>
+ int(1)
+ ["integer_min"]=>
+ int(-%s)
+ ["integer_min_exceed"]=>
+ float(-%s)
+ ["integer_max"]=>
+ int(%s)
+ ["integer_max_exceed"]=>
+ float(%s)
+ ["float"]=>
+ float(1)
+ ["large_float"]=>
+ string(39) "12345678901234567890123456789012.123456"
+ ["money"]=>
+ float(22.36)
+ ["string"]=>
+ string(7) "Binford"
+ ["date"]=>
+ string(19) "Jan 23 2004 12:00AM"
+ ["null"]=>
+ NULL
+ ["bit"]=>
+ int(1)
+ ["smalldate"]=>
+ string(19) "Jan 23 2004 12:00AM"
+ ["char10"]=>
+ string(10) "char "
+ }
+}
diff --git a/ext/sybase_ct/tests/test_unbuffered_no_full_fetch.phpt b/ext/sybase_ct/tests/test_unbuffered_no_full_fetch.phpt
new file mode 100644
index 0000000..5faf8fe
--- /dev/null
+++ b/ext/sybase_ct/tests/test_unbuffered_no_full_fetch.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Sybase-CT unbuffered query without full fetching
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+ var_dump($db);
+
+ // Fetch #1
+ $q= sybase_unbuffered_query('select name from master..systypes', $db);
+ var_dump($q, key(sybase_fetch_assoc($q)));
+
+ // Fetch #2 - without having fetched all rows from previous query
+ $q= sybase_unbuffered_query('select name from master..systypes', $db);
+ var_dump($q, key(sybase_fetch_assoc($q)));
+
+ // Fetch #3 - free first, without having fetched all rows from previous query
+ sybase_free_result($q);
+ $q= sybase_unbuffered_query('select name from master..systypes', $db);
+ var_dump($q, key(sybase_fetch_assoc($q)));
+
+ // Close - without having fetched all rows from previous query
+ sybase_close($db);
+ echo 'CLOSED';
+?>
+--EXPECTF--
+resource(%d) of type (sybase-ct link)
+resource(%d) of type (sybase-ct result)
+string(4) "name"
+
+Notice: sybase_unbuffered_query(): Sybase: Called without first fetching all rows from a previous unbuffered query in %s on line %d
+resource(%d) of type (sybase-ct result)
+string(4) "name"
+resource(%d) of type (sybase-ct result)
+string(4) "name"
+CLOSED
diff --git a/ext/sybase_ct/tests/test_unbuffered_query.phpt b/ext/sybase_ct/tests/test_unbuffered_query.phpt
new file mode 100644
index 0000000..b2be2f2
--- /dev/null
+++ b/ext/sybase_ct/tests/test_unbuffered_query.phpt
@@ -0,0 +1,57 @@
+--TEST--
+Sybase-CT unbuffered query
+--SKIPIF--
+<?php require('skipif.inc'); ?>
+--FILE--
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ require('test.inc');
+
+ $db= sybase_connect_ex();
+ var_dump($db);
+
+ // Test #1: num_rows
+ $q= sybase_unbuffered_query('select name from master..systypes', $db);
+ var_dump($q);
+ $i= 0;
+ while ($r= sybase_fetch_assoc($q)) {
+ $i++;
+ }
+ var_dump($i, sybase_num_rows($q), $i == sybase_num_rows($q), $q);
+ sybase_free_result($q);
+ var_dump($q);
+
+ // Test #2: after sybase_free_result, this should be an invalid resource
+ var_dump(FALSE == sybase_num_rows($q));
+
+ // Test #3: Seeking
+ $q= sybase_unbuffered_query('select name from master..systypes', $db);
+ var_dump($q);
+ $j= 0;
+ sybase_data_seek($q, 4);
+ while ($r= sybase_fetch_assoc($q)) {
+ $j++;
+ }
+ var_dump($i, $j, $i - $j);
+
+ sybase_close($db);
+?>
+--EXPECTF--
+resource(%d) of type (sybase-ct link)
+resource(%d) of type (sybase-ct result)
+int(%d)
+int(%d)
+bool(true)
+resource(%d) of type (sybase-ct result)
+resource(%d) of type (Unknown)
+
+Warning: sybase_num_rows(): %d is not a valid Sybase result resource in %stest_unbuffered_query.php on line %d
+bool(true)
+resource(%d) of type (sybase-ct result)
+int(%d)
+int(%d)
+int(4)