Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I have found an odd bit of code that crashes Perl.
It seems like a bug in SQLite's load extension interface (via sqlite_create_aggregate). A bit of poking suggests that the problem manifests in the destructor (under Perl_sv_clean_objs).
So far, I have reproduced the bug on linux (5.10.0) and Strawberry perl (5.16.3) running on Win XP. I actually get two different error messages depending on if I save to disk or not.
#!/usr/bin/perl use warnings; use strict; use DBI; use Data::Dumper; unlink('file.sq3'); # Start fresh my $dbh = DBI->connect("dbi:SQLite:dbname=file.sq3","",""); $dbh->sqlite_create_aggregate( "median", 1, 'MyMedian' ); Data::populate(); if (1) { # You may get different errors if you detach/re-attach $dbh->disconnect(); undef $dbh; $dbh = DBI->connect("dbi:SQLite:dbname=file.sq3","",""); $dbh->sqlite_create_aggregate( "median", 1, 'MyMedian' ); } print Dumper( $dbh->selectall_arrayref( "SELECT median(D) from DD group by length(D) %2" )); package MyMedian; sub new { bless [],shift} sub step{ push @{$_[0]},$_[1] if (defined $_[1]) } sub finalize { my @Ary = sort { $a <=> $b } @{$_[0]}; scalar (@Ary) or return undef; return 0.5 *($Ary[$#Ary / 2] + $Ary[($#Ary+1) / 2]); } 1; package Data; sub populate { $dbh->do("CREATE TABLE DD (D REAL);"); $dbh->do("insert into DD values (0.0140000000028522)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0140000000028522)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0140000000028522)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0140000000028522)"); $dbh->do("insert into DD values (0.405999999995402)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.152000000001863)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.152000000001863)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.152000000001863)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0100000000020373)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.165999999997439)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.165999999997439)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.165999999997439)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00800000000162981)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00800000000162981)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.163999999997031)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.163999999997031)"); $dbh->do("insert into DD values (0.0149999999994179)"); $dbh->do("insert into DD values (0.00600000000122236)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.161999999996624)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.192999999999302)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.224000000001979)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00400000000081491)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00400000000081491)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.160000000003492)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.160000000003492)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00200000000040745)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00200000000040745)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00200000000040745)"); $dbh->do("insert into DD values (0.125)"); $dbh->do("insert into DD values (0.00200000000040745)"); $dbh->do("insert into DD values (0.889000000002852)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0930000000007567)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.10899999999674)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.156000000002678)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0129999999990105)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0129999999990105)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.15400000000227)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.15400000000227)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.182999999997264)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.165000000000873)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.165000000000873)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.180999999996857)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.165000000000873)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.148000000001048)"); $dbh->do("insert into DD values (0.0149999999994179)"); $dbh->do("insert into DD values (0.178999999996449)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.178999999996449)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.178999999996449)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.453000000001339)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.858000000000175)"); $dbh->do("insert into DD values (0.0029999999969732)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.141999999999825)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (-0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.124000000003434)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.124000000003434)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.124000000003434)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.124000000003434)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0129999999990105)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.169000000001688)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.169000000001688)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.169000000001688)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.184000000001106)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.167000000001281)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.197999999996682)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.197999999996682)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.561000000001513)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.654999999998836)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.146999999997206)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.146999999997206)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.146999999997206)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.146999999997206)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.129999999997381)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.129999999997381)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.129999999997381)"); $dbh->do("insert into DD values (0.0149999999994179)"); $dbh->do("insert into DD values (0.0029999999969732)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (-0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (-0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.124000000003434)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.124000000003434)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.124000000003434)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.35899999999674)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.375)"); $dbh->do("insert into DD values (0.0100000000020373)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0100000000020373)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.10399999999936)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.150999999998021)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.213000000003376)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00800000000162981)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.163999999997031)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.163999999997031)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.196000000003551)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.196000000003551)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00600000000122236)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.131000000001222)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.131000000001222)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.131000000001222)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.131000000001222)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00400000000081491)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.112999999997555)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.129000000000815)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.129000000000815)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.129000000000815)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00200000000040745)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127000000000407)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127000000000407)"); $dbh->do("insert into DD values (0.0159999999959837)"); $dbh->do("insert into DD values (0.142999999996391)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.142999999996391)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.0140000000028522)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0140000000028522)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0140000000028522)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.169999999998254)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.184999999997672)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.152000000001863)"); $dbh->do("insert into DD values (0.0159999999959837)"); $dbh->do("insert into DD values (0.230000000003201)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0100000000020373)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.103000000002794)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.197000000000116)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.197000000000116)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.213000000003376)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00800000000162981)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.13300000000163)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.13300000000163)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.13300000000163)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.211000000002969)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00600000000122236)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00600000000122236)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.177000000003318)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.177000000003318)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.192999999999302)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00400000000081491)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00400000000081491)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00400000000081491)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00400000000081491)"); $dbh->do("insert into DD values (0.0310000000026776)"); $dbh->do("insert into DD values (0.00400000000081491)"); $dbh->do("insert into DD values (0.436999999998079)"); $dbh->do("insert into DD values (0.00200000000040745)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00200000000040745)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.110999999997148)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.127000000000407)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.141999999999825)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.139999999999418)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.139999999999418)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.139999999999418)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.139999999999418)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0129999999990105)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.107000000003609)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.107000000003609)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.107000000003609)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.15400000000227)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.120000000002619)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.120000000002619)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.120000000002619)"); $dbh->do("insert into DD values (0.0159999999959837)"); $dbh->do("insert into DD values (0.135999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0310000000026776)"); $dbh->do("insert into DD values (0.0720000000001164)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0780000000013388)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.0469999999986612)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.281000000002678)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.114000000001397)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.114000000001397)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.129999999997381)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0029999999969732)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.144000000000233)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.144000000000233)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.125999999996566)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (-0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.124000000003434)"); $dbh->do("insert into DD values (0.0159999999959837)"); $dbh->do("insert into DD values (0.139999999999418)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.171000000002095)"); $dbh->do("insert into DD values (0.0149999999994179)"); $dbh->do("insert into DD values (0.186000000001513)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0599999999976717)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0599999999976717)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0599999999976717)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0599999999976717)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0599999999976717)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.0149999999994179)"); $dbh->do("insert into DD values (0.010999999998603)"); $dbh->do("insert into DD values (0.374000000003434)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00899999999819556)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.133999999998196)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.133999999998196)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.148999999997613)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00699999999778811)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.131999999997788)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.131999999997788)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.131999999997788)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.146999999997206)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00499999999738066)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.144999999996799)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.161000000000058)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.161000000000058)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0029999999969732)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.142999999996391)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.142999999996391)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.158999999999651)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.158999999999651)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.14100000000326)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.218999999997322)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.218999999997322)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (-0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (-0.000999999996565748)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.233000000000175)"); $dbh->do("insert into DD values (0.0149999999994179)"); $dbh->do("insert into DD values (0.247999999999593)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.591000000000349)"); $dbh->do("insert into DD values (0.0160000000032596)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.137000000002445)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.137000000002445)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.137000000002445)"); $dbh->do("insert into DD values (0.0159999999959837)"); $dbh->do("insert into DD values (0.0100000000020373)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0100000000020373)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.135000000002037)"); $dbh->do("insert into DD values (0.0309999999954016)"); $dbh->do("insert into DD values (0.135000000002037)"); $dbh->do("insert into DD values (0.0309999999954016)"); $dbh->do("insert into DD values (0.135000000002037)"); $dbh->do("insert into DD values (0.0780000000013388)"); $dbh->do("insert into DD values (0.0029999999969732)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.127999999996973)"); $dbh->do("insert into DD values (0.0149999999994179)"); $dbh->do("insert into DD values (0.142999999996391)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00800000000162981)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.00800000000162981)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.163000000000466)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.163000000000466)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.163000000000466)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.0120000000024447)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.152999999998428)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.167999999997846)"); $dbh->do("insert into DD values (0.0)"); $dbh->do("insert into DD values (0.16)"); }

I get errors like:
$VAR1 = bless( { 'FetchHashKeyName' => 'NAME', 'TraceLevel' => 0, 'ImplementorClass' => 'DBD::SQLite::db', 'State' => \undef, 'Username' => '', 'Errstr' => \undef, 'ChildHandles' => [ bless( {}, 'DBI::st' ) ], 'Driver' => bless( { 'Attribution' => 'DBD::SQLite by + Matt Sergeant et al', 'FetchHashKeyName' => 'NAME', 'TraceLevel' => 0, 'ImplementorClass' => 'DBD::SQLi +te::dr', 'State' => \undef, 'Version' => '1.37', 'Errstr' => \undef, 'ChildHandles' => [ undef, bless( {}, ' +DBI::db' ) ], 'Name' => 'SQLite', 'Err' => \undef }, 'DBI::dr' ), 'Name' => 'dbname=file.sq3', 'Statement' => 'SELECT median(D) from DD group by le +ngth(D) %2', 'dbi_connect_closure' => sub { "DUMMY" }, 'Err' => \undef }, 'DBI::db' ); Bus error

A historical note: I initially hit an issue "freeing memory" when loading a saved database from disk. In my original example, my GROUP BY was on either a textual or integer column, yielding different errors. I believe the included example captures the issue -- but there actually be more than 1 issue here. Hopefully someone with better knowledge of perl internals will be able to shed some light on the matter. aschweig

Replies are listed 'Best First'.
Re: SQLite and Custom Aggregates
by kennethk (Abbot) on May 01, 2013 at 15:58 UTC
    For the posted script, I get the output
    $VAR1 = [ [ '0.0149999999994179' ], [ '0' ] ];
    ActiveState v5.14.3 on Win7, DBD::SQLite 1.37. Also passed with ActiveState v5.16.2, DBD::SQLite 1.37. Confirmed failure for Linux, v5.10.1 with 1.27 and v5.14.2 with 1.35.

    Maybe this is a bug that got fixed in the DBD between 1.35 and 1.37?


    #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

      I see that I have DBI 1.623 and DBD::SQLite 1.37 on my Strawberry perl version -- which did reproduce the failure.
      Here's the version string for Strawberry perl (I just downloaded the most obvious one from the website today):
      C:\>perl -V Summary of my perl5 (revision 5 version 16 subversion 3) configuration +: Platform: osname=MSWin32, osvers=4.0, archname=MSWin32-x86-multi-thread uname='Win32 strawberry-perl 5.16.3.1 #1 Tue Mar 12 13:55:20 2013 +i386' config_args='undef' hint=recommended, useposix=true, d_sigaction=undef useithreads=define, usemultiplicity=define useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=und +ef use64bitint=undef, use64bitall=undef, uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='gcc', ccflags =' -s -O2 -DWIN32 -DPERL_TEXTMODE_SCRIPTS -DPER +L_IMPLICIT _CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -mms-bitfields', optimize='-s -O2', cppflags='-DWIN32' ccversion='', gccversion='4.6.3', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='long lo +ng', lseek size=8 alignbytes=8, prototype=define Linker and Libraries: ld='g++', ldflags ='-s -L"C:\strawberry\perl\lib\CORE" -L"C:\straw +berry\c\li b"' libpth=C:\strawberry\c\lib C:\strawberry\c\i686-w64-mingw32\lib libs=-lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 +-ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm + -lversion -lodbc32 -lodbccp32 -lcomctl32 perllibs=-lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdl +g32 -ladva pi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lw +inmm -lver sion -lodbc32 -lodbccp32 -lcomctl32 libc=, so=dll, useshrplib=true, libperl=libperl516.a gnulibc_version='' Dynamic Linking: dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' ' cccdlflags=' ', lddlflags='-mdll -s -L"C:\strawberry\perl\lib\CORE +" -L"C:\st rawberry\c\lib"' Characteristics of this binary (from libperl): Compile-time options: HAS_TIMES HAVE_INTERP_INTERN MULTIPLICITY PERLIO_LAYERS PERL_DONT_CREATE_GVSV PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS PERL_MALLOC_WRAP PERL_PRESERVE_IVUV PL_OP_SLAB +_ALLOC USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_PERLIO USE_PERL_ATOF Built under MSWin32 Compiled at Mar 12 2013 14:01:07 @INC: C:/strawberry/perl/site/lib C:/strawberry/perl/vendor/lib C:/strawberry/perl/lib .
        Okay, so the next obvious branches are ActiveState vs. Strawberry/Linux and Win 7 vs. Win XP/Linux. Any takers?

        #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

      Confirmed SQLite 1.37 on the linux box as well.
Re: SQLite and Custom Aggregates
by choroba (Cardinal) on May 02, 2013 at 00:26 UTC
    Got the same error (without the Bus error line).
    $ lsb-release -d Description: openSUSE 12.2 (x86_64) $ perl -v This is perl 5, version 16, subversion 0 (v5.16.0) built for x86_64-li +nux-thread-multi $ perl -MDBD::SQLite -e 'die $DBD::SQLite::VERSION' 1.35 at -e line 1.
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: SQLite and Custom Aggregates
by Anonymous Monk on May 02, 2013 at 04:07 UTC

    I get the same on win32 citrusperl 5.16.1 with dbd-sqlite 1.37

    I don't see "bus error" but I get the uninformative blessed thing back, one with a lot of

    'ChildHandles' => [ undef, undef,
    the other short like you show

    same with  cpanp -i ADAMK/DBD-SQLite-1.38_02.tar.gz

Re: SQLite and Custom Aggregates
by Anonymous Monk on May 01, 2013 at 15:54 UTC
    Confirmed on my Ubuntu system as well.