fix up VARBIT for postgres too, that's all the varying types except NUMERIC
Rafael Kitover [Sat, 2 Jan 2010 16:12:37 +0000 (16:12 +0000)]
Changes
lib/DBIx/Class/Schema/Loader/DBI/Pg.pm
t/12pg_common.t

diff --git a/Changes b/Changes
index 5eb9d70..d9f5dcd 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,7 +1,7 @@
 Revision history for Perl extension DBIx::Class::Schema::Loader
 
-        - exclude 'size' column_info for postgres when unnecessary, correct
-          datetime_precision in 'size' for time|timestamp|interval types
+        - exclude 'size' column_info for postgres when unnecessary, and
+          use the correct precision for varying types (except NUMERIC)
         - 'naming' attribute and backward compatibility with 0.04006
           (in progress)
        - added relationship_attrs option for setting attributes in
index d198a15..517a7de 100644 (file)
@@ -123,7 +123,7 @@ sub _column_comment {
 }
 
 # Make sure data_type's that don't need it don't have a 'size' column_info, and
-# set the correct precision for datetime types.
+# set the correct precision for datetime and varbit types.
 sub _columns_info_for {
     my $self = shift;
     my ($table) = @_;
@@ -138,9 +138,8 @@ sub _columns_info_for {
 /^(?:bigint|int8|bigserial|serial8|bit|boolean|bool|box|bytea|cidr|circle|date|double precision|float8|inet|integer|int|int4|line|lseg|macaddr|money|path|point|polygon|real|float4|smallint|int2|serial|serial4|text)\z/i) {
             delete $result->{$col}{size};
         }
-
-        # for datetime types, check if it has a precision or not
-        if ($data_type =~ /^(?:interval|time|timestamp)\b/) {
+# for datetime types, check if it has a precision or not
+        elsif ($data_type =~ /^(?:interval|time|timestamp)\b/) {
             my ($precision) = $self->schema->storage->dbh
                 ->selectrow_array(<<EOF, {}, $table, $col);
 SELECT datetime_precision
@@ -155,6 +154,16 @@ EOF
                 $result->{$col}{size} = $precision;
             }
         }
+        elsif ($data_type =~ /^(?:bit varying|varbit)\z/i) {
+            my ($precision) = $self->schema->storage->dbh
+                ->selectrow_array(<<EOF, {}, $table, $col);
+SELECT character_maximum_length
+FROM information_schema.columns
+WHERE table_name = ? and column_name = ?
+EOF
+
+            $result->{$col}{size} = $precision;
+        }
     }
 
     return $result;
index bf1775c..74a6784 100644 (file)
@@ -38,7 +38,6 @@ my $tester = dbixcsl_common_tests->new(
                     a_bigserial BIGSERIAL,
                     a_serial8 SERIAL8,
                     a_bit BIT,
-                    a_bit_varying_with_precision BIT VARYING(8),
                     a_boolean BOOLEAN,
                     a_bool BOOL,
                     a_box BOX,
@@ -79,12 +78,20 @@ my $tester = dbixcsl_common_tests->new(
                     a_timestamp_without_time_zone TIMESTAMP WITHOUT TIME ZONE,
                     a_timestamp_without_time_zone_with_precision TIMESTAMP(2) WITHOUT TIME ZONE,
                     a_timestamp_with_time_zone TIMESTAMP WITH TIME ZONE,
-                    a_timestamp_with_time_zone_with_precision TIMESTAMP(2) WITH TIME ZONE
+                    a_timestamp_with_time_zone_with_precision TIMESTAMP(2) WITH TIME ZONE,
+                    a_bit_varying_with_precision BIT VARYING(2),
+                    a_varbit_with_precision VARBIT(2),
+                    a_character_varying_with_precision CHARACTER VARYING(2),
+                    a_varchar_with_precision VARCHAR(2),
+                    a_character_with_precision CHARACTER(2),
+                    a_char_with_precision CHAR(2)
                 )
             },
+# XXX figure out what to do with DECIMAL(precision, scale) aka
+# NUMERIC(precision, scale)
         ],
         drop  => [ qw/ pg_loader_test1 pg_loader_test2 / ],
-        count => 49,
+        count => 54,
         run   => sub {
             my ($schema, $monikers, $classes) = @_;
 
@@ -103,7 +110,7 @@ my $tester = dbixcsl_common_tests->new(
                 'column comment and attrs';
 
             my $rsrc = $schema->resultset('PgLoaderTest2')->result_source;
-            my @type_columns = grep !/^id\z/, $rsrc->columns;
+            my @type_columns = grep $_ ne 'id', $rsrc->columns;
             my @without_precision = grep !/_with_precision\z/, @type_columns;
             my @with_precision    = grep  /_with_precision\z/, @type_columns;
             my %with_precision;
@@ -124,9 +131,10 @@ my $tester = dbixcsl_common_tests->new(
             for my $col (@with_precision) {
                 my ($data_type) = $col =~ /^an?_(.*)_with_precision\z/;
                 ($data_type = uc $data_type) =~ s/_/ /g;
+                my $size = $rsrc->column_info($col)->{size};
 
-                ok($rsrc->column_info($col)->{size},
-                    "$data_type with precision has a 'size' column_info");
+                is $size, 2,
+                  "$data_type with precision has a correct 'size' column_info";
             }
         },
     },