hive-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "muxin (JIRA)" <j...@apache.org>
Subject [jira] [Created] (HIVE-15820) comment at the head of beeline -e
Date Mon, 06 Feb 2017 07:02:51 GMT
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)

Mime
View raw message