use crate::util::*;
testcase!(test);
fn test(mut glue: multisql::Glue) {
execute!(
glue,
r#"
CREATE TABLE Player (
id INTEGER,
name TEXT
);
"#
);
execute!(
glue,
r#"
CREATE TABLE Item (
id INTEGER,
quantity INTEGER,
player_id INTEGER,
);
"#
);
execute!(glue, "DELETE FROM Player");
execute!(glue, "DELETE FROM Item");
execute!(
glue,
r#"
INSERT INTO Player (
id,
name
) VALUES (
1,
'Taehoon'
),(
2,
'Mike'
),(
3,
'Jorno'
),(
4,
'Berry'
),(
5,
'Hwan'
)
"#
);
execute!(
glue,
r#"
INSERT INTO Item
(id, quantity, player_id)
VALUES
(101, 1, 1),
(102, 4, 2),
(103, 9, 3),
(104, 2, 3),
(105, 1, 3),
(106, 5, 1),
(107, 2, 1),
(108, 1, 5),
(109, 1, 5),
(110, 3, 3),
(111, 4, 2),
(112, 8, 1),
(113, 7, 1),
(114, 1, 1),
(115, 2, 1);
"#
);
let select_sqls = [
(75, "SELECT * FROM Item JOIN Player"),
(
15,
"SELECT * FROM Item LEFT JOIN Player ON Player.id = Item.player_id;",
),
(
16,
"SELECT * FROM Item RIGHT JOIN Player ON Player.id = Item.player_id;",
),
(5, "SELECT * FROM Item LEFT JOIN Player ON Player.id = Item.player_id WHERE quantity = 1;"),
(7, "SELECT * FROM Item LEFT JOIN Player ON Player.id = Item.player_id WHERE Player.id = 1;"),
(7, "SELECT * FROM Item INNER JOIN Player ON Player.id = Item.player_id WHERE Player.id = 1;"),
(7, "SELECT * FROM Item
LEFT JOIN Player p0 ON p0.id = Item.player_id
LEFT JOIN Player p1 ON p1.id = Item.player_id
LEFT JOIN Player p2 ON p2.id = Item.player_id
LEFT JOIN Player p3 ON p3.id = Item.player_id
LEFT JOIN Player p4 ON p4.id = Item.player_id
LEFT JOIN Player p5 ON p5.id = Item.player_id
LEFT JOIN Player p6 ON p6.id = Item.player_id
LEFT JOIN Player p7 ON p7.id = Item.player_id
LEFT JOIN Player p8 ON p8.id = Item.player_id
LEFT JOIN Player p9 ON p9.id = Item.player_id
WHERE p0.id = 1;"),
(6, "SELECT * FROM Item
LEFT JOIN Player p0 ON p0.id = Item.player_id
LEFT JOIN Player p1 ON p1.id = Item.player_id
LEFT JOIN Player p2 ON p2.id = Item.player_id
LEFT JOIN Player p3 ON p3.id = Item.player_id
LEFT JOIN Player p4 ON p4.id = Item.player_id
LEFT JOIN Player p5 ON p5.id = Item.player_id
LEFT JOIN Player p6 ON p6.id = Item.player_id
LEFT JOIN Player p7 ON p7.id = Item.player_id
LEFT JOIN Player p8 ON p8.id = Item.player_id
INNER JOIN Player p9 ON p9.id = Item.player_id AND Item.id > 101
WHERE p0.id = 1;"),
(5, "SELECT * FROM Item LEFT JOIN Player ON Player.id = Item.player_id WHERE Item.quantity = 1;"),
(5, "SELECT * FROM Item i LEFT JOIN Player p ON p.id = i.player_id WHERE i.quantity = 1;"),
(15, "SELECT * FROM Item i LEFT JOIN Player p ON p.id = i.player_id AND p.id = 1;"),
(15, "SELECT * FROM Item i LEFT JOIN Player p ON p.id = i.player_id AND i.quantity = 1;"),
(15, "SELECT * FROM Item LEFT JOIN Player ON Player.id = Item.player_id AND Item.quantity = 1;"),
(7, "SELECT * FROM Item i JOIN Player p ON p.id = i.player_id AND p.id = 1;"),
(7, "SELECT * FROM Item i INNER JOIN Player p ON p.id = i.player_id AND p.id = 1;"),
(5, "SELECT * FROM Item i JOIN Player p ON p.id = i.player_id AND i.quantity = 1;"),
(0, "SELECT * FROM Player
INNER JOIN Item ON 1 = 2
INNER JOIN Item i2 ON 1 = 2
"),
(15, "SELECT * FROM Player INNER JOIN Item ON Player.id = Item.player_id;"),
(25, "SELECT * FROM Player p1 LEFT JOIN Player p2 ON 1 = 1"),
];
for (_num, sql) in select_sqls.iter() {
let response = glue.execute(sql);
let response_text = format!("{:?}", response);
let result = if let Ok(multisql::Payload::Select { rows, .. }) = response {
rows.len()
} else {
0
};
(&result == _num).then(|| true).expect(&format!(
"Wrong number of rows.\nExpected: {}\nFound: {}\nResult: {}\nQuery: {}",
_num, result, response_text, sql
));
}
execute!(glue, "DELETE FROM Player; DELETE FROM Item");
execute!(
glue,
r#"
INSERT INTO Player (id, name) VALUES
(1, 'Taehoon'),
(2, 'Mike'),
(3, 'Jorno'),
(4, 'Berry'),
(5, 'Hwan');
"#
);
execute!(
glue,
r#"
INSERT INTO Item (id, quantity, player_id) VALUES
(101, 1, 1),
(102, 4, 2),
(103, 9, 4);
"#
);
}