http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/b7bf00cb/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
----------------------------------------------------------------------
diff --git
a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
index 8130a33..ded0848 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
@@ -22,6 +22,7 @@ import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.TimeUnit;
@@ -39,6 +40,9 @@ import org.junit.rules.TestRule;
import com.google.common.base.Function;
import com.google.common.base.Stopwatch;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
public class TestJdbcQuery extends JdbcTest{
static final org.slf4j.Logger logger =
org.slf4j.LoggerFactory.getLogger(TestJdbcQuery.class);
@@ -482,13 +486,256 @@ public class TestJdbcQuery extends JdbcTest{
ResultSet resultSet = statement.executeQuery("USE hive.db1");
String result = JdbcAssert.toString(resultSet).trim();
String expected = "ok=true; summary=Default schema changed to
'hive.db1'";
- Assert.assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, expected), expected.equals(result));
+ assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, expected), expected.equals(result));
resultSet = statement.executeQuery("SELECT * FROM kv_db1 LIMIT 2");
result = JdbcAssert.toString(resultSet).trim();
expected = "key=1; value= key_1\nkey=2; value= key_2";
- Assert.assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, expected), expected.equals(result));
+ assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, expected), expected.equals(result));
+ statement.close();
+ return null;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ }
+
+ /** Helper test method for view tests */
+ private void testViewHelper(final String viewCreate, final String viewName,
+ final String viewQuery, final String
queryResult) throws Exception{
+ JdbcAssert.withNoDefaultSchema().withConnection(new Function<Connection,
Void>() {
+ public Void apply(Connection connection) {
+ try {
+ Statement statement = connection.createStatement();
+
+ // change default schema
+ statement.executeQuery("USE dfs.`default`");
+
+ // create view
+ ResultSet resultSet = statement.executeQuery(viewCreate);
+ String result = JdbcAssert.toString(resultSet).trim();
+ String viewCreateResult = "ok=true; summary=View '" + viewName + "'
created successfully in 'dfs.default' schema";
+ assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, viewCreateResult),
+ viewCreateResult.equals(result));
+
+ // query from view
+ resultSet = statement.executeQuery(viewQuery);
+ result = JdbcAssert.toString(resultSet).trim();
+ assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, queryResult),
+ queryResult.equals(result));
+
+ statement.close();
+ return null;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ }
+
+ @Test
+ public void testView1() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview1 AS SELECT * FROM cp.`region.json`",
+ "testview1",
+ "SELECT * FROM testview1 LIMIT 1",
+ "region_id=0; sales_city=None; sales_state_province=None;
sales_district=No District; " +
+ "sales_region=No Region; sales_country=No Country;
sales_district_id=0");
+ }
+
+ @Test
+ public void testView2() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview2 AS SELECT region_id, sales_city FROM
cp.`region.json`",
+ "testview2",
+ "SELECT * FROM testview2 LIMIT 2",
+ "region_id=0; sales_city=None\nregion_id=1; sales_city=San Francisco");
+ }
+
+ @Test
+ public void testView3() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview3(regionid, salescity) AS SELECT region_id,
sales_city FROM cp.`region.json`",
+ "testview3",
+ "SELECT * FROM testview3 LIMIT 2",
+ "regionid=0; salescity=None\nregionid=1; salescity=San Francisco");
+ }
+
+ @Test
+ @Ignore // See DRILL-595 - can't project columns from inner query.
+ public void testView4() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview1 AS SELECT * FROM cp.`region.json`",
+ "testview1",
+ "SELECT region_id, sales_city FROM testview1 LIMIT 2",
+ "");
+ }
+
+ @Test
+ public void testView5() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview2 AS SELECT region_id, sales_city FROM
cp.`region.json`",
+ "testview2",
+ "SELECT region_id, sales_city FROM testview2 LIMIT 2",
+ "region_id=0; sales_city=None\nregion_id=1; sales_city=San Francisco");
+ }
+
+ @Test
+ public void testView6() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview2 AS SELECT region_id, sales_city FROM
cp.`region.json`",
+ "testview2",
+ "SELECT sales_city FROM testview2 LIMIT 2",
+ "sales_city=None\nsales_city=San Francisco");
+ }
+
+ @Test
+ public void testView7() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview3(regionid, salescity) AS SELECT region_id,
sales_city FROM cp.`region.json` LIMIT 2",
+ "testview3",
+ "SELECT regionid, salescity FROM testview3",
+ "regionid=0; salescity=None\nregionid=1; salescity=San Francisco");
+ }
+
+ @Test
+ public void testView8() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview3(regionid, salescity) AS " +
+ "SELECT region_id, sales_city FROM cp.`region.json` ORDER BY
region_id DESC",
+ "testview3",
+ "SELECT regionid FROM testview3 LIMIT 2",
+ "regionid=109\nregionid=108");
+ }
+
+ @Test
+ @Ignore // Query on testview2 fails with CannotPlanException. Seems to be an
issue with Union.
+ public void testView9() throws Exception{
+ testViewHelper(
+ "CREATE VIEW testview2 AS " +
+ "SELECT region_id FROM cp.`region.json` " +
+ "UNION " +
+ "SELECT employee_id FROM cp.`employee.json`",
+ "testview2",
+ "SELECT sales_city FROM testview2 LIMIT 2",
+ "sales_city=None\nsales_city=San Francisco");
+ }
+
+ @Test
+ public void testViewOnHiveTable1() throws Exception{
+ testViewHelper(
+ "CREATE VIEW hiveview AS SELECT * FROM hive.kv",
+ "hiveview",
+ "SELECT * FROM hiveview LIMIT 1",
+ "key=1; value= key_1");
+ }
+
+ @Test
+ public void testViewOnHiveTable2() throws Exception{
+ testViewHelper(
+ "CREATE VIEW hiveview AS SELECT * FROM hive.kv",
+ "hiveview",
+ "SELECT key, `value` FROM hiveview LIMIT 1",
+ "key=1; value= key_1");
+ }
+
+ @Test
+ public void testViewOnHiveTable3() throws Exception{
+ testViewHelper(
+ "CREATE VIEW hiveview AS SELECT * FROM hive.kv",
+ "hiveview",
+ "SELECT `value` FROM hiveview LIMIT 1",
+ "value= key_1");
+ }
+
+ @Test
+ public void testViewOnHiveTable4() throws Exception{
+ testViewHelper(
+ "CREATE VIEW hiveview AS SELECT key, `value` FROM hive.kv",
+ "hiveview",
+ "SELECT * FROM hiveview LIMIT 1",
+ "key=1; value= key_1");
+ }
+
+ @Test
+ public void testViewOnHiveTable5() throws Exception{
+ testViewHelper(
+ "CREATE VIEW hiveview AS SELECT key, `value` FROM hive.kv",
+ "hiveview",
+ "SELECT key, `value` FROM hiveview LIMIT 1",
+ "key=1; value= key_1");
+ }
+
+ @Test
+ public void testDropView() throws Exception{
+ JdbcAssert.withNoDefaultSchema().withConnection(new Function<Connection,
Void>() {
+ public Void apply(Connection connection) {
+ try {
+ Statement statement = connection.createStatement();
+
+ // change default schema
+ statement.executeQuery("USE dfs.`default`");
+
+ // create view
+ statement.executeQuery(
+ "CREATE VIEW testview3(regionid) AS SELECT region_id FROM
cp.`region.json`");
+
+ // query from view
+ ResultSet resultSet = statement.executeQuery("SELECT regionid FROM
testview3 LIMIT 1");
+ String result = JdbcAssert.toString(resultSet).trim();
+ String expected = "regionid=0";
+ assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, expected),
+ expected.equals(result));
+
+ resultSet = statement.executeQuery("DROP VIEW testview3");
+ result = JdbcAssert.toString(resultSet).trim();
+ expected = "ok=true; summary=View 'testview3' deleted successfully
from 'dfs.default' schema";
+ assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, expected),
+ expected.equals(result));
+
+ statement.close();
+ return null;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ }
+
+ @Test
+ public void testShowDescribeTablesWithView() throws Exception{
+ JdbcAssert.withNoDefaultSchema().withConnection(new Function<Connection,
Void>() {
+ public Void apply(Connection connection) {
+ try {
+ Statement statement = connection.createStatement();
+
+ // change default schema
+ statement.executeQuery("USE dfs.`default`");
+
+ // create view
+ statement.executeQuery(
+ "CREATE VIEW testview3 AS SELECT * FROM hive.kv");
+
+ // show tables on view
+ ResultSet resultSet = statement.executeQuery("SHOW TABLES like
'testview3'");
+ String result = JdbcAssert.toString(resultSet).trim();
+ String expected =
+ "TABLE_SCHEMA=dfs.default; TABLE_NAME=testview3\n" +
+ "TABLE_SCHEMA=dfs; TABLE_NAME=testview3";
+ assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, expected),
+ expected.equals(result));
+
+ // describe a view
+ resultSet = statement.executeQuery("DESCRIBE
dfs.`default`.testview3");
+ result = JdbcAssert.toString(resultSet).trim();
+ expected =
+ "COLUMN_NAME=key; DATA_TYPE=INTEGER; IS_NULLABLE=NO\n" +
+ "COLUMN_NAME=value; DATA_TYPE=VARCHAR; IS_NULLABLE=NO";
+ assertTrue(String.format("Generated string:\n%s\ndoes not
match:\n%s", result, expected),
+ expected.equals(result));
+
statement.close();
return null;
} catch (Exception e) {