DB-Handy
view release on metacpan or search on metacpan
t/1002_index.t view on Meta::CPAN
###############################################################################
# Equality search via index (INT)
###############################################################################
$res = $db->execute("SELECT * FROM emp WHERE id = 5");
# ok 16
ok($res->{type} eq 'rows', "SELECT WHERE id=5 ok");
# ok 17
is(scalar @{$res->{data}}, 1, "WHERE id=5 returns 1 row");
# ok 18
is($res->{data}[0]{name}, 'Eve', "WHERE id=5 -> Eve");
# id not found
$res = $db->execute("SELECT * FROM emp WHERE id = 999");
# ok 19
is(scalar @{$res->{data}}, 0, "WHERE id=999 returns 0 rows");
# Equality on VARCHAR column
$res = $db->execute("SELECT * FROM emp WHERE dept = 'Engineering'");
# ok 20
is(scalar @{$res->{data}}, 5, "WHERE dept=Engineering returns 5 rows");
###############################################################################
# Range searches via index
###############################################################################
# id > 7 -> 8,9,10
$res = $db->execute("SELECT * FROM emp WHERE id > 7");
# ok 21
is(scalar @{$res->{data}}, 3, "WHERE id>7 returns 3 rows");
# id >= 8 -> 8,9,10
$res = $db->execute("SELECT * FROM emp WHERE id >= 8");
# ok 22
is(scalar @{$res->{data}}, 3, "WHERE id>=8 returns 3 rows");
# id < 3 -> 1,2
$res = $db->execute("SELECT * FROM emp WHERE id < 3");
# ok 23
is(scalar @{$res->{data}}, 2, "WHERE id<3 returns 2 rows");
# id <= 2 -> 1,2
$res = $db->execute("SELECT * FROM emp WHERE id <= 2");
# ok 24
is(scalar @{$res->{data}}, 2, "WHERE id<=2 returns 2 rows");
# salary >= 80000 -> 80000, 90000, 95000 (3 rows)
$res = $db->execute("SELECT * FROM emp WHERE salary >= 80000");
# ok 25
is(scalar @{$res->{data}}, 3, "WHERE salary>=80000 returns 3 rows");
###############################################################################
# UNIQUE constraint: duplicate INSERT blocked
###############################################################################
$res = $db->execute("INSERT INTO emp (id,name,dept,salary) VALUES (1,'Dup','Test',1.0)");
# ok 26
ok($res->{type} eq 'error', "Duplicate INSERT blocked by UNIQUE");
# ok 27
ok($res->{message} =~ /UNIQUE/, "Error message mentions UNIQUE");
###############################################################################
# UNIQUE constraint: duplicate UPDATE blocked
###############################################################################
$res = $db->execute("UPDATE emp SET id=1 WHERE id=2");
# ok 28
ok($res->{type} eq 'error', "UPDATE to duplicate id=1 blocked");
# Non-duplicate update is allowed
$res = $db->execute("UPDATE emp SET id=2 WHERE id=2");
# ok 29
ok($res->{type} eq 'ok', "UPDATE id=2->2 (no change) allowed");
###############################################################################
# Index maintained on UPDATE (key change)
###############################################################################
# Change Bob's salary; old value must be gone from index, new added
$res = $db->execute("UPDATE emp SET salary=60000 WHERE id=2");
# ok 30
ok($res->{type} eq 'ok', "UPDATE salary for id=2");
# Old salary (55000.5) should no longer match
$res = $db->execute("SELECT * FROM emp WHERE salary >= 55000");
my @found_55 = grep { $_->{id}==2 } @{$res->{data}};
# ok 31
ok(scalar @found_55 == 1, "Bob still found via salary index after update");
# ok 32
is($res->{data}[0]{salary}+0 == 55000.5 ? 'old' : 'updated',
'updated', "Salary index updated: old value gone");
# Directly verify new value reachable
$res = $db->execute("SELECT * FROM emp WHERE salary >= 59999 AND salary <= 60001");
# (no index path for AND range with two bounds, but verify via full scan)
my @bobs = grep { $_->{name} eq 'Bob' } @{$res->{data}};
# ok 33
ok(scalar @bobs == 1, "Bob found via salary=60000 after update");
###############################################################################
# Index maintained on DELETE
###############################################################################
$res = $db->execute("DELETE FROM emp WHERE id=10");
# ok 34
ok($res->{type} eq 'ok', "DELETE Jack (id=10)");
$res = $db->execute("SELECT * FROM emp WHERE id=10");
# ok 35
is(scalar @{$res->{data}}, 0, "id=10 not found after DELETE");
$res = $db->execute("SELECT * FROM emp WHERE id >= 1");
# ok 36
is(scalar @{$res->{data}}, 9, "9 rows remain after DELETE");
###############################################################################
# VACUUM rebuilds index
###############################################################################
# Insert some rows then delete to create holes
$db->execute("INSERT INTO emp (id,name,dept,salary) VALUES (11,'Tmp1','Test',1.0)");
$db->execute("INSERT INTO emp (id,name,dept,salary) VALUES (12,'Tmp2','Test',2.0)");
$db->execute("DELETE FROM emp WHERE id=11");
( run in 1.466 second using v1.01-cache-2.11-cpan-5a3173703d6 )