The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# $Id$
use strict;

use DBI;
use DBD::Oracle;

use Test::More;

use lib 't';
require 'nchar_test_lib.pl';

my $dbh = db_handle() or plan skip_all => "can't connect to database";

my %priv = map { $_ => 1 } get_privs( $dbh );

unless (    ( $priv{'CREATE TABLE'} or $priv{'CREATE ANY TABLE'} )
        and ( $priv{'DROP TABLE'} or $priv{'DROP ANY TABLE'} ) ) {
    plan skip_all => q{requires permissions 'CREATE TABLE' and 'DROP TABLE'};
}

plan tests => 9;

$dbh->do( 'DROP TABLE RT13865' );

$dbh->do( <<'END_SQL' ) or die $dbh->errstr;
CREATE TABLE RT13865(
    COL_INTEGER INTEGER,
    COL_NUMBER NUMBER,
    COL_NUMBER_37 NUMBER(37),
    COL_DECIMAL NUMBER(9,2),
    COL_FLOAT FLOAT(126),
    COL_VC2   VARCHAR2(67),
    COL_VC2_69CHAR  VARCHAR2(69 CHAR),
    COL_NVC2  NVARCHAR2(69),
    COL_NC    NCHAR(69),
    COL_CHAR  CHAR(67),
    COL_CHAR_69CHAR  CHAR(69 CHAR)
)
END_SQL

my $col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_INTEGER' );

is $col_h->fetchrow_hashref->{COLUMN_SIZE} => 38,
    "INTEGER is alias for NUMBER(38)";

$col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_NUMBER_37' );
is $col_h->fetchrow_hashref->{COLUMN_SIZE} => 37,
    "NUMBER(37)";

$col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_NUMBER' );
cmp_ok $col_h->fetchrow_hashref->{COLUMN_SIZE}, '>', 0,
    "NUMBER";

$col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_VC2' );
is $col_h->fetchrow_hashref->{COLUMN_SIZE} => 67,
    "VARCHAR(67)";

$col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_VC2_69CHAR' );
is $col_h->fetchrow_hashref->{COLUMN_SIZE} => 69,
    "VARCHAR(69)";

$col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_NVC2' );
is $col_h->fetchrow_hashref->{COLUMN_SIZE} => 69,
    "NVARCHAR2(69)";

$col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_NC' );
is $col_h->fetchrow_hashref->{COLUMN_SIZE} => 69,
    "NCHAR(69)";

$col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_CHAR' );
is $col_h->fetchrow_hashref->{COLUMN_SIZE} => 67,
    "CHAR(67)";

$col_h = $dbh->column_info( undef, undef, 'RT13865', 'COL_CHAR_69CHAR' );
is $col_h->fetchrow_hashref->{COLUMN_SIZE} => 69,
    "CHAR(69)";

$dbh->do( 'DROP TABLE RT13865' );

# utility functions

sub get_privs  {
    my $dbh = shift;

    my $sth = $dbh->prepare( 'SELECT PRIVILEGE from session_privs' );
    $sth->execute;

    return map { $_->[0] } @{ $sth->fetchall_arrayref };
}