Matt Peterson created ACCUMULO-4336:
---------------------------------------
Summary: Command line interpreter escaping issues
Key: ACCUMULO-4336
URL: https://issues.apache.org/jira/browse/ACCUMULO-4336
Project: Accumulo
Issue Type: Bug
Components: shell
Reporter: Matt Peterson
Priority: Minor
To see the problem, add the following unit test. It will fail.
{code:title=ShellTest.java|borderStyle=solid}
Test
public void scanEscapedQuote() throws Exception {
exec("createtable test", true);
exec("insert \\\" f q v", true);
exec("scan", true, "\" f: q [] v"); // passes
exec("scan -e \\\"", true, "\" f: q [] v"); // fails
exec("deletetable test -f", true, "Table: [test] has been deleted");
}
{code}
It appears that the commons-cli library that is used for parsing commands will
strip the leading \" from the option's value and return an empty string.
{code:title=Parser.java, line 332|borderStyle=solid}
opt.addValueForProcessing(Util.stripLeadingAndTrailingQuotes(str));
{code}
For scans, an empty string as an end row will cause the scan to do nothing,
which is a reasonable way to fail.
For compactions, an empty string as an end row will cause the end row to be
ignored, which can lead to accidentally initiating a compaction over much of a
table. It is not possible to test the compaction issue with ShellTest because
MockTableOperationsImpl does not do anything with compactions. But the problem
code can be seen in the constructor for CompactRange:
{code:title=CompactRange.java|borderStyle=solid}
this.endRow = endRow.length == 0 ? null : endRow;
{code}
This code will treat an end row of \" as though there was no end row at all.
The workaround for this is to use the \x22 instead of \".
Additionally, some characters are not possible to include as either begin or
end rows. For example, a ! character cannot be escaped but without escaping
will crash the shell.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)