From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/bin/perl
use strict;
use FindBin qw/$Bin/;
BEGIN {
maybe_plan(2, 'SQL::Translator::Parser::XML::SQLFairy', 'SQL::Translator::Producer::SQLite');
}
my $xmlfile = "$Bin/data/xml/schema.xml";
my $sqlt;
$sqlt = SQL::Translator->new(
quote_identifiers => 1,
no_comments => 1,
show_warnings => 0,
add_drop_table => 1,
);
die "Can't find test schema $xmlfile" unless -e $xmlfile;
my $sql = $sqlt->translate(
from => 'XML-SQLFairy',
to => 'SQLite',
filename => $xmlfile,
) or die $sqlt->error;
eq_or_diff($sql, << "SQL");
BEGIN TRANSACTION;
DROP TABLE "Basic";
CREATE TABLE "Basic" (
"id" INTEGER PRIMARY KEY NOT NULL,
"title" varchar(100) NOT NULL DEFAULT 'hello',
"description" text DEFAULT '',
"email" varchar(500),
"explicitnulldef" varchar,
"explicitemptystring" varchar DEFAULT '',
-- Hello emptytagdef
"emptytagdef" varchar DEFAULT '',
"another_id" int(10) DEFAULT 2,
"timest" timestamp,
FOREIGN KEY ("another_id") REFERENCES "Another"("id")
);
CREATE INDEX "titleindex" ON "Basic" ("title");
CREATE UNIQUE INDEX "emailuniqueindex" ON "Basic" ("email");
CREATE UNIQUE INDEX "very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms" ON "Basic" ("title");
DROP TABLE "Another";
CREATE TABLE "Another" (
"id" INTEGER PRIMARY KEY NOT NULL,
"num" numeric(10,2)
);
DROP VIEW IF EXISTS "email_list";
CREATE VIEW "email_list" AS
SELECT email FROM Basic WHERE (email IS NOT NULL);
DROP TRIGGER IF EXISTS "foo_trigger";
CREATE TRIGGER "foo_trigger" after insert on "Basic" BEGIN update modified=timestamp(); END;
DROP TRIGGER IF EXISTS "bar_trigger_insert";
CREATE TRIGGER "bar_trigger_insert" before insert on "Basic" BEGIN update modified2=timestamp(); END;
DROP TRIGGER IF EXISTS "bar_trigger_update";
CREATE TRIGGER "bar_trigger_update" before update on "Basic" BEGIN update modified2=timestamp(); END;
COMMIT;
SQL
# Test in list context
my @sql = $sqlt->translate(
from => 'XML-SQLFairy',
to => 'SQLite',
filename => $xmlfile,
) or die $sqlt->error;
eq_or_diff(
\@sql,
[
'BEGIN TRANSACTION',
q<DROP TABLE "Basic">,
q<CREATE TABLE "Basic" (
"id" INTEGER PRIMARY KEY NOT NULL,
"title" varchar(100) NOT NULL DEFAULT 'hello',
"description" text DEFAULT '',
"email" varchar(500),
"explicitnulldef" varchar,
"explicitemptystring" varchar DEFAULT '',
-- Hello emptytagdef
"emptytagdef" varchar DEFAULT '',
"another_id" int(10) DEFAULT 2,
"timest" timestamp,
FOREIGN KEY ("another_id") REFERENCES "Another"("id")
)>,
q<CREATE INDEX "titleindex" ON "Basic" ("title")>,
q<CREATE UNIQUE INDEX "emailuniqueindex" ON "Basic" ("email")>,
q<CREATE UNIQUE INDEX "very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms" ON "Basic" ("title")>,
q<DROP TABLE "Another">,
q<CREATE TABLE "Another" (
"id" INTEGER PRIMARY KEY NOT NULL,
"num" numeric(10,2)
)>,
q<DROP VIEW IF EXISTS "email_list">,
q<CREATE VIEW "email_list" AS
SELECT email FROM Basic WHERE (email IS NOT NULL)>,
q<DROP TRIGGER IF EXISTS "foo_trigger">,
q<CREATE TRIGGER "foo_trigger" after insert on "Basic" BEGIN update modified=timestamp(); END>,
q<DROP TRIGGER IF EXISTS "bar_trigger_insert">,
q<CREATE TRIGGER "bar_trigger_insert" before insert on "Basic" BEGIN update modified2=timestamp(); END>,
q<DROP TRIGGER IF EXISTS "bar_trigger_update">,
q<CREATE TRIGGER "bar_trigger_update" before update on "Basic" BEGIN update modified2=timestamp(); END>,
'COMMIT',
],
'SQLite translate in list context matches'
);