return \@uniqs;
}
-# get the correct data types and defaults
+# get the correct data types, defaults and size
sub _columns_info_for {
my $self = shift;
my ($table) = @_;
my $dbh = $self->schema->storage->dbh;
my $sth = $dbh->prepare(qq{
-SELECT c.name name, t.name type, cm.text deflt
+SELECT c.name name, t.name type, cm.text deflt, c.prec prec, c.scale scale,
+ c.length len
FROM syscolumns c
JOIN sysobjects o ON c.id = o.id
LEFT JOIN systypes t ON c.type = t.type AND c.usertype = t.usertype
$res->{default_value} = $constant_default;
}
}
+
+# XXX we need to handle "binary precision" for FLOAT(X) but I don't know what it means
+ if (my $data_type = $res->{data_type}) {
+ if ($data_type =~ /^(?:text|unitext|image|bigint|int|integer|smallint|tinyint|real|double|double precision|float|date|time|datetime|smalldatetime|money|smallmoney|timestamp|bit)\z/i) {
+ delete $res->{size};
+ }
+ elsif ($data_type =~ /^(?:numeric|decimal)\z/i) {
+ $res->{size} = [ $info->{$col}{prec}, $info->{$col}{scale} ];
+ }
+ elsif ($data_type =~ /^(?:unichar|univarchar)\z/i) {
+ $res->{size} /= 2;
+ }
+ }
}
return $result;
the_decimal DECIMAL(6, 3)
)
},
-# XXX figure out what to do with DECIMAL(precision, scale) aka
-# NUMERIC(precision, scale)
],
drop => [ qw/ pg_loader_test1 pg_loader_test2 pg_loader_test3 / ],
count => 57,
like $code, qr/^=head1 NAME\n\n^$class\n\n=head1 DESCRIPTION\n\n^very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long comment\n\n^=cut\n/m,
'long table comment is in DESCRIPTION';
- my $rsrc = $schema->resultset('PgLoaderTest3')->result_source;
+ my $rsrc = $schema->resultset($monikers->{pg_loader_test3})
+ ->result_source;
my @type_columns = grep /^a/, $rsrc->columns;
my @without_precision = grep !/_with_precision\z/, @type_columns;
my @with_precision = grep /_with_precision\z/, @type_columns;
use dbixcsl_common_tests;
use Test::More;
use Test::Exception;
+use List::MoreUtils 'apply';
my $dsn = $ENV{DBICTEST_SYBASE_DSN} || '';
my $user = $ENV{DBICTEST_SYBASE_USER} || '';
computed_dt AS getdate()
)
},
+# Test data types, see http://ispirer.com/wiki/sqlways/sybase/data-types
+# XXX handle FLOAT(P) at some point
+ q{
+ CREATE TABLE sybase_loader_test2 (
+ id INTEGER IDENTITY NOT NULL PRIMARY KEY,
+ a_text TEXT,
+ a_unitext UNITEXT,
+ an_image IMAGE,
+ a_bigint BIGINT,
+ an_int INT,
+ an_integer INTEGER,
+ a_smallint SMALLINT,
+ a_tinyint TINYINT,
+ a_real REAL,
+ a_double_precision DOUBLE PRECISION,
+ a_date DATE,
+ a_time TIME,
+ a_datetime DATETIME,
+ a_smalldatetime SMALLDATETIME,
+ a_money MONEY,
+ a_smallmoney SMALLMONEY,
+ a_timestamp timestamp,
+ a_bit BIT,
+ a_char_with_precision CHAR(2),
+ an_nchar_with_precision NCHAR(2),
+ a_unichar_with_precision UNICHAR(2),
+ a_varchar_with_precision VARCHAR(2),
+ an_nvarchar_with_precision NVARCHAR(2),
+ a_univarchar_with_precision UNIVARCHAR(2),
+ a_float FLOAT,
+ a_binary_with_precision BINARY(2),
+ a_varbinary_with_precision VARBINARY(2),
+ the_numeric NUMERIC(6,3),
+ the_decimal DECIMAL(6,3)
+ )
+ },
],
- drop => [ qw/ sybase_loader_test1 / ],
- count => 9,
+ drop => [ qw/ sybase_loader_test1 sybase_loader_test2 / ],
+ count => 38,
run => sub {
my ($schema, $monikers, $classes) = @_;
'varchar',
'VARCHAR has correct data_type';
-
is $rsrc->column_info('charfield')->{default_value},
'foo',
'constant DEFAULT is correct';
eval { is $$computed_dt_default,
'getdate()',
'default_value for computed column is correct' };
+
+ $rsrc = $schema->resultset($monikers->{sybase_loader_test2})
+ ->result_source;
+ my @type_columns = grep /^a/, $rsrc->columns;
+ my @without_precision = grep !/_with_precision\z/, @type_columns;
+ my @with_precision = grep /_with_precision\z/, @type_columns;
+ my %with_precision;
+ @with_precision{
+ apply { s/_with_precision\z// } @with_precision
+ } = ();
+
+ for my $col (@without_precision) {
+ my ($data_type) = $col =~ /^an?_(.*)/;
+ $data_type =~ s/_/ /g;
+
+ ok((not exists $rsrc->column_info($col)->{size}),
+ "$data_type " .
+ (exists $with_precision{$col} ? 'without precision ' : '') .
+ "has no 'size' column_info")
+ or diag "size is ".$rsrc->column_info($col)->{size}."\n";
+ }
+
+ 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};
+
+ is $size, 2,
+ "$data_type with precision has a correct 'size' column_info";
+ }
+
+ is_deeply $rsrc->column_info('the_numeric')->{size}, [6,3],
+ 'size for NUMERIC(precision, scale) is correct';
+
+ is_deeply $rsrc->column_info('the_decimal')->{size}, [6,3],
+ 'size for DECIMAL(precision, scale) is correct';
+
},
},
);