diff --git beeline/src/java/org/apache/hive/beeline/BeeLine.java beeline/src/java/org/apache/hive/beeline/BeeLine.java index 66185f6..23e89f5 100644 --- beeline/src/java/org/apache/hive/beeline/BeeLine.java +++ beeline/src/java/org/apache/hive/beeline/BeeLine.java @@ -1432,18 +1432,17 @@ String getPromptForCli() { HiveConf conf = getCommands().getHiveConf(true); prompt = conf.getVar(HiveConf.ConfVars.CLIPROMPT); prompt = getCommands().substituteVariables(conf, prompt); - return prompt + getFormattedDb(conf) + "> "; + return prompt + getFormattedDb() + "> "; } /** * Retrieve the current database name string to display, based on the * configuration value. * - * @param conf storing whether or not to show current db * @return String to show user for current db value */ - String getFormattedDb(HiveConf conf) { - if (!HiveConf.getBoolVar(conf, HiveConf.ConfVars.CLIPRINTCURRENTDB)) { + String getFormattedDb() { + if (!getOpts().getShowDbInPrompt()) { return ""; } String currDb = getCurrentDatabase(); @@ -1461,7 +1460,7 @@ String getPromptForBeeline() { } else { String printClosed = getDatabaseConnection().isClosed() ? " (closed)" : ""; return getPromptForBeeline(getDatabaseConnections().getIndex() - + ": " + getDatabaseConnection().getUrl()) + printClosed + "> "; + + ": " + getDatabaseConnection().getUrl()) + printClosed + getFormattedDb() + "> "; } } diff --git beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java index 5aaa385..f792b9e 100644 --- beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java +++ beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java @@ -66,6 +66,7 @@ private boolean silent = false; private boolean color = false; private boolean showHeader = true; + private boolean showDbInPrompt =false; private int headerInterval = 100; private boolean fastConnect = true; private boolean autoCommit = false; @@ -467,6 +468,21 @@ public boolean getShowHeader() { } } + public void setShowDbInPrompt(boolean showDbInPrompt) { + this.showDbInPrompt = showDbInPrompt; + } + + public boolean getShowDbInPrompt() { + if (beeLine.isBeeLine()) { + return showDbInPrompt; + } else { + boolean showDatabase; + HiveConf conf = beeLine.getCommands().getHiveConf(true); + showDatabase = HiveConf.getBoolVar(conf, HiveConf.ConfVars.CLIPRINTCURRENTDB); + return showDatabase; + } + } + public void setHeaderInterval(int headerInterval) { this.headerInterval = headerInterval; } diff --git beeline/src/java/org/apache/hive/beeline/ClientCommandHookFactory.java beeline/src/java/org/apache/hive/beeline/ClientCommandHookFactory.java index c4d97bc..fc7daa8 100644 --- beeline/src/java/org/apache/hive/beeline/ClientCommandHookFactory.java +++ beeline/src/java/org/apache/hive/beeline/ClientCommandHookFactory.java @@ -17,6 +17,8 @@ */ package org.apache.hive.beeline; +import java.sql.SQLException; + /** * We need to update some client side information after executing some Hive Commands */ @@ -44,27 +46,21 @@ public void postHook(BeeLine beeLine) { } } - public class UseCommandHook extends ClientHook { + public class RefreshConnectedDbCommandHook extends ClientHook { - public UseCommandHook(String sql) { + public RefreshConnectedDbCommandHook(String sql) { super(sql); } @Override public void postHook(BeeLine beeLine) { - if (!beeLine.isBeeLine()) { - // Handler multi-line sql - String line = sql.replaceAll("\\s+", " "); - String strs[] = line.split(" "); - String dbName; - if (strs == null || strs.length != 2) { - // unable to parse the use command - dbName = ""; - } else { - dbName = strs[1]; - } - beeLine.setCurrentDatabase(dbName); + String dbName = ""; + try { + dbName = beeLine.getDatabaseConnection().getConnection().getSchema(); + } catch (SQLException e) { + // unable to get the database, keep the default value } + beeLine.setCurrentDatabase(dbName); } } @@ -76,8 +72,12 @@ public ClientHook getHook(String cmdLine) { } else { return null; } - } else if (cmdLine.toLowerCase().startsWith("use")) { - return new UseCommandHook(cmdLine); + } else if (cmdLine.toLowerCase().startsWith("use") + || cmdLine.toLowerCase().startsWith("connect") + || cmdLine.toLowerCase().startsWith("go")) + { + // For the use, connect and go commands, the connecteddb should be refreshed + return new RefreshConnectedDbCommandHook(cmdLine); } else { return null; } diff --git beeline/src/java/org/apache/hive/beeline/Commands.java beeline/src/java/org/apache/hive/beeline/Commands.java index 3a204c0..3b5ee1b 100644 --- beeline/src/java/org/apache/hive/beeline/Commands.java +++ beeline/src/java/org/apache/hive/beeline/Commands.java @@ -952,10 +952,7 @@ private boolean executeInternal(String sql, boolean call) { return false; } - ClientHook hook = null; - if (!beeLine.isBeeLine()) { - hook = ClientCommandHookFactory.get().getHook(sql); - } + ClientHook hook = ClientCommandHookFactory.get().getHook(sql); try { Statement stmnt = null; diff --git beeline/src/java/org/apache/hive/beeline/ReflectiveCommandHandler.java beeline/src/java/org/apache/hive/beeline/ReflectiveCommandHandler.java index 3b863ae..8c1c8ea 100644 --- beeline/src/java/org/apache/hive/beeline/ReflectiveCommandHandler.java +++ beeline/src/java/org/apache/hive/beeline/ReflectiveCommandHandler.java @@ -48,15 +48,23 @@ public ReflectiveCommandHandler(BeeLine beeLine, String[] cmds, Completer[] comp public boolean execute(String line) { lastException = null; + ClientHook hook = ClientCommandHookFactory.get().getHook(line); + try { Object ob = beeLine.getCommands().getClass().getMethod(getName(), new Class[] {String.class}) .invoke(beeLine.getCommands(), new Object[] {line}); - return ob != null && ob instanceof Boolean - && ((Boolean) ob).booleanValue(); + + boolean result = (ob != null && ob instanceof Boolean && ((Boolean) ob).booleanValue()); + + if (hook != null && result) { + hook.postHook(beeLine); + } + + return result; } catch (Throwable e) { lastException = e; return beeLine.error(e); } } -} \ No newline at end of file +} diff --git beeline/src/main/resources/BeeLine.properties beeline/src/main/resources/BeeLine.properties index 7500df9..95b8fa1 100644 --- beeline/src/main/resources/BeeLine.properties +++ beeline/src/main/resources/BeeLine.properties @@ -167,6 +167,7 @@ cmd-usage: Usage: java org.apache.hive.cli.beeline.BeeLine \n \ \ --autoCommit=[true/false] enable/disable automatic transaction commit\n \ \ --verbose=[true/false] show verbose error messages and debug info\n \ \ --showWarnings=[true/false] display connection warnings\n \ +\ --showDbInPrompt=[true/false] display the current database name in the prompt\n \ \ --showNestedErrs=[true/false] display nested errors\n \ \ --numberFormat=[pattern] format numbers using DecimalFormat pattern\n \ \ --force=[true/false] continue running script even after errors\n \ diff --git beeline/src/test/org/apache/hive/beeline/TestBeelineArgParsing.java beeline/src/test/org/apache/hive/beeline/TestBeelineArgParsing.java index ce1f538..a83f925 100644 --- beeline/src/test/org/apache/hive/beeline/TestBeelineArgParsing.java +++ beeline/src/test/org/apache/hive/beeline/TestBeelineArgParsing.java @@ -187,6 +187,25 @@ public void testBeelineOpts() throws Exception { Assert.assertTrue(bl.getOpts().getTruncateTable()); } + @Test + public void testBeelineShowDbInPromptOptsDefault() throws Exception { + TestBeeline bl = new TestBeeline(); + String args[] = new String[] { "-u", "url" }; + Assert.assertEquals(0, bl.initArgs(args)); + Assert.assertFalse(bl.getOpts().getShowDbInPrompt()); + Assert.assertEquals("", bl.getFormattedDb()); + } + + @Test + public void testBeelineShowDbInPromptOptsTrue() throws Exception { + TestBeeline bl = new TestBeeline(); + String args[] = new String[] { "-u", "url", "--showDbInPrompt=true" }; + Assert.assertEquals(0, bl.initArgs(args)); + Assert.assertTrue(bl.getOpts().getShowDbInPrompt()); + Assert.assertEquals(" (default)", bl.getFormattedDb()); + } + + /** * Test setting script file with -f option. */ diff --git beeline/src/test/org/apache/hive/beeline/TestClientCommandHookFactory.java beeline/src/test/org/apache/hive/beeline/TestClientCommandHookFactory.java index c86de0a..7b02512 100644 --- beeline/src/test/org/apache/hive/beeline/TestClientCommandHookFactory.java +++ beeline/src/test/org/apache/hive/beeline/TestClientCommandHookFactory.java @@ -27,6 +27,11 @@ public void testGetHook() { Assert.assertTrue(ClientCommandHookFactory.get() .getHook("set a=b;") instanceof ClientCommandHookFactory.SetCommandHook); Assert.assertTrue(ClientCommandHookFactory.get() - .getHook("USE a.b") instanceof ClientCommandHookFactory.UseCommandHook); + .getHook("USE a.b") instanceof ClientCommandHookFactory.RefreshConnectedDbCommandHook); + Assert.assertTrue(ClientCommandHookFactory.get() + .getHook("coNNect a.b") instanceof ClientCommandHookFactory.RefreshConnectedDbCommandHook); + Assert.assertTrue(ClientCommandHookFactory.get() + .getHook("gO 1") instanceof ClientCommandHookFactory.RefreshConnectedDbCommandHook); + Assert.assertNull(ClientCommandHookFactory.get().getHook("g")); } }