package my.test.command;
import my.test.TestBase;
public class JoinTest extends TestBase {
public static void main(String[] args) throws Exception {
new JoinTest().start();
}
@Override
public void init() throws Exception {
// prop.setProperty("DATABASE_TO_UPPER", "false");
// prop.setProperty("NESTED_JOINS", "false"); //不使用嵌套join
// 见org.h2.table.TableFilter.fullCondition的注释
// 和org.h2.table.Plan.removeUnusableIndexConditions()的注释
prop.setProperty("EARLY_FILTER", "true");
prop.setProperty("OPTIMIZE_IS_NULL", "false");
}
void insert() throws Exception {
stmt.executeUpdate("DROP TABLE IF EXISTS JoinTest1 CASCADE");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS JoinTest1(id int, name varchar(500), b boolean)");
stmt.executeUpdate("CREATE INDEX IF NOT EXISTS JoinTest1Index ON JoinTest1(name)");
stmt.executeUpdate("DROP TABLE IF EXISTS JoinTest2 CASCADE");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS JoinTest2(id2 int, name2 varchar(500))");
stmt.executeUpdate("CREATE INDEX IF NOT EXISTS JoinTest2Index ON JoinTest2(name2)");
stmt.executeUpdate("DROP TABLE IF EXISTS JoinTest3 CASCADE");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS JoinTest3(id3 int, name3 varchar(500))");
stmt.executeUpdate("DROP TABLE IF EXISTS JoinTest4 CASCADE");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS JoinTest4(id int, name varchar(500))");
stmt.executeUpdate("insert into JoinTest1(id, name, b) values(10, 'a1', true)");
stmt.executeUpdate("insert into JoinTest1(id, name, b) values(20, 'b1', true)");
stmt.executeUpdate("insert into JoinTest1(id, name, b) values(30, 'a2', false)");
stmt.executeUpdate("insert into JoinTest1(id, name, b) values(40, 'b2', true)");
stmt.executeUpdate("insert into JoinTest2(id2, name2) values(60, 'a11')");
stmt.executeUpdate("insert into JoinTest2(id2, name2) values(70, 'a11')");
stmt.executeUpdate("insert into JoinTest2(id2, name2) values(80, 'a11')");
stmt.executeUpdate("insert into JoinTest2(id2, name2) values(90, 'a11')");
stmt.executeUpdate("insert into JoinTest3(id3, name3) values(100, 'a11')");
stmt.executeUpdate("insert into JoinTest3(id3, name3) values(200, 'a11')");
stmt.executeUpdate("insert into JoinTest4(id, name) values(10, 'a1')");
stmt.executeUpdate("insert into JoinTest4(id, name) values(10, 'a1')");
stmt.executeUpdate("insert into JoinTest4(id, name) values(20, 'a1')");
stmt.executeUpdate("insert into JoinTest4(id, name) values(30, 'a1')");
}
@Override
public void startInternal() throws Exception {
executeUpdate("SET BATCH_JOINS 1");
insert();
sql = "select rownum, * from (JoinTest1 RIGHT OUTER JOIN (JoinTest2))";
executeQuery();
sql = "select rownum, * from JoinTest1 LEFT OUTER JOIN JoinTest2";
executeQuery();
sql = "select rownum, * from JoinTest1 RIGHT OUTER JOIN JoinTest2";
sql = "select rownum, * from JoinTest1 INNER JOIN JoinTest2";
sql = "select rownum, * from JoinTest1 JOIN JoinTest2";
executeQuery();
sql = "select rownum, * from JoinTest1 CROSS JOIN JoinTest2";
sql = "select rownum, * from JoinTest1 CROSS JOIN JoinTest2 CROSS JOIN JoinTest3 CROSS JOIN JoinTest4";
executeQuery();
sql = "select rownum, * from JoinTest1 NATURAL JOIN JoinTest2";
sql = "select rownum, * from JoinTest1 LEFT OUTER JOIN JoinTest3 NATURAL JOIN JoinTest2";
sql = "FROM USER() SELECT * ";
sql = "SELECT * FROM (JoinTest1)";
sql = "SELECT * FROM (JoinTest1 LEFT OUTER JOIN (JoinTest2))";
sql = "SELECT * FROM JoinTest1 LEFT OUTER JOIN JoinTest2 LEFT OUTER JOIN JoinTest3";
sql = "SELECT t1.id, t1.b FROM JoinTest1 t1 NATURAL JOIN JoinTest4 t2";
// org.h2.table.TableFilter.next()
// 打断点:table.getName().equalsIgnoreCase("JoinTest1") || table.getName().equalsIgnoreCase("JoinTest2")
sql = "SELECT rownum, * FROM JoinTest1 LEFT OUTER JOIN JoinTest2 ON id>30";
sql = "SELECT rownum, * FROM JoinTest1 RIGHT OUTER JOIN JoinTest2 ON id2>70";
sql = "SELECT rownum, * FROM JoinTest1 JOIN JoinTest2 ON id>30";
sql = "SELECT rownum, * FROM JoinTest1 LEFT OUTER JOIN JoinTest2 JOIN JoinTest3";
executeQuery();
sql = "SELECT rownum, * FROM (JoinTest1) LEFT OUTER JOIN JoinTest2 ON id>=30";
executeQuery();
sql = "SELECT rownum, * FROM JoinTest1 LEFT OUTER JOIN (JoinTest2) ON id>30";
executeQuery();
sql = "SELECT rownum, * FROM JoinTest1 JOIN JoinTest2 ON id>30";
//
// sql = "SELECT rownum, * FROM JoinTest1 LEFT OUTER JOIN JoinTest2 ON id>30 WHERE 1>2";
//
sql = "SELECT rownum, * FROM JoinTest1 LEFT OUTER JOIN JoinTest2 ON name2=null";
executeQuery();
sql = "SELECT rownum, * FROM JoinTest1 JOIN JoinTest2 ON name2=null";
executeQuery();
//
// sql = "SELECT rownum, * FROM JoinTest1 LEFT OUTER JOIN JoinTest2 ON id2=90";
//
// sql = "SELECT rownum, * FROM JoinTest1 LEFT OUTER JOIN JoinTest2 WHERE id2=90";
// sql = "SELECT rownum, * FROM JoinTest1 JOIN JoinTest2 WHERE id2=90";
//
// sql = "SELECT rownum, * FROM JoinTest1 JOIN JoinTest2 WHERE id2=90 and name='a1' and b=true";
// sql = "SELECT rownum, * FROM JoinTest1 JOIN JoinTest2 WHERE id2=90 and name='a1' and id=10";
//
// sql = "SELECT rownum, * FROM JoinTest1 WHERE name='a1' and id=10";
//
// sql = "SELECT rownum, * FROM JoinTest1 WHERE name like 'a1' and id=10";
//
// sql = "SELECT rownum, * FROM JoinTest1 WHERE name like '%a1%' and id=10";
// executeQuery();
sql = "SELECT rownum, * FROM JoinTest1 JOIN JoinTest2 on id2>80 WHERE id=20";
executeQuery();
sql = "SELECT rownum, * FROM JoinTest1 WHERE id in (SELECT id2 from JoinTest2)";
executeQuery();
}
}