Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
d4445485
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
d4445485
编写于
4月 03, 2020
作者:
A
Alexander Kuzmenkov
提交者:
GitHub
4月 03, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10028 from ClickHouse/aku/perftest-fixes
Performance comparison fixes
上级
eea9845f
882e0d8b
变更
6
展开全部
隐藏空白更改
内联
并排
Showing
6 changed file
with
301 addition
and
253 deletion
+301
-253
docker/test/performance-comparison/compare.sh
docker/test/performance-comparison/compare.sh
+17
-7
docker/test/performance-comparison/entrypoint.sh
docker/test/performance-comparison/entrypoint.sh
+9
-3
docker/test/performance-comparison/report.py
docker/test/performance-comparison/report.py
+255
-192
tests/performance/analyze_array_tuples.xml
tests/performance/analyze_array_tuples.xml
+1
-11
tests/performance/array_fill.xml
tests/performance/array_fill.xml
+6
-14
tests/performance/concat_hits.xml
tests/performance/concat_hits.xml
+13
-26
未找到文件。
docker/test/performance-comparison/compare.sh
浏览文件 @
d4445485
...
...
@@ -97,10 +97,6 @@ function run_tests
touch
"
$x
"
done
# FIXME remove some broken long tests
rm
"
$test_prefix
"
/
{
IPv4,IPv6,modulo,parse_engine_file,number_formatting_formats,select_format
}
.xml
||
:
test_files
=
$(
ls
"
$test_prefix
"
/
*
.xml
)
# FIXME a quick crutch to bring the run time down for the unstable tests --
# if some performance tests xmls were changed in a PR, run only these ones.
...
...
@@ -126,6 +122,17 @@ function run_tests
test_files
=
$(
ls
"
$test_prefix
"
/
$CHPC_TEST_GLOB
.xml
)
fi
if
[
"
$test_files
"
==
""
]
then
# FIXME remove some broken long tests
for
test_name
in
{
IPv4,IPv6,modulo,parse_engine_file,number_formatting_formats,select_format,arithmetic,cryptographic_hashes,logical_functions_
{
medium,small
}}
do
printf
"
$test_name
\t
Marked as broken (see compare.sh)
\n
"
>>
skipped-tests.tsv
rm
"
$test_prefix
/
$test_name
.xml"
||
:
done
test_files
=
$(
ls
"
$test_prefix
"
/
*
.xml
)
fi
# Run the tests.
test_name
=
"<none>"
for
test
in
$test_files
...
...
@@ -275,9 +282,11 @@ create table test_times_tsv engine File(TSV, 'test-times.tsv') as
from test_time join wall_clock using test
order by avg_real_per_query desc;
create table all_queries_tsv engine File(TSV, 'all-queries.tsv') as
select left, right, diff, rd, test, query
from queries order by rd[3] desc;
create table all_tests_tsv engine File(TSV, 'all-queries.tsv') as
select left, right, diff,
floor(left > right ? left / right : right / left, 3),
rd, test, query
from queries order by test, query;
"
2>
>(
head
-2
>>
report-errors.rep
)
||
:
for
version
in
{
right,left
}
...
...
@@ -429,6 +438,7 @@ case "$stage" in
"report"
)
time
report
||
:
time
"
$script_dir
/report.py"
--report
=
all-queries
>
all-queries.html 2>
>(
head
-2
>>
report-errors.rep
)
||
:
time
"
$script_dir
/report.py"
>
report.html
;
&
esac
docker/test/performance-comparison/entrypoint.sh
浏览文件 @
d4445485
...
...
@@ -90,17 +90,23 @@ export PYTHONIOENCODING=utf-8
# Use a default number of runs if not told otherwise
export
CHPC_RUNS
=
${
CHPC_RUNS
:-
7
}
# By default, use the main comparison script from the tested package, so that we
# can change it in PRs.
script_path
=
"right/scripts"
if
[
-v
CHPC_LOCAL_SCRIPT
]
then
script_path
=
".."
fi
# Even if we have some errors, try our best to save the logs.
set
+e
# Use main comparison script from the tested package, so that we can change it
# in PRs.
# Older version use 'kill 0', so put the script into a separate process group
# FIXME remove set +m in April 2020
set
+m
{
\
time
../download.sh
"
$REF_PR
"
"
$REF_SHA
"
"
$PR_TO_TEST
"
"
$SHA_TO_TEST
"
&&
\
time
stage
=
configure
right/scripts
/compare.sh
;
\
time
stage
=
configure
"
$script_path
"
/compare.sh
;
\
}
2>&1 | ts
"
$(
printf
'%%Y-%%m-%%d %%H:%%M:%%S\t'
)
"
|
tee
compare.log
set
-m
...
...
docker/test/performance-comparison/report.py
浏览文件 @
d4445485
#!/usr/bin/python3
import
argparse
import
ast
import
collections
import
csv
...
...
@@ -8,6 +9,11 @@ import os
import
sys
import
traceback
parser
=
argparse
.
ArgumentParser
(
description
=
'Create performance test report'
)
parser
.
add_argument
(
'--report'
,
default
=
'main'
,
choices
=
[
'main'
,
'all-queries'
],
help
=
'Which report to build'
)
args
=
parser
.
parse_args
()
report_errors
=
[]
error_tests
=
0
slow_average_tests
=
0
...
...
@@ -16,7 +22,7 @@ slower_queries = 0
unstable_queries
=
0
very_unstable_queries
=
0
print
(
"""
header_template
=
"""
<!DOCTYPE html>
<html>
<style>
...
...
@@ -56,7 +62,7 @@ tr:nth-child(odd) td {{filter: brightness(95%);}}
<div class="main">
<h1>ClickHouse performance comparison</h1>
"""
.
format
())
"""
table_anchor
=
0
row_anchor
=
0
...
...
@@ -133,195 +139,252 @@ def printSimpleTable(caption, columns, rows):
print
(
tableRow
(
row
))
print
(
tableEnd
())
printSimpleTable
(
'Tested commits'
,
[
'Old'
,
'New'
],
[[
'<pre>{}</pre>'
.
format
(
x
)
for
x
in
[
open
(
'left-commit.txt'
).
read
(),
open
(
'right-commit.txt'
).
read
()]]])
def
print_changes
():
rows
=
tsvRows
(
'changed-perf.tsv'
)
if
not
rows
:
return
global
faster_queries
,
slower_queries
print
(
tableStart
(
'Changes in performance'
))
columns
=
[
'Old, s'
,
# 0
'New, s'
,
# 1
'Relative difference (new - old)/old'
,
# 2
'Randomization distribution quantiles
\
[5%, 50%, 95%, 99%]'
,
# 3
'Test'
,
# 4
'Query'
,
# 5
if
args
.
report
==
'main'
:
print
(
header_template
.
format
())
printSimpleTable
(
'Tested commits'
,
[
'Old'
,
'New'
],
[[
'<pre>{}</pre>'
.
format
(
x
)
for
x
in
[
open
(
'left-commit.txt'
).
read
(),
open
(
'right-commit.txt'
).
read
()]]])
def
print_changes
():
rows
=
tsvRows
(
'changed-perf.tsv'
)
if
not
rows
:
return
global
faster_queries
,
slower_queries
print
(
tableStart
(
'Changes in performance'
))
columns
=
[
'Old, s'
,
# 0
'New, s'
,
# 1
'Relative difference (new - old)/old'
,
# 2
'Randomization distribution quantiles
\
[5%, 50%, 95%, 99%]'
,
# 3
'Test'
,
# 4
'Query'
,
# 5
]
print
(
tableHeader
(
columns
))
attrs
=
[
''
for
c
in
columns
]
for
row
in
rows
:
if
float
(
row
[
2
])
<
0.
:
faster_queries
+=
1
attrs
[
2
]
=
'style="background: #adbdff"'
else
:
slower_queries
+=
1
attrs
[
2
]
=
'style="background: #ffb0a0"'
print
(
tableRow
(
row
,
attrs
))
print
(
tableEnd
())
print_changes
()
slow_on_client_rows
=
tsvRows
(
'slow-on-client.tsv'
)
error_tests
+=
len
(
slow_on_client_rows
)
printSimpleTable
(
'Slow on client'
,
[
'Client time, s'
,
'Server time, s'
,
'Ratio'
,
'Query'
],
slow_on_client_rows
)
def
print_unstable_queries
():
global
unstable_queries
global
very_unstable_queries
unstable_rows
=
tsvRows
(
'unstable-queries.tsv'
)
if
not
unstable_rows
:
return
unstable_queries
+=
len
(
unstable_rows
)
columns
=
[
'Old, s'
,
#0
'New, s'
,
#1
'Relative difference (new - old)/old'
,
#2
'Randomization distribution quantiles [5%, 50%, 95%, 99%]'
,
#3
'Test'
,
#4
'Query'
#5
]
print
(
tableHeader
(
columns
))
attrs
=
[
''
for
c
in
columns
]
for
row
in
rows
:
if
float
(
row
[
2
])
<
0.
:
faster_queries
+=
1
attrs
[
2
]
=
'style="background: #adbdff"'
else
:
slower_queries
+=
1
attrs
[
2
]
=
'style="background: #ffb0a0"'
print
(
tableRow
(
row
,
attrs
))
print
(
tableEnd
())
print_changes
()
slow_on_client_rows
=
tsvRows
(
'slow-on-client.tsv'
)
error_tests
+=
len
(
slow_on_client_rows
)
printSimpleTable
(
'Slow on client'
,
[
'Client time, s'
,
'Server time, s'
,
'Ratio'
,
'Query'
],
slow_on_client_rows
)
def
print_unstable_queries
():
global
unstable_queries
global
very_unstable_queries
unstable_rows
=
tsvRows
(
'unstable-queries.tsv'
)
if
not
unstable_rows
:
return
unstable_queries
+=
len
(
unstable_rows
)
columns
=
[
'Old, s'
,
#0
'New, s'
,
#1
'Relative difference (new - old)/old'
,
#2
'Randomization distribution quantiles [5%, 50%, 95%, 99%]'
,
#3
'Test'
,
#4
'Query'
#5
]
print
(
tableStart
(
'Unstable queries'
))
print
(
tableHeader
(
columns
))
attrs
=
[
''
for
c
in
columns
]
for
r
in
unstable_rows
:
rd
=
ast
.
literal_eval
(
r
[
3
])
# Note the zero-based array index, this is rd[3] in SQL.
if
rd
[
2
]
>
0.2
:
very_unstable_queries
+=
1
attrs
[
3
]
=
'style="background: #ffb0a0"'
else
:
attrs
[
3
]
=
''
print
(
tableRow
(
r
,
attrs
))
print
(
tableEnd
())
print_unstable_queries
()
run_error_rows
=
tsvRows
(
'run-errors.tsv'
)
error_tests
+=
len
(
run_error_rows
)
printSimpleTable
(
'Run errors'
,
[
'Test'
,
'Error'
],
run_error_rows
)
skipped_tests_rows
=
tsvRows
(
'skipped-tests.tsv'
)
printSimpleTable
(
'Skipped tests'
,
[
'Test'
,
'Reason'
],
skipped_tests_rows
)
printSimpleTable
(
'Tests with most unstable queries'
,
[
'Test'
,
'Unstable'
,
'Changed perf'
,
'Total not OK'
],
tsvRows
(
'bad-tests.tsv'
))
def
print_test_times
():
global
slow_average_tests
rows
=
tsvRows
(
'test-times.tsv'
)
if
not
rows
:
return
columns
=
[
'Test'
,
#0
'Wall clock time, s'
,
#1
'Total client time, s'
,
#2
'Total queries'
,
#3
'Ignored short queries'
,
#4
'Longest query<br>(sum for all runs), s'
,
#5
'Avg wall clock time<br>(sum for all runs), s'
,
#6
'Shortest query<br>(sum for all runs), s'
,
#7
]
print
(
tableStart
(
'Test times'
))
print
(
tableHeader
(
columns
))
attrs
=
[
''
for
c
in
columns
]
for
r
in
rows
:
if
float
(
r
[
6
])
>
22
:
# FIXME should be 15s max -- investigate parallel_insert
slow_average_tests
+=
1
attrs
[
6
]
=
'style="background: #ffb0a0"'
else
:
attrs
[
6
]
=
''
if
float
(
r
[
5
])
>
30
:
slow_average_tests
+=
1
attrs
[
5
]
=
'style="background: #ffb0a0"'
else
:
attrs
[
5
]
=
''
print
(
tableRow
(
r
,
attrs
))
print
(
tableEnd
())
print_test_times
()
# Add the errors reported by various steps of comparison script
report_errors
+=
[
l
.
strip
()
for
l
in
open
(
'report-errors.rep'
)]
if
len
(
report_errors
):
print
(
tableStart
(
'Errors while building the report'
))
print
(
tableHeader
([
'Error'
]))
for
x
in
report_errors
:
print
(
tableRow
([
x
]))
print
(
tableEnd
())
print
(
"""
<p class="links">
<a href="output.7z">Test output</a>
<a href="compare.log">Log</a>
</p>
</body>
</html>
"""
)
status
=
'success'
message
=
'See the report'
message_array
=
[]
if
slow_average_tests
:
status
=
'failure'
message_array
.
append
(
str
(
slow_average_tests
)
+
' too long'
)
if
faster_queries
:
message_array
.
append
(
str
(
faster_queries
)
+
' faster'
)
if
slower_queries
:
status
=
'failure'
message_array
.
append
(
str
(
slower_queries
)
+
' slower'
)
if
unstable_queries
:
message_array
.
append
(
str
(
unstable_queries
)
+
' unstable'
)
if
very_unstable_queries
:
status
=
'failure'
error_tests
+=
slow_average_tests
if
error_tests
:
status
=
'failure'
message_array
.
append
(
str
(
error_tests
)
+
' errors'
)
if
message_array
:
message
=
', '
.
join
(
message_array
)
if
report_errors
:
status
=
'failure'
message
=
'Errors while building the report.'
print
(
"""
<!--status: {status}-->
<!--message: {message}-->
"""
.
format
(
status
=
status
,
message
=
message
))
print
(
tableStart
(
'Unstable queries'
))
print
(
tableHeader
(
columns
))
attrs
=
[
''
for
c
in
columns
]
for
r
in
unstable_rows
:
rd
=
ast
.
literal_eval
(
r
[
3
])
# Note the zero-based array index, this is rd[3] in SQL.
if
rd
[
2
]
>
0.2
:
very_unstable_queries
+=
1
attrs
[
3
]
=
'style="background: #ffb0a0"'
else
:
attrs
[
3
]
=
''
print
(
tableRow
(
r
,
attrs
))
print
(
tableEnd
())
print_unstable_queries
()
run_error_rows
=
tsvRows
(
'run-errors.tsv'
)
error_tests
+=
len
(
run_error_rows
)
printSimpleTable
(
'Run errors'
,
[
'Test'
,
'Error'
],
run_error_rows
)
skipped_tests_rows
=
tsvRows
(
'skipped-tests.tsv'
)
printSimpleTable
(
'Skipped tests'
,
[
'Test'
,
'Reason'
],
skipped_tests_rows
)
printSimpleTable
(
'Tests with most unstable queries'
,
[
'Test'
,
'Unstable'
,
'Changed perf'
,
'Total not OK'
],
tsvRows
(
'bad-tests.tsv'
))
def
print_test_times
():
global
slow_average_tests
rows
=
tsvRows
(
'test-times.tsv'
)
if
not
rows
:
return
columns
=
[
'Test'
,
#0
'Wall clock time, s'
,
#1
'Total client time, s'
,
#2
'Total queries'
,
#3
'Ignored short queries'
,
#4
'Longest query<br>(sum for all runs), s'
,
#5
'Avg wall clock time<br>(sum for all runs), s'
,
#6
'Shortest query<br>(sum for all runs), s'
,
#7
]
print
(
tableStart
(
'Test times'
))
print
(
tableHeader
(
columns
))
attrs
=
[
''
for
c
in
columns
]
for
r
in
rows
:
if
float
(
r
[
6
])
>
22
:
# FIXME should be 15s max -- investigate parallel_insert
slow_average_tests
+=
1
attrs
[
6
]
=
'style="background: #ffb0a0"'
else
:
attrs
[
6
]
=
''
if
float
(
r
[
5
])
>
30
:
slow_average_tests
+=
1
attrs
[
5
]
=
'style="background: #ffb0a0"'
else
:
attrs
[
5
]
=
''
print
(
tableRow
(
r
,
attrs
))
print
(
tableEnd
())
print_test_times
()
# Add the errors reported by various steps of comparison script
report_errors
+=
[
l
.
strip
()
for
l
in
open
(
'report-errors.rep'
)]
if
len
(
report_errors
):
print
(
tableStart
(
'Errors while building the report'
))
print
(
tableHeader
([
'Error'
]))
for
x
in
report_errors
:
print
(
tableRow
([
x
]))
print
(
tableEnd
())
print
(
"""
<p class="links">
<a href="output.7z">Test output</a>
<a href="all-queries.html">All queries</a>
<a href="compare.log">Log</a>
</p>
</body>
</html>
"""
)
status
=
'success'
message
=
'See the report'
message_array
=
[]
if
slow_average_tests
:
status
=
'failure'
message_array
.
append
(
str
(
slow_average_tests
)
+
' too long'
)
if
faster_queries
:
message_array
.
append
(
str
(
faster_queries
)
+
' faster'
)
if
slower_queries
:
status
=
'failure'
message_array
.
append
(
str
(
slower_queries
)
+
' slower'
)
if
unstable_queries
:
message_array
.
append
(
str
(
unstable_queries
)
+
' unstable'
)
if
very_unstable_queries
:
status
=
'failure'
error_tests
+=
slow_average_tests
if
error_tests
:
status
=
'failure'
message_array
.
append
(
str
(
error_tests
)
+
' errors'
)
if
message_array
:
message
=
', '
.
join
(
message_array
)
if
report_errors
:
status
=
'failure'
message
=
'Errors while building the report.'
print
(
"""
<!--status: {status}-->
<!--message: {message}-->
"""
.
format
(
status
=
status
,
message
=
message
))
elif
args
.
report
==
'all-queries'
:
print
(
header_template
.
format
())
printSimpleTable
(
'Tested commits'
,
[
'Old'
,
'New'
],
[[
'<pre>{}</pre>'
.
format
(
x
)
for
x
in
[
open
(
'left-commit.txt'
).
read
(),
open
(
'right-commit.txt'
).
read
()]]])
def
print_all_queries
():
rows
=
tsvRows
(
'all-queries.tsv'
)
if
not
rows
:
return
columns
=
[
'Old, s'
,
#0
'New, s'
,
#1
'Relative difference (new - old)/old'
,
#2
'Times speedup/slowdown'
,
#3
'Randomization distribution quantiles
\
[5%, 50%, 95%, 99%]'
,
#4
'Test'
,
#5
'Query'
,
#6
]
print
(
tableStart
(
'All query times'
))
print
(
tableHeader
(
columns
))
attrs
=
[
''
for
c
in
columns
]
for
r
in
rows
:
if
float
(
r
[
2
])
>
0.05
:
attrs
[
3
]
=
'style="background: #ffb0a0"'
elif
float
(
r
[
2
])
<
-
0.05
:
attrs
[
3
]
=
'style="background: #adbdff"'
else
:
attrs
[
3
]
=
''
print
(
tableRow
(
r
,
attrs
))
print
(
tableEnd
())
print_all_queries
()
print
(
"""
<p class="links">
<a href="output.7z">Test output</a>
<a href="report.html">Main report</a>
<a href="compare.log">Log</a>
</p>
</body>
</html>
"""
)
tests/performance/analyze_array_tuples.xml
浏览文件 @
d4445485
此差异已折叠。
点击以展开。
tests/performance/array_fill.xml
浏览文件 @
d4445485
<test>
<stop_conditions>
<all_of>
<total_time_ms>
10000
</total_time_ms>
</all_of>
</stop_conditions>
<query>
SELECT arraySlice(arrayFill(x -> ((x % 2) >= 0), range(100000000)), 1, 10)
</query>
<query>
SELECT arraySlice(arrayFill(x -> (((x.1) % 2) >= 0), arrayMap(x -> (x, toString(x)), range(100000000))), 1, 10)
</query>
<query>
SELECT arraySlice(arrayFill(x -> ((x % 2) >= 2), range(100000000)), 1, 10)
</query>
<query>
SELECT arraySlice(arrayFill(x -> (((x.1) % 2) >= 2), arrayMap(x -> (x, toString(x)), range(100000000))), 1, 10)
</query>
<query>
SELECT arraySlice(arrayFill(x -> ((x % 2) = 0), range(100000000)), 1, 10)
</query>
<query>
SELECT arraySlice(arrayFill(x -> (((x.1) % 2) = 0), arrayMap(x -> (x, toString(x)), range(100000000))), 1, 10)
</query>
<query>
SELECT arraySlice(arrayFill(x -> ((x % 2) >= 0), range(100000000)), 1, 10) FORMAT Null
</query>
<query>
SELECT arraySlice(arrayFill(x -> (((x.1) % 2) >= 0), arrayMap(x -> (x, toString(x)), range(100000000))), 1, 10) FORMAT Null
</query>
<query>
SELECT arraySlice(arrayFill(x -> ((x % 2) >= 2), range(100000000)), 1, 10) FORMAT Null
</query>
<query>
SELECT arraySlice(arrayFill(x -> (((x.1) % 2) >= 2), arrayMap(x -> (x, toString(x)), range(100000000))), 1, 10) FORMAT Null
</query>
<query>
SELECT arraySlice(arrayFill(x -> ((x % 2) = 0), range(100000000)), 1, 10) FORMAT Null
</query>
<query>
SELECT arraySlice(arrayFill(x -> (((x.1) % 2) = 0), arrayMap(x -> (x, toString(x)), range(100000000))), 1, 10) FORMAT Null
</query>
</test>
tests/performance/concat_hits.xml
浏览文件 @
d4445485
<test>
<stop_conditions>
<all_of>
<iterations>
5
</iterations>
<min_time_not_changing_for_ms>
10000
</min_time_not_changing_for_ms>
</all_of>
<any_of>
<iterations>
50
</iterations>
<total_time_ms>
60000
</total_time_ms>
</any_of>
</stop_conditions>
<preconditions>
<table_exists>
test.hits
</table_exists>
</preconditions>
...
...
@@ -24,13 +11,13 @@
<query>
SELECT count() FROM test.hits WHERE NOT ignore(concat(MobilePhoneModel, 'Hello'))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(concat(PageCharset, 'a'))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
}{
}', URL, URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
}{
}', URL, SearchPhrase))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
}{
}', MobilePhoneModel, SearchPhrase))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{}Hello', URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('World{}', SearchPhrase))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{}Hello', MobilePhoneModel))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{}a', PageCharset))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}}{{}
}', URL, URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}}{{}
}', URL, SearchPhrase))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}}{{}
}', MobilePhoneModel, SearchPhrase))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}
}Hello', URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('World{
{}
}', SearchPhrase))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}
}Hello', MobilePhoneModel))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}
}a', PageCharset))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(concat(URL, URL, URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(concat(URL, SearchPhrase, MobilePhoneModel))
</query>
...
...
@@ -39,10 +26,10 @@
<query>
SELECT count() FROM test.hits WHERE NOT ignore(concat(MobilePhoneModel, 'Hello', PageCharset))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(concat('a', PageCharset, 'b'))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
}{}{
}', URL, URL, URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
}{}{
}', URL, SearchPhrase, MobilePhoneModel))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
}Hello{
}', URL, URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('Hello{}World', SearchPhrase))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
}Hello{
}', MobilePhoneModel, PageCharset))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('a{}b', PageCharset))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}}{{}}{{}
}', URL, URL, URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}}{{}}{{}
}', URL, SearchPhrase, MobilePhoneModel))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}}Hello{{}
}', URL, URL))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('Hello{
{}
}World', SearchPhrase))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('{
{}}Hello{{}
}', MobilePhoneModel, PageCharset))
</query>
<query>
SELECT count() FROM test.hits WHERE NOT ignore(format('a{
{}
}b', PageCharset))
</query>
</test>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录