diff --git a/ql/src/java/org/apache/hadoop/hive/ql/processors/DfsProcessor.java b/ql/src/java/org/apache/hadoop/hive/ql/processors/DfsProcessor.java index ce54e0c..bbb892e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/processors/DfsProcessor.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/processors/DfsProcessor.java @@ -19,11 +19,13 @@ package org.apache.hadoop.hive.ql.processors; import java.io.PrintStream; +import java.util.ArrayList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FsShell; +import org.apache.hadoop.hive.ql.CommandNeedRetryException; import org.apache.hadoop.hive.ql.parse.VariableSubstitution; import org.apache.hadoop.hive.ql.session.SessionState; import org.apache.hadoop.hive.ql.session.SessionState.LogHelper; @@ -53,7 +55,8 @@ public class DfsProcessor implements CommandProcessor { SessionState ss = SessionState.get(); command = new VariableSubstitution().substitute(ss.getConf(),command); - String[] tokens = command.split("\\s+"); + String[] tokens = splitCmd(command); + PrintStream oldOut = System.out; if (ss != null && ss.out != null) { @@ -61,6 +64,7 @@ public class DfsProcessor implements CommandProcessor { } int ret = dfs.run(tokens); + if (ret != 0) { console.printError("Command failed with exit code = " + ret); } @@ -76,4 +80,57 @@ public class DfsProcessor implements CommandProcessor { } } + private String[] splitCmd(String command) throws CommandNeedRetryException { + + ArrayList paras = new ArrayList(); + int cmdLng = command.length(); + char y = 0; + int start = 0; + + for (int i = 0; i < cmdLng; i++) { + char x = command.charAt(i); + + switch(x) { + case ' ': + if ((int) y == 0) { + paras.add(command.substring(start, i)); + start = i + 1; + } + break; + case '"': + if ((int) y == 0) { + y = x; + start = i + 1; + } else if ('"' == y) { + paras.add(command.substring(start, i)); + y = 0; + start = i + 1; + } + break; + case '\'': + if ((int) y == 0) { + y = x; + start = i + 1; + } else if ('\'' == y) { + paras.add(command.substring(start, i)); + y = 0; + start = i + 1; + } + break; + default: + if (i == cmdLng-1 && start < cmdLng) { + paras.add(command.substring(start, cmdLng)); + } + break; + } + } + + if ((int) y != 0) { + console.printError("Syntax error on hadoop options: dfs " + command); + throw new CommandNeedRetryException(); + } + + return paras.toArray(new String[paras.size()]); + } + } diff --git a/ql/src/test/queries/clientpositive/dfscmd.q b/ql/src/test/queries/clientpositive/dfscmd.q new file mode 100644 index 0000000..0cd5c84 --- /dev/null +++ b/ql/src/test/queries/clientpositive/dfscmd.q @@ -0,0 +1,6 @@ +dfs -mkdir "hello"; +dfs -mkdir 'world'; +dfs -mkdir "bei jing"; +dfs -rmr 'hello'; +dfs -rmr "world"; +dfs -rmr 'bei jing'; diff --git a/ql/src/test/results/clientpositive/dfscmd.q.out b/ql/src/test/results/clientpositive/dfscmd.q.out new file mode 100644 index 0000000..0b8182a --- /dev/null +++ b/ql/src/test/results/clientpositive/dfscmd.q.out @@ -0,0 +1 @@ +#### A masked pattern was here ####