1
0
Fork 0
mirror of https://github.com/DBD-SQLite/DBD-SQLite synced 2025-06-07 22:28:47 -04:00

a float for an integer column

This commit is contained in:
Kenichi Ishigaki 2011-09-30 16:14:31 +00:00
parent 938d5760d3
commit 404246a9f9
2 changed files with 57 additions and 20 deletions

View file

@ -688,7 +688,7 @@ sqlite_st_execute(SV *sth, imp_sth_t *imp_sth)
rc = sqlite3_bind_int(imp_sth->stmt, i+1, atoi(data)); rc = sqlite3_bind_int(imp_sth->stmt, i+1, atoi(data));
#endif #endif
} }
else if (numtype == 2) { else if (numtype == 2 && sql_type != SQLITE_INTEGER) {
rc = sqlite3_bind_double(imp_sth->stmt, i+1, atof(data)); rc = sqlite3_bind_double(imp_sth->stmt, i+1, atof(data));
} }
else { else {

View file

@ -7,9 +7,10 @@ BEGIN {
} }
use t::lib::Test qw/connect_ok/; use t::lib::Test qw/connect_ok/;
use Test::More; use Test::More tests => 32;
use DBI qw/:sql_types/; use DBI qw/:sql_types/;
my $id = 0;
for my $has_pk (0..1) { for my $has_pk (0..1) {
my $dbh = connect_ok(RaiseError => 1, PrintWarn => 0, PrintError => 0); my $dbh = connect_ok(RaiseError => 1, PrintWarn => 0, PrintError => 0);
if ($has_pk) { if ($has_pk) {
@ -21,29 +22,54 @@ for my $has_pk (0..1) {
{ {
my $sth = $dbh->prepare('insert into foo values (?, ?)'); my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, 1); $sth->bind_param(1, ++$id);
$sth->bind_param(2, 1); $sth->bind_param(2, 1);
eval { $sth->execute }; my $ret = eval { $sth->execute };
ok !$@, "inserted without errors"; ok defined $ret, "inserted without errors";
my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, 1); my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
ok $value && $value == 1, "got correct value"; ok $value && $value == 1, "got correct value";
} }
{ {
my $sth = $dbh->prepare('insert into foo values (?, ?)'); my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, 2); $sth->bind_param(1, ++$id);
$sth->bind_param(2, 'foo'); # may seem weird, but that's sqlite $sth->bind_param(2, 1.5);
eval { $sth->execute }; my $ret = eval { $sth->execute };
if ($has_pk) { if ($has_pk) {
ok !defined $ret, "returns undef";
ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch"; ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch";
} }
else { else {
ok !$@, "inserted without errors"; ok defined $ret, "inserted without errors";
} }
my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, 2); my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
if ($has_pk) {
ok !$value , "not inserted/indexed";
}
else {
ok $value && $value == 1.5, "got correct value";
}
}
{
my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, ++$id);
$sth->bind_param(2, 'foo'); # may seem weird, but that's sqlite
my $ret = eval { $sth->execute };
if ($has_pk) {
ok !defined $ret, "returns undef";
ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch";
}
else {
ok defined $ret, "inserted without errors";
}
my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
if ($has_pk) { if ($has_pk) {
ok !$value , "not inserted/indexed"; ok !$value , "not inserted/indexed";
@ -55,29 +81,40 @@ for my $has_pk (0..1) {
{ {
my $sth = $dbh->prepare('insert into foo values (?, ?)'); my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, 3); $sth->bind_param(1, ++$id);
$sth->bind_param(2, 3, SQL_INTEGER); $sth->bind_param(2, 3, SQL_INTEGER);
eval { $sth->execute }; my $ret = eval { $sth->execute };
ok !$@, "inserted without errors"; ok defined $ret, "inserted without errors";
my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, 3); my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
ok $value && $value == 3, "got correct value"; ok $value && $value == 3, "got correct value";
} }
{ {
my $sth = $dbh->prepare('insert into foo values (?, ?)'); my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, 4); $sth->bind_param(1, ++$id);
$sth->bind_param(2, 3.5, SQL_INTEGER);
my $ret = eval { $sth->execute };
ok !defined $ret, "returns undef";
ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch";
my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
ok !$value, "not inserted/indexed";
}
{
my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, ++$id);
$sth->bind_param(2, 'qux', SQL_INTEGER); $sth->bind_param(2, 'qux', SQL_INTEGER);
# only dies if type is explicitly specified # only dies if type is explicitly specified
eval { $sth->execute }; my $ret = eval { $sth->execute };
ok !defined $ret, "returns undef";
ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch"; ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch";
my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, 4); my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
ok !$value, "not inserted/indexed"; ok !$value, "not inserted/indexed";
} }
$dbh->disconnect; $dbh->disconnect;
} }
done_testing;