From 6135f27af0fd7abe2b65f505d863c174d9717a51 Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Wed, 4 Dec 2013 10:17:43 +0000 Subject: [PATCH] ClickHouse: added a test for PREWHERE. [#METR-9091] --- dbms/src/Storages/tests/prewhere_test.sh | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 dbms/src/Storages/tests/prewhere_test.sh diff --git a/dbms/src/Storages/tests/prewhere_test.sh b/dbms/src/Storages/tests/prewhere_test.sh new file mode 100755 index 00000000000..65449050ef1 --- /dev/null +++ b/dbms/src/Storages/tests/prewhere_test.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +if [ "$1" != '-n' ] +then + echo 'DROP DATABASE IF EXISTS pre' | clickhouse-client || exit 1 + echo 'CREATE DATABASE pre' | clickhouse-client || exit 2 + create_query="CREATE TABLE pre.__NAME__ (d0 Date, key UInt64, i64 Int64, s String, d Date, dt DateTime, f32 Float32, fs11 FixedString(11), ars Array(String), arui8 Array(UInt8), n Nested(ui16 UInt16, s String)) ENGINE=__ENGINE__" + insert_query="INSERT INTO pre.__NAME__ SELECT toDate('2014-01-01') AS d0, number AS key, toInt64(number + 11) AS i64, concat('upchk', toString(number * 2)) AS s, toDate(toUInt64(toDate('2014-01-01')) + number%(15*12) * 30) AS d, toDateTime(toUInt64(toDateTime('2014-01-01 00:00:00')) + number%(24*5000) * 3600) AS dt, toFloat32(number / 1048576) AS f32, toFixedString(concat('fix', toString(number * 3)), 11) AS fs11, arrayMap(x->concat('ars', toString(number + x)), arrayFilter(x->xtoUInt8(number * (x-3)), arrayFilter(x->x<=(number+1)%3, [0,1,2])) AS arui8, arrayMap(x->toUInt16((x+1)*number),arrayFilter(x->xtoString((x+100)*number),n) AS "'`'"n.s"'`'" FROM system.numbers LIMIT 12345678" + echo "$create_query" | sed "s/__ENGINE__/TinyLog/;s/__NAME__/b/" | clickhouse-client || exit 3 + echo "$create_query" | sed "s/__ENGINE__/MergeTree(d0, (key, key), 8192)/;s/__NAME__/t/" | clickhouse-client || exit 4 + echo "$insert_query" | sed "s/__NAME__/b/" | clickhouse-client || exit 5 + echo "$insert_query" | sed "s/__NAME__/t/" | clickhouse-client || exit 6 +fi +# 4 mark ranges (1) +query1="SELECT * FROM pre.__NAME__ WHERE (key > 9000 AND key < 100000 OR key > 200000 AND key < 1000000 OR key > 3000000 AND key < 8000000 OR key > 12000000)" +# 4 mark ranges, 5 random rows from each mark; should have about 1638 times less rows than (1) +query2="SELECT * FROM pre.__NAME__ WHERE (key > 9000 AND key < 100000 OR key > 200000 AND key < 1000000 OR key > 3000000 AND key < 8000000 OR key > 12000000) AND i64 * (intDiv(i64, 8192) % 4096 * 2 + 1) % 8192 IN (4167, 6420, 1003, 5006, 321)" +# 4 mark ranges, 1/4 random marks; should have about 4 times less rows than (1) +query3="SELECT * FROM pre.__NAME__ WHERE (key > 9000 AND key < 100000 OR key > 200000 AND key < 1000000 OR key > 3000000 AND key < 8000000 OR key > 12000000) AND intHash32(intDiv(i64, 8192)) % 4 = 0" +# 4 mark ranges, 1/4 random marks; should have about 4096 times less rows than (1) +query4="SELECT * FROM pre.__NAME__ WHERE (key > 9000 AND key < 100000 OR key > 200000 AND key < 1000000 OR key > 3000000 AND key < 8000000 OR key > 12000000) AND intHash32(intDiv(i64, 8192)) % 4 = 0 AND i64 * (intDiv(i64, 8192) % 4096 * 2 + 1) % 8192 IN (2953, 6677, 8135, 2971, 2435, 1961, 5976, 3184)" + +for i in {1..4} +do + eval query=\$query$i + echo "Query $i from TinyLog" + time echo "$query" | sed "s/__NAME__/b/" | clickhouse-client > r${i}b || exit 7 + echo "Query $i from MergeTree with WHERE" + time echo "$query" | sed "s/__NAME__/t/" | clickhouse-client > r${i}t || exit 8 + echo "Query $i from MergeTree with PREWHERE" + time echo "$query" | sed "s/WHERE/PREWHERE/" | sed "s/__NAME__/t/" | clickhouse-client > r${i}p || exit 8 + sort r${i}b > r${i}bs + sort r${i}t > r${i}ts + sort r${i}p > r${i}ps + diff -q r${i}bs r${i}ts + if [ $? -ne 0 ] + then + echo "TinyLog and MergeTree with WHERE differ on query $i" + exit 9 + fi + diff -q r${i}bs r${i}ps + if [ $? -ne 0 ] + then + echo "TinyLog and MergeTree with PREWHERE differ on query $i" + exit 10 + fi +done + +echo "Passed" +