DBD-IngresII
view release on metacpan or search on metacpan
t/datatypes.t view on Meta::CPAN
if ($dbh->ing_is_vectorwise) {
ok($dbh->do("CREATE TABLE $testtable(id INTEGER4 not null, name CHAR(64)) WITH STRUCTURE=HEAP"), "Basic create table");
}
else {
ok($dbh->do("CREATE TABLE $testtable(id INTEGER4 not null, name CHAR(64))"), "Basic create table");
}
ok($dbh->do("INSERT INTO $testtable VALUES(1, 'Alligator Descartes')"), "Basic insert(value)");
ok($dbh->do("DELETE FROM $testtable WHERE id = 1"), "Basic Delete");
ok($dbh->do("DROP TABLE $testtable" ), "Basic drop table");
#
# For each supported data type, we need to test
#
# 1. inserting into a table using a bind_param of that type as a value
# 2. selecting from a table a field with that type
# 3. selecting from a table using a bind_param of that type as a selector
# 4. inserting into a table using a null bind_param of that type as a value
# 5. selecting from a table a null field with that type
#
# For extra paranoia we undef the variable after binding but before
# executing to make sure we aren't core dumping due to referencing things
# without updating their reference counts.
#
my %testvals = (
'SMALLINT' => 32511,
'INTEGER' => 1234567,
'MONEY' => 49711.39,
'FLOAT' => 3.1415926,
'ANSIDATE' => '1963-03-15',
'DECIMAL' => 98,
'VARCHAR' => 'Apricot' x 3,
'BYTE VARYING' => "Ab\0" x 10,
'C' => 'aBc',
'CHAR' => 'AaBb',
'BYTE' => "\3\0\2\1",
'LONG VARCHAR' => 'CcDd' x 4096,
'LONG BYTE' => "Ee\0Ff\1Gg\2Hh\0" x 2048,
'TIMESTAMP' => '1963-03-15 04:55:22.000100',
'TIMESTAMP WITH TIME ZONE' => '2005-01-12 12:47:32.244561-04:00',
'TIMESTAMP WITH LOCAL TIME ZONE' => '2006-01-12 10:56:12.245562',
'TIME' => '12:45:11',
'TIME WITH TIME ZONE' => '12:47:32-04:00',
'TIME WITH LOCAL TIME ZONE' => '12:45:02',
'INTERVAL YEAR TO MONTH' => '55-04',
'INTERVAL DAY TO SECOND' => '-18 12:02:23'
);
my $types = $dbh->type_info_all();
for (1..$#{$types}) {
my $name = $types->[$_]->[$types->[0]->{TYPE_NAME}];
my $sqltype = $types->[$_]->[$types->[0]->{DATA_TYPE}];
my $searchable = $types->[$_]->[$types->[0]->{SEARCHABLE}];
my $nullable = $types->[$_]->[$types->[0]->{NULLABLE}];
my $params = $types->[$_]->[$types->[0]->{CREATE_PARAMS}];
my $val = $testvals{$name};
my $cursor;
next if (($name eq 'NCHAR') || ($name eq 'NVARCHAR'));
next if ($name eq 'BOOLEAN');
unless ($val) {
die "No default value for type $name\n";
}
# Update the type based on the create params
if ($params && $params =~ /max length/) {
$name .= '(2000)';
}
elsif ($params && $params =~ /length/) {
$name .= '(64)';
$val = sprintf('%-64s', $val);
}
elsif ($params && $params =~ /size=/) {
$params =~ s/.*size=([0-9,]*).*/$1/;
my @sizes = split(/,/, $params);
$name .= $sizes[-1];
}
# CREATE TABLE OF APPROPRIATE TYPE
if ($dbh->ing_is_vectorwise) {
ok($dbh->do("CREATE TABLE $testtable (val $name) WITH STRUCTURE=HEAP"),
"Create table ($name)");
}
else {
ok($dbh->do("CREATE TABLE $testtable (val $name)"),
"Create table ($name)");
}
# INSERT BOUND VALUE
ok($cursor = $dbh->prepare("INSERT INTO $testtable VALUES (?)"),
"Insert prepare ($name)");
{
# By allowing the bind param to go out of scope we make sure the driver
# has either copied it or has all its ref counting on it right.
my $destroyval = $val;
ok($cursor->bind_param(1, $destroyval, { TYPE => $sqltype }),
"Insert bind param ($name)");
}
ok($cursor->execute,
"Insert execute ($name)");
ok($cursor->finish,
"Insert finish ($name)");
# SELECT VALUE
ok($cursor = $dbh->prepare("SELECT val FROM $testtable"),
"Select prepare ($name)");
ok($cursor->execute,
"Select execute ($name)");
my $ar = $cursor->fetchrow_arrayref;
ok($ar && $ar->[0] eq $val,
"Select fetch ($name)")
or print STDERR "Got '$ar->[0]', expected '$val'.\n";
ok($cursor->finish,
"Select finish ($name)");
# FETCH BOUND SELECTOR
if ($searchable) {
ok($cursor = $dbh->prepare("SELECT * FROM $testtable WHERE val = ?"),
"Select with bound selector prepare ($name)");
my $destroyval = $val;
ok($cursor->bind_param(1, $destroyval, { TYPE => $sqltype }),
"Select with bound selector bind_param ($name)");
undef $destroyval;
ok($cursor->execute,
"Select with bound selector execute ($name)");
$ar = $cursor->fetchrow_arrayref;
ok($ar && "$ar->[0]" eq "$val",
"Select with bound selector fetch ($name)")
or print STDERR "Got '$ar->[0]', expected '$val'.\n";
ok($cursor->finish,
"Select with bound selector finish ($name)");
} else {
# These dummies make it easier to set num_tests. We have to skip
# these tests because you can't select on some types.
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
}
# CLEAN UP FOR NULL STUFF
$dbh->do("DELETE FROM $testtable");
# INSERT NULL VALUE
if ($nullable) {
ok($cursor = $dbh->prepare("INSERT INTO $testtable VALUES (?)"),
"Insert null prepare ($name)");
ok($cursor->bind_param(1, undef, { TYPE => $sqltype }),
"Insert null bind param ($name)");
ok($cursor->execute,
"Insert null execute ($name)");
ok($cursor->finish,
"Insert null finish ($name)");
# SELECT NULL VALUE
ok($cursor = $dbh->prepare("SELECT val FROM $testtable"),
"Select null prepare ($name)");
ok($cursor->execute,
"Select null execute ($name)");
ok(!defined ($cursor->fetchrow_arrayref->[0]),
"Select null fetch ($name)");
ok($cursor->finish,
"Select null finish ($name)");
} else {
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
ok(1, 'Dummy test.');
}
# DROP TABLE AGAIN
ok($dbh->do("DROP TABLE $testtable"),
"Drop table ($name)");
}
$dbh and $dbh->commit;
$dbh and $dbh->disconnect;
exit(0);
( run in 1.252 second using v1.01-cache-2.11-cpan-39bf76dae61 )