Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better cli client #9790

Merged
merged 1 commit into from
Mar 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 13 additions & 4 deletions base/common/LineReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,19 @@ LineReader::Suggest::WordsRange LineReader::Suggest::getCompletions(const String
last_word = std::string_view(prefix).substr(last_word_pos + 1, std::string::npos);

/// last_word can be empty.
return std::equal_range(words.begin(), words.end(), last_word, [prefix_length](std::string_view s, std::string_view prefix_searched)
{
return strncasecmp(s.data(), prefix_searched.data(), prefix_length) < 0;
});

/// Only perform case sensitive completion when the prefix string contains any uppercase characters
if (std::none_of(prefix.begin(), prefix.end(), [&](auto c) { return c >= 'A' && c <= 'Z'; }))
return std::equal_range(
words_no_case.begin(), words_no_case.end(), last_word, [prefix_length](std::string_view s, std::string_view prefix_searched)
{
return strncasecmp(s.data(), prefix_searched.data(), prefix_length) < 0;
});
else
return std::equal_range(words.begin(), words.end(), last_word, [prefix_length](std::string_view s, std::string_view prefix_searched)
{
return strncmp(s.data(), prefix_searched.data(), prefix_length) < 0;
});
}

LineReader::LineReader(const String & history_file_path_, char extender_, char delimiter_)
Expand Down
1 change: 1 addition & 0 deletions base/common/LineReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class LineReader
using WordsRange = std::pair<Words::const_iterator, Words::const_iterator>;

Words words;
Words words_no_case;
std::atomic<bool> ready{false};

/// Get iterators for the matched range of words if any.
Expand Down
2 changes: 2 additions & 0 deletions base/common/ReadlineLineReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ ReadlineLineReader::ReadlineLineReader(const Suggest & suggest_, const String &

if (signal(SIGINT, clear_prompt_or_exit) == SIG_ERR)
throw std::runtime_error(std::string("Cannot set signal handler for readline: ") + strerror(errno));

rl_variable_bind("completion-ignore-case", "on");
}

ReadlineLineReader::~ReadlineLineReader()
Expand Down
2 changes: 1 addition & 1 deletion contrib/replxx
4 changes: 3 additions & 1 deletion dbms/programs/client/Suggest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ void Suggest::load(const ConnectionParameters & connection_parameters, size_t su

/// Note that keyword suggestions are available even if we cannot load data from server.

std::sort(words.begin(), words.end(), [](const std::string & str1, const std::string & str2)
std::sort(words.begin(), words.end());
words_no_case = words;
std::sort(words_no_case.begin(), words_no_case.end(), [](const std::string & str1, const std::string & str2)
{
return std::lexicographical_compare(begin(str1), end(str1), begin(str2), end(str2), [](const char char1, const char char2)
{
Expand Down