@@ -46,7 +46,7 @@ public class DataPermissionDatabaseInterceptorTest2 extends BaseMockitoUnitTest
@Override
publicSet<String>getTableNames(){
returnasSet("entity","entity1","entity2","t1","t2",// 支持 MyBatis Plus 的单元测试
returnasSet("entity","entity1","entity2","entity3","t1","t2","sys_dict_item",// 支持 MyBatis Plus 的单元测试
"t_user","t_role");// 满足自己的单元测试
}
...
...
@@ -84,30 +84,30 @@ public class DataPermissionDatabaseInterceptorTest2 extends BaseMockitoUnitTest
@Test
voiddelete(){
assertSql("delete from entity where id = ?",
"DELETE FROM entity WHERE id = ? AND tenant_id = 1");
"DELETE FROM entity WHERE id = ? AND entity.tenant_id = 1");
}
@Test
voidupdate(){
assertSql("update entity set name = ? where id = ?",
"UPDATE entity SET name = ? WHERE id = ? AND tenant_id = 1");
"UPDATE entity SET name = ? WHERE id = ? AND entity.tenant_id = 1");
}
@Test
voidselectSingle(){
// 单表
assertSql("select * from entity where id = ?",
"SELECT * FROM entity WHERE id = ? AND tenant_id = 1");
"SELECT * FROM entity WHERE id = ? AND entity.tenant_id = 1");
assertSql("select * from entity where id = ? or name = ?",
"SELECT * FROM entity WHERE (id = ? OR name = ?) AND tenant_id = 1");
"SELECT * FROM entity WHERE (id = ? OR name = ?) AND entity.tenant_id = 1");
assertSql("SELECT * FROM entity WHERE (id = ? OR name = ?)",
"SELECT * FROM entity WHERE (id = ? OR name = ?) AND tenant_id = 1");
"SELECT * FROM entity WHERE (id = ? OR name = ?) AND entity.tenant_id = 1");
/* not */
assertSql("SELECT * FROM entity WHERE not (id = ? OR name = ?)",
"SELECT * FROM entity WHERE NOT (id = ? OR name = ?) AND tenant_id = 1");
"SELECT * FROM entity WHERE NOT (id = ? OR name = ?) AND entity.tenant_id = 1");
}
@Test
...
...
@@ -167,10 +167,12 @@ public class DataPermissionDatabaseInterceptorTest2 extends BaseMockitoUnitTest
assertSql("SELECT * FROM entity e WHERE e.id >= (select e1.id from entity1 e1 where e1.id = ?)",
"SELECT * FROM entity e WHERE e.id >= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
/* <= */
assertSql("SELECT * FROM entity e WHERE e.id <= (select e1.id from entity1 e1 where e1.id = ?)",
"SELECT * FROM entity e WHERE e.id <= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
/* <> */
assertSql("SELECT * FROM entity e WHERE e.id <> (select e1.id from entity1 e1 where e1.id = ?)",
"SELECT * FROM entity e WHERE e.id <> (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
...
...
@@ -204,6 +206,14 @@ public class DataPermissionDatabaseInterceptorTest2 extends BaseMockitoUnitTest
"SELECT * FROM entity e "+
"LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 "+
"WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
assertSql("SELECT * FROM entity e "+
"left join entity1 e1 on e1.id = e.id "+
"left join entity2 e2 on e1.id = e2.id",
"SELECT * FROM entity e "+
"LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 "+
"LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 "+
"WHERE e.tenant_id = 1");
}
@Test
...
...
@@ -212,17 +222,125 @@ public class DataPermissionDatabaseInterceptorTest2 extends BaseMockitoUnitTest
assertSql("SELECT * FROM entity e "+
"right join entity1 e1 on e1.id = e.id",
"SELECT * FROM entity e "+
"RIGHT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 "+
"WHERE e.tenant_id = 1");
"RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 "+
"WHERE e1.tenant_id = 1");
assertSql("SELECT * FROM with_as_1 e "+
"right join entity1 e1 on e1.id = e.id",
"SELECT * FROM with_as_1 e "+
"RIGHT JOIN entity1 e1 ON e1.id = e.id "+
"WHERE e1.tenant_id = 1");
assertSql("SELECT * FROM entity e "+
"right join entity1 e1 on e1.id = e.id "+
"WHERE e.id = ? OR e.name = ?",
"SELECT * FROM entity e "+
"RIGHT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 "+
"WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
"RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 "+
"WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1");
assertSql("SELECT * FROM entity e "+
"right join entity1 e1 on e1.id = e.id "+
"right join entity2 e2 on e1.id = e2.id ",
"SELECT * FROM entity e "+
"RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 "+
"RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 "+
"WHERE e2.tenant_id = 1");
}
@Test
voidselectMixJoin(){
assertSql("SELECT * FROM entity e "+
"right join entity1 e1 on e1.id = e.id "+
"left join entity2 e2 on e1.id = e2.id",
"SELECT * FROM entity e "+
"RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 "+
"LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 "+
"WHERE e1.tenant_id = 1");
assertSql("SELECT * FROM entity e "+
"left join entity1 e1 on e1.id = e.id "+
"right join entity2 e2 on e1.id = e2.id",
"SELECT * FROM entity e "+
"LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 "+
"RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 "+
"WHERE e2.tenant_id = 1");
assertSql("SELECT * FROM entity e "+
"left join entity1 e1 on e1.id = e.id "+
"inner join entity2 e2 on e1.id = e2.id",
"SELECT * FROM entity e "+
"LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 "+
"INNER JOIN entity2 e2 ON e1.id = e2.id AND e.tenant_id = 1 AND e2.tenant_id = 1");
}
@Test
voidselectJoinSubSelect(){
assertSql("select * from (select * from entity) e1 "+
"left join entity2 e2 on e1.id = e2.id",
"SELECT * FROM (SELECT * FROM entity WHERE entity.tenant_id = 1) e1 "+
"LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1");
assertSql("select * from entity1 e1 "+
"left join (select * from entity2) e2 "+
"on e1.id = e2.id",
"SELECT * FROM entity1 e1 "+
"LEFT JOIN (SELECT * FROM entity2 WHERE entity2.tenant_id = 1) e2 "+
"ON e1.id = e2.id "+
"WHERE e1.tenant_id = 1");
}
@Test
voidselectSubJoin(){
assertSql("select * FROM "+
"(entity1 e1 right JOIN entity2 e2 ON e1.id = e2.id)",
"SELECT * FROM "+
"(entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) "+
"WHERE e2.tenant_id = 1");
assertSql("select * FROM "+
"(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id)",
"SELECT * FROM "+
"(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) "+
"WHERE e1.tenant_id = 1");
assertSql("select * FROM "+
"(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id) "+
"right join entity3 e3 on e1.id = e3.id",
"SELECT * FROM "+
"(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) "+
"RIGHT JOIN entity3 e3 ON e1.id = e3.id AND e1.tenant_id = 1 "+
"WHERE e3.tenant_id = 1");
assertSql("select * FROM entity e "+
"LEFT JOIN (entity1 e1 right join entity2 e2 ON e1.id = e2.id) "+
"on e.id = e2.id",
"SELECT * FROM entity e "+
"LEFT JOIN (entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) "+
"ON e.id = e2.id AND e2.tenant_id = 1 "+
"WHERE e.tenant_id = 1");
assertSql("select * FROM entity e "+
"LEFT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) "+
"on e.id = e2.id",
"SELECT * FROM entity e "+
"LEFT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) "+
"ON e.id = e2.id AND e1.tenant_id = 1 "+
"WHERE e.tenant_id = 1");
assertSql("select * FROM entity e "+
"RIGHT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) "+
"on e.id = e2.id",
"SELECT * FROM entity e "+
"RIGHT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) "+
"ON e.id = e2.id AND e.tenant_id = 1 "+
"WHERE e1.tenant_id = 1");
}
@Test
voidselectLeftJoinMultipleTrailingOn(){
// 多个 on 尾缀的
...
...
@@ -256,51 +374,97 @@ public class DataPermissionDatabaseInterceptorTest2 extends BaseMockitoUnitTest
"inner join entity1 e1 on e1.id = e.id "+
"WHERE e.id = ? OR e.name = ?",
"SELECT * FROM entity e "+
"INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 "+
"WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
"INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 "+
"WHERE e.id = ? OR e.name = ?");
assertSql("SELECT * FROM entity e "+
"inner join entity1 e1 on e1.id = e.id "+
"WHERE (e.id = ? OR e.name = ?)",
"SELECT * FROM entity e "+
"INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 "+
"WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
"INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 "+
"WHERE (e.id = ? OR e.name = ?)");
// 隐式内连接
assertSql("SELECT * FROM entity,entity1 "+
"WHERE entity.id = entity1.id",
"SELECT * FROM entity, entity1 "+
"WHERE entity.id = entity1.id AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
// 隐式内连接
assertSql("SELECT * FROM entity a, with_as_entity1 b "+
"WHERE a.id = b.id",
"SELECT * FROM entity a, with_as_entity1 b "+
"WHERE a.id = b.id AND a.tenant_id = 1");
assertSql("SELECT * FROM with_as_entity a, with_as_entity1 b "+
"WHERE a.id = b.id",
"SELECT * FROM with_as_entity a, with_as_entity1 b "+
"WHERE a.id = b.id");
// SubJoin with 隐式内连接
assertSql("SELECT * FROM (entity,entity1) "+
"WHERE entity.id = entity1.id",
"SELECT * FROM (entity, entity1) "+
"WHERE entity.id = entity1.id "+
"AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
assertSql("SELECT * FROM ((entity,entity1),entity2) "+
"WHERE entity.id = entity1.id and entity.id = entity2.id",
"SELECT * FROM ((entity, entity1), entity2) "+
"WHERE entity.id = entity1.id AND entity.id = entity2.id "+
"AND entity.tenant_id = 1 AND entity1.tenant_id = 1 AND entity2.tenant_id = 1");
assertSql("SELECT * FROM (entity,(entity1,entity2)) "+
"WHERE entity.id = entity1.id and entity.id = entity2.id",
"SELECT * FROM (entity, (entity1, entity2)) "+
"WHERE entity.id = entity1.id AND entity.id = entity2.id "+
"AND entity.tenant_id = 1 AND entity1.tenant_id = 1 AND entity2.tenant_id = 1");
// 沙雕的括号写法
assertSql("SELECT * FROM (((entity,entity1))) "+
"WHERE entity.id = entity1.id",
"SELECT * FROM (((entity, entity1))) "+
"WHERE entity.id = entity1.id "+
"AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
// 垃圾 inner join todo
// assertSql("SELECT * FROM entity,entity1 " +
// "WHERE entity.id = entity1.id",
// "SELECT * FROM entity e " +
// "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
// "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
}
@Test
voidselectWithAs(){
assertSql("with with_as_A as (select * from entity) select * from with_as_A",
"WITH with_as_A AS (SELECT * FROM entity WHERE tenant_id = 1) SELECT * FROM with_as_A");
"WITH with_as_A AS (SELECT * FROM entity WHERE entity.tenant_id = 1) SELECT * FROM with_as_A");
}
@Test
voidselectIgnoreTable(){
assertSql(" SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)",
"SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id AND item.tenant_id = 1 WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)");