The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use SQL::Exec::SQLite ':all';
use Test::Subs;

test {
	connect(':memory:');
	execute('create view v as select 10 a union select 20 a');
	execute('create table t (a, b, primary key (a))');
	execute('create trigger r before insert on t begin select 1; end');
	execute('attach database ":memory:" as db');
	execute('create table db.u (a, B, primary key (a, B))');
	1
};

test {
	table_exists('v')
};

test {
	table_exists('t')
};

todo {
	not table_exists('u')
};

test {
	not table_exists('main', 'u')
};

test {
	table_exists('main', 't')
};

test {
	table_exists('', 'main', 't')
};

test {
	table_exists('db', 'u');
};

test {
	not table_exists('db', 't');
};

test {
	not table_exists('w')
};

test {
	not table_exists('r')
};

test {
	table_exists('main.t')
};

test {
	table_exists('', 'main.t')
};

test {
	table_exists('db.u');
};

test {
	not table_exists('db.t');
};


# Test of the dummy fall back implementation
my $c;

test {
	$c = SQL::Exec::get_default_handle();
	SQL::Exec::__table_exists_dummy($c, undef, undef, 'v')
};

test {
	SQL::Exec::__table_exists_dummy($c, undef, undef, 't')
};

todo {
	not SQL::Exec::__table_exists_dummy($c, undef, undef, 'u')
};

test {
	not SQL::Exec::__table_exists_dummy($c, undef, 'main', 'u')
};

test {
	SQL::Exec::__table_exists_dummy($c, undef, 'main', 't')
};

test {
	SQL::Exec::__table_exists_dummy($c, '', 'main', 't')
};

test {
	SQL::Exec::__table_exists_dummy($c, undef, 'db', 'u');
};

test {
	not SQL::Exec::__table_exists_dummy($c, undef, 'db', 't');
};

test {
	not SQL::Exec::__table_exists_dummy($c, undef, undef, 'w')
};

test {
	not SQL::Exec::__table_exists_dummy($c, undef, undef, 'r')
};

test {
	SQL::Exec::__table_exists_dummy($c, undef, 'main.t')
};

test {
	SQL::Exec::__table_exists_dummy($c, '', 'main.t')
};

test {
	SQL::Exec::__table_exists_dummy($c, undef, 'db.u');
};

test {
	not SQL::Exec::__table_exists_dummy($c, undef, 'db.t');
};

test {
	get_primary_key('t') ~~ ['a'];
};

test {
	use Data::Dumper;
	get_primary_key('db', 'u') ~~ ['a', 'b'];
};

fail {
	use Data::Dumper;
	get_primary_key('db', 't') ~~ ['a', 'b'];
};