Skip to content

Commit

Permalink
Merge branch 'deprecate-clickhouse-tcp' of github.com:sundy-li/fuse-q…
Browse files Browse the repository at this point in the history
…uery into deprecate-clickhouse-tcp
  • Loading branch information
sundy-li committed Aug 5, 2022
2 parents 474cf71 + 093136a commit 512d596
Show file tree
Hide file tree
Showing 12 changed files with 358 additions and 3 deletions.
2 changes: 1 addition & 1 deletion .github/actions/artifact_failure/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ runs:
query/_logs*/
store/_logs*/
.databend/
query.log
query*.log
metasrv.log
nohup.out
36 changes: 36 additions & 0 deletions .github/actions/fuse_compat/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: "Test fuse-table format in an old query is compatible with new query"
description: "Download old binaries and current binaries, write data with old query, read data with new query"
inputs:
profile:
description: ""
required: true
default: "debug"
target:
description: ""
required: true
default: "x86_64-unknown-linux-gnu"
runs:
using: "composite"
steps:
- name: Setup Build Tool
uses: ./.github/actions/setup_build_tool

- name: Download artifact
uses: ./.github/actions/artifact_download
with:
profile: ${{ inputs.profile }}
sha: ${{ github.sha }}
target: ${{ inputs.target }}
path: ./bins/current

- name: Test compatibility
shell: bash
run: |
build-tool bash ./tests/fuse-compat/test-fuse-compat.sh 0.7.150
build-tool bash ./tests/fuse-compat/test-fuse-compat.sh 0.7.151
- name: Upload failure
if: failure()
uses: ./.github/actions/artifact_failure
with:
name: test-compat
8 changes: 8 additions & 0 deletions .github/workflows/dev-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,14 @@ jobs:
- uses: actions/checkout@v3
- uses: ./.github/actions/test_compat

fuse_compat:
timeout-minutes: 10
runs-on: [self-hosted, X64, Linux, development]
needs: build_gnu
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/fuse_compat

test_meta_cluster:
timeout-minutes: 10
runs-on: [self-hosted, X64, Linux, development]
Expand Down
8 changes: 7 additions & 1 deletion query/src/sql/optimizer/heuristic/prune_columns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,13 @@ impl ColumnPruner {
))
}
RelOperator::Project(p) => {
let used: ColumnSet = p.columns.intersection(&required).cloned().collect();
let mut used: ColumnSet = p.columns.intersection(&required).cloned().collect();
if used.is_empty() {
// Keep at least one column for project.
used.insert(*p.columns.iter().sorted().take(1).next().ok_or_else(|| {
ErrorCode::LogicalError("Invalid Project without output column")
})?);
}
Ok(SExpr::create_unary(
RelOperator::Project(Project {
columns: used.clone(),
Expand Down
5 changes: 5 additions & 0 deletions query/tests/it/sql/optimizer/heuristic/prune_columns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ pub async fn test_heuristic_optimizer_prune_columns() -> Result<()> {
query: "select name from system.functions order by example".to_string(),
rules: vec![],
},
Suite {
comment: "# Prune unused columns with cross join".to_string(),
query: "select t.number from numbers(10) t where exists(select * from numbers(10))".to_string(),
rules: vec![],
},
];

run_suites(ctx, &mut file, &suites, run_test).await
Expand Down
17 changes: 17 additions & 0 deletions query/tests/it/sql/optimizer/heuristic/testdata/prune_columns.test
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,20 @@ Project: [name (#0)]
Scan: default.system.functions


# Prune unused columns with cross join
select t.number from numbers(10) t where exists(select * from numbers(10))
----
Project: [number (#0)]
EvalScalar: [t.number (#0)]
Filter: [subquery_3 (#3)]
CrossJoin
Scan: default.system.numbers
Project: [subquery (#3)]
EvalScalar: [count(*) (#2) = 1]
Aggregate(Initial): group items: [], aggregate functions: [count(*)]
Limit: [1], Offset: [0]
Project: [number (#1)]
EvalScalar: [numbers.number (#1)]
Scan: default.system.numbers


Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ select t.number from numbers(1) as t where exists (select * from numbers(1) wher
Project: [number (#0)]
CrossJoin
Scan: default.system.numbers
Project: []
Project: [subquery (#3)]
Filter: [subquery_3 (#3)]
EvalScalar: [count(*) (#2) = 1]
Aggregate(Final): group items: [], aggregate functions: [count(*)]
Expand Down
31 changes: 31 additions & 0 deletions tests/fuse-compat/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Fuse table compatability test

This script tests whether a newer version databend-query can read fuse table data written
by a older version databend-query.

## Usage

```shell
tests/fuse-compat/test-fuse-compat.sh <old_ver>
```

E.g. `tests/fuse-compat/test-fuse-compat.sh 0.7.151` tests if the fuse-table written
by **databend-query-0.7.151** can be read by **current** version databend-qeury.

## Prerequisites

- Current version of databend-query and databend-meta must reside in `./bins`:
- `./bins/current/databend-query`
- `./bins/current/databend-meta`

Since building a binary takes several minutes,
this step is usually done by the calling process, e.g., the CI script.


## Testing data

- Suite `tests/fuse-compat/compat-logictest/fuse_compat_write` writes data into a fuse table via an old version query.
- Suite `tests/fuse-compat/compat-logictest/fuse_compat_read` reads the data via current version query.

Fuse table maintainers update these two `logictest` scripts to let the write/read
operations cover fuse-table features.
6 changes: 6 additions & 0 deletions tests/fuse-compat/compat-logictest/fuse_compat_read
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
statement query I
select a+b from t;

----
2
4
8 changes: 8 additions & 0 deletions tests/fuse-compat/compat-logictest/fuse_compat_write
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
statement ok
DROP TABLE IF EXISTS t;

statement ok
create table t(a int,b int) Engine = Fuse;

statement ok
insert into t values(1,1),(2,2);
228 changes: 228 additions & 0 deletions tests/fuse-compat/test-fuse-compat.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
#!/bin/sh

set -o errexit
SCRIPT_PATH="$(cd "$(dirname "$0")" >/dev/null 2>&1 && pwd)"
echo " === SCRIPT_PATH: $SCRIPT_PATH"
# go to work tree root
cd "$SCRIPT_PATH/../../"
ROOT="$(pwd)"
pwd

BUILD_PROFILE="${BUILD_PROFILE:-debug}"

query_config_path="scripts/ci/deploy/config/databend-query-node-1.toml"
logictest_path="tests/fuse-compat/compat-logictest"
bend_repo_url="https://github.com/datafuselabs/databend"

usage() {
echo " === Assert that latest query being compatible with an old version query on fuse-table format"
echo " === Expect ./bins/current contains current version binaries"
echo " === Usage: $0 <old_version>"
}

binary_url() {
local ver="$1"
echo "https://github.com/datafuselabs/databend/releases/download/v${ver}-nightly/databend-v${ver}-nightly-x86_64-unknown-linux-gnu.tar.gz"
}

# download a specific version of databend, untar it to folder `./bins/$ver`
# `ver` is semver without prefix `v` or `-nightly`
download_binary() {
local ver="$1"

local url="$(binary_url $ver)"
local fn="databend-$ver.tar.gz"

if [ -f ./bins/$ver/databend-query ]; then
echo " === binaries exist: $(ls ./bins/$ver/* | tr '\n' ' ')"
chmod +x ./bins/$ver/*
return
fi

if [ -f "$fn" ]; then
echo " === tar file exists: $fn"
else
echo " === Download binary ver: $ver"
echo " === Download binary url: $url"

curl -L "$url" >"$fn"
# or:
# wget -q "$url" -o "$fn"
fi

mkdir -p ./bins/$ver
tar -xf "$fn" -C ./bins/$ver

echo " === unpacked: ./bins/$ver:"
ls ./bins/$ver

chmod +x ./bins/$ver/*
}

# Clone only specified dir or file in the specified commit
git_partial_clone() {
local repo_url="$1"
local branch="$2"
local worktree_path="$3"
local local_path="$4"

echo " === Clone $repo_url@$branch:$worktree_path"
echo " === To $local_path/$worktree_path"

rm -rf "$local_path" || echo "no $local_path"

git clone \
-b "$branch" \
--depth 1 \
--filter=blob:none \
--sparse \
"$repo_url" \
"$local_path"

cd "$local_path"
git sparse-checkout set "$worktree_path"

echo " === Done clone from $repo_url@$branch:$worktree_path"

ls "$worktree_path"

}


# Run specified tests found in logic test suite dir
run_logictest()
{
local pattern="$1"

(
cd "tests/logictest"
python3 main.py --suites "$SCRIPT_PATH/compat-logictest" "$pattern"
)

}


kill_proc() {
local name="$1"

echo " === Kill $name ..."

killall "$name" || {
echo " === no "$name" to kill"
return
}

sleep 1

if test -n "$(pgrep $name)"; then
echo " === The $name is not killed. force killing."
killall -9 $name || echo " === no $Name to killall-9"
fi

echo " === Done kill $name"
}

# Test fuse-data compatibility between an old version query and the current
# version query.
run_test() {
local query_old_ver="$1"

echo " === Test with query-$query_old_ver and current query"

local query_old="./bins/$query_old_ver/bin/databend-query"
local query_new="./bins/current/databend-query"
local metasrv="./bins/current/databend-meta"


echo " === metasrv version:"
# TODO remove --single
"$metasrv" --single --cmd ver || echo " === no version yet"

echo " === old query version:"
"$query_old" --cmd ver || echo " === no version yet"

echo " === new query version:"
"$query_new" --cmd ver || echo " === no version yet"

sleep 1


kill_proc databend-query
kill_proc databend-meta

echo " === Clean meta dir"
rm -rf .databend || echo " === no dir to rm: .databend"

rm nohup.out || echo "no nohup.out"


echo ' === Start databend-meta...'

export RUST_BACKTRACE=1

nohup "$metasrv" --single --log-level=DEBUG &
python3 scripts/ci/wait_tcp.py --timeout 5 --port 9191


# Only run test on mysql handler
export DISABLE_HTTP_LOGIC_TEST=true
export DISABLE_CLICKHOUSE_LOGIC_TEST=true


echo ' === Start old databend-query...'

# (
# download_query_config "$query_old_ver" old_config/$query_old_ver
# )
# config_path="old_config/$query_old_ver/$query_config_path"
config_path="./bins/$query_old_ver/configs/databend-query.toml"


# TODO clean up data?
echo " === bring up $query_old"

nohup "$query_old" -c "$config_path" --log-level DEBUG --meta-endpoints "0.0.0.0:9191" >query-old.log &
python3 scripts/ci/wait_tcp.py --timeout 5 --port 3307

echo " === Run test: fuse_compat_write with old query"

# download_logictest $query_old_ver old_logictest/$query_old_ver
# run_logictest old_logictest/$query_old_ver fuse_compat_write
run_logictest fuse_compat_write


kill_proc databend-query


echo " === bring up new query "

config_path="$query_config_path"

nohup "$query_new" -c "$config_path" --log-level DEBUG --meta-endpoints "0.0.0.0:9191" >query-current.log &
python3 scripts/ci/wait_tcp.py --timeout 5 --port 3307


echo " === Run test: fuse_compat_read with current query"

# download_logictest $query_old_ver old_logictest
run_logictest fuse_compat_read
}

# -- main --

# The previous version to assert compatibility with
# e.g. old_query_ver="0.7.151"
old_query_ver="$1"


chmod +x ./bins/current/*

echo " === current metasrv ver: $(./bins/current/databend-meta --single --cmd ver | tr '\n' ' ')"
echo " === current query ver: $(./bins/current/databend-query --cmd ver | tr '\n' ' ')"
echo " === old query ver: $old_query_ver"

download_binary "$old_query_ver"

mkdir -p ./target/${BUILD_PROFILE}/

run_test $old_query_ver
Loading

0 comments on commit 512d596

Please sign in to comment.