2021-01-16 18:55:07 +00:00
|
|
|
#!/usr/bin/env bash
|
2021-09-12 12:35:27 +00:00
|
|
|
# Tags: no-parallel
|
|
|
|
|
2021-01-16 18:55:07 +00:00
|
|
|
set -eu
|
|
|
|
|
|
|
|
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
|
|
# shellcheck source=../shell_config.sh
|
|
|
|
. "$CURDIR"/../shell_config.sh
|
|
|
|
|
2021-01-23 08:45:05 +00:00
|
|
|
# Data preparation.
|
2021-01-28 11:13:32 +00:00
|
|
|
# Now we can get the user_files_path by use the table file function for trick. also we can get it by query as:
|
2021-01-29 02:14:10 +00:00
|
|
|
# "insert into function file('exist.txt', 'CSV', 'val1 char') values ('aaaa'); select _path from file('exist.txt', 'CSV', 'val1 char')"
|
2021-04-14 16:35:17 +00:00
|
|
|
user_files_path=$(clickhouse-client --query "select _path,_file from file('nonexist.txt', 'CSV', 'val1 char')" 2>&1 | grep Exception | awk '{gsub("/nonexist.txt","",$9); print $9}')
|
2021-02-12 17:25:40 +00:00
|
|
|
|
2021-01-23 15:57:08 +00:00
|
|
|
mkdir -p ${user_files_path}/
|
|
|
|
echo -n aaaaaaaaa > ${user_files_path}/a.txt
|
|
|
|
echo -n bbbbbbbbb > ${user_files_path}/b.txt
|
|
|
|
echo -n ccccccccc > ${user_files_path}/c.txt
|
2021-01-16 18:55:07 +00:00
|
|
|
echo -n ccccccccc > /tmp/c.txt
|
2021-01-23 15:57:08 +00:00
|
|
|
mkdir -p ${user_files_path}/dir
|
2021-01-16 18:55:07 +00:00
|
|
|
|
2021-01-25 03:21:09 +00:00
|
|
|
|
2021-01-16 18:55:07 +00:00
|
|
|
### 1st TEST in CLIENT mode.
|
|
|
|
${CLICKHOUSE_CLIENT} --query "drop table if exists data;"
|
|
|
|
${CLICKHOUSE_CLIENT} --query "create table data (A String, B String) engine=MergeTree() order by A;"
|
|
|
|
|
|
|
|
|
|
|
|
# Valid cases:
|
2021-01-23 15:57:08 +00:00
|
|
|
${CLICKHOUSE_CLIENT} --query "select file('${user_files_path}/a.txt'), file('${user_files_path}/b.txt');";echo ":"$?
|
|
|
|
${CLICKHOUSE_CLIENT} --query "insert into data select file('${user_files_path}/a.txt'), file('${user_files_path}/b.txt');";echo ":"$?
|
|
|
|
${CLICKHOUSE_CLIENT} --query "insert into data select file('${user_files_path}/a.txt'), file('${user_files_path}/b.txt');";echo ":"$?
|
|
|
|
${CLICKHOUSE_CLIENT} --query "select file('${user_files_path}/c.txt'), * from data";echo ":"$?
|
2021-02-16 12:37:49 +00:00
|
|
|
${CLICKHOUSE_CLIENT} --multiquery --query "
|
|
|
|
create table filenames(name String) engine=MergeTree() order by tuple();
|
|
|
|
insert into filenames values ('a.txt'), ('b.txt'), ('c.txt');
|
|
|
|
select file(name) from filenames format TSV;
|
2021-02-16 12:40:09 +00:00
|
|
|
drop table if exists filenames;
|
2021-02-16 12:37:49 +00:00
|
|
|
"
|
2021-01-16 18:55:07 +00:00
|
|
|
|
|
|
|
# Invalid cases: (Here using sub-shell to catch exception avoiding the test quit)
|
|
|
|
# Test non-exists file
|
2021-01-23 15:57:08 +00:00
|
|
|
echo "clickhouse-client --query "'"select file('"'nonexist.txt'), file('${user_files_path}/b.txt')"'";echo :$?' | bash 2>/dev/null
|
2021-01-16 18:55:07 +00:00
|
|
|
# Test isDir
|
2021-01-23 15:57:08 +00:00
|
|
|
echo "clickhouse-client --query "'"select file('"'${user_files_path}/dir'), file('${user_files_path}/b.txt')"'";echo :$?' | bash 2>/dev/null
|
2021-01-16 18:55:07 +00:00
|
|
|
# Test path out of the user_files directory. It's not allowed in client mode
|
2021-01-23 15:57:08 +00:00
|
|
|
echo "clickhouse-client --query "'"select file('"'/tmp/c.txt'), file('${user_files_path}/b.txt')"'";echo :$?' | bash 2>/dev/null
|
2021-01-16 18:55:07 +00:00
|
|
|
|
2021-01-22 03:43:31 +00:00
|
|
|
# Test relative path consists of ".." whose absolute path is out of the user_files directory.
|
2021-07-14 14:35:26 +00:00
|
|
|
echo "clickhouse-client --query "'"select file('"'${user_files_path}/../../../../../../../../../../../../../../../../../../../tmp/c.txt'), file('b.txt')"'";echo :$?' | bash 2>/dev/null
|
2021-01-23 15:57:08 +00:00
|
|
|
echo "clickhouse-client --query "'"select file('"'../../../../a.txt'), file('${user_files_path}/b.txt')"'";echo :$?' | bash 2>/dev/null
|
2021-01-22 03:43:31 +00:00
|
|
|
|
2021-01-16 18:55:07 +00:00
|
|
|
|
|
|
|
### 2nd TEST in LOCAL mode.
|
|
|
|
|
|
|
|
echo -n aaaaaaaaa > a.txt
|
|
|
|
echo -n bbbbbbbbb > b.txt
|
|
|
|
echo -n ccccccccc > c.txt
|
2021-01-22 07:29:39 +00:00
|
|
|
mkdir -p dir
|
2021-01-16 18:55:07 +00:00
|
|
|
#Test for large files, with length : 699415
|
|
|
|
c_count=$(wc -c ${CURDIR}/01518_nullable_aggregate_states2.reference | awk '{print $1}')
|
|
|
|
echo $c_count
|
|
|
|
|
|
|
|
# Valid cases:
|
|
|
|
# The default dir is the CWD path in LOCAL mode
|
|
|
|
${CLICKHOUSE_LOCAL} --query "
|
|
|
|
drop table if exists data;
|
|
|
|
create table data (A String, B String) engine=MergeTree() order by A;
|
|
|
|
select file('a.txt'), file('b.txt');
|
|
|
|
insert into data select file('a.txt'), file('b.txt');
|
|
|
|
insert into data select file('a.txt'), file('b.txt');
|
|
|
|
select file('c.txt'), * from data;
|
|
|
|
select file('/tmp/c.txt'), * from data;
|
|
|
|
select $c_count, $c_count -length(file('${CURDIR}/01518_nullable_aggregate_states2.reference'))
|
|
|
|
"
|
|
|
|
echo ":"$?
|
|
|
|
|
|
|
|
|
|
|
|
# Invalid cases: (Here using sub-shell to catch exception avoiding the test quit)
|
|
|
|
# Test non-exists file
|
|
|
|
echo "clickhouse-local --query "'"select file('"'nonexist.txt'), file('b.txt')"'";echo :$?' | bash 2>/dev/null
|
|
|
|
|
|
|
|
# Test isDir
|
|
|
|
echo "clickhouse-local --query "'"select file('"'dir'), file('b.txt')"'";echo :$?' | bash 2>/dev/null
|
|
|
|
|
|
|
|
# Restore
|
|
|
|
rm -rf a.txt b.txt c.txt dir
|
2021-01-23 15:57:08 +00:00
|
|
|
rm -rf ${user_files_path}/a.txt
|
|
|
|
rm -rf ${user_files_path}/b.txt
|
|
|
|
rm -rf ${user_files_path}/c.txt
|
2021-01-16 18:55:07 +00:00
|
|
|
rm -rf /tmp/c.txt
|
2021-01-23 15:57:08 +00:00
|
|
|
rm -rf ${user_files_path}/dir
|