#!/usr/bin/perl -I./t -w # $Id: 09multi.t 11680 2008-08-28 08:23:27Z mjevans $ use Test::More; eval "require Test::NoWarnings"; $| = 1; my $has_test_nowarnings = 1; eval "require Test::NoWarnings"; $has_test_nowarnings = undef if $@; my $tests = 7; $tests += 1 if $has_test_nowarnings; plan tests => $tests; use_ok('strict'); use_ok('DBI'); use_ok('ODBCTEST'); BEGIN { if (!defined $ENV{DBI_DSN}) { plan skip_all => "DBI_DSN is undefined"; } } END { Test::NoWarnings::had_no_warnings() if ($has_test_nowarnings); } # $ENV{'ODBCINI'}="/export/cmn/etc/odbc.ini" ; #my($connectString) = "dbi:ODBC:DSN=TESTDB;Database=xxxxx;uid=usrxxxxx;pwd=xxxxx" ; my $dbh=DBI->connect(); unless($dbh) { BAIL_OUT("Unable to connect to the database $DBI::errstr\nTests skipped.\n"); exit 0; } $dbh->{RaiseError} = 1; $dbh->{PrintError} = 0; $dbh->{LongReadLen} = 10000; SKIP: { skip "Multiple statements not supported using " . $dbh->get_info(17) . " (SQL_MULT_RESULT_SETS)", 4 unless ($dbh->get_info(36) eq "Y"); my($sqlStr) ; my @test_colnames = sort(keys(%ODBCTEST::TestFieldInfo)); $sqlStr = "select $test_colnames[0] FROM $ODBCTEST::table_name; select $test_colnames[0] from $ODBCTEST::table_name" ; #$sqlStr = "select emp_id from employee where emp_id = 2 # select emp_id, emp_name, address1, address2 from employee where emp_id = 2" ; my $result_sets = 0; my $sth; eval { $sth = $dbh->prepare($sqlStr); $sth->execute; }; if ($@) { skip("Multiple statements not supported using " . $dbh->get_info(17) . "\n", 4); } my @row; my $cnt = 0; $result_sets = 0; do { # print join(":", @{$sth->{NAME}}), "\n"; while ( my $ref = $sth->fetch ) { # print join(":", @$ref), "\n"; } $result_sets++; } while ( $sth->{odbc_more_results} ) ; is($result_sets, 2, "count number of result sets"); my $sql; my @expected_result_cols; # lets get some dummy data for testing. ODBCTEST::tab_insert($dbh); $sql = "select $test_colnames[0] from $ODBCTEST::table_name order by $test_colnames[0]; select $test_colnames[0],$test_colnames[1] from $ODBCTEST::table_name order by $test_colnames[0]"; @expected_result_cols = (1, 2); ok(RunMultiTest($sql, \@expected_result_cols), "Multiple result sets with different column counts (less then more)"); $sql = "select $test_colnames[0],$test_colnames[1] from $ODBCTEST::table_name order by $test_colnames[0]; select $test_colnames[0] from $ODBCTEST::table_name order by $test_colnames[0]"; @expected_result_cols = (2, 1); ok(RunMultiTest($sql, \@expected_result_cols), "Multiple result sets with different column counts (more then less)"); $sql = "select " . join(", ", grep {/COL_[ABC]/} @test_colnames) . " from $ODBCTEST::table_name order by $test_colnames[0]; select $test_colnames[0] from $ODBCTEST::table_name order by $test_colnames[0]"; @expected_result_cols = ($#test_colnames, 1); ok(RunMultiTest($sql, \@expected_result_cols), "Multiple result sets with multiple cols, then second result set with one col"); # clean up the dummy data. ODBCTEST::tab_delete($dbh); }; $dbh->disconnect(); sub RunMultiTest { my $sql = shift; my $ref_expected_result_cols = shift; my @expected_result_cols = @$ref_expected_result_cols; my $test_pass = 1; my $result_sets = 0; $sth = $dbh->prepare($sql); $sth->execute; do { # $#expected_result_cols is the array of number of result cols # and the count/array size represents the number of result sets... if ($result_sets > $#expected_result_cols) { print "Number of result sets not correct in test $result_sets is more than the expected $#expected_result_cols.\n"; $test_pass = 0; } else { if ($sth->{NUM_OF_FIELDS} != $expected_result_cols[$result_sets]) { print "Num of fields not correct in result set $result_sets. Expected $expected_result_cols[$result_sets], found $sth->{NUM_OF_FIELDS}\n"; $test_pass = 0; } } # print join(", ", @{$sth->{NAME}}), "\n"; my $i = 0; while ( my $ref = $sth->fetchrow_arrayref ) { # if ($] > 5.005) { # no warnings; # print join(":", @$ref), "\n"; #} my $row = $ODBCTEST::tab_insert_values[$i]; my $j; for ($j = 0; $j < $sth->{NUM_OF_FIELDS}; $j++) { if ($row->[$j] ne $ref->[$j]) { print "Data mismatch, result set $result_sets, row $i, col $j ($row->[$j] != $ref->[$j])\n"; $test_pass = 0; } } $i++; } $result_sets++; } while ( $sth->{odbc_more_results} ) ; if ($result_sets <= $#expected_result_cols) { print "Number of result sets not correct in test (fewer than expected)\n"; $test_pass = 0; } $test_pass; } exit(0); print $DBI::errstr; print $ODBCTEST::tab_insert_values[0]; print sort(keys(%ODBCTEST::TestFieldInfo));