Blame t/rt_67581_bind_params_mismatch.t

Packit 723767
#!/usr/bin/perl
Packit 723767

Packit 723767
use strict;
Packit 723767
BEGIN {
Packit 723767
	$|  = 1;
Packit 723767
	$^W = 1;
Packit 723767
}
Packit 723767

Packit 723767
use lib "t/lib";
Packit 723767
use SQLiteTest qw/connect_ok/;
Packit 723767
use Test::More tests => 34;
Packit 723767
use DBI qw/:sql_types/;
Packit 723767

Packit 723767
my $id = 0;
Packit 723767
for my $has_pk (0..1) {
Packit 723767
	my $dbh = connect_ok(RaiseError => 1, PrintWarn => 0, PrintError => 0);
Packit 723767
	if ($has_pk) {
Packit 723767
		$dbh->do('create table foo (id integer, v integer primary key)');
Packit 723767
	}
Packit 723767
	else {
Packit 723767
		$dbh->do('create table foo (id integer, v integer)');
Packit 723767
	}
Packit 723767

Packit 723767
	{
Packit 723767
		my $sth = $dbh->prepare('insert into foo values (?, ?)');
Packit 723767
		$sth->bind_param(1, ++$id);
Packit 723767
		$sth->bind_param(2, 1);
Packit 723767
		my $ret = eval { $sth->execute };
Packit 723767
		ok defined $ret, "inserted without errors";
Packit 723767

Packit 723767
		my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
Packit 723767
		ok $value && $value == 1, "got correct value";
Packit 723767
	}
Packit 723767

Packit 723767
	{
Packit 723767
		my $sth = $dbh->prepare('insert into foo values (?, ?)');
Packit 723767
		$sth->bind_param(1, ++$id);
Packit 723767
		$sth->bind_param(2, 1.5);
Packit 723767
		my $ret = eval { $sth->execute };
Packit 723767

Packit 723767
		if ($has_pk) {
Packit 723767
			ok $@, "died correctly";
Packit 723767
			ok !defined $ret, "returns undef";
Packit 723767
			ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch";
Packit 723767
		}
Packit 723767
		else {
Packit 723767
			ok defined $ret, "inserted without errors";
Packit 723767
		}
Packit 723767

Packit 723767
		my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
Packit 723767

Packit 723767
		if ($has_pk) {
Packit 723767
			ok !$value , "not inserted/indexed";
Packit 723767
		}
Packit 723767
		else {
Packit 723767
			ok $value && $value == 1.5, "got correct value";
Packit 723767
		}
Packit 723767
	}
Packit 723767

Packit 723767
	{
Packit 723767
		my $sth = $dbh->prepare('insert into foo values (?, ?)');
Packit 723767
		$sth->bind_param(1, ++$id);
Packit 723767
		$sth->bind_param(2, 'foo'); # may seem weird, but that's sqlite
Packit 723767
		my $ret = eval { $sth->execute };
Packit 723767

Packit 723767
		if ($has_pk) {
Packit 723767
			ok $@, "died correctly";
Packit 723767
			ok !defined $ret, "returns undef";
Packit 723767
			ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch";
Packit 723767
		}
Packit 723767
		else {
Packit 723767
			ok defined $ret, "inserted without errors";
Packit 723767
		}
Packit 723767

Packit 723767
		my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
Packit 723767

Packit 723767
		if ($has_pk) {
Packit 723767
			ok !$value , "not inserted/indexed";
Packit 723767
		}
Packit 723767
		else {
Packit 723767
			ok $value && $value eq 'foo', "got correct value";
Packit 723767
		}
Packit 723767
	}
Packit 723767

Packit 723767
	{
Packit 723767
		my $sth = $dbh->prepare('insert into foo values (?, ?)');
Packit 723767
		$sth->bind_param(1, ++$id);
Packit 723767
		$sth->bind_param(2, 3, SQL_INTEGER);
Packit 723767
		my $ret = eval { $sth->execute };
Packit 723767
		ok defined $ret, "inserted without errors";
Packit 723767

Packit 723767
		my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
Packit 723767
		ok $value && $value == 3, "got correct value";
Packit 723767
	}
Packit 723767

Packit 723767
	{
Packit 723767
		my $sth = $dbh->prepare('insert into foo values (?, ?)');
Packit 723767
		$sth->bind_param(1, ++$id);
Packit 723767
		$sth->bind_param(2, 3.5, SQL_INTEGER);
Packit 723767
		my $ret = eval { $sth->execute };
Packit 723767

Packit 723767
		if ($has_pk) {
Packit 723767
			ok $@, "died correctly";
Packit 723767
			ok !defined $ret, "returns undef";
Packit 723767
			ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch";
Packit 723767
		}
Packit 723767
		else {
Packit 723767
			ok defined $ret, "inserted without errors";
Packit 723767
		}
Packit 723767

Packit 723767
		my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
Packit 723767
		if ($has_pk) {
Packit 723767
			ok !$value, "not inserted/indexed";
Packit 723767
		}
Packit 723767
		else {
Packit 723767
			ok $value && $value eq '3.5', "got correct value";
Packit 723767
		}
Packit 723767
	}
Packit 723767

Packit 723767
	{
Packit 723767
		my $sth = $dbh->prepare('insert into foo values (?, ?)');
Packit 723767
		$sth->bind_param(1, ++$id);
Packit 723767
		$sth->bind_param(2, 'qux', SQL_INTEGER);
Packit 723767

Packit 723767
		# only dies if type is explicitly specified
Packit 723767
		my $ret = eval { $sth->execute };
Packit 723767

Packit 723767
		if ($has_pk) {
Packit 723767
			ok $@, "died correctly";
Packit 723767
			ok !defined $ret, "returns undef";
Packit 723767
			ok $sth->errstr && $sth->errstr =~ /datatype mismatch/, "insert failed: type mismatch";
Packit 723767
		}
Packit 723767
		else {
Packit 723767
			ok defined $ret, "inserted without errors";
Packit 723767
		}
Packit 723767

Packit 723767
		my ($value) = $dbh->selectrow_array('select v from foo where id = ?', undef, $id);
Packit 723767
		if ($has_pk) {
Packit 723767
			ok !$value, "not inserted/indexed";
Packit 723767
		}
Packit 723767
		else {
Packit 723767
			ok $value && $value eq 'qux', "got correct value";
Packit 723767
		}
Packit 723767
	}
Packit 723767

Packit 723767
	$dbh->disconnect;
Packit 723767
}