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

Merge pull request #67 from FGasper/fix_svpv_downgrade

Give upgraded strings to SQLite as downgraded when sqlite_unicode==0.
This commit is contained in:
Kenichi Ishigaki 2021-04-25 22:30:53 +09:00 committed by GitHub
commit aa90eee3a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 2 deletions

View file

@ -549,6 +549,9 @@ sqlite_db_do_sv(SV *dbh, imp_dbh_t *imp_dbh, SV *sv_statement)
if (imp_dbh->unicode) { if (imp_dbh->unicode) {
sv_utf8_upgrade(sv_statement); sv_utf8_upgrade(sv_statement);
} }
else {
sv_utf8_downgrade(sv_statement, 0);
}
statement = SvPV_nolen(sv_statement); statement = SvPV_nolen(sv_statement);
@ -893,6 +896,9 @@ sqlite_st_prepare_sv(SV *sth, imp_sth_t *imp_sth, SV *sv_statement, SV *attribs)
if (imp_dbh->unicode) { if (imp_dbh->unicode) {
sv_utf8_upgrade(sv_statement); sv_utf8_upgrade(sv_statement);
} }
else {
sv_utf8_downgrade(sv_statement, 0);
}
statement = SvPV_nolen(sv_statement); statement = SvPV_nolen(sv_statement);
@ -1007,9 +1013,11 @@ sqlite_st_execute(SV *sth, imp_sth_t *imp_sth)
int numtype = 0; int numtype = 0;
if (imp_dbh->unicode) { if (imp_dbh->unicode) {
sv_utf8_upgrade(value); data = SvPVutf8(value, len);
}
else {
data = SvPVbyte(value, len);
} }
data = SvPV(value, len);
/* /*
* XXX: For backward compatibility, it'd be better to * XXX: For backward compatibility, it'd be better to

View file

@ -0,0 +1,61 @@
# This is a test for correct handling of upgraded strings without
# the sqlite_unicode parameter.
use strict;
use warnings;
use lib "t/lib";
use SQLiteTest;
use Test::More;
use if -d ".git", "Test::FailWarnings";
{
my $dbh = connect_ok( dbfile => 'foo', RaiseError => 1 );
my $tbl_name = "\xe9p\xe9e";
utf8::encode $tbl_name;
my $str = "CREATE TABLE $tbl_name ( col1 TEXT )";
utf8::upgrade $str;
$dbh->do($str);
my $master_ar = $dbh->selectall_arrayref('SELECT * FROM sqlite_master', { Slice => {} });
is(
$master_ar->[0]{'name'},
$tbl_name,
'do() takes correct string value',
);
#----------------------------------------------------------------------
my $dummy_str = "SELECT '$tbl_name'";
utf8::upgrade $dummy_str;
my $sth = $dbh->prepare($dummy_str);
$sth->execute();
my $row = $sth->fetchrow_arrayref();
is(
$row->[0],
$tbl_name,
'prepare() takes correct string value',
);
#----------------------------------------------------------------------
my $tbl_name_ug = $tbl_name;
utf8::upgrade $tbl_name_ug;
my $sth2 = $dbh->prepare('SELECT ?');
$sth2->execute( do { my $v = $tbl_name_ug } );
$row = $sth2->fetchrow_arrayref();
is(
$row->[0],
$tbl_name,
'execute() takes correct string value',
);
}
done_testing;