Michael Peppler
Sybase Consulting
Sybase on Linux
Install Guide for Sybase on Linux
General Sybase Resources
General Perl Resources
BCP Tool
Bug Tracker
Mailing List Archive
Downloads Directory
Sybase on Linux FAQ
Sybperl FAQ
Michael Peppler's resume

sybperl-l Archive

Up    Prev    Next    

From: "TOM, ALBERT K \(SBCSI\)" <at2191 at att dot com>
Subject: DBD::Sybase segmentation fault
Date: Feb 14 2006 11:59PM

I'm getting a segmentation fault when I use 'set rowcount 50' to
limit the number of rows returned.
If 'set rowcount 50' is removed, then no segmentation fault.
If 'set rowcount 50' in included and a print to stdout is executed
before connecting to Sybase, then no segmentation fault.

Here is my environment
(1) SunOS fstst05 5.10 Generic_118822-25 sun4u sparc SUNW,Sun-Fire-V890
(2) Sun Workshop compiler
    cc: Sun C 5.8 2005/10/13
(3) Perl 5.8.7 using 64 bit addressing.
(4) DBI "VERSION: 1.50"
(5) DBD-Sybase-1.07_01
(6) Sybase open client 12.5

Make Test worked except:
(1) t/exec
    I don't have a database where I can create proc.
    I'm only allowed to select from tables.
(2) t/xblob
    I don't have create table privilege.

The code that causes the segmentation fault follows.
The segmentation fault occurs after the 'end of script' is printed.

Thank you for any help you can provide.
Albert Tom

#!/usr/local/cm58/bin/perl -w
use blib '/appl_dsl/at2191/dbd_syb/DBD-Sybase-1.07_01/blib';
use DBI qw(:sql_types :utils);
sub undent($);
sub sql_err;
# print "to stdout\n";    if write to stdout occurs before connection to
#                         there is no segmentation fault & core dump.

$db = 'server=SOCDB01;database=cascview';
$usr = 'dbtool';
$psw = 'xxxx';

$ENV{SYBASE} = '/usr/local/opt/sybase/12.5';
$ENV{SYBASE_OCS} = 'OCS-12_5';

$dbh = DBI->connect("dbi:Sybase:$db",
                     { RaiseError => 0,
                       PrintError => 1,
                       AutoCommit => 0
                   ) ||
           die "Database connection not made: $DBI::errstr";
print "Database Name is $dbh->{Name}\n";

$dbh->do('set rowcount 50') || sql_err(__LINE__);

$sth1 = $dbh->prepare(undent <<'++') || sql_err(__LINE__);
    select *
      from Card
$sth1->execute || sql_err(__LINE__);
$ct = 0;
while (my @a = $sth1->fetchrow_array) { 
  print +(join '|', @a[0..5]), "\n";
$sth1->err and sql_err(__LINE__);
print "rows count [$ct] \n";
print "end of script\n";

sub sql_err {
print "sql error\n";
my $msg = shift @_;
print $msg, "\n" if $msg;
print "sqlcode = $DBI::err\n";
print "$DBI::errstr\n";
if ($dbh->rollback) {
   print "RollBack successful\n";
} else {
   print "RollBack failed\n";
$dbh->disconnect if $dbh;

sub undent($) {
  (my $text = shift) =~ s/^ {1,8}//mg;
  return $text;