2020-11-30 17:52:32 +00:00
#!/usr/bin/env bash
2024-08-08 14:49:33 +00:00
# Tags: no-fasttest
# no-fasttest: It's a bit demanding
2020-11-30 17:52:32 +00:00
2024-02-21 17:55:30 +00:00
# Creation of a database with Ordinary engine emits a warning.
CLICKHOUSE_CLIENT_SERVER_LOGS_LEVEL = fatal
2020-11-30 17:52:32 +00:00
CURDIR = $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd )
2020-12-28 11:46:53 +00:00
# shellcheck source=../shell_config.sh
2020-11-30 17:52:32 +00:00
. " $CURDIR " /../shell_config.sh
## tests with real clickhouse restart would be a bit to heavy,
2024-08-08 14:49:33 +00:00
## to ensure the table will not reappear back clickhouse-local is enough.
2020-11-30 17:52:32 +00:00
2024-08-08 14:49:33 +00:00
WORKING_FOLDER_01600 = " ${ CLICKHOUSE_TMP } / ${ CLICKHOUSE_TEST_UNIQUE_NAME } "
2020-11-30 17:52:32 +00:00
rm -rf " ${ WORKING_FOLDER_01600 } "
mkdir -p " ${ WORKING_FOLDER_01600 } "
clickhouse_local( ) {
local query = " $1 "
shift
2024-07-29 20:06:55 +00:00
${ CLICKHOUSE_LOCAL } --allow_deprecated_database_ordinary= 1 --query " $query " " $@ " --path= " ${ WORKING_FOLDER_01600 } "
2020-11-30 17:52:32 +00:00
}
test_detach_attach_sequence( ) {
local db = " $1 "
local table = " $2 "
2020-12-07 13:55:24 +00:00
echo "##################"
2020-11-30 17:52:32 +00:00
echo " ${ db } . ${ table } 1 "
# normal DETACH - while process is running (clickhouse-local here, same for server) table is detached.
clickhouse_local " DETACH TABLE ${ db } . ${ table } ; SELECT if( count() = 0, '>table detached!', '>Fail') FROM system.tables WHERE database=' ${ db } ' AND name=' ${ table } '; "
# but once we restart the precess (either clickhouse-local either clickhouse server) the table is back.
echo " ${ db } . ${ table } 2 "
clickhouse_local " SELECT if(name=' ${ table } ', '>Table is back after restart', '>fail') FROM system.tables WHERE database=' ${ db } ' AND name=' ${ table } '; SELECT count() FROM ${ db } . ${ table } ; "
# permanent DETACH - table is detached, and metadata file renamed, prevening further attach
echo " ${ db } . ${ table } 3 "
clickhouse_local " DETACH TABLE ${ db } . ${ table } PERMANENTLY; SELECT if( count() = 0, '>table detached (permanently)!', '>Fail') FROM system.tables WHERE database=' ${ db } ' AND name=' ${ table } '; "
# still detached after restart
echo " ${ db } . ${ table } 4 "
clickhouse_local " SELECT if( count() = 0, '>table is still detached (after restart)!', '>Fail') FROM system.tables WHERE database=' ${ db } ' AND name=' ${ table } '; "
# but can be reattached
echo " ${ db } . ${ table } 5 "
clickhouse_local " ATTACH TABLE ${ db } . ${ table } ; SELECT if(name=' ${ table } ', '>Table is back after attach', '>fail') FROM system.tables WHERE database=' ${ db } ' AND name=' ${ table } '; "
echo " ${ db } . ${ table } 6 "
clickhouse_local " SELECT count() FROM ${ db } . ${ table } ; "
}
2020-12-07 13:55:24 +00:00
echo "##################"
echo "setup env"
2020-11-30 17:52:32 +00:00
clickhouse_local "DROP DATABASE IF EXISTS db_ordinary SYNC;"
clickhouse_local "DROP DATABASE IF EXISTS db_atomic SYNC;"
clickhouse_local "CREATE DATABASE db_ordinary Engine=Ordinary"
clickhouse_local "CREATE DATABASE db_atomic Engine=Atomic"
clickhouse_local "CREATE TABLE db_ordinary.log_table Engine=Log AS SELECT * FROM numbers(10)"
clickhouse_local "CREATE TABLE db_ordinary.mt_table Engine=MergeTree ORDER BY tuple() AS SELECT * FROM numbers(10)"
clickhouse_local "CREATE TABLE db_ordinary.null_table Engine=Null AS SELECT * FROM numbers(10)"
clickhouse_local "CREATE TABLE db_atomic.log_table Engine=Log AS SELECT * FROM numbers(10)"
clickhouse_local "CREATE TABLE db_atomic.mt_table Engine=MergeTree ORDER BY tuple() AS SELECT * FROM numbers(10)"
clickhouse_local "CREATE TABLE db_atomic.null_table Engine=Null AS SELECT * FROM numbers(10)"
test_detach_attach_sequence "db_ordinary" "log_table"
test_detach_attach_sequence "db_ordinary" "mt_table"
test_detach_attach_sequence "db_ordinary" "null_table"
test_detach_attach_sequence "db_atomic" "log_table"
test_detach_attach_sequence "db_atomic" "mt_table"
2020-12-07 13:55:24 +00:00
test_detach_attach_sequence "db_atomic" "null_table"
echo "##################"
echo "test for MV"
clickhouse_local "CREATE TABLE db_ordinary.src Engine=Null AS system.numbers"
clickhouse_local "CREATE TABLE db_ordinary.dst Engine=Log AS system.numbers"
clickhouse_local "CREATE MATERIALIZED VIEW db_ordinary.src2dst_mv_to TO db_ordinary.dst AS SELECT * FROM db_ordinary.src"
clickhouse_local "INSERT INTO db_ordinary.src SELECT * FROM numbers(10)"
clickhouse_local "SELECT if(count() = 10, 'MV is working', 'MV failed') from db_ordinary.dst;"
clickhouse_local "DETACH VIEW db_ordinary.src2dst_mv_to; INSERT INTO db_ordinary.src SELECT * FROM numbers(10)"
clickhouse_local "SELECT if(count() = 10, 'Usual detach works immediately till restart', 'Usual detach failed') from db_ordinary.dst;"
clickhouse_local "INSERT INTO db_ordinary.src SELECT * FROM numbers(10)"
clickhouse_local "SELECT if(count() = 20, 'Usual detach activates after restart', 'Usual detach reactivation failed') from db_ordinary.dst;"
clickhouse_local "DETACH VIEW db_ordinary.src2dst_mv_to PERMANENTLY; INSERT INTO db_ordinary.src SELECT * FROM numbers(10)"
clickhouse_local "SELECT if(count() = 20, 'Permanent detach works immediately', 'Permanent detach failed') from db_ordinary.dst;"
clickhouse_local "INSERT INTO db_ordinary.src SELECT * FROM numbers(10)"
clickhouse_local "SELECT if(count() = 20, 'Permanent detach still works after restart', 'Permanent detach reactivated!') from db_ordinary.dst;"
## Quite silly: ATTACH MATERIALIZED VIEW don't work with short syntax (w/o select), but i can attach it using ATTACH TABLE ...
clickhouse_local "ATTACH TABLE db_ordinary.src2dst_mv_to"
clickhouse_local "INSERT INTO db_ordinary.src SELECT * FROM numbers(10)"
clickhouse_local "SELECT if(count() = 30, 'View can be reattached', 'can not reattach permanently detached view') from db_ordinary.dst;"
clickhouse_local "DROP VIEW db_ordinary.src2dst_mv_to SYNC"
echo "##################"
echo "test for MV with inner table"
clickhouse_local "CREATE MATERIALIZED VIEW db_ordinary.src_mv_with_inner Engine=Log AS SELECT * FROM db_ordinary.src"
clickhouse_local "INSERT INTO db_ordinary.src SELECT * FROM numbers(10)"
clickhouse_local "SELECT if(count() = 10, 'MV is working', 'MV failed') FROM db_ordinary.src_mv_with_inner"
clickhouse_local "DETACH VIEW db_ordinary.src_mv_with_inner PERMANENTLY; INSERT INTO db_ordinary.src SELECT * FROM numbers(10)" --stacktrace
2024-07-12 12:49:26 +00:00
clickhouse_local "SELECT if(count() = 10, 'MV can be detached permanently', 'MV detach failed') FROM db_ordinary.src_mv_with_inner SETTINGS enable_analyzer = 0" 2>& 1 | grep -c "db_ordinary.src_mv_with_inner does not exist"
clickhouse_local "SELECT if(count() = 10, 'MV can be detached permanently', 'MV detach failed') FROM db_ordinary.src_mv_with_inner SETTINGS enable_analyzer = 1" 2>& 1 | grep -c "Unknown table expression identifier 'db_ordinary.src_mv_with_inner'"
2024-03-21 14:07:56 +00:00
2020-12-07 13:55:24 +00:00
## Quite silly: ATTACH MATERIALIZED VIEW don't work with short syntax (w/o select), but i can attach it using ATTACH TABLE ...
clickhouse_local "ATTACH TABLE db_ordinary.src_mv_with_inner"
clickhouse_local "INSERT INTO db_ordinary.src SELECT * FROM numbers(10)"
clickhouse_local "SELECT if(count() = 20, 'View can be reattached', 'can not reattach permanently detached view') from db_ordinary.src_mv_with_inner;"
## clickhouse_local can't work with dicts...
# mkdir -p "${WORKING_FOLDER_01600}/user_files"
# echo "1" > "${WORKING_FOLDER_01600}/user_files/dummy_dict.tsv"
# clickhouse_local "DROP DICTIONARY db_ordinary.dummy; CREATE DICTIONARY db_ordinary.dummy (id UInt64) PRIMARY KEY id LAYOUT(FLAT()) SOURCE(FILE(path 'dummy_dict.tsv' format 'TabSeparated')) LIFETIME(MIN 1 MAX 10); DETACH DICTIONARY db_ordinary.dummy PERMANENTLY; SELECT dictGet('db_ordinary.dummy','val',toUInt64(1));"
echo "##################"
echo "DETACH DATABASE is not implemented (proper error)"
clickhouse_local "DETACH DATABASE db_ordinary PERMANENTLY;" 2>& 1 | grep -c 'DETACH PERMANENTLY is not implemented'
# clean up
rm -rf " ${ WORKING_FOLDER_01600 } "