I have a perl script which updates some (large) tables from text-files,
inserting, updating and deleting records. For performance reasons the
inserts, updates and deletes are queued together and then done with an
array operation when there are "enough". Now I've added another table
and the script dies with:

*** glibc detected *** double free or corruption (fasttop): 0x0000000001450ad0 
***

in ora_execute_array (called from line 854 in Oracle.pm)

The relevant part of the script looks like this:

sub insert {
    my ($self, $inserts) = @_;
    my $dal = $self->{_dal};

    my $sth_insert_data      = $dal->{_dbh}->prepare_cached("insert into 
data(id, real) values(?, ?)");
    my $sth_insert_datacoord =
        $dal->{_dbh}->prepare_cached(
                        "insert into datacoords(period_start, period_end, 
data_id, set_id)
                                         values(?,            ?,          ?,    
   ?     )"
                     );

    my $sth_insert_fact_comext = 
        $dal->{_dbh}->prepare_cached(
                        "insert into fact_comext(period_start, reporter, 
partner, product, data_id, real)
                                         values(?,             ?,        ?,     
  ?,       ?        ?   )"
                     );

    my @values = map { $_->{real} } @$inserts;
    my $data_ids = $self->seq_numbers(scalar(@$inserts));
    $sth_insert_data->execute_array({}, $data_ids, [EMAIL PROTECTED]); # <-- 
WORKS

    unless ($time_period_id) {
        my @tp = $dal->datasets({ path => [ 'time_period']});
        die "time_period not found"  if  @tp < 1;
        die "time_period not unique" if @tp > 1;
        $time_period_id = $tp[0]->id;
    }

    my @ps = map { $_->{period}[0] } @$inserts;
    my @pe = map { $_->{period}[1] } @$inserts;
    $sth_insert_datacoord->execute_array({}, [EMAIL PROTECTED],   [EMAIL 
PROTECTED],   $data_ids, $time_period_id); # <-- WORKS

    my @prod_ds = map { $_->{ds}->id } @$inserts;
    $sth_insert_datacoord->execute_array({}, undef,   undef,   $data_ids, 
[EMAIL PROTECTED]); # <-- WORKS

    my @rep_ds = map { $_->{reporter}->id } @$inserts;
    $sth_insert_datacoord->execute_array({}, undef,   undef,   $data_ids, 
[EMAIL PROTECTED]); # <-- WORKS

    my @part_ds = map { $_->{partner}->id } @$inserts;
    $sth_insert_datacoord->execute_array({}, undef,   undef,   $data_ids, 
[EMAIL PROTECTED]); # <-- WORKS

    {
        my @ps1 = @ps;
        my @rep_ds1 = @rep_ds;
        my @part_ds1 = @part_ds;
        my @prod_ds1 = @prod_ds;
        my @values1 = @values;

        $sth_insert_fact_comext->execute_array({}, [EMAIL PROTECTED],   [EMAIL 
PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], $data_ids, [EMAIL 
PROTECTED]); # <--- CRASH
    }

    $dal->{_dbh}->commit();
    $inserted += @$inserts;
}

There are six calls to execute_array in the routine. The first five
(marked "WORKS") work fine, the sixth crashes. The copying of the arrays
before the sixth execute_array was a feeble (and unsuccessful) attempt
at a workaround.

Has anybody run into this problem before or do I need to dig deeper?

Version information:

    DBD::Oracle 1.19
    DBI 1.58
    perl v5.8.8 built for x86_64-linux-thread-multi
    Red Hat Enterprise Linux AS release 4 (Nahant Update 5)
    Oracle 10.2.0.1.0

        hp

-- 
   _  | Peter J. Holzer    | If I wanted to be "academically correct",
|_|_) | Sysadmin WSR       | I'd be programming in Java.
| |   | [EMAIL PROTECTED]      | I don't, and I'm not.
__/   | http://www.hjp.at/ |   -- Jesse Erlbaum on dbi-users

Attachment: pgp6ieyKOn6pr.pgp
Description: PGP signature

Reply via email to