use strict;
use warnings;

use Test::More;
use DBI;
use DBD::MariaDB;

use vars qw($test_dsn $test_user $test_password);
use lib 't', '.';
require "lib.pl";

my $dbh = DbiTestConnect($test_dsn, $test_user, $test_password, { PrintError => 0, RaiseError => 1 });

plan tests => 90;

ok($dbh->do("CREATE TEMPORARY TABLE t(id INT)"));
ok($dbh->do("INSERT INTO t(id) VALUES(1)"));

my $sth1 = $dbh->prepare("SELECT * FROM t");
ok(!$sth1->{Active});
ok($sth1->execute());
ok($sth1->{Active});
is_deeply($sth1->{NAME}, ["id"]);
is_deeply($sth1->fetchall_arrayref(), [ [ 1 ] ]);
ok(!$sth1->{Active});
is_deeply($sth1->{mariadb_type}, [ DBD::MariaDB::TYPE_LONG ]);

my $sth2 = $dbh->prepare("SELECT * FROM t", { mariadb_server_prepare => 1 });
ok(!$sth2->{Active});
ok($sth2->execute());
ok($sth2->{Active});
is_deeply($sth2->{NAME}, ["id"]);
is_deeply($sth2->fetchall_arrayref(), [ [ 1 ] ]);
ok(!$sth2->{Active});
is_deeply($sth2->{mariadb_type}, [ DBD::MariaDB::TYPE_LONG ]);

ok($dbh->do("INSERT INTO t(id) VALUES(2)"));

my $sth3 = $dbh->prepare("SELECT * FROM t");
ok(!$sth3->{Active});
ok($sth3->execute());
ok($sth3->{Active});
is_deeply($sth3->{NAME}, ["id"]);
is_deeply($sth3->fetchrow_arrayref(), [ 1 ]);
ok($sth3->{Active});
is_deeply($sth3->{NAME}, ["id"]);
is_deeply($sth3->fetchrow_arrayref(), [ 2 ]);
ok(!$sth3->{Active});
is_deeply($sth3->{NAME}, ["id"]);
is_deeply($sth3->{mariadb_type}, [ DBD::MariaDB::TYPE_LONG ]);

my $sth4 = $dbh->prepare("SELECT * FROM t", { mariadb_server_prepare => 1 });
ok(!$sth4->{Active});
ok($sth4->execute());
ok($sth4->{Active});
is_deeply($sth4->{NAME}, ["id"]);
is_deeply($sth4->fetchrow_arrayref(), [ 1 ]);
ok($sth4->{Active});
is_deeply($sth4->{NAME}, ["id"]);
is_deeply($sth4->fetchrow_arrayref(), [ 2 ]);
ok(!$sth4->{Active});
is_deeply($sth4->{NAME}, ["id"]);
is_deeply($sth4->{mariadb_type}, [ DBD::MariaDB::TYPE_LONG ]);

my $sth5 = $dbh->prepare("SELECT * FROM t");
ok(!$sth5->{Active});
ok($sth5->execute());
ok($sth5->{Active});
is_deeply($sth5->{NAME}, ["id"]);
is_deeply($sth5->fetchrow_arrayref(), [ 1 ]);
ok($sth5->{Active});
is_deeply($sth5->{NAME}, ["id"]);
ok($sth5->finish);
ok(!$sth5->{Active});
is_deeply($sth5->{NAME}, ["id"]);
is_deeply($sth5->{mariadb_type}, [ DBD::MariaDB::TYPE_LONG ]);

my $sth6 = $dbh->prepare("SELECT * FROM t", { mariadb_server_prepare => 1 });
ok(!$sth6->{Active});
ok($sth6->execute());
ok($sth6->{Active});
is_deeply($sth6->{NAME}, ["id"]);
is_deeply($sth6->fetchrow_arrayref(), [ 1 ]);
ok($sth6->{Active});
is_deeply($sth6->{NAME}, ["id"]);
ok($sth6->finish);
ok(!$sth6->{Active});
is_deeply($sth6->{NAME}, ["id"]);
is_deeply($sth6->{mariadb_type}, [ DBD::MariaDB::TYPE_LONG ]);

my $sth7 = $dbh->prepare("SELECT NULL as my_name LIMIT 0");
ok(!$sth7->{Active});
ok($sth7->execute());
ok(!$sth7->{Active});
is_deeply($sth7->{NAME}, ["my_name"]);
ok(!$sth7->fetchrow_arrayref());
ok(!$sth7->{Active});
is_deeply($sth7->{mariadb_type}, [ DBD::MariaDB::TYPE_NULL ]);

my $sth8 = $dbh->prepare("SELECT NULL as my_name LIMIT 0");
ok(!$sth8->{Active});
ok($sth8->execute());
ok(!$sth8->{Active});
is_deeply($sth8->{NAME}, ["my_name"]);
ok(!$sth8->fetchrow_arrayref());
ok(!$sth8->{Active});
is_deeply($sth8->{mariadb_type}, [ DBD::MariaDB::TYPE_NULL ]);

my $sth9 = $dbh->prepare("SELECT NULL as my_name LIMIT 0");
ok(!$sth9->{Active});
ok($sth9->execute());
ok(!$sth9->{Active});
is_deeply($sth9->{NAME}, ["my_name"]);
is_deeply($sth9->fetchall_arrayref(), []);
ok(!$sth9->{Active});
is_deeply($sth9->{mariadb_type}, [ DBD::MariaDB::TYPE_NULL ]);

my $sth10 = $dbh->prepare("SELECT NULL as my_name LIMIT 0");
ok(!$sth10->{Active});
ok($sth10->execute());
ok(!$sth10->{Active});
is_deeply($sth10->{NAME}, ["my_name"]);
is_deeply($sth10->fetchall_arrayref(), []);
ok(!$sth10->{Active});
is_deeply($sth10->{mariadb_type}, [ DBD::MariaDB::TYPE_NULL ]);

ok($dbh->disconnect());