Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 30 additions & 9 deletions firebolt-parquet-partitioned/query
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
# Reads a SQL query from stdin, runs it against the firebolt-core
# container via /?database=clickbench.
# Stdout: query result (firebolt's JSON_Compact format).
# Stderr: query runtime in fractional seconds on the last line,
# pulled from the response's `.statistics.elapsed`.
# Stderr: query runtime in fractional seconds on the last line.
# Exit non-zero on error.
set -e

Expand All @@ -16,16 +15,33 @@ PARAMS='database=clickbench&enable_result_cache=false&enable_subresult_cache=fal
body_file=$(mktemp)
trap 'rm -f "$body_file"' EXIT

http_code=$(curl -sS --max-time 600 -o "$body_file" -w '%{http_code}' \
"http://localhost:3473/?${PARAMS}" \
--data-binary "$query")
resp=$(cat "$body_file")

fail() {
printf '%s\n' "$1" >&2
exit 1
}

# We time from "request sent" to "last response byte": DNS/TCP setup is
# excluded, everything the server does before the response is complete is
# included. That is the same boundary `clickhouse-client --time` reports (the
# server's final Progress packet, which is sent after the last result block
# has been written), so the two entries measure comparable things.
#
# We deliberately do NOT use the response's own `.statistics.elapsed`.
# Firebolt sends the result rows in one chunk and then emits the trailing
# `"statistics"` object of the *same* chunked response tens of milliseconds
# later, carrying an `elapsed` value captured before that gap. The gap grows
# with the engine's thread count (~2 ms at 8 threads, ~15 ms at 96, ~55 ms at
# 192), so on the big machines `.statistics.elapsed` understates the query by
# up to 3.6x. Firebolt's own
# information_schema.engine_query_history.duration_us agrees with the
# wall-clock figure below to within ~1%.
timing=$(curl -sS --max-time 600 -o "$body_file" \
-w '%{http_code} %{time_pretransfer} %{time_total}' \
"http://localhost:3473/?${PARAMS}" \
--data-binary "$query") || fail "curl failed: $(cat "$body_file")"
read -r http_code t_pretransfer t_total <<< "$timing"
resp=$(cat "$body_file")

[ "$http_code" = "200" ] || fail "HTTP ${http_code}: ${resp}"
[ -n "$resp" ] || fail "empty response body (HTTP 200)"
printf '%s' "$resp" | jq -e . >/dev/null 2>&1 || fail "non-JSON response: ${resp}"
Expand All @@ -37,8 +53,13 @@ if printf '%s' "$resp" | jq -e '.errors' >/dev/null 2>&1; then
fail "$resp"
fi

elapsed=$(printf '%s' "$resp" | jq -r '.statistics.elapsed')
[[ "$elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "no numeric statistics.elapsed: ${resp}"
# Not the reported timing, but a successful query always carries it — keep the
# check as a guard against a truncated response that still parses as JSON.
server_elapsed=$(printf '%s' "$resp" | jq -r '.statistics.elapsed')
[[ "$server_elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "no numeric statistics.elapsed: ${resp}"

elapsed=$(awk -v t="$t_total" -v p="$t_pretransfer" 'BEGIN { printf "%.6f", t - p }')
[[ "$elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "bad curl timing: total=${t_total} pretransfer=${t_pretransfer}"

printf '%s\n' "$resp"
printf '%s\n' "$elapsed" >&2
39 changes: 30 additions & 9 deletions firebolt-parquet/query
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
# Reads a SQL query from stdin, runs it against the firebolt-core
# container via /?database=clickbench.
# Stdout: query result (firebolt's JSON_Compact format).
# Stderr: query runtime in fractional seconds on the last line,
# pulled from the response's `.statistics.elapsed`.
# Stderr: query runtime in fractional seconds on the last line.
# Exit non-zero on error.
set -e

Expand All @@ -16,16 +15,33 @@ PARAMS='database=clickbench&enable_result_cache=false&enable_subresult_cache=fal
body_file=$(mktemp)
trap 'rm -f "$body_file"' EXIT

http_code=$(curl -sS --max-time 600 -o "$body_file" -w '%{http_code}' \
"http://localhost:3473/?${PARAMS}" \
--data-binary "$query")
resp=$(cat "$body_file")

fail() {
printf '%s\n' "$1" >&2
exit 1
}

# We time from "request sent" to "last response byte": DNS/TCP setup is
# excluded, everything the server does before the response is complete is
# included. That is the same boundary `clickhouse-client --time` reports (the
# server's final Progress packet, which is sent after the last result block
# has been written), so the two entries measure comparable things.
#
# We deliberately do NOT use the response's own `.statistics.elapsed`.
# Firebolt sends the result rows in one chunk and then emits the trailing
# `"statistics"` object of the *same* chunked response tens of milliseconds
# later, carrying an `elapsed` value captured before that gap. The gap grows
# with the engine's thread count (~2 ms at 8 threads, ~15 ms at 96, ~55 ms at
# 192), so on the big machines `.statistics.elapsed` understates the query by
# up to 3.6x. Firebolt's own
# information_schema.engine_query_history.duration_us agrees with the
# wall-clock figure below to within ~1%.
timing=$(curl -sS --max-time 600 -o "$body_file" \
-w '%{http_code} %{time_pretransfer} %{time_total}' \
"http://localhost:3473/?${PARAMS}" \
--data-binary "$query") || fail "curl failed: $(cat "$body_file")"
read -r http_code t_pretransfer t_total <<< "$timing"
resp=$(cat "$body_file")

[ "$http_code" = "200" ] || fail "HTTP ${http_code}: ${resp}"
[ -n "$resp" ] || fail "empty response body (HTTP 200)"
printf '%s' "$resp" | jq -e . >/dev/null 2>&1 || fail "non-JSON response: ${resp}"
Expand All @@ -37,8 +53,13 @@ if printf '%s' "$resp" | jq -e '.errors' >/dev/null 2>&1; then
fail "$resp"
fi

elapsed=$(printf '%s' "$resp" | jq -r '.statistics.elapsed')
[[ "$elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "no numeric statistics.elapsed: ${resp}"
# Not the reported timing, but a successful query always carries it — keep the
# check as a guard against a truncated response that still parses as JSON.
server_elapsed=$(printf '%s' "$resp" | jq -r '.statistics.elapsed')
[[ "$server_elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "no numeric statistics.elapsed: ${resp}"

elapsed=$(awk -v t="$t_total" -v p="$t_pretransfer" 'BEGIN { printf "%.6f", t - p }')
[[ "$elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "bad curl timing: total=${t_total} pretransfer=${t_pretransfer}"

printf '%s\n' "$resp"
printf '%s\n' "$elapsed" >&2
39 changes: 30 additions & 9 deletions firebolt/query
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
# Reads a SQL query from stdin, runs it against the firebolt-core
# container via /?database=clickbench.
# Stdout: query result (firebolt's JSON_Compact format).
# Stderr: query runtime in fractional seconds on the last line,
# pulled from the response's `.statistics.elapsed`.
# Stderr: query runtime in fractional seconds on the last line.
# Exit non-zero on error.
set -e

Expand All @@ -16,16 +15,33 @@ PARAMS='database=clickbench&enable_result_cache=false&enable_subresult_cache=fal
body_file=$(mktemp)
trap 'rm -f "$body_file"' EXIT

http_code=$(curl -sS --max-time 600 -o "$body_file" -w '%{http_code}' \
"http://localhost:3473/?${PARAMS}" \
--data-binary "$query")
resp=$(cat "$body_file")

fail() {
printf '%s\n' "$1" >&2
exit 1
}

# We time from "request sent" to "last response byte": DNS/TCP setup is
# excluded, everything the server does before the response is complete is
# included. That is the same boundary `clickhouse-client --time` reports (the
# server's final Progress packet, which is sent after the last result block
# has been written), so the two entries measure comparable things.
#
# We deliberately do NOT use the response's own `.statistics.elapsed`.
# Firebolt sends the result rows in one chunk and then emits the trailing
# `"statistics"` object of the *same* chunked response tens of milliseconds
# later, carrying an `elapsed` value captured before that gap. The gap grows
# with the engine's thread count (~2 ms at 8 threads, ~15 ms at 96, ~55 ms at
# 192), so on the big machines `.statistics.elapsed` understates the query by
# up to 3.6x. Firebolt's own
# information_schema.engine_query_history.duration_us agrees with the
# wall-clock figure below to within ~1%.
timing=$(curl -sS --max-time 600 -o "$body_file" \
-w '%{http_code} %{time_pretransfer} %{time_total}' \
"http://localhost:3473/?${PARAMS}" \
--data-binary "$query") || fail "curl failed: $(cat "$body_file")"
read -r http_code t_pretransfer t_total <<< "$timing"
resp=$(cat "$body_file")

[ "$http_code" = "200" ] || fail "HTTP ${http_code}: ${resp}"
[ -n "$resp" ] || fail "empty response body (HTTP 200)"
printf '%s' "$resp" | jq -e . >/dev/null 2>&1 || fail "non-JSON response: ${resp}"
Expand All @@ -37,8 +53,13 @@ if printf '%s' "$resp" | jq -e '.errors' >/dev/null 2>&1; then
fail "$resp"
fi

elapsed=$(printf '%s' "$resp" | jq -r '.statistics.elapsed')
[[ "$elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "no numeric statistics.elapsed: ${resp}"
# Not the reported timing, but a successful query always carries it — keep the
# check as a guard against a truncated response that still parses as JSON.
server_elapsed=$(printf '%s' "$resp" | jq -r '.statistics.elapsed')
[[ "$server_elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "no numeric statistics.elapsed: ${resp}"

elapsed=$(awk -v t="$t_total" -v p="$t_pretransfer" 'BEGIN { printf "%.6f", t - p }')
[[ "$elapsed" =~ ^[0-9]+(\.[0-9]+)?$ ]] || fail "bad curl timing: total=${t_total} pretransfer=${t_pretransfer}"

printf '%s\n' "$resp"
printf '%s\n' "$elapsed" >&2
60 changes: 60 additions & 0 deletions firebolt/results/20260827/c6a.2xlarge.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"system": "Firebolt",
"date": "2026-08-27",
"machine": "c6a.2xlarge",
"cluster_size": 1,
"proprietary": "yes",
"hardware": "cpu",
"tuned": "no",
"tags": ["C++","column-oriented","PostgreSQL compatible","ClickHouse derivative"],
"load_time": 238,
"data_size": 15819127890,
"concurrent_qps": 0.285,
"concurrent_error_ratio": 0.34,
"result": [
[0.013, 0.003, 0.003],
[0.209, 0.04, 0.038],
[0.273, 0.08, 0.074],
[0.409, 0.101, 0.102],
[0.594, 0.554, 0.556],
[1.285, 0.586, 0.588],
[0.153, 0.094, 0.099],
[0.047, 0.037, 0.037],
[1.052, 0.755, 0.751],
[1.222, 1.001, 0.935],
[0.534, 0.296, 0.269],
[0.627, 0.409, 0.433],
[0.693, 0.562, 0.471],
[1.108, 0.991, 0.983],
[0.81, 0.725, 0.625],
[0.612, 0.61, 0.623],
[1.643, 1.561, 1.471],
[1.241, 1.219, 1.171],
[5.384, 2.785, 2.76],
[0.036, 0.011, 0.008],
[9.521, 0.591, 0.501],
[8.026, 0.614, 0.547],
[13.518, 1.634, 1.418],
[9.267, 0.611, 0.601],
[1.795, 0.182, 0.185],
[0.281, 0.272, 0.26],
[0.233, 0.254, 0.214],
[9.151, 2.28, 3.294],
[9.945, 5.096, 3.941],
[0.236, 0.073, 0.083],
[1.832, 0.582, 0.615],
[3.777, 0.961, 0.949],
[3.645, 3.416, 3.287],
[10.434, 6.869, 5.335],
[7.191, 6.405, 6.079],
[1.246, 0.993, 0.991],
[0.162, 0.053, 0.04],
[0.049, 0.019, 0.02],
[0.045, 0.012, 0.012],
[0.205, 0.112, 0.081],
[0.051, 0.012, 0.012],
[0.037, 0.011, 0.012],
[0.033, 0.012, 0.012]
]
}

60 changes: 60 additions & 0 deletions firebolt/results/20260827/c6a.4xlarge.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"system": "Firebolt",
"date": "2026-08-27",
"machine": "c6a.4xlarge",
"cluster_size": 1,
"proprietary": "yes",
"hardware": "cpu",
"tuned": "no",
"tags": ["C++","column-oriented","PostgreSQL compatible","ClickHouse derivative"],
"load_time": 178,
"data_size": 15819447968,
"concurrent_qps": 0.418,
"concurrent_error_ratio": 0.549,
"result": [
[0.015, 0.002, 0.002],
[0.135, 0.023, 0.022],
[0.152, 0.045, 0.045],
[0.48, 0.058, 0.058],
[0.313, 0.291, 0.291],
[1.007, 0.292, 0.288],
[0.085, 0.039, 0.043],
[0.033, 0.022, 0.024],
[0.64, 0.35, 0.357],
[0.499, 0.489, 0.482],
[0.331, 0.099, 0.093],
[0.272, 0.103, 0.11],
[0.286, 0.236, 0.231],
[0.497, 0.485, 0.499],
[0.375, 0.285, 0.282],
[0.321, 0.452, 0.457],
[0.766, 0.755, 0.757],
[0.598, 0.61, 0.588],
[4.419, 1.291, 1.274],
[0.047, 0.013, 0.007],
[9.197, 0.508, 0.309],
[2.732, 3.345, 1.718],
[12.967, 1.068, 0.738],
[8.022, 0.192, 0.191],
[1.244, 0.095, 0.094],
[0.101, 0.095, 0.1],
[0.099, 0.092, 0.094],
[7.416, 1.69, 1.112],
[8.742, 2.139, 1.893],
[0.13, 0.056, 0.055],
[1.546, 0.364, 0.38],
[3.799, 0.323, 0.303],
[1.782, 1.684, 1.666],
[9.637, 1.857, 1.773],
[4, 4.347, 1.757],
[0.618, 0.552, 0.522],
[0.169, 0.119, 0.035],
[0.054, 0.062, 0.023],
[0.034, 0.019, 0.032],
[0.234, 0.206, 0.118],
[0.068, 0.014, 0.019],
[0.058, 0.015, 0.02],
[0.04, 0.026, 0.029]
]
}

60 changes: 60 additions & 0 deletions firebolt/results/20260827/c6a.large.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"system": "Firebolt",
"date": "2026-08-27",
"machine": "c6a.large",
"cluster_size": 1,
"proprietary": "yes",
"hardware": "cpu",
"tuned": "no",
"tags": ["C++","column-oriented","PostgreSQL compatible","ClickHouse derivative"],
"load_time": 507,
"data_size": 15817294255,
"concurrent_qps": 0.473,
"concurrent_error_ratio": 0.778,
"result": [
[0.013, 0.003, 0.003],
[0.66, 0.109, 0.108],
[1.054, 0.451, 0.438],
[1.504, 0.791, 0.865],
[3.257, 2.719, 2.683],
[null, 5.209, 3.899],
[0.379, 0.33, 0.288],
[0.197, 0.103, 0.101],
[4.361, 3.535, 3.583],
[null, null, null],
[null, 2.027, null],
[null, null, null],
[null, 6.639, 5.395],
[null, null, null],
[null, null, null],
[3.872, 3.214, 3.084],
[null, null, null],
[null, null, null],
[null, null, null],
[0.663, 0.012, 0.01],
[null, null, null],
[null, null, null],
[null, null, null],
[null, null, null],
[5.162, null, 3.334],
[2.757, 1.732, 1.428],
[null, null, null],
[null, null, null],
[null, null, null],
[0.958, 0.202, 0.203],
[null, null, null],
[null, null, null],
[40.985, null, null],
[null, null, null],
[null, null, null],
[3.908, 2.794, 2.661],
[0.289, 0.063, 0.061],
[0.113, 0.035, 0.036],
[0.083, 0.016, 0.015],
[0.573, 0.218, 0.26],
[0.127, 0.018, 0.017],
[0.085, 0.013, 0.013],
[0.075, 0.016, 0.016]
]
}

Loading