1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
use crate::*; test_case!(blend, async move { let create_sqls: [&str; 2] = [ " CREATE TABLE BlendUser ( id INTEGER, name TEXT ); ", " CREATE TABLE BlendItem ( id INTEGER, player_id INTEGER, quantity INTEGER, ); ", ]; for sql in create_sqls.iter() { run!(sql); } let delete_sqls = ["DELETE FROM BlendUser", "DELETE FROM BlendItem"]; for sql in delete_sqls.iter() { run!(sql); } let insert_sqls = [ "INSERT INTO BlendUser (id, name) VALUES (1, \"Taehoon\")", "INSERT INTO BlendUser (id, name) VALUES (2, \"Mike\")", "INSERT INTO BlendUser (id, name) VALUES (3, \"Jorno\")", "INSERT INTO BlendItem (id, player_id, quantity) VALUES (101, 1, 1);", "INSERT INTO BlendItem (id, player_id, quantity) VALUES (102, 2, 4);", "INSERT INTO BlendItem (id, player_id, quantity) VALUES (103, 2, 9);", "INSERT INTO BlendItem (id, player_id, quantity) VALUES (104, 3, 2);", "INSERT INTO BlendItem (id, player_id, quantity) VALUES (105, 3, 1);", ]; for insert_sql in insert_sqls.iter() { run!(insert_sql); } use Value::*; let test_cases = vec![ ("SELECT 1 FROM BlendUser", select!(1; I64; 1; 1; 1)), ( "SELECT id, name FROM BlendUser", select!( id | name I64 | Str; 1 "Taehoon".to_owned(); 2 "Mike".to_owned(); 3 "Jorno".to_owned() ), ), ( "SELECT player_id, quantity FROM BlendItem", select!(player_id | quantity; I64 | I64; 1 1; 2 4; 2 9; 3 2; 3 1), ), ( "SELECT player_id, player_id FROM BlendItem", select!(player_id | player_id; I64 | I64; 1 1; 2 2; 2 2; 3 3; 3 3), ), ( " SELECT u.id, i.id, player_id FROM BlendUser u JOIN BlendItem i ON u.id = 1 AND u.id = i.player_id ", select!(id | id | player_id; I64 | I64 | I64; 1 101 1), ), ( " SELECT i.*, u.name FROM BlendUser u JOIN BlendItem i ON u.id = 2 AND u.id = i.player_id ", select!( id | player_id | quantity | name I64 | I64 | I64 | Str; 102 2 4 "Mike".to_owned(); 103 2 9 "Mike".to_owned() ), ), ( " SELECT u.*, i.* FROM BlendUser u JOIN BlendItem i ON u.id = i.player_id ", select!( id | name | id | player_id | quantity I64 | Str | I64 | I64 | I64; 1 "Taehoon".to_owned() 101 1 1; 2 "Mike".to_owned() 102 2 4; 2 "Mike".to_owned() 103 2 9; 3 "Jorno".to_owned() 104 3 2; 3 "Jorno".to_owned() 105 3 1 ), ), ( "SELECT id as Ident, name FROM BlendUser", select!( Ident | name I64 | Str; 1 "Taehoon".to_owned(); 2 "Mike".to_owned(); 3 "Jorno".to_owned() ), ), ( "SELECT (1 + 2) as foo, 2+id+2*100-1 as Ident, name FROM BlendUser", select!( foo | Ident | name I64 | I64 | Str; 3 202 "Taehoon".to_owned(); 3 203 "Mike".to_owned(); 3 204 "Jorno".to_owned() ), ), ]; for (sql, expected) in test_cases.into_iter() { test!(Ok(expected), sql); } let error_cases = vec![ ( SelectError::TableAliasNotFound("Whatever".to_owned()).into(), "SELECT Whatever.* FROM BlendUser", ), ( BlendError::TableAliasNotFound("Whatever".to_owned()).into(), "SELECT * FROM BlendUser WHERE id IN (SELECT Whatever.* FROM BlendUser)", ), ]; for (error, sql) in error_cases.into_iter() { test!(Err(error), sql); } });