[ 
https://issues.apache.org/jira/browse/HIVE-19700?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16491193#comment-16491193
 ] 

Naveen Gangam commented on HIVE-19700:
--------------------------------------

[~ychena] Thanks for the comments. I am not sure what you mean by print 
everything.
In the output I posted above, there is some rogue characters (see the null at 
the begining of the line?)
{code}
$ cat /tmp/b_multi.out 
null+-------------+-------------+-------------+-------------+-------------+--------------+--------------+--------------+--+
{code}
That null character is addressed.

I althought that making the prompt "" was a cleaner fix. However, in case of 
multiline queries in a script file, beeline prints out a blank line for every 
line of the query at the begining and end of the resultset. The code that 
causes that behavior is below (prompt="" and mask !=null)
{code}
private void beforeReadLine(final String prompt, final Character mask) {
        if (mask != null && maskThread == null) {
            final String fullPrompt = "\r" + prompt
                + "                 "
                + "                 "
                + "                 "
                + "\r" + prompt;
{code}

So if the script file had a 20-line query, the beeline output will contain 20 
blank lines before the output and 20 blank lines after the output. So that 
could break existing usecases. Thanks

> Workaround for JLine issue with UnsupportedTerminal
> ---------------------------------------------------
>
>                 Key: HIVE-19700
>                 URL: https://issues.apache.org/jira/browse/HIVE-19700
>             Project: Hive
>          Issue Type: Bug
>            Reporter: Naveen Gangam
>            Assignee: Naveen Gangam
>            Priority: Major
>             Fix For: 2.2.1
>
>         Attachments: HIVE-19700.patch
>
>
> From the JLine's ConsoleReader, readLine(prompt, mask) calls the following 
> beforeReadLine() method.
> {code}
>         try {
>             // System.out.println("is terminal supported " + 
> terminal.isSupported());
>             if (!terminal.isSupported()) {
>                 beforeReadLine(prompt, mask);
>             }
> {code}
> So specifically when using UnsupportedTerminal {{-Djline.terminal}} and 
> {{prompt=null}} and {{mask!=null}}, a "null" string gets printed to the 
> console before and after the query result. {{UnsupportedTerminal}} is 
> required to be used when running beeline as a background process, hangs 
> otherwise.
> {code}
>     private void beforeReadLine(final String prompt, final Character mask) {
>         if (mask != null && maskThread == null) {
>             final String fullPrompt = "\r" + prompt
>                 + "                 "
>                 + "                 "
>                 + "                 "
>                 + "\r" + prompt;
>             maskThread = new Thread()
>             {
>                 public void run() {
>                     while (!interrupted()) {
>                         try {
>                             Writer out = getOutput();
>                             out.write(fullPrompt);
> {code}
> So the {{prompt}} is null and {{mask}} is NOT in atleast 2 scenarios in 
> beeline. 
> when beeline's silent=true, prompt is null
> * 
> https://github.com/apache/hive/blob/master/beeline/src/java/org/apache/hive/beeline/BeeLine.java#L1264
> when running multiline queries
> * 
> https://github.com/apache/hive/blob/master/beeline/src/java/org/apache/hive/beeline/Commands.java#L1093
> When executing beeline in script mode (commands in a file), there should not 
> be any masking while reading lines from the script file. aka, entire line 
> should be a beeline command or part of a multiline hive query.
> So it should be safe to use a null mask instead of 
> {{ConsoleReader.NULL_MASK}} when using UnsupportedTerminal as jline terminal.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to