Skip Menu |
 

This queue is for tickets about the DBIx-Class CPAN distribution.

Report information
The Basics
Id: 27880
Status: resolved
Priority: 0/
Queue: DBIx-Class

People
Owner: blblack [...] gmail.com
Requestors: tom@eborcom.com (no email address)
Cc:
AdminCc:

Bug Information
Severity: Important
Broken in: 0.08002
Fixed in: (no value)



Subject: Question marks in data treated as placeholders with NoBindVars
Download (untitled) / with headers
text/plain 314b
The _prep_for_execute() method in DBIx::Class::Storage::DBI::NoBindVars treats all '?' values as placeholders. If data contains a '?' the wrong data gets replaced as demonstrated in the attached test case. I wrote the patch against revision 3552 from SVN, but it also applies against 0.08002. Thanks, Tom Hukins
Subject: placeholder.patch
Download placeholder.patch
text/x-diff 1.3k
Index: t/74mssql.t =================================================================== --- t/74mssql.t (revision 3561) +++ t/74mssql.t (working copy) @@ -12,7 +12,7 @@ plan skip_all => 'Set $ENV{DBICTEST_MSSQL_DSN}, _USER and _PASS to run this test' unless ($dsn); -plan tests => 4; +plan tests => 5; my $storage_type = '::DBI::MSSQL'; $storage_type = '::DBI::Sybase::MSSQL' if $dsn =~ /^dbi:Sybase:/; @@ -28,6 +28,7 @@ DROP TABLE artist"); $dbh->do("CREATE TABLE artist (artistid INT IDENTITY PRIMARY KEY, name VARCHAR(255));"); +$dbh->do("CREATE TABLE cd (cdid INT IDENTITY PRIMARY KEY, artist INT, title VARCHAR(100), year VARCHAR(100));"); # Just to test compat shim, Auto is in Core $schema->class('Artist')->load_components('PK::Auto::MSSQL'); @@ -48,6 +49,14 @@ } ); +# Test ? in data don't get treated as placeholders +my $cd = $schema->resultset('CD')->create( { + artist => 1, + title => 'Does this break things?', + year => 2007, +} ); +ok($cd->id, 'Not treating ? in data as placeholders'); + is( $it->count, 3, "LIMIT count ok" ); ok( $it->next->name, "iterator->next ok" ); $it->next; @@ -58,4 +67,6 @@ END { $dbh->do("IF OBJECT_ID('artist', 'U') IS NOT NULL DROP TABLE artist") if $dbh; + $dbh->do("IF OBJECT_ID('cd', 'U') IS NOT NULL DROP TABLE cd") + if $dbh; }
From: tom [...] eborcom.com
Download (untitled) / with headers
text/plain 141b
In addition to the test patch I posted earlier, here's a patch that causes the previously failing test to pass and gets my code working. Tom
Download nobindvars.patch
text/x-diff 753b
Index: lib/DBIx/Class/Storage/DBI/NoBindVars.pm =================================================================== --- lib/DBIx/Class/Storage/DBI/NoBindVars.pm (revision 3561) +++ lib/DBIx/Class/Storage/DBI/NoBindVars.pm (working copy) @@ -42,17 +42,21 @@ # stringify args, quote via $dbh, and manually insert + my @sql_part = split /\?/, $sql; + my $new_sql; + foreach my $bound (@$bind) { shift @$bound; foreach my $data (@$bound) { if(ref $data) { $data = ''.$data; } - $sql =~ s/\?/$self->_dbh->quote($data)/e; + $new_sql .= shift(@sql_part) . $self->_dbh->quote($data); } } + $new_sql .= join '', @sql_part; - return ($sql); + return ($new_sql); } =head1 AUTHORS
Download (untitled) / with headers
text/plain 107b
Looks good, I've applied your patches to trunk, the fix will be in the next maintenance release (0.08003).


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.