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
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
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
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
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
Looks good, I've applied your patches to trunk, the fix will be in the next maintenance release (0.08003).