diff --git beeline/src/java/org/apache/hive/beeline/AbstractCommandHandler.java beeline/src/java/org/apache/hive/beeline/AbstractCommandHandler.java index c762096..a9479d5 100644 --- beeline/src/java/org/apache/hive/beeline/AbstractCommandHandler.java +++ beeline/src/java/org/apache/hive/beeline/AbstractCommandHandler.java @@ -40,6 +40,7 @@ private final String helpText; private Completor[] parameterCompletors = new Completor[0]; + protected transient Throwable lastException; public AbstractCommandHandler(BeeLine beeLine, String[] names, String helpText, Completor[] completors) { @@ -101,4 +102,9 @@ public void setParameterCompletors(Completor[] parameterCompletors) { public Completor[] getParameterCompletors() { return parameterCompletors; } + + @Override + public Throwable getLastException() { + return lastException; + } } diff --git beeline/src/java/org/apache/hive/beeline/BeeLine.java beeline/src/java/org/apache/hive/beeline/BeeLine.java index 10fd2e2..a7daf24 100644 --- beeline/src/java/org/apache/hive/beeline/BeeLine.java +++ beeline/src/java/org/apache/hive/beeline/BeeLine.java @@ -57,7 +57,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -617,9 +616,9 @@ protected void processOption(final String arg, final ListIterator iter) throws } - boolean initArgs(String[] args) { - List commands = new LinkedList(); - List files = new LinkedList(); + int initArgs(String[] args) { + List commands = Collections.emptyList(); + List files = Collections.emptyList(); CommandLine cl; BeelineParser beelineParser; @@ -629,7 +628,8 @@ boolean initArgs(String[] args) { cl = beelineParser.parse(options, args); } catch (ParseException e1) { output(e1.getMessage()); - return false; + usage(); + return -1; } String driver = null, user = null, pass = null, url = null; @@ -637,8 +637,8 @@ boolean initArgs(String[] args) { if (cl.hasOption("help")) { - // Return false here, so usage will be printed. - return false; + usage(); + return 0; } Properties hiveVars = cl.getOptionProperties("hivevar"); @@ -689,7 +689,8 @@ boolean initArgs(String[] args) { dispatch("!properties " + i.next()); } - if (commands.size() > 0) { + int code = 0; + if (!commands.isEmpty()) { // for single command execute, disable color getOpts().setColor(false); getOpts().setHeaderInterval(-1); @@ -697,11 +698,13 @@ boolean initArgs(String[] args) { for (Iterator i = commands.iterator(); i.hasNext();) { String command = i.next().toString(); debug(loc("executing-command", command)); - dispatch(command); + if (!dispatch(command)) { + code++; + } } exit = true; // execute and exit } - return true; + return code; } @@ -719,9 +722,9 @@ public int begin(String[] args, InputStream inputStream) throws IOException { } try { - if (!initArgs(args)) { - usage(); - return ERRNO_ARGS; + int code = initArgs(args); + if (code != 0) { + return code; } if (getOpts().getScriptFile() != null) { diff --git beeline/src/java/org/apache/hive/beeline/CommandHandler.java beeline/src/java/org/apache/hive/beeline/CommandHandler.java index 0441bce..bab1778 100644 --- beeline/src/java/org/apache/hive/beeline/CommandHandler.java +++ beeline/src/java/org/apache/hive/beeline/CommandHandler.java @@ -74,4 +74,10 @@ * Returns the completors that can handle parameters. */ public Completor[] getParameterCompletors(); + + /** + * Returns exception thrown for last command + * @return + */ + public Throwable getLastException(); } \ No newline at end of file diff --git beeline/src/java/org/apache/hive/beeline/ReflectiveCommandHandler.java beeline/src/java/org/apache/hive/beeline/ReflectiveCommandHandler.java index 0fb636e..2b957f2 100644 --- beeline/src/java/org/apache/hive/beeline/ReflectiveCommandHandler.java +++ beeline/src/java/org/apache/hive/beeline/ReflectiveCommandHandler.java @@ -40,6 +40,7 @@ public ReflectiveCommandHandler(BeeLine beeLine, String[] cmds, Completor[] comp } public boolean execute(String line) { + lastException = null; try { Object ob = beeLine.getCommands().getClass().getMethod(getName(), new Class[] {String.class}) @@ -47,6 +48,7 @@ public boolean execute(String line) { return ob != null && ob instanceof Boolean && ((Boolean) ob).booleanValue(); } catch (Throwable e) { + lastException = e; return beeLine.error(e); } } diff --git beeline/src/test/org/apache/hive/beeline/TestBeelineArgParsing.java beeline/src/test/org/apache/hive/beeline/TestBeelineArgParsing.java index 8329db8..a6ee93a 100644 --- beeline/src/test/org/apache/hive/beeline/TestBeelineArgParsing.java +++ beeline/src/test/org/apache/hive/beeline/TestBeelineArgParsing.java @@ -56,7 +56,7 @@ public void testSimpleArgs() throws Exception { TestBeeline bl = new TestBeeline(); String args[] = new String[] {"-u", "url", "-n", "name", "-p", "password", "-d", "driver", "-a", "authType"}; - Assert.assertTrue(bl.initArgs(args)); + Assert.assertEquals(0, bl.initArgs(args)); Assert.assertTrue(bl.connectArgs.equals("url name password driver")); Assert.assertTrue(bl.getOpts().getAuthType().equals("authType")); } @@ -69,7 +69,7 @@ public void testDuplicateArgs() throws Exception { TestBeeline bl = new TestBeeline(); String args[] = new String[] {"-u", "url", "-u", "url2", "-n", "name", "-p", "password", "-d", "driver"}; - Assert.assertTrue(bl.initArgs(args)); + Assert.assertEquals(0, bl.initArgs(args)); Assert.assertTrue(bl.connectArgs.equals("url name password driver")); } @@ -78,7 +78,7 @@ public void testQueryScripts() throws Exception { TestBeeline bl = new TestBeeline(); String args[] = new String[] {"-u", "url", "-n", "name", "-p", "password", "-d", "driver", "-e", "select1", "-e", "select2"}; - Assert.assertTrue(bl.initArgs(args)); + Assert.assertEquals(0, bl.initArgs(args)); Assert.assertTrue(bl.connectArgs.equals("url name password driver")); Assert.assertTrue(bl.queries.contains("select1")); Assert.assertTrue(bl.queries.contains("select2")); @@ -93,7 +93,7 @@ public void testHiveConfAndVars() throws Exception { String args[] = new String[] {"-u", "url", "-n", "name", "-p", "password", "-d", "driver", "--hiveconf", "a=avalue", "--hiveconf", "b=bvalue", "--hivevar", "c=cvalue", "--hivevar", "d=dvalue"}; - Assert.assertTrue(bl.initArgs(args)); + Assert.assertEquals(0, bl.initArgs(args)); Assert.assertTrue(bl.connectArgs.equals("url name password driver")); Assert.assertTrue(bl.getOpts().getHiveConfVariables().get("a").equals("avalue")); Assert.assertTrue(bl.getOpts().getHiveConfVariables().get("b").equals("bvalue")); @@ -107,7 +107,7 @@ public void testBeelineOpts() throws Exception { String args[] = new String[] { "-u", "url", "-n", "name", "-p", "password", "-d", "driver", "--autoCommit=true", "--verbose", "--truncateTable" }; - Assert.assertTrue(bl.initArgs(args)); + Assert.assertEquals(0, bl.initArgs(args)); Assert.assertTrue(bl.connectArgs.equals("url name password driver")); Assert.assertTrue(bl.getOpts().getAutoCommit()); Assert.assertTrue(bl.getOpts().getVerbose()); @@ -122,7 +122,7 @@ public void testScriptFile() throws Exception { TestBeeline bl = new TestBeeline(); String args[] = new String[] {"-u", "url", "-n", "name", "-p", "password", "-d", "driver", "-f", "myscript"}; - Assert.assertTrue(bl.initArgs(args)); + Assert.assertEquals(0, bl.initArgs(args)); Assert.assertTrue(bl.connectArgs.equals("url name password driver")); Assert.assertTrue(bl.getOpts().getScriptFile().equals("myscript")); } @@ -134,7 +134,7 @@ public void testScriptFile() throws Exception { public void testHelp() throws Exception { TestBeeline bl = new TestBeeline(); String args[] = new String[] {"--help"}; - Assert.assertFalse(bl.initArgs(args)); + Assert.assertEquals(0, bl.initArgs(args)); } /** @@ -144,7 +144,7 @@ public void testHelp() throws Exception { public void testUnmatchedArgs() throws Exception { TestBeeline bl = new TestBeeline(); String args[] = new String[] {"-u", "url", "-n"}; - Assert.assertFalse(bl.initArgs(args)); + Assert.assertEquals(-1, bl.initArgs(args)); } }