1
0
Fork 0
mirror of https://github.com/DBD-SQLite/DBD-SQLite synced 2025-06-07 14:19:10 -04:00
DBD-SQLite-SQLcipher/t/rt_67581_bind_params_mismatch.t

144 lines
3.6 KiB
Perl

use strict;
use warnings;
use lib "t/lib";
use SQLiteTest qw/connect_ok/;
use Test::More;
use Test::FailWarnings;
use DBI qw/:sql_types/;
my $id = 0;
for my $has_pk (0..1) {
my $dbh = connect_ok(RaiseError => 1, PrintWarn => 0, PrintError => 0);
if ($has_pk) {
$dbh->do('create table foo (id integer, v integer primary key)');
}
else {
$dbh->do('create table foo (id integer, v integer)');
}
{
my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, ++$id);
$sth->bind_param(2, 1);
my $ret = eval { $sth->execute };
ok defined $ret, "inserted without errors";
my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
ok $value && $value == 1, "got correct value";
}
{
my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, ++$id);
$sth->bind_param(2, 1.5);
my $ret = eval { $sth->execute };
if ($has_pk) {
ok $@, "died correctly";
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) {
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 $@, "died correctly";
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) {
ok !$value , "not inserted/indexed";
}
else {
ok $value && $value eq 'foo', "got correct value";
}
}
{
my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, ++$id);
$sth->bind_param(2, 3, SQL_INTEGER);
my $ret = eval { $sth->execute };
ok defined $ret, "inserted without errors";
my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
ok $value && $value == 3, "got correct value";
}
{
my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, ++$id);
$sth->bind_param(2, 3.5, SQL_INTEGER);
my $ret = eval { $sth->execute };
if ($has_pk) {
ok $@, "died correctly";
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) {
ok !$value, "not inserted/indexed";
}
else {
ok $value && $value eq '3.5', "got correct value";
}
}
{
my $sth = $dbh->prepare('insert into foo values (?, ?)');
$sth->bind_param(1, ++$id);
$sth->bind_param(2, 'qux', SQL_INTEGER);
# only dies if type is explicitly specified
my $ret = eval { $sth->execute };
if ($has_pk) {
ok $@, "died correctly";
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) {
ok !$value, "not inserted/indexed";
}
else {
ok $value && $value eq 'qux', "got correct value";
}
}
$dbh->disconnect;
}
done_testing;