-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconcurrent_parse.v
More file actions
46 lines (42 loc) · 1.23 KB
/
concurrent_parse.v
File metadata and controls
46 lines (42 loc) · 1.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import pg_query
import time
const queries = ['SELECT 1', 'SELECT 2; SELECT 3', 'CREATE TABLE t (id int)',
'DELETE FROM t WHERE id = 0', 'UPDATE t SET x = 1', 'SELECT count(*) FROM t', 'DROP TABLE t',
'INSERT INTO t VALUES (1)', "SELECT a, b, c FROM x WHERE y IN ('a', 'b', 'c')",
'ALTER TABLE t ADD COLUMN x int', 'CREATE INDEX idx ON t (id)',
'SELECT * FROM t WHERE id = 42 AND name = $1']
fn parse_single(input string) string {
res := pg_query.parse_protobuf_ast(input) or { return 'ERROR: ${err}' }
return '${input} -> ${res.stmts.len} stmt(s)'
}
fn worker(id int, n int) string {
mut errs := 0
mut ok := 0
start := time.now()
for _ in 0 .. n {
for q in queries {
res := pg_query.parse_protobuf_ast(q) or {
errs++
continue
}
_ = res
ok++
}
}
elapsed := time.now() - start
return 'worker ${id}: ${ok} ok, ${errs} errs in ${elapsed.milliseconds()} ms'
}
fn main() {
n_workers := 10
iters_per_worker := 1000
println('Starting ${n_workers} workers, ${iters_per_worker} iterations each...')
mut threads := []thread string{}
for i in 0 .. n_workers {
threads << spawn worker(i, iters_per_worker)
}
results := threads.wait()
for r in results {
println(' ${r}')
}
println('DONE - no crashes, no data races')
}