summaryrefslogtreecommitdiff
path: root/t/rt_67581_bind_params_mismatch.t
diff options
context:
space:
mode:
Diffstat (limited to 't/rt_67581_bind_params_mismatch.t')
-rw-r--r--t/rt_67581_bind_params_mismatch.t146
1 files changed, 146 insertions, 0 deletions
diff --git a/t/rt_67581_bind_params_mismatch.t b/t/rt_67581_bind_params_mismatch.t
new file mode 100644
index 0000000..d778e77
--- /dev/null
+++ b/t/rt_67581_bind_params_mismatch.t
@@ -0,0 +1,146 @@
+#!/usr/bin/perl
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use t::lib::Test qw/connect_ok/;
+use Test::More tests => 34;
+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;
+}