@Test
  public void testSemiJoin() throws ParseException {
    parse("select \"c/b/o_t1\".c_int           from \"c/b/o_t1\" left semi join   \"//cbo_t2\" on \"c/b/o_t1\".key=\"//cbo_t2\".key");
    parse("select \"c/b/o_t1\".c_int           from \"c/b/o_t1\" left semi join   \"//cbo_t2\" on \"c/b/o_t1\".key=\"//cbo_t2\".key where (\"c/b/o_t1\".c_int + 1 == 2) and (\"c/b/o_t1\".c_int > 0 or \"c/b/o_t1\".c_float >= 0)");
    parse("select * from (select c, b, a from (select key as a, c_int as b, \"c/b/o_t1\".c_float as c from \"c/b/o_t1\"  where (\"c/b/o_t1\".c_int + 1 == 2) and (\"c/b/o_t1\".c_int > 0 or \"c/b/o_t1\".c_float >= 0)) \"c/b/o_t1\" left semi join (select \"//cbo_t2\".key as p, \"//cbo_t2\".c_int as q, c_float as r from \"//cbo_t2\"  where (\"//cbo_t2\".c_int + 1 == 2) and (\"//cbo_t2\".c_int > 0 or \"//cbo_t2\".c_float >= 0)) \"//cbo_t2\" on \"c/b/o_t1\".a=p left semi join \"cbo_/t3////\" on \"c/b/o_t1\".a=key where (b + 1 == 2) and (b > 0 or c >= 0)) R where  (b + 1 = 2) and (R.b > 0 or c >= 0)");
    parse("select * from (select \"cbo_/t3////\".c_int, \"c/b/o_t1\".c, b from (select key as a, c_int as b, \"c/b/o_t1\".c_float as c from \"c/b/o_t1\"  where (\"c/b/o_t1\".c_int + 1 = 2) and (\"c/b/o_t1\".c_int > 0 or \"c/b/o_t1\".c_float >= 0)) \"c/b/o_t1\" left semi join (select \"//cbo_t2\".key as p, \"//cbo_t2\".c_int as q, c_float as r from \"//cbo_t2\"  where (\"//cbo_t2\".c_int + 1 == 2) and (\"//cbo_t2\".c_int > 0 or \"//cbo_t2\".c_float >= 0)) \"//cbo_t2\" on \"c/b/o_t1\".a=p left outer join \"cbo_/t3////\" on \"c/b/o_t1\".a=key where (b + \"cbo_/t3////\".c_int  == 2) and (b > 0 or c_int >= 0)) R where  (R.c_int + 1 = 2) and (R.b > 0 or c_int >= 0)");
    parse("select * from (select c_int, b, \"c/b/o_t1\".c from (select key as a, c_int as b, \"c/b/o_t1\".c_float as c from \"c/b/o_t1\"  where (\"c/b/o_t1\".c_int + 1 == 2) and (\"c/b/o_t1\".c_int > 0 or \"c/b/o_t1\".c_float >= 0)) \"c/b/o_t1\" left semi join (select \"//cbo_t2\".key as p, \"//cbo_t2\".c_int as q, c_float as r from \"//cbo_t2\"  where (\"//cbo_t2\".c_int + 1 == 2) and (\"//cbo_t2\".c_int > 0 or \"//cbo_t2\".c_float >= 0)) \"//cbo_t2\" on \"c/b/o_t1\".a=p right outer join \"cbo_/t3////\" on \"c/b/o_t1\".a=key where (b + 1 == 2) and (b > 0 or c_int >= 0)) R where  (c + 1 = 2) and (R.b > 0 or c_int >= 0)");
    parse("select * from (select c_int, b, \"c/b/o_t1\".c from (select key as a, c_int as b, \"c/b/o_t1\".c_float as c from \"c/b/o_t1\"  where (\"c/b/o_t1\".c_int + 1 == 2) and (\"c/b/o_t1\".c_int > 0 or \"c/b/o_t1\".c_float >= 0)) \"c/b/o_t1\" left semi join (select \"//cbo_t2\".key as p, \"//cbo_t2\".c_int as q, c_float as r from \"//cbo_t2\"  where (\"//cbo_t2\".c_int + 1 == 2) and (\"//cbo_t2\".c_int > 0 or \"//cbo_t2\".c_float >= 0)) \"//cbo_t2\" on \"c/b/o_t1\".a=p full outer join \"cbo_/t3////\" on \"c/b/o_t1\".a=key where (b + 1 == 2) and (b > 0 or c_int >= 0)) R where  (c + 1 = 2) and (R.b > 0 or c_int >= 0)");
    parse("select a, c, count(*) from (select key as a, c_int+1 as b, sum(c_int) as c from \"c/b/o_t1\" where (\"c/b/o_t1\".c_int + 1 >= 0) and (\"c/b/o_t1\".c_int > 0 or \"c/b/o_t1\".c_float >= 0)  group by c_float, \"c/b/o_t1\".c_int, key having \"c/b/o_t1\".c_float > 0 and (c_int >=1 or c_float >= 1) and (c_int + c_float) >= 0 order by a+b desc, c asc) \"c/b/o_t1\" left semi join (select key as p, c_int+1 as q, sum(c_int) as r from \"//cbo_t2\" where (\"//cbo_t2\".c_int + 1 >= 0) and (\"//cbo_t2\".c_int > 0 or \"//cbo_t2\".c_float >= 0)  group by c_float, \"//cbo_t2\".c_int, key having \"//cbo_t2\".c_float > 0 and (c_int >=1 or c_float >= 1) and (c_int + c_float) >= 0 order by q+r/10 desc, p) \"//cbo_t2\" on \"c/b/o_t1\".a=p left semi join \"cbo_/t3////\" on \"c/b/o_t1\".a=key where (b + 1  >= 0) and (b > 0 or a >= 0) group by a, c  having a > 0 and (a >=1 or c >= 1) and (a + c) >= 0 order by c, a");
    parse("select a, c, count(*)  from (select key as a, c_int+1 as b, sum(c_int) as c from \"c/b/o_t1\" where (\"c/b/o_t1\".c_int + 1 >= 0) and (\"c/b/o_t1\".c_int > 0 or \"c/b/o_t1\".c_float >= 0)  group by c_float, \"c/b/o_t1\".c_int, key having \"c/b/o_t1\".c_float > 0 and (c_int >=1 or c_float >= 1) and (c_int + c_float) >= 0 order by a+b desc, c asc limit 5) \"c/b/o_t1\" left semi join (select key as p, c_int+1 as q, sum(c_int) as r from \"//cbo_t2\" where (\"//cbo_t2\".c_int + 1 >= 0) and (\"//cbo_t2\".c_int > 0 or \"//cbo_t2\".c_float >= 0)  group by c_float, \"//cbo_t2\".c_int, key having \"//cbo_t2\".c_float > 0 and (c_int >=1 or c_float >= 1) and (c_int + c_float) >= 0 order by q+r/10 desc, p limit 5) \"//cbo_t2\" on \"c/b/o_t1\".a=p left semi join \"cbo_/t3////\" on \"c/b/o_t1\".a=key where (b + 1  >= 0) and (b > 0 or a >= 0) group by a, c  having a > 0 and (a >=1 or c >= 1) and (a + c) >= 0 order by c, a");
  }
Parser tests special character in table names.
parser/src/test/org/apache/hadoop/hive/ql/parse/TestSpecialCharacterInTableNamesQuotes.java