use strict;
use warnings;

my %creates;
my %rest;

while (<>)
{
        if (/^CREATE.*?(?:TABLE|VIEW) (?:`[^`]+`\.)?`([^`]+)`(.*)$/)
        {
                $creates{$1} = $_;
                $rest{$1} = $2;
        }
}

my @all = keys %creates;
my $regex = '(' . join('|', map { "`$_`"; } @all) . ')';

my %deps;
my @queue;
foreach my $t (@all)
{
        $deps{$t} = {};
        while ($rest{$t} =~ m/$regex/g)
        {
                my $dep = $1;
                $dep =~ s/`//g;
                if ($t ne $dep)
                {
                        $deps{$t}->{$dep} = 1;
                }
        }
        if (!keys %{$deps{$t}})
        {
                push @queue, $t;
        }
}

my %used;
while (@queue)
{
        my $cur = shift @queue;
        print $creates{$cur};
        delete $deps{$cur};
        foreach my $t (keys %deps)
        {
                delete $deps{$t}->{$cur};
                if (!keys %{$deps{$t}} && !grep { $_ eq $t; } @queue)
                {
                        push @queue, $t;
                }
        }
}

foreach my $k (keys %deps)
{
        warn "ERROR: missing table or view due to circular dependency: $k\n";
}
