mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-14 19:45:11 +00:00
Merge pull request #71589 from Algunenano/positional_file
Allow using clickhouse with a file argument as --queries-file
This commit is contained in:
commit
87f3cea8b5
@ -1,27 +1,22 @@
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <base/phdr_cache.h>
|
||||
#include <Common/EnvironmentChecks.h>
|
||||
#include <Common/StringUtils.h>
|
||||
#include <Common/getHashOfLoadedBinary.h>
|
||||
|
||||
#include <new>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <utility> /// pair
|
||||
|
||||
#include <fmt/format.h>
|
||||
#if defined(SANITIZE_COVERAGE)
|
||||
# include <Common/Coverage.h>
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
#include "config_tools.h"
|
||||
|
||||
#include <Common/EnvironmentChecks.h>
|
||||
#include <Common/Coverage.h>
|
||||
#include <Common/StringUtils.h>
|
||||
#include <Common/getHashOfLoadedBinary.h>
|
||||
#include <Common/IO.h>
|
||||
|
||||
#include <base/phdr_cache.h>
|
||||
#include <base/coverage.h>
|
||||
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
#include <new>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <utility> /// pair
|
||||
#include <vector>
|
||||
|
||||
/// Universal executable for various clickhouse applications
|
||||
int mainEntryClickHouseServer(int argc, char ** argv);
|
||||
@ -238,9 +233,12 @@ int main(int argc_, char ** argv_)
|
||||
/// clickhouse # spawn local
|
||||
/// clickhouse local # spawn local
|
||||
/// clickhouse "select ..." # spawn local
|
||||
/// clickhouse /tmp/repro --enable-analyzer
|
||||
///
|
||||
if (main_func == printHelp && !argv.empty() && (argv.size() == 1 || argv[1][0] == '-'
|
||||
|| std::string_view(argv[1]).contains(' ')))
|
||||
std::error_code ec;
|
||||
if (main_func == printHelp && !argv.empty()
|
||||
&& (argv.size() == 1 || argv[1][0] == '-' || std::string_view(argv[1]).contains(' ')
|
||||
|| std::filesystem::is_regular_file(std::filesystem::path{argv[1]}, ec)))
|
||||
{
|
||||
main_func = mainEntryClickHouseLocal;
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
#include <Client/ClientApplicationBase.h>
|
||||
|
||||
#include <filesystem>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
@ -108,6 +110,7 @@ void ClientApplicationBase::parseAndCheckOptions(OptionsDescription & options_de
|
||||
{
|
||||
/// Two special cases for better usability:
|
||||
/// - if the option contains a whitespace, it might be a query: clickhouse "SELECT 1"
|
||||
/// - if the option is a filesystem file, then it's likely a queries file (clickhouse repro.sql)
|
||||
/// These are relevant for interactive usage - user-friendly, but questionable in general.
|
||||
/// In case of ambiguity or for scripts, prefer using proper options.
|
||||
|
||||
@ -115,8 +118,11 @@ void ClientApplicationBase::parseAndCheckOptions(OptionsDescription & options_de
|
||||
po::variable_value value(boost::any(op.value), false);
|
||||
|
||||
const char * option;
|
||||
std::error_code ec;
|
||||
if (token.contains(' '))
|
||||
option = "query";
|
||||
else if (std::filesystem::is_regular_file(std::filesystem::path{token}, ec))
|
||||
option = "queries-file";
|
||||
else
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Positional option `{}` is not supported.", token);
|
||||
|
||||
|
@ -0,0 +1,11 @@
|
||||
Hello from a file
|
||||
Hello from a file
|
||||
Hello from a file
|
||||
Hello from a file
|
||||
Hello from a file
|
||||
Hello from a file
|
||||
Hello from a file
|
||||
Hello from a file
|
||||
Hello from a file
|
||||
max_local_read_bandwidth 1 100
|
||||
max_local_read_bandwidth 1 200
|
33
tests/queries/0_stateless/03267_positional_arguments_implicit_query_file.sh
Executable file
33
tests/queries/0_stateless/03267_positional_arguments_implicit_query_file.sh
Executable file
@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env bash
|
||||
# Tags: no-random-settings
|
||||
|
||||
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CUR_DIR"/../shell_config.sh
|
||||
|
||||
FILE=${CLICKHOUSE_TMP}/${CLICKHOUSE_DATABASE}_without_extension
|
||||
echo "SELECT 'Hello from a file'" > ${FILE}
|
||||
|
||||
# Queries can be read from a file.
|
||||
${CLICKHOUSE_BINARY} --queries-file ${FILE}
|
||||
|
||||
# Or from stdin.
|
||||
${CLICKHOUSE_BINARY} < ${FILE}
|
||||
|
||||
# Also the positional argument can be interpreted as a file.
|
||||
${CLICKHOUSE_BINARY} ${FILE}
|
||||
|
||||
${CLICKHOUSE_LOCAL} --queries-file ${FILE}
|
||||
${CLICKHOUSE_LOCAL} < ${FILE}
|
||||
${CLICKHOUSE_LOCAL} ${FILE}
|
||||
|
||||
${CLICKHOUSE_CLIENT} --queries-file ${FILE}
|
||||
${CLICKHOUSE_CLIENT} < ${FILE}
|
||||
${CLICKHOUSE_CLIENT} ${FILE}
|
||||
|
||||
# Check that positional arguments work in any place
|
||||
echo "Select name, changed, value FROM system.settings where name = 'max_local_read_bandwidth'" > ${FILE}
|
||||
${CLICKHOUSE_BINARY} ${FILE} --max-local-read-bandwidth 100
|
||||
${CLICKHOUSE_BINARY} --max-local-read-bandwidth 200 ${FILE}
|
||||
|
||||
rm ${FILE}
|
Loading…
Reference in New Issue
Block a user