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

Attachment: signature.asc
Description: Digital signature

Reply via email to