#!/usr/bin/perl
use
warnings;
use
strict;
use
Test::More;
use_ok(
"SQL::Translator"
);
use_ok(
"SQL::Translator::Parser::MySQL"
);
use_ok(
"SQL::Translator::Producer::SQLite"
);
# This test reproduces a bug in SQL::Translator::Producer::SQLite.
#
# When tables are created their names are not added to %global_names, and
# may be duplicated.
#
# SQL::Translator::Producer::SQLite version 1.59.
# compliments of SymKat <symkat@symkat.com>
my
$output
= SQL::Translator->new(
data
=>
do
{
local
$/; <DATA> })
->translate(
from
=>
'MySQL'
,
to
=>
'SQLite'
);
sub
find_table_names {
my
(
$content
) =
@_
;
my
@tables
;
for
my
$line
(
split
/\n/,
$content
) {
if
(
$content
=~ /CREATE (?:INDEX|UNIQUE|TABLE| ){0,6} ([^\s]+)/gc) {
push
@tables
, $1;
}
}
return
@tables
;
}
sub
has_dupes {
my
(
@list
) =
@_
;
my
%hist
;
for
my
$elem
(
@list
) {
return
0
if
exists
$hist
{
$elem
};
$hist
{
$elem
} = 1;
}
return
1;
}
ok(has_dupes(find_table_names(
$output
)));
done_testing;
__DATA__
CREATE TABLE `ip_address` (
`id` int(11) NOT NULL auto_increment,
`ip_address` varchar(255) NOT NULL,
`machine_id` int(11) default NULL,
`primary_machine_id` int(11) default NULL,
`secondary_machine_id` int(11) default NULL,
`tertiary_machine_id` int(11) default NULL,
`protocol` enum('ipv4','ipv6') NOT NULL default 'ipv4',
`shared` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`id`),
UNIQUE KEY `ip_address` (`ip_address`),
KEY `machine_id` (`machine_id`),
KEY `primary_machine_id` (`primary_machine_id`),
KEY `secondary_machine_id` (`secondary_machine_id`),
KEY `tertiary_machine_id` (`tertiary_machine_id`),
CONSTRAINT `ip_address_ibfk_1` FOREIGN KEY (`machine_id`) REFERENCES `machine` (`id`),
CONSTRAINT `ip_address_ibfk_2` FOREIGN KEY (`primary_machine_id`) REFERENCES `machine` (`id`),
CONSTRAINT `ip_address_ibfk_3` FOREIGN KEY (`secondary_machine_id`) REFERENCES `machine` (`id`),
CONSTRAINT `ip_address_ibfk_4` FOREIGN KEY (`tertiary_machine_id`) REFERENCES `machine` (`id`)
);