diff --git a/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java b/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java index d9f726d..72e9037 100644 --- a/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java +++ b/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java @@ -228,7 +228,7 @@ public void load(InputStream fin) throws IOException { public void updateBeeLineOptsFromConf() { if (!beeLine.isBeeLine()) { if (conf == null) { - conf = beeLine.getCommands().getHiveConf(true); + conf = beeLine.getCommands().getHiveConf(false); } setForce(HiveConf.getBoolVar(conf, HiveConf.ConfVars.CLIIGNOREERRORS)); } diff --git a/beeline/src/test/org/apache/hive/beeline/cli/TestHiveCli.java b/beeline/src/test/org/apache/hive/beeline/cli/TestHiveCli.java index c465eac..c7eaa8e 100644 --- a/beeline/src/test/org/apache/hive/beeline/cli/TestHiveCli.java +++ b/beeline/src/test/org/apache/hive/beeline/cli/TestHiveCli.java @@ -107,7 +107,7 @@ public void testInvalidDatabaseOptions() { @Test public void testDatabaseOptions() { - verifyCMD("\nshow tables;\nquit;", "testTbl", os, new String[] { "--database", "test" }, + verifyCMD("\nshow tables;\nquit;", "testtbl", os, new String[] { "--database", "test" }, ERRNO_OK); } @@ -134,7 +134,7 @@ public void testSqlFromCmd() { @Test public void testSqlFromCmdWithDBName() { - verifyCMD(null, "testTbl", os, new String[] { "-e", "show tables;", "--database", "test" }, + verifyCMD(null, "testtbl", os, new String[] { "-e", "show tables;", "--database", "test" }, ERRNO_OK); } @@ -164,6 +164,12 @@ public void testVariablesForSource() { f.delete(); } + @Test + public void testErrOutput() { + verifyCMD("show tables;set system:xxx=5;set system:yyy=${system:xxx};\nlss;", + "cannot recognize input near 'lss' '' ''", errS, null, ERRNO_OK); + } + private void redirectOutputStream() { // Setup output stream to redirect output to os = new ByteArrayOutputStream(); @@ -200,8 +206,8 @@ private File generateTmpFile(String context) { @Before public void setup() { cli = new HiveCli(); - redirectOutputStream(); initFromFile(); + redirectOutputStream(); } @After diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java b/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java index 959822e..c0ff3af 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java +++ b/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java @@ -1034,7 +1034,7 @@ public boolean isValid(int timeout) throws SQLException { throw new SQLException("Method not supported"); } - /* +/* * (non-Javadoc) * * @see java.sql.Connection#nativeSQL(java.lang.String) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java b/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java index 49d64db..13ca87d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java @@ -161,6 +161,11 @@ protected File tmpOutputFile; /** + * Temporary file name used to store error output of executing non-Hive commands (e.g., set, dfs) + */ + protected File tmpErrOutputFile; + + /** * type of the command. */ private HiveOperation commandType; @@ -305,6 +310,14 @@ public void setTmpOutputFile(File f) { tmpOutputFile = f; } + public File getTmpErrOutputFile() { + return tmpErrOutputFile; + } + + public void setTmpErrOutputFile(File tmpErrOutputFile) { + this.tmpErrOutputFile = tmpErrOutputFile; + } + public boolean getIsSilent() { if(conf != null) { return conf.getBoolVar(HiveConf.ConfVars.HIVESESSIONSILENT); @@ -525,6 +538,14 @@ public static SessionState start(SessionState startSs) { } } + // Set temp file containing error output to be sent to client + if (startSs.getTmpErrOutputFile() == null) { + try { + startSs.setTmpErrOutputFile(createTempFile(startSs.getConf())); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } catch (Exception e) { // Catch-all due to some exec time dependencies on session state // that would cause ClassNoFoundException otherwise diff --git a/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java b/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java index bcc66cf..1d1e995 100644 --- a/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java +++ b/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java @@ -66,13 +66,14 @@ protected HiveCommandOperation(HiveSession parentSession, String statement, private void setupSessionIO(SessionState sessionState) { try { - LOG.info("Putting temp output to file " + sessionState.getTmpOutputFile().toString()); + LOG.info("Putting temp output to file " + sessionState.getTmpOutputFile().toString() + + " and error output to file " + sessionState.getTmpErrOutputFile().toString()); sessionState.in = null; // hive server's session input stream is not used - // open a per-session file in auto-flush mode for writing temp results - sessionState.out = new PrintStream(new FileOutputStream(sessionState.getTmpOutputFile()), true, "UTF-8"); - // TODO: for hadoop jobs, progress is printed out to session.err, - // we should find a way to feed back job progress to client - sessionState.err = new PrintStream(System.err, true, "UTF-8"); + // open a per-session file in auto-flush mode for writing temp results and tmp error output + sessionState.out = + new PrintStream(new FileOutputStream(sessionState.getTmpOutputFile()), true, "UTF-8"); + sessionState.err = + new PrintStream(new FileOutputStream(sessionState.getTmpErrOutputFile()), true, "UTF-8"); } catch (IOException e) { LOG.error("Error in creating temp output file ", e); try { @@ -90,8 +91,7 @@ private void setupSessionIO(SessionState sessionState) { private void tearDownSessionIO() { - IOUtils.cleanup(LOG, parentSession.getSessionState().out); - IOUtils.cleanup(LOG, parentSession.getSessionState().err); + IOUtils.cleanup(LOG, parentSession.getSessionState().out, parentSession.getSessionState().err); } @Override @@ -202,6 +202,8 @@ private void cleanTmpFile() { SessionState sessionState = getParentSession().getSessionState(); File tmp = sessionState.getTmpOutputFile(); tmp.delete(); + tmp = sessionState.getTmpErrOutputFile(); + tmp.delete(); } private void resetResultReader() { diff --git a/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java b/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java index f4334e4..175348b 100644 --- a/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java +++ b/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java @@ -296,6 +296,10 @@ private void cleanup(OperationState state) throws HiveSQLException { if (ss.getTmpOutputFile() != null) { ss.getTmpOutputFile().delete(); } + + if (ss.getTmpErrOutputFile() != null) { + ss.getTmpErrOutputFile().delete(); + } } @Override