diff --git a/dbdimp.c b/dbdimp.c index d3ad2ff..1b39da3 100644 --- a/dbdimp.c +++ b/dbdimp.c @@ -392,9 +392,23 @@ sqlite_st_execute (SV *sth, imp_sth_t *imp_sth) retval = sqlite3_bind_blob(imp_sth->stmt, i+1, data, len, SQLITE_TRANSIENT); } else { - STRLEN len; - char * data = SvPV(value, len); - retval = sqlite3_bind_text(imp_sth->stmt, i+1, data, len, SQLITE_TRANSIENT); + /* guess a bit before binding */ + const int numtype = looks_like_number(value); + if ((numtype & (IS_NUMBER_IN_UV|IS_NUMBER_NOT_INT)) == IS_NUMBER_IN_UV) { +#if defined(USE_64_BIT_INT) + retval = sqlite3_bind_int64(imp_sth->stmt, i+1, SvIV(value)); +#else + retval = sqlite3_bind_int(imp_sth->stmt, i+1, SvIV(value)); +#endif + } + else if ((numtype & (IS_NUMBER_NOT_INT|IS_NUMBER_INFINITY|IS_NUMBER_NAN)) == IS_NUMBER_NOT_INT) { + retval = sqlite3_bind_double(imp_sth->stmt, i+1, SvNV(value)); + } + else { + STRLEN len; + char * data = SvPV(value, len); + retval = sqlite3_bind_text(imp_sth->stmt, i+1, data, len, SQLITE_TRANSIENT); + } } if (value) { diff --git a/t/rt_29058_group_by.t b/t/rt_29058_group_by.t new file mode 100644 index 0000000..0af1477 --- /dev/null +++ b/t/rt_29058_group_by.t @@ -0,0 +1,38 @@ +use strict; + +BEGIN { + $| = 1; + $^W = 1; +} + +use t::lib::Test; + +use Test::More tests => 6; +use DBI; + +my $dbh = connect_ok(); +$dbh->do( 'CREATE TABLE foo (bar TEXT, num INT)' ); + +for (1..5) { + $dbh->do('INSERT INTO foo (bar, num) VALUES (?,?)', undef, ($_%2 ? "odd" : "even"), $_); +} +# DBI->trace(9); + +# see if placeholder works +my ($v, $num) = $dbh->selectrow_array('SELECT bar, num FROM foo WHERE num = ?', undef, 3); +ok $v eq 'odd' && $num == 3; + +# see if the sql itself works as expected +my $ar = $dbh->selectall_arrayref('SELECT bar FROM foo GROUP BY bar HAVING count(*) > 1'); +ok +ok @$ar == 2; + +# known workaround +# ref: http://code.google.com/p/gears/issues/detail?id=163 +$ar = $dbh->selectall_arrayref('SELECT bar FROM foo GROUP BY bar HAVING count(*) > 0+?', undef, 1); +ok @$ar == 2; + +# and this is what should be tested +$ar = $dbh->selectall_arrayref('SELECT bar FROM foo GROUP BY bar HAVING count(*) > ?', undef, 1); +print "4: @$_\n" for @$ar; +ok @$ar == 2, "we got ".(@$ar)." items";