Package: libclass-dbi-perl Version: 0.96-1 Severity: normal Tags: patch When substituting table and column names into SQL statements, Class::DBI uses them verbatim. This does not work with tables and columns whose names are SQL reserved keywords unless the database permits this as an extension (for example, MySQL generally does but PostgreSQL doesn't). Such names can be used but must be double- quoted.
The following patch adds quotes in all the cases I could see where Class::DBI includes such names in statements, but I'm not sure it covers them all. Ben. --- Class/DBI.pm.orig 2006-04-08 17:13:13.000000000 +0100 +++ Class/DBI.pm 2006-04-08 21:29:27.000000000 +0100 @@ -174,7 +174,7 @@ my $table = $class ? $class->table : $self->table; $cmap{ $alias || $table } = $class || ref $self || $self; ($alias ||= "") &&= " AS $alias"; - return $table . $alias; + return "\"$table\"$alias"; }; my $expand_join = sub { @@ -200,7 +200,7 @@ }; $self->_croak("Don't know how to join $c1 to $c2") unless $col; - push @sql, sprintf " %s.%s = %s.%s ", $t1, $col, $t2, + push @sql, sprintf " \"%s\".\"%s\" = \"%s\".\"%s\" ", $t1, $col, $t2, $c2->primary_column; } return join " AND ", @sql; @@ -208,11 +208,11 @@ $sql =~ s/__TABLE\(?(.*?)\)?__/$expand_table->($1)/eg; $sql =~ s/__JOIN\((.*?)\)__/$expand_join->($1)/eg; - $sql =~ s/__ESSENTIAL__/join ", ", $self->_essential/eg; + $sql =~ s/__ESSENTIAL__/join ", ", map "\"$_\"", $self->_essential/eg; $sql =~ - s/__ESSENTIAL\((.*?)\)__/join ", ", map "$1.$_", $self->_essential/eg; + s/__ESSENTIAL\((.*?)\)__/join ", ", map "\"$1\".\"$_\"", $self->_essential/eg; if ($sql =~ /__IDENTIFIER__/) { - my $key_sql = join " AND ", map "$_=?", $self->primary_columns; + my $key_sql = join " AND ", map "\"$_\"=?", $self->primary_columns; $sql =~ s/__IDENTIFIER__/$key_sql/g; } return $self->SUPER::transform_sql($sql => @args); @@ -629,7 +629,7 @@ eval { my @columns = keys %$data; my $sth = $self->sql_MakeNewObj( - join(', ', @columns), + join(', ', map "\"$_\"", @columns), join(', ', map $self->_column_placeholder($_), @columns), ); $self->_bind_param($sth, [EMAIL PROTECTED]); -- END -- -- System Information: Debian Release: 3.1 APT prefers unstable APT policy: (500, 'unstable') Architecture: i386 (i686) Kernel: Linux 2.6.16-1-k7 Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) Versions of packages libclass-dbi-perl depends on: ii libclass-accessor-perl 0.22-1 Automated accessor generator ii libclass-data-inheritable-per 0.04-1 Inheritable, overridable class dat ii libclass-trigger-perl 0.10-1 Mix-in to add / call inheritable t ii libima-dbi-perl 0.34-1 Database connection caching and or ii libuniversal-moniker-perl 0.08-2 Nicer names for your Perl modules/ ii perl 5.8.8-4 Larry Wall's Practical Extraction -- no debconf information
signature.asc
Description: Digital signature