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

applied a patch from Yuriy Kaminskiy

This commit is contained in:
Kenichi Ishigaki 2011-10-16 07:27:24 +00:00
parent be48da61bf
commit 802e8d1548
4 changed files with 62 additions and 9 deletions

View file

@ -5,9 +5,15 @@ Changes for Perl extension DBD-SQLite
- Resolved #67581: bind_param SQL_INTEGER numifies value;
Now DBD::SQLite croaks if you explicitly specify datatype
(with bind_param) and datatype mismatch happens (ISHIGAKI)
- Datatype set in the bind_param(_array) becomes sticky now
(as per DBI spec). This potentially affects code depending on
current undocumented and broken behavior. (Yuriy Kaminskiy)
- Resolved #71311: binding output columns as SQL_BLOB returns
nothing (ISHIGAKI)
- Bsymbolic flag was not portable enough and was not silently
ignored under MacOSX. Needs to check harder to see if the
linker supports the option. (ISHIGAKI)
1.34_01 Thu 22 Sep 2011
- Updated to SQLite 3.7.8 (ISHIGAKI)

View file

@ -641,11 +641,11 @@ sqlite_st_execute(SV *sth, imp_sth_t *imp_sth)
}
for (i = 0; i < num_params; i++) {
SV *value = av_shift(imp_sth->params);
SV *sql_type_sv = av_shift(imp_sth->params);
int sql_type = sqlite_type_from_odbc_type(SvIV(sql_type_sv));
SV **pvalue = av_fetch(imp_sth->params, 2*i, 0);
SV **sql_type_sv = av_fetch(imp_sth->params, 2*i+1, 0);
SV *value = pvalue ? *pvalue : &PL_sv_undef;
int sql_type = sqlite_type_from_odbc_type(sql_type_sv ? SvIV(*sql_type_sv) : SQL_UNKNOWN_TYPE);
sqlite_trace(sth, imp_sth, 4, form("params left in 0x%p: %ld", imp_sth->params, 1+av_len(imp_sth->params)));
sqlite_trace(sth, imp_sth, 4, form("bind %d type %d as %s", i, sql_type, SvPV_nolen_undef_ok(value)));
if (!SvOK(value)) {
@ -701,10 +701,6 @@ sqlite_st_execute(SV *sth, imp_sth_t *imp_sth)
}
}
if (value) {
SvREFCNT_dec(value);
}
SvREFCNT_dec(sql_type_sv);
if (rc != SQLITE_OK) {
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
return -4; /* -> undef in SQLite.xsi */
@ -1158,7 +1154,9 @@ sqlite_bind_ph(SV *sth, imp_sth_t *imp_sth,
pos = 2 * (SvIV(param) - 1);
sqlite_trace(sth, imp_sth, 3, form("bind into 0x%p: %"IVdf" => %s (%"IVdf") pos %d", imp_sth->params, SvIV(param), SvPV_nolen_undef_ok(value), sql_type, pos));
av_store(imp_sth->params, pos, SvREFCNT_inc(value));
av_store(imp_sth->params, pos+1, newSViv(sql_type));
if (sql_type) {
av_store(imp_sth->params, pos+1, newSViv(sql_type));
}
return TRUE;
}

View file

@ -0,0 +1,48 @@
#!/usr/bin/perl
# Check data type assignment in bind_param is sticky
use strict;
BEGIN {
$| = 1;
$^W = 1;
}
use t::lib::Test qw/connect_ok/;
use DBI qw(:sql_types);
use Test::More;
use Test::NoWarnings;
plan tests => 10 + 1;
my $dbh = connect_ok(
RaiseError => 1,
PrintError => 0,
AutoCommit => 0,
);
$dbh->do("CREATE TABLE Blah ( id INTEGER, val BLOB )");
$dbh->commit;
my $sth;
ok($sth = $dbh->prepare("INSERT INTO Blah VALUES (?, ?)"), "prepare");
$sth->bind_param(1, 1);
$sth->bind_param(2, 'foo', SQL_BLOB);
$sth->execute;
$sth->execute(2, 'bar');
sub verify_types() {
my $rows = $dbh->selectall_arrayref("SELECT typeof(val) FROM Blah ORDER BY id");
ok($rows, "selectall_arrayref returned data");
ok(@{$rows} == 2, "... with expected number of rows");
ok($rows->[0]->[0] eq 'blob', "$rows->[0]->[0] eq blob");
ok($rows->[1]->[0] eq 'blob', "$rows->[1]->[0] eq blob");
}
verify_types();
$dbh->commit;
$dbh->do("DELETE FROM Blah");
$sth->bind_param_array(1, [1, 2]);
$sth->bind_param_array(2, [qw/FOO BAR/], SQL_BLOB);
$sth->execute_array({});
verify_types();
$dbh->commit;
$dbh->disconnect;
undef($dbh);

View file

@ -37,6 +37,7 @@ my $str = "\x{20ac}";
$sth->bind_param(2, $blob, {TYPE => SQL_BLOB});
$sth->execute;
$sth->bind_param(2, undef, SQL_VARCHAR);
$sth->execute(4, $str);
$sth->bind_param(1, 5);;