muxin created HIVE-15820:
----------------------------
Summary: comment at the head of beeline -e
Key: HIVE-15820
URL: https://issues.apache.org/jira/browse/HIVE-15820
Project: Hive
Issue Type: Bug
Components: Beeline
Affects Versions: 2.1.1, 1.2.1
Reporter: muxin
$ beeline -u jdbc:hive2://localhost:10000 -n test -e "
> --asdfasdfasdfasdf
> select * from test_table;
> "
expected result of the above command should be all rows of test_table(same as
run in beeline interactive mode),but it does not output anything.
the cause is that -e option will read commands as one string, and in method
dispatch(String line) it calls function isComment(String line) in the first,
which using
'lineTrimmed.startsWith("#") || lineTrimmed.startsWith("--")'
to regard commands as a comment.
two ways can be considered to fix this problem:
1. in method initArgs(String[] args), split command by '\n' into command list
before dispatch when cl.getOptionValues('e') != null
2. in method dispatch(String line), remove comments using this:
static String removeComments(String line) {
if (line == null || line.isEmpty()) {
return line;
}
StringBuilder builder = new StringBuilder();
int escape = -1;
for (int index = 0; index < line.length(); index++) {
if (index < line.length() - 1 && line.charAt(index) ==
line.charAt(index + 1)) {
if (escape == -1 && line.charAt(index) == '-') {
//find \n as the end of comment
index = line.indexOf('\n',index+1);
//there is no sql after this comment,so just break out
if (-1==index){
break;
}
}
}
char letter = line.charAt(index);
if (letter == escape) {
escape = -1; // Turn escape off.
} else if (escape == -1 && (letter == '\'' || letter == '"')) {
escape = letter; // Turn escape on.
}
builder.append(letter);
}
return builder.toString();
}
the second way can be a general solution to remove all comments start with '--'
in a sql
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)