Hand-rolled Rust HogQL parser with C++-parity AST output
Project description
hogql_parser_rs
Hand-rolled Rust HogQL parser. Pratt + recursive descent. Same JSON AST
shape as the C++ ANTLR parser so the
two can be cross-validated query-by-query. Ships as a Python extension
via maturin and is selected as the rust-json backend in
posthog/hogql/parser.py.
About 15× faster than the C++ parser on parse_expr and 50–55×
on parse_select, against the same input, on the same machine. The
numbers come from posthog/hogql/scripts/parser_bench.py; re-run
locally before and after any non-trivial change.
The C++ parser is the source of truth
When grammar, AST shape, or any visible behaviour disagrees between
the two, the C++ ANTLR parser is right and this one is wrong. The C++
parser is generated from
posthog/hogql/grammar/HogQLLexer.*.g4
HogQLParser.g4via ANTLR4. The Rust parser does not consume those grammar files; it hand-implements the same recognition behaviour.
This means any grammar change is a two-step change:
-
Update the ANTLR grammar and rebuild the C++ parser. Get the new shape working end-to-end on
cpp-json. Pin the new behaviour with regression tests (see "Tools" below). -
Bring the Rust parser to parity. Run the diagnostics, find the new divergences, fix them. This is the part an LLM agent can drive in a long-running loop.
Skipping step 1 produces a Rust parser that "works" but on a shape
the C++ parser rejects, which means Cloud's printer / planner will
reject too, because they're built on top of cpp-json's output. Get
the oracle right first, then the candidate.
What's in this crate
| Path | What it does |
|---|---|
src/lib.rs |
PyO3 entry points (parse_expr_json, parse_select_json, parse_program_json, parse_order_expr_json, parse_full_template_string_json). Each returns a JSON string; on error the JSON is an {"error": true, ...} envelope posthog/hogql/json_ast.py decodes into HogQLSyntaxError / ExposedHogQLError. |
src/lex.rs |
Lexer. Hand-rolled state machine matching the ANTLR-generated C++ lexer's tokens + mode stack (default / template-string / HogQLX-tag / HogQLX-text). When you add a new keyword to the grammar, add it here too. |
src/parse.rs |
Parser core: Parser struct, public entry points, the Pratt expression parser (parse_expr_bp), positions (pos_obj, wrap_pos, wrap_pos_to), char-offset / line-col tables, checkpoint / restore for speculative branches. |
src/parse/{expr,select,program,join,cte,hogqlx,template}.rs |
Per-rule parsing. Most grammar changes land in one of these. |
src/parse/bp.rs |
Binding-power table + build_infix / merge_and_or / merge_concat. The precedence ladder lives here; new operators usually need an entry in infix_bp and a build_infix arm. |
src/emit.rs |
AST-node builders + position helpers (with_pos is idempotent, replace_pos overrides, no_pos reserves null keys to opt out of the wrap). When you add a new AST node, add a helper here so callers don't hand-build the JSON object. |
src/error.rs |
ParseError + the JSON error envelope. |
Building locally
# One-time: install the rust toolchain via flox / rustup (the workspace
# Cargo.toml is at `rust/Cargo.toml`).
# Build + install the wheel into the venv (editable). Re-run after each
# rust source change.
uv pip install -e rust/hogql/parser
# Or via maturin directly (faster incremental):
maturin develop --release --manifest-path rust/hogql/parser/Cargo.toml
# Sanity check
python -c "import hogql_parser_rs; print(hogql_parser_rs.parse_expr_json('1 + 2'))"
maturin builds a single cp312-abi3 wheel that works on Python
3.12+. CI builds wheels for Linux x86_64/aarch64 (manylinux 2_28 +
musllinux 1_2) and macOS arm64/x86_64; see
.github/workflows/build-hogql-parser-rs.yml.
Publishing
The crate is pinned via the hogql-parser-rs==X.Y.Z line in the
repo-root pyproject.toml. Bump the
version in both:
(They must match. The PR check at
.github/workflows/build-hogql-parser-rs.yml
enforces this.)
Version is intentionally locked in step with
common/hogql_parser (the C++ parser
PyPI package) so a bump signals "both parsers move together." The
publish workflow builds wheels, pushes to PyPI via trusted publishing,
then opens a follow-up PR that updates the repo-root pin.
Adding a new grammar feature
The big-picture loop:
-
Update
HogQLLexer.*.g4andHogQLParser.g4. Runpnpm grammar:buildto regenerate the Python and C++ ANTLR artefacts:pnpm grammar:buildThat step requires the
antlr4.13.2 binary onPATH; instructions inposthog/hogql/grammar/README.md. The script rewritescommon/hogql_parser/HogQL{Lexer,Parser}.{cpp,h,interp,tokens}and the matching Python files. Both backends now recognise the new shape. -
Pick the AST emission. Decide what JSON the cpp visitor should return for the new shape. Either reuse an existing AST node or add a new one in
posthog/hogql/ast.py. The Python AST is shared between backends, so any new node has to land there first, otherwiseposthog/hogql/json_ast.py::deserialize_astwill crash on it. -
Update the cpp visitor. Add the
VISIT(YourNewRule)arm incommon/hogql_parser/parser_json.cpp. Mirror cpp's conventions: calladdPositionInfo(json, ctx)per rule unless you specifically want a position-less node (see "Position parity" below). Rebuild the cpp wheel (pip install ./common/hogql_parser). -
Pin the new behaviour. Add a regression test (and a rust-rejects-it negative test if the grammar tightens) in
posthog/hogql/test/test_parser_regressions.py. Run oncpp-jsononly (you haven't done the Rust work yet); the test should pass on cpp and fail on rust. That fail is the starting state for step 5. -
Bring the Rust parser to parity. Add lexer keywords (if any) in
src/lex.rs, then the parser shape in the matchingsrc/parse/*.rsfile. Match cpp's per-node visit behaviour: everyaddPositionInfo(json, ctx)on the cpp side needs aself.wrap_pos(value, start)orself.wrap_pos_to(value, start, end)on this side. Add anemit::*helper if you're building a new node shape, so callers stay declarative. -
Run the diagnostics. PBT, corpus checks, regression suite, perf bench. Anything below the previous baseline goes back into the loop.
Step 5 is where an LLM agent in a long-running loop (ralph loop, autoresearch, Claude Code with a wakeup schedule) does well. The diagnostics produce concrete diffs the agent can attack one at a time.
Tools for parity work
Every script below has the same --oracle / --candidate flag pair
and defaults to cpp-json vs rust-json. The diagnostics include
per-node start / end positions in the comparison by default; set
CLEAR_LOCATIONS=1 to strip positions when you want a structural-only
read.
Regression tests in posthog/hogql/test/
hogli test posthog/hogql/test/test_parser_regressions.py
hogli test posthog/hogql/test/test_parser_rust_json.py
test_parser_regressions.py pins every cpp-vs-rust divergence that
has been found and fixed; one parameterised assertion runs on all
three backends (cpp-json, rust-json, python). When you add a new
grammar shape, add a regression here too.
test_parser_rust_json.py runs the shared
_test_parser.py
suite against rust-json. Catches behaviour regressions the
regression file doesn't pin.
Property-based testing via posthog/hogql/scripts/pbt_diagnostic.py
PYTHONPATH=. python posthog/hogql/scripts/pbt_diagnostic.py \
--n 5000 --rule program
# Per rule:
--rule expr # standalone column expressions
--rule select # SELECT / SELECT-set statements
--rule program # full Hog programs (declarations + statements + exprs)
Generates ~5 000 random grammar surface examples per rule, parses with
oracle and candidate, buckets divergences by AST shape, and prints
shrunk reproducers. Use --shrink-failures to auto-reduce each
divergence to a minimal example.
Real-query corpora via log_corpus_diagnostic.py / hog_corpus_diagnostic.py
# SELECT queries from the last 7 days of production traffic
# (redacted, AI-data-processing-approved teams only):
PYTHONPATH=. python posthog/hogql/scripts/log_corpus_diagnostic.py
# Hog programs from production (transformations, destinations, …):
PYTHONPATH=. python posthog/hogql/scripts/hog_corpus_diagnostic.py
Both auto-download via hogli metabase:query and cache locally under
posthog/hogql/scripts/.local/. Pass --skip-download to reuse the
existing dump while iterating. Failures are written one block per
divergence to a .sql / .hog file the agent can chew through.
Perf bench via posthog/hogql/scripts/parser_bench.py
CANDIDATE_BACKEND=rust-json PYTHONPATH=. \
python posthog/hogql/scripts/parser_bench.py
Runs both parsers against a fixed corpus of representative queries
(small / medium / nested / pathological) and prints an
oracle / candidate ratio per row. Re-run before and after any
non-trivial change. If parse_select mean drops noticeably (the
parse_select speedup is the headline number), find out why before
landing.
Shadow compare in TEST via cpp-with-rust-shadow
In TEST mode the default backend is cpp-with-rust-shadow: both
backends parse, ASTs are compared, mismatches raise so the failing
test points right at the offending query. In production this same
mode runs at a 1% sample and only logs. Useful when a regression
slips past the PBT but shows up in the suite.
from posthog.hogql.constants import HogQLParserBackend
parse_expr(src, backend=HogQLParserBackend.CPP_WITH_RUST_SHADOW)
Example loop for an LLM agent
A long-running loop driving a single grammar-parity task looks roughly like this. Tailor for your runtime (ralph loop, autoresearch, Claude Code wakeup, etc.); the steps stay the same.
PROMPT:
You are bringing the Rust parser to parity with the C++ parser for
the new grammar feature `<feature description>`. The C++ parser is
the source of truth. Each iteration:
1. Run the PBT for the rule the feature touches:
posthog/hogql/scripts/pbt_diagnostic.py --n 500 --rule <rule> \
--shrink-failures \
--write-divergences /tmp/divs.jsonl
2. Read /tmp/divs.jsonl. Bucket divergences by the failing AST
node type. Pick the bucket with the most members.
3. Read 2–3 shrunk reproducers from that bucket. Look at the
cpp output and the rust output side by side.
4. Fix the rust parser. Prefer changes that generalise to deeper
and more nested queries. A fix that only handles `a.b` but
not `a.b.c` is going to lose ground on the next iteration. If
a fix needs a special case at depth 0 only, that's a smell.
5. Re-run the PBT. If the failing-bucket count went down without
introducing new buckets, keep the change.
6. Re-run the regression suite and the perf bench. Both must stay
green / on-baseline before continuing.
7. Commit. The commit message should call out which divergence
class the fix targets so future work can trace the history.
Stop when:
- The PBT bucket is empty
- The hog_corpus_diagnostic and log_corpus_diagnostic both stay
at >= 90% match (run weekly)
- The perf bench `parse_select` mean is within 5% of its
pre-change baseline
A few rules of thumb the loop should follow that aren't always obvious from the diagnostics alone:
-
Prefer the generalising fix. When two implementations both pass the failing cases, pick the one that doesn't depend on the input shape. A
wrap_poscall at a single emit site beats a depth-aware conditional. A change to the binding-power table beats an ad-hoc check in the consumer. -
Position bugs hide behind structural bugs. Always run the PBT with positions on (the default);
CLEAR_LOCATIONS=1is for diagnosing structural regressions only. A 99% structural match can mask a 50% position-aware match. -
Look at the cpp visitor before guessing. Every per-node position decision in this parser has a cpp counterpart in
common/hogql_parser/parser_json.cpp. If the cpp visitor callsaddPositionInfo(json, ctx)you need a wrap on the rust side; if it doesn't, you needemit::no_pos(or the helper for that node already does it). -
Watch the perf bench. Position emission isn't free. Cache O(N) computations on
Parserrather than recomputing per emit; theis_ascii_srcfield is the canonical example. -
Don't fix one rule at a time at the expense of others. A one-line wrap in
parse/expr.rscan move three PBT rules at once. Run all three PBTs after each change, not just the one you started with.
Position parity (the non-obvious part)
The C++ visitor decides per-node whether to emit positions via
addPositionInfo(json, ctx). Some nodes are deliberately
position-less (NamedArgument, ColumnsExpr in qualified-asterisk
column slots, etc.) so the rust parser has to match that exactly.
Three position helpers in emit.rs cover the three cases:
| Helper | When to use |
|---|---|
with_pos |
Default. Adds start / end if not already set. Used by Parser::wrap_pos and wrap_pos_to. Idempotent so the outer pratt-loop wrap doesn't trample inner spans. |
replace_pos |
Override existing start / end. Used by the bare-paren grammar alts ((* REPLACE(...))) where the inner wrap captured only the inner content but cpp's grammar ctx includes the outer parens. |
no_pos |
Pre-insert start: null, end: null so the outer wrap leaves the node bare. Used for nodes cpp explicitly doesn't position (NamedArgument, ColumnExprNamedArg). |
Two more things to keep in mind:
-
Offsets are character indices, not byte indices. cpp's
getStartIndex()is char-based; rust's source slices are byte-based.Parser::pos_objconverts viabyte_to_char_indexfor non-ASCII sources, short-circuits for ASCII. If you bypasspos_obj(e.g. hand-building a position object for a node-builder you control), you have to do the conversion yourself. -
Column is character-position-in-line, not byte-position. Same reason. The ASCII fast path in
pos_objhandles this for free; the slow path counts chars between line-start and offset.
Known long-tail divergences
The PBT for expr and select exposes adversarial grammar surface
that the production corpora never see: deep nested
BETWEEN low AND high chains with embedded aliases and ternaries,
extreme WITHIN GROUP (ORDER BY …) shapes, multi-token-AND-merged
operands. These take focused per-shape investigation; the
PR description has
the current numbers.
The production corpora (log_corpus_diagnostic,
hog_corpus_diagnostic) stay above 90%, so anything the PBT surfaces
that doesn't appear there is technically grammar-parity work but not
user-visible.
Selecting from Python
from posthog.hogql.parser import parse_expr, parse_select, parse_program
ast = parse_expr("1 + event.properties.$browser", backend="rust-json")
Backends live in posthog/hogql/constants.HogQLParserBackend:
| Backend | Use case |
|---|---|
cpp-json |
Production default. ANTLR-based, oracle for everything below. |
rust-json |
This crate. ~15× / ~50× faster, behaviour identical (modulo the long tail). |
python |
Pure-Python ANTLR fallback. Slower; useful for debugging visitor changes. |
cpp-with-rust-shadow |
Production-default in TEST. Parses with cpp, shadow-parses with rust, raises on mismatch (TEST) / logs at 1% sample (prod). |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hogql_parser_rs-1.3.66.tar.gz.
File metadata
- Download URL: hogql_parser_rs-1.3.66.tar.gz
- Upload date:
- Size: 237.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed602a3c483784a64dd485a61f68613bdb9ded5730476f388daa45e23ae39567
|
|
| MD5 |
9e1f5fd2000f7ccbd3b568d53b28930d
|
|
| BLAKE2b-256 |
4ddd5fb4e3581bac304c584982567a87b3090097e5d9530acb1bbaa4b7645f0e
|
Provenance
The following attestation bundles were made for hogql_parser_rs-1.3.66.tar.gz:
Publisher:
build-hogql-parser-rs.yml on PostHog/posthog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hogql_parser_rs-1.3.66.tar.gz -
Subject digest:
ed602a3c483784a64dd485a61f68613bdb9ded5730476f388daa45e23ae39567 - Sigstore transparency entry: 1591464799
- Sigstore integration time:
-
Permalink:
PostHog/posthog@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Branch / Tag:
refs/pull/58949/merge - Owner: https://github.com/PostHog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-hogql-parser-rs.yml@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Trigger Event:
pull_request
-
Statement type:
File details
Details for the file hogql_parser_rs-1.3.66-cp312-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: hogql_parser_rs-1.3.66-cp312-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 2.2 MB
- Tags: CPython 3.12+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff3a22d11963e3f2f74fa70ff8459e5b16ddc6764029a169cd2dd2999088eb4a
|
|
| MD5 |
49e0bcea8fd0349a935ac09210d54ef4
|
|
| BLAKE2b-256 |
7c9ca29f047797c36746975e2f677fd7dfebdf476fb39b99c834aa0ac8e5bf57
|
Provenance
The following attestation bundles were made for hogql_parser_rs-1.3.66-cp312-abi3-musllinux_1_2_x86_64.whl:
Publisher:
build-hogql-parser-rs.yml on PostHog/posthog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hogql_parser_rs-1.3.66-cp312-abi3-musllinux_1_2_x86_64.whl -
Subject digest:
ff3a22d11963e3f2f74fa70ff8459e5b16ddc6764029a169cd2dd2999088eb4a - Sigstore transparency entry: 1591465055
- Sigstore integration time:
-
Permalink:
PostHog/posthog@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Branch / Tag:
refs/pull/58949/merge - Owner: https://github.com/PostHog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-hogql-parser-rs.yml@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Trigger Event:
pull_request
-
Statement type:
File details
Details for the file hogql_parser_rs-1.3.66-cp312-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: hogql_parser_rs-1.3.66-cp312-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 2.1 MB
- Tags: CPython 3.12+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5b7185e1b31234c5f2c05820794282d209a26fdf701b6d88351e0a9aad85733
|
|
| MD5 |
a951b38740e46c5b7cda7e9ebcad4886
|
|
| BLAKE2b-256 |
cf17eacfaaf22f81caa0088bb4c6e97f7d9a0992ef53f9bcbe4ebba516a3881d
|
Provenance
The following attestation bundles were made for hogql_parser_rs-1.3.66-cp312-abi3-musllinux_1_2_aarch64.whl:
Publisher:
build-hogql-parser-rs.yml on PostHog/posthog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hogql_parser_rs-1.3.66-cp312-abi3-musllinux_1_2_aarch64.whl -
Subject digest:
e5b7185e1b31234c5f2c05820794282d209a26fdf701b6d88351e0a9aad85733 - Sigstore transparency entry: 1591464846
- Sigstore integration time:
-
Permalink:
PostHog/posthog@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Branch / Tag:
refs/pull/58949/merge - Owner: https://github.com/PostHog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-hogql-parser-rs.yml@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Trigger Event:
pull_request
-
Statement type:
File details
Details for the file hogql_parser_rs-1.3.66-cp312-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: hogql_parser_rs-1.3.66-cp312-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.2 MB
- Tags: CPython 3.12+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d131b44e330214db88ecf98226e469eeab1e8f9381e13b1372bc2f62fb48df58
|
|
| MD5 |
b30357ba45410aab6e8be40ab143ce36
|
|
| BLAKE2b-256 |
85139574677bfd0a70ece0f6f0e800b004b0b67022e607c9c76173dc11731750
|
Provenance
The following attestation bundles were made for hogql_parser_rs-1.3.66-cp312-abi3-manylinux_2_28_x86_64.whl:
Publisher:
build-hogql-parser-rs.yml on PostHog/posthog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hogql_parser_rs-1.3.66-cp312-abi3-manylinux_2_28_x86_64.whl -
Subject digest:
d131b44e330214db88ecf98226e469eeab1e8f9381e13b1372bc2f62fb48df58 - Sigstore transparency entry: 1591464884
- Sigstore integration time:
-
Permalink:
PostHog/posthog@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Branch / Tag:
refs/pull/58949/merge - Owner: https://github.com/PostHog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-hogql-parser-rs.yml@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Trigger Event:
pull_request
-
Statement type:
File details
Details for the file hogql_parser_rs-1.3.66-cp312-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: hogql_parser_rs-1.3.66-cp312-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.12+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa8309f096448d07bee55fca10a08e045b1771c9679bcc11dc2f035746729e13
|
|
| MD5 |
2dac0229230079f06e3b10deea0e8717
|
|
| BLAKE2b-256 |
e7248d0e8cf65fc03a4f06bba19faf230402ff21150092e4ecb6a654ae96dde8
|
Provenance
The following attestation bundles were made for hogql_parser_rs-1.3.66-cp312-abi3-manylinux_2_28_aarch64.whl:
Publisher:
build-hogql-parser-rs.yml on PostHog/posthog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hogql_parser_rs-1.3.66-cp312-abi3-manylinux_2_28_aarch64.whl -
Subject digest:
fa8309f096448d07bee55fca10a08e045b1771c9679bcc11dc2f035746729e13 - Sigstore transparency entry: 1591464980
- Sigstore integration time:
-
Permalink:
PostHog/posthog@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Branch / Tag:
refs/pull/58949/merge - Owner: https://github.com/PostHog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-hogql-parser-rs.yml@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Trigger Event:
pull_request
-
Statement type:
File details
Details for the file hogql_parser_rs-1.3.66-cp312-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: hogql_parser_rs-1.3.66-cp312-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 478.2 kB
- Tags: CPython 3.12+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f6c718a31bc862ab2b54947e7c1af2414a3c6da870d8354428950f1b05ff114
|
|
| MD5 |
b06d4ee6c9cf93bdbb438692ce6eae0e
|
|
| BLAKE2b-256 |
a9493d84455b899332f1f7fe0b4ab51ea4c15c017dca6d83677c52a783b11de0
|
Provenance
The following attestation bundles were made for hogql_parser_rs-1.3.66-cp312-abi3-macosx_11_0_arm64.whl:
Publisher:
build-hogql-parser-rs.yml on PostHog/posthog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hogql_parser_rs-1.3.66-cp312-abi3-macosx_11_0_arm64.whl -
Subject digest:
9f6c718a31bc862ab2b54947e7c1af2414a3c6da870d8354428950f1b05ff114 - Sigstore transparency entry: 1591464937
- Sigstore integration time:
-
Permalink:
PostHog/posthog@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Branch / Tag:
refs/pull/58949/merge - Owner: https://github.com/PostHog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-hogql-parser-rs.yml@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Trigger Event:
pull_request
-
Statement type:
File details
Details for the file hogql_parser_rs-1.3.66-cp312-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: hogql_parser_rs-1.3.66-cp312-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 503.2 kB
- Tags: CPython 3.12+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
489c511c895f4df375bfd345377c18c2767175f322d807cfcf8855a2d9511dd4
|
|
| MD5 |
aa21b7b6745366b39026257302fa2052
|
|
| BLAKE2b-256 |
f4cd3715d70eb9d838f50351b72ae53e151b0944e096aad24185417354d79ee9
|
Provenance
The following attestation bundles were made for hogql_parser_rs-1.3.66-cp312-abi3-macosx_10_12_x86_64.whl:
Publisher:
build-hogql-parser-rs.yml on PostHog/posthog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hogql_parser_rs-1.3.66-cp312-abi3-macosx_10_12_x86_64.whl -
Subject digest:
489c511c895f4df375bfd345377c18c2767175f322d807cfcf8855a2d9511dd4 - Sigstore transparency entry: 1591465011
- Sigstore integration time:
-
Permalink:
PostHog/posthog@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Branch / Tag:
refs/pull/58949/merge - Owner: https://github.com/PostHog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-hogql-parser-rs.yml@aa35947f176c085fec00a2d73e923e3a17f2d5b4 -
Trigger Event:
pull_request
-
Statement type: