Full Code of PRQL/prql for AI

main e100d3d5fb86 cached
892 files
3.1 MB
866.6k tokens
2039 symbols
1 requests
Download .txt
Showing preview only (3,450K chars total). Download the full file or copy to clipboard to get everything.
Repository: PRQL/prql
Branch: main
Commit: e100d3d5fb86
Files: 892
Total size: 3.1 MB

Directory structure:
gitextract_epfrnbyg/

├── .cargo/
│   └── config.toml
├── .config/
│   ├── insta.yaml
│   ├── lychee.toml
│   ├── nextest.toml
│   ├── vscode-recommended/
│   │   ├── launch.json
│   │   ├── settings.json
│   │   └── tasks.json
│   └── wt.toml
├── .devcontainer/
│   ├── base-image/
│   │   └── Dockerfile
│   └── devcontainer.json
├── .gitattributes
├── .github/
│   ├── .codecov.yaml
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   ├── config.yaml
│   │   └── something_else.yaml
│   ├── actionlint.yaml
│   ├── actions/
│   │   ├── build-prqlc/
│   │   │   └── action.yaml
│   │   ├── build-prqlc-c/
│   │   │   └── action.yaml
│   │   ├── build-python/
│   │   │   └── action.yaml
│   │   └── time-compilation/
│   │       └── action.yaml
│   ├── dependabot.yaml
│   ├── nightly-failure.md
│   └── workflows/
│       ├── README.md
│       ├── build-devcontainer.yaml
│       ├── build-web.yaml
│       ├── claude.yaml
│       ├── lint-megalinter.yaml
│       ├── nightly.yaml
│       ├── publish-web.yaml
│       ├── pull-request-target.yaml
│       ├── release.yaml
│       ├── scripts/
│       │   ├── set_version.sh
│       │   └── util_free_space.sh
│       ├── test-dotnet.yaml
│       ├── test-elixir.yaml
│       ├── test-java.yaml
│       ├── test-js.yaml
│       ├── test-php.yaml
│       ├── test-prqlc-c.yaml
│       ├── test-python.yaml
│       ├── test-rust.yaml
│       └── tests.yaml
├── .gitignore
├── .markdownlint-cli2.yaml
├── .mega-linter.yaml
├── .pre-commit-config.yaml
├── .prettierignore
├── .prettierrc.yaml
├── .sqlfluff
├── .typos.toml
├── .vscode/
│   └── extensions.json
├── CHANGELOG.md
├── CLAUDE.md
├── Cargo.toml
├── LICENSE
├── README.md
├── Taskfile.yaml
├── bacon.toml
├── flake.nix
├── grammars/
│   ├── CotEditor/
│   │   ├── PRQL.yaml
│   │   └── README.md
│   ├── GtkSourceView/
│   │   ├── README.md
│   │   └── prql.lang
│   ├── KSyntaxHighlighting/
│   │   ├── README.md
│   │   └── prql.xml
│   ├── README.md
│   ├── emacs/
│   │   ├── README.md
│   │   └── prql-mode.el
│   ├── nano/
│   │   ├── README.md
│   │   └── prql.nanorc
│   ├── prql-lezer/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── rollup.config.js
│   │   ├── src/
│   │   │   ├── highlight.js
│   │   │   └── prql.grammar
│   │   └── test/
│   │       ├── arithmetics.txt
│   │       ├── arrays.txt
│   │       ├── datetime.txt
│   │       ├── full_queries.txt
│   │       ├── identifiers.txt
│   │       ├── misc.txt
│   │       ├── numbers.txt
│   │       ├── operators.txt
│   │       ├── strings.txt
│   │       ├── test-prql.js
│   │       └── tuples.txt
│   ├── raku/
│   │   ├── META6.json
│   │   ├── README.md
│   │   ├── lib/
│   │   │   └── prql.rakumod
│   │   └── t/
│   │       ├── arithmetics.rakutest
│   │       ├── arrays.rakutest
│   │       ├── datetime.rakutest
│   │       ├── full_queries.rakutest
│   │       ├── identifiers.rakutest
│   │       ├── misc.rakutest
│   │       ├── numbers.rakutest
│   │       ├── operators.rakutest
│   │       ├── strings.rakutest
│   │       └── tuples.rakutest
│   └── vim/
│       └── README.md
├── prqlc/
│   ├── README.md
│   ├── Taskfile.yaml
│   ├── bindings/
│   │   ├── dotnet/
│   │   │   ├── .gitignore
│   │   │   ├── PrqlCompiler/
│   │   │   │   ├── Message.cs
│   │   │   │   ├── MessageKind.cs
│   │   │   │   ├── NativePrqlCompilerOptions.cs
│   │   │   │   ├── NativeResult.cs
│   │   │   │   ├── PrqlCompiler.cs
│   │   │   │   ├── PrqlCompiler.csproj
│   │   │   │   ├── PrqlCompilerOptions.cs
│   │   │   │   ├── Result.cs
│   │   │   │   ├── SourceLocation.cs
│   │   │   │   └── Span.cs
│   │   │   ├── PrqlCompiler.Tests/
│   │   │   │   ├── CompilerTest.cs
│   │   │   │   ├── PrqlCompiler.Tests.csproj
│   │   │   │   └── Usings.cs
│   │   │   ├── README.md
│   │   │   └── prql-net.sln
│   │   ├── elixir/
│   │   │   ├── .formatter.exs
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── lib/
│   │   │   │   ├── prql/
│   │   │   │   │   ├── errors.ex
│   │   │   │   │   └── native.ex
│   │   │   │   └── prql.ex
│   │   │   ├── mix.exs
│   │   │   ├── native/
│   │   │   │   └── prql/
│   │   │   │       ├── .cargo/
│   │   │   │       │   └── config.toml
│   │   │   │       ├── Cargo.toml
│   │   │   │       ├── README.md
│   │   │   │       └── src/
│   │   │   │           └── lib.rs
│   │   │   └── test/
│   │   │       ├── prql_test.exs
│   │   │       └── test_helper.exs
│   │   ├── java/
│   │   │   ├── .gitignore
│   │   │   ├── Cargo.toml
│   │   │   ├── DEVELOPMENT.md
│   │   │   ├── README.md
│   │   │   ├── cross.sh
│   │   │   ├── java/
│   │   │   │   ├── .mvn/
│   │   │   │   │   └── wrapper/
│   │   │   │   │       ├── maven-wrapper.jar
│   │   │   │   │       └── maven-wrapper.properties
│   │   │   │   ├── build.sh
│   │   │   │   ├── mvnw
│   │   │   │   ├── mvnw.cmd
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   ├── java/
│   │   │   │       │   │   └── org/
│   │   │   │       │   │       └── prql/
│   │   │   │       │   │           └── prql4j/
│   │   │   │       │   │               ├── Environment.java
│   │   │   │       │   │               ├── NativeLibraryLoader.java
│   │   │   │       │   │               └── PrqlCompiler.java
│   │   │   │       │   └── resources/
│   │   │   │       │       └── .gitkeep
│   │   │   │       └── test/
│   │   │   │           ├── java/
│   │   │   │           │   └── org/
│   │   │   │           │       └── prql/
│   │   │   │           │           └── prql4j/
│   │   │   │           │               └── PrqlCompilerTest.java
│   │   │   │           └── resources/
│   │   │   │               └── .gitkeep
│   │   │   └── src/
│   │   │       └── lib.rs
│   │   ├── js/
│   │   │   ├── Cargo.toml
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   └── lib.rs
│   │   │   └── tests/
│   │   │       └── test_all.mjs
│   │   ├── php/
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   ├── phpstan.neon
│   │   │   ├── src/
│   │   │   │   ├── Compiler.php
│   │   │   │   ├── Message.php
│   │   │   │   ├── MessageKind.php
│   │   │   │   ├── Options.php
│   │   │   │   ├── Result.php
│   │   │   │   ├── SourceLocation.php
│   │   │   │   └── Span.php
│   │   │   └── tests/
│   │   │       └── CompilerTest.php
│   │   ├── prqlc-c/
│   │   │   ├── Cargo.toml
│   │   │   ├── README.md
│   │   │   ├── cbindgen.toml
│   │   │   ├── examples/
│   │   │   │   ├── minimal-c/
│   │   │   │   │   ├── Makefile
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── main.c
│   │   │   │   ├── minimal-cpp/
│   │   │   │   │   ├── Makefile
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── main.cpp
│   │   │   │   └── minimal-zig/
│   │   │   │       ├── .gitignore
│   │   │   │       ├── README.md
│   │   │   │       ├── Taskfile.yaml
│   │   │   │       ├── build.zig
│   │   │   │       └── src/
│   │   │   │           └── main.zig
│   │   │   ├── prqlc.h
│   │   │   ├── prqlc.hpp
│   │   │   └── src/
│   │   │       └── lib.rs
│   │   └── prqlc-python/
│   │       ├── .gitignore
│   │       ├── Cargo.toml
│   │       ├── README.md
│   │       ├── Taskfile.yaml
│   │       ├── build.rs
│   │       ├── noxfile.py
│   │       ├── pyproject.toml
│   │       ├── python/
│   │       │   ├── prqlc/
│   │       │   │   ├── __init__.py
│   │       │   │   ├── __init__.pyi
│   │       │   │   ├── debug.pyi
│   │       │   │   └── py.typed
│   │       │   └── tests/
│   │       │       └── test_all.py
│   │       └── src/
│   │           └── lib.rs
│   ├── packages/
│   │   └── snap/
│   │       └── snapcraft.yaml
│   ├── prqlc/
│   │   ├── ARCHITECTURE.md
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   ├── benches/
│   │   │   ├── bench.rs
│   │   │   └── bench_impl.rs
│   │   ├── build.rs
│   │   ├── examples/
│   │   │   └── compile-files/
│   │   │       ├── Cargo.toml
│   │   │       ├── README.md
│   │   │       ├── build.rs
│   │   │       ├── queries/
│   │   │       │   ├── arrays.prql
│   │   │       │   ├── query1.prql
│   │   │       │   └── variables.prql
│   │   │       └── src/
│   │   │           └── main.rs
│   │   ├── src/
│   │   │   ├── cli/
│   │   │   │   ├── docs_generator.rs
│   │   │   │   ├── highlight.rs
│   │   │   │   ├── jinja.rs
│   │   │   │   ├── lsp.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── snapshots/
│   │   │   │   │   ├── prqlc__cli__test__shell_completion-2.snap
│   │   │   │   │   ├── prqlc__cli__test__shell_completion-3.snap
│   │   │   │   │   ├── prqlc__cli__test__shell_completion-4.snap
│   │   │   │   │   └── prqlc__cli__test__shell_completion.snap
│   │   │   │   ├── test.rs
│   │   │   │   └── watch.rs
│   │   │   ├── codegen/
│   │   │   │   ├── ast.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── types.rs
│   │   │   ├── debug/
│   │   │   │   ├── log.rs
│   │   │   │   ├── messages.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── render_html.rs
│   │   │   ├── error_message.rs
│   │   │   ├── ir/
│   │   │   │   ├── decl.rs
│   │   │   │   ├── generic.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── pl/
│   │   │   │   │   ├── expr.rs
│   │   │   │   │   ├── extra.rs
│   │   │   │   │   ├── fold.rs
│   │   │   │   │   ├── lineage.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── stmt.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   └── rq/
│   │   │   │       ├── expr.rs
│   │   │   │       ├── fold.rs
│   │   │   │       ├── ids.rs
│   │   │   │       ├── mod.rs
│   │   │   │       ├── transform.rs
│   │   │   │       └── utils.rs
│   │   │   ├── lib.rs
│   │   │   ├── main.rs
│   │   │   ├── parser.rs
│   │   │   ├── semantic/
│   │   │   │   ├── ast_expand.rs
│   │   │   │   ├── lowering.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── module.rs
│   │   │   │   ├── reporting.rs
│   │   │   │   ├── resolver/
│   │   │   │   │   ├── expr.rs
│   │   │   │   │   ├── flatten.rs
│   │   │   │   │   ├── functions.rs
│   │   │   │   │   ├── inference.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── names.rs
│   │   │   │   │   ├── snapshots/
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__append_union_different_tables.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__frames_and_names-2.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__frames_and_names-3.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__frames_and_names.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__functions_1.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__functions_nested.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__functions_pipeline-2.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__functions_pipeline.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__named_args.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__variables_1.snap
│   │   │   │   │   │   └── prqlc__semantic__resolver__transforms__tests__aggregate_positional_arg-2.snap
│   │   │   │   │   ├── static_eval.rs
│   │   │   │   │   ├── stmt.rs
│   │   │   │   │   ├── transforms.rs
│   │   │   │   │   └── types.rs
│   │   │   │   └── std.prql
│   │   │   ├── sql/
│   │   │   │   ├── dialect.rs
│   │   │   │   ├── gen_expr.rs
│   │   │   │   ├── gen_projection.rs
│   │   │   │   ├── gen_query.rs
│   │   │   │   ├── keywords.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── operators.rs
│   │   │   │   ├── pq/
│   │   │   │   │   ├── anchor.rs
│   │   │   │   │   ├── ast.rs
│   │   │   │   │   ├── context.rs
│   │   │   │   │   ├── gen_query.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── positional_mapping.rs
│   │   │   │   │   ├── postprocess.rs
│   │   │   │   │   └── preprocess.rs
│   │   │   │   └── std.sql.prql
│   │   │   └── utils/
│   │   │       ├── id_gen.rs
│   │   │       ├── mod.rs
│   │   │       └── toposort.rs
│   │   └── tests/
│   │       ├── CLAUDE.md
│   │       └── integration/
│   │           ├── bad_error_messages.rs
│   │           ├── data/
│   │           │   └── chinook/
│   │           │       ├── albums.csv
│   │           │       ├── artists.csv
│   │           │       ├── customers.csv
│   │           │       ├── employees.csv
│   │           │       ├── genres.csv
│   │           │       ├── invoice_items.csv
│   │           │       ├── invoices.csv
│   │           │       ├── media_types.csv
│   │           │       ├── media_types.json
│   │           │       ├── playlist_track.csv
│   │           │       ├── playlists.csv
│   │           │       ├── schema.sql
│   │           │       └── tracks.csv
│   │           ├── dbs/
│   │           │   ├── README.md
│   │           │   ├── docker-compose.yaml
│   │           │   ├── dockerfiles/
│   │           │   │   └── glaredb.Dockerfile
│   │           │   ├── mod.rs
│   │           │   ├── protocol.rs
│   │           │   └── runner.rs
│   │           ├── error_messages.rs
│   │           ├── main.rs
│   │           ├── project/
│   │           │   ├── Project.prql
│   │           │   └── artists.prql
│   │           ├── queries/
│   │           │   ├── aggregation.prql
│   │           │   ├── append_select.prql
│   │           │   ├── append_select_compute.prql
│   │           │   ├── append_select_multiple_with_null.prql
│   │           │   ├── append_select_nulls.prql
│   │           │   ├── append_select_simple.prql
│   │           │   ├── arithmetic.prql
│   │           │   ├── cast.prql
│   │           │   ├── constants_only.prql
│   │           │   ├── date_to_text.prql
│   │           │   ├── distinct.prql
│   │           │   ├── distinct_on.prql
│   │           │   ├── genre_counts.prql
│   │           │   ├── group_all.prql
│   │           │   ├── group_sort.prql
│   │           │   ├── group_sort_derive_select_join.prql
│   │           │   ├── group_sort_filter_derive_select_join.prql
│   │           │   ├── group_sort_limit_take.prql
│   │           │   ├── invoice_totals.prql
│   │           │   ├── loop_01.prql
│   │           │   ├── math_module.prql
│   │           │   ├── pipelines.prql
│   │           │   ├── read_csv.prql
│   │           │   ├── set_ops_remove.prql
│   │           │   ├── sort.prql
│   │           │   ├── sort_2.prql
│   │           │   ├── sort_3.prql
│   │           │   ├── switch.prql
│   │           │   ├── take.prql
│   │           │   ├── text_module.prql
│   │           │   └── window.prql
│   │           ├── queries.rs
│   │           ├── snapshots/
│   │           │   ├── integration__queries__compile__aggregation.snap
│   │           │   ├── integration__queries__compile__append_select.snap
│   │           │   ├── integration__queries__compile__append_select_compute.snap
│   │           │   ├── integration__queries__compile__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__compile__append_select_nulls.snap
│   │           │   ├── integration__queries__compile__append_select_simple.snap
│   │           │   ├── integration__queries__compile__arithmetic.snap
│   │           │   ├── integration__queries__compile__cast.snap
│   │           │   ├── integration__queries__compile__constants_only.snap
│   │           │   ├── integration__queries__compile__distinct.snap
│   │           │   ├── integration__queries__compile__distinct_on.snap
│   │           │   ├── integration__queries__compile__genre_counts.snap
│   │           │   ├── integration__queries__compile__group_all.snap
│   │           │   ├── integration__queries__compile__group_sort.snap
│   │           │   ├── integration__queries__compile__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__compile__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__compile__group_sort_limit_take.snap
│   │           │   ├── integration__queries__compile__invoice_totals.snap
│   │           │   ├── integration__queries__compile__loop_01.snap
│   │           │   ├── integration__queries__compile__math_module.snap
│   │           │   ├── integration__queries__compile__pipelines.snap
│   │           │   ├── integration__queries__compile__read_csv.snap
│   │           │   ├── integration__queries__compile__set_ops_remove.snap
│   │           │   ├── integration__queries__compile__sort.snap
│   │           │   ├── integration__queries__compile__sort_2.snap
│   │           │   ├── integration__queries__compile__sort_3.snap
│   │           │   ├── integration__queries__compile__switch.snap
│   │           │   ├── integration__queries__compile__take.snap
│   │           │   ├── integration__queries__compile__text_module.snap
│   │           │   ├── integration__queries__compile__window.snap
│   │           │   ├── integration__queries__compileall__aggregation.snap
│   │           │   ├── integration__queries__compileall__append_select.snap
│   │           │   ├── integration__queries__compileall__append_select_compute.snap
│   │           │   ├── integration__queries__compileall__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__compileall__append_select_nulls.snap
│   │           │   ├── integration__queries__compileall__append_select_simple.snap
│   │           │   ├── integration__queries__compileall__arithmetic.snap
│   │           │   ├── integration__queries__compileall__cast.snap
│   │           │   ├── integration__queries__compileall__constants_only.snap
│   │           │   ├── integration__queries__compileall__distinct.snap
│   │           │   ├── integration__queries__compileall__distinct_on.snap
│   │           │   ├── integration__queries__compileall__genre_counts.snap
│   │           │   ├── integration__queries__compileall__group_all.snap
│   │           │   ├── integration__queries__compileall__group_sort.snap
│   │           │   ├── integration__queries__compileall__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__compileall__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__compileall__group_sort_limit_take.snap
│   │           │   ├── integration__queries__compileall__invoice_totals.snap
│   │           │   ├── integration__queries__compileall__loop_01.snap
│   │           │   ├── integration__queries__compileall__math_module.snap
│   │           │   ├── integration__queries__compileall__pipelines.snap
│   │           │   ├── integration__queries__compileall__read_csv.snap
│   │           │   ├── integration__queries__compileall__set_ops_remove.snap
│   │           │   ├── integration__queries__compileall__sort.snap
│   │           │   ├── integration__queries__compileall__sort_2.snap
│   │           │   ├── integration__queries__compileall__sort_3.snap
│   │           │   ├── integration__queries__compileall__switch.snap
│   │           │   ├── integration__queries__compileall__take.snap
│   │           │   ├── integration__queries__compileall__text_module.snap
│   │           │   ├── integration__queries__compileall__window.snap
│   │           │   ├── integration__queries__debug_lineage__aggregation.snap
│   │           │   ├── integration__queries__debug_lineage__append_select.snap
│   │           │   ├── integration__queries__debug_lineage__append_select_compute.snap
│   │           │   ├── integration__queries__debug_lineage__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__debug_lineage__append_select_nulls.snap
│   │           │   ├── integration__queries__debug_lineage__append_select_simple.snap
│   │           │   ├── integration__queries__debug_lineage__arithmetic.snap
│   │           │   ├── integration__queries__debug_lineage__cast.snap
│   │           │   ├── integration__queries__debug_lineage__constants_only.snap
│   │           │   ├── integration__queries__debug_lineage__date_to_text.snap
│   │           │   ├── integration__queries__debug_lineage__distinct.snap
│   │           │   ├── integration__queries__debug_lineage__distinct_on.snap
│   │           │   ├── integration__queries__debug_lineage__genre_counts.snap
│   │           │   ├── integration__queries__debug_lineage__group_all.snap
│   │           │   ├── integration__queries__debug_lineage__group_sort.snap
│   │           │   ├── integration__queries__debug_lineage__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__debug_lineage__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__debug_lineage__group_sort_limit_take.snap
│   │           │   ├── integration__queries__debug_lineage__invoice_totals.snap
│   │           │   ├── integration__queries__debug_lineage__loop_01.snap
│   │           │   ├── integration__queries__debug_lineage__math_module.snap
│   │           │   ├── integration__queries__debug_lineage__pipelines.snap
│   │           │   ├── integration__queries__debug_lineage__read_csv.snap
│   │           │   ├── integration__queries__debug_lineage__set_ops_remove.snap
│   │           │   ├── integration__queries__debug_lineage__sort.snap
│   │           │   ├── integration__queries__debug_lineage__sort_2.snap
│   │           │   ├── integration__queries__debug_lineage__sort_3.snap
│   │           │   ├── integration__queries__debug_lineage__switch.snap
│   │           │   ├── integration__queries__debug_lineage__take.snap
│   │           │   ├── integration__queries__debug_lineage__text_module.snap
│   │           │   ├── integration__queries__debug_lineage__window.snap
│   │           │   ├── integration__queries__fmt__aggregation.snap
│   │           │   ├── integration__queries__fmt__append_select.snap
│   │           │   ├── integration__queries__fmt__append_select_compute.snap
│   │           │   ├── integration__queries__fmt__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__fmt__append_select_nulls.snap
│   │           │   ├── integration__queries__fmt__append_select_simple.snap
│   │           │   ├── integration__queries__fmt__arithmetic.snap
│   │           │   ├── integration__queries__fmt__cast.snap
│   │           │   ├── integration__queries__fmt__constants_only.snap
│   │           │   ├── integration__queries__fmt__date_to_text.snap
│   │           │   ├── integration__queries__fmt__distinct.snap
│   │           │   ├── integration__queries__fmt__distinct_on.snap
│   │           │   ├── integration__queries__fmt__genre_counts.snap
│   │           │   ├── integration__queries__fmt__group_all.snap
│   │           │   ├── integration__queries__fmt__group_sort.snap
│   │           │   ├── integration__queries__fmt__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__fmt__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__fmt__group_sort_limit_take.snap
│   │           │   ├── integration__queries__fmt__invoice_totals.snap
│   │           │   ├── integration__queries__fmt__loop_01.snap
│   │           │   ├── integration__queries__fmt__math_module.snap
│   │           │   ├── integration__queries__fmt__pipelines.snap
│   │           │   ├── integration__queries__fmt__read_csv.snap
│   │           │   ├── integration__queries__fmt__set_ops_remove.snap
│   │           │   ├── integration__queries__fmt__sort.snap
│   │           │   ├── integration__queries__fmt__sort_2.snap
│   │           │   ├── integration__queries__fmt__sort_3.snap
│   │           │   ├── integration__queries__fmt__switch.snap
│   │           │   ├── integration__queries__fmt__take.snap
│   │           │   ├── integration__queries__fmt__text_module.snap
│   │           │   ├── integration__queries__fmt__window.snap
│   │           │   ├── integration__queries__lex__aggregation.snap
│   │           │   ├── integration__queries__lex__append_select.snap
│   │           │   ├── integration__queries__lex__append_select_compute.snap
│   │           │   ├── integration__queries__lex__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__lex__append_select_nulls.snap
│   │           │   ├── integration__queries__lex__append_select_simple.snap
│   │           │   ├── integration__queries__lex__arithmetic.snap
│   │           │   ├── integration__queries__lex__cast.snap
│   │           │   ├── integration__queries__lex__constants_only.snap
│   │           │   ├── integration__queries__lex__date_to_text.snap
│   │           │   ├── integration__queries__lex__distinct.snap
│   │           │   ├── integration__queries__lex__distinct_on.snap
│   │           │   ├── integration__queries__lex__genre_counts.snap
│   │           │   ├── integration__queries__lex__group_all.snap
│   │           │   ├── integration__queries__lex__group_sort.snap
│   │           │   ├── integration__queries__lex__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__lex__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__lex__group_sort_limit_take.snap
│   │           │   ├── integration__queries__lex__invoice_totals.snap
│   │           │   ├── integration__queries__lex__loop_01.snap
│   │           │   ├── integration__queries__lex__math_module.snap
│   │           │   ├── integration__queries__lex__pipelines.snap
│   │           │   ├── integration__queries__lex__read_csv.snap
│   │           │   ├── integration__queries__lex__set_ops_remove.snap
│   │           │   ├── integration__queries__lex__sort.snap
│   │           │   ├── integration__queries__lex__sort_2.snap
│   │           │   ├── integration__queries__lex__sort_3.snap
│   │           │   ├── integration__queries__lex__switch.snap
│   │           │   ├── integration__queries__lex__take.snap
│   │           │   ├── integration__queries__lex__text_module.snap
│   │           │   ├── integration__queries__lex__window.snap
│   │           │   ├── integration__queries__results__aggregation.snap
│   │           │   ├── integration__queries__results__append_select.snap
│   │           │   ├── integration__queries__results__append_select_compute.snap
│   │           │   ├── integration__queries__results__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__results__append_select_nulls.snap
│   │           │   ├── integration__queries__results__append_select_simple.snap
│   │           │   ├── integration__queries__results__arithmetic.snap
│   │           │   ├── integration__queries__results__cast.snap
│   │           │   ├── integration__queries__results__constants_only.snap
│   │           │   ├── integration__queries__results__date_to_text.snap
│   │           │   ├── integration__queries__results__distinct.snap
│   │           │   ├── integration__queries__results__distinct_on.snap
│   │           │   ├── integration__queries__results__genre_counts.snap
│   │           │   ├── integration__queries__results__group_all.snap
│   │           │   ├── integration__queries__results__group_sort.snap
│   │           │   ├── integration__queries__results__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__results__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__results__group_sort_limit_take.snap
│   │           │   ├── integration__queries__results__invoice_totals.snap
│   │           │   ├── integration__queries__results__loop_01.snap
│   │           │   ├── integration__queries__results__math_module.snap
│   │           │   ├── integration__queries__results__pipelines.snap
│   │           │   ├── integration__queries__results__read_csv.snap
│   │           │   ├── integration__queries__results__set_ops_remove.snap
│   │           │   ├── integration__queries__results__sort.snap
│   │           │   ├── integration__queries__results__sort_2.snap
│   │           │   ├── integration__queries__results__sort_3.snap
│   │           │   ├── integration__queries__results__switch.snap
│   │           │   ├── integration__queries__results__take.snap
│   │           │   ├── integration__queries__results__text_module.snap
│   │           │   └── integration__queries__results__window.snap
│   │           └── sql.rs
│   ├── prqlc-macros/
│   │   ├── Cargo.toml
│   │   └── src/
│   │       └── lib.rs
│   └── prqlc-parser/
│       ├── Cargo.toml
│       └── src/
│           ├── error.rs
│           ├── generic.rs
│           ├── lexer/
│           │   ├── lr.rs
│           │   ├── mod.rs
│           │   └── test.rs
│           ├── lib.rs
│           ├── parser/
│           │   ├── expr.rs
│           │   ├── interpolation.rs
│           │   ├── mod.rs
│           │   ├── perror.rs
│           │   ├── pr/
│           │   │   ├── expr.rs
│           │   │   ├── ident.rs
│           │   │   ├── mod.rs
│           │   │   ├── ops.rs
│           │   │   ├── stmt.rs
│           │   │   └── types.rs
│           │   ├── stmt.rs
│           │   ├── test.rs
│           │   └── types.rs
│           ├── snapshots/
│           │   └── prqlc_parser__test__pipeline_parse_tree.snap
│           ├── span.rs
│           └── test.rs
├── rust-toolchain.toml
└── web/
    ├── .gitignore
    ├── Taskfile.yaml
    ├── book/
    │   ├── Cargo.toml
    │   ├── README.md
    │   ├── book.toml
    │   ├── comparison-table.css
    │   ├── highlight-prql.js
    │   ├── src/
    │   │   ├── README.md
    │   │   ├── SUMMARY.md
    │   │   ├── lib.rs
    │   │   ├── main.rs
    │   │   ├── project/
    │   │   │   ├── bindings/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── dotnet.md
    │   │   │   │   ├── elixir.md
    │   │   │   │   ├── java.md
    │   │   │   │   ├── javascript.md
    │   │   │   │   ├── php.md
    │   │   │   │   ├── python.md
    │   │   │   │   ├── r.md
    │   │   │   │   └── rust.md
    │   │   │   ├── changelog.md
    │   │   │   ├── contributing/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── development.md
    │   │   │   │   ├── fortnightly-dev-call.ics
    │   │   │   │   └── language-design.md
    │   │   │   ├── integrations/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── clickhouse.md
    │   │   │   │   ├── databend.md
    │   │   │   │   ├── duckdb.md
    │   │   │   │   ├── jupyter.md
    │   │   │   │   ├── postgresql.md
    │   │   │   │   ├── prefect.md
    │   │   │   │   ├── prqlc-cli.md
    │   │   │   │   ├── qstudio.md
    │   │   │   │   ├── rill.md
    │   │   │   │   ├── syntax-highlighting.md
    │   │   │   │   └── vscode.md
    │   │   │   └── target.md
    │   │   ├── reference/
    │   │   │   ├── data/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── from.md
    │   │   │   │   ├── read-files.md
    │   │   │   │   └── relation-literals.md
    │   │   │   ├── declarations/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── functions.md
    │   │   │   │   └── variables.md
    │   │   │   ├── spec/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── modules.md
    │   │   │   │   ├── name-resolution.md
    │   │   │   │   ├── null.md
    │   │   │   │   └── type-system.md
    │   │   │   ├── stdlib/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── date.md
    │   │   │   │   ├── distinct.md
    │   │   │   │   ├── math.md
    │   │   │   │   ├── text.md
    │   │   │   │   └── transforms/
    │   │   │   │       ├── README.md
    │   │   │   │       ├── aggregate.md
    │   │   │   │       ├── append.md
    │   │   │   │       ├── derive.md
    │   │   │   │       ├── filter.md
    │   │   │   │       ├── group.md
    │   │   │   │       ├── join.md
    │   │   │   │       ├── loop.md
    │   │   │   │       ├── select.md
    │   │   │   │       ├── sort.md
    │   │   │   │       ├── take.md
    │   │   │   │       └── window.md
    │   │   │   └── syntax/
    │   │   │       ├── README.md
    │   │   │       ├── arrays.md
    │   │   │       ├── case.md
    │   │   │       ├── comments.md
    │   │   │       ├── f-strings.md
    │   │   │       ├── function-calls.md
    │   │   │       ├── keywords.md
    │   │   │       ├── literals.md
    │   │   │       ├── operators.md
    │   │   │       ├── parameters.md
    │   │   │       ├── pipes.md
    │   │   │       ├── r-strings.md
    │   │   │       ├── ranges.md
    │   │   │       ├── s-strings.md
    │   │   │       ├── strings.md
    │   │   │       └── tuples.md
    │   │   └── tutorial/
    │   │       ├── aggregation.md
    │   │       ├── annotated_example.md
    │   │       ├── filtering.md
    │   │       └── relations.md
    │   ├── tests/
    │   │   └── documentation/
    │   │       ├── README.md
    │   │       ├── book.rs
    │   │       ├── main.rs
    │   │       ├── readme.rs
    │   │       ├── snapshots/
    │   │       │   ├── documentation__book__README__prql-language-book__0.snap
    │   │       │   ├── documentation__book__README__prql-language-book__1.snap
    │   │       │   ├── documentation__book__project__target__examples__0.snap
    │   │       │   ├── documentation__book__project__target__examples__1.snap
    │   │       │   ├── documentation__book__project__target__version__0.snap
    │   │       │   ├── documentation__book__project__target__version__1.snap
    │   │       │   ├── documentation__book__reference__data__from__0.snap
    │   │       │   ├── documentation__book__reference__data__from__1.snap
    │   │       │   ├── documentation__book__reference__data__from__2.snap
    │   │       │   ├── documentation__book__reference__data__from__3.snap
    │   │       │   ├── documentation__book__reference__data__read-files__reading-files__0.snap
    │   │       │   ├── documentation__book__reference__data__read-files__reading-files__1.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__0.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__1.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__2.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__3.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__4.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__1.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__late-binding__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__other-examples__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__partial-application__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__partial-application__1.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__partial-application__2.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__piping-values-into-functions__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__piping-values-into-functions__1.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__piping-values-into-functions__2.snap
    │   │       │   ├── documentation__book__reference__declarations__variables__variables--__0.snap
    │   │       │   ├── documentation__book__reference__declarations__variables__variables--__1.snap
    │   │       │   ├── documentation__book__reference__declarations__variables__variables--__2.snap
    │   │       │   ├── documentation__book__reference__spec__name-resolution__translating-to-sql__0.snap
    │   │       │   ├── documentation__book__reference__spec__name-resolution__translating-to-sql__1.snap
    │   │       │   ├── documentation__book__reference__spec__null__null-handling__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__README__standard-library__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__README__standard-library__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__README__standard-library__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__date__date-functions__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__date__date-functions__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__date__date-functions__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__distinct__how-do-i-remove-duplicates__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__distinct__how-do-i-remove-duplicates__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__distinct__remove-duplicates-from-each-group__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__distinct__remove-duplicates-from-each-group__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__math__example__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__text__example__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__aggregate__aggregate-is-required__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__aggregate__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__aggregate__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__append__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__append__intersection__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__append__remove__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__derive__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__derive__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__filter__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__filter__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__filter__examples__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__filter__examples__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__group__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__group__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__group__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__4.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__loop__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__examples__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__examples__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__excluding-columns__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__excluding-columns__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__excluding-columns__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__excluding-columns__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__examples__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__examples__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__ordering-guarantees__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__take__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__take__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__example__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__example__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__example__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__window-functions-as-first-class-citizens__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__windowing-by-default__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__windowing-by-default__1.snap
    │   │       │   ├── documentation__book__reference__syntax__case__0.snap
    │   │       │   ├── documentation__book__reference__syntax__case__1.snap
    │   │       │   ├── documentation__book__reference__syntax__comments__0.snap
    │   │       │   ├── documentation__book__reference__syntax__f-strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__f-strings__1.snap
    │   │       │   ├── documentation__book__reference__syntax__f-strings__2.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__0.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__identifiers--keywords__0.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__identifiers--keywords__1.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__identifiers--keywords__2.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__identifiers--keywords__3.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__quoting__0.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__quoting__1.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__quoting__2.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__schemas--database-names__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__dates__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__durations__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__numbers__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__times__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__timestamps__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__coalesce__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__division-and-integer-division__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__parentheses__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__parentheses__1.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__parentheses__2.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__1.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__2.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__3.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__4.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__5.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__wrapping-lines__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__wrapping-lines__1.snap
    │   │       │   ├── documentation__book__reference__syntax__parameters__0.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__0.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__1.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__ceci-nest-pas-une-pipe__0.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__ceci-nest-pas-une-pipe__1.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__inner-transforms__0.snap
    │   │       │   ├── documentation__book__reference__syntax__r-strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__ranges__0.snap
    │   │       │   ├── documentation__book__reference__syntax__ranges__1.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__1.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__2.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__3.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__braces__0.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__precedence-within-s-strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__precedence-within-s-strings__1.snap
    │   │       │   ├── documentation__book__reference__syntax__strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__strings__quoting-and-escape-characters__0.snap
    │   │       │   ├── documentation__book__reference__syntax__strings__quoting-and-escape-characters__1.snap
    │   │       │   ├── documentation__book__reference__syntax__tuples__0.snap
    │   │       │   └── documentation__book__reference__syntax__tuples__1.snap
    │   │       └── website.rs
    │   └── theme/
    │       ├── head.hbs
    │       └── highlight.js
    ├── playground/
    │   ├── .eslintrc.cjs
    │   ├── .gitignore
    │   ├── README.md
    │   ├── generateBook.cjs
    │   ├── index.html
    │   ├── package.json
    │   ├── public/
    │   │   ├── manifest.json
    │   │   └── robots.txt
    │   ├── src/
    │   │   ├── app/
    │   │   │   ├── App.css
    │   │   │   └── App.jsx
    │   │   ├── examples.js
    │   │   ├── highlight.css
    │   │   ├── index.css
    │   │   ├── main.jsx
    │   │   ├── output/
    │   │   │   ├── Output.css
    │   │   │   └── Output.jsx
    │   │   ├── reportWebVitals.js
    │   │   ├── setupTests.js
    │   │   ├── sidebar/
    │   │   │   ├── Sidebar.css
    │   │   │   └── Sidebar.jsx
    │   │   └── workbench/
    │   │       ├── Workbench.css
    │   │       ├── Workbench.jsx
    │   │       ├── duckdb.js
    │   │       ├── monaco-theme.json
    │   │       └── prql-syntax.js
    │   └── vite.config.js
    ├── prql-codemirror-demo/
    │   ├── .gitignore
    │   ├── README.md
    │   ├── index.html
    │   ├── package.json
    │   ├── src/
    │   │   ├── codemirror.ts
    │   │   ├── lang-prql/
    │   │   │   ├── complete.ts
    │   │   │   └── prql.ts
    │   │   ├── main.ts
    │   │   ├── style.css
    │   │   └── vite-env.d.ts
    │   └── tsconfig.json
    └── website/
        ├── .gitignore
        ├── README.md
        ├── archetypes/
        │   └── default.md
        ├── config.yaml
        ├── content/
        │   ├── _index.md
        │   ├── demos/
        │   │   └── ace-demo.html
        │   ├── faq.md
        │   ├── playground.html
        │   ├── posts/
        │   │   ├── 2022-05-19-examples.md
        │   │   ├── 2023-01-07-functional-relations.md
        │   │   ├── 2023-01-27-prql-query.md
        │   │   ├── 2023-01-28-format-pretty-reports/
        │   │   │   └── _index.md
        │   │   ├── 2023-02-02-one-year/
        │   │   │   └── _index.md
        │   │   └── 2023-03-14-pi-day.md
        │   └── roadmap.md
        ├── data/
        │   ├── examples/
        │   │   ├── basic.yaml
        │   │   ├── dialects.yaml
        │   │   ├── expressions.yaml
        │   │   ├── f-strings.yaml
        │   │   ├── friendly-syntax.yaml
        │   │   ├── functions.yaml
        │   │   ├── hero.yaml
        │   │   ├── joins.yaml
        │   │   ├── null-handling.yaml
        │   │   ├── orthogonal.yaml
        │   │   ├── s-strings.yaml
        │   │   ├── top-n.yaml
        │   │   └── windows.yaml
        │   └── testimonials.yaml
        ├── static/
        │   └── CNAME
        └── themes/
            └── prql-theme/
                ├── archetypes/
                │   └── default.md
                ├── layouts/
                │   ├── 404.html
                │   ├── _default/
                │   │   ├── _markup/
                │   │   │   └── render-link.html
                │   │   ├── article.html
                │   │   ├── baseof.html
                │   │   ├── big_iframe.html
                │   │   ├── home.html
                │   │   ├── list.html
                │   │   └── single.html
                │   ├── partials/
                │   │   ├── footer.html
                │   │   ├── head.html
                │   │   ├── header.html
                │   │   ├── section-cards.html
                │   │   └── section-testimonials.html
                │   └── shortcodes/
                │       ├── cite.html
                │       ├── columns.html
                │       ├── faq.html
                │       └── link.html
                ├── static/
                │   ├── main.js
                │   ├── plugins/
                │   │   └── highlight/
                │   │       ├── highlight.css
                │   │       └── prql.js
                │   └── style.css
                └── theme.toml

================================================
FILE CONTENTS
================================================

================================================
FILE: .cargo/config.toml
================================================
[target.wasm32-unknown-unknown]
runner = 'wasm-bindgen-test-runner'

[target.x86_64-pc-windows-msvc]
# https://github.com/rust-lang/rust/issues/141626#issuecomment-2919988483
linker = "rust-lld"

[resolver]
incompatible-rust-versions = "fallback"


================================================
FILE: .config/insta.yaml
================================================
behavior:
  # Disabling because of issues with running on Windows
  # force_update: true
review:
  # The default (true) has a small performance hit and never needed for us
  warn_undiscovered: false
  include_ignored: false
  include_hidden: false


================================================
FILE: .config/lychee.toml
================================================
# Lychee link checker configuration
# See: https://github.com/lycheeverse/lychee

# Retry configuration for network errors
max_retries = 5
retry_wait_time = 30  # seconds between retries

# Timeout configuration
timeout = 20  # seconds

# Maximum redirects to follow
max_redirects = 5

# Accept these status codes as valid
accept = [200, 206, 429]

# Exclude patterns - URLs to ignore
exclude = [
  # Sites that block GitHub Actions or have reliability issues
  "^https://twitter\\.com",
  "^https://www\\.cs\\.ox\\.ac\\.uk",
  "^https://www\\.php\\.net",
  "^https://github\\.com/.*container",
  "^https://benn\\.substack\\.com",
  "^https://stackoverflow\\.com",
  "^https://www\\.npmjs\\.com",
  "^https://invent\\.kde\\.org",
  "^https://news\\.ycombinator\\.com",
  "^https://repology\\.org",
]

# Use cache to reduce rate limiting issues
cache = true
max_cache_age = "1d"


================================================
FILE: .config/nextest.toml
================================================
[profile.default]
fail-fast = false
failure-output = "final"
slow-timeout = { period = "500ms" }

[[profile.default.overrides]]
# compileall does many passes over the same query, so it takes a bit longer
filter = 'package(prqlc) & test(queries::)'
slow-timeout = { period = "2s" }

[[profile.default.overrides]]
# compileall does many passes over the same query, so it takes a bit longer
filter = 'package(prqlc) & test(queries::compileall::)'
slow-timeout = { period = "10s" }

[[profile.default.overrides]]
filter = 'package(prqlc) & test(queries::results::)'
slow-timeout = { period = "10s" }
test-group = 'test-dbs'

[test-groups.test-dbs]
# test-dbs runs database setup when the connection is established, and because
# nextest runs test in separate processes, this happens on every test. To
# prevent multiple setups running at once, we set max-threads to 1. Ideally, we
# could run tests in parallel and they would use a locking mechanism to see if
# the database has already been setup. For now, we can use cargo test instead.
max-threads = 1

[[profile.default.overrides]]
# cli tests take a bit longer
filter = 'test(cli)'
slow-timeout = { period = "2s" }

[[profile.default.overrides]]
filter = 'package(mdbook-prql)'
# These are testing dozens of queries, so we give them more time.
slow-timeout = { period = "20s" }
test-group = 'docs-mdbook'

[test-groups.docs-mdbook]
max-threads = 'num-cpus'


================================================
FILE: .config/vscode-recommended/launch.json
================================================
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "lldb",
      "request": "launch",
      "name": "prqlc _a.prql",
      "program": "${workspaceFolder}/target/debug/prqlc",
      "args": ["debug", "semantics", "_a.prql"],
      "env": {
        "RUST_LOG": "debug",
        "RUST_BACKTRACE": "1"
      },
      "preLaunchTask": "prqlc-build",
      "cwd": "${workspaceFolder}"
    }
  ]
}


================================================
FILE: .config/vscode-recommended/settings.json
================================================
{
  "files.exclude": {
    "**/.git": true,
    "**/.svn": true,
    "**/.hg": true,
    "**/CVS": true,
    "**/.DS_Store": true,
    "**/Thumbs.db": true,
    "web/book/book": true,
    "web/build": true,
    ".direnv": true,
    ".pytest_cache": true,
    ".mypy_cache": true
  }
}


================================================
FILE: .config/vscode-recommended/tasks.json
================================================
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "prqlc-build",
      "type": "cargo",
      "command": "build",
      "args": ["--package=prqlc"],
      "presentation": {
        "reveal": "silent",
        "clear": true
      },
      "problemMatcher": ["$rustc"]
    }
  ]
}


================================================
FILE: .config/wt.toml
================================================
# Worktrunk configuration for PRQL
#
# Available template variables:
#   {{ repo }}      - Repository name
#   {{ branch }}    - Branch name (slashes replaced with dashes)
#   {{ worktree }}  - Path to the new worktree
#   {{ repo_root }} - Path to the main repository root

# Post-start commands run in parallel after switching to a worktree
[post-start]
# Seed compiled dependencies from main worktree using CoW (copy-on-write)
# Copies essential files, skipping incremental build objects
# Result: warm-start builds instead of cold compiles
# macOS: uses cp -c (clonefile on APFS)
deps = """
[ -d {{ repo_path }}/target/debug/deps ] && [ ! -e target ] &&
mkdir -p target/debug/deps &&
cp -c {{ repo_path }}/target/debug/deps/*.rlib {{ repo_path }}/target/debug/deps/*.rmeta target/debug/deps/ &&
cp -cR {{ repo_path }}/target/debug/.fingerprint {{ repo_path }}/target/debug/build target/debug/
"""


================================================
FILE: .devcontainer/base-image/Dockerfile
================================================
# syntax=docker/dockerfile:1.4

FROM mcr.microsoft.com/devcontainers/rust:2-1-bookworm

# ========= Install cargo-tools for non-root user (vscode) =========
USER vscode

ARG cargo_crates

RUN <<"EOF"
curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
cargo binstall -y --locked ${cargo_crates}
EOF

USER root


================================================
FILE: .devcontainer/devcontainer.json
================================================
// Dev Container for Rust, website, prqlc-js and prqlc-python
{
  "image": "ghcr.io/prql/prql-devcontainer-base:latest",
  "features": {
    "ghcr.io/devcontainers/features/hugo:1": {},
    "ghcr.io/devcontainers/features/python:1": {},
    "ghcr.io/devcontainers/features/node:1": {},
    "ghcr.io/eitsupi/devcontainer-features/go-task:1": {},
    "ghcr.io/eitsupi/devcontainer-features/jq-likes:2": {
      "yqVersion": "latest"
    },
    "ghcr.io/eitsupi/devcontainer-features/duckdb-cli:1": {},
    "ghcr.io/rocker-org/devcontainer-features/apt-packages:1": {
      "packages": "cmake,sqlite3"
    }
  },
  "customizations": {
    "vscode": {
      "extensions": [
        // Keep in sync with Taskfile.yaml
        "prql-lang.prql-vscode",
        "rust-lang.rust-analyzer",
        "mitsuhiko.insta",
        "esbenp.prettier-vscode",
        "budparr.language-hugo-vscode"
      ]
    }
  },
  "mounts": [
    {
      "source": "devcontainer-cargo-cache-${devcontainerId}",
      "target": "/usr/local/cargo/registry",
      "type": "volume"
    },
    {
      "source": "devcontainer-cargo-target-${devcontainerId}",
      "target": "${containerWorkspaceFolder}/target",
      "type": "volume"
    }
  ],
  "postCreateCommand": {
    "set-ownership": "sudo chown vscode target /usr/local/cargo/registry/",
    "install-python-deps": "task install-maturin",
    // Disabling because of the issues in #3709
    // "install-python-deps": "task install-maturin && task install-pre-commit && pre-commit install-hooks",
    "install-npm-dependencies": "task install-npm-dependencies"
  }
}


================================================
FILE: .gitattributes
================================================
# Currently required for:
# - Elixir tests at
#   https://github.com/PRQL/prql/blob/5eb4063dbd36bdac07529797dd2cec8c55127263/.github/workflows/test-elixir.yaml#L31
# - Previously for Readme tests, those those now should support either lf or
#   crlf, at https://github.com/PRQL/prql/blob/6d4662b4e6e0f07dc3cd8eb5c19cc78fc199d0b2/web/book/tests/documentation/readme.rs#L9
* text=auto eol=lf

# Prevent files from cluttering `git grep` results
*.min.js -diff
*.min.js.map -diff
*.min.css -diff
*.min.css.map -diff
package-lock.json -diff
# mdbook expects the file to be named highlight.js so we cannot rename it to .min.js
highlight.js -diff


================================================
FILE: .github/.codecov.yaml
================================================
comment: false

ignore:
  - "**/tests/**"

coverage:
  status:
    project:
      default:
        removed_code_behavior: adjust_base
        # This disables report a success/failure. That's not helpful on `main`
        # and we get the success/failure from the patch status on PRs.
        informational: true

    patch:
      default:
        only_pulls: true


================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Code of Conduct

We prefer keeping our rules as short as possible and filling the gaps with the
mortar of human interaction: empathy.

All we ask of members of this project is this:

- Please treat each other with respect and understanding.
- Please respect our wish to not serve as a stage for disputes about fairness or
  personal differences.

If you can agree to these conditions, your contributions are welcome. If you can
not, please don’t spoil it for the rest of us.

To report a violation of these rules, please email
[prql@prql-lang.org](mailto:prql@prql-lang.org) or contact one of the
[project maintainers](https://github.com/orgs/PRQL/people).

---

(based on <https://jan-krueger.net/mincoc/>)


================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing

Check out our
[Contributing Docs](https://prql-lang.org/book/project/contributing/)


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: 🐛 Bug report
description: File a bug report to help us improve
labels: [bug]
body:
  - type: textarea
    id: what-happened
    attributes:
      label: What happened?
      description: |
        Thanks for reporting a bug! Feel free to add any initial context here.

  - type: textarea
    id: prql-input
    attributes:
      label: PRQL input
      description: |
        A minimal, self-contained example that demonstrates the issue.

        This will be automatically formatted into code, so no need for markdown backticks.
      render: elm
    validations:
      required: true

  - type: textarea
    id: output
    attributes:
      label: SQL output
      description: |
        The SQL that PRQL currently compiles to. Feel free to use the [playground](https://prql-lang.org/playground/) to generate the SQL.

        This will be automatically formatted into code, so no need for markdown backticks.
      render: SQL
    validations:
      required: true

  - type: textarea
    id: expected-output
    attributes:
      label: Expected SQL output

      description:
        Optional; no need to write out if it's obvious from the context
      render: SQL

  - type: checkboxes
    id: mvce-checkboxes
    attributes:
      label: MVCE confirmation
      description: |
        Please confirm that the bug report is minimal and doesn't exist already:

        - **Minimal example** — the example is as focused as reasonably possible to demonstrate the underlying issue in PRQL. For example, it's not possible to exclude any line and still observe the bug.

        - **New issue** — a search of GitHub Issues suggests this is not a duplicate.
      options:
        - label: Minimal example
        - label: New issue

  - type: textarea
    id: extra
    attributes:
      label: Anything else?


================================================
FILE: .github/ISSUE_TEMPLATE/config.yaml
================================================
blank_issues_enabled: true


================================================
FILE: .github/ISSUE_TEMPLATE/something_else.yaml
================================================
name: Something else
description: Anything that's not a bug report
body:
  - type: textarea
    id: what-happened
    attributes:
      label: What's up?


================================================
FILE: .github/actionlint.yaml
================================================
# Custom runner labels not yet recognized by actionlint
self-hosted-runner:
  labels:
    - macos-15-intel


================================================
FILE: .github/actions/build-prqlc/action.yaml
================================================
name: build-prqlc
description: >
  Build prqlc

  Note that much of this is copy/pasted into build-prqlc-c, so changes here
  should generally be copied into that file.
inputs:
  target:
    description: Build target
    required: true
  profile:
    description: Build profile option; `dev` or `release`.
    required: true
  features:
    description: Features to enable
    default: ""
outputs:
  artifact-name:
    description: The name of the artifact
    value: ${{ steps.echo-artifact-name.outputs.artifact-name }}

runs:
  using: composite
  steps:
    - run: rustup target add ${{ inputs.target }}
      shell: bash

    - run: ./.github/workflows/scripts/set_version.sh
      shell: bash

    - name: Compute Cargo.lock hash
      shell: bash
      run: |
        if command -v sha256sum &> /dev/null; then
          echo "cargo_lock_hash=$(sha256sum Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
        else
          echo "cargo_lock_hash=$(shasum -a 256 Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
        fi

    - uses: Swatinem/rust-cache@v2
      with:
        prefix-key: ${{ env.version }}-${{ env.cargo_lock_hash }}
        # Share cache with `test-rust`, except for `musl` targets.
        save-if:
          ${{ (github.ref == 'refs/heads/main') && contains(inputs.target,
          'musl') }}
        shared-key: rust-${{ inputs.target }}

    - if: runner.os == 'Linux'
      shell: bash
      run: |
        sudo apt-get update
        sudo apt-get install -y musl-tools

    - if: runner.os == 'Windows' && inputs.profile == 'release'
      shell: bash
      run: echo 'RUSTFLAGS=-Ctarget-feature=+crt-static' >>"$GITHUB_ENV"

    - if: inputs.target == 'aarch64-unknown-linux-musl'
      shell: bash
      run: |
        sudo apt-get update
        sudo apt-get install -y gcc-aarch64-linux-gnu
        echo 'CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc' >>"$GITHUB_ENV"
        echo 'CC=aarch64-linux-gnu-gcc' >>"$GITHUB_ENV"

    - name: cargo build
      uses: clechasseur/rs-cargo@v4
      with:
        command: build
        # We previously had `--package=prqlc` for all, but this caches much
        # worse than just building the whole workspace.
        # https://github.com/PRQL/prql/issues/3098, so we just build the whole
        # workspace — except for the `musl` target, which can't build the whole
        # workspace. (This is overly complicated and would be great to simplify,
        # even at the cost of slighly less efficiency.)
        args:
          --profile=${{ inputs.profile }} --locked --target=${{ inputs.target }}
          --no-default-features --features=${{ inputs.features }} ${{
          contains(inputs.target, 'musl') && '--package=prqlc' ||
          '--all-targets' }}

    - name: Create artifact for Linux and macOS
      shell: bash
      if: runner.os != 'Windows'
      run: |
        export ARTIFACT_NAME="prqlc-${{ github.ref_type == 'tag' && github.ref_name || 0 }}-${{ matrix.target }}.tar.gz"
        echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >>"$GITHUB_ENV"
        TEMP_DIR=$(mktemp -d)
        cp prqlc/prqlc/README.md LICENSE "${TEMP_DIR}/"
        cp -r target/${{ matrix.target }}/${{ inputs.profile == 'release' && 'release' || 'debug' }}/prqlc "${TEMP_DIR}/"
        tar czf "${ARTIFACT_NAME}" -C "$TEMP_DIR" .

    - name: Create artifact for Windows
      shell: bash
      if: runner.os == 'Windows'
      run: |
        export ARTIFACT_NAME="prqlc-${{ github.ref_type == 'tag' && github.ref_name || 0 }}-${{ matrix.target }}.zip"
        echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >>"$GITHUB_ENV"
        cd target/${{ matrix.target }}/${{ inputs.profile == 'release' && 'release' || 'debug' }}
        cp ../../../prqlc/prqlc/README.md .
        7z a "../../../${ARTIFACT_NAME}" prqlc.exe ../../../LICENSE README.md

    - name: Upload prqlc
      uses: actions/upload-artifact@v5
      with:
        name: prqlc-${{ inputs.target }}-${{ inputs.profile }}
        path: ${{ env.ARTIFACT_NAME }}

    - id: echo-artifact-name
      shell: bash
      run: echo "artifact-name=${{ env.ARTIFACT_NAME }}" >>"$GITHUB_OUTPUT"


================================================
FILE: .github/actions/build-prqlc-c/action.yaml
================================================
name: build-prqlc-c
description: >
  A version of `build-prqlc` for the C bindings.

  Note that this is quite open to change, including names and which files we
  package. Contributions and/or suggestions are welcome.

inputs:
  target:
    description: Build target
    required: true
  profile:
    description: Build profile option; `dev` or `release`.
    required: true
  features:
    description: Features to enable
    default: ""
outputs:
  artifact-name:
    description: The name of the artifact
    value: ${{ steps.echo-artifact-name.outputs.artifact-name }}

runs:
  using: composite
  steps:
    - run: rustup target add ${{ inputs.target }}
      shell: bash

    - run: ./.github/workflows/scripts/set_version.sh
      shell: bash

    - name: Compute Cargo.lock hash
      shell: bash
      run: |
        if command -v sha256sum &> /dev/null; then
          echo "cargo_lock_hash=$(sha256sum Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
        else
          echo "cargo_lock_hash=$(shasum -a 256 Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
        fi

    - uses: Swatinem/rust-cache@v2
      with:
        prefix-key: ${{ env.version }}-${{ env.cargo_lock_hash }}
        # Share cache with `test-rust`, except for `musl` targets.
        save-if:
          ${{ (github.ref == 'refs/heads/main') && contains(inputs.target,
          'musl') }}
        shared-key: rust-${{ inputs.target }}

    - if: runner.os == 'Linux'
      shell: bash
      run: |
        sudo apt-get update
        sudo apt-get install -y musl-tools

    - if: runner.os == 'Windows' && inputs.profile == 'release'
      shell: bash
      run: echo 'RUSTFLAGS=-Ctarget-feature=+crt-static' >>"$GITHUB_ENV"

    - if: inputs.target == 'aarch64-unknown-linux-musl'
      shell: bash
      run: |
        sudo apt-get update
        sudo apt-get install -y gcc-aarch64-linux-gnu
        echo 'CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc' >>"$GITHUB_ENV"
        echo 'CC=aarch64-linux-gnu-gcc' >>"$GITHUB_ENV"

    - name: cargo build
      uses: clechasseur/rs-cargo@v4
      with:
        command: build
        args:
          --profile=${{ inputs.profile }} --locked --target=${{ inputs.target }}
          --no-default-features --features=${{ inputs.features }} ${{
          contains(inputs.target, 'musl') && '--package=prqlc-c' ||
          '--all-targets' }}

    - name: Create artifact for Linux and macOS
      shell: bash
      if: runner.os != 'Windows'
      run: |
        export ARTIFACT_NAME="prqlc_c-${{ github.ref_type == 'tag' && github.ref_name || 0 }}-${{ matrix.target }}.tar.gz"
        echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >>"$GITHUB_ENV"
        cd target/${{ matrix.target }}/${{ inputs.profile == 'release' && 'release' || 'debug' }}
        ls -al
        tar czf "../../../${ARTIFACT_NAME}" *prqlc_c*

    - name: Create artifact for Windows
      shell: bash
      if: runner.os == 'Windows'
      run: |
        export ARTIFACT_NAME="prqlc_c-${{ github.ref_type == 'tag' && github.ref_name || 0 }}-${{ matrix.target }}.zip"
        echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >>"$GITHUB_ENV"
        cd target/${{ matrix.target }}/${{ inputs.profile == 'release' && 'release' || 'debug' }}
        ls -al
        7z a "../../../${ARTIFACT_NAME}" *prqlc_c*

    - name: Upload prqlc-c
      uses: actions/upload-artifact@v5
      with:
        name: prqlc_c-${{ inputs.target }}-${{ inputs.profile }}
        path: ${{ env.ARTIFACT_NAME }}

    - id: echo-artifact-name
      shell: bash
      run: echo "artifact-name=${{ env.ARTIFACT_NAME }}" >>"$GITHUB_OUTPUT"


================================================
FILE: .github/actions/build-python/action.yaml
================================================
name: build-wheel
description: "Use maturin to build python dists."
inputs:
  target:
    description:
      Maturin build target, or 'source' for source distribution. Currently only
      used for Linux, otherwise defaults to the platform.
    required: true
  profile:
    description: Build profile option; `dev` or `release`.
    required: true
  package:
    description: Package name
    required: true

runs:
  using: composite
  steps:
    - id: package-path
      run:
        echo "package_path=$(cargo metadata --no-deps --format-version 1 | jq -r
        --arg package_name ${{ inputs.package }} '.packages[] | select(.name ==
        $package_name) | .manifest_path')" >>"$GITHUB_OUTPUT"
      shell: bash
    # There's no benefit from caching here, because the maturin action uses a container.
    - uses: PyO3/maturin-action@v1
      if: inputs.target == 'source'
      with:
        command: sdist
        args: -o target/python -m ${{steps.package-path.outputs.package_path}}
    - uses: PyO3/maturin-action@v1
      if: runner.os == 'Linux' && inputs.target != 'source'
      with:
        target: ${{ inputs.target }}
        manylinux: auto
        command: build
        args:
          --profile=${{ inputs.profile }} -o target/python -m
          ${{steps.package-path.outputs.package_path}}
    - uses: PyO3/maturin-action@v1
      if: runner.os == 'Windows' && inputs.target != 'source'
      with:
        command: build
        args:
          --profile=${{ inputs.profile }} -o target/python -m
          ${{steps.package-path.outputs.package_path}}
    - uses: PyO3/maturin-action@v1
      if: runner.os == 'macOS' && inputs.target != 'source'
      with:
        command: build
        # We override the target with `universal2-apple-darwin`. Probably we
        # should use the target from the input or at least ensure it matches.
        args:
          --profile=${{ inputs.profile }} -o target/python --target
          universal2-apple-darwin -m
          ${{steps.package-path.outputs.package_path}}
    - name: Upload wheels
      uses: actions/upload-artifact@v5
      with:
        name:
          # We could avoid the OS here if we handled the target more explicitly.
          ${{ inputs.package }}-${{ runner.os }}-${{ inputs.target }}-${{
          inputs.profile }}
        path: target/python


================================================
FILE: .github/actions/time-compilation/action.yaml
================================================
name: Time Compilation
description: Time the cargo compilation, outputting an HTML file.

inputs:
  use_cache:
    required: true
    description: Whether to use the cache of dependencies

runs:
  using: composite
  steps:
    - run: ./.github/workflows/scripts/set_version.sh
      shell: bash
    - name: 💰 Cache
      id: cache
      uses: Swatinem/rust-cache@v2
      with:
        prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
        save-if: ${{ github.ref == 'refs/heads/main' }}
      # 'true' seems to require quotes (and using a bare `inputs.use_cache`
      # doesn't work); I'm really not sure why. There are some issues on the
      # interwebs around this, but I couldn't find one that explained it.
      if: inputs.use_cache == 'true'
    - name: Remove cached results
      shell: bash
      run: rm -rf target/cargo-timings
    - name: 🏭 Compile
      uses: clechasseur/rs-cargo@v4
      with:
        command: build
        args: --timings --all-targets
    - uses: actions/upload-artifact@v5
      with:
        name:
          cargo-timing-${{ inputs.use_cache == 'true' && 'cache' || 'no_cache'
          }}.html
        path: target/cargo-timings/cargo-timing-*.html
        if-no-files-found: error
        # Only upload if a) we got a cache hit or b) we didn't want to use the cache anyway
      if: steps.cache.outputs.cache-hit == 'true' || inputs.use_cache == 'false'


================================================
FILE: .github/dependabot.yaml
================================================
version: 2
updates:
  - package-ecosystem: cargo
    directory: "/"
    schedule:
      # Running daily means the GHA cache will be cycling much faster, and we're
      # not in a great rush. So trying weekly, and we can iterate.
      interval: weekly
    commit-message:
      prefix: "chore: "
    # Bump all patch versions of rust dependencies as a single PR
    groups:
      patch:
        update-types:
          - patch
    # We exclude labels throughout because of https://github.com/dependabot/dependabot-core/issues/7645#issuecomment-1986212847
    labels: []

  - package-ecosystem: "npm"
    directories:
      - "/prqlc/bindings/js"
      - "/web/playground"
    schedule:
      interval: daily
    ignore:
      - dependency-name: "*"
        update-types:
          - version-update:semver-patch
    commit-message:
      prefix: "chore: "
    labels: []

  - package-ecosystem: docker
    directory: .devcontainer/base-image
    schedule:
      interval: daily
    commit-message:
      prefix: "chore: "
    labels: []

  - package-ecosystem: "github-actions"
    directories:
      - "/"
      - ".github/actions/build-python"
      - ".github/actions/build-prqlc"
      - ".github/actions/build-prqlc-c"
      - ".github/actions/time-compilation"
    commit-message:
      prefix: "chore: "
    schedule:
      interval: daily
    labels: []

  - package-ecosystem: uv
    directory: "prqlc/bindings/prqlc-python"
    schedule:
      interval: daily
    commit-message:
      prefix: "chore: "
    ignore:
      - dependency-name: "*"
        update-types:
          - version-update:semver-patch
    labels: []

  - package-ecosystem: "devcontainers"
    directory: "/"
    schedule:
      interval: daily
    labels: []

  - package-ecosystem: "mix"
    directory: "prqlc/bindings/elixir"
    schedule:
      interval: daily
    commit-message:
      prefix: "chore: "
    labels: []


================================================
FILE: .github/nightly-failure.md
================================================
---
title: Nightly tests failed
labels: github_actions
---

Nightly tests [failed on {{ date | date('YYYY-MM-DD') }}]({{ env.LINK }})


================================================
FILE: .github/workflows/README.md
================================================
# GitHub Workflows

See
[our development docs](https://prql-lang.org/book/project/contributing/development.html)
for docs & discussion.


================================================
FILE: .github/workflows/build-devcontainer.yaml
================================================
name: build-devcontainer

# Multi-platform build for devcontainer base image
on:
  workflow_call:
    inputs:
      push:
        type: boolean
        default: false
  workflow_dispatch:
    inputs:
      push:
        type: boolean
        default: false

env:
  IMAGE_NAME: ghcr.io/prql/prql-devcontainer-base

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        include:
          - platform: linux/amd64
            platform_name: amd64
            runner: ubuntu-24.04
          - platform: linux/arm64
            platform_name: arm64
            runner: ubuntu-24.04-arm
    runs-on: ${{ matrix.runner }}
    timeout-minutes: 240
    steps:
      - uses: actions/checkout@v5
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/setup-buildx-action@v3

      - name: Prep build args
        run:
          echo "cargo_crates=$(yq -r '.vars.cargo_crates' Taskfile.yaml)" >>
          "$GITHUB_ENV"

      - name: Build and push by digest
        id: build
        uses: docker/build-push-action@v6
        timeout-minutes: 240
        with:
          context: .devcontainer/base-image
          build-args: cargo_crates=${{ env.cargo_crates }}
          platforms: ${{ matrix.platform }}
          outputs:
            type=image,name=${{ env.IMAGE_NAME
            }},push-by-digest=true,name-canonical=true,push=${{ inputs.push }}
          cache-from: type=gha,scope=${{ matrix.platform }}
          cache-to: type=gha,mode=max,scope=${{ matrix.platform }}

      # Smoke test: build local image and verify tools work
      - name: Build local image for smoke test
        uses: docker/build-push-action@v6
        with:
          context: .devcontainer/base-image
          build-args: cargo_crates=${{ env.cargo_crates }}
          load: true
          tags: devcontainer-test:latest
          cache-from: type=gha,scope=${{ matrix.platform }}

      - name: Smoke test - run tests and build book
        run: |
          docker run --rm -v "${{ github.workspace }}:/workspace" -w /workspace \
            devcontainer-test:latest bash -c "
              set -euxo pipefail
              cargo test
              mdbook build web/book/
            "

      - name: Export digest
        if: inputs.push
        run: |
          mkdir -p /tmp/digests
          digest="${{ steps.build.outputs.digest }}"
          touch "/tmp/digests/${digest#sha256:}"

      - name: Upload digest
        if: inputs.push
        uses: actions/upload-artifact@v5
        with:
          name: digests-${{ matrix.platform_name }}
          path: /tmp/digests/*
          if-no-files-found: error
          retention-days: 1

  merge:
    runs-on: ubuntu-24.04
    timeout-minutes: 30
    if: inputs.push
    needs: build
    steps:
      - name: Download digests
        uses: actions/download-artifact@v6
        with:
          path: /tmp/digests
          pattern: digests-*
          merge-multiple: true

      - name: Validate digests
        run: |
          digest_count=$(find /tmp/digests -type f | wc -l)
          if [ "$digest_count" -ne 2 ]; then
            echo "Error: Expected 2 digests (amd64 + arm64), found $digest_count"
            ls -la /tmp/digests
            exit 1
          fi

      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/setup-buildx-action@v3
      - uses: docker/metadata-action@v5
        id: meta
        with:
          images: ${{ env.IMAGE_NAME }}
          tags: type=raw,latest

      - name: Create manifest list and push
        working-directory: /tmp/digests
        run: |
          tags=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON")
          digests=$(printf '${{ env.IMAGE_NAME }}@sha256:%s ' *)
          # shellcheck disable=SC2086
          docker buildx imagetools create $tags $digests

      - name: Verify multi-platform manifest
        run: |
          docker buildx imagetools inspect ${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}
          platforms=$(docker buildx imagetools inspect ${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }} --raw | \
            jq -r '.manifests[] | select(.platform.os != "unknown") | .platform | "\(.os)/\(.architecture)"' | sort)
          expected="linux/amd64
          linux/arm64"
          if [ "$platforms" != "$expected" ]; then
            echo "Error: Expected platforms not found"
            echo "Expected: $expected"
            echo "Found: $platforms"
            exit 1
          fi
          echo "✓ Multi-platform manifest verified: amd64 + arm64"


================================================
FILE: .github/workflows/build-web.yaml
================================================
name: build-web

on:
  workflow_call:
  workflow_dispatch:

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  build-web:
    runs-on: ubuntu-24.04

    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5

      # Website requires Hugo
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v3.0.0

      - uses: baptiste0928/cargo-install@v3
        with:
          crate: mdbook
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: mdbook-footnote
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: wasm-pack

      - name: Setup Node
        uses: actions/setup-node@v6
        with:
          node-version: "20.x"
          cache: "npm"
          cache-dependency-path: "**/package-lock.json"

      - run: ./.github/workflows/scripts/set_version.sh
      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
          shared-key: web
          save-if:
            ${{ github.ref == 'refs/heads/web' || github.ref ==
            'refs/heads/main' }}

      - uses: go-task/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      - name: 🕷️ Build web
        run: task web:build

      - uses: actions/upload-pages-artifact@v4.0.0
        with:
          path: web/website/public/

  build-codemirror-demo:
    runs-on: ubuntu-24.04

    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - name: 🧅 Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest
      - name: Install CodeMirror demo dependencies
        working-directory: web/prql-codemirror-demo/
        run: bun install
      - name: Install Lezer dependencies
        working-directory: grammars/prql-lezer/
        run: bun install
      - name: Build Lezer grammar
        working-directory: grammars/prql-lezer/
        run: bun run build
      - name: Copy Lezer grammar into demo
        working-directory: web/prql-codemirror-demo/
        run: |
          mkdir src/lang-prql/prql-lezer
          cp ../../grammars/prql-lezer/dist/* src/lang-prql/prql-lezer/
      - name: Build CodeMirror demo
        working-directory: web/prql-codemirror-demo/
        run: bun run build


================================================
FILE: .github/workflows/claude.yaml
================================================
name: Claude Code

on:
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  claude:
    # Only run when comment contains @claude
    if: |
      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude'))
    runs-on: ubuntu-latest
    permissions:
      contents: write # Allow pushing commits
      pull-requests: write # Allow commenting and updating PRs
      issues: write # Allow commenting on issues
      id-token: write
      actions: read # Required for Claude to read CI results on PRs
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
        with:
          # Fix: Checkout PR branch for issue_comment events instead of default branch
          ref:
            ${{ github.event.issue.pull_request && format('refs/pull/{0}/head',
            github.event.issue.number) || github.ref }}
          fetch-depth: 0 # Get more history for better context
          fetch-tags: true

      - name: 🔧 Configure git for Claude
        run: |
          git config --global user.name "Claude Code"
          git config --global user.email "claude@anthropic.com"

      # Install essential tools for the PRQL project
      - name: 🔧 Setup Task
        uses: go-task/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      # Rust is pre-installed on ubuntu-latest, but we ensure consistent toolchain
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-insta
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-nextest

      - run: ./.github/workflows/scripts/set_version.sh
        shell: bash

      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ hashFiles('./Cargo.lock') }}
          shared-key: rust-x86_64-unknown-linux-gnu
          save-if: false

      - name: 🤖 Run Claude Code
        id: claude
        uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          show_full_output: true

          # This is an optional setting that allows Claude to read CI results on PRs
          additional_permissions: |
            actions: read

          # Model, tools, and CI behavior. System prompt must be single-line
          # with \n escapes (YAML multiline breaks argument parsing).
          claude_args: |
            --model opus
            --allowedTools Bash,Edit,Read,Write,Glob,Grep,WebSearch,WebFetch
            --system-prompt "You are helping with the PRQL project in a GitHub Actions environment.\n\nFollow the project guidelines in CLAUDE.md.\nAfter making changes, ensure tests pass with 'task test-all' and lints with 'task lint'.\n\nFor CI failure diagnosis:\n- Use 'gh run list' and 'gh run view' to check CI status\n- Look for specific error messages in failing jobs\n- Check the test output for detailed failure information\n- When fixing issues, verify changes with the appropriate test commands\n- Once local test commands work, push to the PR\n- Then: iterate between monitoring CI, fixing any remaining issues, monitoring CI\n- Don't return until we're confident that we've done everything we can, including monitoring CI to completion and fixing any failures"


================================================
FILE: .github/workflows/lint-megalinter.yaml
================================================
# MegaLinter GitHub Action configuration file
# More info at https://megalinter.io
name: lint-megalinter

on:
  workflow_call:
  workflow_dispatch:

# Comment env block if you do not want to apply fixes
env:
  # Apply linter fixes configuration
  #
  # When active, APPLY_FIXES must also be defined as environment variable
  # (in github/workflows/mega-linter.yml or other CI tool)
  # PRQL-change — edited out
  # APPLY_FIXES: all

  # Decide which event triggers application of fixes in a commit or a PR
  # (pull_request, push, all)
  APPLY_FIXES_EVENT: pull_request

  # If APPLY_FIXES is used, defines if the fixes are directly committed (commit)
  # or posted in a PR (pull_request)
  APPLY_FIXES_MODE: commit

concurrency:
  group: ${{ github.ref }}-${{ github.workflow }}
  cancel-in-progress: true

jobs:
  megalinter:
    name: MegaLinter
    runs-on: ubuntu-24.04

    # Give the default GITHUB_TOKEN write permission to commit and push, comment
    # issues & post new PR; remove the ones you do not need
    permissions:
      contents: write
      issues: write
      pull-requests: write

    steps:
      # Git Checkout
      - name: Checkout Code
        uses: actions/checkout@v5
        with:
          token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}

          # If you use VALIDATE_ALL_CODEBASE = true, you can remove this line to
          # improve performance
          fetch-depth: 0

      # MegaLinter
      - name: MegaLinter

        # You can override MegaLinter flavor used to have faster performances
        # More info at https://megalinter.io/flavors/
        uses: oxsecurity/megalinter@v9.1.0

        id: ml

        # All available variables are described in documentation
        # https://megalinter.io/configuration/
        env:
          VALIDATE_ALL_CODEBASE: true
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

          # ADD YOUR CUSTOM ENV VARIABLES HERE OR DEFINE THEM IN A FILE
          # .mega-linter.yml AT THE ROOT OF YOUR REPOSITORY

          # Uncomment to disable copy-paste and spell checks
          # DISABLE: COPYPASTE,SPELL

      # Upload MegaLinter artifacts
      - name: Archive production artifacts
        uses: actions/upload-artifact@v5
        if: success() || failure()
        with:
          name: MegaLinter reports
          path: |
            megalinter-reports
            mega-linter.log

      # Set APPLY_FIXES_IF var for use in future steps
      - name: Set APPLY_FIXES_IF var
        run: |
          printf 'APPLY_FIXES_IF=%s\n' "${{
            steps.ml.outputs.has_updated_sources == 1 &&
            (
              env.APPLY_FIXES_EVENT == 'all' ||
              env.APPLY_FIXES_EVENT == github.event_name
            ) &&
            (
              github.event_name == 'push' ||
              github.event.pull_request.head.repo.full_name == github.repository
            )
          }}" >> "${GITHUB_ENV}"

      # Set APPLY_FIXES_IF_* vars for use in future steps
      - name: Set APPLY_FIXES_IF_* vars
        run: |
          printf 'APPLY_FIXES_IF_PR=%s\n' "${{
            env.APPLY_FIXES_IF == 'true' &&
            env.APPLY_FIXES_MODE == 'pull_request'
          }}" >> "${GITHUB_ENV}"
          printf 'APPLY_FIXES_IF_COMMIT=%s\n' "${{
            env.APPLY_FIXES_IF == 'true' &&
            env.APPLY_FIXES_MODE == 'commit' &&
            (!contains(fromJSON('["refs/heads/main", "refs/heads/master"]'), github.ref))
          }}" >> "${GITHUB_ENV}"

      # Create pull request if applicable
      # (for now works only on PR from same repository, not from forks)
      - name: Create Pull Request with applied fixes
        uses: peter-evans/create-pull-request@v7
        id: cpr
        if: env.APPLY_FIXES_IF_PR == 'true'
        with:
          token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
          commit-message: "[MegaLinter] Apply linters automatic fixes"
          title: "[MegaLinter] Apply linters automatic fixes"
          labels: bot

      - name: Create PR output
        if: env.APPLY_FIXES_IF_PR == 'true'
        run: |
          echo "PR Number - ${{ steps.cpr.outputs.pull-request-number }}"
          echo "PR URL - ${{ steps.cpr.outputs.pull-request-url }}"

      # Push new commit if applicable
      # (for now works only on PR from same repository, not from forks)
      - name: Prepare commit
        if: env.APPLY_FIXES_IF_COMMIT == 'true'
        run: sudo chown -Rc $UID .git/

      - name: Commit and push applied linter fixes
        uses: stefanzweifel/git-auto-commit-action@v7
        if: env.APPLY_FIXES_IF_COMMIT == 'true'
        with:
          branch: >-
            ${{
              github.event.pull_request.head.ref ||
              github.head_ref ||
              github.ref
            }}
          commit_message: "[MegaLinter] Apply linters fixes"
          commit_user_name: megalinter-bot
          commit_user_email: nicolas.vuillamy@ox.security


================================================
FILE: .github/workflows/nightly.yaml
================================================
# A workflow containing jobs we run only on nightly. This is called by
# `tests.yaml` on a schedule and on request with a `pr-nightly` label. The
# workflow encapsulates lots of jobs rather than listing them all in `tests.yaml`
# and conditioning each on `nightly` (wouldn't be terrible but less modular,).

name: nightly

on:
  workflow_call:
  workflow_dispatch:

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  cargo-audit:
    runs-on: ubuntu-24.04
    # We can't read PRQL repo security events on forks, which causes this to
    # incorrectly fail (
    # https://github.com/PRQL/prql/actions/runs/5718693342/job/15495030808?pr=3195#step:3:28
    # ). So we disable. If we wanted to run checks on PRs, we could move this to
    # `pull-request-target`.
    #
    # Would be better if we could only run when we know we have permissions. But
    # this will do...

    # 2024-12-09 — this is failing on normal PRs despite clearing the advisories
    # in GitHub, and the action is archived. We have the GitHub security audits,
    # `prqlc` doesn't cross any trust boundaries, so disabling for the moment.
    # We can re-enable if a supported action is available.
    if:
      ${{ github.repository_owner == 'prql' &&
      !github.event.pull_request.head.repo.fork && 'run' == 'no' }}
    permissions:
      actions: read
      contents: read
      security-events: write
      issues: write
      checks: write

    steps:
      - uses: actions/checkout@v5
      - uses: rustsec/audit-check@v2.0.0
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

  cargo-bench:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v5
      - uses: clechasseur/rs-cargo@v4
        with:
          command: bench
          # GH Actions is fairly noisy, so the precise details don't matter that
          # much. We do want to check the benchmarks run, and possibly we can
          # use this to identify and big changes in performance.
          args: -- --warm-up-time=0.3 --measurement-time=1

  time-compilation:
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        use_cache: [true, false]
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: actions/setup-python@v6
        with:
          python-version: "3.11"
      - uses: ./.github/actions/time-compilation
        with:
          use_cache: ${{ matrix.use_cache }}
    # We need consistent env vars across all workflows for the cache to work
    env:
      CARGO_TERM_COLOR: always
      CLICOLOR_FORCE: 1
      RUSTFLAGS: "-C debuginfo=0"
      RUSTDOCFLAGS: "-Dwarnings"

  check-unused-dependencies:
    runs-on: ubuntu-24.04
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - run: rustup override set nightly-2025-11-10
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-udeps
      # Once with all targets, once without, to find anything that should be in
      # `dev` but is more general.
      - uses: clechasseur/rs-cargo@v4
        with:
          command: udeps
          args: --all-targets
      - uses: clechasseur/rs-cargo@v4
        with:
          command: udeps

  # We now use the devcontainer. TODO: is it possible to have a similar test for
  # that? Or that would require VSCode to install the dependencies?

  # test-docker:
  #   # We only test the build in `test-all`; this also runs tests.
  #   runs-on: ubuntu-24.04
  #   steps:
  #     - name: 📂 Checkout code
  #       uses: actions/checkout@v5

  #     - uses: docker/setup-buildx-action@v2

  #     - name: Build
  #       uses: docker/build-push-action@v4
  #       with:
  #         tags: prql:latest
  #         # Use the GHA cache
  #         load: true
  #         cache-from: type=gha
  #         cache-to: type=gha,mode=max

  #     # https://aschmelyun.com/blog/using-docker-run-inside-of-github-actions/
  #     - name: Test
  #       uses: addnab/docker-run-action@v3
  #       with:
  #         image: prql:latest
  #         options: -v ${{ github.workspace }}/:/src
  #         run: task test-rust

  code-ql:
    # Currently almost the default code-ql config
    runs-on: ubuntu-24.04
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: ["javascript", "python"]
        # We could add java, but it require a custom build step and we have very little java...
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
      - name: Checkout repository
        uses: actions/checkout@v5

      # Initializes the CodeQL tools for scanning.
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: ${{ matrix.language }}
          # If you wish to specify custom queries, you can do so here or in a config file.
          # By default, queries listed here will override any specified in a config file.
          # Prefix the list here with "+" to use these queries and those in the config file.

          # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
          # queries: security-extended,security-and-quality

      # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
      # If this step fails, then you should remove it and run the build manually (see below)
      - name: Autobuild
        uses: github/codeql-action/autobuild@v4

      # ℹ️ Command-line programs to run using the OS shell.
      # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun

      #   If the Autobuild fails above, remove it and uncomment the following three lines.
      #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.

      # - run: |
      #   echo "Run, Build Application using script"
      #   ./location_of_script_within_repo/buildscript.sh

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4

  nightly-release:
    # Test release workflow
    uses: ./.github/workflows/release.yaml


================================================
FILE: .github/workflows/publish-web.yaml
================================================
name: publish-web
on:
  push:
    branches:
      - web
  # Even though releases push to `web` branch, that doesn't cause this workflow
  # to run, because GHA can't start workflows itself. So we also run on
  # releases.
  release:
    types: [released]
  # Called by pull-request when specifically requested
  workflow_call:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  build-web:
    uses: ./.github/workflows/build-web.yaml

  deploy-web:
    needs: build-web
    runs-on: ubuntu-24.04

    # Don't attempt to publish if on a fork or on a PR running on upstream.
    if:
      ${{ github.repository_owner == 'prql' &&
      !github.event.pull_request.head.repo.fork }}

    permissions:
      pages: write
      id-token: write

    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}

    steps:
      - name: Setup Pages
        id: pages
        uses: actions/configure-pages@v5

      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4.0.5


================================================
FILE: .github/workflows/pull-request-target.yaml
================================================
name: pull-request-target

on:
  pull_request_target:
    types: [opened, edited, synchronize, labeled, closed]
    branches:
      - "*"

concurrency:
  # Generally we use `github.ref`, but in pull_request_target, that's always `main`.
  group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  main:
    name: Validate PR title
    runs-on: ubuntu-24.04
    steps:
      - uses: amannn/action-semantic-pull-request@v6
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          requireScope: false
          # The standard ones plus
          # - "internal" for code quality / ergonomics improvements
          # - "devops" for developer ergonomics
          # - "web" for playground / website (but not docs)
          # - "refine" for tiny changes
          types: |
            feat
            fix
            docs
            style
            refactor
            perf
            test
            build
            ci
            chore
            revert

            internal
            devops
            web
            refine

  backport:
    # Backport to `web` branch on `pr-backport-web`
    name: Backport to `web` branch
    runs-on: ubuntu-24.04
    # Confirm that it's merged and has a label to ensure nothing is backported without oversight
    if: |
      github.event.pull_request.merged
      && (
        github.event.action == 'closed'
        || (
          github.event.action == 'labeled'
          && contains(github.event.label.name, 'pr-backport-web')
        )
      )
    steps:
      - uses: tibdex/backport@v2
        with:
          # This is a personal access token from the @prql-bot
          github_token: ${{ secrets.PRQL_BOT_GITHUB_TOKEN }}
          # Docs are at https://github.com/tibdex/backport/blob/main/action.yml
          # We only use `web` atm
          label_pattern: "^pr-backport-(?<base>([^ ]+))$"
          title_template: "chore: Backport #<%= number%> to `web`"

  automerge:
    runs-on: ubuntu-24.04

    permissions:
      pull-requests: write
      contents: write

    # Check it's not coming from a fork — both to save running and
    # in case someone spoofed an `actor` name.
    if: ${{ !github.event.pull_request.head.repo.fork }}

    steps:
      # Get number of commits in the PR
      - id: commit-count
        run: >
          echo "commit-count=$(curl -s -H 'Authorization: token ${{ github.token
          }}' https://api.github.com/repos/prql/prql/pulls/${{
          github.event.pull_request.number }}/commits | jq 'length')"
          >>"$GITHUB_OUTPUT"
      - if:
          # - It's dependabot
          # - or there's only one commit — so nothing has made further changes and
          #   - or it's prql-bot
          #   - or it's a pre-commit-ci update
          github.actor == 'dependabot[bot]' ||
          (steps.commit-count.outputs.commit-count == '1' && (github.actor ==
          'prql-bot' || github.actor == 'pre-commit-ci[bot]'))
        run:
          gh pr merge --auto --squash --delete-branch ${{
          github.event.pull_request.html_url }}
        env:
          GITHUB_TOKEN: ${{ secrets.PRQL_BOT_GITHUB_TOKEN }}


================================================
FILE: .github/workflows/release.yaml
================================================
# This workflow runs on tags / releases. It also runs on nightly builds without
# publishing anything, in order to test as much of the build works as possible.
#
# We indicate whether it should publish, vs. just build, by checking whether
# `github.event_name == 'release'` . (An alternative would be to have an input
# which is passed in by the calling workflow.)

name: release
on:
  release:
    types: [released]
  workflow_call:
  workflow_dispatch:

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  brew-dispatcher:
    name: Release on homebrew-prql
    runs-on: ubuntu-24.04
    if: github.event_name == 'release'
    steps:
      - uses: actions/github-script@v8
        with:
          github-token: ${{ secrets.PRQL_BOT_GITHUB_TOKEN }}
          script: |
            await github.rest.actions.createWorkflowDispatch({
              owner: 'prql',
              repo: 'homebrew-prql',
              workflow_id: 'update.yaml',
              ref: 'main',
              inputs: {
              version: '${{ github.ref }}',
              URL: 'https://github.com/PRQL/prql/archive/${{ github.ref }}.tar.gz'
              }
            })

  build-prqlc:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-24.04
            target: x86_64-unknown-linux-musl
          - os: ubuntu-24.04
            target: aarch64-unknown-linux-musl
          - os: macos-15
            target: aarch64-apple-darwin
          - os: windows-latest
            target: x86_64-pc-windows-msvc
          # Intel macOS build
          - os: macos-15-intel
            target: x86_64-apple-darwin
            features: default,test-dbs
    permissions:
      contents: write
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: ./.github/actions/build-prqlc
        id: build-artifact
        with:
          target: ${{ matrix.target }}
          profile: release
          features: cli
      - name: Upload release artifact
        if: github.event_name == 'release'
        uses: softprops/action-gh-release@v2
        with:
          append_body: true
          files: ${{ steps.build-artifact.outputs.artifact-name }}
      - name: test the CLI works
        # TODO: Add for Windows too (but will require unzipping rather than
        # un-taring)
        #
        # Currently filtering by x86, since that's the same as those not
        # cross-compiled. But we'll have to refine this in the future.
        if:
          ${{ contains(matrix.target, 'x86') && matrix.target !=
          'x86_64-pc-windows-msvc' }}
        run: |
          # `prqlc` is an existing path at the root
          mkdir -p temp_path
          tar xzf ${{ steps.build-artifact.outputs.artifact-name }} -C temp_path
          ./temp_path/prqlc --help

  build-prqlc-c:
    # Mostly a copy/paste of `build-prqlc`.
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-24.04
            target: x86_64-unknown-linux-musl
          - os: ubuntu-24.04
            target: aarch64-unknown-linux-musl
          - os: macos-15
            target: aarch64-apple-darwin
          - os: windows-latest
            target: x86_64-pc-windows-msvc
    permissions:
      contents: write
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: ./.github/actions/build-prqlc-c
        id: build-artifact
        with:
          target: ${{ matrix.target }}
          profile: release
      - name: Upload release artifact
        if: github.event_name == 'release'
        uses: softprops/action-gh-release@v2
        with:
          append_body: true
          files: ${{ steps.build-artifact.outputs.artifact-name }}

  publish-winget:
    runs-on: ubuntu-24.04
    needs: build-prqlc
    if: github.event_name == 'release'
    steps:
      - name: publish
        uses: vedantmgoyal2009/winget-releaser@v2
        with:
          identifier: PRQL.prqlc
          version: ${{ github.ref_name }}
          installers-regex: '^prqlc-.*-windows-.*\.zip$'
          token: ${{ secrets.PRQL_BOT_GITHUB_TOKEN }}
          fork-user: prql-bot

  build-deb-package:
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        target:
          - x86_64-unknown-linux-musl
          - aarch64-unknown-linux-musl
    needs: build-prqlc
    permissions:
      contents: write
    steps:
      - uses: actions/download-artifact@v6
        with:
          name: prqlc-${{ matrix.target }}-release
      - name: Copy files into .deb package
        run: |
          tar -xf prqlc-*.tar.gz
          mkdir -p .debpkg/usr/bin
          mv prqlc .debpkg/usr/bin/prqlc
          chmod +x .debpkg/usr/bin/prqlc
      - name: Set arch variable
        run: |
          if [ "${{ matrix.target }}" == "aarch64-unknown-linux-musl" ]; then
            echo "package_arch=arm64" >> "$GITHUB_ENV"
          elif [ "${{ matrix.target }}" == "x86_64-unknown-linux-musl" ]; then
            echo "package_arch=amd64" >> "$GITHUB_ENV"
          else
            echo "::error::Unknown architecture: ${{ matrix.target }}"
            exit 1
          fi
      - name: 📦 Build .deb package
        uses: jiro4989/build-deb-action@v4
        with:
          package: prqlc
          package_root: .debpkg
          maintainer: The PRQL Project
          version: ${{ github.event_name == 'release' && github.ref_name || 0 }}
          arch: ${{ env.package_arch }}
          desc: >
            prqlc is the CLI for the PRQL compiler. It compiles PRQL to SQL, and
            offers various diagnostics.

            PRQL is a modern language for transforming data — a simple,
            powerful, pipelined SQL replacement.
      - uses: actions/upload-artifact@v5
        with:
          name: deb-${{ matrix.target }}
          path: ./*.deb
      - name: Release
        if: github.event_name == 'release'
        uses: softprops/action-gh-release@v2
        with:
          files: prqlc_*.deb

  build-rpm-package:
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        target:
          - x86_64-unknown-linux-musl
          #- aarch64-unknown-linux-musl # https://github.com/jiro4989/build-rpm-action/issues/6
    needs: build-prqlc
    permissions:
      contents: write
    steps:
      - uses: actions/download-artifact@v6
        with:
          name: prqlc-${{ matrix.target }}-release
      - name: Copy files into .rpm package
        run: |
          tar -xf prqlc-*.tar.gz
          mkdir -p .rpmpkg/usr/bin
          mv prqlc .rpmpkg/usr/bin/prqlc
          chmod +x .rpmpkg/usr/bin/prqlc
      - name: Set variables
        run: |
          if [ "${{ matrix.target }}" == "aarch64-unknown-linux-musl" ]; then
            echo "package_arch=aarch64" >> "$GITHUB_ENV"
          elif [ "${{ matrix.target }}" == "x86_64-unknown-linux-musl" ]; then
            echo "package_arch=x86_64" >> "$GITHUB_ENV"
          else
            echo "::error::Unknown architecture: ${{ matrix.target }}"
          fi
      - name: 📦 Build .rpm package
        uses: jiro4989/build-rpm-action@v2
        with:
          summary: CLI for PRQL, a modern language for transforming data
          package: prqlc
          package_root: .rpmpkg
          maintainer: The PRQL Project
          vendor: The PRQL Project
          version: ${{ github.event_name == 'release' && github.ref_name || 0 }}
          arch: ${{ env.package_arch }}
          desc: >
            prqlc is the CLI for the PRQL compiler. It compiles PRQL to SQL, and
            offers various diagnostics.

            PRQL is a modern language for transforming data — a simple,
            powerful, pipelined SQL replacement.
          license: Apache-2.0
      - uses: actions/upload-artifact@v5
        with:
          name: artifact-rpm
          path: |
            ./*.rpm
            !./*-debuginfo-*.rpm
      - run: rm prqlc-debuginfo-*.rpm
      - name: Release
        if: github.event_name == 'release'
        uses: softprops/action-gh-release@v2
        with:
          files: prqlc-*.rpm

  build-and-publish-snap:
    runs-on: ubuntu-24.04
    if: ${{ github.event_name == 'release' }}
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - name: Move Snap to project root directory
        run: cp -r prqlc/packages/snap/ .
      - name: 📦 Build Snap
        id: build
        uses: snapcore/action-build@v1
      - name: 🆙 Publish Snap
        if: github.event_name == 'release'
        uses: snapcore/action-publish@v1
        env:
          SNAPCRAFT_STORE_CREDENTIALS:
            ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}
        with:
          snap: ${{ steps.build.outputs.snap }}
          release: stable

  build-python-wheels:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: true
      matrix:
        os: [ubuntu-24.04, windows-latest]
        package:
          - prqlc-python
        target: [x86_64]
        include:
          # MacOS with universal builds
          - os: macos-15
            package: prqlc-python
            target: universal2-apple-darwin
          # Also produce more targets for ubuntu:
          - os: ubuntu-24.04
            package: prqlc-python
            target: aarch64
          - os: ubuntu-24.04
            package: prqlc-python
            target: source
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: ./.github/actions/build-python
        with:
          target: ${{ matrix.target }}
          package: ${{ matrix.package }}
          profile: release

  publish-python:
    runs-on: ubuntu-24.04
    needs: [build-python-wheels]
    if: github.event_name == 'release'
    permissions:
      id-token: write
    strategy:
      matrix:
        package:
          - prqlc-python
    steps:
      - uses: actions/download-artifact@v6
        with:
          # `*` covers target & OS
          pattern: ${{ matrix.package }}-*-release
          merge-multiple: true
      - name: Publish to PyPI
        uses: PyO3/maturin-action@v1
        with:
          command: upload
          args: --skip-existing *

  publish-js:
    runs-on: ubuntu-24.04
    permissions:
      contents: read
      id-token: write
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: wasm-pack

      - name: Setup Node
        uses: actions/setup-node@v6
        with:
          # Node 24+ includes npm 11.5.1+ required for OIDC trusted publishing
          node-version: "24.x"
          registry-url: "https://registry.npmjs.org"

      - run: ./.github/workflows/scripts/set_version.sh
      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
          # Share key with the `build-web` job
          shared-key: web
          save-if: false

      # This is only required in order to have `cross-env` installed, since `npx
      # cross-env` doesn't seem to work in CI (https://github.com/PRQL/prql/pull/3728)
      - run: npm install
        working-directory: prqlc/bindings/js/

      - name: Publish to npm
        run:
          npm publish --provenance --access public ${{ (github.event_name !=
          'release') && '--dry-run' || '' }}
        working-directory: prqlc/bindings/js/

  publish-to-cargo:
    runs-on: ubuntu-24.04
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-release
      # Currently, we can only check prqlc-parser which is not dependent other local crates with --dry-run.
      # https://github.com/crate-ci/cargo-release/issues/691
      # --no-verify is required to prevent build.
      - run:
          cargo release publish --no-confirm ${{ github.event_name == 'release'
          && '--execute' || '--no-verify --package prqlc-parser'}}
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

  # Requires another pass: https://github.com/PRQL/prql/issues/850
  # publish-prql-java:
  #   runs-on: ubuntu-24.04
  #   steps:
  #     - name: Checkout code
  #       uses: actions/checkout@v5
  #     - name: Install Java and Maven
  #       uses: actions/setup-java@v3
  #       with:
  #         java-version: 8
  #     - name: Release Maven package
  #       uses: samuelmeuli/action-maven-publish@v1
  #       with:
  #         gpg_private_key: ${{ secrets.gpg_private_key }}
  #         gpg_passphrase: ${{ secrets.gpg_passphrase }}
  #         nexus_username: ${{ secrets.nexus_username }}
  #         nexus_password: ${{ secrets.nexus_password }}
  #         directory: prql-java/java/

  push-web-branch:
    runs-on: ubuntu-24.04
    if: github.event_name == 'release'
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
        with:
          token: ${{ secrets.PRQL_BOT_GITHUB_TOKEN }}
      - run: git push origin HEAD:web --force

  push-devcontainer:
    if: github.event_name == 'release'
    uses: ./.github/workflows/build-devcontainer.yaml
    with:
      push: true


================================================
FILE: .github/workflows/scripts/set_version.sh
================================================
#!/bin/bash

# We set prefix-key to the version from Cargo.toml for Swatinem/rust-cache@v2
# since the caches seem to accumulate cruft over time;
# ref https://github.com/PRQL/prql/pull/2407

version=$(cargo metadata --format-version=1 --no-deps | jq --raw-output '.packages[] | select(.name == "prqlc") | .version')
echo "version=${version}" >>"$GITHUB_ENV"


================================================
FILE: .github/workflows/scripts/util_free_space.sh
================================================
#!/usr/bin/env bash

# From https://github.com/apache/arrow/blob/4011058f4a56bdcf160f46373355ffa0e22bcd2c/ci/scripts/util_free_space.sh

#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

set -eux

if [ "${GITHUB_ACTIONS}" = "true" ]; then
    df -h
    echo "::group::/usr/local/*"
    du -hsc /usr/local/*
    echo "::endgroup::"
    # ~1GB
    sudo rm -rf \
        /usr/local/aws-cli \
        /usr/local/aws-sam-cil \
        /usr/local/julia* || :
    echo "::group::/usr/local/bin/*"
    du -hsc /usr/local/bin/*
    echo "::endgroup::"
    # ~1GB (From 1.2GB to 214MB)
    sudo rm -rf \
        /usr/local/bin/aliyun \
        /usr/local/bin/aws \
        /usr/local/bin/aws_completer \
        /usr/local/bin/azcopy \
        /usr/local/bin/bicep \
        /usr/local/bin/cmake-gui \
        /usr/local/bin/cpack \
        /usr/local/bin/helm \
        /usr/local/bin/hub \
        /usr/local/bin/kubectl \
        /usr/local/bin/minikube \
        /usr/local/bin/node \
        /usr/local/bin/packer \
        /usr/local/bin/pulumi* \
        /usr/local/bin/sam \
        /usr/local/bin/stack \
        /usr/local/bin/terraform || :
    # 142M
    sudo rm -rf /usr/local/bin/oc || : \
        echo "::group::/usr/local/share/*"
    du -hsc /usr/local/share/*
    echo "::endgroup::"
    # 506MB
    sudo rm -rf /usr/local/share/chromium || :
    # 1.3GB
    sudo rm -rf /usr/local/share/powershell || :
    echo "::group::/usr/local/lib/*"
    du -hsc /usr/local/lib/*
    echo "::endgroup::"
    # 15GB
    sudo rm -rf /usr/local/lib/android || :
    # 341MB
    sudo rm -rf /usr/local/lib/heroku || :
    # 1.2GB
    sudo rm -rf /usr/local/lib/node_modules || :
    echo "::group::/opt/*"
    du -hsc /opt/*
    echo "::endgroup::"
    # 679MB
    sudo rm -rf /opt/az || :
    echo "::group::/opt/microsoft/*"
    du -hsc /opt/microsoft/*
    echo "::endgroup::"
    # 197MB
    sudo rm -rf /opt/microsoft/powershell || :
    echo "::group::/opt/hostedtoolcache/*"
    du -hsc /opt/hostedtoolcache/*
    echo "::endgroup::"
    # 5.3GB
    sudo rm -rf /opt/hostedtoolcache/CodeQL || :
    # 1.4GB
    sudo rm -rf /opt/hostedtoolcache/go || :
    # 489MB
    sudo rm -rf /opt/hostedtoolcache/PyPy || :
    # 376MB
    sudo rm -rf /opt/hostedtoolcache/node || :
    # Remove Web browser packages
    sudo apt purge -y \
        firefox \
        google-chrome-stable \
        microsoft-edge-stable
    df -h
fi


================================================
FILE: .github/workflows/test-dotnet.yaml
================================================
name: test-dotnet

on:
  workflow_call:
  workflow_dispatch:

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  test:
    runs-on: ubuntu-24.04
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - name: 🏗 Build prqlc-c
        run: cargo build --package prqlc-c
      - name: 🔧 Setup dotnet
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 7
      - name: 🧪 Build and test
        working-directory: prqlc/bindings
        run: |
          dotnet build dotnet
          cp ../../target/debug/libprqlc_c.* dotnet/PrqlCompiler/bin/Debug/net*/
          cp ../../target/debug/libprqlc_c.* dotnet/PrqlCompiler.Tests/bin/Debug/net*/
          dotnet test dotnet


================================================
FILE: .github/workflows/test-elixir.yaml
================================================
name: test-elixir

on:
  workflow_call:
    inputs:
      oss:
        type: string
        default: '["ubuntu-24.04"]'
  workflow_dispatch:
    inputs:
      oss:
        type: string
        default: '["ubuntu-24.04"]'

defaults:
  run:
    working-directory: prqlc/bindings/elixir

env:
  MIX_ENV: test
  # We need consistent env vars across all workflows for the cache to work
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  test:
    strategy:
      matrix:
        os: ${{ fromJSON(inputs.oss) }}
        otp: ["25.1.2"]
        elixir: ["1.15.7"]
    runs-on: ${{matrix.os}}
    steps:
      # Step: Check out the code.
      - name: Checkout code
        uses: actions/checkout@v5

      # Step: Setup Elixir + Erlang image as the base.
      - name: Set up Elixir on Windows or Linux
        if: runner.os != 'macOS'
        uses: erlef/setup-beam@v1.20.4
        with:
          otp-version: ${{matrix.otp}}
          elixir-version: ${{matrix.elixir}}

      - name: Install Erlang/Elixir on Mac
        if: runner.os == 'macOS'
        run: |
          brew install elixir
          mix local.hex --force

      # Step: Define how to cache deps. Restores existing cache if present.
      - name: Cache deps
        id: cache-deps
        uses: actions/cache@v4
        env:
          cache-name: cache-elixir-deps
        with:
          path: elixir/deps
          key:
            ${{ runner.os }}-mix-${{ env.cache-name }}-${{
            hashFiles('**/mix.lock') }}
          restore-keys: |
            ${{ runner.os }}-mix-${{ env.cache-name }}-

      # Step: Define how to cache the `_build` directory. After the first run,
      # this speeds up tests runs a lot. This includes not re-compiling our
      # project's downloaded deps every run.
      - name: Cache compiled build
        id: cache-build
        uses: actions/cache@v4
        env:
          cache-name: cache-compiled-build
        with:
          path: elixir/_build
          key:
            ${{ runner.os }}-mix-${{ env.cache-name }}-${{
            hashFiles('**/mix.lock') }}
          restore-keys: |
            ${{ runner.os }}-mix-${{ env.cache-name }}-
            ${{ runner.os }}-mix-

      # Step: Download project dependencies. If unchanged, uses
      # the cached version.
      - name: Install dependencies
        run: mix deps.get

      # Step: Compile the project treating any warnings as errors.
      # Customize this step if a different behavior is desired.
      - name: Compiles without warnings
        run: mix compile --warnings-as-errors

      # Step: Check that the checked in code has already been formatted.
      # This step fails if something was found unformatted.
      # Customize this step as desired.
      - name: Check Formatting
        run: mix format --check-formatted

      # Step: Execute the tests.
      - name: Run tests
        run: mix test


================================================
FILE: .github/workflows/test-java.yaml
================================================
name: test-java

on:
  workflow_call:
    inputs:
      oss:
        type: string
        default: '["ubuntu-24.04"]'
  workflow_dispatch:
    inputs:
      oss:
        type: string
        default: '["ubuntu-24.04"]'

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: ${{ fromJSON(inputs.oss) }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v5
      - run: ./.github/workflows/scripts/set_version.sh
      - name: Compute Cargo.lock hash
        shell: bash
        run: |
          if command -v sha256sum &> /dev/null; then
            echo "cargo_lock_hash=$(sha256sum Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
          else
            echo "cargo_lock_hash=$(shasum -a 256 Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
          fi
      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ env.version }}-${{ env.cargo_lock_hash }}
          save-if: ${{ github.ref == 'refs/heads/main' }}
          shared-key: lib
      - name: Maven test
        working-directory: prqlc/bindings/java/java/
        run: ./mvnw test


================================================
FILE: .github/workflows/test-js.yaml
================================================
name: test-js

on:
  workflow_call:
    inputs:
      oss:
        type: string
        default: '["ubuntu-24.04"]'
  workflow_dispatch:
    inputs:
      oss:
        type: string
        default: '["ubuntu-24.04"]'

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  test:
    runs-on: ${{ matrix.os }}
    continue-on-error: ${{ matrix.os == 'windows-latest' }}
    strategy:
      fail-fast: false
      matrix:
        os: ${{ fromJSON(inputs.oss) }}
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5

      - name: Setup Node
        uses: actions/setup-node@v6
        with:
          node-version: "21.x"

      - uses: baptiste0928/cargo-install@v3
        with:
          crate: wasm-pack

      - run: ./.github/workflows/scripts/set_version.sh

      - name: Compute Cargo.lock hash
        shell: bash
        run: |
          if command -v sha256sum &> /dev/null; then
            echo "cargo_lock_hash=$(sha256sum Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
          else
            echo "cargo_lock_hash=$(shasum -a 256 Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
          fi

      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        id: cache
        with:
          prefix-key: ${{ env.version }}-${{ env.cargo_lock_hash }}
          # `web` is the closest rust cache key. It's useful on ubuntu (last
          # checked, roughly halved the time, to 4 min), but not on other OSs
          # given we don't have those caches. We can't use a separate one given
          # we're out of cache space.
          shared-key: web
          save-if: false

      - run: npm cit
        working-directory: prqlc/bindings/js


================================================
FILE: .github/workflows/test-php.yaml
================================================
name: test-php

on:
  workflow_call:
  workflow_dispatch:

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-24.04]
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: go-task/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - run: ./.github/workflows/scripts/set_version.sh
      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
          save-if: ${{ github.ref == 'refs/heads/main' }}
          shared-key: lib
      - run: task build-php
      - run: task test-php


================================================
FILE: .github/workflows/test-prqlc-c.yaml
================================================
name: test-prqlc-c

on:
  workflow_call:
  workflow_dispatch:

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  test-c:
    runs-on: ubuntu-24.04
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - run: ./.github/workflows/scripts/set_version.sh
      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
          save-if: ${{ github.ref == 'refs/heads/main' }}
          shared-key: lib
      - name: Build
        uses: clechasseur/rs-cargo@v4
        with:
          command: build
          # Currently requires a release build; would be useful to allow a debug build.
          args: --release --package prqlc-c
      - name: Run example minimal-c
        working-directory: prqlc/bindings/prqlc-c/examples/minimal-c
        run: make run
      - name: Run example minimal-cpp
        working-directory: prqlc/bindings/prqlc-c/examples/minimal-cpp
        run: make run

      - uses: go-task/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - name: 🔧 Setup Zig
        uses: mlugg/setup-zig@v2
      - name: Run example minimal-zig
        run: task zig


================================================
FILE: .github/workflows/test-python.yaml
================================================
name: test-python

on:
  workflow_call:
    inputs:
      oss:
        type: string
        default: '["ubuntu-24.04"]'
  workflow_dispatch:
    inputs:
      oss:
        type: string
        default: '["ubuntu-24.04"]'

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: ${{ fromJSON(inputs.oss) }}
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - name: Build wheel
        uses: ./.github/actions/build-python
        with:
          target: ${{ matrix.os == 'ubuntu-24.04' && 'x86_64' || '' }}
          package: prqlc-python
          profile: dev
      - uses: actions/download-artifact@v6
        with:
          # `*` covers all targets (we could make this explicit...)
          pattern: prqlc-python-${{ runner.os }}-*-dev
          path: target/python
      - uses: actions/setup-python@v6
        with:
          python-version: "3.10"
      - uses: actions/setup-python@v6
        with:
          python-version: "3.12"
      - name: Install uv
        uses: astral-sh/setup-uv@v7
      - name: Install nox
        run: uv tool install nox
        shell: bash
      - name: Compute pyproject.toml hash
        shell: bash
        run: |
          if command -v sha256sum &> /dev/null; then
            echo "pyproject_hash=$(sha256sum prqlc/bindings/prqlc-python/pyproject.toml | cut -d' ' -f1)" >> "$GITHUB_ENV"
          else
            echo "pyproject_hash=$(shasum -a 256 prqlc/bindings/prqlc-python/pyproject.toml | cut -d' ' -f1)" >> "$GITHUB_ENV"
          fi
      - name: Cache uv and Nox
        uses: actions/cache@v4
        with:
          path: |
            .nox
            ~/.cache/uv
          key: nox-uv-${{ env.pyproject_hash }}
      - name: Run tests and typing
        shell: bash
        run: |
          export UV_SYSTEM_PYTHON=1
          nox -s tests typing -f prqlc/bindings/prqlc-python/noxfile.py


================================================
FILE: .github/workflows/test-rust.yaml
================================================
name: test-rust

on:
  # Currently we only run this as `workflow_call`, since `tests.yaml` always calls it.
  workflow_call:
    inputs:
      os:
        type: string
        required: true
      target:
        type: string
        required: true
      features:
        type: string
        required: true
      nightly:
        description: "Whether to run extra tests (this is not nightly rust)"
        type: boolean
        default: false

env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  # This used to reduce the size of the cargo cache by ~25%. It's not as
  # effective as it once was, as explained in
  # https://github.com/PRQL/prql/pull/2797
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  test-rust:
    runs-on: ${{ inputs.os }}
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
        with:
          fetch-tags: true
      - name: Run docker compose
        # This can go early because the DBs take a few seconds to start up.
        if: ${{ contains(inputs.features, 'test-dbs-external') }}
        run: docker compose up -d
        working-directory: ./prqlc/prqlc/tests/integration/dbs
      - if: ${{ contains(inputs.target, 'musl') }}
        run: |
          sudo apt-get update
          sudo apt-get install -y musl-tools
      - run: rustup target add ${{ inputs.target }}
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: wasm-bindgen-cli
        if: inputs.target == 'wasm32-unknown-unknown'
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-insta
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-nextest
      - run: ./.github/workflows/scripts/set_version.sh
        shell: bash
      - name: Compute Cargo.lock hash
        shell: bash
        run: |
          if command -v sha256sum &> /dev/null; then
            echo "cargo_lock_hash=$(sha256sum Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
          else
            echo "cargo_lock_hash=$(shasum -a 256 Cargo.lock | cut -d' ' -f1)" >> "$GITHUB_ENV"
          fi
      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        id: cache
        with:
          # We add the hash of the Cargo.lock file to the key, to prevent the
          # gradual accumulation of disk space that comes from using previous
          # caches. The rust cache is designed to remove old packages, but isn't
          # that successful at it, and our current cache size at ~1.3GB is about
          # as much as GHA can handle, such that if we hold old packages, it
          # balloons to 2GB and fails. Some discussion at:
          # https://github.com/Swatinem/rust-cache/issues/177
          prefix-key: ${{ env.version }}-${{ env.cargo_lock_hash }}
          shared-key: rust-${{ inputs.target }}
          # Don't save if empty features, because we run a test with empty
          # features on linux, and don't want to save that instead of the one
          # with all features. I tried including features in the key, but it
          # contains a comma, which isn't allowed; a whole extra task to remove
          # the comma seemed over the top.
          save-if:
            ${{ github.ref == 'refs/heads/main' && inputs.features != '' }}
      - uses: actions/setup-python@v6
        # python isn't natively installed on macos-15, so we need to install it
        if: ${{ inputs.os == 'macos-15' }}
        with:
          python-version: "3.11"
      - name: Free up disk space
        # https://github.com/actions/runner-images/issues/2840
        run: ./.github/workflows/scripts/util_free_space.sh
        # This takes ~3 minutes, so we'd really prefer not to run it on every
        # PR. Trying to run it only when there is no cache hit. We may need to
        # remove that condition and run it whenever we pull the docker images,
        # or explore breaking up the tests more (though that's not easy to get
        # savings on either). Ideally GH will allow for more disk space in the
        # future... (deleting things doesn't actually remove the amount of stuff
        # that GH needs to store, so it's purely performative!)
        if:
          ${{ contains(inputs.features, 'test-dbs-external') &&
          steps.cache.outputs.cache-hit == 'false' }}
      # We split up the test compilation as recommended in
      # https://matklad.github.io/2021/09/04/fast-rust-builds.html
      - name: 🏭 Compile
        uses: clechasseur/rs-cargo@v4
        with:
          command: test
          args: >
            --no-run --locked --target=${{ inputs.target }}
            --no-default-features --features=${{ inputs.features }}
      - name: Wait for database
        uses: ifaxity/wait-on-action@v1.2.1
        with:
          resource: "tcp:1433 tcp:3306 tcp:5432 tcp:9004"
          timeout: 60000
        if: ${{ contains(inputs.features, 'test-dbs-external') }}
      - name: 📋 Test
        uses: clechasseur/rs-cargo@v4
        with:
          command: insta
          # Here, we also add:
          # - Unreferenced snapshots - `--unreferenced=auto` when testing on
          #   linux & with `test-dbs` feature.
          # - Test runner - `--test-runner=nextest` when not targeting wasm32.
          # - Skip doc tests on Windows due to LNK1318 PDB errors
          args: >
            test --dnd --target=${{ inputs.target }} --no-default-features
            --features=${{ inputs.features }} ${{ contains(inputs.features,
            'test-dbs') && inputs.target == 'x86_64-unknown-linux-gnu' &&
            '--unreferenced=auto' || '' }} ${{ inputs.target !=
            'wasm32-unknown-unknown' && '--test-runner=nextest' || '' }} ${{
            inputs.os == 'windows-latest' && '--lib --bins --tests --examples'
            || '' }}
      - name: 📋 Doctest
        # Skip doctests on Windows (LNK1318 PDB errors) and wasm32
        if:
          inputs.os != 'windows-latest' && inputs.target !=
          'wasm32-unknown-unknown'
        uses: clechasseur/rs-cargo@v4
        with:
          command: test
          args: >
            --doc --target=${{ inputs.target }} --no-default-features
            --features=${{ inputs.features }}
      - name: 📎 Clippy
        uses: clechasseur/rs-cargo@v4
        with:
          command: clippy
          # Note that `--all-targets` doesn't refer to targets like
          # `wasm32-unknown-unknown`; it refers to lib / bin / tests etc.
          #
          args: >
            --all-targets --target=${{ inputs.target }} --no-default-features
            --features=${{ inputs.features }} -- -D warnings
      - name: ⌨️ Fmt
        uses: clechasseur/rs-cargo@v4
        with:
          command: fmt
          args: --all --check
      - name: 🗒️ Doc
        # Only running on nightly, because of
        # https://github.com/duckdb/duckdb-rs/issues/179#issuecomment-1710986020.
        if:
          inputs.nightly == 'true' && inputs.target != 'wasm32-unknown-unknown'
        uses: clechasseur/rs-cargo@v4
        with:
          command: doc
          # Only run with deps on nightly, since it's much slower, and so far™
          # we haven't seen any errors.
          args:
            --target=${{ inputs.target }} --no-default-features --features=${{
            inputs.features }} ${{ inputs.nightly != 'true' && '--no-deps' || ''
            }}
      - name: Build extra targets for cache
        # When building the cache, we also run with `--all-targets` so that
        # prqlc builds can use the same cache.
        if:
          ${{ github.ref == 'refs/heads/main' && steps.cache.outputs.cache-hit
          == 'false' }}
        uses: clechasseur/rs-cargo@v4
        with:
          command: build
          args:
            --all-targets --target=${{ inputs.target }} --no-default-features
            --features=${{ inputs.features }}


================================================
FILE: .github/workflows/tests.yaml
================================================
# This file has transitioning to run almost everything, with rules defined in
# this file rather than across lots of workflow files.
name: tests

on:
  pull_request:
    # Add `labeled`, so we can trigger a new run by adding a `pr-nightly`
    # label, which we then use to trigger a `nightly` run.
    types: [opened, reopened, synchronize, labeled]
    branches:
      - "*"
  push:
    branches:
      - main
  schedule:
    # Pick a random time, something that others won't pick, to be good citizens
    # and reduce GH's demand variance.
    - cron: "49 10 * * *"
  workflow_dispatch:
  workflow_call:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
  cancel-in-progress: true

# We need consistent env vars across all workflows for the cache to work
env:
  CARGO_TERM_COLOR: always
  CLICOLOR_FORCE: 1
  RUSTFLAGS: "-C debuginfo=0"
  RUSTDOCFLAGS: "-Dwarnings"

jobs:
  # This assesses whether we need to run jobs. Some of them are defined only by
  # the changes in PR, others also define a set of other criteria, such as
  # whether a label has been added, or we're on `main` branch.
  rules:
    runs-on: ubuntu-24.04
    permissions:
      pull-requests: read
    outputs:
      book: ${{ steps.changes.outputs.book }}
      dotnet: ${{ steps.changes.outputs.dotnet }}
      devcontainer-push: ${{ steps.devcontainer-push.outputs.run }}
      devcontainer-build: ${{ steps.devcontainer-build.outputs.run }}
      elixir: ${{ steps.changes.outputs.elixir }}
      grammars: ${{ steps.changes.outputs.grammars }}
      java: ${{ steps.changes.outputs.java }}
      js: ${{ steps.changes.outputs.js }}
      prqlc-c: ${{ steps.changes.outputs.prqlc-c }}
      # Run tests such as rust tests for all-OSs, and bindings tests on ubuntu.
      # Somewhat a tradeoff between coverage and ensuring our CI queues stay
      # short.
      main: ${{ steps.main.outputs.run }}
      # Run all tests
      nightly: ${{ steps.nightly.outputs.run }}
      # For tasks which are very expensive or can only run on
      # the main repo, such as pushing devcontainer or creating issues
      nightly-upstream: ${{ steps.nightly-upstream.outputs.run }}
      php: ${{ steps.changes.outputs.php }}
      python: ${{ steps.changes.outputs.python }}
      rust: ${{ steps.changes.outputs.rust }}
      taskfile: ${{ steps.changes.outputs.taskfile }}
      web: ${{ steps.changes.outputs.web }}

    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
        with:
          fetch-tags: true
      - uses: dorny/paths-filter@v3
        id: changes
        with:
          filters: |
            book:
              - .github/workflows/check-links-book.yaml
              - web/book/**
            dotnet:
              - prqlc/bindings/prql-dotnet/**
              - prqlc/bindings/prqlc-c/**
              - .github/workflows/test-dotnet.yaml
            devcontainer-push:
              - .devcontainer/**/*Dockerfile
              - .github/workflows/build-devcontainer.yaml
              - Taskfile.yaml
            devcontainer-build:
              - .devcontainer/**/*Dockerfile
              - .github/workflows/build-devcontainer.yaml
              - Taskfile.yaml
            grammars:
              - grammars/**
            elixir:
              - prqlc/bindings/elixir/**
              - prqlc/bindings/prqlc-c/**
              - .github/workflows/test-elixir.yaml
            java:
              - prqlc/bindings/java/**
              - prqlc/bindings/prqlc-c/**
              - .github/workflows/test-java.yaml
            js:
              - prqlc/bindings/js/**
              - .github/workflows/test-js.yaml
            prqlc-c:
              - prqlc/bindings/prqlc-c/**
              - .github/workflows/test-prqlc-c.yaml
            main:
              - "**/Cargo.*"
              - .github/**
              - .config/**
            nightly:
              - .github/workflows/nightly.yaml
              - .github/workflows/release.yaml
              - Cargo.toml
              - Cargo.lock
              - rust-toolchain.toml
              - .cargo/**
            php:
              - prqlc/bindings/php/**
              - prqlc/bindings/prqlc-c/**
              - .github/workflows/test-php.yaml
            python:
              - prqlc/bindings/prqlc-python/**
              - .github/workflows/test-python.yaml
            rust:
              - "**/*.rs"
              - prqlc/**
              - web/book/**
              - .github/workflows/test-rust.yaml
            taskfile:
              # Run taskfile test on any Taskfile change, since the tasks pull in tasks from
              # other taskfiles. (But we don't run the container rebuilds, since those are
              # much heavier)
              - "**/Taskfile.yaml"
            web:
              - "web/**"
              - ".github/workflows/build-web.yaml"
              - "**.md"

      # We put a few of the more complex rules as steps here, rather than having
      # them inline. There's no strict delineation between logic here vs. inline.

      - id: nightly
        # TODO: actionlint annoyingly blocks this — try and find a way of getting
        # it back without too much trouble...
        # contains(github.event.pull_request.title, '!') ||
        run:
          echo "run=${{ steps.changes.outputs.nightly == 'true' ||
          contains(github.event.pull_request.labels.*.name, 'pr-nightly') ||
          github.event_name == 'schedule' }}" >>"$GITHUB_OUTPUT"

      - id: nightly-upstream
        run:
          echo "run=${{ github.event_name == 'schedule' &&
          github.repository_owner == 'prql' }}" >>"$GITHUB_OUTPUT"

      - id: main
        run:
          echo "run=${{ steps.changes.outputs.main == 'true' || github.ref ==
          'refs/heads/main' || steps.nightly.outputs.run == 'true' }}" >>
          "$GITHUB_OUTPUT"

      - id: devcontainer-push
        # We push the devcontainer if the files have changed, and we've merged
        # to main.
        run:
          echo "run=${{ steps.changes.outputs.devcontainer-push == 'true' &&
          github.ref == 'refs/heads/main' && github.event_name == 'push' }}" >>
          "$GITHUB_OUTPUT"

      - id: devcontainer-build
        run:
          echo "run=${{ steps.devcontainer-push.outputs.run == 'true' ||
          steps.changes.outputs.devcontainer-build == 'true' ||
          steps.changes.outputs.nightly-upstream == 'true' }}" >>
          "$GITHUB_OUTPUT"

  test-rust:
    needs: rules
    if: needs.rules.outputs.rust == 'true' || needs.rules.outputs.main == 'true'
    uses: ./.github/workflows/test-rust.yaml
    strategy:
      matrix:
        include:
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-24.04
            features: default,test-dbs-external
          # Only run wasm on ubuntu, given it's the same rust target. (There is
          # a possibility of having a failure on just one platform, but it's
          # quite unlikely. If we do observe this, we can add those tests them
          # to nightly.
          - target: wasm32-unknown-unknown
            os: ubuntu-24.04
            features: default
    with:
      os: ubuntu-24.04
      target: ${{ matrix.target }}
      features: ${{ matrix.features }}
      nightly: ${{ needs.rules.outputs.nightly == 'true' }}

  test-python:
    needs: rules
    if:
      needs.rules.outputs.python == 'true' || needs.rules.outputs.main == 'true'
    uses: ./.github/workflows/test-python.yaml
    with:
      # Only run on ubuntu unless there's a lang-specific change or we're
      # running nightly.
      #
      # An alternative to these somewhat horrible expressions would be
      # `test-python` & `test-python-more` workflows; though it would use up our
      # 20 workflow limit.
      oss:
        ${{ (needs.rules.outputs.python == 'true' || needs.rules.outputs.nightly
        == 'true') && '["ubuntu-24.04", "macos-15", "windows-latest"]' ||
        '["ubuntu-24.04"]' }}

  test-js:
    needs: rules
    if: needs.rules.outputs.js == 'true' || needs.rules.outputs.main == 'true'
    uses: ./.github/workflows/test-js.yaml
    with:
      # Only run on ubuntu unless there's a lang-specific change or we're running nightly.
      oss:
        ${{ (needs.rules.outputs.js == 'true' || needs.rules.outputs.nightly ==
        'true') && '["ubuntu-24.04", "macos-15", "windows-latest"]' ||
        '["ubuntu-24.04"]' }}

  test-dotnet:
    needs: rules
    if:
      needs.rules.outputs.dotnet == 'true' || needs.rules.outputs.main == 'true'
    uses: ./.github/workflows/test-dotnet.yaml

  test-php:
    needs: rules
    if: needs.rules.outputs.php == 'true' || needs.rules.outputs.main == 'true'
    uses: ./.github/workflows/test-php.yaml

  test-java:
    needs: rules
    if: needs.rules.outputs.java == 'true' || needs.rules.outputs.main == 'true'
    uses: ./.github/workflows/test-java.yaml
    with:
      # Currently we never run windows
      oss:
        ${{ (needs.rules.outputs.java == 'true' || needs.rules.outputs.nightly
        == 'true') && '["ubuntu-24.04", "macos-15"]' || '["ubuntu-24.04"]' }}

  test-elixir:
    needs: rules
    if:
      needs.rules.outputs.elixir == 'true' || needs.rules.outputs.main == 'true'
    uses: ./.github/workflows/test-elixir.yaml
    with:
      # Currently we never run Mac, see prql-elixir docs for details
      oss:
        ${{ (needs.rules.outputs.elixir == 'true' || needs.rules.outputs.nightly
        == 'true') && '["ubuntu-24.04", "windows-2022"]' || '["ubuntu-24.04"]'
        }}

  test-prqlc-c:
    needs: rules
    if:
      needs.rules.outputs.prqlc-c == 'true' || needs.rules.outputs.main ==
      'true'
    uses: ./.github/workflows/test-prqlc-c.yaml

  # Disabled due to https://github.com/PRQL/prql/pull/4876
  # To re-enable, uncomment this entire job block
  # test-taskfile:
  #   needs: rules
  #   if: |
  #     needs.rules.outputs.taskfile == 'true' ||
  #     needs.rules.outputs.nightly-upstream == 'true'
  #   runs-on: macos-15
  #   steps:
  #     - name: 📂 Checkout code
  #       uses: actions/checkout@v5
  #     - run: ./.github/workflows/scripts/set_version.sh
  #     - uses: actions/setup-python@v6
  #       with:
  #         python-version: "3.11"
  #     - name: 💰 Cache
  #       uses: Swatinem/rust-cache@v2
  #       with:
  #         prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
  #         # The mac rust cache key. It's not _that_ useful since this will build
  #         # much more, but it's better than nothing. This task can't have our own
  #         # cache, since we're out of cache space and this workflow takes 1.5GB.
  #         shared-key: rust-aarch64-apple-darwin
  #         save-if: false
  #     - name: Install Task
  #       uses: go-task/setup-task@v1
  #       with:
  #         repo-token: ${{ secrets.GITHUB_TOKEN }}
  #     # Required because of https://github.com/cargo-bins/cargo-binstall/issues/1254
  #     - run: brew install bash
  #     - run: task install-brew-dependencies
  #     - run: task setup-dev
  #     # This also encompasses `build-all`
  #     - run: task test-all
  #     - run: task prqlc:test
  #     - run: task lint

  test-rust-main:
    needs: rules
    if: needs.rules.outputs.main == 'true'
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: macos-15
            target: aarch64-apple-darwin
            features: default,test-dbs
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            # We'd like to reenable integration tests on Windows, ref https://github.com/wangfenjin/duckdb-rs/issues/179.
            features: default
          - os: ubuntu-24.04
            target: x86_64-unknown-linux-gnu
            # One test with no features
            features: ""

          # TODO: potentially enable these
          # - os: ubuntu-24.04
          #   target: aarch64-unknown-linux-musl

    uses: ./.github/workflows/test-rust.yaml
    with:
      os: ${{ matrix.os }}
      target: ${{ matrix.target }}
      features: ${{ matrix.features }}

  build-web:
    needs: rules
    if: needs.rules.outputs.web == 'true' || needs.rules.outputs.main == 'true'
    uses: ./.github/workflows/build-web.yaml

  lint-megalinter:
    uses: ./.github/workflows/lint-megalinter.yaml

  publish-web:
    uses: ./.github/workflows/publish-web.yaml
    if: contains(github.event.pull_request.labels.*.name, 'pr-publish-web')

  nightly:
    needs: rules
    uses: ./.github/workflows/nightly.yaml
    if: needs.rules.outputs.nightly == 'true'
    secrets: inherit

  check-links-markdown:
    needs: rules
    # Using lychee via pre-commit for consistency with local development.
    # Lychee has better retry support for transient network errors than markdown-link-check.
    runs-on: ubuntu-24.04
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5

      - uses: baptiste0928/cargo-install@v3
        with:
          crate: lychee

      - uses: actions/setup-python@v6
        with:
          python-version: "3.11"

      - name: Install pre-commit
        run: pip install pre-commit

      - name: Cache lychee results
        uses: actions/cache@v4
        with:
          path: .lycheecache
          key: lychee-${{ github.sha }}
          restore-keys: lychee-

      # For PRs: get list of modified markdown files
      - name: Get modified files
        if: needs.rules.outputs.nightly != 'true'
        id: changed-files
        uses: tj-actions/changed-files@v47
        with:
          files: |
            **/*.md
            **/*.rst

      - name: Link Checker (All files - Nightly)
        if: needs.rules.outputs.nightly == 'true'
        run: pre-commit run --hook-stage manual lychee-all --all-files
        continue-on-error: true

      - name: Link Checker (Modified files only - PRs)
        if:
          needs.rules.outputs.nightly != 'true' &&
          steps.changed-files.outputs.any_modified == 'true'
        run:
          pre-commit run lychee --files ${{
          steps.changed-files.outputs.all_changed_files }}
        continue-on-error: true

  check-links-book:
    # We also have a check-links-markdown job, however it will not spot mdbook
    # mistakes such as forgetting to list an .md file in SUMMARY.md.
    # Running a link checker on the generated HTML is more reliable.
    needs: rules
    if:
      needs.rules.outputs.book == 'true' || needs.rules.outputs.nightly ==
      'true'

    runs-on: ubuntu-24.04

    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: mdbook
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: mdbook-footnote
      # the link checker
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: hyperlink
      - run: ./.github/workflows/scripts/set_version.sh
      - name: Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
          shared-key: web
          # Created by `build-web`
          save-if: false
      # Only build the book — rather than `build-web` which also builds the playground
      - name: Build the mdbook
        run: mdbook build web/book/
      - name: Check links
        run: hyperlink web/book/book/

  measure-code-cov:
    runs-on: ubuntu-24.04
    needs: rules
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - run: ./.github/workflows/scripts/set_version.sh
      - uses: actions/setup-python@v6
        with:
          python-version: "3.11"
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-llvm-cov
      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
          save-if: ${{ github.ref == 'refs/heads/main' }}
      # Ensure nothing remains from caching
      - run: cargo llvm-cov clean --workspace
      - run:
          # We considered moving to using `codecov.json` with
          # `--codecov --output-path=codecov.json` since that has branch & region
          # coverage. But the coverage is lower, in a way that doesn't represent
          # what is useful coverage
          cargo llvm-cov --cobertura --output-path=cobertura.xml
          --no-default-features --features=default,test-dbs
      - name: Upload code coverage results
        uses: actions/upload-artifact@v5
        with:
          name: code-coverage-report
          path: cobertura.xml
      - name: Upload to codecov.io
        if:
          # This action raises an error on forks. It allows running on PRs to
          # the main repo, which is important. Rarely do we need this uploading
          # from forks so while we can reenable running from forks if it works,
          # it's not that important.
          #
          # As of 2024-06, codecov was still working through how they handle
          # forks / tokens on PRs given rate limits, expect some failures for a
          # bit.
          #
          # As of 2024-06, we're also seeing that uploading on schedule can
          # measure very slightly different coverage, which can then cause PRs
          # based off that base to show reduced coverage, and show a failure. So
          # we disable it on schedule. Not sure that's a perfect solution — is
          # it giving different coverage _because_ it's on schedule, or is it
          # random such that limiting to running on main will sometimes show
          # reduced coverage? Because we're making comparisons, reproducible
          # accuracy is important.
          ${{ github.repository_owner == 'prql' && github.event_name !=
          'schedule' }}
        uses: codecov/codecov-action@v5
        with:
          files: cobertura.xml
          fail_ci_if_error: true
          # As discussed in
          # https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954,
          # without this the upload has a fairly high failure rate. The only
          # thing the token allows is uploading coverage, so there are
          # apparently no security risks.
          #
          # Edit: actually no luck, waiting on
          # https://github.com/codecov/codecov-action/issues/1469
          token: cab4ace5-4f10-4027-8b5c-d79722234571

  test-grammars:
    # Currently tests lezer grammars. We could split that out into a separate
    # job if we want when we add more.
    runs-on: ubuntu-24.04
    needs: rules
    if:
      needs.rules.outputs.grammars == 'true' || needs.rules.outputs.main ==
      'true'
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - name: 🧅 Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest
      - name: Install dependencies
        working-directory: grammars/prql-lezer/
        run: bun install
      - name: Build grammar
        working-directory: grammars/prql-lezer/
        run: bun run build
      - name: Test grammar
        working-directory: grammars/prql-lezer/
        run: bun run test

  build-devcontainer:
    needs: rules
    if: needs.rules.outputs.devcontainer-build == 'true'
    uses: ./.github/workflows/build-devcontainer.yaml
    # One problem with this setup is that if another commit is merged to main,
    # this workflow will cancel existing jobs, and so this won't get pushed. We
    # have another workflow which runs on each release, so the image should get
    # pushed eventually. The alternative is to have a separate workflow, but
    # then we can't use the nice logic of when to run the workflow that we've
    # built up here.
    with:
      # This needs to compare to the string `'true'`, because of GHA awkwardness
      push: ${{ needs.rules.outputs.devcontainer-push == 'true' }}

  test-msrv:
    runs-on: ubuntu-24.04
    needs: rules
    if: needs.rules.outputs.nightly == 'true'
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-msrv
          # TODO: remove this version pinning
          # The latest 0.16 supports workspace inheritance, so the check will fail
          version: "0.15"
        # Note this currently uses a manually maintained key in
        # `prqlc/prqlc/Cargo.toml`, because of
        # https://github.com/foresterre/cargo-msrv/issues/590
      - name: Verify minimum rust version — prqlc
        # Ideally we'd check all crates, ref https://github.com/foresterre/cargo-msrv/issues/295
        working-directory: prqlc/prqlc
        run: cargo msrv verify

  test-deps-min-versions:
    runs-on: ubuntu-24.04
    needs: rules
    if: needs.rules.outputs.nightly == 'true'
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - run: rustup override set nightly-2025-11-10
      - uses: actions/setup-python@v6
        with:
          python-version: "3.11"
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-hack
      - uses: baptiste0928/cargo-install@v3
        with:
          crate: cargo-minimal-versions
      - run: ./.github/workflows/scripts/set_version.sh
      - name: 💰 Cache
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: ${{ env.version }}-${{ hashFiles('./Cargo.lock') }}
          save-if: ${{ github.ref == 'refs/heads/main' }}
      - name: Verify minimum rust version
        run: cargo minimal-versions test --direct

  check-ok-to-merge:
    # This indicates to GitHub whether everything in this workflow has passed
    # and (unlike if we included each task in the branch's GitHub required
    # tests) will pass when a task is skipped.
    if: always()
    needs:
      - build-devcontainer
      - build-web
      - check-links-book
      - check-links-markdown
      - lint-megalinter
      - nightly
      - publish-web
      - test-deps-min-versions
      - test-dotnet
      - test-elixir
      - test-grammars
      - test-java
      - test-js
      - test-msrv
      - test-php
      - test-prqlc-c
      - test-python
      - test-rust
      - test-rust-main
      # - test-taskfile  # Disabled due to https://github.com/PRQL/prql/pull/4876
    runs-on: ubuntu-24.04
    steps:
      - name: Decide whether the needed jobs succeeded or failed
        # https://github.com/re-actors/alls-green/issues/23
        uses: re-actors/alls-green@cf9edfcf932a0ed6b431433fa183829c68b30e3f
        with:
          jobs: ${{ toJSON(needs) }}
          # We don't include `check-links-markdown`, since occasionally we'll want to merge
          # something which temporarily fails that, such as if we're changing the
          # location of a file in this repo which is linked to.
          #
          # We're currently including `nightly` because I'm not sure whether
          # it's always reliable; e.g. `cargo-audit`
          allowed-failures: |
            [
              "check-links-markdown",
              "nightly"
            ]
          # We skip jobs deliberately, so we are OK if any are skipped.
          #
          # Copy-pasted from `needs`, since it needs to be a json list, so `${{
          # toJSON(needs) }}` (which is a map) doesn't work.
          # https://github.com/re-actors/alls-green/issues/23
          allowed-skips: |
            [
              "build-devcontainer",
              "build-web",
              "check-links-book",
              "check-links-markdown",
              "lint-megalinter",
              "nightly",
              "publish-web",
              "test-deps-min-versions",
              "test-dotnet",
              "test-elixir",
              "test-grammars",
              "test-java",
              "test-js",
              "test-msrv",
              "test-php",
              "test-prqlc-c",
              "test-python",
              "test-rust",
              "test-rust-main",
              "test-taskfile"
            ]

  build-prqlc:
    runs-on: ${{ matrix.os }}
    needs: rules
    if: needs.rules.outputs.rust == 'true' || needs.rules.outputs.main == 'true'
    strategy:
      fail-fast: false
      matrix:
        include:
          # Match the features with the available caches from tests
          - os: ubuntu-24.04
            target: x86_64-unknown-linux-musl
            features: default
          # TODO: Until we have tests for these, we don't have a cache for them.
          # If we can add tests, then re-enable them. They run on `release.yaml`
          # regardless.
          #
          # - os: ubuntu-24.04
          #   target: aarch64-unknown-linux-musl
          - os: macos-15
            target: aarch64-apple-darwin
            features: default,test-dbs
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            features: default
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: ./.github/actions/build-prqlc
        with:
          target: ${{ matrix.target }}
          profile: dev
          features: ${{ matrix.features }}
    # We need consistent env vars across all workflows for the cache to work
    env:
      CARGO_TERM_COLOR: always
      CLICOLOR_FORCE: 1
      RUSTFLAGS: "-C debuginfo=0"
      RUSTDOCFLAGS: "-Dwarnings"

  build-prqlc-c:
    runs-on: ${{ matrix.os }}
    needs: rules
    if: needs.rules.outputs.main == 'true'
    strategy:
      fail-fast: false
      matrix:
        include:
          # Match the features with the available caches from tests
          - os: ubuntu-24.04
            target: x86_64-unknown-linux-musl
            features: default
          - os: macos-15
            target: aarch64-apple-darwin
            features: default,test-dbs
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            features: default
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: ./.github/actions/build-prqlc-c
        with:
          target: ${{ matrix.target }}
          profile: dev
          features: ${{ matrix.features }}
    # We need consistent env vars across all workflows for the cache to work
    env:
      CARGO_TERM_COLOR: always
      CLICOLOR_FORCE: 1
      RUSTFLAGS: "-C debuginfo=0"
      RUSTDOCFLAGS: "-Dwarnings"

  create-issue-on-nightly-failure:
    runs-on: ubuntu-24.04
    needs:
      - check-ok-to-merge
      - rules
    if:
      ${{ always() && contains(needs.*.result, 'failure') &&
      needs.rules.outputs.nightly-upstream == 'true' }}
    permissions:
      contents: read
      issues: write
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: JasonEtco/create-an-issue@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          LINK:
            ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{
            github.run_id }}
        with:
          filename: .github/nightly-failure.md
          update_existing: true
          search_existing: open

  update-rust-toolchain:
    runs-on: ubuntu-24.04
    needs: rules
    if: ${{ needs.rules.outputs.nightly-upstream == 'true' }}
    # Note that this doesn't change the minimum supported version, only the
    # default toolchain to run on. The minimum is defined by Cargo.toml's
    # metadata.msrv and is updated manually based on when build environments
    # such as debian & winget are updated.
    steps:
      - name: 📂 Checkout code
        uses: actions/checkout@v5
      - uses: a-kenji/update-rust-toolchain@main
        with:
          # Discussion in #1561
          minor-version-delta: 1
          toolchain-path: "./rust-toolchain.toml"
          pr-title: "build: Update rust toolchain version"
          token: ${{ secrets.PRQL_BOT_GITHUB_TOKEN }}


================================================
FILE: .gitignore
================================================
.DS_Store

dist
target*/
*.out
*.log

lcov.info
*.profraw

**/.vscode/settings.json
**/.vscode/launch.json
**/.vscode/tasks.json
.idea

_*.prql
/*.prql
/*.sql
_*.sql

# Appears when using Docker container
.Trash-0

**/node_modules/

.task
.direnv

*.snap.tmp
# These shouldn't be committed, and cause watchers to re-run when they're
# created, which we don't want. That said, if ignoring them causes confusion
# (e.g. folks look at their git status to assess whether there are pending
# snapshots), we can adjust.
*.pending-snap
*.snap.new

*.my.csv
log*.json
log*.html

cobertura.xml
codecov.json
.envrc

# Some paths we don't want to include. We could ignore these further down the
# tree, but prettier relies on this file rather than resolving all the way down.
.venv
.nox
vendor
.mypy_cache/
.hypothesis/
.aider*
.env

# Lychee link checker cache
.lycheecache


================================================
FILE: .markdownlint-cli2.yaml
================================================
config:
  # We use prettier for line length & wrapping
  MD013: false
  # Code block style — generally this is fine, but it has false positives on
  # footnotes. See below re markdown-it-footnote issue. If we could resolve
  # that, we could turn this back on.
  MD046: false
# markdownItPlugins:
#
# Doesn't seem to help with some issues — if someone wants to help resolve then
# great, but it's no huge stress to have some false positives.
#
# https://github.com/DavidAnson/markdownlint/issues/689
#   - ["markdown-it-footnote"]


================================================
FILE: .mega-linter.yaml
================================================
GITHUB_COMMENT_REPORTER: false
DISABLE:
  - RUST
  - JAVASCRIPT
  - PYTHON
DISABLE_LINTERS:
  - SPELL_CSPELL
  - CSS_STYLELINT
  - PHP_PSALM
  - PHP_PHPSTAN # Disabled for now as we couldn't figure out how to prevent false positives. #2069
  - SQL_TSQLLINT
  - REPOSITORY_KICS
  - SPELL_LYCHEE # Throwing network errors. We already check link in other GH actions.
  - MARKDOWN_MARKDOWN_LINK_CHECK # Slow (40+ seconds). We already check links in other GH actions.
  - REPOSITORY_TRUFFLEHOG # Detecting secrets in .git/config, which is not even committed.
  - REPOSITORY_GRYPE # Slow (10+ seconds). Blocking unrelated PRs. We already have depandabot.
  - YAML_V8R # Slow (70+ seconds). We don't use YAML schema.
  - JSON_V8R # Failing for vscode-style syntax (comments).
  - REPOSITORY_GITLEAKS # False positive on codecov token, which according to codecov is fine to have hardcoded
DISABLE_ERRORS_LINTERS:
  - COPYPASTE_JSCPD
  - REPOSITORY_TRIVY
  # Long system prompt line in claude.yaml exceeds yamllint's 500 char limit
  - YAML_YAMLLINT
  - REPOSITORY_CHECKOV
  - REPOSITORY_DEVSKIM
  - BASH_SHELLCHECK
  - C_CPPLINT
  - CPP_CPPLINT
  - DOCKERFILE_HADOLINT
  - HTML_DJLINT
  - HTML_HTMLHINT
  - JAVA_CHECKSTYLE
  - JAVA_PMD
  - JSON_JSONLINT
  - MAKEFILE_CHECKMAKE
  - MARKDOWN_MARKDOWN_LINK_CHECK
  # Prevents us from starting a new library, since it raises an error on unpublished libraries. Can remove after publishing...
  - REPOSITORY_DUSTILOCK
  - SPELL_MISSPELL
  # Disabled for now, as @max-sixty didn't know whether "Unable to locate the
  # project file. A project file (tsconfig.json or tsconfig.eslint.json) is
  # required in order to use ts-standard." was worth fixing, from #3608. Happy
  # for someone more informed to turn it back on.
  - TYPESCRIPT_STANDARD
  # Disabled for now, as @max-sixty didn't know how to fix
  # `./prqlc/bindings/php/tests/CompilerTest.php (trailing_comma_in_multiline)`.
  # Fine for someone else to take a look.
  - PHP_PHPCSFIXER
PHP_PHPCS_ARGUMENTS:
  - --standard=PSR12
RAKU_RAKU_ARGUMENTS: -I ./grammars/raku/lib/


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
      - id: end-of-file-fixer
        exclude: '(.*\.snap|.*render-link.html|head.hbs)'
      - id: check-yaml
      - id: mixed-line-ending
      - id: trailing-whitespace
        # rustfmt handles rust files, and in some snapshots we expect trailing spaces.
        exclude: '.*\.(rs|snap)$'
  - repo: https://github.com/crate-ci/typos
    rev: v1
    hooks:
      - id: typos
        # https://github.com/crate-ci/typos/issues/347
        pass_filenames: false
  - repo: https://github.com/rbubley/mirrors-prettier
    rev: v3.8.1
    hooks:
      - id: prettier
        additional_dependencies:
          - prettier
          # TODO: This doesn't seem to work, would be great to fix.
          # https://github.com/PRQL/prql/issues/3078
          - prettier-plugin-go-template
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.15.6
    hooks:
      - id: ruff
        args: [--fix]
      - id: ruff-format
  - repo: https://github.com/pre-commit/mirrors-clang-format
    rev: v22.1.1
    hooks:
      - id: clang-format
        types_or: [c, c++]
  - repo: https://github.com/r0x0d/pre-commit-rust
    rev: v1.0.1
    hooks:
      - id: fmt
  - repo: https://github.com/r0x0d/pre-commit-rust
    rev: v1.0.1
    hooks:
      - id: clippy
        stages: [manual]
  - repo: https://github.com/rhysd/actionlint
    rev: v1.7.11
    hooks:
      - id: actionlint
  # Link checker using local hooks with language: rust
  # Pre-commit will automatically install lychee via cargo
  - repo: local
    hooks:
      - id: lychee
        name: lychee (local links only)
        entry: lychee
        language: rust
        additional_dependencies: ["cli:lychee:0.20.1"]
        files: \.(md|rst)$
        exclude: ^web/website/themes/
        args:
          - --no-progress
          # For PRs: whitelist PRQL domains and local files only
          # Pattern matches:
          #   - github.com/PRQL/* and github.com/prql/*
          #   - prql-lang.org/*
          #   - raw.githubusercontent.com/PRQL/* and raw.githubusercontent.com/prql/*
          #   - file://* (local/relative links)
          # All other external links are skipped for faster PR checks
          - --include=^(https://(github\.com/(PRQL|prql)|prql-lang\.org|raw\.githubusercontent\.com/(PRQL|prql))|file://)
      - id: lychee-all
        name: lychee-all (all links)
        entry: lychee
        language: rust
        additional_dependencies: ["cli:lychee:0.20.1"]
        stages: [manual]
        files: \.(md|rst)$
        exclude: ^web/website/themes/
        args: ["--config=.config/lychee.toml", "--no-progress"]
  - repo: local
    hooks:
      - id: no-dbg
        name: no-dbg
        description: We shouldn't merge code with `dbg!` in
        language: pygrep
        types: ["rust"]
        entry: "dbg!"
  - repo: local
    hooks:
      - id: prql-codeblock
        name: Prevent prql codeblocks evaluating in book
        description:
          prql code blocks are evaluated and replaced in the book; instead use
          `prql no-eval`
        language: pygrep
        entry: "```prql$"
        files: 'CHANGELOG\.md$'

  # This is quite strict, and doesn't fix a large enough share of the issues it
  # finds, so we don't include it. But it's reasonable to run every now & again
  # manually and take its fixes.
  #
  # - repo: https://github.com/DavidAnson/markdownlint-cli2
  #   rev: v0.5.1
  #   hooks:
  #     - id: markdownlint-cli2
  #       args: ["--fix"]
  #       additional_dependencies:
  #         - markdown-it-footnote

ci:
  # Currently network access isn't supported in the CI product.
  skip: [fmt, lychee, lychee-all]
  autoupdate_commit_msg: "chore: pre-commit autoupdate"


================================================
FILE: .prettierignore
================================================
# prettier respects the root `.gitignore` file, so prefer that for files which
# we also want to ignore from our version control. This should contain files we
# want to track but not format.

**/*.rs
**/*.min.*

/web/book/theme/highlight.js
/web/playground/build
/web/website/public
/web/book/book

# TODO: move these into content out of layouts
/web/website/themes/prql-theme/layouts/_default/_markup/render-link.html

# TODO: fix the go-template issue in `.prettierrc.yaml`
**/*.html


================================================
FILE: .prettierrc.yaml
================================================
proseWrap: always
# TODO: fix
# overrides:
#   # https://github.com/NiklasPor/prettier-plugin-go-template
#   - files:
#       - "*.html"
#     options:
#       parser: "go-template"


================================================
FILE: .sqlfluff
================================================
[sqlfluff]
dialect = ansi
exclude_rules = references.keywords


================================================
FILE: .typos.toml
================================================
[files]
extend-exclude = [
  "web/book/theme/highlight.js",
  "prqlc/prqlc/tests/integration/data/",
  "prqlc/prqlc/tests/integration/snapshots/",
  "web/website/themes/prql-theme/static/plugins/bootstrap",
  "web/website/themes/prql-theme/static/plugins/highlight/highlight.min.js",
]

[default.extend-words]
# <itemDatas> in grammars/KSyntaxHighlighting/prql.xml
datas = "datas"
# Java test framework
testng = "testng"
# Readme highlighting the first characters of these words
anguage = "anguage"
elational = "elational"
ipelined = "ipelined"
uery = "uery"
# `wee-alloc` is a crate name
wee = "wee"
flate = "flate"
# distinct_ons is correct (SQL DISTINCT ON)
ons = "ons"
# SQL UNIONs - typos incorrectly thinks UNIO should be UNION
# This happens because typos tokenizes UNIONs and finds UNIO
UNIO = "UNIO"


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    // Keep in sync with Taskfile.yaml
    "prql-lang.prql-vscode",
    "rust-lang.rust-analyzer",
    "mitsuhiko.insta",
    "esbenp.prettier-vscode",
    "budparr.language-hugo-vscode"
  ]
}


================================================
FILE: CHANGELOG.md
================================================
# PRQL Changelog

## [unreleased]

**Language**:

**Features**:

**Fixes**:

**Documentation**:

**Web**:

**Integrations**:

**Internal changes**:

**New Contributors**:

## 0.13.11 — 2026-03-19

0.13.11 has 75 commits from 7 contributors. Selected changes:

**Features**:

- Add support for `date.to_text` for BigQuery (@segv, #5712)

**Fixes**:

- Prevent panic on bare `*` in `select` (@max-sixty, #5696)
- Handle partial application of transforms in user-defined functions
  (@max-sixty, #5663; reported by @Rafferty97)
- Keep Computes with Aggregate when Filter follows (@max-sixty, #5639; reported
  by @matiastoro)
- Preserve sort before take in CTE (@max-sixty, #5638; reported by @lukapeschke)
- Preserve sort with empty group `{}` (@max-sixty, #5635)
- Return proper error for bare lambda expressions (@max-sixty, #5634)
- Prevent DISTINCT ON internal sorting from leaking past joins (@max-sixty,
  #5633; reported by @annashmatko)
- Fix invalid MSSQL SQL when DISTINCT and FETCH are combined (@max-sixty, #5630)

**Documentation**:

- Editorial tweaks (@richb-hanover, #5645)

**Integrations**:

- [micro](https://micro-editor.github.io/) 2.0.15 has syntax highlighting for
  PRQL. (@vanillajonathan)

**Internal changes**:

- Use chumsky 0.12.0 for all targets (#5659)
- Update rust toolchain version (#5673)
- Fix mdbook admonition syntax for mdBook 0.5 native support (#5649)

**New Contributors**:

- @segv, with #5712

## 0.13.10 — 2025-12-16

0.13.10 completes the npm OIDC publishing fix from 0.13.9.

**Features**:

- Add `read_json` support for DuckDB and ClickHouse (@adamnemecek, #5608)

**Fixes**:

- Fix `text.length` on Snowflake (@priithaamer, #5614)

**Internal changes**:

- Fix npm OIDC publishing by upgrading to Node 24 (@max-sixty, #5619)
- Fix push-web-branch workflow permissions (@max-sixty, #5620)

## 0.13.9 — 2025-12-12

0.13.9 is a re-release of 0.13.8 with fixed npm publishing.

**Internal changes**:

- Use OIDC for npm publishing (@max-sixty, #5609)

## 0.13.8 — 2025-12-12

0.13.8 has 47 commits from 6 contributors. Selected changes:

**Features**:

- Add named parameter support for DuckDB read_parquet (@max-sixty, #5563)

**Fixes**:

- Snowflake interval quoting style (@priithaamer, #5604)
- Return error instead of panicking when window rows/range is not a range
  (@max-sixty, #5603)
- Add ORDER BY fallback for Snowflake window functions (@max-sixty, #5583)
- DISTINCT ON to include wildcard when projection is empty (@max-sixty, #5562)
- Lineage traces through CTEs to source tables (@nightscape, #5581)
- Lineage works with unions (@nightscape, #5550)
- Handle lineage correctly when group pipeline simplifies to non-TransformCall
  (@max-sixty, #5584)
- Return error for join referencing inaccessible table (@max-sixty, #5587)
- Error when table variable used in scalar context (@max-sixty, #5585)
- Improve error messages for missing main pipeline (@max-sixty, #5565)
- Provide clear error for empty tuple/array in from (@max-sixty, #5564)
- Improve error message for negative numbers in transforms (@max-sixty, #5566)

**Documentation**:

- Close HTML comment in sort.md documentation (@max-sixty, #5597)

**Integrations**:

- Add grammar file for Raku (@vanillajonathan, #5576)

**Internal changes**:

- Upgrade mdbook to 0.5.0 (#5568)
- Update macOS runners to version 15 (#5596)
- Remove 2nd person from error messages (#5567)

**New Contributors**:

- @nightscape, with #5550

## 0.13.7 — 2025-11-08

0.13.7 has 8 commits from 6 contributors. Selected changes:

**Fixes**:

- Fix INTERVAL quoting in Redshift (@lukapeschke, #5545)
- Fix support for text.contains in sql.redshift target (@dimtion, #5549)
- Fix division in Redshift produces float (@priithaamer, #5546)
- Use || operator over CONCAT for std.concat in Redshift (@lukapeschke, #5540)

**Web**:

- Bump vite from 7.1.11 to 7.2.0 in playground (#5547)

## 0.13.6 — 2025-11-01

0.13.6 has 40 commits from 6 contributors. Selected changes:

**Features**:

- Add support for Redshift dialect (@priithaamer, #5537)

**Fixes**:

- Fix append regression in 0.13.5 (@priithaamer, #5495)
- Fix s-string escaping (@priithaamer, #5497)
- Filter out attestation manifests in platform verification (@max-sixty, #5509)

**Internal changes**:

- Migrate devcontainer build from QEMU to native ARM64 runners (@max-sixty,
  #5506)
- Migrate from markdown-link-check to lychee (@max-sixty, #5519)
- Use zero-copy slice for binary/hex/octal number parsing (perf improvement,
  @max-sixty, #5488)
- Update rust toolchain version (#5536)
- Do not allow incompatible rust-version dependencies (@eitsupi, #5493)
- Pin typos to v1.37.2 (@max-sixty, #5510)

## 0.13.5 — 2025-10-09

0.13.5 has 237 commits from 14 contributors. Selected changes:

**Features**:

- Support for SQL arrays as `s[...]` syntax (@Robert Valek, #5312)
- Extract SQL column names from s-string tables when possible (@lukapeschke,
  #5310)

**Fixes**:

- Sort step before an aggregate step no longer requires its columns to avoid a
  group by clause error (@julien-pinchelimouroux, #5347)
- Always add quotes on identifiers for Snowflake dialect
  (@julien-pinchelimouroux, #5461)
- Join with table containing column named "source" now works correctly (@Priit
  Haamer, #5468)
- Columns required by sorting are properly redirected (@lukapeschke, #5464)
- Ensure sorts are done on columns of the right table (@lukapeschke, #5338)
- Deduplicate selected items in gen_projection (@lukapeschke, #5305)
- Handle complex append cases (@Elouan Poupard-Cosquer, #5366)
- Improve requirement logic (@Elouan Poupard-Cosquer, #5357)
- Avoid type mismatch with Postgres in append (@Elouan Poupard-Cosquer, #5343)
- Apply column order on CTEs in append (@Elouan Poupard-Cosquer, #5323)

**Documentation**:

- Fix binary literal example (@ftsfranklin, #5475)
- Use correct table in grouping tutorial (@fnuttens, #5332)

**Integrations**:

- TEA 63.3.1, a Qt-based text editor has syntax highlighting for PRQL
  (@vanillajonathan, #5220)
- Micro text editor grammar is now upstream (@vanillajonathan, #5353)
- Add LSP stub (@vanillajonathan, #5197)

**Internal changes**:

- Upgrade parser and lexer to chumsky 0.11, providing a 7x performance
  improvement (#5223, #5476, #5477)
- Set Rust linker on win64, fix build crash (@kgutwin, #5345)
- Integration tests compile all dialects and diff (@kgutwin, #5344)

**New Contributors**:

- @Elouan Poupard-Cosquer, with #5366
- @Priit Haamer, with #5468
- @Robert Valek, with #5312
- @fnuttens, with #5332
- @ftsfranklin, with #5475
- @julien-pinchelimouroux, with #5347

## 0.13.4 — 2025-03-26

0.13.4 is a small bugfix release.

It has 57 commits from 10 contributors. Selected changes (in particular, a few
bugfixes aren't listed here):

**Integrations**:

- Add syntax highlight file for KSyntaxHighlighting. (@vanillajonathan, #5177)
- Add syntax highlight file for Vim. (@vanillajonathan, #5185)
- Add syntax highlight file for GNU Emacs. (@vanillajonathan, #5189)
- [Kakoune](https://kakoune.org/), a terminal-based text editor has syntax
  highlighting for PRQL. (@vanillajonathan)
- [Neovim](https://neovim.io/) 0.11 has syntax highlighting for PRQL.
  (@vanillajonathan)

## 0.13.3 — 2025-01-25

0.13.3 is a small release containing a few bug fixes and improvements. It has 86
commits from 10 contributors. Selected changes:

**Fixes**:

- Sort steps in sub-pipelines no longer cause a column lookup error
  (@lukapeschke, #5066)
- Dereferencing of sort columns when rendering SQL now done in context of main
  pipeline (@kgutwin, #5098)

**New Contributors**:

- @lukapeschke, with #5066

## 0.13.2

0.13.2 is a tiny release to fix an issue publishing 0.13.1 to crates.io.

## 0.13.1

0.13.1 is a small release containing a few bug fixes and improvements. Velocity
has slowed down a bit in recent months, we're still hoping to finish the new
resolver and the new formatter in the near future.

It has 97 commits from 10 contributors. Selected changes:

**Features**:

- Add a option to the experimental documentation generator to output the docs in
  HTML format. The option is given using the `--format=html` option.
  (@vanillajonathan, 4791)

- The version of the library is now read from `git describe`. This doesn't
  affect libraries built on git tags (such as our releases), only those built
  when developing. When reporting bugs, this helps identify the exact version.
  (@max-sixty & @m-span, #4804)

**Fixes**:

- Raw strings (`r"..."`) are retained through `prqlc fmt` (@max-sixty, #4848)

- Strings containing an odd contiguous number of quotes are now delimited by an
  odd number of quotes when being formatted. The previous implementation would
  use an even number, which is invalid PRQL. (@max-sixty, #4850)

- A few more keywords are quoted, such as `user`, which is a reserved keyword in
  PostgreSQL. (@max-sixty)

## 0.13.0 — 2024-07-25

0.13.0 brings a new debug logging framework, a big refactor of the parser, a new
highlighter, an `**` operator for exponentiation, a few bug fixes, and lots of
other changes. It has 153 commits from 11 contributors.

Our work continues on rewriting the resolver and completing `prqlc fmt`.

Selected changes:

**Language**:

- Parentheses are always required around pipelines, even within tuples. For
  example:

  ```prql no-eval
  from artists
  # These parentheses are now required
  derive {a=(b | math.abs)}
  # No change — doesn't affect expressions or function calls without pipelines
  derive {x = 3 + 4}
  ```

  This is a small breaking change. The new behavior matches the existing
  documentation. (@max-sixty, #4775)

- A new `**` operator for exponentiation. (@aljazerzen & @max-sixty, #4125)

**Features**:

- `prqlc compile --debug-log=log.html` will generate an HTML file with a
  detailed log of the compilation process. (@aljazerzen, #4646)
- Added `prqlc debug json-schema` command to auto-generate JSON Schema
  representations of commonly exposed IR types such as PL and RQ. (@kgutwin,
  #4698)
- Add documentation comments to the output of the documentation generator.
  (@vanillajonathan, #4729)
- Add CLI syntax highlighting to `prqlc`. You can try it as
  `prqlc experimental highlight example.prql`. (@vanillajonathan, #4755)

**Fixes**:

- Using `in` with an empty array pattern (e.g. `expr | in []`) will now output a
  constant `false` condition instead of an `expr IN ()`, which is syntactically
  invalid in some SQL dialects (@Globidev, #4598)

**Integrations**:

- The Snap package previously released on the edge channel is now released on
  the stable channel. (@vanillajonathan, #4784)

**Internal changes**:

- Major reorganization of `prqlc-parser` — `prqlc-ast` is merged into
  `prqlc-parser`, and `prqlc-parser`'s files are rearranged, including its
  exports. This is part of an effort to modularize the compiler by stage,
  reducing the amount of context that's required to understand a single stage.
  There will likely be some further changes (more detail in the PR description).
  (@m-span, #4634)
  - This is a breaking change for any libraries that depend on `prqlc-parser`
    (which should be fairly rare).

- Renamed `prql-compiler-macros` to `prqlc-macros` for consistency with other
  crates (@max-sixty, #4565)

- `prql-compiler`, the old name for `prqlc`, is removed as a facade to `prqlc`.
  It had been deprecated for a few versions and will no longer be updated.
  (@max-sixty)

- New benchmarks (@max-sixty, #4654)

**New Contributors**:

- @Globidev, with #4598

## 0.12.2 — 2024-06-10

0.12.2 is a very small release which renames `prql-js` to `prqlc-js` to match
our standard naming scheme. Within node the package is imported as `prqlc`.

It also fixes a mistake in the `prqlc-python` release pipeline.

## 0.12.1 — 2024-06-09

0.12.1 is a tiny hotfix release which fixes how intra-prql crate dependencies
were specified.

## 0.12.0 — 2024-06-08

0.12.0 contains a few months of smaller features. Our focus has been on
rewriting the resolver, an effort that is still ongoing.

It has 239 commits from 12 contributors. Selected changes (most are not listed
here, possibly we should be more conscientious about adding them...):

**Features**:

- Add `prqlc lex` command to the CLI (@max-sixty)
- Add `prqlc debug lineage` command to the CLI, creating an expression lineage
  graph from a query (@kgutwin, #4533)
- Initial implementation of an experimental documentation generator that
  generates Markdown documentation from `.prql` files. (@vanillajonathan,
  #4152).
- Join's `side` parameter can take a reference that resolves to a literal (note:
  this is an experimental feature which may change in the future) (@kgutwin,
  #4499)

**Fixes**:

- Support expressions on left hand side of `std.in` operator. (@kgutwin, #4498)
- Prevent panic for `from {}` and `std` (@m-span, #4538)

**Web**:

- The `browser` dist files are now built with `wasm-pack`'s `web` target. As a
  result, they should be usable as ES Modules, through JS CDNs, and for example
  with Observable Framework (@srenatus, #4274).

**Integrations**:

- The syntax highlighter package for Sublime Text is now
  [published](https://packagecontrol.io/packages/PRQL) (@vanillajonathan).
- The
  [VSCode Great Icons](https://marketplace.visualstudio.com/items?itemName=emmanuelbeziat.vscode-great-icons)
  icon pack extension shows a database icon for `.prql` files. (@EmmanuelBeziat)
- [Tokei](https://github.com/XAMPPRocky/tokei), a source lines of code counter
  now has support for `.prql` files. (@vanillajonathan)
- Add syntax highlight file for the [micro](https://micro-editor.github.io/)
  text editor. (@vanillajonathan)

**New Contributors**:

- @srenatus, with #4274
- @jacquayj, with #4332
- @pdelewski, with #4337
- @m-span, with #4422
- @kgutwin, with #4498

## 0.11.4 — 2024-02-25

0.11.4 is a hotfix release, fixing a CI issue that caused the CLI binaries to be
built without the `cli` feature.

## 0.11.3 — 2024-02-10

0.11.3 is a very small release, mostly a rename of the Python bindings.

The release has 13 commits from 4 contributors.

**Internal changes**:

- As part of making our names more consistent, the Python bindings are renamed.
  `prql-python` becomes a package published and importable as `prqlc`. The
  internal Rust crate is named `prqlc-python`.

## 0.11.2 — 2024-02-07

0.11.2 contains lots of internal changes, lots of syntax highlighting, and the
beginning of `lutra`, a query runner.

This release has 122 commits from 9 contributors. Selected changes:

**Features**:

- Initial implementation of `lutra`, a query runner. (@aljazerzen, #4182, #4174,
  #4134)
- `prqlc fmt` works on projects with multiple files. (@max-sixty, #4028)

**Fixes**:

- Reduce stack memory usage (@aljazerzen, #4103)

**Integrations**:

- Add syntax highlight file for GtkSourceView. (@vanillajonathan, #4062)
- Add syntax highlight file for CotEditor. (@vanillajonathan)
- Add syntax highlight file for Sublime Text. (@vanillajonathan, #4127)
- [sloc](https://github.com/flosse/sloc), a source lines of code counter now has
  support for `.prql` files. (@vanillajonathan)

**Internal changes**:

- `prql-compiler` has been renamed to `prqlc`, and we've established a more
  consistent naming scheme. The existing crate will still be published,
  re-exporting `prqlc`, so no dependencies will break. A future version will add
  a deprecation warning.
- The `prqlc-clib` crate was renamed to `prqlc-c`, and associated artifacts were
  renamed. We're trying to make names consistent (ideally for the final time!),
  and have a plan to rename some other bindings. (@max-sixty, #4077)
- Add lots of whitespace items to the lexer, in preparation for the completion
  of `prqlc fmt` (@max-sixty, #4109, #4105)
- Table declarations (@aljazerzen, #4126)

**New Contributors**:

- @kaspermarstal, with #4124

## 0.11.1 — 2023-12-26

0.11.1 fixes a couple of small bugs; it comes a few days after 0.11.

This release has 16 commits from 6 contributors. Selected changes:

**Features**:

- Infer the type of array literals to be the union of types of its items.
  (@aljazerzen, #3989)
- `prql` module is added and the `prql_version` function is renamed to the
  `prql.version` function. The old `prql_version` function is deprecated and
  will be removed in the future release. (@eitsupi, #4006)

**Fixes**:

- Do not compile to `DISTINCT ON` when `take n` is used with `group` for the
  targets `clickhouse`, `duckdb` and `postgres`. (@PrettyWood, #3988)
- Fix `take` n rows for `mssql` dialect by switching from TOP to FETCH
  (@PrettyWood, #3994)

## 0.11.0 — 2023-12-19

0.11.0 introduces new `date`, `text` & `math` modules with lots of standard
functions, including a new `date.to_text` function. It contains a few bugs
fixes, and lots of internal improvements to the compiler.

This release has 119 commits from 9 contributors. Selected changes:

**Language**:

- _Breaking_: `group`'s `by` columns are now excluded from the partition.
  (#3490)
- _Breaking_: `round` is now in the `math` module and needs to be called via
  `math.round`. (#3928)
- _Breaking_: `lower` and `upper` are now in the `text` module and need to be
  called via `text.lower` and `text.upper`. (#3913, #3973)

**Features**:

- The `std.in` function now supports a list of values (@PrettyWood, #3883)
- Most standard mathematical functions are now supported: `abs`, `floor`,
  `ceil`, `pi`, `exp`, `ln`, `log10`, `log`, `sqrt`, `degrees`, `radians`,
  `cos`, `acos`, `sin`, `asin`, `tan`, `atan`, `pow` and `round`.\
  Those functions are in the `math` module (@PrettyWood, #3909, #3916 & 3928)
- Most standard string functions are now supported: `ltrim`, `rtrim`, `trim`,
  `length`, `extract`, `replace`. Utility functions `starts_with`, `contains`
  and `ends_with` are also available.\
  Those functions are in the `text` module (@PrettyWood, #3913, #3973)
- Formatting a date to a text is now available for Clickhouse, DuckDB, MySQL,
  MSSQL and Postgres. A new `date` module has been added with the `to_text`
  function (@PrettyWood, #3951, #3954 & #3955)

**Fixes**:

- Fix an issue with arithmetic precedence (@max-sixty, #3846)
- `+` and `-` can be used after a cast (@PrettyWood, #3923)
- The [Lezer](https://lezer.codemirror.net/) grammar had plenty of improvements
  and fixes. (@vanillajonathan)

**Web**:

- The Playground now uses [Vite](https://vitejs.dev/). (@vanillajonathan)

**Internal changes**:

- Bump `prql-compiler`'s MSRV to 1.70.0 (@eitsupi, #3876)

**New Contributors**:

- @PrettyWood, with #3883

## 0.10.1 — 2023-11-14

0.10.1 is a small release containing some internal fixes of the compiler.

This release has 36 commits from 7 contributors. Selected changes:

**Features**:

- The `std.sql.read_csv` function and the `std.sql.read_parquet` function
  supports the `sql.glaredb` target. (@eitsupi, #3749)

**Fixes**:

- Fix the bug of compiling to `DISTINCT ON` when `take 1` is used with
  `group by` for the targets `sql.clickhouse`, `sql.duckdb` and `sql.postgres`.
  (@aljazerzen, #3792)

**Integrations**:

- Enable integration tests for GlareDB. (@eitsupi, #3749)
- [trapd00r/LS_COLORS](https://github.com/trapd00r/LS_COLORS), a collection of
  LS_COLORS definitions colorizes `.prql` files. (@vanillajonathan)
- [vivid](https://github.com/sharkdp/vivid), a themeable LS_COLORS generator
  colorizes `.prql` files. (@vanillajonathan)
- [colorls](https://github.com/athityakumar/colorls), displays `.prql` files
  with a database icon. (@vanillajonathan)
- [Emoji File Icons](https://marketplace.visualstudio.com/items?itemName=mightbesimon.emoji-icons),
  a VS Code extension displays `.prql` files with a database emoji icon.
  (@vanillajonathan)
- [eza](https://eza.rocks/), a modern ls replacement colorizes `.prql` files.
  (@vanillajonathan)
- [lsd](https://github.com/lsd-rs/lsd), next gen ls command displays `.prql`
  files with a database icon. (@vanillajonathan)

## 0.10.0 — 2023-10-26

0.10.0 contains lots of small improvements, including support for new types of
literal notation, support for `read_*` functions in more dialects, playground
improvements, and a better Lezer grammar (which we're planning on using for a
Jupyter extension).

This release has 155 commits from 9 contributors. Selected changes:

**Language**:

- _Breaking:_ Case syntax now uses brackets `[]` rather than braces `{}`. To
  convert previous PRQL queries to this new syntax simply change `case { ... }`
  to `case [ ... ]`. (@AaronMoat, #3517)

**Features**:

- _Breaking_: The `std.sql.read_csv` function is now compiled to `read_csv` by
  default. Please set the target `sql.duckdb` to use the DuckDB's
  `read_csv_auto` function as previously. (@eitsupi, #3599)
- _Breaking_: The `std.every` function is renamed to `std.all` (@aljazerzen,
  #3703)
- The `std.sql.read_csv` function and the `std.sql.read_parquet` function
  supports the `sql.clickhouse` target. (@eitsupi, #1533)
- Add `std.prql_version` function to return PRQL version (@hulxv, #3533)
- A new type `anytype` is added. (@aljazerzen, #3703)
- Add support for hex escape sequences in strings. Example `"Hello \x51"`.
  (@vanillajonathan, #3568)
- Add support for long Unicode escape sequences. Example `"Hello \u{01F422}"`.
  (@vanillajonathan, #3569)
- Add support for binary numerical notation. Example
  `filter status == 0b1111000011110000`. (@vanillajonathan, #3661)
- Add support for hexadecimal numerical notation. Example
  `filter status == 0xff`. (@vanillajonathan, #3654)
- Add support for octal numerical notation. Example `filter status == 0o777`.
  (@vanillajonathan, #3672)
- New compile target `sql.glaredb` for [GlareDB](https://docs.glaredb.com/) and
  integration tests for it (However, there is a bug in the test and it is
  currently not running). (@universalmind303, @scsmithr, @eitsupi, #3669)

**Web**:

- Allow cmd-/ (Mac) or ctrl-/ (Windows) to toggle comments in the playground
  editor (@AaronMoat, #3522)

- Limit maximum height of the playground editor's error panel to avoid taking
  over whole screen (@AaronMoat, #3524)

- The playground now uses [Vite](https://vitejs.dev/) (@vanillajonathan).

**Integrations**:

- Add a CLI command `prqlc collect` to collect a project's modules into a single
  file (@aljazerzen, #3739)
- Add a CLI command `prqlc debug expand-pl` to parse & and expand into PL
  without resolving (@aljazerzen, #3739)
- Bump `prqlc`'s MSRV to 1.70.0 (@eitsupi, #3521)
- [Pygments](https://pygments.org/), a syntax highlighting library now has
  syntax highlighting for PRQL. (@vanillajonathan, #3564)
- [chroma](https://github.com/alecthomas/chroma), a syntax highlighting library
  written in Go and used by the static website generator
  [Hugo](https://gohugo.io/). (@vanillajonathan, #3597)
- [scc](https://github.com/boyter/scc), a source lines of code counter now has
  support for `.prql` files. (@vanillajonathan)
- [gcloc](https://github.com/JoaoDanielRufino/gcloc) a source lines of code
  counter now has support for `.prql` files. (@vanillajonathan)
- [cloc](https://github.com/AlDanial/cloc) a source lines of code counter now
  has support for `.prql` files. (@AlDanial)
- [gocloc](https://github.com/hhatto/gocloc) a source lines of code counter now
  has support for `.prql` files. (@vanillajonathan)
- [The Quarto VS Code extension](https://marketplace.visualstudio.com/items?itemName=quarto.quarto)
  supports editing PRQL code blocks
  ([`prqlr`](https://prql-lang.org/book/project/bindings/r.html) is required to
  render Quarto Markdown with PRQL code blocks). (@jjallaire)

**Internal**:

- Rename some of the internal crates, and refactored their paths in the repo.
  (@aljazerzen, #3683).
- Add a `justfile` for developers who prefer that above our `Taskfile.yaml`
  (@aljazerzen, #3681)

**New Contributors**:

- @hulxv, with #3533
- @AaronMoat, with #3522
- @jangorecki, with #3634

## 0.9.5 — 2023-09-16

0.9.5 adds a line-wrapping character, fixes a few bugs, and improves our CI. The
release has 77 commits from 8 contributors. Selected changes are below.

Look out for some conference talks coming up over the next few weeks, including
[QCon SF on Oct 2](https://qconsf.com/presentation/oct2023/prql-simple-powerful-pipelined-sql-replacement)
and
[date2day on Oct 12](https://www.data2day.de/veranstaltung-21353-0-prql-a-modern-language-for-data-transformation.html).

**Language**:

- A new line-wrapping character, for lines that are long and we want to break up
  into multiple physical lines. This is slightly different from from many
  languages — it's on the subsequent line:

  ```prql no-eval
  from artists
  select is_europe =
  \ country == "DE"
  \ || country == "FR"
  \ || country == "ES"
  ```

  This allows for easily commenting out physical lines while maintaining a
  correct logical line; for example:

  ```diff
  from artists
  select is_europe =
  \ country == "DE"
  \ || country == "FR"
  \ || country == "FR"
  -\ || country == "ES"
  +#\ || country == "ES"
  ```

  (@max-sixty, #3408)

**Fixes**:

- Fix stack overflow on very long queries in Windows debug builds (@max-sixty,
  #2908)

- Fix panic when unresolved lineage appears in group or window (@davidot, #3266)

- Fix a corner-case in handling precedence, and remove unneeded parentheses in
  some outputs (@max-sixty, #3472)

**Web**:

- Compiler panics are now printed to the console (@max-sixty, #3446)

**Integrations**:

- [Ace](https://ace.c9.io/), the JavaScript code editor now has syntax
  highlighting for PRQL. (@vanillajonathan, #3493)

**Internal changes**:

- Simplify & speed up lexer (@max-sixty, #3426, #3418)

**New Contributors**:

- @davidot, with #3450

## 0.9.4 — 2023-08-24

0.9.4 is a small release with some improvements and bug fixes in the compiler
and `prqlc`. And, the documentation and CI are continually being improved.

This release has 110 commits from 9 contributors. Selected changes:

**Features**:

- Strings can be delimited with any odd number of quote characters. The logic
  for lexing quotes is now simpler and slightly faster. Escapes in
  single-quote-delimited strings escape single-quotes rather than double-quotes.
  (@max-sixty, #3274)

**Fixes**:

- S-strings within double braces now parse correctly (@max-sixty, #3265)

**Documentation**:

- New docs for strings (@max-sixty, #3281)

**Web**:

- Improve syntax highlighting for numbers in the book & website (@max-sixty,
  #3261)
- Add ClickHouse integration to docs (@max-sixty, #3251)

**Integrations**:

- `prqlc` no longer displays a prompt when piping a query into its stdin
  (@max-sixty, #3248).
- Add a minimal example for use `prql-lib` with Zig (@vanillajonathan, #3372)

**Internal changes**:

- Overhaul our CI to run a cohesive set of tests depending on the specific
  changes in the PR, and elide all others. This cuts CI latency to less than
  three minutes for most changes, and enables GitHub's auto-merge to wait for
  all relevant tests. It also reduces the CI time on merging to main, by moving
  some tests to only run on specific path changes or on our nightly run.

  We now have one label we can add to PRs to run more tests — `pr-nightly`.
  (@max-sixty, #3317 & others).

- Auto-merge PRs for backports or pre-commit updates (@max-sixty, #3246)
- Add a workflow to create an issue when the scheduled nightly workflow fails
  (@max-sixty, #3304)

**New Contributors**:

- @FinnRG, with #3292
- @sitiom, with #3353

## 0.9.3 — 2023-08-02

0.9.3 is a small release, with mostly documentation, internal, and CI changes.

This release has 85 commits from 10 contributors.

We'd like to welcome @not-my-profile as someone who has helped with lots of
internal refactoring in the past couple of weeks.

**New Contributors**:

- @vthriller, with #3171
- @postmeback, with #3216

## 0.9.2 — 2023-07-25

0.9.2 is a hotfix release to fix an issue in the 0.9.0 & 0.9.1 release
pipelines.

## 0.9.1 — 2023-07-25

0.9.1 is a hotfix release to fix an issue in the 0.9.0 release pipeline.

## 0.9.0 — 2023-07-24

0.9.0 is probably PRQL's biggest ever release. We have dialect-specific
standard-libraries, a regex operator, an initial implementation of multiple-file
projects & modules, lots of bug fixes, and many many internal changes.

We've made a few backward incompatible syntax changes. Most queries will work
with a simple find/replace; see below for details.

The release has 421 commits from 12 contributors.

A small selection of the changes:

**Language**:

- The major breaking change is a new syntax for lists, which have been renamed
  to _tuples_, and are now represented with braces `{}` rather than brackets
  `[]`.

  To convert previous PRQL queries to this new syntax simply change `[ ... ]` to
  `{ ... }`.

  We made the syntax change to incorporate arrays. Almost every major language
  uses `[]` for arrays. We are adopting that convention — arrays use `[]`,
  tuples will use `{}`. (Though we recognize that `{}` for tuples is also rare
  (Hi, Erlang!), but didn't want to further load parentheses with meaning.)

  Arrays are conceptually similar to columns — their elements have a single
  type. Array syntax can't contain assignments.

  As part of this, we've also formalized tuples as containing both individual
  items (`select {foo, baz}`), and assignments (`select {foo=bar, baz=fuz}`).

- Some significant changes regarding SQL dialects:
  - Operators and functions can be defined on per-dialect basis. (@aljazerzen,
    #2681)
  - _Breaking_: The `sql.duckdb` target supports DuckDB 0.8 (@eitsupi, #2810).
  - _Breaking_: The `sql.hive` target is removed (@eitsupi, #2837).

- New arithmetic operators. These compile to different function or operator
  depending on the target.
  - _Breaking_: Operator `/` now always performs floating division (@aljazerzen,
    #2684). See the
    [Division docs](https://prql-lang.org/book/reference/syntax/operators.html#division-and-integer-division)
    for details.

  - Truncated integer division operator `//` (@aljazerzen, #2684). See the
    [Division docs](https://prql-lang.org/book/reference/syntax/operators.html#division-and-integer-division)
    for details.

  - Regex search operator `~=` (@max-sixty, #2458). An example:

    ```prql no-eval
    from tracks
    filter (name ~= "Love")
    ```

    ...compiles to;

    ```sql
    SELECT
      *
    FROM
      tracks
    WHERE
      REGEXP(name, 'Love')
    ```

    ...though the exact form differs by dialect; see the
    [Regex docs](https://prql-lang.org/book/reference/syntax/operators.html#regex)
    for more details.

- New aggregation functions: `every`, `any`, `average`, and `concat_array`.
  _Breaking:_ Remove `avg` in favor of `average`.

- _Breaking:_ We've changed our function declaration syntax to match other
  declarations. Functions were one of the first language constructs in PRQL, and
  since then we've added normal declarations there's no compelling reason for
  functions to be different.

  ```prql no-eval
  let add = a b -> a + b
  ```

  Previously, this was:

  ```prql no-eval
  func add a b -> a + b
  ```

- Experimental modules, which allow importing declarations from other files.
  Docs are forthcoming.

- Relation literals create a relation (a "table") as an _array_ of _tuples_.
  This example demonstrates the new syntax for arrays `[]` and tuples `{}`.
  (@aljazerzen, #2605)

  ```prql no-eval
  from [{a=5, b=false}, {a=6, b=true}]
  filter b == true
  select a
  ```

- `this` can be used to refer to the current pipeline, for situations where
  plain column name would be ambiguous:

  ```prql no-eval
  from x
  derive sum = my_column
  select this.sum   # does not conflict with `std.sum`
  ```

  Within a `join` transform, there is also a reference to the right relation:
  `that`.

- _Breaking:_ functions `count`, `rank` and `row_number` now require an argument
  of the array to operate on. In most cases you can directly replace `count`
  with `count this`. The `non_null` argument of `count` has been removed.

**Features**:

- We've changed how we handle colors.

  `Options::color` is deprecated and has no effect. Code which consumes
  `prql_compiler::compile` should instead accept the output with colors and use
  a library such as `anstream` to handle the presentation of colors. To ensure
  minimal disruption, `prql_compiler` will currently strip color codes when a
  standard environment variable such as `CLI_COLOR=0` is set or when it detects
  `stderr` is not a TTY.

  We now use the [`anstream`](https://github.com/rust-cli/anstyle) library in
  `prqlc` & `prql-compiler`.

  (@max-sixty, #2773)

- `prqlc` can now show backtraces when the standard backtrace env var
  (`RUST_BACKTRACE`) is active. (@max-sixty, #2751)

**Fixes**:

- Numbers expressed with scientific notation — `1e9` — are now handled correctly
  by the compiler (@max-sixty, #2865).

**Integrations**:

- prql-python now provides type hints (@philpep, #2912)

**Internal changes**:

- Annotations in PRQL. These have limited support but are currently used to
  specify binding strengths. They're modeled after Rust's annotations, but with
  `@` syntax, more similar to traditional decorators. (#2729)

  ```prql no-eval
  @{binding_strength=11}
  let mod = l r -> s"{l} % {r}"
  ```

- Remove BigQuery's special handling of quoted identifiers, now that our module
  system handles its semantics (@max-sixty, #2609).

- ClickHouse is tested in CI (@eitsupi, #2815).

**New Contributors**:

- @maxmcd, with #2533
- @khoa165, with #2876
- @philpep, with #2912
- @not-my-profile, with #2971

## 0.8.1 — 2023-04-29

0.8.1 is a small release with a new `list-targets` command in `prqlc`, some
documentation improvements, and some internal improvements.

This release has 41 commits from 8 contributors.

From the broader perspective of the project, we're increasing the relative
prioritization of it being easy for folks to actually use PRQL — either with
existing tools, or a tool we'd build. We'll be thinking about & discussing the
best way to do that over the next few weeks.

## 0.8.0 — 2023-04-14

0.8.0 renames the `and` & `or` operators to `&&` & `||` respectively,
reorganizes the Syntax section in the book, and introduces `read_parquet` &
`read_csv` functions for reading files with DuckDB.

This release has 38 commits from 8 contributors. Selected changes:

**Features**:

- Rename `and` to `&&` and `or` to `||`. Operators which are symbols are now
  consistently infix, while "words" are now consistently functions (@aljazerzen,
  #2422).

- New functions `read_parquet` and `read_csv`, which mirror the DuckDB
  functions, instructing the database to read from files (@max-sixty, #2409).

## 0.7.1 — 2023-04-03

0.7.1 is a hotfix release to fix `prql-js`'s `npm install` behavior when being
installed as a dependency.

This release has 17 commits from 4 contributors.

## 0.7.0 — 2023-04-01

0.7.0 is a fairly small release in terms of new features, with lots of internal
improvements, such as integration tests with a whole range of DBs, a blog post
on Pi day, RFCs for a type system, and more robust language bindings.

There's a very small breaking change to the Rust API, hence the minor version
bump.

Here's our April 2023 Update, from our
[Readme](https://github.com/PRQL/prql/blob/main/README.md):

> ### April 2023 update
>
> PRQL is being actively developed by a growing community. It's ready to use by
> the intrepid, either as part of one of our supported extensions, or within
> your own tools, using one of our supported language bindings.
>
> PRQL still has some minor bugs and some missing features, and probably is only
> ready to be rolled out to non-technical teams for fairly simple queries.
>
> Here's our current [Roadmap](https://prql-lang.org/roadmap/) and our
> [Milestones.](https://github.com/PRQL/prql/milestones)
>
> Our immediate focus for the code is on:
>
> - Building out the next few big features, including
>   [types](https://github.com/PRQL/prql/pull/1964) and
>   [modules](https://github.com/PRQL/prql/pull/2129).
> - Ensuring our supported features feel extremely robust; resolving any
>   [priority bugs](https://github.com/PRQL/prql/issues?q=is%3Aissue+is%3Aopen+label%3Abug+label%3Apriority).
>
> We're also spending time thinking about:
>
> - Making it really easy to start using PRQL. We're doing that by building
>   integrations with tools that folks already use; for example our VS Code
>   extension & Jupyter integration. If there are tools you're familiar with
>   that you think would be open to integrating with PRQL, please let us know in
>   an issue.
> - Making it easier to contribute to the compiler. We have a wide group of
>   contributors to the project, but contributions to the compiler itself are
>   quite concentrated. We're keen to expand this;
>   [#1840](https://github.com/PRQL/prql/issues/1840) for feedback.

---

The release has 131 commits from 10 contributors. Particular credit goes to to
@eitsupi & @jelenkee, who have made significant contributions, and
@vanillajonathan, whose prolific contribution include our growing language
bindings.

A small selection of the changes:

**Features**:

- `prqlc compile` adds `--color` & `--include-signature-comment` options.
  (@max-sixty, #2267)

**Web**:

- Added the PRQL snippets from the book to the
  [Playground](https://prql-lang.org/playground/) (@jelenkee, #2197)

**Internal changes**:

- _Breaking_: The `compile` function's `Options` now includes a `color` member,
  which determines whether error messages use ANSI color codes. This is
  technically a breaking change to the API. (@max-sixty, #2251)
- The `Error` struct now exposes the `MessageKind` enum. (@vanillajonathan,
  #2307)
- Integration tests run in CI with DuckDB, SQLite, PostgreSQL, MySQL and SQL
  Server (@jelenkee, #2286)

**New Contributors**:

- @k-nut, with #2294

## 0.6.1 — 2023-03-12

0.6.1 is a small release containing an internal refactoring and improved
bindings for C, PHP & .NET.

This release has 54 commits from 6 contributors. Selected changes:

**Fixes**:

- No longer incorrectly compile to `DISTINCT` when a `take 1` refers to a
  different set of columns than are in the `group`. (@max-sixty, with thanks to
  @cottrell, #2109)
- The version specification of the dependency Chumsky was bumped from `0.9.0` to
  `0.9.2`. `0.9.0` has a bug that causes an infinite loop. (@eitsupi, #2110)

**Documentation**:

- Add a policy for which bindings are supported / unsupported / nascent. See
  <https://prql-lang.org/book/project/bindings/index.html> for more details
  (@max-sixty, #2062) (@max-sixty, #2062)

**Integrations**:

- [prql-lib] Added C++ header file. (@vanillajonathan, #2126)

**Internal changes**:

- Many of the items that were in the root of the repo have been aggregated into
  `web` & `bindings`, simplifying the repo's structure. There's also `grammars`
  & `packages` (@max-sixty, #2135, #2117, #2121).

## 0.6.0 — 2023-03-08

0.6.0 introduces a rewritten parser, giving us the ability to dramatically
improve error messages, renames `switch` to `case` and includes lots of minor
improvements and fixes. It also introduces `loop`, which compiles to
`WITH RECURSIVE`, as a highly experimental feature.

There are a few cases of breaking changes, including switching `switch` to
`case`, in case that's confusing. There are also some minor parsing changes
outlined below.

This release has 108 commits from 11 contributors. Selected changes:

**Features**:

- Add a (highly experimental) `loop` language feature, which translates to
  `WITH RECURSIVE`. We expect changes and refinements in upcoming releases.
  (#1642, @aljazerzen)
- Rename the experimental `switch` function to `case` given it more closely
  matches the traditional semantics of `case`. (@max-sixty, #2036)
- Change the `case` syntax to use `=>` instead of `->` to distinguish it from
  function syntax.
- Convert parser from pest to Chumsky (@aljazerzen, #1818)
  - Improved error messages, and the potential to make even better in the
    future. Many of these improvements come from error recovery.
  - String escapes (`\n \t`).
  - Raw strings that don't escape backslashes.
  - String interpolations can only contain identifiers and not any expression.
  - Operator associativity has been changed from right-to-left to left-to-right
    to be more similar to other conventional languages.
  - `and` now has a higher precedence than `or` (of same reason as the previous
    point).
  - Dates, times and timestamps have stricter parsing rules.
  - `let`, `func`, `prql`, `case` are now treated as keywords.
  - Float literals without fraction part are not allowed anymore (`1.`).
- Add a `--format` option to `prqlc parse` which can return the AST in YAML
  (@max-sixty, #1962)
- Add a new subcommand `prqlc jinja`. (@aljazerzen, #1722)
- _Breaking_: prql-compiler no longer passes text containing `{{` & `}}` through
  to the output. (@aljazerzen, #1722)

  For example, the following PRQL query

  ```prql no-eval
  from {{foo}}
  ```

  was compiled to the following SQL previously, but now it raises an error.

  ```sql
  SELECT
    *
  FROM
    {{ foo }}
  ```

  This pass-through feature existed for integration with dbt.

  We're again considering how to best integrate with dbt, and this change is
  based on the idea that the jinja macro should run before the PRQL compiler.

  If you're interested in dbt integration, subscribe or 👍 to
  <https://github.com/dbt-labs/dbt-core/pull/5982>.

- A new compile target `"sql.any"`. When `"sql.any"` is used as the target of
  the compile function's option, the target contained in the query header will
  be used. (@aljazerzen, #1995)
- Support for SQL parameters with similar syntax (#1957, @aljazerzen)
- Allow `:` to be elided in timezones, such as `0800` in
  `@2020-01-01T13:19:55-0800` (@max-sixty, #1991).
- Add `std.upper` and `std.lower` functions for changing string casing
  (@Jelenkee, #2019).

**Fixes**:

- `prqlc compile` returns a non-zero exit code for invalid queries. (@max-sixty,
  #1924)
- Identifiers can contain any alphabetic unicode characters (@max-sixty, #2003)

**Documentation**:

- Operator precedence (@aljazerzen, #1818)
- Error messages for invalid queries are displayed in the book (@max-sixty,
  #2015)

**Integrations**:

- [prql-php] Added PHP bindings. (@vanillajonathan, #1860)
- [prql-dotnet] Added .NET bindings. (@vanillajonathan, #1917)
- [prql-lib] Added C header file. (@vanillajonathan, #1879)
- Added a workflow building a `.deb` on each release. (Note that it's not yet
  published on each release). (@vanillajonathan, #1883)
- Added a workflow building a `.rpm` on each release. (Note that it's not yet
  published on each release). (@vanillajonathan, #1918)
- Added a workflow building a Snap package on each release. (@vanillajonathan,
  #1881)

**Internal changes**:

- Test that the output of our nascent autoformatter can be successfully compiled
  into SQL. Failing examples are now clearly labeled. (@max-sixty, #2016)
- Definition files have been added to configure
  [Dev Containers](https://containers.dev/) for Rust development environment.
  (@eitsupi, #1893, #2025, #2028)

**New Contributors**:

- @linux-china, with #1971
- @Jelenkee, with #2019

## 0.5.2 — 2023-02-18

0.5.2 is a tiny release to fix an build issue in yesterday's `prql-js` 0.5.1
release.

This release has 7 commits from 2 contributors.

**New Contributors**:

- @matthias-Q, with #1873

## 0.5.1 — 2023-02-17

0.5.1 contains a few fixes, and another change to how bindings handle default
target / dialects.

This release has 53 commits from 7 contributors. Selected changes:

**Fixes**:

- Delegate dividing literal integers to the DB. Previously integer division was
  executed during PRQL compilation, which could be confusing given that behavior
  is different across DBs. Other arithmetic operations are still executed during
  compilation. (@max-sixty, #1747)

**Documentation**:

- Add docs on the `from_text` transform (@max-sixty, #1756)

**Integrations**:

- [prql-js] Default compile target changed from `Sql(Generic)` to `Sql(None)`.
  (@eitsupi, #1856)
- [prql-python] Compilation options can now be specified from Python. (@eitsupi,
  #1807)
- [prql-python] Default compile target changed from `Sql(Generic)` to
  `Sql(None)`. (@eitsupi, #1861)

**New Contributors**:

- @vanillajonathan, with #1766

## 0.5.0 — 2023-02-08

0.5.0 contains a few fixes, some improvements to bindings, lots of docs
improvements, and some work on forthcoming features. It contains one breaking
change in the compiler's `Options` interface.

This release has 74 commits from 12 contributors. Selected changes:

**Features**:

- Change public API to use target instead of dialect in preparation for feature
  work (@aljazerzen, #1684)

- `prqlc watch` command which watches filesystem for changes and compiles .prql
  files to .sql (@aljazerzen, #1708)

**Fixes**:

- Support double brackets in s-strings which aren't symmetric (@max-sixty,
  #1650)
- Support Postgres's Interval syntax (@max-sixty, #1649)
- Fixed tests for `prql-elixir` with macOS (@kasvith, #1707)

**Documentation**:

- Add a documentation test for prql-compiler, update prql-compiler README, and
  include the README in the prql book section for Rust bindings. The code
  examples in the README are included and tested as doctests in the
  prql-compiler (@nkicg6, #1679)

**Internal changes**:

- Add tests for all PRQL website examples to prql-python to ensure compiled
  results match expected SQL (@nkicg6, #1719)

**New Contributors**:

- @ruslandoga, with #1628
- @RalfNorthman, with #1632
- @nicot, with #1662

## 0.4.2 — 2023-01-25

**Features**:

- New `from_text format-arg string-arg` function that supports JSON and CSV
  formats. _format-arg_ can be `format:csv` or `format:json`. _string-arg_ can
  be a string in any format. (@aljazerzen & @snth, #1514)

  ```prql no-eval
  from_text format:csv """
  a,b,c
  1,2,3
  4,5,6
  """
  ```

  ```prql no-eval
  from_text format:json '''
      [{"a": 1, "b": "x", "c": false }, {"a": 4, "b": "y", "c": null }]
  '''
  ```

  ```prql no-eval
  from_text format:json '''{
      "columns": ["a", "b", "c"],
      "data": [
          [1, "x", false],
          [4, "y", null]
      ]
  }'''
  ```

  For now, the argument is limited to string constants.

**Fixes**

- Export constructor for SQLCompileOptions (@bcho, #1621)
- Remove backticks in count_distinct (@aljazerzen, #1611)

**New Contributors**

- @1Kinoti, with #1596
- @veenaamb, with #1614

## 0.4.1 — 2023-01-18

0.4.1 comes a few days after 0.4.0, with a couple of features and the release of
`prqlc`, the CLI crate.

0.4.1 has 35 commits from 6 contributors.

**Features**:

- Inferred column names include the relation name (@aljazerzen, #1550):

  ```prql no-eval
  from albums
  select title # name used to be inferred as title only
  select albums.title # so using albums was not possible here
  ```

- Quoted identifiers such as `dir/*.parquet` are passed through to SQL.
  (@max-sixty, #1516).

- The CLI is installed with `cargo install prqlc`. The binary was renamed in
  0.4.0 but required an additional `--features` flag, which has been removed in
  favor of this new crate (@max-sixty & @aljazerzen, #1549).

**New Contributors**:

- @fool1280, with #1554
- @nkicg6, with #1567

## 0.4.0 — 2023-01-15

0.4.0 brings lots of new features including `case`, `select ![]` and numbers
with underscores. We have initial (unpublished) bindings to Elixir. And there's
the usual improvements to fixes & documentation (only a minority are listed
below in this release).

0.4.0 also has some breaking changes: `table` is `let`, `dialect` is renamed to
`target`, and the compiler's API has changed. Full details below.

**Features**:

- Defining a temporary table is now expressed as `let` rather than `table`
  (@aljazerzen, #1315). See the
  [tables docs](https://prql-lang.org/book/reference/declarations/variables.html)
  for details.

- _Experimental:_ The
  [`case`](https://prql-lang.org/book/reference/syntax/case.html) function sets
  a variable to a value based on one of several expressions (@aljazerzen,
  #1278).

  ```prql no-eval
  derive var = case [
    score <= 10 -> "low",
    score <= 30 -> "medium",
    score <= 70 -> "high",
    true -> "very high",
  ]
  ```

  ...compiles to:

  ```sql
  SELECT
    *,
    CASE
      WHEN score <= 10 THEN 'low'
      WHEN score <= 30 THEN 'medium'
      WHEN score <= 70 THEN 'high'
      ELSE 'very high'
    END AS var
  FROM
    bar
  ```

  Check out the
  [`case` docs](https://prql-lang.org/book/reference/syntax/case.html) for more
  details.

- _Experimental:_ Columns can be excluded by name with `select` (@aljazerzen,
  #1329)

  ```prql no-eval
  from albums
  select ![title, composer]
  ```

- _Experimental:_ `append` transform, equivalent to `UNION ALL` in SQL.
  (@aljazerzen, #894)

  ```prql no-eval
  from employees
  append managers
  ```

  Check out the
  [`append` docs](https://prql-lang.org/book/reference/stdlib/transforms/append.html)
  for more details.

- Numbers can contain underscores, which can make reading long numbers easier
  (@max-sixty, #1467):

  ```prql no-eval
  from numbers
  select {
      small = 1.000_000_1,
      big = 5_000_000,
  }
  ```

- The SQL output contains a comment with the PRQL compiler version (@aljazerzen,
  #1322)
- `dialect` is renamed to `target`, and its values are prefixed with `sql.`
  (@max-sixty, #1388); for example:

  ```prql no-eval
  prql target:sql.bigquery  # previously was `dialect:bigquery`

  from employees
  ```

  This gives us the flexibility to target other languages than SQL in the long
  term.

- Tables definitions can contain a bare s-string (@max-sixty, #1422), which
  enables us to include a full CTE of SQL, for example:

  ```prql no-eval
  let grouping = s"""
    SELECT SUM(a)
    FROM tbl
    GROUP BY
      GROUPING SETS
      ((b, c, d), (d), (b, d))
  """
  ```

- Ranges supplied to `in` can be half-open (@aljazerzen, #1330).

- The crate's external API has changed to allow for compiling to intermediate
  representation. This also affects bindings. See
  [`prql-compiler` docs](https://docs.rs/prql-compiler/latest/prql_compiler/)
  for more details.

**Fixes**:

[This release, the changelog only contains a subset of fixes]

- Allow interpolations in table s-strings (@aljazerzen, #1337)

**Documentation**:

[This release, the changelog only contains a subset of documentation
improvements]

- Add docs on aliases in
  [Select](https://prql-lang.org/book/reference/stdlib/transforms/select.html)
- Add JS template literal and multiline example (@BCsabaEngine, #1432)
- JS template literal and multiline example (@BCsabaEngine, #1432)
- Improve prql-compiler docs & examples (@aljazerzen, #1515)
- Fix string highlighting in book (@max-sixty, #1264)

**Web**:

- The playground allows querying some sample data. As before, the result updates
  on every keystroke. (@aljazerzen, #1305)

**Integrations**:

[This release, the changelog only contains a subset of integration improvements]

- Added Elixir integration exposing PRQL functions as NIFs (#1500, @kasvith)
- Exposed Elixir flavor with exceptions (#1513, @kasvith)
- Rename `prql-compiler` binary to `prqlc` (@aljazerzen #1515)

**Internal changes**:

[This release, the changelog only contains a subset of internal changes]

- Add parsing for negative select (@max-sixty, #1317)
- Allow for additional builtin functions (@aljazerzen, #1325)
- Add an automated check for typos (@max-sixty, #1421)
- Add tasks for running playground & book (@max-sixty, #1265)
- Add tasks for running tests on every file change (@max-sixty, #1380)

**New contributors**:

- @EArazli, with #1359
- @boramalper, with #1362
- @allurefx, with #1377
- @bcho, with #1375
- @JettChenT, with #1385
- @BlurrechDev, with #1411
- @BCsabaEngine, with #1432
- @kasvith, with #1500

## 0.3.1 - 2022-12-03

0.3.1 brings a couple of small improvements and fixes.

**Features**:

- Support for using s-strings for `from` (#1197, @aljazerzen)

  ```prql no-eval
  from s"SELECT * FROM employees WHERE foo > 5"
  ```

- Helpful error message when referencing a table in an s-string (#1203,
  @aljazerzen)

**Fixes**:

- Multiple columns with same name created (#1211, @aljazerzen)
- Renaming via select breaks preceding sorting (#1204, @aljazerzen)
- Same column gets selected multiple times (#1186, @mklopets)

**Internal**:

- Update Github Actions and Workflows to current version numbers (and avoid
  using Node 12)

## 0.3.0 — 2022-11-29

🎉 0.3.0 is the biggest ever change in PRQL's compiler, rewriting much of the
internals: the compiler now has a semantic understanding of expressions,
including resolving names & building a DAG of column lineage 🎉.

While the immediate changes to the language are modest — some long-running bugs
are fixed — this unlocks the development of many of the project's long-term
priorities, such as type-checking & auto-complete. And it simplifies the
building of our next language features, such as match-case expressions, unions &
table expressions.

@aljazerzen has (mostly single-handedly) done this work over the past few
months. The project owes him immense appreciation.

**Breaking changes**:

We've had to make some modest breaking changes for 0.3:

- _Pipelines must start with `from`_. For example, a pipeline with only
  `derive foo = 5`, with no `from` transform, is no longer valid. Depending on
  demand for this feature, it would be possible to add this back.

- _Shared column names now require `==` in a join_. The existing approach is
  ambiguous to the compiler — `id` in the following example could be a boolean
  column.

  ```diff
  from employees
  -join positions [id]
  +join positions [==id]
  ```

- _Table references containing periods must be surrounded by backticks_. For
  example, when referencing a schema name:

  ```diff
  -from public.sometable
  +from `public.sometable`
  ```

**Features**:

- Change self equality op to `==` (#1176, @aljazerzen)
- Add logging (@aljazerzen)
- Add clickhouse dialect (#1090, @max-sixty)
- Allow namespaces & tables to contain `.` (#1079, @aljazerzen)

**Fixes**:

- Deduplicate column appearing in `SELECT` multiple times (#1186, @aljazerzen)
- Fix uppercase table names (#1184, @aljazerzen)
- Omit table name when only one ident in SELECT (#1094, @aljazerzen)

**Documentation**:

- Add chapter on semantics' internals (@aljazerzen, #1028)
- Add note about nesting variables in s-strings (@max-sixty, #1163)

**Internal changes**:

- Flatten group and window (#1120, @aljazerzen)
- Split ast into expr and stmt (@aljazerzen)
- Refactor associativity (#1156, @aljazerzen)
- Rename Ident constructor to `from_name` (#1084, @aljazerzen)
- Refactor rq folding (#1177, @aljazerzen)
- Add tests for reported bugs fixes in semantic (#1174, @aljazerzen)
- Bump duckdb from 0.5.0 to 0.6.0 (#1132)
- Bump once_cell from 1.15.0 to 1.16.0 (#1101)
- Bump pest from 2.4.0 to 2.5.0 (#1161)
- Bump pest_derive from 2.4.0 to 2.5.0 (#1179)
- Bump sqlparser from 0.25.0 to 0.27.0 (#1131)
- Bump trash from 2.1.5 to 3.0.0 (#1178)

## 0.2.11 — 2022-11-20

0.2.11 contains a few helpful fixes.

Work continues on our `semantic` refactor — look out for 0.3.0 soon! Many thanks
to @aljazerzen for his continued contributions to this.

Note: 0.2.10 was skipped due to this maintainer's inability to read his own docs
on bumping versions...

**Features**:

- Detect when compiler version is behind query version (@MarinPostma, #1058)
- Add `__version__` to prql-python package (@max-sixty, #1034)

**Fixes**:

- Fix nesting of expressions with equal binding strength and left associativity,
  such as `a - (b - c)` (@max-sixty, #1136)
- Retain floats without significant digits as floats (@max-sixty, #1141)

**Documentation**:

- Add documentation of `prqlr` bindings (@eitsupi, #1091)
- Add a 'Why PRQL' section to the website (@max-sixty, #1098)
- Add @snth to core-devs (@max-sixty, #1050)

**Internal changes**:

- Use workspace versioning (@max-sixty, #1065)

## 0.2.9 — 2022-10-14

0.2.9 is a small release containing a bug fix for empty strings.

**Fixes**:

- Fix parsing of empty strings (@aljazerzen, #1024)

## 0.2.8 — 2022-10-10

0.2.8 is another modest release with some fixes, doc improvements, bindings
improvements, and lots of internal changes. Note that one of the fixes causes
the behavior of `round` and `cast` to change slightly — though it's handled as a
fix rather than a breaking change in semantic versioning.

**Fixes**:

- Change order of the `round` & `cast` function parameters to have the column
  last; for example `round 2 foo_col` / `cast int foo`. This is consistent with
  other functions, and makes piping possible:

  ```prql no-eval
  derive [
    gross_salary = (salary + payroll_tax | as int),
    gross_salary_rounded = (gross_salary | round 0),
  ]
  ```

**Documentation**:

- Split `DEVELOPMENT.md` from `CONTRIBUTING.md` (@richb-hanover, #1010)
- Make s-strings more prominent in website intro (@max-sixty, #982)

**Web**:

- Add GitHub star count to website (@max-sixty, #990)

**Integrations**:

- Expose a shortened error message, in particular for the VS Code extension
  (@aljazerzen, #1005)

**Internal changes**:

- Specify 1.60.0 as minimum Rust version (@max-sixty, #1011)
- Remove old `wee-alloc` code (@max-sixty, #1013)
- Upgrade clap to version 4 (@aj-bagwell, #1004)
- Improve book-building script in Taskfile (@max-sixty, #989)
- Publish website using an artifact rather than a long-lived branch (@max-sixty,
  #1009)

## 0.2.7 — 2022-09-17

0.2.7 is a fairly modest release, six weeks after 0.2.6. We have some more
significant features, including a `union` operator and an overhaul of our type
system, as open PRs which will follow in future releases.

We also have new features in the
[VS Code extension](https://github.com/PRQL/prql-code), courtesy of
@jiripospisil, including a live output panel.

**Fixes**:

- `range_of_ranges` checks the Range end is smaller than its start (@shuozeli,
  #946)

**Documentation**:

- Improve various docs (@max-sixty, #974, #971, #972, #970, #925)
- Add reference to EdgeDB's blog post in our FAQ (@max-sixty, #922)
- Fix typos (@kianmeng, #943)

**Integrations**:

- Add `prql-lib`, enabling language bindings with `go` (@sigxcpu76, #923)
- Fix line numbers in JS exceptions (@charlie-sanders, #929)

**Internal changes**:

- Lock the version of the rust-toolchain, with auto-updates (@max-sixty, #926,
  #927)

## 0.2.6 — 2022-08-05

**Fixes**:

- Adjust `fmt` to only escape names when needed (@aljazerzen, #907)
- Fix quoting on upper case `table` names (@max-sixty, #893)
- Fix scoping of identical column names from multiple tables (@max-sixty, #908)
- Fix parse error on newlines in a `table` (@sebastiantoh 🆕, #902)
- Fix quoting of upper case table names (@max-sixty, #893)

**Documentation**:

- Add docs on Architecture (@aljazerzen, #904)
- Add Changelog (@max-sixty, #890 #891)

**Internal changes**:

- Start trial using Conventional Commits (@max-sixty, #889)
- Add crates.io release workflow, docs (@max-sixty, #887)

## 0.2.5 - 2022-07-29

0.2.5 is a very small release following 0.2.4 yesterday. It includes:

- Add the ability to represent single brackets in an s-string, with two brackets
  (#752, @max-sixty)
- Fix the "Copy to Clipboard" command in the Playground, for Firefox (#880,
  @mklopets)

## 0.2.4 - 2022-07-28

0.2.4 is a small release following 0.2.3 a few days ago. The 0.2.4 release
includes:

- Enrich our CLI, adding commands to get different stages of the compilation
  process (@aljazerzen , #863)
- Fix multiple `take n` statements in a query, leading to duplicate proxy
  columns in generated SQL (@charlie-sanders)
- Fix BigQuery quoting of identifiers in `SELECT` statements (@max-sixty)
- Some internal changes — reorganize top-level functions (@aljazerzen), add a
  workflow to track our Rust compilation time (@max-sixty), simplify our simple
  prql-to-sql tests (@max-sixty)

Thanks to @ankane, `prql-compiler` is now available from homebrew core;
`brew install prql-compiler`[^1].

[^1]:
    we still need to update docs and add a release workflow for this:
    <https://github.com/PRQL/prql/issues/866>

## 0.2.3 - 2022-07-24

A couple of weeks since the 0.2.2 release: we've squashed a few bugs, added some
mid-sized features to the language, and made a bunch of internal improvements.

The 0.2.3 release includes:

- Allow for escaping otherwise-invalid identifiers (@aljazerzen & @max-sixty)
- Fix a bug around operator precedence (@max-sixty)
- Add a section the book on the language bindings (@charlie-sanders)
- Add tests for our `Display` representation while fixing some existing bugs.
  This is gradually becoming our code formatter (@arrizalamin)
- Add a "copy to clipboard" button in the Playground (@mklopets)
- Add lots of guidance to our `CONTRIBUTING.md` around our tests and process for
  merging (@max-sixty)
- Add a `prql!` macro for parsing a prql query at compile time (@aljazerzen)
- Add tests for `prql-js` (@charlie-sanders)
- Add a `from_json` method for transforming json to a PRQL string (@arrizalamin)
- Add a workflow to release `prql-java` to Maven (@doki23)
- Enable running all tests from a PR by adding a `pr-run-all-tests` label
  (@max-sixty)
- Have `cargo-release` to bump all crate & npm versions (@max-sixty)
- Update `prql-js` to use the bundler build of `prql-js` (@mklopets)

As well as those contribution changes, thanks to those who've reported issues,
such as @mklopets @huw @mm444 @ajfriend.

From here, we're planning to continue squashing bugs (albeit more minor than
those in this release), adding some features like `union`, while working on
bigger issues such as type-inference.

We're also going to document and modularize the compiler further. It's important
that we give more people an opportunity to contribute to the guts of PRQL,
especially given the number and enthusiasm of contributions to project in
general — and it's not that easy to do so at the moment. While this is ongoing
if anyone has something they'd like to work on in the more difficult parts of
the compiler, let us know on GitHub or Discord, and we'd be happy to work
together on it.

Thank you!

## 0.2.2 - 2022-07-10

We're a couple of weeks since our 0.2.0 release. Thanks for the surge in
interest and contributions! 0.2.2 has some fixes & some internal improvements:

- We now test against SQLite & DuckDB on every commit, to ensure we're producing
  correct SQL. (@aljazerzen)
- We have the beginning of Java bindings! (@doki23)
- Idents surrounded by backticks are passed through to SQL (@max-sixty)
- More examples on homepage; e.g. `join` & `window`, lots of small docs
  improvements
- Automated releases to homebrew (@roG0d)
- [prql-js](https://github.com/PRQL/prql/tree/main/prqlc/bindings/js) is now a
  single package for Node, browsers & webpack (@charlie-sanders)
- Parsing has some fixes, including `>=` and leading underscores in idents
  (@mklopets)
- Ranges receive correct syntax highlighting (@max-sixty)

Thanks to Aljaž Mur Eržen @aljazerzen , George Roldugin @roldugin , Jasper
McCulloch @Jaspooky , Jie Han @doki23 , Marko Klopets @mklopets , Maximilian
Roos @max-sixty , Rodrigo Garcia @roG0d , Ryan Russell @ryanrussell , Steven
Maude @StevenMaude , Charlie Sanders @charlie-sanders .

We're planning to continue collecting bugs & feature requests from users, as
well as working on some of the bigger features, like type-inference.

For those interesting in joining, we also have a new
[Contributing page](https://github.com/PRQL/prql/blob/main/.github/CONTRIBUTING.md).

## 0.2.0 - 2022-06-27

🎉 🎉 **After several months of building, PRQL is ready to use!** 🎉 🎉

---

How we got here:

At the end of January, we published a proposal of a better language for data
transformation: PRQL. The reception was better than I could have hoped for — we
were no. 2 on HackerNews for a day, and gained 2.5K GitHub stars over the next
few days.

But man cannot live on GitHub Stars alone — we had to do the work to build it.
So over the next several months, during many evenings & weekends, a growing
group of us gradually built the compiler, evolved the language, and wrote some
integrations.

We want to double-down on the community and its roots in open source — it's
incredible that a few of us from all over the globe have collaborated on a
project without ever having met. We decided early-on that PRQL would always be
open-source and would never have a commercial product (despite lots of outside
interest to fund a seed round!). Because languages are so deep in the stack, and
the data stack has so many players, the best chance of building a great language
is to build an open language.

---

We still have a long way to go. While PRQL is usable, it has lots of missing
features, and an incredible amount of unfulfilled potential, including a
language server, cohesion with databases, and type inference. Over the coming
weeks, we'd like to grow the number of intrepid users experimenting PRQL in
their projects, prioritize features that will unblock them, and then start
fulfilling PRQL's potential by working through our
[roadmap](https://prql-lang.org/roadmap/).

The best way to experience PRQL is to try it. Check out our
[website](https://prql-lang.org) and the
[Playground](https://prql-lang.org/playground). Start using PRQL for your own
projects in [dbt](https://github.com/prql/dbt-prql),
[Jupyter notebooks](https://pyprql.readthedocs.io/en/latest/magic_readme.html)
and Prefect workflows.

Keep in touch with PRQL by following the project on
[Twitter](https://twitter.com/prql_lang), joining us on
[Discord](https://discord.gg/eQcfaCmsNc), starring the
[repo](https://github.com/PRQL/prql).

[Contribute](https://github.com/PRQL/prql/blob/main/.github/CONTRIBUTING.md) to
the project — we're a really friendly community, whether you're a recent SQL
user or an advanced Rust programmer. We need bug reports, documentation tweaks &
feature requests — just as much as we need compiler improvements written in
Rust.

---

I especially want to give [Aljaž Mur Eržen](https://github.com/aljazerzen)
(@aljazerzen) the credit he deserves, who has contributed the majority of the
difficult work of building out the compiler. Much credit also goes to
@charlie-sanders, one of PRQL's earliest supporters and the author of pyprql,
and [Ryan Patterson-Cross](https://github.com/rbpatt2019) (@rbpatt2019), who
built the Jupyter integration among other Python contributions.

Other contributors who deserve a special mention include: @roG0d, @snth,
@kwigley

---

Thank you, and we look forward to your feedback!


================================================
FILE: CLAUDE.md
================================================
# Claude

## Development Workflow

Use a tiered testing approach—iterate quickly, validate thoroughly:

**Inner loop** (during development, ~5s):

```sh
# Fast tests on core packages
task prqlc:test

# Filtered by test name
cargo insta test -p prqlc --lib -- resolver
cargo insta test -p prqlc --test integration -- date
```

**Before returning to user** (~30s):

```sh
# Comprehensive prqlc tests - sufficient for most changes
task prqlc:pull-request
```

**Cross-binding changes only** (~2min):

```sh
# Only when changes affect JS/Python/wasm bindings
task test-all
```

The test suite is configured to minimize token usage:

- **Nextest** only shows failures and slow tests (not 600 PASS lines)
- **Cargo builds** use `--quiet` flag (no compilation spam)
- **Result**: ~52% reduction in output (1128 → 540 lines, ~4.5k tokens)

## Tests

Prefer inline snapshots for almost all tests:

```rust
insta::assert_snapshot!(result, @"expected output");
```

Initialize tests with empty snapshots, then run with `--accept`:

```rust
insta::assert_snapshot!(result, @"");
```

The test commands above with `--accept` will fill in the result automatically.

### Test Strategy

**Prefer small inline `insta` snapshot tests** over full integration tests:

- **Use inline tests** for most bug fixes and small features
  - Add `#[test]` functions in a `#[cfg(test)]` module at the end of the file
  - Use `insta::assert_snapshot!` for compact, readable test assertions
  - Fast to run, easy to review in PRs

- **Use integration tests** (`prqlc/tests/integration/queries/*.prql`) only
  when:
  - Developing large, complex features that need compreh
Download .txt
gitextract_epfrnbyg/

├── .cargo/
│   └── config.toml
├── .config/
│   ├── insta.yaml
│   ├── lychee.toml
│   ├── nextest.toml
│   ├── vscode-recommended/
│   │   ├── launch.json
│   │   ├── settings.json
│   │   └── tasks.json
│   └── wt.toml
├── .devcontainer/
│   ├── base-image/
│   │   └── Dockerfile
│   └── devcontainer.json
├── .gitattributes
├── .github/
│   ├── .codecov.yaml
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   ├── config.yaml
│   │   └── something_else.yaml
│   ├── actionlint.yaml
│   ├── actions/
│   │   ├── build-prqlc/
│   │   │   └── action.yaml
│   │   ├── build-prqlc-c/
│   │   │   └── action.yaml
│   │   ├── build-python/
│   │   │   └── action.yaml
│   │   └── time-compilation/
│   │       └── action.yaml
│   ├── dependabot.yaml
│   ├── nightly-failure.md
│   └── workflows/
│       ├── README.md
│       ├── build-devcontainer.yaml
│       ├── build-web.yaml
│       ├── claude.yaml
│       ├── lint-megalinter.yaml
│       ├── nightly.yaml
│       ├── publish-web.yaml
│       ├── pull-request-target.yaml
│       ├── release.yaml
│       ├── scripts/
│       │   ├── set_version.sh
│       │   └── util_free_space.sh
│       ├── test-dotnet.yaml
│       ├── test-elixir.yaml
│       ├── test-java.yaml
│       ├── test-js.yaml
│       ├── test-php.yaml
│       ├── test-prqlc-c.yaml
│       ├── test-python.yaml
│       ├── test-rust.yaml
│       └── tests.yaml
├── .gitignore
├── .markdownlint-cli2.yaml
├── .mega-linter.yaml
├── .pre-commit-config.yaml
├── .prettierignore
├── .prettierrc.yaml
├── .sqlfluff
├── .typos.toml
├── .vscode/
│   └── extensions.json
├── CHANGELOG.md
├── CLAUDE.md
├── Cargo.toml
├── LICENSE
├── README.md
├── Taskfile.yaml
├── bacon.toml
├── flake.nix
├── grammars/
│   ├── CotEditor/
│   │   ├── PRQL.yaml
│   │   └── README.md
│   ├── GtkSourceView/
│   │   ├── README.md
│   │   └── prql.lang
│   ├── KSyntaxHighlighting/
│   │   ├── README.md
│   │   └── prql.xml
│   ├── README.md
│   ├── emacs/
│   │   ├── README.md
│   │   └── prql-mode.el
│   ├── nano/
│   │   ├── README.md
│   │   └── prql.nanorc
│   ├── prql-lezer/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── rollup.config.js
│   │   ├── src/
│   │   │   ├── highlight.js
│   │   │   └── prql.grammar
│   │   └── test/
│   │       ├── arithmetics.txt
│   │       ├── arrays.txt
│   │       ├── datetime.txt
│   │       ├── full_queries.txt
│   │       ├── identifiers.txt
│   │       ├── misc.txt
│   │       ├── numbers.txt
│   │       ├── operators.txt
│   │       ├── strings.txt
│   │       ├── test-prql.js
│   │       └── tuples.txt
│   ├── raku/
│   │   ├── META6.json
│   │   ├── README.md
│   │   ├── lib/
│   │   │   └── prql.rakumod
│   │   └── t/
│   │       ├── arithmetics.rakutest
│   │       ├── arrays.rakutest
│   │       ├── datetime.rakutest
│   │       ├── full_queries.rakutest
│   │       ├── identifiers.rakutest
│   │       ├── misc.rakutest
│   │       ├── numbers.rakutest
│   │       ├── operators.rakutest
│   │       ├── strings.rakutest
│   │       └── tuples.rakutest
│   └── vim/
│       └── README.md
├── prqlc/
│   ├── README.md
│   ├── Taskfile.yaml
│   ├── bindings/
│   │   ├── dotnet/
│   │   │   ├── .gitignore
│   │   │   ├── PrqlCompiler/
│   │   │   │   ├── Message.cs
│   │   │   │   ├── MessageKind.cs
│   │   │   │   ├── NativePrqlCompilerOptions.cs
│   │   │   │   ├── NativeResult.cs
│   │   │   │   ├── PrqlCompiler.cs
│   │   │   │   ├── PrqlCompiler.csproj
│   │   │   │   ├── PrqlCompilerOptions.cs
│   │   │   │   ├── Result.cs
│   │   │   │   ├── SourceLocation.cs
│   │   │   │   └── Span.cs
│   │   │   ├── PrqlCompiler.Tests/
│   │   │   │   ├── CompilerTest.cs
│   │   │   │   ├── PrqlCompiler.Tests.csproj
│   │   │   │   └── Usings.cs
│   │   │   ├── README.md
│   │   │   └── prql-net.sln
│   │   ├── elixir/
│   │   │   ├── .formatter.exs
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── lib/
│   │   │   │   ├── prql/
│   │   │   │   │   ├── errors.ex
│   │   │   │   │   └── native.ex
│   │   │   │   └── prql.ex
│   │   │   ├── mix.exs
│   │   │   ├── native/
│   │   │   │   └── prql/
│   │   │   │       ├── .cargo/
│   │   │   │       │   └── config.toml
│   │   │   │       ├── Cargo.toml
│   │   │   │       ├── README.md
│   │   │   │       └── src/
│   │   │   │           └── lib.rs
│   │   │   └── test/
│   │   │       ├── prql_test.exs
│   │   │       └── test_helper.exs
│   │   ├── java/
│   │   │   ├── .gitignore
│   │   │   ├── Cargo.toml
│   │   │   ├── DEVELOPMENT.md
│   │   │   ├── README.md
│   │   │   ├── cross.sh
│   │   │   ├── java/
│   │   │   │   ├── .mvn/
│   │   │   │   │   └── wrapper/
│   │   │   │   │       ├── maven-wrapper.jar
│   │   │   │   │       └── maven-wrapper.properties
│   │   │   │   ├── build.sh
│   │   │   │   ├── mvnw
│   │   │   │   ├── mvnw.cmd
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   ├── java/
│   │   │   │       │   │   └── org/
│   │   │   │       │   │       └── prql/
│   │   │   │       │   │           └── prql4j/
│   │   │   │       │   │               ├── Environment.java
│   │   │   │       │   │               ├── NativeLibraryLoader.java
│   │   │   │       │   │               └── PrqlCompiler.java
│   │   │   │       │   └── resources/
│   │   │   │       │       └── .gitkeep
│   │   │   │       └── test/
│   │   │   │           ├── java/
│   │   │   │           │   └── org/
│   │   │   │           │       └── prql/
│   │   │   │           │           └── prql4j/
│   │   │   │           │               └── PrqlCompilerTest.java
│   │   │   │           └── resources/
│   │   │   │               └── .gitkeep
│   │   │   └── src/
│   │   │       └── lib.rs
│   │   ├── js/
│   │   │   ├── Cargo.toml
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   └── lib.rs
│   │   │   └── tests/
│   │   │       └── test_all.mjs
│   │   ├── php/
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   ├── phpstan.neon
│   │   │   ├── src/
│   │   │   │   ├── Compiler.php
│   │   │   │   ├── Message.php
│   │   │   │   ├── MessageKind.php
│   │   │   │   ├── Options.php
│   │   │   │   ├── Result.php
│   │   │   │   ├── SourceLocation.php
│   │   │   │   └── Span.php
│   │   │   └── tests/
│   │   │       └── CompilerTest.php
│   │   ├── prqlc-c/
│   │   │   ├── Cargo.toml
│   │   │   ├── README.md
│   │   │   ├── cbindgen.toml
│   │   │   ├── examples/
│   │   │   │   ├── minimal-c/
│   │   │   │   │   ├── Makefile
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── main.c
│   │   │   │   ├── minimal-cpp/
│   │   │   │   │   ├── Makefile
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── main.cpp
│   │   │   │   └── minimal-zig/
│   │   │   │       ├── .gitignore
│   │   │   │       ├── README.md
│   │   │   │       ├── Taskfile.yaml
│   │   │   │       ├── build.zig
│   │   │   │       └── src/
│   │   │   │           └── main.zig
│   │   │   ├── prqlc.h
│   │   │   ├── prqlc.hpp
│   │   │   └── src/
│   │   │       └── lib.rs
│   │   └── prqlc-python/
│   │       ├── .gitignore
│   │       ├── Cargo.toml
│   │       ├── README.md
│   │       ├── Taskfile.yaml
│   │       ├── build.rs
│   │       ├── noxfile.py
│   │       ├── pyproject.toml
│   │       ├── python/
│   │       │   ├── prqlc/
│   │       │   │   ├── __init__.py
│   │       │   │   ├── __init__.pyi
│   │       │   │   ├── debug.pyi
│   │       │   │   └── py.typed
│   │       │   └── tests/
│   │       │       └── test_all.py
│   │       └── src/
│   │           └── lib.rs
│   ├── packages/
│   │   └── snap/
│   │       └── snapcraft.yaml
│   ├── prqlc/
│   │   ├── ARCHITECTURE.md
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   ├── benches/
│   │   │   ├── bench.rs
│   │   │   └── bench_impl.rs
│   │   ├── build.rs
│   │   ├── examples/
│   │   │   └── compile-files/
│   │   │       ├── Cargo.toml
│   │   │       ├── README.md
│   │   │       ├── build.rs
│   │   │       ├── queries/
│   │   │       │   ├── arrays.prql
│   │   │       │   ├── query1.prql
│   │   │       │   └── variables.prql
│   │   │       └── src/
│   │   │           └── main.rs
│   │   ├── src/
│   │   │   ├── cli/
│   │   │   │   ├── docs_generator.rs
│   │   │   │   ├── highlight.rs
│   │   │   │   ├── jinja.rs
│   │   │   │   ├── lsp.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── snapshots/
│   │   │   │   │   ├── prqlc__cli__test__shell_completion-2.snap
│   │   │   │   │   ├── prqlc__cli__test__shell_completion-3.snap
│   │   │   │   │   ├── prqlc__cli__test__shell_completion-4.snap
│   │   │   │   │   └── prqlc__cli__test__shell_completion.snap
│   │   │   │   ├── test.rs
│   │   │   │   └── watch.rs
│   │   │   ├── codegen/
│   │   │   │   ├── ast.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── types.rs
│   │   │   ├── debug/
│   │   │   │   ├── log.rs
│   │   │   │   ├── messages.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── render_html.rs
│   │   │   ├── error_message.rs
│   │   │   ├── ir/
│   │   │   │   ├── decl.rs
│   │   │   │   ├── generic.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── pl/
│   │   │   │   │   ├── expr.rs
│   │   │   │   │   ├── extra.rs
│   │   │   │   │   ├── fold.rs
│   │   │   │   │   ├── lineage.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── stmt.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   └── rq/
│   │   │   │       ├── expr.rs
│   │   │   │       ├── fold.rs
│   │   │   │       ├── ids.rs
│   │   │   │       ├── mod.rs
│   │   │   │       ├── transform.rs
│   │   │   │       └── utils.rs
│   │   │   ├── lib.rs
│   │   │   ├── main.rs
│   │   │   ├── parser.rs
│   │   │   ├── semantic/
│   │   │   │   ├── ast_expand.rs
│   │   │   │   ├── lowering.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── module.rs
│   │   │   │   ├── reporting.rs
│   │   │   │   ├── resolver/
│   │   │   │   │   ├── expr.rs
│   │   │   │   │   ├── flatten.rs
│   │   │   │   │   ├── functions.rs
│   │   │   │   │   ├── inference.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── names.rs
│   │   │   │   │   ├── snapshots/
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__append_union_different_tables.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__frames_and_names-2.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__frames_and_names-3.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__frames_and_names.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__functions_1.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__functions_nested.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__functions_pipeline-2.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__functions_pipeline.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__named_args.snap
│   │   │   │   │   │   ├── prqlc__semantic__resolver__test__variables_1.snap
│   │   │   │   │   │   └── prqlc__semantic__resolver__transforms__tests__aggregate_positional_arg-2.snap
│   │   │   │   │   ├── static_eval.rs
│   │   │   │   │   ├── stmt.rs
│   │   │   │   │   ├── transforms.rs
│   │   │   │   │   └── types.rs
│   │   │   │   └── std.prql
│   │   │   ├── sql/
│   │   │   │   ├── dialect.rs
│   │   │   │   ├── gen_expr.rs
│   │   │   │   ├── gen_projection.rs
│   │   │   │   ├── gen_query.rs
│   │   │   │   ├── keywords.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── operators.rs
│   │   │   │   ├── pq/
│   │   │   │   │   ├── anchor.rs
│   │   │   │   │   ├── ast.rs
│   │   │   │   │   ├── context.rs
│   │   │   │   │   ├── gen_query.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── positional_mapping.rs
│   │   │   │   │   ├── postprocess.rs
│   │   │   │   │   └── preprocess.rs
│   │   │   │   └── std.sql.prql
│   │   │   └── utils/
│   │   │       ├── id_gen.rs
│   │   │       ├── mod.rs
│   │   │       └── toposort.rs
│   │   └── tests/
│   │       ├── CLAUDE.md
│   │       └── integration/
│   │           ├── bad_error_messages.rs
│   │           ├── data/
│   │           │   └── chinook/
│   │           │       ├── albums.csv
│   │           │       ├── artists.csv
│   │           │       ├── customers.csv
│   │           │       ├── employees.csv
│   │           │       ├── genres.csv
│   │           │       ├── invoice_items.csv
│   │           │       ├── invoices.csv
│   │           │       ├── media_types.csv
│   │           │       ├── media_types.json
│   │           │       ├── playlist_track.csv
│   │           │       ├── playlists.csv
│   │           │       ├── schema.sql
│   │           │       └── tracks.csv
│   │           ├── dbs/
│   │           │   ├── README.md
│   │           │   ├── docker-compose.yaml
│   │           │   ├── dockerfiles/
│   │           │   │   └── glaredb.Dockerfile
│   │           │   ├── mod.rs
│   │           │   ├── protocol.rs
│   │           │   └── runner.rs
│   │           ├── error_messages.rs
│   │           ├── main.rs
│   │           ├── project/
│   │           │   ├── Project.prql
│   │           │   └── artists.prql
│   │           ├── queries/
│   │           │   ├── aggregation.prql
│   │           │   ├── append_select.prql
│   │           │   ├── append_select_compute.prql
│   │           │   ├── append_select_multiple_with_null.prql
│   │           │   ├── append_select_nulls.prql
│   │           │   ├── append_select_simple.prql
│   │           │   ├── arithmetic.prql
│   │           │   ├── cast.prql
│   │           │   ├── constants_only.prql
│   │           │   ├── date_to_text.prql
│   │           │   ├── distinct.prql
│   │           │   ├── distinct_on.prql
│   │           │   ├── genre_counts.prql
│   │           │   ├── group_all.prql
│   │           │   ├── group_sort.prql
│   │           │   ├── group_sort_derive_select_join.prql
│   │           │   ├── group_sort_filter_derive_select_join.prql
│   │           │   ├── group_sort_limit_take.prql
│   │           │   ├── invoice_totals.prql
│   │           │   ├── loop_01.prql
│   │           │   ├── math_module.prql
│   │           │   ├── pipelines.prql
│   │           │   ├── read_csv.prql
│   │           │   ├── set_ops_remove.prql
│   │           │   ├── sort.prql
│   │           │   ├── sort_2.prql
│   │           │   ├── sort_3.prql
│   │           │   ├── switch.prql
│   │           │   ├── take.prql
│   │           │   ├── text_module.prql
│   │           │   └── window.prql
│   │           ├── queries.rs
│   │           ├── snapshots/
│   │           │   ├── integration__queries__compile__aggregation.snap
│   │           │   ├── integration__queries__compile__append_select.snap
│   │           │   ├── integration__queries__compile__append_select_compute.snap
│   │           │   ├── integration__queries__compile__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__compile__append_select_nulls.snap
│   │           │   ├── integration__queries__compile__append_select_simple.snap
│   │           │   ├── integration__queries__compile__arithmetic.snap
│   │           │   ├── integration__queries__compile__cast.snap
│   │           │   ├── integration__queries__compile__constants_only.snap
│   │           │   ├── integration__queries__compile__distinct.snap
│   │           │   ├── integration__queries__compile__distinct_on.snap
│   │           │   ├── integration__queries__compile__genre_counts.snap
│   │           │   ├── integration__queries__compile__group_all.snap
│   │           │   ├── integration__queries__compile__group_sort.snap
│   │           │   ├── integration__queries__compile__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__compile__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__compile__group_sort_limit_take.snap
│   │           │   ├── integration__queries__compile__invoice_totals.snap
│   │           │   ├── integration__queries__compile__loop_01.snap
│   │           │   ├── integration__queries__compile__math_module.snap
│   │           │   ├── integration__queries__compile__pipelines.snap
│   │           │   ├── integration__queries__compile__read_csv.snap
│   │           │   ├── integration__queries__compile__set_ops_remove.snap
│   │           │   ├── integration__queries__compile__sort.snap
│   │           │   ├── integration__queries__compile__sort_2.snap
│   │           │   ├── integration__queries__compile__sort_3.snap
│   │           │   ├── integration__queries__compile__switch.snap
│   │           │   ├── integration__queries__compile__take.snap
│   │           │   ├── integration__queries__compile__text_module.snap
│   │           │   ├── integration__queries__compile__window.snap
│   │           │   ├── integration__queries__compileall__aggregation.snap
│   │           │   ├── integration__queries__compileall__append_select.snap
│   │           │   ├── integration__queries__compileall__append_select_compute.snap
│   │           │   ├── integration__queries__compileall__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__compileall__append_select_nulls.snap
│   │           │   ├── integration__queries__compileall__append_select_simple.snap
│   │           │   ├── integration__queries__compileall__arithmetic.snap
│   │           │   ├── integration__queries__compileall__cast.snap
│   │           │   ├── integration__queries__compileall__constants_only.snap
│   │           │   ├── integration__queries__compileall__distinct.snap
│   │           │   ├── integration__queries__compileall__distinct_on.snap
│   │           │   ├── integration__queries__compileall__genre_counts.snap
│   │           │   ├── integration__queries__compileall__group_all.snap
│   │           │   ├── integration__queries__compileall__group_sort.snap
│   │           │   ├── integration__queries__compileall__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__compileall__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__compileall__group_sort_limit_take.snap
│   │           │   ├── integration__queries__compileall__invoice_totals.snap
│   │           │   ├── integration__queries__compileall__loop_01.snap
│   │           │   ├── integration__queries__compileall__math_module.snap
│   │           │   ├── integration__queries__compileall__pipelines.snap
│   │           │   ├── integration__queries__compileall__read_csv.snap
│   │           │   ├── integration__queries__compileall__set_ops_remove.snap
│   │           │   ├── integration__queries__compileall__sort.snap
│   │           │   ├── integration__queries__compileall__sort_2.snap
│   │           │   ├── integration__queries__compileall__sort_3.snap
│   │           │   ├── integration__queries__compileall__switch.snap
│   │           │   ├── integration__queries__compileall__take.snap
│   │           │   ├── integration__queries__compileall__text_module.snap
│   │           │   ├── integration__queries__compileall__window.snap
│   │           │   ├── integration__queries__debug_lineage__aggregation.snap
│   │           │   ├── integration__queries__debug_lineage__append_select.snap
│   │           │   ├── integration__queries__debug_lineage__append_select_compute.snap
│   │           │   ├── integration__queries__debug_lineage__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__debug_lineage__append_select_nulls.snap
│   │           │   ├── integration__queries__debug_lineage__append_select_simple.snap
│   │           │   ├── integration__queries__debug_lineage__arithmetic.snap
│   │           │   ├── integration__queries__debug_lineage__cast.snap
│   │           │   ├── integration__queries__debug_lineage__constants_only.snap
│   │           │   ├── integration__queries__debug_lineage__date_to_text.snap
│   │           │   ├── integration__queries__debug_lineage__distinct.snap
│   │           │   ├── integration__queries__debug_lineage__distinct_on.snap
│   │           │   ├── integration__queries__debug_lineage__genre_counts.snap
│   │           │   ├── integration__queries__debug_lineage__group_all.snap
│   │           │   ├── integration__queries__debug_lineage__group_sort.snap
│   │           │   ├── integration__queries__debug_lineage__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__debug_lineage__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__debug_lineage__group_sort_limit_take.snap
│   │           │   ├── integration__queries__debug_lineage__invoice_totals.snap
│   │           │   ├── integration__queries__debug_lineage__loop_01.snap
│   │           │   ├── integration__queries__debug_lineage__math_module.snap
│   │           │   ├── integration__queries__debug_lineage__pipelines.snap
│   │           │   ├── integration__queries__debug_lineage__read_csv.snap
│   │           │   ├── integration__queries__debug_lineage__set_ops_remove.snap
│   │           │   ├── integration__queries__debug_lineage__sort.snap
│   │           │   ├── integration__queries__debug_lineage__sort_2.snap
│   │           │   ├── integration__queries__debug_lineage__sort_3.snap
│   │           │   ├── integration__queries__debug_lineage__switch.snap
│   │           │   ├── integration__queries__debug_lineage__take.snap
│   │           │   ├── integration__queries__debug_lineage__text_module.snap
│   │           │   ├── integration__queries__debug_lineage__window.snap
│   │           │   ├── integration__queries__fmt__aggregation.snap
│   │           │   ├── integration__queries__fmt__append_select.snap
│   │           │   ├── integration__queries__fmt__append_select_compute.snap
│   │           │   ├── integration__queries__fmt__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__fmt__append_select_nulls.snap
│   │           │   ├── integration__queries__fmt__append_select_simple.snap
│   │           │   ├── integration__queries__fmt__arithmetic.snap
│   │           │   ├── integration__queries__fmt__cast.snap
│   │           │   ├── integration__queries__fmt__constants_only.snap
│   │           │   ├── integration__queries__fmt__date_to_text.snap
│   │           │   ├── integration__queries__fmt__distinct.snap
│   │           │   ├── integration__queries__fmt__distinct_on.snap
│   │           │   ├── integration__queries__fmt__genre_counts.snap
│   │           │   ├── integration__queries__fmt__group_all.snap
│   │           │   ├── integration__queries__fmt__group_sort.snap
│   │           │   ├── integration__queries__fmt__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__fmt__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__fmt__group_sort_limit_take.snap
│   │           │   ├── integration__queries__fmt__invoice_totals.snap
│   │           │   ├── integration__queries__fmt__loop_01.snap
│   │           │   ├── integration__queries__fmt__math_module.snap
│   │           │   ├── integration__queries__fmt__pipelines.snap
│   │           │   ├── integration__queries__fmt__read_csv.snap
│   │           │   ├── integration__queries__fmt__set_ops_remove.snap
│   │           │   ├── integration__queries__fmt__sort.snap
│   │           │   ├── integration__queries__fmt__sort_2.snap
│   │           │   ├── integration__queries__fmt__sort_3.snap
│   │           │   ├── integration__queries__fmt__switch.snap
│   │           │   ├── integration__queries__fmt__take.snap
│   │           │   ├── integration__queries__fmt__text_module.snap
│   │           │   ├── integration__queries__fmt__window.snap
│   │           │   ├── integration__queries__lex__aggregation.snap
│   │           │   ├── integration__queries__lex__append_select.snap
│   │           │   ├── integration__queries__lex__append_select_compute.snap
│   │           │   ├── integration__queries__lex__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__lex__append_select_nulls.snap
│   │           │   ├── integration__queries__lex__append_select_simple.snap
│   │           │   ├── integration__queries__lex__arithmetic.snap
│   │           │   ├── integration__queries__lex__cast.snap
│   │           │   ├── integration__queries__lex__constants_only.snap
│   │           │   ├── integration__queries__lex__date_to_text.snap
│   │           │   ├── integration__queries__lex__distinct.snap
│   │           │   ├── integration__queries__lex__distinct_on.snap
│   │           │   ├── integration__queries__lex__genre_counts.snap
│   │           │   ├── integration__queries__lex__group_all.snap
│   │           │   ├── integration__queries__lex__group_sort.snap
│   │           │   ├── integration__queries__lex__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__lex__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__lex__group_sort_limit_take.snap
│   │           │   ├── integration__queries__lex__invoice_totals.snap
│   │           │   ├── integration__queries__lex__loop_01.snap
│   │           │   ├── integration__queries__lex__math_module.snap
│   │           │   ├── integration__queries__lex__pipelines.snap
│   │           │   ├── integration__queries__lex__read_csv.snap
│   │           │   ├── integration__queries__lex__set_ops_remove.snap
│   │           │   ├── integration__queries__lex__sort.snap
│   │           │   ├── integration__queries__lex__sort_2.snap
│   │           │   ├── integration__queries__lex__sort_3.snap
│   │           │   ├── integration__queries__lex__switch.snap
│   │           │   ├── integration__queries__lex__take.snap
│   │           │   ├── integration__queries__lex__text_module.snap
│   │           │   ├── integration__queries__lex__window.snap
│   │           │   ├── integration__queries__results__aggregation.snap
│   │           │   ├── integration__queries__results__append_select.snap
│   │           │   ├── integration__queries__results__append_select_compute.snap
│   │           │   ├── integration__queries__results__append_select_multiple_with_null.snap
│   │           │   ├── integration__queries__results__append_select_nulls.snap
│   │           │   ├── integration__queries__results__append_select_simple.snap
│   │           │   ├── integration__queries__results__arithmetic.snap
│   │           │   ├── integration__queries__results__cast.snap
│   │           │   ├── integration__queries__results__constants_only.snap
│   │           │   ├── integration__queries__results__date_to_text.snap
│   │           │   ├── integration__queries__results__distinct.snap
│   │           │   ├── integration__queries__results__distinct_on.snap
│   │           │   ├── integration__queries__results__genre_counts.snap
│   │           │   ├── integration__queries__results__group_all.snap
│   │           │   ├── integration__queries__results__group_sort.snap
│   │           │   ├── integration__queries__results__group_sort_derive_select_join.snap
│   │           │   ├── integration__queries__results__group_sort_filter_derive_select_join.snap
│   │           │   ├── integration__queries__results__group_sort_limit_take.snap
│   │           │   ├── integration__queries__results__invoice_totals.snap
│   │           │   ├── integration__queries__results__loop_01.snap
│   │           │   ├── integration__queries__results__math_module.snap
│   │           │   ├── integration__queries__results__pipelines.snap
│   │           │   ├── integration__queries__results__read_csv.snap
│   │           │   ├── integration__queries__results__set_ops_remove.snap
│   │           │   ├── integration__queries__results__sort.snap
│   │           │   ├── integration__queries__results__sort_2.snap
│   │           │   ├── integration__queries__results__sort_3.snap
│   │           │   ├── integration__queries__results__switch.snap
│   │           │   ├── integration__queries__results__take.snap
│   │           │   ├── integration__queries__results__text_module.snap
│   │           │   └── integration__queries__results__window.snap
│   │           └── sql.rs
│   ├── prqlc-macros/
│   │   ├── Cargo.toml
│   │   └── src/
│   │       └── lib.rs
│   └── prqlc-parser/
│       ├── Cargo.toml
│       └── src/
│           ├── error.rs
│           ├── generic.rs
│           ├── lexer/
│           │   ├── lr.rs
│           │   ├── mod.rs
│           │   └── test.rs
│           ├── lib.rs
│           ├── parser/
│           │   ├── expr.rs
│           │   ├── interpolation.rs
│           │   ├── mod.rs
│           │   ├── perror.rs
│           │   ├── pr/
│           │   │   ├── expr.rs
│           │   │   ├── ident.rs
│           │   │   ├── mod.rs
│           │   │   ├── ops.rs
│           │   │   ├── stmt.rs
│           │   │   └── types.rs
│           │   ├── stmt.rs
│           │   ├── test.rs
│           │   └── types.rs
│           ├── snapshots/
│           │   └── prqlc_parser__test__pipeline_parse_tree.snap
│           ├── span.rs
│           └── test.rs
├── rust-toolchain.toml
└── web/
    ├── .gitignore
    ├── Taskfile.yaml
    ├── book/
    │   ├── Cargo.toml
    │   ├── README.md
    │   ├── book.toml
    │   ├── comparison-table.css
    │   ├── highlight-prql.js
    │   ├── src/
    │   │   ├── README.md
    │   │   ├── SUMMARY.md
    │   │   ├── lib.rs
    │   │   ├── main.rs
    │   │   ├── project/
    │   │   │   ├── bindings/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── dotnet.md
    │   │   │   │   ├── elixir.md
    │   │   │   │   ├── java.md
    │   │   │   │   ├── javascript.md
    │   │   │   │   ├── php.md
    │   │   │   │   ├── python.md
    │   │   │   │   ├── r.md
    │   │   │   │   └── rust.md
    │   │   │   ├── changelog.md
    │   │   │   ├── contributing/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── development.md
    │   │   │   │   ├── fortnightly-dev-call.ics
    │   │   │   │   └── language-design.md
    │   │   │   ├── integrations/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── clickhouse.md
    │   │   │   │   ├── databend.md
    │   │   │   │   ├── duckdb.md
    │   │   │   │   ├── jupyter.md
    │   │   │   │   ├── postgresql.md
    │   │   │   │   ├── prefect.md
    │   │   │   │   ├── prqlc-cli.md
    │   │   │   │   ├── qstudio.md
    │   │   │   │   ├── rill.md
    │   │   │   │   ├── syntax-highlighting.md
    │   │   │   │   └── vscode.md
    │   │   │   └── target.md
    │   │   ├── reference/
    │   │   │   ├── data/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── from.md
    │   │   │   │   ├── read-files.md
    │   │   │   │   └── relation-literals.md
    │   │   │   ├── declarations/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── functions.md
    │   │   │   │   └── variables.md
    │   │   │   ├── spec/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── modules.md
    │   │   │   │   ├── name-resolution.md
    │   │   │   │   ├── null.md
    │   │   │   │   └── type-system.md
    │   │   │   ├── stdlib/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── date.md
    │   │   │   │   ├── distinct.md
    │   │   │   │   ├── math.md
    │   │   │   │   ├── text.md
    │   │   │   │   └── transforms/
    │   │   │   │       ├── README.md
    │   │   │   │       ├── aggregate.md
    │   │   │   │       ├── append.md
    │   │   │   │       ├── derive.md
    │   │   │   │       ├── filter.md
    │   │   │   │       ├── group.md
    │   │   │   │       ├── join.md
    │   │   │   │       ├── loop.md
    │   │   │   │       ├── select.md
    │   │   │   │       ├── sort.md
    │   │   │   │       ├── take.md
    │   │   │   │       └── window.md
    │   │   │   └── syntax/
    │   │   │       ├── README.md
    │   │   │       ├── arrays.md
    │   │   │       ├── case.md
    │   │   │       ├── comments.md
    │   │   │       ├── f-strings.md
    │   │   │       ├── function-calls.md
    │   │   │       ├── keywords.md
    │   │   │       ├── literals.md
    │   │   │       ├── operators.md
    │   │   │       ├── parameters.md
    │   │   │       ├── pipes.md
    │   │   │       ├── r-strings.md
    │   │   │       ├── ranges.md
    │   │   │       ├── s-strings.md
    │   │   │       ├── strings.md
    │   │   │       └── tuples.md
    │   │   └── tutorial/
    │   │       ├── aggregation.md
    │   │       ├── annotated_example.md
    │   │       ├── filtering.md
    │   │       └── relations.md
    │   ├── tests/
    │   │   └── documentation/
    │   │       ├── README.md
    │   │       ├── book.rs
    │   │       ├── main.rs
    │   │       ├── readme.rs
    │   │       ├── snapshots/
    │   │       │   ├── documentation__book__README__prql-language-book__0.snap
    │   │       │   ├── documentation__book__README__prql-language-book__1.snap
    │   │       │   ├── documentation__book__project__target__examples__0.snap
    │   │       │   ├── documentation__book__project__target__examples__1.snap
    │   │       │   ├── documentation__book__project__target__version__0.snap
    │   │       │   ├── documentation__book__project__target__version__1.snap
    │   │       │   ├── documentation__book__reference__data__from__0.snap
    │   │       │   ├── documentation__book__reference__data__from__1.snap
    │   │       │   ├── documentation__book__reference__data__from__2.snap
    │   │       │   ├── documentation__book__reference__data__from__3.snap
    │   │       │   ├── documentation__book__reference__data__read-files__reading-files__0.snap
    │   │       │   ├── documentation__book__reference__data__read-files__reading-files__1.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__0.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__1.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__2.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__3.snap
    │   │       │   ├── documentation__book__reference__data__relation-literals__array-literals__4.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__1.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__late-binding__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__other-examples__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__partial-application__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__partial-application__1.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__partial-application__2.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__piping-values-into-functions__0.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__piping-values-into-functions__1.snap
    │   │       │   ├── documentation__book__reference__declarations__functions__piping-values-into-functions__2.snap
    │   │       │   ├── documentation__book__reference__declarations__variables__variables--__0.snap
    │   │       │   ├── documentation__book__reference__declarations__variables__variables--__1.snap
    │   │       │   ├── documentation__book__reference__declarations__variables__variables--__2.snap
    │   │       │   ├── documentation__book__reference__spec__name-resolution__translating-to-sql__0.snap
    │   │       │   ├── documentation__book__reference__spec__name-resolution__translating-to-sql__1.snap
    │   │       │   ├── documentation__book__reference__spec__null__null-handling__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__README__standard-library__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__README__standard-library__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__README__standard-library__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__date__date-functions__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__date__date-functions__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__date__date-functions__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__distinct__how-do-i-remove-duplicates__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__distinct__how-do-i-remove-duplicates__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__distinct__remove-duplicates-from-each-group__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__distinct__remove-duplicates-from-each-group__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__math__example__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__text__example__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__aggregate__aggregate-is-required__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__aggregate__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__aggregate__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__append__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__append__intersection__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__append__remove__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__derive__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__derive__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__filter__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__filter__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__filter__examples__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__filter__examples__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__group__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__group__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__group__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__join__examples__4.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__loop__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__examples__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__examples__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__excluding-columns__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__excluding-columns__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__excluding-columns__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__select__excluding-columns__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__examples__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__examples__3.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__sort__ordering-guarantees__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__take__examples__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__take__examples__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__example__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__example__1.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__example__2.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__window-functions-as-first-class-citizens__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__windowing-by-default__0.snap
    │   │       │   ├── documentation__book__reference__stdlib__transforms__window__windowing-by-default__1.snap
    │   │       │   ├── documentation__book__reference__syntax__case__0.snap
    │   │       │   ├── documentation__book__reference__syntax__case__1.snap
    │   │       │   ├── documentation__book__reference__syntax__comments__0.snap
    │   │       │   ├── documentation__book__reference__syntax__f-strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__f-strings__1.snap
    │   │       │   ├── documentation__book__reference__syntax__f-strings__2.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__0.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__identifiers--keywords__0.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__identifiers--keywords__1.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__identifiers--keywords__2.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__identifiers--keywords__3.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__quoting__0.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__quoting__1.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__quoting__2.snap
    │   │       │   ├── documentation__book__reference__syntax__keywords__schemas--database-names__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__dates__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__durations__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__numbers__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__times__0.snap
    │   │       │   ├── documentation__book__reference__syntax__literals__timestamps__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__coalesce__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__division-and-integer-division__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__parentheses__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__parentheses__1.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__parentheses__2.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__1.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__2.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__3.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__4.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__regex-expressions__5.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__wrapping-lines__0.snap
    │   │       │   ├── documentation__book__reference__syntax__operators__wrapping-lines__1.snap
    │   │       │   ├── documentation__book__reference__syntax__parameters__0.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__0.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__1.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__ceci-nest-pas-une-pipe__0.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__ceci-nest-pas-une-pipe__1.snap
    │   │       │   ├── documentation__book__reference__syntax__pipes__inner-transforms__0.snap
    │   │       │   ├── documentation__book__reference__syntax__r-strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__ranges__0.snap
    │   │       │   ├── documentation__book__reference__syntax__ranges__1.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__1.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__2.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__3.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__braces__0.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__precedence-within-s-strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__s-strings__precedence-within-s-strings__1.snap
    │   │       │   ├── documentation__book__reference__syntax__strings__0.snap
    │   │       │   ├── documentation__book__reference__syntax__strings__quoting-and-escape-characters__0.snap
    │   │       │   ├── documentation__book__reference__syntax__strings__quoting-and-escape-characters__1.snap
    │   │       │   ├── documentation__book__reference__syntax__tuples__0.snap
    │   │       │   └── documentation__book__reference__syntax__tuples__1.snap
    │   │       └── website.rs
    │   └── theme/
    │       ├── head.hbs
    │       └── highlight.js
    ├── playground/
    │   ├── .eslintrc.cjs
    │   ├── .gitignore
    │   ├── README.md
    │   ├── generateBook.cjs
    │   ├── index.html
    │   ├── package.json
    │   ├── public/
    │   │   ├── manifest.json
    │   │   └── robots.txt
    │   ├── src/
    │   │   ├── app/
    │   │   │   ├── App.css
    │   │   │   └── App.jsx
    │   │   ├── examples.js
    │   │   ├── highlight.css
    │   │   ├── index.css
    │   │   ├── main.jsx
    │   │   ├── output/
    │   │   │   ├── Output.css
    │   │   │   └── Output.jsx
    │   │   ├── reportWebVitals.js
    │   │   ├── setupTests.js
    │   │   ├── sidebar/
    │   │   │   ├── Sidebar.css
    │   │   │   └── Sidebar.jsx
    │   │   └── workbench/
    │   │       ├── Workbench.css
    │   │       ├── Workbench.jsx
    │   │       ├── duckdb.js
    │   │       ├── monaco-theme.json
    │   │       └── prql-syntax.js
    │   └── vite.config.js
    ├── prql-codemirror-demo/
    │   ├── .gitignore
    │   ├── README.md
    │   ├── index.html
    │   ├── package.json
    │   ├── src/
    │   │   ├── codemirror.ts
    │   │   ├── lang-prql/
    │   │   │   ├── complete.ts
    │   │   │   └── prql.ts
    │   │   ├── main.ts
    │   │   ├── style.css
    │   │   └── vite-env.d.ts
    │   └── tsconfig.json
    └── website/
        ├── .gitignore
        ├── README.md
        ├── archetypes/
        │   └── default.md
        ├── config.yaml
        ├── content/
        │   ├── _index.md
        │   ├── demos/
        │   │   └── ace-demo.html
        │   ├── faq.md
        │   ├── playground.html
        │   ├── posts/
        │   │   ├── 2022-05-19-examples.md
        │   │   ├── 2023-01-07-functional-relations.md
        │   │   ├── 2023-01-27-prql-query.md
        │   │   ├── 2023-01-28-format-pretty-reports/
        │   │   │   └── _index.md
        │   │   ├── 2023-02-02-one-year/
        │   │   │   └── _index.md
        │   │   └── 2023-03-14-pi-day.md
        │   └── roadmap.md
        ├── data/
        │   ├── examples/
        │   │   ├── basic.yaml
        │   │   ├── dialects.yaml
        │   │   ├── expressions.yaml
        │   │   ├── f-strings.yaml
        │   │   ├── friendly-syntax.yaml
        │   │   ├── functions.yaml
        │   │   ├── hero.yaml
        │   │   ├── joins.yaml
        │   │   ├── null-handling.yaml
        │   │   ├── orthogonal.yaml
        │   │   ├── s-strings.yaml
        │   │   ├── top-n.yaml
        │   │   └── windows.yaml
        │   └── testimonials.yaml
        ├── static/
        │   └── CNAME
        └── themes/
            └── prql-theme/
                ├── archetypes/
                │   └── default.md
                ├── layouts/
                │   ├── 404.html
                │   ├── _default/
                │   │   ├── _markup/
                │   │   │   └── render-link.html
                │   │   ├── article.html
                │   │   ├── baseof.html
                │   │   ├── big_iframe.html
                │   │   ├── home.html
                │   │   ├── list.html
                │   │   └── single.html
                │   ├── partials/
                │   │   ├── footer.html
                │   │   ├── head.html
                │   │   ├── header.html
                │   │   ├── section-cards.html
                │   │   └── section-testimonials.html
                │   └── shortcodes/
                │       ├── cite.html
                │       ├── columns.html
                │       ├── faq.html
                │       └── link.html
                ├── static/
                │   ├── main.js
                │   ├── plugins/
                │   │   └── highlight/
                │   │       ├── highlight.css
                │   │       └── prql.js
                │   └── style.css
                └── theme.toml
Download .txt
SYMBOL INDEX (2039 symbols across 154 files)

FILE: grammars/prql-lezer/rollup.config.js
  method external (line 15) | external(id) {

FILE: prqlc/bindings/dotnet/PrqlCompiler.Tests/CompilerTest.cs
  class CompilerTest (line 5) | sealed public class CompilerTest
    method ToCompile_Works (line 7) | [Fact]
    method TestOtherFunctions (line 26) | [Fact]

FILE: prqlc/bindings/dotnet/PrqlCompiler/Message.cs
  type Message (line 8) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

FILE: prqlc/bindings/dotnet/PrqlCompiler/MessageKind.cs
  type MessageKind (line 8) | [Serializable]

FILE: prqlc/bindings/dotnet/PrqlCompiler/NativePrqlCompilerOptions.cs
  type NativePrqlCompilerOptions (line 3) | internal struct NativePrqlCompilerOptions
    method NativePrqlCompilerOptions (line 9) | public NativePrqlCompilerOptions(PrqlCompilerOptions options)

FILE: prqlc/bindings/dotnet/PrqlCompiler/NativeResult.cs
  type NativeResult (line 5) | internal struct NativeResult

FILE: prqlc/bindings/dotnet/PrqlCompiler/PrqlCompiler.cs
  class PrqlCompiler (line 9) | public static class PrqlCompiler
    method Compile (line 18) | public static Result Compile(string prqlQuery)
    method Compile (line 39) | public static Result Compile(string prqlQuery, PrqlCompilerOptions opt...
    method PrqlToPl (line 66) | public static Result PrqlToPl(string prqlQuery)
    method PlToRq (line 87) | public static Result PlToRq(string plJson)
    method RqToSql (line 110) | public static Result RqToSql(string rqJson, PrqlCompilerOptions options)
    method CompileExtern (line 129) | [DllImport("libprqlc_c", EntryPoint = "compile")]
    method PrqlToPlExtern (line 132) | [DllImport("libprqlc_c", EntryPoint = "prql_to_pl")]
    method PlToRqExtern (line 135) | [DllImport("libprqlc_c", EntryPoint = "pl_to_rq")]
    method RqToSqlExtern (line 138) | [DllImport("libprqlc_c", EntryPoint = "rq_to_sql")]

FILE: prqlc/bindings/dotnet/PrqlCompiler/PrqlCompilerOptions.cs
  class PrqlCompilerOptions (line 8) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

FILE: prqlc/bindings/dotnet/PrqlCompiler/Result.cs
  class Result (line 10) | public class Result
    method Result (line 14) | internal Result(NativeResult result)

FILE: prqlc/bindings/dotnet/PrqlCompiler/SourceLocation.cs
  type SourceLocation (line 8) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

FILE: prqlc/bindings/dotnet/PrqlCompiler/Span.cs
  type Span (line 9) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

FILE: prqlc/bindings/elixir/lib/prql.ex
  class PRQL (line 1) | defmodule PRQL
    method compile! (line 68) | def compile!(prql_query, opts \\ []) do
    method pl_to_rq (line 98) | def pl_to_rq(pl_json) do
    method pl_to_rq! (line 106) | def pl_to_rq!(pl_json) do
    method rq_to_sql (line 117) | def rq_to_sql(rq_json) do
    method rq_to_sql! (line 125) | def rq_to_sql!(rq_json) do

FILE: prqlc/bindings/elixir/lib/prql/errors.ex
  class PRQL.PRQLError (line 1) | defmodule PRQL.PRQLError
    method exception (line 10) | def exception(err) do

FILE: prqlc/bindings/elixir/lib/prql/native.ex
  class PRQL.Native (line 1) | defmodule PRQL.Native
    method compile (line 5) | def compile(_prql_query, _options), do: e()
    method prql_to_pl (line 7) | def prql_to_pl(_prql_query), do: e()
    method pl_to_rq (line 9) | def pl_to_rq(_pl_json), do: e()
    method rq_to_sql (line 11) | def rq_to_sql(_rq_json), do: e()
    method e (line 13) | defp e(), do: :erlang.nif_error(:nif_not_loaded)
    class PRQL.Native.CompileOptions (line 16) | defmodule PRQL.Native.CompileOptions

FILE: prqlc/bindings/elixir/mix.exs
  class PRQL.MixProject (line 2) | defmodule PRQL.MixProject
    method project (line 5) | def project do
    method application (line 24) | def application do
    method deps (line 31) | defp deps do

FILE: prqlc/bindings/elixir/native/prql/src/lib.rs
  function to_result_tuple (line 32) | fn to_result_tuple(result: Result<String, prqlc::ErrorMessages>) -> NifR...
  function target_from_atom (line 46) | fn target_from_atom(a: Atom) -> prqlc::Target {
  function from (line 78) | fn from(o: CompileOptions) -> Self {
  type CompileOptions (line 91) | pub struct CompileOptions {
  type Response (line 117) | pub struct Response {
  function compile (line 127) | pub fn compile(prql_query: &str, options: CompileOptions) -> NifResult<R...
  function prql_to_pl (line 133) | pub fn prql_to_pl(prql_query: &str) -> NifResult<Response> {
  function pl_to_rq (line 143) | pub fn pl_to_rq(pl_json: &str) -> NifResult<Response> {
  function rq_to_sql (line 154) | pub fn rq_to_sql(rq_json: &str) -> NifResult<Response> {

FILE: prqlc/bindings/elixir/test/prql_test.exs
  class PRQLTest (line 1) | defmodule PRQLTest

FILE: prqlc/bindings/java/java/src/main/java/org/prql/prql4j/Environment.java
  class Environment (line 7) | public class Environment {
    method isAarch64 (line 21) | public static boolean isAarch64() {
    method isPowerPC (line 25) | public static boolean isPowerPC() {
    method isS390x (line 29) | public static boolean isS390x() {
    method isWindows (line 33) | public static boolean isWindows() {
    method isFreeBSD (line 37) | public static boolean isFreeBSD() {
    method isMac (line 41) | public static boolean isMac() {
    method isAix (line 45) | public static boolean isAix() {
    method isUnix (line 49) | public static boolean isUnix() {
    method isMuslLibc (line 54) | public static boolean isMuslLibc() {
    method isSolaris (line 58) | public static boolean isSolaris() {
    method isOpenBSD (line 62) | public static boolean isOpenBSD() {
    method is64Bit (line 66) | public static boolean is64Bit() {
    method getSharedLibraryName (line 73) | public static String getSharedLibraryName(final String name) {
    method getSharedLibraryFileName (line 77) | public static String getSharedLibraryFileName(final String name) {
    method getLibcName (line 87) | public static /* @Nullable */ String getLibcName() {
    method getLibcPostfix (line 95) | private static String getLibcPostfix() {
    method getJniLibraryName (line 103) | public static String getJniLibraryName(final String name) {
    method getFallbackJniLibraryName (line 141) | public static /*@Nullable*/ String getFallbackJniLibraryName(final Str...
    method getJniLibraryFileName (line 148) | public static String getJniLibraryFileName(final String name) {
    method getFallbackJniLibraryFileName (line 152) | public static /*@Nullable*/ String getFallbackJniLibraryFileName(final...
    method appendLibOsSuffix (line 160) | private static String appendLibOsSuffix(final String libraryFileName) {
    method getJniLibraryExtension (line 171) | public static String getJniLibraryExtension() {

FILE: prqlc/bindings/java/java/src/main/java/org/prql/prql4j/NativeLibraryLoader.java
  class NativeLibraryLoader (line 9) | public class NativeLibraryLoader {
    method getInstance (line 24) | public static NativeLibraryLoader getInstance() {
    method loadLibrary (line 28) | public synchronized void loadLibrary(final String tmpDir) throws IOExc...
    method loadLibraryFromJar (line 59) | void loadLibraryFromJar(final String tmpDir)
    method loadLibraryFromJarToTemp (line 67) | File loadLibraryFromJarToTemp(final String tmpDir)
    method NativeLibraryLoader (line 127) | private NativeLibraryLoader() {

FILE: prqlc/bindings/java/java/src/main/java/org/prql/prql4j/PrqlCompiler.java
  class PrqlCompiler (line 5) | public class PrqlCompiler {
    method toSql (line 16) | public static native String toSql(String query, String target, boolean...
    method toJson (line 17) | public static native String toJson(String query) throws Exception;
    method format (line 18) | public static native String format(String query) throws Exception;

FILE: prqlc/bindings/java/java/src/test/java/org/prql/prql4j/PrqlCompilerTest.java
  class PrqlCompilerTest (line 5) | public class PrqlCompilerTest {
    method compile (line 6) | @Test
    method compileWithError (line 20) | @Test(expected = Exception.class)

FILE: prqlc/bindings/java/src/lib.rs
  function Java_org_prql_prql4j_PrqlCompiler_toSql (line 10) | pub extern "system" fn Java_org_prql_prql4j_PrqlCompiler_toSql(
  function Java_org_prql_prql4j_PrqlCompiler_format (line 40) | pub extern "system" fn Java_org_prql_prql4j_PrqlCompiler_format(
  function Java_org_prql_prql4j_PrqlCompiler_toJson (line 55) | pub extern "system" fn Java_org_prql_prql4j_PrqlCompiler_toJson(
  function java_string_with_exception (line 68) | fn java_string_with_exception(result: Result<String, ErrorMessages>, env...

FILE: prqlc/bindings/js/src/lib.rs
  function compile (line 9) | pub fn compile(prql_query: &str, options: Option<CompileOptions>) -> Opt...
  function prql_to_pl (line 17) | pub fn prql_to_pl(prql_query: &str) -> Option<String> {
  function pl_to_prql (line 26) | pub fn pl_to_prql(pl_json: &str) -> Option<String> {
  function pl_to_rq (line 35) | pub fn pl_to_rq(pl_json: &str) -> Option<String> {
  function rq_to_sql (line 45) | pub fn rq_to_sql(rq_json: &str) -> Option<String> {
  type CompileOptions (line 56) | pub struct CompileOptions {
    method new (line 93) | pub fn new() -> Self {
    method target (line 102) | pub fn target(&self) -> String {
    method set_target (line 107) | pub fn set_target(&mut self, target: String) {
  function get_targets (line 73) | pub fn get_targets() -> Vec<JsValue> {
  method default (line 81) | fn default() -> Self {
  function from (line 113) | fn from(o: CompileOptions) -> Self {
  function return_or_throw (line 126) | fn return_or_throw(result: Result<String, prqlc::ErrorMessages>) -> Opti...

FILE: prqlc/bindings/php/src/Compiler.php
  class Compiler (line 32) | final class Compiler
    method __construct (line 41) | public function __construct(?string $lib_path = null)
    method compile (line 80) | public function compile(string $prql_query, ?Options $options = null):...
    method prqlToPL (line 106) | public function prqlToPL(string $prql_query): Result
    method plToRQ (line 128) | public function plToRQ(string $pl_json): Result
    method rqToSQL (line 151) | public function rqToSQL(string $rq_json, ?Options $options = null): Re...
    method optionsInit (line 166) | private function optionsInit(?Options $options = null)
    method optionsDestroy (line 185) | private function optionsDestroy($ffi_options)
    method convertResult (line 194) | private function convertResult($ffi_res): Result
    method convertMessage (line 213) | private function convertMessage($ffi_msg): Message
    method convertSpan (line 237) | private function convertSpan($ffi_ptr): ?Span
    method convertLocation (line 250) | private function convertLocation($ffi_ptr): ?SourceLocation
    method convertNullableString (line 265) | private function convertNullableString($ffi_ptr): ?string

FILE: prqlc/bindings/php/src/Message.php
  class Message (line 10) | final class Message

FILE: prqlc/bindings/php/src/Options.php
  class Options (line 32) | final class Options

FILE: prqlc/bindings/php/src/Result.php
  class Result (line 10) | final class Result

FILE: prqlc/bindings/php/src/SourceLocation.php
  class SourceLocation (line 10) | final class SourceLocation

FILE: prqlc/bindings/php/src/Span.php
  class Span (line 11) | final class Span

FILE: prqlc/bindings/php/tests/CompilerTest.php
  class CompilerTest (line 11) | final class CompilerTest extends TestCase
    method testFfiExtensionIsLoaded (line 13) | public function testFfiExtensionIsLoaded(): void
    method testPrqlLibraryFileExists (line 18) | public function testPrqlLibraryFileExists(): void
    method testPrqlHeaderFileExists (line 27) | public function testPrqlHeaderFileExists(): void
    method testInvalidQuery (line 32) | public function testInvalidQuery(): void
    method testCompileWorks (line 40) | public function testCompileWorks(): void
    method testOtherFunctions (line 57) | public function testOtherFunctions(): void

FILE: prqlc/bindings/prqlc-c/examples/minimal-c/main.c
  function print_result (line 5) | void print_result(CompileResult res) {
  function main (line 24) | int main() {

FILE: prqlc/bindings/prqlc-c/examples/minimal-cpp/main.cpp
  function print_result (line 8) | void print_result(CompileResult res) {
  function main (line 16) | int main() {

FILE: prqlc/bindings/prqlc-c/prqlc.h
  type MessageKind (line 20) | typedef enum MessageKind {
  type Span (line 30) | typedef struct Span {
  type SourceLocation (line 38) | typedef struct SourceLocation {
  type Message (line 51) | typedef struct Message {
  type CompileResult (line 85) | typedef struct CompileResult {
  type Options (line 94) | typedef struct Options {
  type CompileResult (line 131) | struct CompileResult
  type Options (line 132) | struct Options
  type CompileResult (line 148) | struct CompileResult
  type CompileResult (line 166) | struct CompileResult
  type CompileResult (line 182) | struct CompileResult
  type Options (line 183) | struct Options
  type CompileResult (line 193) | struct CompileResult

FILE: prqlc/bindings/prqlc-c/prqlc.hpp
  type prqlc (line 18) | namespace prqlc {
    type MessageKind (line 21) | enum class MessageKind {
    type Span (line 29) | struct Span {
    type SourceLocation (line 35) | struct SourceLocation {
    type Message (line 46) | struct Message {
    type CompileResult (line 64) | struct CompileResult {
    type Options (line 71) | struct Options {

FILE: prqlc/bindings/prqlc-c/src/lib.rs
  function compile (line 26) | pub unsafe extern "C" fn compile(
  function prql_to_pl (line 59) | pub unsafe extern "C" fn prql_to_pl(prql_query: *const c_char) -> Compil...
  function pl_to_rq (line 82) | pub unsafe extern "C" fn pl_to_rq(pl_json: *const c_char) -> CompileResu...
  function rq_to_sql (line 105) | pub unsafe extern "C" fn rq_to_sql(
  type Options (line 123) | pub struct Options {
  type CompileResult (line 144) | pub struct CompileResult {
  type MessageKind (line 152) | pub enum MessageKind {
  type Message (line 164) | pub struct Message {
  type Span (line 186) | pub struct Span {
  type SourceLocation (line 194) | pub struct SourceLocation {
  function result_destroy (line 209) | pub unsafe extern "C" fn result_destroy(res: CompileResult) {
  function result_into_c_str (line 246) | unsafe fn result_into_c_str(result: Result<String, ErrorMessages>) -> Co...
  function option_to_ptr (line 279) | fn option_to_ptr<T>(o: Option<T>) -> *const T {
  function convert_string (line 289) | fn convert_string(x: String) -> *const libc::c_char {
  function convert_span (line 293) | fn convert_span(x: prqlc::Span) -> Span {
  function convert_source_location (line 300) | fn convert_source_location(x: prqlc::SourceLocation) -> SourceLocation {
  function c_str_to_string (line 309) | unsafe fn c_str_to_string(c_str: *const c_char) -> String {
  function convert_options (line 314) | fn convert_options(o: &Options) -> Result<prqlc::Options, prqlc::ErrorMe...

FILE: prqlc/bindings/prqlc-python/build.rs
  function main (line 4) | fn main() {

FILE: prqlc/bindings/prqlc-python/noxfile.py
  function _install_prqlc (line 20) | def _install_prqlc(session: Session) -> None:
  function tests (line 36) | def tests(session: Session) -> None:
  function typing (line 44) | def typing(session: Session) -> None:

FILE: prqlc/bindings/prqlc-python/python/prqlc/__init__.pyi
  class CompileOptions (line 3) | class CompileOptions:
    method __init__ (line 4) | def __init__(
  function compile (line 12) | def compile(prql_query: str, options: Optional[CompileOptions] = None) -...
  function prql_to_pl (line 13) | def prql_to_pl(prql_query: str) -> str: ...
  function pl_to_rq (line 14) | def pl_to_rq(pl_json: str) -> str: ...
  function pl_to_prql (line 15) | def pl_to_prql(pl_json: str) -> str: ...
  function rq_to_sql (line 16) | def rq_to_sql(rq_json: str) -> str: ...
  function get_targets (line 17) | def get_targets() -> List[str]: ...

FILE: prqlc/bindings/prqlc-python/python/prqlc/debug.pyi
  function prql_lineage (line 1) | def prql_lineage(prql_query: str) -> str: ...
  function pl_to_lineage (line 2) | def pl_to_lineage(pl_json: str) -> str: ...

FILE: prqlc/bindings/prqlc-python/python/tests/test_all.py
  function test_all (line 6) | def test_all() -> None:
  function test_compile_options (line 48) | def test_compile_options() -> None:
  function test_debug_functions (line 87) | def test_debug_functions() -> None:

FILE: prqlc/bindings/prqlc-python/src/lib.rs
  function compile (line 9) | pub fn compile(prql_query: &str, options: Option<CompileOptions>) -> PyR...
  function prql_to_pl (line 21) | pub fn prql_to_pl(prql_query: &str) -> PyResult<String> {
  function pl_to_prql (line 28) | pub fn pl_to_prql(pl_json: &str) -> PyResult<String> {
  function pl_to_rq (line 35) | pub fn pl_to_rq(pl_json: &str) -> PyResult<String> {
  function rq_to_sql (line 44) | pub fn rq_to_sql(rq_json: &str, options: Option<CompileOptions>) -> PyRe...
  function prql_lineage (line 62) | pub fn prql_lineage(prql_query: &str) -> PyResult<String> {
  function pl_to_lineage (line 70) | pub fn pl_to_lineage(pl_json: &str) -> PyResult<String> {
  function prqlc (line 79) | fn prqlc(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
  type CompileOptions (line 104) | pub struct CompileOptions {
    method new (line 131) | pub fn new(
  function convert_options (line 148) | fn convert_options(o: CompileOptions) -> Result<prqlc_lib::Options, prql...
  function get_targets (line 164) | pub fn get_targets() -> Vec<String> {
  function parse_for_python (line 175) | fn parse_for_python() {
  function parse_pipeline (line 198) | fn parse_pipeline() {
  function prql_pl_prql_roundtrip (line 221) | fn prql_pl_prql_roundtrip() {
  function debug_prql_lineage (line 232) | fn debug_prql_lineage() {
  function debug_pl_to_lineage (line 240) | fn debug_pl_to_lineage() {

FILE: prqlc/prqlc-macros/src/lib.rs
  function prql_to_sql (line 16) | pub fn prql_to_sql(input: TokenStream) -> TokenStream {

FILE: prqlc/prqlc-parser/src/error.rs
  type Error (line 9) | pub struct Error {
    method new (line 74) | pub fn new(reason: Reason) -> Self {
    method new_simple (line 85) | pub fn new_simple<S: ToString>(reason: S) -> Self {
    method new_bug (line 89) | pub fn new_bug(issue_no: i32) -> Self {
    method new_assert (line 97) | pub fn new_assert<S: ToString>(details: S) -> Self {
    method fmt (line 155) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type ErrorSource (line 21) | pub enum ErrorSource {
  type Errors (line 35) | pub struct Errors(pub Vec<Error>);
    method from (line 142) | fn from(error: Error) -> Self {
    method fmt (line 162) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type MessageKind (line 39) | pub enum MessageKind {
  type Reason (line 46) | pub enum Reason {
    method fmt (line 106) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type WithErrorInfo (line 167) | pub trait WithErrorInfo: Sized {
    method push_hint (line 168) | fn push_hint<S: Into<String>>(self, hint: S) -> Self;
    method with_hints (line 170) | fn with_hints<S: Into<String>, I: IntoIterator<Item = S>>(self, hints:...
    method with_span (line 172) | fn with_span(self, span: Option<Span>) -> Self;
    method with_span_fallback (line 174) | fn with_span_fallback(self, span: Option<Span>) -> Self;
    method with_code (line 176) | fn with_code(self, code: &'static str) -> Self;
    method with_source (line 178) | fn with_source(self, source: ErrorSource) -> Self;
    method push_hint (line 182) | fn push_hint<S: Into<String>>(mut self, hint: S) -> Self {
    method with_hints (line 187) | fn with_hints<S: Into<String>, I: IntoIterator<Item = S>>(mut self, hi...
    method with_span (line 192) | fn with_span(mut self, span: Option<Span>) -> Self {
    method with_code (line 197) | fn with_code(mut self, code: &'static str) -> Self {
    method with_span_fallback (line 202) | fn with_span_fallback(mut self, span: Option<Span>) -> Self {
    method with_source (line 207) | fn with_source(self, _source: ErrorSource) -> Self {
    method push_hint (line 214) | fn push_hint<S: Into<String>>(self, hint: S) -> Self {
    method with_hints (line 218) | fn with_hints<S: Into<String>, I: IntoIterator<Item = S>>(self, hints:...
    method with_span (line 222) | fn with_span(self, span: Option<Span>) -> Self {
    method with_span_fallback (line 226) | fn with_span_fallback(self, span: Option<Span>) -> Self {
    method with_code (line 230) | fn with_code(self, code: &'static str) -> Self {
    method with_source (line 234) | fn with_source(self, source: ErrorSource) -> Self {

FILE: prqlc/prqlc-parser/src/generic.rs
  type Range (line 13) | pub struct Range<T> {
  function unbounded (line 19) | pub const fn unbounded() -> Self {
  function try_map (line 26) | pub fn try_map<U, E, F: Fn(T) -> Result<U, E>>(self, f: F) -> Result<Ran...
  function map (line 33) | pub fn map<U, F: Fn(T) -> U>(self, f: F) -> Range<U> {
  type InterpolateItem (line 42) | pub enum InterpolateItem<T> {
  function map (line 51) | pub fn map<U, F: Fn(T) -> U>(self, f: F) -> InterpolateItem<U> {
  function try_map (line 61) | pub fn try_map<U, E, F: Fn(T) -> Result<U, E>>(self, f: F) -> Result<Int...
  type SwitchCase (line 73) | pub struct SwitchCase<T> {

FILE: prqlc/prqlc-parser/src/lexer/lr.rs
  type Tokens (line 7) | pub struct Tokens(pub Vec<Token>);
  type Token (line 10) | pub struct Token {
    method fmt (line 269) | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
  type TokenKind (line 16) | pub enum TokenKind {
    method range (line 95) | pub fn range(bind_left: bool, bind_right: bool) -> Self {
    method hash (line 199) | fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
    method fmt (line 207) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type Literal (line 81) | pub enum Literal {
    method fmt (line 110) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type ValueAndUnit (line 104) | pub struct ValueAndUnit {
  function quote_string (line 140) | fn quote_string(s: &str) -> String {
  function escape_all_except_quotes (line 181) | fn escape_all_except_quotes(s: &str) -> String {
  function test_string_quoting (line 281) | fn test_string_quoting() {
  function test_string_escapes (line 319) | fn test_string_escapes() {
  function test_raw_string_quoting (line 353) | fn test_raw_string_quoting() {

FILE: prqlc/prqlc-parser/src/lexer/mod.rs
  type E (line 16) | type E = Error;
  type ParserInput (line 17) | type ParserInput<'a> = &'a str;
  type ParserError (line 18) | type ParserError<'a> = extra::Err<Simple<'a, char>>;
  function convert_lexer_error (line 21) | fn convert_lexer_error(source: &str, error: &Simple<'_, char>, source_id...
  function lex_source_recovery (line 67) | pub fn lex_source_recovery(source: &str, source_id: u16) -> (Option<Vec<...
  function lex_source (line 85) | pub fn lex_source(source: &str) -> Result<Tokens, Vec<E>> {
  function insert_start (line 103) | fn insert_start(tokens: Vec<Token>) -> Vec<Token> {
  function lexer (line 113) | pub fn lexer<'a>() -> impl Parser<'a, ParserInput<'a>, Vec<Token>, Parse...
  function lex_token (line 121) | fn lex_token<'a>() -> impl Parser<'a, ParserInput<'a>, Token, ParserErro...
  function token (line 157) | fn token<'a>() -> impl Parser<'a, ParserInput<'a>, TokenKind, ParserErro...
  function multi_char_operators (line 178) | fn multi_char_operators<'a>() -> impl Parser<'a, ParserInput<'a>, TokenK...
  function keyword (line 195) | fn keyword<'a>() -> impl Parser<'a, ParserInput<'a>, TokenKind, ParserEr...
  function param (line 213) | fn param<'a>() -> impl Parser<'a, ParserInput<'a>, TokenKind, ParserErro...
  function interpolation (line 225) | fn interpolation<'a>() -> impl Parser<'a, ParserInput<'a>, TokenKind, Pa...
  function whitespace (line 240) | fn whitespace<'a>() -> impl Parser<'a, ParserInput<'a>, (), ParserError<...
  function newline (line 245) | fn newline<'a>() -> impl Parser<'a, ParserInput<'a>, (), ParserError<'a>> {
  function line_wrap (line 251) | fn line_wrap<'a>() -> impl Parser<'a, ParserInput<'a>, TokenKind, Parser...
  function comment (line 266) | fn comment<'a>() -> impl Parser<'a, ParserInput<'a>, TokenKind, ParserEr...
  function ident_part (line 280) | pub fn ident_part<'a>() -> impl Parser<'a, ParserInput<'a>, String, Pars...
  function digits (line 304) | fn digits<'a>(count: usize) -> impl Parser<'a, ParserInput<'a>, &'a str,...
  function date_inner (line 308) | fn date_inner<'a>() -> impl Parser<'a, ParserInput<'a>, String, ParserEr...
  function time_inner (line 322) | fn time_inner<'a>() -> impl Parser<'a, ParserInput<'a>, String, ParserEr...
  function date_token (line 378) | fn date_token<'a>() -> impl Parser<'a, ParserInput<'a>, TokenKind, Parse...
  function literal (line 402) | pub fn literal<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, Parser...
  function parse_number_with_base (line 417) | fn parse_number_with_base<'a>(
  function binary_number (line 440) | fn binary_number<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, Pars...
  function hexadecimal_number (line 444) | fn hexadecimal_number<'a>() -> impl Parser<'a, ParserInput<'a>, Literal,...
  function octal_number (line 448) | fn octal_number<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, Parse...
  function number (line 452) | fn number<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, ParserError...
  function parse_integer (line 518) | fn parse_integer<'a>() -> impl Parser<'a, ParserInput<'a>, &'a str, Pars...
  function string (line 533) | fn string<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, ParserError...
  function raw_string (line 537) | fn raw_string<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, ParserE...
  function boolean (line 554) | fn boolean<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, ParserErro...
  function null (line 560) | fn null<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, ParserError<'...
  function value_and_unit (line 564) | fn value_and_unit<'a>() -> impl Parser<'a, ParserInput<'a>, Literal, Par...
  function quoted_string (line 591) | pub fn quoted_string<'a>(
  function parse_escape_sequence (line 603) | fn parse_escape_sequence<'a>(
  function multi_quoted_string (line 669) | fn multi_quoted_string<'a>(
  function end_expr (line 748) | fn end_expr<'a>() -> impl Parser<'a, ParserInput<'a>, (), ParserError<'a...

FILE: prqlc/prqlc-parser/src/lexer/test.rs
  function line_wrap (line 12) | fn line_wrap() {
  function numbers (line 57) | fn numbers() {
  function debug_display (line 75) | fn debug_display() {
  function comment (line 92) | fn comment() {
  function doc_comment (line 114) | fn doc_comment() {
  function quotes (line 130) | fn quotes() {
  function interpolated_strings (line 158) | fn interpolated_strings() {
  function timestamp_tests (line 193) | fn timestamp_tests() {
  function range (line 219) | fn range() {
  function test_lex_source (line 267) | fn test_lex_source() {
  function test_annotation_tokens (line 288) | fn test_annotation_tokens() {
  function test_issue_triple_quoted_with_double_quote (line 346) | fn test_issue_triple_quoted_with_double_quote() {
  function test_single_curly_quote (line 371) | fn test_single_curly_quote() {
  function test_mississippi_curly_quotes (line 409) | fn test_mississippi_curly_quotes() {
  function test_interpolation_empty (line 459) | fn test_interpolation_empty() {

FILE: prqlc/prqlc-parser/src/parser/expr.rs
  function expr_call (line 20) | pub(crate) fn expr_call<'a, I>() -> impl Parser<'a, I, Expr, ParserError...
  function expr (line 34) | pub(crate) fn expr<'a, I>() -> impl Parser<'a, I, Expr, ParserError<'a>>...
  function tuple (line 176) | fn tuple<'a, I>(
  function array (line 199) | fn array<'a, I>(
  function interpolation (line 222) | fn interpolation<'a, I>() -> impl Parser<'a, I, ExprKind, ParserError<'a...
  function case (line 249) | fn case<'a, I>(
  function unary (line 267) | fn unary<'a, I, E>(expr: E) -> impl Parser<'a, I, Expr, ParserError<'a>>...
  function range (line 280) | fn range<'a, I, E>(expr: E) -> impl Parser<'a, I, Expr, ParserError<'a>>...
  function pipeline (line 340) | pub(crate) fn pipeline<'a, I, E>(expr: E) -> impl Parser<'a, I, Expr, Pa...
  function aliased (line 373) | fn aliased<'a, I, E>(expr: E) -> impl Parser<'a, I, Expr, ParserError<'a...
  function maybe_aliased (line 392) | fn maybe_aliased<'a, I, E>(expr: E) -> impl Parser<'a, I, Expr, ParserEr...
  function func_call (line 414) | fn func_call<'a, I, E>(expr: E) -> impl Parser<'a, I, Expr, ParserError<...
  function lambda_func (line 485) | fn lambda_func<'a, I, E>(expr: E) -> impl Parser<'a, I, Expr, ParserErro...
  function ident (line 536) | pub(crate) fn ident<'a, I>() -> impl Parser<'a, I, Ident, ParserError<'a...
  function operator_unary (line 551) | fn operator_unary<'a, I>() -> impl Parser<'a, I, UnOp, ParserError<'a>> ...
  function operator_pow (line 560) | fn operator_pow<'a, I>() -> impl Parser<'a, I, BinOp, ParserError<'a>> +...
  function operator_mul (line 566) | fn operator_mul<'a, I>() -> impl Parser<'a, I, BinOp, ParserError<'a>> +...
  function operator_add (line 575) | fn operator_add<'a, I>() -> impl Parser<'a, I, BinOp, ParserError<'a>> +...
  function operator_compare (line 581) | fn operator_compare<'a, I>() -> impl Parser<'a, I, BinOp, ParserError<'a...
  function operator_and (line 595) | fn operator_and<'a, I>() -> impl Parser<'a, I, BinOp, ParserError<'a>> +...
  function operator_or (line 601) | fn operator_or<'a, I>() -> impl Parser<'a, I, BinOp, ParserError<'a>> + ...
  function operator_coalesce (line 607) | fn operator_coalesce<'a, I>() -> impl Parser<'a, I, BinOp, ParserError<'...
  function parse_expr_call (line 621) | fn parse_expr_call(source: &str) -> Result<Expr, Vec<Error>> {
  function parse_tuple (line 633) | fn parse_tuple(source: &str) -> Result<Expr, Vec<Error>> {
  function parse_any_expr (line 646) | fn parse_any_expr(source: &str) -> Result<Expr, Vec<Error>> {
  function parse_pipeline (line 656) | fn parse_pipeline(source: &str) -> Result<Expr, Vec<Error>> {
  function parse_case (line 668) | fn parse_case(source: &str) -> Result<Expr, Vec<Error>> {
  function parse_expr_call_complete (line 681) | fn parse_expr_call_complete(source: &str) -> Result<Expr, Vec<Error>> {
  function test_expr_call (line 693) | fn test_expr_call() {
  function test_tuple (line 738) | fn test_tuple() {
  function test_expr (line 802) | fn test_expr() {
  function test_pipeline (line 821) | fn test_pipeline() {
  function test_case (line 858) | fn test_case() {
  function should_error_01 (line 900) | fn should_error_01() {
  function tuple_missing_comma (line 908) | fn tuple_missing_comma() {
  function args_in_parens (line 934) | fn args_in_parens() {
  function pipeline_starting_with_alias_expr (line 994) | fn pipeline_starting_with_alias_expr() {

FILE: prqlc/prqlc-parser/src/parser/interpolation.rs
  function parse (line 9) | pub(crate) fn parse(string: String, span_base: Span) -> Result<Vec<Inter...
  function interpolated_parser (line 97) | fn interpolated_parser<'a, I>(
  function interpolate_ident_part (line 141) | pub(crate) fn interpolate_ident_part<'a, I>(
  function parse_interpolate (line 167) | fn parse_interpolate() {

FILE: prqlc/prqlc-parser/src/parser/mod.rs
  type ParserError (line 13) | pub(crate) type ParserError<'a> = extra::Err<Rich<'a, lr::Token, Span>>;
  function parse_lr_to_pr (line 27) | pub fn parse_lr_to_pr(source_id: u16, lr: Vec<lr::Token>) -> (Option<Vec...
  function ident_part (line 72) | fn ident_part<'a, I>() -> impl Parser<'a, I, String, ParserError<'a>> + ...
  function keyword (line 81) | fn keyword<'a, I>(kw: &'static str) -> impl Parser<'a, I, (), ParserErro...
  function new_line (line 94) | pub(crate) fn new_line<'a, I>() -> impl Parser<'a, I, (), ParserError<'a...
  function ctrl (line 105) | fn ctrl<'a, I>(char: char) -> impl Parser<'a, I, (), ParserError<'a>> + ...
  function into_stmt (line 114) | fn into_stmt((annotations, kind): (Vec<Annotation>, StmtKind), span: Spa...
  function doc_comment (line 123) | fn doc_comment<'a, I>() -> impl Parser<'a, I, String, ParserError<'a>> +...
  function with_doc_comment (line 142) | fn with_doc_comment<'a, I, P, O>(parser: P) -> impl Parser<'a, I, O, Par...
  type SupportsDocComment (line 159) | trait SupportsDocComment {
    method with_doc_comment (line 160) | fn with_doc_comment(self, doc_comment: Option<String>) -> Self;
    method with_doc_comment (line 269) | fn with_doc_comment(self, _doc_comment: Option<String>) -> Self {
  function sequence (line 165) | fn sequence<'a, I, P, O>(parser: P) -> impl Parser<'a, I, Vec<O>, Parser...
  function pipe (line 189) | fn pipe<'a, I>() -> impl Parser<'a, I, (), ParserError<'a>> + Clone
  function parse_doc_comment (line 205) | fn parse_doc_comment(source: &str) -> Result<String, Vec<Error>> {
  function test_doc_comment (line 253) | fn test_doc_comment() {

FILE: prqlc/prqlc-parser/src/parser/perror.rs
  function rich_error_to_error (line 10) | fn rich_error_to_error<T>(
  method from (line 86) | fn from(rich: Rich<'a, crate::lexer::lr::Token, Span>) -> Error {
  method from (line 97) | fn from(rich: Rich<'a, TokenKind, Span>) -> Error {
  function simple_error (line 114) | fn simple_error(message: &str) -> Error {
  function test_error_messages (line 119) | fn test_error_messages() {

FILE: prqlc/prqlc-parser/src/parser/pr/expr.rs
  type Expr (line 29) | pub struct Expr {
    method new (line 14) | pub fn new<K: Into<ExprKind>>(kind: K) -> Self {
  method with_doc_comment (line 44) | fn with_doc_comment(self, doc_comment: Option<String>) -> Self {
  type ExprKind (line 55) | pub enum ExprKind {
    method into_expr (line 86) | pub fn into_expr(self, span: Span) -> Expr {
    method from (line 173) | fn from(value: Literal) -> Self {
    method from (line 179) | fn from(value: Func) -> Self {
  type IndirectionKind (line 97) | pub enum IndirectionKind {
  type BinaryExpr (line 105) | pub struct BinaryExpr {
  type UnaryExpr (line 113) | pub struct UnaryExpr {
  type FuncCall (line 120) | pub struct FuncCall {
  type Func (line 130) | pub struct Func {
  type FuncParam (line 145) | pub struct FuncParam {
  type GenericTypeParam (line 155) | pub struct GenericTypeParam {
  type Pipeline (line 164) | pub struct Pipeline {
  type Range (line 168) | pub type Range = generic::Range<Box<Expr>>;
  type InterpolateItem (line 169) | pub type InterpolateItem = generic::InterpolateItem<Expr>;
  type SwitchCase (line 170) | pub type SwitchCase = generic::SwitchCase<Box<Expr>>;

FILE: prqlc/prqlc-parser/src/parser/pr/ident.rs
  type Ident (line 9) | pub struct Ident {
    method from_name (line 15) | pub fn from_name<S: ToString>(name: S) -> Self {
    method from_path (line 25) | pub fn from_path<S: ToString>(mut path: Vec<S>) -> Self {
    method len (line 33) | pub fn len(&self) -> usize {
    method is_empty (line 37) | pub fn is_empty(&self) -> bool {
    method pop (line 43) | pub fn pop(self) -> Option<Self> {
    method pop_front (line 48) | pub fn pop_front(mut self) -> (String, Option<Ident>) {
    method prepend (line 57) | pub fn prepend(self, mut parts: Vec<String>) -> Ident {
    method push (line 62) | pub fn push(&mut self, name: String) {
    method with_name (line 67) | pub fn with_name<S: ToString>(mut self, name: S) -> Self {
    method iter (line 72) | pub fn iter(&self) -> impl Iterator<Item = &String> {
    method starts_with (line 76) | pub fn starts_with(&self, prefix: &Ident) -> bool {
    method starts_with_path (line 86) | pub fn starts_with_path<S: AsRef<str>>(&self, prefix: &[S]) -> bool {
    method starts_with_part (line 97) | pub fn starts_with_part(&self, prefix: &str) -> bool {
    method fmt (line 103) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    method fmt (line 112) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    type Output (line 130) | type Output = Ident;
    method add (line 132) | fn add(self, rhs: Ident) -> Self::Output {
    method deserialize (line 155) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  type Item (line 118) | type Item = String;
  type IntoIter (line 119) | type IntoIter = std::iter::Chain<
  method into_iter (line 124) | fn into_iter(self) -> Self::IntoIter {
  method serialize (line 141) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  function display_ident (line 163) | pub fn display_ident(f: &mut std::fmt::Formatter, ident: &Ident) -> Resu...
  function display_ident_part (line 174) | pub fn display_ident_part(f: &mut std::fmt::Formatter, s: &str) -> Resul...

FILE: prqlc/prqlc-parser/src/parser/pr/ops.rs
  type UnOp (line 17) | pub enum UnOp {
  type BinOp (line 41) | pub enum BinOp {

FILE: prqlc/prqlc-parser/src/parser/pr/stmt.rs
  type QueryDef (line 14) | pub struct QueryDef {
  type VarDefKind (line 22) | pub enum VarDefKind {
  type Stmt (line 29) | pub struct Stmt {
    method new (line 94) | pub fn new(kind: StmtKind) -> Stmt {
  method with_doc_comment (line 43) | fn with_doc_comment(self, doc_comment: Option<String>) -> Self {
  type StmtKind (line 52) | pub enum StmtKind {
  type VarDef (line 61) | pub struct VarDef {
  type TypeDef (line 71) | pub struct TypeDef {
  type ModuleDef (line 77) | pub struct ModuleDef {
  type ImportDef (line 83) | pub struct ImportDef {
  type Annotation (line 89) | pub struct Annotation {

FILE: prqlc/prqlc-parser/src/parser/pr/types.rs
  type Ty (line 10) | pub struct Ty {
    method new (line 95) | pub fn new<K: Into<TyKind>>(kind: K) -> Ty {
    method relation (line 103) | pub fn relation(tuple_fields: Vec<TyTupleField>) -> Self {
    method as_relation (line 108) | pub fn as_relation(&self) -> Option<&Vec<TyTupleField>> {
    method as_relation_mut (line 112) | pub fn as_relation_mut(&mut self) -> Option<&mut Vec<TyTupleField>> {
    method into_relation (line 116) | pub fn into_relation(self) -> Option<Vec<TyTupleField>> {
    method is_relation (line 120) | pub fn is_relation(&self) -> bool {
  type TyKind (line 20) | pub enum TyKind {
    method into_ty (line 38) | pub fn into_ty(self: TyKind, span: Span) -> Ty {
    method from (line 140) | fn from(value: PrimitiveSet) -> Self {
    method from (line 146) | fn from(value: TyFunc) -> Self {
  type TyTupleField (line 48) | pub enum TyTupleField {
    method ty (line 131) | pub fn ty(&self) -> Option<&Ty> {
  type PrimitiveSet (line 69) | pub enum PrimitiveSet {
  type TyFunc (line 88) | pub struct TyFunc {

FILE: prqlc/prqlc-parser/src/parser/stmt.rs
  function source (line 20) | pub fn source<'a, I>() -> impl Parser<'a, I, Vec<Stmt>, ParserError<'a>>...
  function module_contents (line 39) | fn module_contents<'a, I>() -> impl Parser<'a, I, Vec<Stmt>, ParserError...
  function query_def (line 96) | fn query_def<'a, I>() -> impl Parser<'a, I, Stmt, ParserError<'a>> + Clone
  function var_def (line 174) | fn var_def<'a, I>() -> impl Parser<'a, I, StmtKind, ParserError<'a>> + C...
  function type_def (line 224) | fn type_def<'a, I>() -> impl Parser<'a, I, StmtKind, ParserError<'a>> + ...
  function import_def (line 235) | fn import_def<'a, I>() -> impl Parser<'a, I, StmtKind, ParserError<'a>> ...
  function parse_module_contents (line 254) | fn parse_module_contents(source: &str) -> Result<Vec<Stmt>, Vec<Error>> {
  function parse_var_def (line 263) | fn parse_var_def(source: &str) -> Result<StmtKind, Vec<Error>> {
  function parse_module_contents_complete (line 272) | fn parse_module_contents_complete(source: &str) -> Result<Vec<Stmt>, Vec...
  function test_module_contents (line 277) | fn test_module_contents() {
  function into (line 303) | fn into() {
  function let_into (line 345) | fn let_into() {
  function test_module (line 382) | fn test_module() {
  function test_module_def (line 437) | fn test_module_def() {
  function doc_comment_module (line 487) | fn doc_comment_module() {
  function doc_comment_inline_module (line 559) | fn doc_comment_inline_module() {
  function lambdas (line 592) | fn lambdas() {

FILE: prqlc/prqlc-parser/src/parser/test.rs
  function parse_expr (line 62) | fn parse_expr(source: &str) -> Result<Expr, Vec<Error>> {
  function test_ranges (line 73) | fn test_ranges() {
  function test_basic_exprs (line 211) | fn test_basic_exprs() {
  function test_string (line 400) | fn test_string() {
  function test_s_string (line 479) | fn test_s_string() {
  function test_s_string_braces (line 508) | fn test_s_string_braces() {
  function test_tuple (line 523) | fn test_tuple() {
  function test_number (line 657) | fn test_number() {
  function test_derive (line 709) | fn test_derive() {
  function test_select (line 738) | fn test_select() {
  function test_expr (line 797) | fn test_expr() {
  function test_regex (line 881) | fn test_regex() {
  function test_func_call (line 902) | fn test_func_call() {
  function test_right_assoc (line 962) | fn test_right_assoc() {
  function test_op_precedence (line 1024) | fn test_op_precedence() {
  function test_inline_pipeline (line 1196) | fn test_inline_pipeline() {
  function test_dates (line 1218) | fn test_dates() {
  function test_ident_with_keywords (line 1244) | fn test_ident_with_keywords() {
  function test_params (line 1284) | fn test_params() {
  function test_lookup_01 (line 1297) | fn test_lookup_01() {
  function test_lookup_02 (line 1314) | fn test_lookup_02() {

FILE: prqlc/prqlc-parser/src/parser/types.rs
  function type_expr (line 12) | pub(crate) fn type_expr<'a, I>() -> impl Parser<'a, I, Ty, ParserError<'...

FILE: prqlc/prqlc-parser/src/span.rs
  type Span (line 10) | pub struct Span {
    type Context (line 20) | type Context = u16;
    type Offset (line 21) | type Offset = usize;
    method new (line 23) | fn new(context: Self::Context, range: Range<Self::Offset>) -> Self {
    method context (line 31) | fn context(&self) -> Self::Context {
    method start (line 35) | fn start(&self) -> Self::Offset {
    method end (line 39) | fn end(&self) -> Self::Offset {
    method to_end (line 43) | fn to_end(&self) -> Self {
    method deserialize (line 88) | fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
    type Output (line 144) | type Output = Span;
    method add (line 146) | fn add(self, rhs: usize) -> Span {
    type Output (line 156) | type Output = Span;
    method sub (line 158) | fn sub(self, rhs: usize) -> Span {
  function from (line 53) | fn from(a: Span) -> Self {
  method fmt (line 59) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
  method serialize (line 65) | fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::E...
  method partial_cmp (line 75) | fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
  function test_span_serde (line 172) | fn test_span_serde() {
  function test_span_partial_cmp (line 185) | fn test_span_partial_cmp() {

FILE: prqlc/prqlc-parser/src/test.rs
  function parse_source (line 11) | pub(crate) fn parse_source(source: &str) -> Result<Vec<Stmt>, Vec<Error>> {
  function test_error_unicode_string (line 59) | fn test_error_unicode_string() {
  function test_error_unexpected (line 107) | fn test_error_unexpected() {
  function test_pipeline_parse_tree (line 128) | fn test_pipeline_parse_tree() {
  function test_take (line 158) | fn test_take() {
  function test_filter (line 228) | fn test_filter() {
  function test_aggregate (line 294) | fn test_aggregate() {
  function test_basic_exprs (line 391) | fn test_basic_exprs() {
  function test_function (line 416) | fn test_function() {
  function test_var_def (line 719) | fn test_var_def() {
  function test_inline_pipeline (line 895) | fn test_inline_pipeline() {
  function test_sql_parameters (line 930) | fn test_sql_parameters() {
  function test_tab_characters (line 989) | fn test_tab_characters() {
  function test_backticks (line 1003) | fn test_backticks() {
  function test_sort (line 1093) | fn test_sort() {
  function test_dates (line 1202) | fn test_dates() {
  function test_multiline_string (line 1252) | fn test_multiline_string() {
  function test_empty_lines (line 1276) | fn test_empty_lines() {
  function test_coalesce (line 1319) | fn test_coalesce() {
  function test_literal (line 1365) | fn test_literal() {
  function test_allowed_idents (line 1389) | fn test_allowed_idents() {
  function test_gt_lt_gte_lte (line 1465) | fn test_gt_lt_gte_lte() {
  function test_assign (line 1567) | fn test_assign() {
  function test_unicode (line 1612) | fn test_unicode() {
  function test_var_defs (line 1634) | fn test_var_defs() {
  function test_array (line 1679) | fn test_array() {
  function test_annotation (line 1714) | fn test_annotation() {
  function check_valid_version (line 1791) | fn check_valid_version() {
  function check_invalid_version (line 1821) | fn check_invalid_version() {
  function test_target (line 1830) | fn test_target() {
  function test_number (line 1877) | fn test_number() {
  function doc_comment (line 1888) | fn doc_comment() {

FILE: prqlc/prqlc/benches/bench.rs
  function main (line 6) | fn main() {}

FILE: prqlc/prqlc/benches/bench_impl.rs
  type Queries (line 7) | type Queries = BTreeMap<String, String>;
  function load_queries (line 9) | fn load_queries() -> Queries {
  function bench_compile (line 21) | fn bench_compile(c: &mut Criterion) {
  function bench_prql_to_pl (line 34) | fn bench_prql_to_pl(c: &mut Criterion) {
  function bench_pl_to_rq (line 46) | fn bench_pl_to_rq(c: &mut Criterion) {
  function bench_pl_to_prql (line 59) | fn bench_pl_to_prql(c: &mut Criterion) {

FILE: prqlc/prqlc/build.rs
  function main (line 7) | pub fn main() -> Result<(), Box<dyn Error>> {

FILE: prqlc/prqlc/examples/compile-files/build.rs
  function main (line 5) | fn main() {

FILE: prqlc/prqlc/examples/compile-files/src/main.rs
  function main (line 9) | fn main() {

FILE: prqlc/prqlc/src/cli/docs_generator.rs
  function generate_html_docs (line 4) | pub fn generate_html_docs(stmts: Vec<Stmt>) -> String {
  function generate_markdown_docs (line 175) | pub fn generate_markdown_docs(stmts: Vec<Stmt>) -> String {
  function generate_html_docs (line 319) | fn generate_html_docs() {
  function generate_markdown_docs (line 434) | fn generate_markdown_docs() {
  function prqlc_command (line 512) | fn prqlc_command() -> Command {
  function normalize_prqlc (line 518) | fn normalize_prqlc(cmd: &mut Command) -> &mut Command {

FILE: prqlc/prqlc/src/cli/highlight.rs
  function highlight (line 8) | pub(crate) fn highlight(tokens: &Tokens) -> String {
  function highlight_token_kind (line 22) | fn highlight_token_kind(token: &TokenKind) -> String {
  function is_transform (line 85) | fn is_transform(ident: &str) -> bool {
  function highlight (line 112) | fn highlight() {
  function prqlc_command (line 143) | fn prqlc_command() -> Command {
  function normalize_prqlc (line 149) | fn normalize_prqlc(cmd: &mut Command) -> &mut Command {

FILE: prqlc/prqlc/src/cli/jinja.rs
  constant ANCHOR_PREFIX (line 27) | const ANCHOR_PREFIX: &str = "_jinja_";
  type JinjaBlock (line 30) | pub enum JinjaBlock<'a> {
  type JinjaContext (line 36) | pub struct JinjaContext<'a> {
  function pre_process (line 43) | pub fn pre_process(source: &str) -> Result<(String, JinjaContext<'_>)> {
  function find_span (line 94) | fn find_span(source: &str, spans: Vec<Span>) -> &str {
  function post_process (line 123) | pub fn post_process(source: &str, context: JinjaContext) -> String {
  function test_find_span (line 154) | fn test_find_span() {
  function test_pre_process (line 188) | fn test_pre_process() {
  function test_post_process (line 196) | fn test_post_process() {
  function test_config_interpolation (line 204) | fn test_config_interpolation() {

FILE: prqlc/prqlc/src/cli/lsp.rs
  function run (line 10) | pub fn run() -> Result<(), Box<dyn Error + Sync + Send>> {
  function main_loop (line 41) | fn main_loop(
  function cast (line 85) | fn cast<R>(req: Request) -> Result<(RequestId, R::Params), ExtractError<...

FILE: prqlc/prqlc/src/cli/mod.rs
  function main (line 45) | pub fn main() -> color_eyre::eyre::Result<()> {
  type Cli (line 87) | struct Cli {
  function compiler_version_str (line 97) | pub fn compiler_version_str() -> &'static str {
  type Command (line 104) | enum Command {
    method run (line 291) | pub fn run(&mut self) -> Result<()> {
    method list_targets (line 350) | fn list_targets(&self) -> std::result::Result<(), anyhow::Error> {
    method run_io_command (line 355) | fn run_io_command(&mut self) -> std::result::Result<(), anyhow::Error> {
    method execute (line 362) | fn execute<'a>(&self, sources: &'a mut SourceTree, main_path: &'a str)...
    method read_input (line 488) | fn read_input(&mut self) -> Result<(SourceTree, String)> {
    method write_output (line 528) | fn write_output(&mut self, data: &[u8]) -> std::io::Result<()> {
  type DebugCommand (line 184) | enum DebugCommand {
  type ExperimentalCommand (line 242) | enum ExperimentalCommand {
  type IoArgs (line 258) | pub struct IoArgs {
  type DocsFormat (line 271) | enum DocsFormat {
  type Format (line 277) | enum Format {
  type IntermediateRepr (line 283) | enum IntermediateRepr {
  function has_debug_log (line 548) | fn has_debug_log(cli: &Cli) -> bool {
  function write_log (line 558) | pub fn write_log(path: &std::path::Path) -> Result<()> {
  function drop_module_def (line 582) | fn drop_module_def(stmts: &mut Vec<pr::Stmt>, name: &str) {
  function read_files (line 586) | fn read_files(input: &mut clio::ClioPath) -> Result<SourceTree> {
  function combine_prql_and_frames (line 602) | fn combine_prql_and_frames(source: &str, frames: Vec<(Option<pr::Span>, ...
  function layouts (line 661) | fn layouts() {
  function compile_bad (line 689) | fn compile_bad() {
  function compile (line 716) | fn compile() {
  function parse (line 754) | fn parse() {
  function lex (line 799) | fn lex() {
  function lex_nested_enum (line 840) | fn lex_nested_enum() {

FILE: prqlc/prqlc/src/cli/test.rs
  function help (line 15) | fn help() {
  function get_targets (line 75) | fn get_targets() {
  function compile (line 99) | fn compile() {
  function compile_help (line 117) | fn compile_help() {
  function long_query (line 170) | fn long_query() {
  function compile_project (line 269) | fn compile_project() {
  function format (line 359) | fn format() {
  function copy_dir (line 389) | fn copy_dir(src: &Path, dst: &Path) {
  function compare_directories (line 402) | fn compare_directories(dir1: &Path, dir2: &Path) {
  function debug (line 423) | fn debug() {
  function debug_json_schema (line 548) | fn debug_json_schema() {
  function shell_completion (line 570) | fn shell_completion() {
  function project_path (line 576) | fn project_path() -> PathBuf {
  function prqlc_command (line 585) | fn prqlc_command() -> Command {
  function normalize_prqlc (line 591) | fn normalize_prqlc(cmd: &mut Command) -> &mut Command {
  function compile_no_prql_files (line 605) | fn compile_no_prql_files() {
  function lex (line 617) | fn lex() {
  function lsp (line 675) | fn lsp() {

FILE: prqlc/prqlc/src/cli/watch.rs
  type WatchArgs (line 13) | pub struct WatchArgs {
  function run (line 24) | pub fn run(command: &mut WatchArgs) -> Result<()> {
  function find_and_compile (line 42) | fn find_and_compile(path: &Path, opt: &prqlc::Options) -> Result<()> {
  function watch_and_compile (line 50) | fn watch_and_compile(path: &Path, opt: &prqlc::Options) -> Result<()> {
  function compile_path (line 96) | fn compile_path(path: &Path, opt: &prqlc::Options) -> Result<()> {

FILE: prqlc/prqlc/src/codegen/ast.rs
  function write_expr (line 11) | pub(crate) fn write_expr(expr: &pr::Expr) -> String {
  function write_within (line 15) | fn write_within<T: WriteSource>(
  method write (line 27) | fn write(&self, mut opt: WriteOpt) -> Option<String> {
  function needs_parenthesis (line 51) | fn needs_parenthesis(this: &pr::Expr, opt: &WriteOpt) -> bool {
  method write (line 90) | fn write(&self, mut opt: WriteOpt) -> Option<String> {
  function break_line_within_parenthesis (line 235) | fn break_line_within_parenthesis<T: WriteSource>(expr: &T, mut opt: Writ...
  function binding_strength (line 248) | fn binding_strength(expr: &pr::ExprKind) -> u8 {
  function associativity (line 288) | fn associativity(expr: &pr::ExprKind) -> super::Position {
  function can_bind_left (line 307) | fn can_bind_left(expr: &pr::ExprKind) -> bool {
  method write (line 318) | fn write(&self, mut opt: WriteOpt) -> Option<String> {
  function keywords (line 332) | fn keywords() -> &'static HashSet<&'static str> {
  function valid_prql_ident (line 341) | fn valid_prql_ident() -> &'static Regex {
  function write_ident_part (line 350) | pub fn write_ident_part(s: &str) -> Cow<'_, str> {
  method write (line 359) | fn write(&self, mut opt: WriteOpt) -> Option<String> {
  method write (line 376) | fn write(&self, mut opt: WriteOpt) -> Option<String> {
  function display_interpolation (line 472) | fn display_interpolation(
  method write (line 503) | fn write(&self, opt: WriteOpt) -> Option<String> {
  function assert_is_formatted (line 519) | fn assert_is_formatted(input: &str) {
  function format_single_stmt (line 524) | fn format_single_stmt(query: &str) -> String {
  function test_pipeline (line 536) | fn test_pipeline() {
  function test_escaped_string (line 577) | fn test_escaped_string() {
  function test_double_braces (line 582) | fn test_double_braces() {
  function test_sstring_escaped_quotes (line 589) | fn test_sstring_escaped_quotes() {
  function test_unary (line 595) | fn test_unary() {
  function test_binary (line 603) | fn test_binary() {
  function test_func (line 614) | fn test_func() {
  function test_simple (line 619) | fn test_simple() {
  function test_alias (line 629) | fn test_alias() {
  function test_assign (line 638) | fn test_assign() {
  function test_range (line 653) | fn test_range() {
  function test_annotation (line 680) | fn test_annotation() {
  function test_var_def (line 691) | fn test_var_def() {
  function test_query_def (line 719) | fn test_query_def() {

FILE: prqlc/prqlc/src/codegen/mod.rs
  type WriteSource (line 7) | pub trait WriteSource {
    method write (line 12) | fn write(&self, opt: WriteOpt) -> Option<String>;
    method write_between (line 14) | fn write_between<S: ToString>(
    method write_or_expand (line 32) | fn write_or_expand(&self, mut opt: WriteOpt) -> String {
    method write (line 45) | fn write(&self, opt: WriteOpt) -> Option<String> {
    method write (line 153) | fn write(&self, mut opt: WriteOpt) -> Option<String> {
  type WriteOpt (line 51) | pub struct WriteOpt {
    method new_width (line 104) | fn new_width(max_width: u16) -> Self {
    method consume_width (line 112) | fn consume_width(&mut self, width: u16) -> Option<()> {
    method reset_line (line 117) | fn reset_line(&mut self) -> Option<()> {
    method consume (line 124) | fn consume<S: AsRef<str>>(&mut self, source: S) -> Option<S> {
    method write_indent (line 134) | fn write_indent(&self) -> String {
  type Position (line 82) | pub enum Position {
  method default (line 89) | fn default() -> Self {
  type SeparatedExprs (line 142) | struct SeparatedExprs<'a, T: WriteSource> {
  function write_inline (line 184) | fn write_inline(&self, mut opt: WriteOpt) -> Option<String> {

FILE: prqlc/prqlc/src/codegen/types.rs
  function write_ty (line 7) | pub(crate) fn write_ty(ty: &pr::Ty) -> String {
  function write_ty_kind (line 11) | pub(crate) fn write_ty_kind(ty: &pr::TyKind) -> String {
  method write (line 16) | fn write(&self, opt: WriteOpt) -> Option<String> {
  method write (line 26) | fn write(&self, opt: WriteOpt) -> Option<String> {
  method write (line 35) | fn write(&self, opt: WriteOpt) -> Option<String> {
  method write (line 66) | fn write(&self, opt: WriteOpt) -> Option<String> {

FILE: prqlc/prqlc/src/debug/log.rs
  function log_start (line 19) | pub fn log_start() {
  function log_finish (line 35) | pub fn log_finish() -> Option<DebugLog> {
  function log_suppress (line 41) | pub fn log_suppress() -> Option<LogSuppressLock> {
  function log_stage (line 45) | pub fn log_stage(stage: Stage) {
  function log_entry (line 49) | pub fn log_entry(entry: impl FnOnce() -> DebugEntryKind) {
  function log_is_enabled (line 60) | pub fn log_is_enabled() -> bool {
  type DebugLog (line 70) | pub struct DebugLog {
  type DebugEntry (line 80) | pub(super) struct DebugEntry {
  type DebugEntryKind (line 85) | pub enum DebugEntryKind {
  type Message (line 102) | pub struct Message {
  type Stage (line 113) | pub enum Stage {
    method full_name (line 120) | pub(super) fn full_name(&self) -> String {
    method sub_stage (line 129) | pub(super) fn sub_stage(&self) -> Option<&'_ str> {
  type StageSemantic (line 139) | pub enum StageSemantic {
  type StageSql (line 146) | pub enum StageSql {
  type LogSuppressLock (line 152) | pub struct LogSuppressLock(PhantomData<usize>);
    method new (line 155) | fn new() -> Option<Self> {
  method drop (line 168) | fn drop(&mut self) {

FILE: prqlc/prqlc/src/debug/messages.rs
  type MessageLogger (line 5) | pub struct MessageLogger;
    method enabled (line 8) | fn enabled(&self, _metadata: &Metadata) -> bool {
    method log (line 13) | fn log(&self, record: &Record) {
    method flush (line 27) | fn flush(&self) {}

FILE: prqlc/prqlc/src/debug/render_html.rs
  function render_log_to_html (line 14) | pub fn render_log_to_html<W: std::io::Write>(writer: W, debug_log: &Debu...
  function write_debug_log (line 32) | fn write_debug_log<W: Write>(w: &mut W, debug_log: &DebugLog) -> Result {
  function write_stage_handles (line 116) | fn write_stage_handles<'a, W: Write>(
  function write_stage_contents (line 143) | fn write_stage_contents<'a, W: Write>(
  function write_message (line 179) | fn write_message<W: Write>(w: &mut W, message: &Message) -> Result {
  function write_titled_entry (line 189) | fn write_titled_entry<W: Write>(w: &mut W, index: usize, entry: &DebugEn...
  function write_repr_prql (line 230) | fn write_repr_prql<W: Write>(w: &mut W, source_tree: &SourceTree) -> Res...
  function write_repr_lr (line 258) | fn write_repr_lr<W: Write>(w: &mut W, tokens: &lr::Tokens) -> Result {
  function write_repr_pr (line 275) | fn write_repr_pr<W: Write>(w: &mut W, ast: &pr::ModuleDef) -> Result {
  function write_repr_pl (line 285) | fn write_repr_pl<W: Write>(w: &mut W, ast: &pl::ModuleDef) -> Result {
  function write_repr_decl (line 295) | fn write_repr_decl<W: Write>(w: &mut W, root_mod: &decl::RootModule) -> ...
  function write_repr_rq (line 305) | fn write_repr_rq<W: Write>(w: &mut W, ast: &rq::RelationalQuery) -> Resu...
  function write_repr_pq_early (line 315) | fn write_repr_pq_early<W: Write>(w: &mut W, ast: &[pq_ast::SqlTransform]...
  function write_repr_pq (line 325) | fn write_repr_pq<W: Write>(w: &mut W, ast: &pq_ast::SqlQuery) -> Result {
  function write_repr_sql_parser (line 335) | fn write_repr_sql_parser<W: Write>(w: &mut W, ast: &sqlparser::ast::Quer...
  function write_repr_sql (line 345) | fn write_repr_sql<W: Write>(w: &mut W, query: &str) -> Result {
  function write_key_values (line 351) | fn write_key_values<W: Write>(w: &mut W, pairs: &[(&'static str, &dyn De...
  function write_json_ast_node (line 362) | fn write_json_ast_node<W: Write>(
  function write_ast_node_from_object (line 413) | fn write_ast_node_from_object<W: Write>(
  function write_decl (line 469) | fn write_decl<W: Write>(
  function escape_html (line 521) | fn escape_html(text: &str) -> String {
  constant CSS_STYLES (line 529) | const CSS_STYLES: &str = r#"
  constant JS_SCRIPT (line 710) | const JS_SCRIPT: &str = r#"

FILE: prqlc/prqlc/src/error_message.rs
  type ErrorMessage (line 14) | pub struct ErrorMessage {
    method from (line 74) | fn from(e: Error) -> Self {
    method compose_display (line 166) | fn compose_display(&self, source_path: PathBuf, cache: &mut FileTreeCa...
    method compose_location (line 200) | fn compose_location(&self, source: &Source) -> Option<SourceLocation> {
  type SourceLocation (line 36) | pub struct SourceLocation {
  method fmt (line 43) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
  method fmt (line 68) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
  type ErrorMessages (line 95) | pub struct ErrorMessages {
    method from (line 89) | fn from(errors: Vec<ErrorMessage>) -> Self {
    method from (line 101) | fn from(e: ErrorMessage) -> Self {
    method from (line 107) | fn from(e: Error) -> Self {
    method from (line 115) | fn from(errs: Errors) -> Self {
    method to_json (line 132) | pub fn to_json(&self) -> String {
    method composed (line 137) | pub fn composed(mut self, sources: &SourceTree) -> Self {
  method fmt (line 123) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
  type FileTreeCache (line 212) | struct FileTreeCache<'a> {
  function new (line 217) | fn new(file_tree: &'a SourceTree) -> Self {
  type Storage (line 226) | type Storage = String;
  function fetch (line 227) | fn fetch(&mut self, id: &PathBuf) -> Result<&Source<Self::Storage>, impl...
  function display (line 239) | fn display<'b>(&self, id: &'b PathBuf) -> Option<impl fmt::Display + 'b> {

FILE: prqlc/prqlc/src/ir/decl.rs
  type RootModule (line 15) | pub struct RootModule {
    method fmt (line 123) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type Module (line 23) | pub struct Module {
    method fmt (line 129) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type Decl (line 45) | pub struct Decl {
    method from (line 168) | fn from(kind: DeclKind) -> Self {
    method fmt (line 179) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type DeclKind (line 62) | pub enum DeclKind {
    method fmt (line 185) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type TableDecl (line 92) | pub struct TableDecl {
  type TableExpr (line 102) | pub enum TableExpr {
  type TableColumn (line 117) | pub enum TableColumn {
  type DebugNames (line 149) | struct DebugNames<'a>(&'a HashMap<String, Decl>);
  function fmt (line 152) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  method default (line 162) | fn default() -> Self {
  function is_zero (line 207) | fn is_zero(x: &usize) -> bool {

FILE: prqlc/prqlc/src/ir/generic.rs
  type ColumnSort (line 7) | pub struct ColumnSort<T> {
  type SortDirection (line 13) | pub enum SortDirection {
  type WindowFrame (line 20) | pub struct WindowFrame<T> {
  type WindowKind (line 26) | pub enum WindowKind {
  function is_default (line 32) | pub(crate) fn is_default(&self) -> bool {
  method default (line 47) | fn default() -> Self {

FILE: prqlc/prqlc/src/ir/pl/expr.rs
  type Expr (line 15) | pub struct Expr {
    method fmt (line 156) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type ExprKind (line 58) | pub enum ExprKind {
    method from (line 138) | fn from(value: Literal) -> Self {
    method from (line 144) | fn from(value: Ident) -> Self {
    method from (line 150) | fn from(value: Func) -> Self {
  type FuncCall (line 89) | pub struct FuncCall {
  type Func (line 99) | pub struct Func {
  type FuncParam (line 124) | pub struct FuncParam {
  type Range (line 133) | pub type Range = generic::Range<Box<Expr>>;
  type InterpolateItem (line 134) | pub type InterpolateItem = generic::InterpolateItem<Expr>;
  type SwitchCase (line 135) | pub type SwitchCase = generic::SwitchCase<Box<Expr>>;

FILE: prqlc/prqlc/src/ir/pl/extra.rs
  method new_simple (line 10) | pub fn new_simple(name: Expr, args: Vec<Expr>) -> Self {
  type TyOrExpr (line 21) | pub enum TyOrExpr {
  method as_debug_name (line 27) | pub(crate) fn as_debug_name(&self) -> &str {
  type WindowFrame (line 34) | pub type WindowFrame = crate::ir::generic::WindowFrame<Box<Expr>>;
  type ColumnSort (line 35) | pub type ColumnSort = crate::ir::generic::ColumnSort<Box<Expr>>;
  type TransformCall (line 39) | pub struct TransformCall {
  type TransformKind (line 60) | pub enum TransformKind {
  type TableExternRef (line 99) | pub enum TableExternRef {
  type JoinSide (line 111) | pub enum JoinSide {
  method new (line 119) | pub fn new(kind: impl Into<ExprKind>) -> Self {

FILE: prqlc/prqlc/src/ir/pl/fold.rs
  type PlFold (line 22) | pub trait PlFold {
    method fold_stmt (line 23) | fn fold_stmt(&mut self, mut stmt: Stmt) -> Result<Stmt> {
    method fold_stmts (line 27) | fn fold_stmts(&mut self, stmts: Vec<Stmt>) -> Result<Vec<Stmt>> {
    method fold_expr (line 30) | fn fold_expr(&mut self, mut expr: Expr) -> Result<Expr> {
    method fold_expr_kind (line 34) | fn fold_expr_kind(&mut self, expr_kind: ExprKind) -> Result<ExprKind> {
    method fold_exprs (line 37) | fn fold_exprs(&mut self, exprs: Vec<Expr>) -> Result<Vec<Expr>> {
    method fold_var_def (line 40) | fn fold_var_def(&mut self, var_def: VarDef) -> Result<VarDef> {
    method fold_type_def (line 43) | fn fold_type_def(&mut self, ty_def: TypeDef) -> Result<TypeDef> {
    method fold_module_def (line 49) | fn fold_module_def(&mut self, module_def: ModuleDef) -> Result<ModuleD...
    method fold_func_call (line 52) | fn fold_func_call(&mut self, func_call: FuncCall) -> Result<FuncCall> {
    method fold_transform_call (line 55) | fn fold_transform_call(&mut self, transform_call: TransformCall) -> Re...
    method fold_func (line 58) | fn fold_func(&mut self, func: Func) -> Result<Func> {
    method fold_interpolate_item (line 61) | fn fold_interpolate_item(&mut self, sstring_item: InterpolateItem) -> ...
    method fold_type (line 64) | fn fold_type(&mut self, t: Ty) -> Result<Ty> {
    method fold_window (line 67) | fn fold_window(&mut self, window: WindowFrame) -> Result<WindowFrame> {
  function fold_expr_kind (line 72) | pub fn fold_expr_kind<T: ?Sized + PlFold>(fold: &mut T, expr_kind: ExprK...
  function fold_stmt_kind (line 110) | pub fn fold_stmt_kind<T: ?Sized + PlFold>(fold: &mut T, stmt_kind: StmtK...
  function fold_module_def (line 120) | fn fold_module_def<F: ?Sized + PlFold>(fold: &mut F, module_def: ModuleD...
  function fold_var_def (line 127) | pub fn fold_var_def<F: ?Sized + PlFold>(fold: &mut F, var_def: VarDef) -...
  function fold_window (line 135) | pub fn fold_window<F: ?Sized + PlFold>(fold: &mut F, window: WindowFrame...
  function fold_range (line 142) | pub fn fold_range<F: ?Sized + PlFold>(fold: &mut F, Range { start, end }...
  function fold_optional_box (line 152) | pub fn fold_optional_box<F: ?Sized + PlFold>(
  function fold_interpolate_item (line 159) | pub fn fold_interpolate_item<F: ?Sized + PlFold>(
  function fold_cases (line 172) | fn fold_cases<F: ?Sized + PlFold>(fold: &mut F, cases: Vec<SwitchCase>) ...
  function fold_switch_case (line 179) | pub fn fold_switch_case<F: ?Sized + PlFold>(fold: &mut F, case: SwitchCa...
  function fold_column_sorts (line 186) | pub fn fold_column_sorts<F: ?Sized + PlFold>(
  function fold_column_sort (line 195) | pub fn fold_column_sort<T: ?Sized + PlFold>(
  function fold_func_call (line 205) | pub fn fold_func_call<T: ?Sized + PlFold>(fold: &mut T, func_call: FuncC...
  function fold_transform_call (line 217) | pub fn fold_transform_call<T: ?Sized + PlFold>(
  function fold_transform_kind (line 230) | pub fn fold_transform_kind<T: ?Sized + PlFold>(
  function fold_func (line 277) | pub fn fold_func<T: ?Sized + PlFold>(fold: &mut T, func: Func) -> Result...
  function fold_func_param (line 289) | pub fn fold_func_param<T: ?Sized + PlFold>(
  function fold_type_opt (line 305) | pub fn fold_type_opt<T: ?Sized + PlFold>(fold: &mut T, ty: Option<Ty>) -...
  function fold_type_opt_box (line 310) | pub fn fold_type_opt_box<T: ?Sized + PlFold>(
  function fold_type (line 317) | pub fn fold_type<T: ?Sized + PlFold>(fold: &mut T, ty: Ty) -> Result<Ty> {

FILE: prqlc/prqlc/src/ir/pl/lineage.rs
  type Lineage (line 14) | pub struct Lineage {
  type LineageInput (line 25) | pub struct LineageInput {
  type LineageColumn (line 37) | pub enum LineageColumn {
  function sorted_set (line 57) | pub fn sorted_set<S: Serializer, V: Serialize + Ord>(
  method fmt (line 69) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
  function display_lineage (line 74) | fn display_lineage(lineage: &Lineage, f: &mut Formatter, display_ids: bo...
  function display_lineage_column (line 86) | fn display_lineage_column(

FILE: prqlc/prqlc/src/ir/pl/mod.rs
  function print_mem_sizes (line 29) | pub fn print_mem_sizes() {

FILE: prqlc/prqlc/src/ir/pl/stmt.rs
  type Stmt (line 12) | pub struct Stmt {
  type StmtKind (line 25) | pub enum StmtKind {
  type VarDef (line 34) | pub struct VarDef {
  type TypeDef (line 43) | pub struct TypeDef {
  type ModuleDef (line 49) | pub struct ModuleDef {
  type ImportDef (line 55) | pub struct ImportDef {
  type Annotation (line 61) | pub struct Annotation {

FILE: prqlc/prqlc/src/ir/pl/utils.rs
  function maybe_binop (line 4) | pub fn maybe_binop(left: Option<Expr>, op_name: &[&str], right: Option<E...
  function new_binop (line 11) | pub fn new_binop(left: Expr, op_name: &[&str], right: Expr) -> Expr {

FILE: prqlc/prqlc/src/ir/rq/expr.rs
  type Expr (line 12) | pub struct Expr {
  type Range (line 17) | pub(super) type Range = generic::Range<Expr>;
  type InterpolateItem (line 18) | pub(super) type InterpolateItem = generic::InterpolateItem<Expr>;
  type SwitchCase (line 19) | pub(super) type SwitchCase = generic::SwitchCase<Expr>;
  type ExprKind (line 22) | pub enum ExprKind {
  type UnOp (line 49) | pub enum UnOp {

FILE: prqlc/prqlc/src/ir/rq/fold.rs
  type RqFold (line 22) | pub trait RqFold {
    method fold_transform (line 23) | fn fold_transform(&mut self, transform: Transform) -> Result<Transform> {
    method fold_transforms (line 26) | fn fold_transforms(&mut self, transforms: Vec<Transform>) -> Result<Ve...
    method fold_table (line 29) | fn fold_table(&mut self, table: TableDecl) -> Result<TableDecl> {
    method fold_relation (line 32) | fn fold_relation(&mut self, relation: Relation) -> Result<Relation> {
    method fold_relation_kind (line 35) | fn fold_relation_kind(&mut self, rel_kind: RelationKind) -> Result<Rel...
    method fold_table_ref (line 38) | fn fold_table_ref(&mut self, table_ref: TableRef) -> Result<TableRef> {
    method fold_query (line 41) | fn fold_query(&mut self, query: RelationalQuery) -> Result<RelationalQ...
    method fold_expr (line 44) | fn fold_expr(&mut self, mut expr: Expr) -> Result<Expr> {
    method fold_expr_kind (line 48) | fn fold_expr_kind(&mut self, kind: ExprKind) -> Result<ExprKind> {
    method fold_relation_column (line 51) | fn fold_relation_column(&mut self, col: RelationColumn) -> Result<Rela...
    method fold_cid (line 54) | fn fold_cid(&mut self, cid: CId) -> Result<CId> {
    method fold_cids (line 57) | fn fold_cids(&mut self, cids: Vec<CId>) -> Result<Vec<CId>> {
    method fold_compute (line 60) | fn fold_compute(&mut self, compute: Compute) -> Result<Compute> {
  function fold_compute (line 65) | fn fold_compute<F: ?Sized + RqFold>(fold: &mut F, compute: Compute) -> R...
  function fold_window (line 74) | fn fold_window<F: ?Sized + RqFold>(fold: &mut F, w: Window) -> Result<Wi...
  function fold_table (line 88) | pub fn fold_table<F: ?Sized + RqFold>(fold: &mut F, t: TableDecl) -> Res...
  function fold_relation (line 96) | pub fn fold_relation<F: ?Sized + RqFold>(fold: &mut F, relation: Relatio...
  function fold_relation_kind (line 103) | pub fn fold_relation_kind<F: ?Sized + RqFold>(
  function fold_table_ref (line 121) | pub fn fold_table_ref<F: ?Sized + RqFold>(fold: &mut F, table_ref: Table...
  function fold_query (line 136) | pub fn fold_query<F: ?Sized + RqFold>(
  function fold_transforms (line 151) | pub fn fold_transforms<F: ?Sized + RqFold>(
  function fold_transform (line 161) | pub fn fold_transform<T: ?Sized + RqFold>(
  function fold_column_sorts (line 194) | pub fn fold_column_sorts<T: ?Sized + RqFold>(
  function fold_expr_kind (line 209) | pub fn fold_expr_kind<F: ?Sized + RqFold>(fold: &mut F, kind: ExprKind) ...
  function fold_optional_box (line 234) | pub fn fold_optional_box<F: ?Sized + RqFold>(
  function fold_interpolate_items (line 244) | pub fn fold_interpolate_items<T: ?Sized + RqFold>(
  function fold_interpolate_item (line 254) | pub fn fold_interpolate_item<T: ?Sized + RqFold>(
  function fold_switch_case (line 267) | pub fn fold_switch_case<F: ?Sized + RqFold>(fold: &mut F, case: SwitchCa...

FILE: prqlc/prqlc/src/ir/rq/ids.rs
  type CId (line 6) | pub struct CId(usize);
    method get (line 9) | pub fn get(&self) -> usize {
    method from (line 15) | fn from(id: usize) -> Self {
    method fmt (line 21) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type TId (line 28) | pub struct TId(usize);
    method get (line 31) | pub fn get(&self) -> usize {
    method from (line 37) | fn from(id: usize) -> Self {
    method fmt (line 43) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {

FILE: prqlc/prqlc/src/ir/rq/mod.rs
  type RelationalQuery (line 27) | pub struct RelationalQuery {
  type Relation (line 35) | pub struct Relation {
  type RelationKind (line 44) | pub enum RelationKind {
  type RelationLiteral (line 61) | pub struct RelationLiteral {
  type RelationColumn (line 69) | pub enum RelationColumn {
  type TableDecl (line 79) | pub struct TableDecl {
  type TableRef (line 91) | pub struct TableRef {

FILE: prqlc/prqlc/src/ir/rq/transform.rs
  type Transform (line 14) | pub enum Transform {
  type Take (line 35) | pub struct Take {
  type Compute (line 42) | pub struct Compute {
  type Window (line 57) | pub struct Window {
  function is_false (line 63) | fn is_false(b: &bool) -> bool {

FILE: prqlc/prqlc/src/ir/rq/utils.rs
  function new_binop (line 4) | pub fn new_binop(left: Expr, operator_name: &str, right: Expr) -> Expr {
  function maybe_binop (line 14) | pub fn maybe_binop(left: Option<Expr>, operator_name: &str, right: Optio...

FILE: prqlc/prqlc/src/lib.rs
  type Result (line 129) | pub type Result<T, E = Error> = core::result::Result<T, E>;
  function compiler_version (line 142) | pub fn compiler_version() -> Version {
  function compile (line 194) | pub fn compile(prql: &str, options: &Options) -> Result<String, ErrorMes...
  type Target (line 225) | pub enum Target {
    method names (line 237) | pub fn names() -> Vec<String> {
  method default (line 231) | fn default() -> Self {
  type Err (line 248) | type Err = Error;
  method from_str (line 250) | fn from_str(s: &str) -> Result<Target, Self::Err> {
  type Options (line 270) | pub struct Options {
    method with_format (line 315) | pub fn with_format(mut self, format: bool) -> Self {
    method no_format (line 320) | pub fn no_format(self) -> Self {
    method with_signature_comment (line 324) | pub fn with_signature_comment(mut self, signature_comment: bool) -> Se...
    method no_signature (line 329) | pub fn no_signature(self) -> Self {
    method with_target (line 333) | pub fn with_target(mut self, target: Target) -> Self {
    method with_color (line 339) | pub fn with_color(mut self, color: bool) -> Self {
    method with_display (line 344) | pub fn with_display(mut self, display: DisplayOptions) -> Self {
  method default (line 303) | fn default() -> Self {
  type DisplayOptions (line 353) | pub enum DisplayOptions {
  type ReadmeDoctests (line 362) | pub struct ReadmeDoctests;
  function prql_to_tokens (line 365) | pub fn prql_to_tokens(prql: &str) -> Result<lr::Tokens, ErrorMessages> {
  function prql_to_pl (line 376) | pub fn prql_to_pl(prql: &str) -> Result<pr::ModuleDef, ErrorMessages> {
  function prql_to_pl_tree (line 382) | pub fn prql_to_pl_tree(prql: &SourceTree) -> Result<pr::ModuleDef, Error...
  function pl_to_rq (line 388) | pub fn pl_to_rq(pl: pr::ModuleDef) -> Result<ir::rq::RelationalQuery, Er...
  function pl_to_rq_tree (line 394) | pub fn pl_to_rq_tree(
  function rq_to_sql (line 404) | pub fn rq_to_sql(rq: ir::rq::RelationalQuery, options: &Options) -> Resu...
  function pl_to_prql (line 409) | pub fn pl_to_prql(pl: &pr::ModuleDef) -> Result<String, ErrorMessages> {
  function from_pl (line 418) | pub fn from_pl(pl: &pr::ModuleDef) -> Result<String, ErrorMessages> {
  function to_pl (line 423) | pub fn to_pl(json: &str) -> Result<pr::ModuleDef, ErrorMessages> {
  function from_rq (line 428) | pub fn from_rq(rq: &ir::rq::RelationalQuery) -> Result<String, ErrorMess...
  function to_rq (line 433) | pub fn to_rq(json: &str) -> Result<ir::rq::RelationalQuery, ErrorMessage...
  function convert_json_err (line 437) | fn convert_json_err(err: serde_json::Error) -> ErrorMessages {
  type SourceTree (line 449) | pub struct SourceTree {
    method single (line 462) | pub fn single(path: PathBuf, content: String) -> Self {
    method new (line 470) | pub fn new<I>(iter: I, root: Option<PathBuf>) -> Self
    method insert (line 487) | pub fn insert(&mut self, path: PathBuf, content: String) {
    method get_path (line 493) | pub fn get_path(&self, source_id: u16) -> Option<&PathBuf> {
    method from (line 499) | fn from(source: S) -> Self {
  function pl_to_lineage (line 509) | pub fn pl_to_lineage(
  function from_lineage (line 528) | pub fn from_lineage(
  function convert_json_err (line 534) | fn convert_json_err(err: serde_json::Error) -> ErrorMessages {
  function compile (line 549) | pub fn compile(prql: &str) -> Result<String, super::ErrorMessages> {
  function test_starts_with (line 555) | fn test_starts_with() {
  function test_target_from_str (line 572) | fn test_target_from_str() {
  function test_target_names (line 616) | fn test_target_names() {
  function test_sort_not_propagated_after_join (line 629) | fn test_sort_not_propagated_after_join() {
  function test_explicit_sort_after_distinct_on_preserved (line 680) | fn test_explicit_sort_after_distinct_on_preserved() {

FILE: prqlc/prqlc/src/main.rs
  function main (line 5) | fn main() -> color_eyre::eyre::Result<()> {
  function main (line 20) | fn main() {

FILE: prqlc/prqlc/src/parser.rs
  function parse (line 11) | pub fn parse(file_tree: &SourceTree) -> Result<pr::ModuleDef, Errors> {
  function parse_source (line 60) | pub(crate) fn parse_source(source: &str, source_id: u16) -> Result<Vec<p...
  type SourceFile (line 80) | struct SourceFile<'a> {
  function linearize_tree (line 86) | fn linearize_tree(tree: &SourceTree) -> Result<Vec<SourceFile<'_>>> {
  function insert_stmts_at_path (line 153) | fn insert_stmts_at_path(module: &mut pr::ModuleDef, mut path: Vec<String...
  function is_mod_def_for (line 179) | pub(crate) fn is_mod_def_for(stmt: &pr::Stmt, name: &str) -> bool {
  function path_starts_with_uppercase (line 183) | fn path_starts_with_uppercase(p: &&PathBuf) -> bool {
  function os_path_to_prql_path (line 191) | pub fn os_path_to_prql_path(path: &Path) -> Result<Vec<String>> {

FILE: prqlc/prqlc/src/semantic/ast_expand.rs
  function expand_expr (line 13) | pub fn expand_expr(expr: pr::Expr) -> Result<pl::Expr> {
  function expands_range (line 89) | fn expands_range(v: generic::Range<Box<pr::Expr>>) -> Result<pl::ExprKin...
  function expand_exprs (line 105) | fn expand_exprs(exprs: Vec<pr::Expr>) -> Result<Vec<pl::Expr>> {
  function expand_expr_box (line 110) | fn expand_expr_box(expr: Box<pr::Expr>) -> Result<Box<pl::Expr>> {
  function desugar_pipeline (line 114) | fn desugar_pipeline(mut pipeline: pr::Pipeline) -> Result<pl::Expr> {
  function expand_unary (line 133) | fn expand_unary(pr::UnaryExpr { op, expr }: pr::UnaryExpr) -> Result<pl:...
  function expand_binary (line 178) | fn expand_binary(pr::BinaryExpr { op, left, right }: pr::BinaryExpr) -> ...
  function expand_func_param (line 216) | fn expand_func_param(value: pr::FuncParam) -> Result<pl::FuncParam> {
  function expand_func_params (line 224) | fn expand_func_params(value: Vec<pr::FuncParam>) -> Result<Vec<pl::FuncP...
  function expand_stmt (line 228) | fn expand_stmt(value: pr::Stmt) -> Result<pl::Stmt> {
  function expand_module_def (line 241) | pub fn expand_module_def(v: pr::ModuleDef) -> Result<pl::ModuleDef> {
  function expand_stmts (line 248) | fn expand_stmts(value: Vec<pr::Stmt>) -> Result<Vec<pl::Stmt>> {
  function expand_stmt_kind (line 252) | fn expand_stmt_kind(value: pr::StmtKind) -> Result<pl::StmtKind> {
  function expand_annotation (line 272) | fn expand_annotation(value: pr::Annotation) -> Result<pl::Annotation> {
  function restrict_expr (line 279) | pub fn restrict_expr(expr: pl::Expr) -> pr::Expr {
  function restrict_expr_box (line 289) | fn restrict_expr_box(expr: Box<pl::Expr>) -> Box<pr::Expr> {
  function restrict_exprs (line 293) | fn restrict_exprs(exprs: Vec<pl::Expr>) -> Vec<pr::Expr> {
  function restrict_expr_kind (line 297) | fn restrict_expr_kind(value: pl::ExprKind) -> pr::ExprKind {
  function restrict_func_params (line 361) | fn restrict_func_params(value: Vec<pl::FuncParam>) -> Vec<pr::FuncParam> {
  function restrict_func_param (line 365) | fn restrict_func_param(value: pl::FuncParam) -> pr::FuncParam {
  function try_restrict_range (line 374) | pub fn try_restrict_range(expr: pl::Expr) -> Result<(pl::Expr, pl::Expr)...
  function restrict_null_literal (line 395) | pub fn restrict_null_literal(expr: pl::Expr) -> Option<pl::Expr> {
  function restrict_module_def (line 403) | pub fn restrict_module_def(def: pl::ModuleDef) -> pr::ModuleDef {
  function restrict_stmts (line 410) | fn restrict_stmts(stmts: Vec<pl::Stmt>) -> Vec<pr::Stmt> {
  function restrict_stmt (line 414) | fn restrict_stmt(stmt: pl::Stmt) -> pr::Stmt {
  function restrict_annotation (line 446) | pub fn restrict_annotation(value: pl::Annotation) -> pr::Annotation {
  function restrict_module (line 452) | pub fn restrict_module(value: decl::Module) -> pr::ModuleDef {
  function restrict_decl (line 464) | fn restrict_decl(name: String, value: decl::Decl) -> Option<pr::Stmt> {
  function new_internal_stmt (line 516) | fn new_internal_stmt(name: String, internal: String) -> pr::StmtKind {

FILE: prqlc/prqlc/src/semantic/lowering.rs
  function lower_to_ir (line 36) | pub fn lower_to_ir(
  function extern_ref_to_relation (line 100) | fn extern_ref_to_relation(
  function tuple_fields_to_relation_columns (line 133) | fn tuple_fields_to_relation_columns(columns: Vec<TyTupleField>) -> Vec<R...
  function validate_query_def (line 143) | fn validate_query_def(query_def: &QueryDef) -> Result<()> {
  type Lowerer (line 164) | struct Lowerer {
    method new (line 198) | fn new(root_mod: RootModule, database_module_path: &[String]) -> Self {
    method lower_table_decl (line 215) | fn lower_table_decl(&mut self, table: decl::TableDecl, fq_ident: Ident...
    method lower_table_ref (line 246) | fn lower_table_ref(&mut self, expr: pl::Expr) -> Result<rq::TableRef> {
    method redirect_mappings (line 452) | fn redirect_mappings(&mut self, redirects: HashMap<CId, CId>) {
    method create_a_table_instance (line 471) | fn create_a_table_instance(
    method lower_relation (line 504) | fn lower_relation(&mut self, expr: pl::Expr) -> Result<rq::Relation> {
    method lower_pipeline (line 524) | fn lower_pipeline(&mut self, ast: pl::Expr, closure_param: Option<usiz...
    method lower_range (line 641) | fn lower_range(&mut self, range: Range<Box<pl::Expr>>) -> Result<Range...
    method lower_sorts (line 648) | fn lower_sorts(&mut self, by: Vec<ColumnSort<Box<pl::Expr>>>) -> Resul...
    method push_select (line 658) | fn push_select(
    method declare_as_columns (line 719) | fn declare_as_columns(&mut self, exprs: pl::Expr, is_aggregation: bool...
    method find_selected_all (line 754) | fn find_selected_all(
    method find_except_ids (line 767) | fn find_except_ids(&mut self, except: pl::Expr) -> Result<HashSet<CId>> {
    method declare_as_column (line 804) | fn declare_as_column(
    method lower_expr (line 859) | fn lower_expr(&mut self, expr: pl::Expr) -> Result<rq::Expr> {
    method lower_interpolations (line 995) | fn lower_interpolations(
    method lookup_cid (line 1013) | fn lookup_cid(&mut self, id: usize, name: Option<&String>) -> Result<C...
  type LoweredTarget (line 188) | enum LoweredTarget {
  function try_extract_sql_columns (line 1043) | fn try_extract_sql_columns(
  function str_lit (line 1129) | fn str_lit(string: String) -> rq::Expr {
  function validate_take_range (line 1136) | fn validate_take_range(range: &Range<rq::Expr>, span: Option<Span>) -> R...
  type TableExtractor (line 1178) | struct TableExtractor {
    method extract (line 1186) | fn extract(root_module: &Module) -> Vec<(Ident, (decl::TableDecl, Opti...
    method extract_from_module (line 1193) | fn extract_from_module(&mut self, namespace: &Module) {
  function toposort_tables (line 1216) | fn toposort_tables(
  type TableDepsCollector (line 1245) | struct TableDepsCollector {
    method collect (line 1250) | fn collect(expr: pl::Expr) -> Vec<Ident> {
  method fold_expr (line 1258) | fn fold_expr(&mut self, mut expr: pl::Expr) -> Result<pl::Expr> {
  function get_span_of_id (line 1280) | fn get_span_of_id(l: &Lowerer, id: Option<usize>) -> Option<Span> {
  function with_span_if_not_exists (line 1284) | fn with_span_if_not_exists<'a, F>(get_span: F) -> impl FnOnce(Error) -> ...

FILE: prqlc/prqlc/src/semantic/mod.rs
  function resolve_and_lower (line 23) | pub fn resolve_and_lower(
  function resolve (line 40) | pub fn resolve(mut module_tree: pr::ModuleDef) -> Result<RootModule> {
  function load_std_lib (line 64) | pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
  function is_ident_or_func_call (line 85) | pub fn is_ident_or_func_call(expr: &pl::Expr, name: &pr::Ident) -> bool {
  constant NS_STD (line 97) | pub const NS_STD: &str = "std";
  constant NS_THIS (line 98) | pub const NS_THIS: &str = "this";
  constant NS_THAT (line 99) | pub const NS_THAT: &str = "that";
  constant NS_PARAM (line 100) | pub const NS_PARAM: &str = "_param";
  constant NS_DEFAULT_DB (line 101) | pub const NS_DEFAULT_DB: &str = "default_db";
  constant NS_QUERY_DEF (line 102) | pub const NS_QUERY_DEF: &str = "prql";
  constant NS_MAIN (line 103) | pub const NS_MAIN: &str = "main";
  constant NS_SELF (line 106) | pub const NS_SELF: &str = "_self";
  constant NS_INFER (line 109) | pub const NS_INFER: &str = "_infer";
  constant NS_INFER_MODULE (line 112) | pub const NS_INFER_MODULE: &str = "_infer_module";
  method new (line 115) | pub fn new(kind: StmtKind) -> Stmt {
  method name (line 124) | pub(crate) fn name(&self) -> &str {
  function try_cast (line 136) | fn try_cast<T, F, S2: ToString>(self, f: F, who: Option<&str>, expected:...
  function write_pl (line 154) | pub fn write_pl(expr: pl::Expr) -> String {
  function parse_resolve_and_lower (line 168) | pub fn parse_resolve_and_lower(query: &str) -> Result<RelationalQuery, E...
  function parse_and_resolve (line 173) | pub fn parse_and_resolve(query: &str) -> Result<RootModule, Errors> {
  function test_resolve_01 (line 179) | fn test_resolve_01() {
  function test_resolve_02 (line 187) | fn test_resolve_02() {
  function test_resolve_03 (line 203) | fn test_resolve_03() {
  function test_resolve_04 (line 215) | fn test_resolve_04() {
  function test_header (line 227) | fn test_header() {

FILE: prqlc/prqlc/src/semantic/module.rs
  method singleton (line 15) | pub fn singleton<S: ToString>(name: S, entry: Decl) -> Module {
  method new_root (line 22) | pub fn new_root() -> Module {
  method new_database (line 43) | pub fn new_database() -> Module {
  method insert (line 68) | pub fn insert(&mut self, fq_ident: Ident, decl: Decl) -> Result<Option<D...
  method get_mut (line 85) | pub fn get_mut(&mut self, ident: &Ident) -> Option<&mut Decl> {
  method get (line 106) | pub fn get(&self, fq_ident: &Ident) -> Option<&Decl> {
  method lookup (line 137) | pub fn lookup(&self, ident: &Ident) -> HashSet<Ident> {
  method insert_frame (line 194) | pub(super) fn insert_frame(&mut self, lineage: &Lineage, namespace: &str) {
  method insert_frame_col (line 297) | pub(super) fn insert_frame_col(&mut self, namespace: &str, name: String,...
  method shadow (line 304) | pub fn shadow(&mut self, ident: &str) {
  method unshadow (line 313) | pub fn unshadow(&mut self, ident: &str) {
  method stack_push (line 323) | pub fn stack_push(&mut self, ident: &str, namespace: Module) {
  method stack_pop (line 333) | pub fn stack_pop(&mut self, ident: &str) -> Option<Module> {
  method into_exprs (line 339) | pub(crate) fn into_exprs(self) -> HashMap<String, Expr> {
  method from_exprs (line 346) | pub(crate) fn from_exprs(exprs: HashMap<String, Expr>) -> Module {
  method as_decls (line 362) | pub fn as_decls(&self) -> Vec<(Ident, &Decl)> {
  type HintAndSpan (line 379) | type HintAndSpan = (Option<String>, Option<Span>);
  method declare (line 382) | pub(super) fn declare(
  method find_main_rel (line 408) | pub fn find_main_rel(&self, path: &[String]) -> Result<(&TableExpr, Iden...
  method find_main (line 422) | pub fn find_main(&self, path: &[String]) -> Result<(&Decl, Ident), Optio...
  method find_query_def (line 458) | pub fn find_query_def(&self, main: &Ident) -> Option<&QueryDef> {
  function ty_of_lineage (line 469) | pub fn ty_of_lineage(lineage: &Lineage) -> Ty {
  function test_module (line 493) | fn test_module() {
  function test_module_shadow_unshadow (line 511) | fn test_module_shadow_unshadow() {

FILE: prqlc/prqlc/src/semantic/reporting.rs
  function label_references (line 14) | pub fn label_references(root_mod: &RootModule, source_id: String, source...
  type Labeler (line 39) | struct Labeler<'a> {
  function label_module (line 47) | fn label_module(&mut self, module: &Module) {
  function get_span_lines (line 59) | fn get_span_lines(&mut self, id: usize) -> Option<String> {
  function fold_expr (line 73) | fn fold_expr(&mut self, node: pl::Expr) -> Result<pl::Expr> {
  function collect_frames (line 139) | pub fn collect_frames(expr: pl::Expr) -> FrameCollector {
  type ExprGraphNode (line 171) | pub struct ExprGraphNode {
  type FrameCollector (line 204) | pub struct FrameCollector {
  method fold_expr (line 218) | fn fold_expr(&mut self, expr: pl::Expr) -> Result<pl::Expr> {

FILE: prqlc/prqlc/src/semantic/resolver/expr.rs
  function fold_stmts (line 14) | fn fold_stmts(&mut self, _: Vec<pl::Stmt>) -> Result<Vec<pl::Stmt>> {
  function fold_type (line 18) | fn fold_type(&mut self, ty: Ty) -> Result<Ty> {
  function fold_var_def (line 46) | fn fold_var_def(&mut self, var_def: pl::VarDef) -> Result<pl::VarDef> {
  function fold_expr (line 60) | fn fold_expr(&mut self, node: pl::Expr) -> Result<pl::Expr> {
  function finish_expr_resolve (line 211) | fn finish_expr_resolve(
  function resolve_column_exclusion (line 254) | pub fn resolve_column_exclusion(&mut self, expr: pl::Expr) -> Result<pl:...
  function construct_wildcard_include (line 264) | pub fn construct_wildcard_include(&mut self, module_fq_self: &pl::Ident)...
  function construct_tuple_from_module (line 274) | pub fn construct_tuple_from_module(
  function ty_of_lineage (line 316) | fn ty_of_lineage(lineage: &pl::Lineage) -> Ty {

FILE: prqlc/prqlc/src/semantic/resolver/flatten.rs
  type Flattener (line 12) | pub struct Flattener {
    method fold (line 46) | pub fn fold(expr: Expr) -> Expr {
  method fold_expr (line 53) | fn fold_expr(&mut self, mut expr: Expr) -> Result<Expr> {

FILE: prqlc/prqlc/src/semantic/resolver/functions.rs
  function fold_function (line 16) | pub fn fold_function(&mut self, closure: Box<Func>, span: Option<Span>) ...
  function materialize_function (line 104) | fn materialize_function(&mut self, closure: Box<Func>) -> Result<Expr> {
  function fold_function_types (line 167) | pub fn fold_function_types(&mut self, mut func: Box<Func>) -> Result<Box...
  function apply_args_to_closure (line 182) | pub fn apply_args_to_closure(
  function resolve_function_args (line 214) | fn resolve_function_args(
  function fold_and_type_check (line 350) | fn fold_and_type_check(
  function fold_within_namespace (line 382) | fn fold_within_namespace(&mut self, expr: Expr, param_name: &str) -> Res...
  function extract_partial_application (line 399) | fn extract_partial_application(mut func: Box<Func>, position: usize) -> ...
  function env_of_closure (line 465) | fn env_of_closure(closure: Func) -> (Module, Expr, Option<Box<Ty>>) {
  function expr_of_func (line 481) | pub fn expr_of_func(func: Box<Func>, span: Option<Span>) -> Box<Expr> {

FILE: prqlc/prqlc/src/semantic/resolver/inference.rs
  function infer_table_column (line 11) | pub fn infer_table_column(
  function lineage_of_table_decl (line 70) | pub fn lineage_of_table_decl(
  function declare_table_for_literal (line 137) | pub(super) fn declare_table_for_literal(

FILE: prqlc/prqlc/src/semantic/resolver/mod.rs
  type Resolver (line 15) | pub struct Resolver<'a> {
  type ResolverOptions (line 29) | pub struct ResolverOptions {}
  function new (line 32) | pub fn new(root_mod: &mut RootModule) -> Resolver<'_> {
  function erase_ids (line 50) | pub fn erase_ids(expr: Expr) -> Expr {
  type IdEraser (line 54) | struct IdEraser {}
  method fold_expr (line 57) | fn fold_expr(&mut self, mut expr: Expr) -> Result<Expr> {
  function parse_and_resolve (line 65) | fn parse_and_resolve(query: &str) -> Result<Expr, Errors> {
  function resolve_lineage (line 71) | fn resolve_lineage(query: &str) -> Result<Lineage, Errors> {
  function resolve_derive (line 75) | fn resolve_derive(query: &str) -> Result<Vec<Expr>, Errors> {
  function test_variables_1 (line 91) | fn test_variables_1() {
  function test_non_existent_function (line 106) | fn test_non_existent_function() {
  function test_functions_1 (line 114) | fn test_functions_1() {
  function test_functions_nested (line 129) | fn test_functions_nested() {
  function test_functions_pipeline (line 143) | fn test_functions_pipeline() {
  function test_named_args (line 164) | fn test_named_args() {
  function test_frames_and_names (line 180) | fn test_frames_and_names() {
  function verify_append_lineage_basics (line 213) | fn verify_append_lineage_basics(
  function find_source_frames (line 243) | fn find_source_frames<'a>(
  function verify_single_column_lineage (line 269) | fn verify_single_column_lineage(
  function verify_expression_graph_nodes (line 315) | fn verify_expression_graph_nodes(
  function test_append_union_different_tables (line 353) | fn test_append_union_different_tables() {
  function test_append_union_same_table_with_exclude (line 397) | fn test_append_union_same_table_with_exclude() {
  function test_append_union_all_columns_same_input (line 419) | fn test_append_union_all_columns_same_input() {
  function test_cte_lineage_traces_to_source_table (line 486) | fn test_cte_lineage_traces_to_source_table() {
  function test_direct_table_lineage_uses_table_itself (line 521) | fn test_direct_table_lineage_uses_table_itself() {
  function test_cte_lineage_with_union_traces_to_all_source_tables (line 550) | fn test_cte_lineage_with_union_traces_to_all_source_tables() {

FILE: prqlc/prqlc/src/semantic/resolver/names.rs
  function resolve_ident (line 15) | pub(super) fn resolve_ident(&mut self, ident: &Ident) -> Result<Ident, E...
  function collect_columns_in_module (line 59) | fn collect_columns_in_module(&mut self, mod_name: &str) -> Vec<Ident> {
  function resolve_ident_core (line 78) | pub(super) fn resolve_ident_core(
  function resolve_ident_fallback (line 153) | fn resolve_ident_fallback(
  function infer_decl (line 186) | fn infer_decl(&mut self, infer_ident: Ident, original: &Ident) -> Result...
  function resolve_ident_wildcard (line 217) | fn resolve_ident_wildcard(&mut self, ident: &Ident) -> Result<Ident, Str...
  function ambiguous_error (line 251) | fn ambiguous_error(idents: HashSet<Ident>, replace_name: Option<&String>...

FILE: prqlc/prqlc/src/semantic/resolver/static_eval.rs
  function maybe_static_eval (line 8) | pub fn maybe_static_eval(&mut self, expr: Expr) -> Result<Expr> {
  function static_eval_rq_operator (line 24) | fn static_eval_rq_operator(mut expr: Expr) -> Expr {
  function static_eval_case (line 88) | fn static_eval_case(mut expr: Expr) -> Expr {

FILE: prqlc/prqlc/src/semantic/resolver/stmt.rs
  function fold_statements (line 11) | pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
  function prepare_expr_decl (line 134) | fn prepare_expr_decl(value: Box<Expr>) -> DeclKind {

FILE: prqlc/prqlc/src/semantic/resolver/transforms.rs
  function resolve_special_func (line 21) | pub fn resolve_special_func(&mut self, func: Box<Func>, needs_window: bo...
  function coerce_into_tuple (line 486) | pub(super) fn coerce_into_tuple(&mut self, expr: Expr) -> Result<Expr> {
  function infer_type_of_special_func (line 511) | pub fn infer_type_of_special_func(
  function range_is_empty (line 583) | fn range_is_empty(range: &(Option<i64>, Option<i64>)) -> bool {
  function range_from_ints (line 590) | fn range_from_ints(start: Option<i64>, end: Option<i64>) -> Range {
  function into_literal_range (line 596) | fn into_literal_range(range: (Expr, Expr)) -> Result<(Option<i64>, Optio...
  function fold_by_simulating_eval (line 610) | fn fold_by_simulating_eval(&mut self, pipeline: Expr, val: &Expr) -> Res...
  method infer_lineage (line 675) | pub fn infer_lineage(&self) -> Result<Lineage> {
  function join (line 741) | fn join(mut lhs: Lineage, rhs: Lineage) -> Lineage {
  function append (line 747) | fn append(mut top: Lineage, bottom: Lineage) -> Result<Lineage, Error> {
  method clear (line 829) | pub fn clear(&mut self) {
  method apply_assigns (line 834) | pub fn apply_assigns(&mut self, assigns: &Expr, inline_refs: bool) {
  method apply_assign (line 856) | pub fn apply_assign(&mut self, expr: &Expr, inline_refs: bool) {
  method find_input_by_name (line 1001) | pub fn find_input_by_name(&self, input_name: &str) -> Option<&LineageInp...
  method find_input (line 1005) | pub fn find_input(&self, input_id: usize) -> Option<&LineageInput> {
  method rename (line 1010) | pub fn rename(&mut self, alias: String) {
  function unpack (line 1029) | fn unpack<const P: usize>(func_args: Vec<Expr>) -> [Expr; P] {
  function parse_csv (line 1040) | pub fn parse_csv(text: &str) -> Result<RelationLiteral, String> {
  type JsonFormat1Row (line 1064) | type JsonFormat1Row = HashMap<String, serde_json::Value>;
  type JsonFormat2 (line 1067) | struct JsonFormat2 {
  function map_json_primitive (line 1072) | fn map_json_primitive(primitive: serde_json::Value) -> Literal {
  function object_to_vec (line 1086) | fn object_to_vec(
  function parse_json (line 1101) | pub fn parse_json(text: &str) -> Result<RelationLiteral, String> {
  function parse_json1 (line 1108) | fn parse_json1(text: &str) -> Result<RelationLiteral, String> {
  function parse_json2 (line 1128) | fn parse_json2(text: &str) -> Result<RelationLiteral, String> {
  function test_aggregate_positional_arg (line 1149) | fn test_aggregate_positional_arg() {
  function test_transform_sort (line 1239) | fn test_transform_sort() {

FILE: prqlc/prqlc/src/semantic/resolver/types.rs
  function infer_type (line 9) | pub fn infer_type(expr: &Expr) -> Result<Option<Ty>> {
  function validate_expr_type (line 86) | pub fn validate_expr_type<F>(
  function validate_type (line 140) | pub fn validate_type<F>(
  function ty_tuple_kind (line 170) | pub fn ty_tuple_kind(fields: Vec<TyTupleField>) -> TyKind {
  function compose_type_error (line 188) | fn compose_type_error<F>(found_ty: &mut Ty, expected: &Ty, who: &F) -> E...
  function rename_relation (line 241) | pub fn rename_relation(ty_kind: &mut TyKind, alias: String) {
  function rename_tuples (line 247) | fn rename_tuples(ty_kind: &mut TyKind, alias: String) {
  function flatten_tuples (line 258) | fn flatten_tuples(ty_kind: &mut TyKind) {
  function is_super_type_of (line 282) | pub fn is_super_type_of(superset: &Ty, subset: &Ty) -> bool {
  function is_super_type_of_opt (line 289) | pub fn is_super_type_of_opt(superset: Option<&Ty>, subset: Option<&Ty>) ...
  function is_sub_type_of_array (line 299) | pub fn is_sub_type_of_array(ty: &Ty) -> bool {
  function is_super_type_of_kind (line 304) | fn is_super_type_of_kind(superset: &TyKind, subset: &TyKind) -> bool {
  function is_not_super_type_of (line 371) | fn is_not_super_type_of(sup: Option<&Ty>, sub: Option<&Ty>) -> bool {
  function maybe_type_intersection (line 382) | fn maybe_type_intersection(a: Option<Ty>, b: Option<Ty>) -> Option<Ty> {
  function type_intersection (line 389) | pub fn type_intersection(a: Ty, b: Ty) -> Ty {
  function type_intersection_of_tuples (line 407) | fn type_intersection_of_tuples(a: Vec<TyTupleField>, b: Vec<TyTupleField...

FILE: prqlc/prqlc/src/sql/dialect.rs
  function chrono_item_to_strftime (line 25) | fn chrono_item_to_strftime(item: &Item) -> String {
  type Dialect (line 82) | pub enum Dialect {
    method handler (line 103) | pub(super) fn handler(&self) -> Box<dyn DialectHandler> {
    method support_level (line 119) | pub fn support_level(&self) -> SupportLevel {
    method names (line 136) | pub fn names() -> &'static [&'static str] {
  type SupportLevel (line 141) | pub enum SupportLevel {
  type GenericDialect (line 148) | pub struct GenericDialect;
  type SQLiteDialect (line 150) | pub struct SQLiteDialect;
  type MySqlDialect (line 152) | pub struct MySqlDialect;
  type MsSqlDialect (line 154) | pub struct MsSqlDialect;
  type BigQueryDialect (line 156) | pub struct BigQueryDialect;
  type ClickHouseDialect (line 158) | pub struct ClickHouseDialect;
  type SnowflakeDialect (line 160) | pub struct SnowflakeDialect;
  type DuckDbDialect (line 162) | pub struct DuckDbDialect;
  type PostgresDialect (line 164) | pub struct PostgresDialect;
  type RedshiftDialect (line 166) | pub struct RedshiftDialect;
  type GlareDbDialect (line 168) | pub struct GlareDbDialect;
  type ColumnExclude (line 170) | pub(super) enum ColumnExclude {
  type IdentQuotingStyle (line 175) | pub enum IdentQuotingStyle {
  type IntervalQuotingStyle (line 181) | pub enum IntervalQuotingStyle {
  type DialectHandler (line 190) | pub(super) trait DialectHandler: Any + Debug {
    method use_fetch (line 191) | fn use_fetch(&self) -> bool {
    method ident_quote (line 195) | fn ident_quote(&self) -> char {
    method ident_quoting_style (line 199) | fn ident_quoting_style(&self) -> IdentQuotingStyle {
    method column_exclude (line 203) | fn column_exclude(&self) -> Option<ColumnExclude> {
    method set_ops_distinct (line 209) | fn set_ops_distinct(&self) -> bool {
    method except_all (line 215) | fn except_all(&self) -> bool {
    method intersect_all (line 219) | fn intersect_all(&self) -> bool {
    method has_concat_function (line 225) | fn has_concat_function(&self) -> bool {
    method interval_quoting_style (line 231) | fn interval_quoting_style(&self, _dtf: &DateTimeField) -> IntervalQuot...
    method stars_in_group (line 236) | fn stars_in_group(&self) -> bool {
    method supports_distinct_on (line 240) | fn supports_distinct_on(&self) -> bool {
    method translate_prql_date_format (line 247) | fn translate_prql_date_format(&self, prql_date_format: &str) -> Result...
    method translate_chrono_item (line 254) | fn translate_chrono_item(&self, _item: Item) -> Result<String> {
    method supports_zero_columns (line 260) | fn supports_zero_columns(&self) -> bool {
    method translate_sql_array (line 264) | fn translate_sql_array(
    method prefers_subquery_parentheses_shorthand (line 279) | fn prefers_subquery_parentheses_shorthand(&self) -> bool {
    method requires_order_by_in_window_function (line 285) | fn requires_order_by_in_window_function(&self) -> bool {
    method translate_chrono_item (line 298) | fn translate_chrono_item(&self, _item: Item) -> Result<String> {
    method interval_quoting_style (line 304) | fn interval_quoting_style(&self, _dtf: &DateTimeField) -> IntervalQuot...
    method supports_distinct_on (line 308) | fn supports_distinct_on(&self) -> bool {
    method translate_chrono_item (line 313) | fn translate_chrono_item<'a>(&self, item: Item) -> Result<String> {
    method supports_zero_columns (line 354) | fn supports_zero_columns(&self) -> bool {
    method prefers_subquery_parentheses_shorthand (line 358) | fn prefers_subquery_parentheses_shorthand(&self) -> bool {
    method ident_quoting_style (line 364) | fn ident_quoting_style(&self) -> IdentQuotingStyle {
    method interval_quoting_style (line 369) | fn interval_quoting_style(&self, dtf: &DateTimeField) -> IntervalQuoti...
    method supports_distinct_on (line 377) | fn supports_distinct_on(&self) -> bool {
    method translate_chrono_item (line 382) | fn translate_chrono_item<'a>(&self, item: Item) -> Result<String> {
    method supports_zero_columns (line 423) | fn supports_zero_columns(&self) -> bool {
    method prefers_subquery_parentheses_shorthand (line 427) | fn prefers_subquery_parentheses_shorthand(&self) -> bool {
    method has_concat_function (line 433) | fn has_concat_function(&self) -> bool {
    method interval_quoting_style (line 439) | fn interval_quoting_style(&self, _dtf: &DateTimeField) -> IntervalQuot...
    method set_ops_distinct (line 445) | fn set_ops_distinct(&self) -> bool {
    method except_all (line 449) | fn except_all(&self) -> bool {
    method has_concat_function (line 453) | fn has_concat_function(&self) -> bool {
    method stars_in_group (line 457) | fn stars_in_group(&self) -> bool {
    method use_fetch (line 463) | fn use_fetch(&self) -> bool {
    method except_all (line 468) | fn except_all(&self) -> bool {
    method set_ops_distinct (line 472) | fn set_ops_distinct(&self) -> bool {
    method translate_chrono_item (line 477) | fn translate_chrono_item<'a>(&self, item: Item) -> Result<String> {
    method ident_quote (line 523) | fn ident_quote(&self) -> char {
    method set_ops_distinct (line 527) | fn set_ops_distinct(&self) -> bool {
    method translate_chrono_item (line 533) | fn translate_chrono_item<'a>(&self, item: Item) -> Result<String> {
    method ident_quote (line 565) | fn ident_quote(&self) -> char {
    method supports_distinct_on (line 569) | fn supports_distinct_on(&self) -> bool {
    method translate_chrono_item (line 574) | fn translate_chrono_item<'a>(&self, item: Item) -> Result<String> {
    method ident_quote (line 616) | fn ident_quote(&self) -> char {
    method column_exclude (line 619) | fn column_exclude(&self) -> Option<ColumnExclude> {
    method set_ops_distinct (line 624) | fn set_ops_distinct(&self) -> bool {
    method prefers_subquery_parentheses_shorthand (line 629) | fn prefers_subquery_parentheses_shorthand(&self) -> bool {
    method translate_chrono_item (line 634) | fn translate_chrono_item<'a>(&self, item: Item) -> Result<String> {
    method ident_quoting_style (line 663) | fn ident_quoting_style(&self) -> IdentQuotingStyle {
    method column_exclude (line 669) | fn column_exclude(&self) -> Option<ColumnExclude> {
    method set_ops_distinct (line 674) | fn set_ops_distinct(&self) -> bool {
    method interval_quoting_style (line 679) | fn interval_quoting_style(&self, _dtf: &DateTimeField) -> IntervalQuot...
    method requires_order_by_in_window_function (line 685) | fn requires_order_by_in_window_function(&self) -> bool {
    method column_exclude (line 693) | fn column_exclude(&self) -> Option<ColumnExclude> {
    method except_all (line 698) | fn except_all(&self) -> bool {
    method supports_distinct_on (line 703) | fn supports_distinct_on(&self) -> bool {
    method translate_chrono_item (line 708) | fn translate_chrono_item<'a>(&self, item: Item) -> Result<String> {
  function is (line 292) | pub fn is<T: DialectHandler + 'static>(&self) -> bool {
  function test_dialect_from_str (line 749) | fn test_dialect_from_str() {
  function chrono_item_to_strftime_numerics_zero_pad (line 766) | fn chrono_item_to_strftime_numerics_zero_pad() {
  function chrono_item_to_strftime_numerics_no_pad (line 779) | fn chrono_item_to_strftime_numerics_no_pad() {
  function chrono_item_to_strftime_numerics_space_pad (line 785) | fn chrono_item_to_strftime_numerics_space_pad() {
  function chrono_item_to_strftime_numeric_unknown (line 791) | fn chrono_item_to_strftime_numeric_unknown() {
  function chrono_item_to_strftime_fixed (line 798) | fn chrono_item_to_strftime_fixed() {
  function chrono_item_to_strftime_fixed_unknown (line 809) | fn chrono_item_to_strftime_fixed_unknown() {
  function chrono_item_to_strftime_non_numeric_non_fixed (line 816) | fn chrono_item_to_strftime_non_numeric_non_fixed() {
  function bigquery_translate_numeric_specifiers (line 828) | fn bigquery_translate_numeric_specifiers() {
  function bigquery_translate_fixed_specifiers (line 841) | fn bigquery_translate_fixed_specifiers() {
  function bigquery_translate_literal (line 852) | fn bigquery_translate_literal() {
  function bigquery_translate_space (line 863) | fn bigquery_translate_space() {
  function bigquery_translate_unsupported_specifier (line 870) | fn bigquery_translate_unsupported_specifier() {

FILE: prqlc/prqlc/src/sql/gen_expr.rs
  function translate_expr (line 24) | pub(super) fn translate_expr(expr: rq::Expr, ctx: &mut Context) -> Resul...
  function process_null (line 143) | fn process_null(name: &str, args: &[rq::Expr], ctx: &mut Context) -> Res...
  function process_array_in (line 170) | fn process_array_in(
  function process_date_to_text (line 213) | fn process_date_to_text(
  function process_concat (line 250) | fn process_concat(expr: &rq::Expr, ctx: &mut Context) -> Result<sql_ast:...
  function translate_binary_operator (line 300) | fn translate_binary_operator(
  function collect_concat_args (line 317) | fn collect_concat_args(expr: &rq::Expr) -> Vec<&rq::Expr> {
  function try_into_between (line 327) | fn try_into_between(expr: rq::Expr, ctx: &mut Context) -> Result<Option<...
  function operator_from_name (line 374) | fn operator_from_name(name: &str) -> Option<BinaryOperator> {
  function translate_literal (line 393) | pub(super) fn translate_literal(l: Literal, ctx: &Context) -> Result<sql...
  function translate_datetime_literal (line 476) | fn translate_datetime_literal(
  function translate_datetime_literal_with_typed_string (line 488) | fn translate_datetime_literal_with_typed_string(
  function translate_datetime_literal_with_sqlite_function (line 499) | fn translate_datetime_literal_with_sqlite_function(
  function translate_cid (line 547) | pub(super) fn translate_cid(cid: rq::CId, ctx: &mut Context) -> Result<E...
  function translate_star (line 611) | pub(super) fn translate_star(ctx: &Context, span: Option<Span>) -> Resul...
  function translate_sstring (line 622) | pub(super) fn translate_sstring(
  function range_of_ranges (line 641) | pub(super) fn range_of_ranges(ranges: Vec<Range<rq::Expr>>) -> Result<Ra...
  function unpack_as_int_literal (line 666) | fn unpack_as_int_literal(bound: rq::Expr) -> Result<i64> {
  function try_range_into_int (line 673) | fn try_range_into_int(range: Range<rq::Expr>) -> Result<Range<i64>> {
  function expr_of_i64 (line 680) | pub(super) fn expr_of_i64(number: i64) -> sql_ast::Expr {
  function fetch_of_i64 (line 684) | pub(super) fn fetch_of_i64(take: i64, ctx: &mut Context) -> Fetch {
  function translate_select_item (line 694) | pub(super) fn translate_select_item(cid: rq::CId, ctx: &mut Context) -> ...
  function translate_windowed (line 723) | fn translate_windowed(
  function try_into_window_frame (line 792) | fn try_into_window_frame(frame: WindowFrame<rq::Expr>) -> Result<sql_ast...
  function translate_column_sort (line 824) | pub(super) fn translate_column_sort(
  function translate_ident (line 847) | pub(super) fn translate_ident(
  function translate_ident_part (line 867) | pub(super) fn translate_ident_part(ident: String, ctx: &Context) -> sql_...
  function translate_operand (line 883) | pub(super) fn translate_operand(
  function needs_parentheses (line 925) | fn needs_parentheses(
  type Associativity (line 950) | pub enum Associativity {
    method left_associative (line 959) | fn left_associative(&self) -> bool {
    method right_associative (line 964) | fn right_associative(&self) -> bool {
  type SQLExpression (line 969) | trait SQLExpression {
    method binding_strength (line 973) | fn binding_strength(&self) -> i32;
    method associativity (line 976) | fn associativity(&self) -> Associativity {
    method binding_strength (line 982) | fn binding_strength(&self) -> i32 {
    method associativity (line 998) | fn associativity(&self) -> Associativity {
    method binding_strength (line 1008) | fn binding_strength(&self) -> i32 {
    method associativity (line 1022) | fn associativity(&self) -> Associativity {
    method binding_strength (line 1031) | fn binding_strength(&self) -> i32 {
    method binding_strength (line 1092) | fn binding_strength(&self) -> i32 {
  type ExprOrSource (line 1042) | pub enum ExprOrSource {
    method into_ast (line 1057) | pub fn into_ast(self) -> sql_ast::Expr {
    method into_source (line 1067) | pub fn into_source(self) -> String {
    method wrap_in_parenthesis (line 1074) | fn wrap_in_parenthesis(self) -> Self {
    method from (line 1103) | fn from(value: sql_ast::Expr) -> Self {
  type SourceExpr (line 1048) | pub struct SourceExpr {
  function test_range_of_ranges (line 1115) | fn test_range_of_ranges() -> Result<()> {

FILE: prqlc/prqlc/src/sql/gen_projection.rs
  function try_into_exprs (line 18) | pub(super) fn try_into_exprs(
  type Excluded (line 55) | type Excluded = HashMap<CId, HashSet<CId>>;
  function translate_wildcards (line 62) | pub(super) fn translate_wildcards(ctx: &AnchorContext, cols: Vec<CId>) -...
  function deduplicate_select_items (line 123) | fn deduplicate_select_items(items: &mut Vec<SelectItem>) {
  function translate_select_items (line 136) | pub(super) fn translate_select_items(
  function translate_exclude (line 197) | fn translate_exclude(
  function as_col_names (line 235) | fn as_col_names<'a>(cids: &'a HashSet<CId>, ctx: &'a AnchorContext) -> V...

FILE: prqlc/prqlc/src/sql/gen_query.rs
  type Transform (line 24) | type Transform = SqlTransform<RelationExpr, ()>;
  function translate_query (line 26) | pub fn translate_query(query: RelationalQuery, dialect: Option<Dialect>)...
  function translate_relation (line 53) | fn translate_relation(relation: SqlRelation, ctx: &mut Context) -> Resul...
  function translate_pipeline (line 62) | fn translate_pipeline(pipeline: Vec<Transform>, ctx: &mut Context) -> Re...
  function translate_select_pipeline (line 73) | fn translate_select_pipeline(
  function translate_set_ops_pipeline (line 276) | fn translate_set_ops_pipeline(
  function translate_relation_expr (line 349) | fn translate_relation_expr(relation_expr: RelationExpr, ctx: &mut Contex...
  function translate_table_alias (line 399) | fn translate_table_alias(alias: Option<String>, ctx: &mut Context) -> Op...
  function translate_join (line 405) | fn translate_join(
  function translate_cte (line 425) | fn translate_cte(cte: Cte, ctx: &mut Context) -> Result<(sql_ast::Cte, b...
  function translate_relation_literal (line 497) | fn translate_relation_literal(data: RelationLiteral, ctx: &Context) -> R...
  function translate_query_sstring (line 558) | pub(super) fn translate_query_sstring(
  function translate_query_operator (line 586) | pub(super) fn translate_query_operator(
  function filter_of_conditions (line 605) | fn filter_of_conditions(exprs: Vec<Expr>, context: &mut Context) -> Resu...
  function all (line 613) | fn all(mut exprs: Vec<Expr>) -> Option<Expr> {
  function default_query (line 627) | fn default_query(body: sql_ast::SetExpr) -> sql_ast::Query {
  function default_select (line 642) | fn default_select() -> Select {
  function simple_table_alias (line 669) | fn simple_table_alias(name: sql_ast::Ident) -> TableAlias {
  function cte_table_alias (line 677) | fn cte_table_alias(name: sql_ast::Ident) -> TableAlias {
  function query_to_set_expr (line 685) | fn query_to_set_expr(query: sql_ast::Query, context: &mut Context) -> Bo...
  function count_tables (line 728) | fn count_tables(transforms: &[Transform]) -> usize {
  function first_expr_from_projection (line 741) | fn first_expr_from_projection(projection: &[SelectItem]) -> Option<sql_a...
  function test_variable_after_aggregate (line 759) | fn test_variable_after_aggregate() {
  function test_derive_filter (line 794) | fn test_derive_filter() {
  function test_filter_windowed (line 832) | fn test_filter_windowed() {
  function test_distinct_on_with_aggregate (line 857) | fn test_distinct_on_with_aggregate() {
  function test_join_with_inaccessible_table (line 882) | fn test_join_with_inaccessible_table() {

FILE: prqlc/prqlc/src/sql/keywords.rs
  function is_keyword (line 15) | pub(super) fn is_keyword(ident: &str, dialect: &Dialect) -> bool {
  function dialect_keywords (line 21) | fn dialect_keywords(dialect: &Dialect) -> &'static HashSet<&'static str> {
  function empty_keywords (line 28) | fn empty_keywords() -> &'static HashSet<&'static str> {
  function redshift_keywords (line 33) | fn redshift_keywords() -> &'static HashSet<&'static str> {
  function sql_keywords (line 42) | fn sql_keywords() -> &'static HashSet<&'static str> {
  constant SQLITE_KEYWORDS (line 72) | const SQLITE_KEYWORDS: &[&str] = &[
  constant POSTGRES_KEYWORDS (line 226) | const POSTGRES_KEYWORDS: &[&str] = &[
  constant DUCKDB_KEYWORDS (line 339) | const DUCKDB_KEYWORDS: &[&str] = &[
  constant BIGQUERY_KEYWORDS (line 419) | const BIGQUERY_KEYWORDS: &[&str] = &[
  constant REDSHIFT_KEYWORDS (line 521) | const REDSHIFT_KEYWORDS: &[&str] = &[
  function test_sql_keywords (line 577) | fn test_sql_keywords() {

FILE: prqlc/prqlc/src/sql/mod.rs
  function compile (line 23) | pub fn compile(query: rq::RelationalQuery, options: &Options) -> Result<...
  type Context (line 65) | struct Context {
    method new (line 114) | fn new(dialect: Dialect, anchor: AnchorContext) -> Self {
    method push_query (line 125) | fn push_query(&mut self) {
    method pop_query (line 129) | fn pop_query(&mut self) {
  type QueryOpts (line 81) | struct QueryOpts {
  method default (line 102) | fn default() -> Self {
  function test_end_with_new_line (line 140) | fn test_end_with_new_line() {

FILE: prqlc/prqlc/src/sql/operators.rs
  function std (line 16) | fn std() -> &'static decl::Module {
  function translate_operator_expr (line 35) | pub(super) fn translate_operator_expr(expr: rq::Expr, ctx: &mut Context)...
  function translate_operator (line 43) | pub(super) fn translate_operator(
  function find_operator_impl (line 123) | fn find_operator_impl(
  function pluck_annotation (line 172) | fn pluck_annotation(
  function into_tuple_items (line 185) | fn into_tuple_items(expr: pl::Expr) -> Result<Vec<(String, pl::ExprKind)...

FILE: prqlc/prqlc/src/sql/pq/anchor.rs
  function extract_atomic (line 20) | pub(super) fn extract_atomic(
  function split_off_back (line 69) | pub(super) fn split_off_back(
  function can_materialize (line 202) | fn can_materialize(compute: &Compute, inputs_required: &[Requirement]) -...
  function anchor_split (line 228) | pub(super) fn anchor_split(
  function is_split_required (line 310) | fn is_split_required(transform: &SqlTransform, following: &mut HashSet<S...
  type Requirement (line 422) | pub struct Requirement {
    method fmt (line 509) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type Requirements (line 433) | pub struct Requirements(Vec<Requirement>);
    method fmt (line 446) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    method from_cids (line 454) | pub fn from_cids<'a, I>(cids: I) -> Requirements
    method from_expr (line 471) | pub fn from_expr(expr: &Expr) -> Requirements {
    method append (line 478) | pub fn append(mut self, mut other: Requirements) -> Requirements {
    method allow_up_to (line 484) | pub fn allow_up_to(mut self, max_complexity: Complexity) -> Self {
    method should_select (line 492) | pub fn should_select(mut self, selected: bool) -> Self {
    method is_selected (line 499) | pub fn is_selected(&self, id: &CId) -> bool {
    method is_required (line 503) | pub fn is_required(&self, id: &CId) -> bool {
  type Target (line 437) | type Target = [Requirement];
  method deref (line 439) | fn deref(&self) -> &[Requirement] {
  function get_requirements (line 516) | pub(super) fn get_requirements(
  type Complexity (line 592) | pub enum Complexity {
    method lowest (line 604) | const fn lowest() -> Self {
    method highest (line 608) | const fn highest() -> Self {
  function infer_complexity (line 613) | pub fn infer_complexity(compute: &Compute) -> Complexity {
  function infer_complexity_expr (line 625) | pub fn infer_complexity_expr(expr: &Expr) -> Complexity {
  type CidCollector (line 646) | pub struct CidCollector {
    method collect (line 653) | pub fn collect(expr: Expr) -> Vec<CId> {
    method collect_t (line 659) | pub fn collect_t(t: Transform) -> (Transform, Vec<CId>) {
  method fold_cid (line 667) | fn fold_cid(&mut self, cid: CId) -> Result<CId> {
  type CidRedirector (line 673) | pub(super) struct CidRedirector<'a> {
  function of_first_from (line 679) | pub fn of_first_from(pipeline: &[SqlTransform], ctx: &'a mut AnchorConte...
  function redirect_pipeline (line 686) | pub fn redirect_pipeline(
  function redirect_cids (line 699) | pub fn redirect_cids(
  function redirect_sorts (line 711) | pub fn redirect_sorts(
  method fold_cid (line 725) | fn fold_cid(&mut self, cid: CId) -> Result<CId> {
  method fold_transform (line 731) | fn fold_transform(&mut self, transform: Transform) -> Result<Transform> {
  function fold_rel (line 744) | fn fold_rel(&mut self, rel: RIId) -> Result<RIId> {
  function fold_super (line 748) | fn fold_super(&mut self, sup: Transform) -> Result<Transform> {

FILE: prqlc/prqlc/src/sql/pq/ast.rs
  type SqlQuery (line 18) | pub struct SqlQuery {
  type SqlRelation (line 27) | pub enum SqlRelation {
  type RelationExpr (line 35) | pub struct RelationExpr {
  type RelationExprKind (line 42) | pub enum RelationExprKind {
  type Cte (line 48) | pub struct Cte {
  type CteKind (line 54) | pub enum CteKind {
  type SqlTransform (line 68) | pub enum SqlTransform<Rel = RIId, Super = rq::Transform> {
  function as_str (line 118) | pub fn as_str(&self) -> &str {
  function into_super_and (line 125) | pub fn into_super_and<T, F: FnOnce(rq::Transform) -> Result<T, rq::Trans...
  type PqMapper (line 134) | pub trait PqMapper<RelIn, RelOut, SuperIn, SuperOut>: RqFold {
    method fold_rel (line 135) | fn fold_rel(&mut self, rel: RelIn) -> Result<RelOut>;
    method fold_super (line 137) | fn fold_super(&mut self, sup: SuperIn) -> Result<SuperOut>;
    method fold_sql_transforms (line 139) | fn fold_sql_transforms(
    method fold_sql_transform (line 149) | fn fold_sql_transform(
  function fold_sql_transform (line 157) | pub fn fold_sql_transform<
  type PqFold (line 206) | pub trait PqFold: PqMapper<RelationExpr, RelationExpr, (), ()> {
    method fold_sql_query (line 207) | fn fold_sql_query(&mut self, query: SqlQuery) -> Result<SqlQuery> {
    method fold_sql_relation (line 218) | fn fold_sql_relation(&mut self, relation: SqlRelation) -> Result<SqlRe...
    method fold_cte (line 227) | fn fold_cte(&mut self, cte: Cte) -> Result<Cte> {

FILE: prqlc/prqlc/src/sql/pq/context.rs
  type AnchorContext (line 23) | pub struct AnchorContext {
    method of (line 127) | pub fn of(query: RelationalQuery) -> (Self, Relation) {
    method register_compute (line 150) | pub fn register_compute(&mut self, compute: Compute) {
    method create_relation_instance (line 159) | pub fn create_relation_instance(
    method ensure_column_name (line 184) | pub(crate) fn ensure_column_name(&mut self, cid: CId) -> Option<&Strin...
    method load_names (line 202) | pub(super) fn load_names(
    method determine_select_columns (line 218) | pub(super) fn determine_select_columns(&self, pipeline: &[SqlTransform...
    method contains_wildcard (line 264) | pub(super) fn contains_wildcard(&self, cids: &[CId]) -> bool {
    method lookup_table_decl (line 274) | pub fn lookup_table_decl(&self, tid: &TId) -> Option<&SqlTableDecl> {
  type SqlTableDecl (line 42) | pub struct SqlTableDecl {
  type RelationStatus (line 60) | pub enum RelationStatus {
    method take_to_define (line 82) | pub fn take_to_define(&mut self) -> RelationStatus {
  type RelationInstance (line 69) | pub struct RelationInstance {
  type RelationAdapter (line 89) | pub enum RelationAdapter {
    method from (line 96) | fn from(rel: SqlRelation) -> Self {
    method from (line 102) | fn from(rel: Relation) -> Self {
  type RIId (line 109) | pub struct RIId(usize);
    method from (line 112) | fn from(id: usize) -> Self {
  type ColumnDecl (line 119) | pub enum ColumnDecl {
  type QueryLoader (line 287) | struct QueryLoader {
    method load (line 292) | fn load(context: AnchorContext, query: RelationalQuery) -> (AnchorCont...
    method load_table (line 302) | fn load_table(&mut self, table: TableDecl) -> Result<()> {
  method fold_compute (line 331) | fn fold_compute(&mut self, compute: Compute) -> Result<Compute> {
  method fold_table_ref (line 336) | fn fold_table_ref(&mut self, table_ref: TableRef) -> Result<TableRef> {

FILE: prqlc/prqlc/src/sql/pq/gen_query.rs
  function compile_query (line 17) | pub(in super::super) fn compile_query(
  function compile_relation (line 57) | fn compile_relation(relation: RelationAdapter, ctx: &mut Context) -> Res...
  function compile_pipeline (line 96) | fn compile_pipeline(
  type TransformCompiler (line 124) | struct TransformCompiler<'a> {
  function fold_rel (line 131) | fn fold_rel(&mut self, rel: RIId) -> Result<pq::RelationExpr> {
  function fold_super (line 135) | fn fold_super(&mut self, _: rq::Transform) -> Result<()> {
  function fold_sql_transforms (line 139) | fn fold_sql_transforms(
  function compile_relation_instance (line 180) | pub(super) fn compile_relation_instance(riid: RIId, ctx: &mut Context) -...
  function compile_loop (line 267) | fn compile_loop(
  function ensure_names (line 330) | fn ensure_names(transforms: &[pq::SqlTransform], ctx: &mut AnchorContext) {

FILE: prqlc/prqlc/src/sql/pq/mod.rs
  function parse_and_resolve (line 28) | fn parse_and_resolve(source: &str) -> Result<SqlQuery, Errors> {
  function count_atomics (line 35) | fn count_atomics(prql: &str) -> Result<usize, Errors> {
  function test_ctes_of_pipeline (line 42) | fn test_ctes_of_pipeline() {

FILE: prqlc/prqlc/src/sql/pq/positional_mapping.rs
  type PositionalMapper (line 13) | pub struct PositionalMapper {
    method activate_mapping (line 20) | pub(crate) fn activate_mapping(&mut self, riid: &RIId) {
    method apply_active_mapping (line 29) | pub(crate) fn apply_active_mapping(&mut self, output: Vec<CId>) -> Vec...
    method compute_and_store_mapping (line 49) | pub fn compute_and_store_mapping(&mut self, before: &[CId], after: &[C...
  function compute_positional_mappings (line 78) | pub fn compute_positional_mappings(

FILE: prqlc/prqlc/src/sql/pq/postprocess.rs
  type Sorting (line 18) | type Sorting = Vec<ColumnSort<CId>>;
  function postprocess (line 20) | pub(super) fn postprocess(query: SqlQuery, ctx: &mut Context) -> SqlQuery {
  function infer_sorts (line 27) | fn infer_sorts(query: SqlQuery, ctx: &mut Context) -> SqlQuery {
  type SortingInference (line 39) | struct SortingInference<'a> {
  function alias_last_sorting (line 58) | fn alias_last_sorting(&mut self, mut last_sorting: Sorting, final_select...
  type CteSorting (line 156) | struct CteSorting {
  function find_last_select_for_cte (line 170) | fn find_last_select_for_cte(cte: &Cte) -> Option<&Vec<CId>> {
  method fold_sql_query (line 186) | fn fold_sql_query(&mut self, query: SqlQuery) -> Result<SqlQuery> {
  function fold_rel (line 312) | fn fold_rel(&mut self, rel: RelationExpr) -> Result<RelationExpr> {
  function fold_super (line 316) | fn fold_super(&mut self, sup: ()) -> Result<()> {
  function fold_sql_transforms (line 320) | fn fold_sql_transforms(
  function assign_names (line 441) | fn assign_names(query: SqlQuery, ctx: &mut Context) -> SqlQuery {
  type RelVarNameAssigner (line 461) | struct RelVarNameAssigner<'a> {
  method fold_sql_relation (line 470) | fn fold_sql_relation(&mut self, relation: SqlRelation) -> Result<SqlRela...
  function fold_rel (line 489) | fn fold_rel(&mut self, mut rel: RelationExpr) -> Result<RelationExpr> {
  function fold_super (line 530) | fn fold_super(&mut self, sup: ()) -> Result<()> {

FILE: prqlc/prqlc/src/sql/pq/preprocess.rs
  function preprocess (line 22) | pub(in crate::sql) fn preprocess(
  function prune_inputs (line 60) | pub(in crate::sql) fn prune_inputs(
  function wrap (line 97) | pub(in crate::sql) fn wrap(pipe: Vec<Transform>, ctx: &mut Context) -> R...
  function vecs_contain_same_elements (line 120) | fn vecs_contain_same_elements<T: Eq + std::hash::Hash>(a: &[T], b: &[T])...
  function distinct (line 127) | pub(in crate::sql) fn distinct(
  function into_column_sort (line 189) | fn into_column_sort(partition: &[CId]) -> Vec<ColumnSort<CId>> {
  function create_filter_by_row_number (line 199) | fn create_filter_by_row_number(
  function as_int (line 265) | fn as_int(expr: Expr) -> Result<i64, ()> {
  function int_expr (line 270) | fn int_expr(i: i64) -> Expr {
  function union (line 278) | pub(in crate::sql) fn union(
  function except (line 307) | pub(in crate::sql) fn except(
  function intersect (line 400) | pub(in crate::sql) fn intersect(
  function all_in (line 496) | fn all_in(cids: &[CId], exprs: Vec<&Expr>) -> bool {
  function all_null (line 501) | fn all_null(exprs: Vec<&Expr>) -> bool {
  function collect_equals (line 509) | fn collect_equals(expr: &Expr) -> Result<(Vec<&Expr>, Vec<&Expr>)> {
  function col_refs (line 533) | fn col_refs(exprs: Vec<&Expr>) -> Vec<CId> {
  function reorder (line 548) | pub(in crate::sql) fn reorder(mut pipeline: Vec<SqlTransform>) -> Vec<Sq...
  function normalize (line 597) | pub(in crate::sql) fn normalize(pipeline: Vec<Transform>) -> Result<Vec<...
  type Normalizer (line 601) | struct Normalizer {}
  method fold_expr (line 604) | fn fold_expr(&mut self, expr: Expr) -> Result<Expr> {

FILE: prqlc/prqlc/src/utils/id_gen.rs
  type IdGenerator (line 7) | pub struct IdGenerator<T: From<usize>> {
  function new (line 13) | pub fn new() -> Self {
  function skip (line 17) | fn skip(&mut self, id: usize) {
  function gen (line 21) | pub fn gen(&mut self) -> T {
  method default (line 29) | fn default() -> IdGenerator<T> {
  function load (line 39) | pub fn load(query: RelationalQuery) -> (IdGenerator<CId>, IdGenerator<TI...
  type IdLoader (line 48) | struct IdLoader {
  method fold_cid (line 54) | fn fold_cid(&mut self, cid: CId) -> Result<CId> {
  method fold_table (line 60) | fn fold_table(&mut self, table: TableDecl) -> Result<TableDecl> {
  type NameGenerator (line 68) | pub struct NameGenerator {
    method new (line 74) | pub fn new(prefix: &'static str) -> Self {
    method gen (line 81) | pub fn gen(&mut self) -> String {

FILE: prqlc/prqlc/src/utils/mod.rs
  type OrMap (line 14) | pub trait OrMap<T> {
    method or_map (line 17) | fn or_map<F>(self, b: Self, f: F) -> Self
  function or_map (line 23) | fn or_map<F>(self, b: Self, f: F) -> Self
  type Pluck (line 35) | pub trait Pluck<T> {
    method pluck (line 36) | fn pluck<R, F>(&mut self, f: F) -> Vec<R>
  function pluck (line 42) | fn pluck<R, F>(&mut self, f: F) -> Vec<R>
  type BreakUp (line 65) | pub trait BreakUp<T> {
    method break_up (line 66) | fn break_up<F>(self, f: F) -> (Vec<T>, Vec<T>)
  function break_up (line 72) | fn break_up<F>(mut self, f: F) -> (Vec<T>, Vec<T>)
  function valid_ident (line 82) | pub(crate) fn valid_ident() -> &'static Regex {
  function should_use_color (line 95) | fn should_use_color() -> bool {
  function maybe_strip_colors (line 107) | pub fn maybe_strip_colors(s: &str) -> String {
  function test_write_ident_part (line 116) | fn test_write_ident_part() {

FILE: prqlc/prqlc/src/utils/toposort.rs
  type Dag (line 3) | type Dag = Vec<Vec<usize>>;
  type Toposort (line 5) | struct Toposort {
    method visit (line 60) | fn visit(&mut self, dag: &Dag, n: usize) -> Result<(), ()> {
  type Node (line 11) | struct Node {
  function toposort (line 16) | pub fn toposort<'a, Key: Eq + std::hash::Hash + Clone>(
  function normal_sort (line 90) | fn normal_sort() {
  function normal_sort_2 (line 104) | fn normal_sort_2() {
  function dag_with_cycle (line 118) | fn dag_with_cycle() {
  function parallel_when_ambiguous (line 131) | fn parallel_when_ambiguous() {
  function with_root (line 146) | fn with_root() {

FILE: prqlc/prqlc/tests/integration/bad_error_messages.rs
  function test_bad_error_messages (line 23) | fn test_bad_error_messages() {
  function interpolation_end (line 73) | fn interpolation_end() {
  function select_with_extra_fstr (line 114) | fn select_with_extra_fstr() {
  function misplaced_type_error (line 132) | fn misplaced_type_error() {
  function test_hint_missing_args (line 151) | fn test_hint_missing_args() {
  function test_relation_literal_contains_literals (line 169) | fn test_relation_literal_contains_literals() {
  function nested_groups (line 184) | fn nested_groups() {
  function just_std (line 213) | fn just_std() {

FILE: prqlc/prqlc/tests/integration/data/chinook/schema.sql
  type invoices (line 13) | CREATE TABLE invoices (
  type customers (line 24) | CREATE TABLE customers (
  type employees (line 39) | CREATE TABLE employees (
  type tracks (line 56) | CREATE TABLE tracks (
  type albums (line 67) | CREATE TABLE albums (album_id INTEGER, title VARCHAR(255), artist_id INT...
  type genres (line 68) | CREATE TABLE genres (genre_id INTEGER, name VARCHAR(255))
  type playlist_track (line 69) | CREATE TABLE playlist_track (playlist_id INTEGER, track_id INTEGER)
  type playlists (line 70) | CREATE TABLE playlists (playlist_id INTEGER, name VARCHAR(255))
  type media_types (line 71) | CREATE TABLE media_types (media_type_id INTEGER, name VARCHAR(255))
  type artists (line 72) | CREATE TABLE artists (artist_id INTEGER, name VARCHAR(255))
  type invoice_items (line 73) | CREATE TABLE invoice_items (

FILE: prqlc/prqlc/tests/integration/dbs/mod.rs
  function runners (line 13) | pub(crate) fn runners() -> &'static Vec<std::sync::Mutex<Box<dyn DbTestR...
  function batch_to_csv (line 72) | pub(crate) fn batch_to_csv(batch: arrow::record_batch::RecordBatch) -> S...

FILE: prqlc/prqlc/tests/integration/dbs/protocol.rs
  function read_to_batch (line 6) | fn read_to_batch<'a>(reader: impl ResultReader<'a>) -> Result<RecordBatc...
  type DbProtocol (line 12) | pub(crate) trait DbProtocol: Send {
    method query (line 13) | fn query(&mut self, sql: &str) -> Result<RecordBatch>;
    method execute (line 14) | fn execute(&mut self, sql: &str) -> Result<()>;
    method query (line 18) | fn query(&mut self, sql: &str) -> Result<RecordBatch> {
    method execute (line 24) | fn execute(&mut self, sql: &str) -> Result<()> {
    method query (line 31) | fn query(&mut self, sql: &str) -> Result<RecordBatch> {
    method execute (line 37) | fn execute(&mut self, sql: &str) -> Result<()> {
    method query (line 49) | fn query(&mut self, sql: &str) -> Result<RecordBatch> {
    method execute (line 55) | fn execute(&mut self, sql: &str) -> Result<()> {
    method query (line 62) | fn query(&mut self, sql: &str) -> Result<RecordBatch> {
    method execute (line 68) | fn execute(&mut self, sql: &str) -> Result<()> {
    method query (line 78) | fn query(&mut self, sql: &str) -> Result<RecordBatch> {
    method execute (line 84) | fn execute(&mut self, sql: &str) -> Result<()> {

FILE: prqlc/prqlc/tests/integration/dbs/runner.rs
  type DbTestRunner (line 10) | pub(crate) trait DbTestRunner: Send {
    method dialect (line 11) | fn dialect(&self) -> Dialect;
    method data_file_root (line 12) | fn data_file_root(&self) -> &str;
    method import_csv (line 13) | fn import_csv(&mut self, csv_path: &str, table_name: &str);
    method modify_ddl (line 14) | fn modify_ddl(&self, sql: String) -> String;
    method query (line 15) | fn query(&mut self, prql: &str) -> Result<RecordBatch> {
    method protocol (line 23) | fn protocol(&mut self) -> &mut dyn DbProtocol;
    method setup (line 24) | fn setup(&mut self) {
    method dialect (line 63) | fn dialect(&self) -> Dialect {
    method protocol (line 67) | fn protocol(&mut self) -> &mut dyn DbProtocol {
    method data_file_root (line 71) | fn data_file_root(&self) -> &str {
    method import_csv (line 75) | fn import_csv(&mut self, csv_path: &str, table_name: &str) {
    method modify_ddl (line 83) | fn modify_ddl(&self, sql: String) -> String {
    method dialect (line 105) | fn dialect(&self) -> Dialect {
    method protocol (line 109) | fn protocol(&mut self) -> &mut dyn DbProtocol {
    method data_file_root (line 113) | fn data_file_root(&self) -> &str {
    method import_csv (line 117) | fn import_csv(&mut self, csv_path: &str, table_name: &str) {
    method modify_ddl (line 146) | fn modify_ddl(&self, sql: String) -> String {
    method dialect (line 176) | fn dialect(&self) -> Dialect {
    method protocol (line 180) | fn protocol(&mut self) -> &mut dyn DbProtocol {
    method data_file_root (line 184) | fn data_file_root(&self) -> &str {
    method import_csv (line 188) | fn import_csv(&mut self, csv_path: &str, table_name: &str) {
    method modify_ddl (line 196) | fn modify_ddl(&self, sql: String) -> String {
    method dialect (line 218) | fn dialect(&self) -> Dialect {
    method protocol (line 222) | fn protocol(&mut self) -> &mut dyn DbProtocol {
    method data_file_root (line 226) | fn data_file_root(&self) -> &str {
    method import_csv (line 230) | fn import_csv(&mut self, csv_path: &str, table_name: &str) {
    method modify_ddl (line 255) | fn modify_ddl(&self, sql: String) -> String {
    method dialect (line 279) | fn dialect(&self) -> Dialect {
    method protocol (line 283) | fn protocol(&mut self) -> &mut dyn DbProtocol {
    method data_file_root (line 287) | fn data_file_root(&self) -> &str {
    method import_csv (line 291) | fn import_csv(&mut self, csv_path: &str, table_name: &str) {
    method modify_ddl (line 299) | fn modify_ddl(&self, sql: String) -> String {
    method dialect (line 351) | fn dialect(&self) -> Dialect {
    method protocol (line 355) | fn protocol(&mut self) -> &mut dyn DbProtocol {
    method data_file_root (line 359) | fn data_file_root(&self) -> &str {
    method import_csv (line 363) | fn import_csv(&mut self, csv_path: &str, table_name: &str) {
    method modify_ddl (line 369) | fn modify_ddl(&self, sql: String) -> String {
    method dialect (line 395) | fn dialect(&self) -> Dialect {
    method protocol (line 399) | fn protocol(&mut self) -> &mut dyn DbProtocol {
    method data_file_root (line 403) | fn data_file_root(&self) -> &str {
    method import_csv (line 407) | fn import_csv(&mut self, csv_path: &str, table_name: &str) {
    method modify_ddl (line 415) | fn modify_ddl(&self, sql: String) -> String {
  type DuckDbTestRunner (line 46) | pub(crate) struct DuckDbTestRunner {
    method new (line 52) | pub(crate) fn new(data_file_root: String) -> Self {
  type SQLiteTestRunner (line 88) | pub(crate) struct SQLiteTestRunner {
    method new (line 94) | pub(crate) fn new(data_file_root: String) -> Self {
  type PostgresTestRunner (line 159) | pub(crate) struct PostgresTestRunner {
    method new (line 165) | pub(crate) fn new(url: &str, data_file_root: String) -> Self {
  type MySqlTestRunner (line 201) | pub(crate) struct MySqlTestRunner {
    method new (line 207) | pub(crate) fn new(url: &str, data_file_root: String) -> Self {
  type ClickHouseTestRunner (line 260) | pub(crate) struct ClickHouseTestRunner {
    method new (line 267) | pub(crate) fn new(url: &str, data_file_root: String) -> Self {
  type MsSqlTestRunner (line 310) | pub(crate) struct MsSqlTestRunner {
    method new (line 318) | pub(crate) fn new(data_file_root: String) -> Self {
  type GlareDbTestRunner (line 377) | pub(crate) struct GlareDbTestRunner {
    method new (line 384) | pub(crate) fn new(url: &str, data_file_root: String) -> Self {

FILE: prqlc/prqlc/tests/integration/error_messages.rs
  function test_errors (line 10) | fn test_errors() {
  function test_union_all_sqlite (line 113) | fn test_union_all_sqlite() {
  function test_regex_dialect (line 127) | fn test_regex_dialect() {
  function test_bad_function_type (line 144) | fn test_bad_function_type() {
  function test_basic_type_checking (line 167) | fn test_basic_type_checking() {
  function test_ambiguous (line 184) | fn test_ambiguous() {
  function test_ambiguous_join (line 206) | fn test_ambiguous_join() {
  function test_ambiguous_inference (line 229) | fn test_ambiguous_inference() {
  function date_to_text_generic (line 249) | fn date_to_text_generic() {
  function date_to_text_with_column_format (line 266) | fn date_to_text_with_column_format() {
  function date_to_text_unsupported_chrono_item (line 283) | fn date_to_text_unsupported_chrono_item() {
  function available_columns (line 302) | fn available_columns() {
  function empty_interpolations (line 321) | fn empty_interpolations() {
  function no_query_entered (line 334) | fn no_query_entered() {
  function query_must_begin_with_from (line 347) | fn query_must_begin_with_from() {
  function negative_number_in_transform (line 365) | fn negative_number_in_transform() {
  function empty_tuple_or_array_from (line 395) | fn empty_tuple_or_array_from() {
  function window_rows_expects_range (line 435) | fn window_rows_expects_range() {
  function bare_lambda_expression (line 465) | fn bare_lambda_expression() {

FILE: prqlc/prqlc/tests/integration/queries.rs
  function run (line 17) | fn run(prql_path: &Path) {
  function run (line 36) | fn run(prql_path: &Path) {
  function should_run_query (line 54) | fn should_run_query(dialect: Dialect, prql: &str) -> bool {
  function run (line 71) | fn run(prql_path: &Path) {
  function run (line 117) | fn run(prql_path: &Path) {
  function run (line 139) | fn run(prql_path: &Path) {
  function run (line 164) | fn run(prql_path: &Path) {

FILE: prqlc/prqlc/tests/integration/sql.rs
  function compile (line 6) | pub(crate) fn compile(prql: &str) -> Result<String, ErrorMessages> {
  function compile_with_sql_dialect (line 15) | fn compile_with_sql_dialect(prql: &str, dialect: sql::Dialect) -> Result...
  function test_stdlib (line 26) | fn test_stdlib() {
  function test_stdlib_math_module (line 57) | fn test_stdlib_math_module() {
  function test_stdlib_math_module_mssql (line 109) | fn test_stdlib_math_module_mssql() {
  function test_stdlib_text_module (line 161) | fn test_stdlib_text_module() {
  function like_concat (line 199) | fn like_concat(#[case] dialect: sql::Dialect, #[case] expected_like: &'s...
  function test_quoting_style (line 243) | fn test_quoting_style(#[case] dialect: sql::Dialect, #[case] expected_sq...
  function date_to_text_operator (line 268) | fn date_to_text_operator(
  function date_to_text_bigquery_rfc3339 (line 292) | fn date_to_text_bigquery_rfc3339() {
  function json_of_test (line 313) | fn json_of_test() {
  function test_precedence_division (line 323) | fn test_precedence_division() {
  function test_precedence_01 (line 347) | fn test_precedence_01() {
  function test_precedence_02 (line 369) | fn test_precedence_02() {
  function test_precedence_03 (line 389) | fn test_precedence_03() {
  function test_precedence_04 (line 411) | fn test_precedence_04() {
  function test_precedence_05 (line 443) | fn test_precedence_05() {
  function test_pow_is_right_associative (line 482) | fn test_pow_is_right_associative() {
  function test_append (line 498) | fn test_append() {
  function test_remove_01 (line 600) | fn test_remove_01() {
  function test_remove_02 (line 621) | fn test_remove_02() {
  function test_remove_03 (line 651) | fn test_remove_03() {
  function test_remove_04 (line 679) | fn test_remove_04() {
  function test_remove_05 (line 694) | fn test_remove_05() {
  function test_remove_06 (line 728) | fn test_remove_06() {
  function test_intersect_01 (line 753) | fn test_intersect_01() {
  function test_intersect_02 (line 774) | fn test_intersect_02() {
  function test_intersect_03 (line 804) | fn test_intersect_03() {
  function test_intersect_04 (line 844) | fn test_intersect_04() {
  function test_intersect_05 (line 883) | fn test_intersect_05() {
  function test_intersect_06 (line 916) | fn test_intersect_06() {
  function test_intersect_07 (line 931) | fn test_intersect_07() {
  function test_sort_in_nested_join (line 948) | fn test_sort_in_nested_join() {
  function test_sort_in_nested_join_with_extra_derive_and_select (line 981) | fn test_sort_in_nested_join_with_extra_derive_and_select() {
  function test_sort_in_nested_append (line 1037) | fn test_sort_in_nested_append() {
  function test_sort_select_redundant_cte (line 1086) | fn test_sort_select_redundant_cte() {
  function test_column_name_extraction_in_s_strings (line 1123) | fn test_column_name_extraction_in_s_strings() {
  function test_rn_ids_are_unique (line 1159) | fn test_rn_ids_are_unique() {
  function test_quoting_01 (line 1196) | fn test_quoting_01() {
  function test_quoting_02 (line 1224) | fn test_quoting_02() {
  function test_quoting_03 (line 1238) | fn test_quoting_03() {
  function test_quoting_04 (line 1258) | fn test_quoting_04() {
  function test_quoting_05 (line 1271) | fn test_quoting_05() {
  function test_quoting_06 (line 1283) | fn test_quoting_06() {
  function test_sorts_01 (line 1300) | fn test_sorts_01() {
  function test_sorts_02 (line 1340) | fn test_sorts_02() {
  function test_sorts_03 (line 1376) | fn test_sorts_03() {
  function test_sort_before_aggregate (line 1409) | fn test_sort_before_aggregate() {
  function test_numbers (line 1424) | fn test_numbers() {
  function test_ranges (line 1449) | fn test_ranges() {
  function test_in_values_01 (line 1471) | fn test_in_values_01() {
  function test_in_values_02 (line 1493) | fn test_in_values_02() {
  function test_in_values_03 (line 1513) | fn test_in_values_03() {
  function test_not_in_values (line 1532) | fn test_not_in_values() {
  function test_in_no_values (line 1547) | fn test_in_no_values() {
  function test_in_values_err_01 (line 1562) | fn test_in_values_err_01() {
  function test_interval (line 1578) | fn test_interval() {
  function test_dates (line 1636) | fn test_dates() {
  function test_window_functions_00 (line 1657) | fn test_window_functions_00() {
  function test_window_functions_02 (line 1673) | fn test_window_functions_02() {
  function test_window_functions_03 (line 1736) | fn test_window_functions_03() {
  function test_window_functions_04 (line 1762) | fn test_window_functions_04() {
  function test_window_functions_05 (line 1782) | fn test_window_functions_05() {
  function test_window_functions_06 (line 1805) | fn test_window_functions_06() {
  function test_window_functions_07 (line 1824) | fn test_window_functions_07() {
  function test_window_functions_08 (line 1840) | fn test_window_functions_08() {
  function test_window_functions_09 (line 1856) | fn test_window_functions_09() {
  function test_window_functions_10 (line 1875) | fn test_window_functions_10() {
  function test_window_functions_11 (line 1897) | fn test_window_functions_11() {
  function test_window_functions_12 (line 1917) | fn test_window_functions_12() {
  function test_window_functions_13 (line 1970) | fn test_window_functions_13() {
  function test_window_single_item_range (line 1999) | fn test_window_single_item_range() {
  function test_name_resolving (line 2023) | fn test_name_resolving() {
  function test_strings (line 2039) | fn test_strings() {
  function test_filter (line 2073) | fn test_filter() {
  function test_nulls_01 (line 2111) | fn test_nulls_01() {
  function test_nulls_02 (line 2124) | fn test_nulls_02() {
  function test_nulls_03 (line 2139) | fn test_nulls_03() {
  function test_nulls_04 (line 2156) | fn test_nulls_04() {
  function test_take_01 (line 2173) | fn test_take_01() {
  function test_take_02 (line 2188) | fn test_take_02() {
  function test_take_03 (line 2203) | fn test_take_03() {
  function test_take_04 (line 2216) | fn test_take_04() {
  function test_take_05 (line 2231) | fn test_take_05() {
  function test_take_06 (line 2248) | fn test_take_06() {
  function test_take_07 (line 2276) | fn test_take_07() {
  function test_take_08 (line 2292) | fn test_take_08() {
  function test_take_09 (line 2308) | fn test_take_09() {
  function test_take_10 (line 2325) | fn test_take_10() {
  function test_take_mssql (line 2341) | fn test_take_mssql() {
  function test_mssql_distinct_fetch (line 2394) | fn test_mssql_distinct_fetch() {
  function test_distinct_01 (line 2458) | fn test_distinct_01() {
  function test_distinct_02 (line 2482) | fn test_distinct_02() {
  function test_distinct_03 (line 2497) | fn test_distinct_03() {
  function test_distinct_04 (line 2512) | fn test_distinct_04() {
  function test_distinct_05 (line 2535) | fn test_distinct_05() {
  function test_distinct_06 (line 2544) | fn test_distinct_06() {
  function test_distinct_07 (line 2566) | fn test_distinct_07() {
  function test_distinct_08 (line 2591) | fn test_distinct_08() {
  function test_distinct_09 (line 2617) | fn test_distinct_09() {
  function test_distinct_on_01 (line 2647) | fn test_distinct_on_01() {
  function test_distinct_on_02 (line 2668) | fn test_distinct_on_02() {
  function test_distinct_on_03 (line 2685) | fn test_distinct_on_03() {
  function test_distinct_on_04 (line 2710) | fn test_distinct_on_04() {
  function test_group_take_n_01 (line 2735) | fn test_group_take_n_01() {
  function test_group_take_n_02 (line 2766) | fn test_group_take_n_02() {
  function test_join (line 2797) | fn test_join() {
  function test_join_side_literal (line 2814) | fn test_join_side_literal() {
  function test_join_side_literal_err (line 2831) | fn test_join_side_literal_err() {
  function test_join_side_literal_via_func (line 2849) | fn test_join_side_literal_via_func() {
  function test_join_side_literal_via_func_err (line 2868) | fn test_join_side_literal_via_func_err() {
  function test_join_with_param_name_collision (line 2888) | fn test_join_with_param_name_collision() {
  function test_from_json (line 2924) | fn test_from_json() {
  function test_f_string (line 2968) | fn test_f_string() {
  function test_sql_of_ast_1 (line 3014) | fn test_sql_of_ast_1() {
  function test_sql_of_ast_02 (line 3048) | fn test_sql_of_ast_02() {
  function test_bare_s_string (line 3064) | fn test_bare_s_string() {
  function test_bare_s_string_01 (line 3096) | fn test_bare_s_string_01() {
  function test_bare_s_string_02 (line 3118) | fn test_bare_s_string_02() {
  function test_bare_s_string_03 (line 3140) | fn test_bare_s_string_03() {
  function test_bare_s_string_04 (line 3165) | fn test_bare_s_string_04() {
  function test_table_definition_with_expr_call (line 3176) | fn test_table_definition_with_expr_call() {
  function test_prql_to_sql_1 (line 3202) | fn test_prql_to_sql_1() {
  function test_prql_to_sql_2 (line 3239) | fn test_prql_to_sql_2() {
  function test_prql_to_sql_table (line 3305) | fn test_prql_to_sql_table() {
  function test_nonatomic (line 3360) | fn test_nonatomic() {
  function test_nonatomic_table (line 3446) | fn test_nonatomic_table() {
  function test_table_names_between_splits_01 (line 3487) | fn test_table_names_between_splits_01() {
  function test_table_names_between_splits_02 (line 3517) | fn test_table_names_between_splits_02() {
  function test_table_alias_01 (line 3542) | fn test_table_alias_01() {
  function test_table_alias_02 (line 3565) | fn test_table_alias_02() {
  function test_targets (line 3581) | fn test_targets() {
  function test_target_clickhouse (line 3643) | fn test_target_clickhouse() {
  function test_ident_escaping (line 3661) | fn test_ident_escaping() {
  function test_literal (line 3696) | fn test_literal() {
  function test_same_column_names (line 3715) | fn test_same_column_names() {
  function test_double_aggregate (line 3757) | fn test_double_aggregate() {
  function test_window_function_coalesce (line 3797) | fn test_window_function_coalesce() {
  function test_casting (line 3820) | fn test_casting() {
  function test_toposort (line 3845) | fn test_toposort() {
  function test_inline_tables (line 3875) | fn test_inline_tables() {
  function test_filter_and_select_unchanged_alias (line 3907) | fn test_filter_and_select_unchanged_alias() {
  function test_filter_and_select_changed_alias (line 3927) | fn test_filter_and_select_changed_alias() {
  function test_unused_alias (line 3962) | fn test_unused_alias() {
  function test_table_s_string_01 (line 3981) | fn test_table_s_string_01() {
  function test_table_s_string_02 (line 4003) | fn test_table_s_string_02() {
  function test_table_s_string_03 (line 4037) | fn test_table_s_string_03() {
  function test_table_s_string_04 (line 4059) | fn test_table_s_string_04() {
  function test_table_s_string_05 (line 4082) | fn test_table_s_string_05() {
  function test_table_s_string_06 (line 4106) | fn test_table_s_string_06() {
  function test_direct_table_references (line 4126) | fn test_direct_table_references() {
  function test_table_variable_in_scalar_context (line 4160) | fn test_table_variable_in_scalar_context() {
  function test_name_shadowing (line 4184) | fn test_name_shadowing() {
  function test_group_all (line 4219) | fn test_group_all() {
  function test_output_column_deduplication (line 4236) | fn test_output_column_deduplication() {
  function test_case_01 (line 4263) | fn test_case_01() {
  function test_case_02 (line 4286) | fn test_case_02() {
  function test_case_03 (line 4310) | fn test_case_03() {
  function test_sql_options (line 4343) | fn test_sql_options() {
  function test_static_analysis (line 4358) | fn test_static_analysis() {
  function test_closures_and_pipelines (line 4393) | fn test_closures_and_pipelines() {
  function test_basic_agg (line 4416) | fn test_basic_agg() {
  function test_exclude_columns_01 (line 4435) | fn test_exclude_columns_01() {
  function test_exclude_columns_02 (line 4452) | fn test_exclude_columns_02() {
  function test_exclude_columns_03 (line 4473) | fn test_exclude_columns_03() {
  function test_exclude_columns_04 (line 4489) | fn test_exclude_columns_04() {
  function test_exclude_columns_05 (line 4505) | fn test_exclude_columns_05() {
  function test_exclude_columns_06 (line 4521) | fn test_exclude_columns_06() {
  function test_exclude_columns_07 (line 4537) | fn test_exclude_columns_07() {
  function test_custom_transforms (line 4559) | fn test_custom_transforms() {
  function test_name_inference (line 4585) | fn test_name_inference() {
  function test_from_text_01 (line 4629) | fn test_from_text_01() {
  function test_from_text_02 (line 4661) | fn test_from_text_02() {
  function test_from_text_03 (line 4691) | fn test_from_text_03() {
  function test_from_text_04 (line 4725) | fn test_from_text_04() {
  function test_from_text_05 (line 4747) | fn test_from_text_05() {
  function test_from_text_06 (line 4771) | fn test_from_text_06() {
  function test_from_text_07 (line 4791) | fn test_from_text_07() {
  function test_header (line 4811) | fn test_header() {
  function test_header_target_error (line 4840) | fn test_header_target_error() {
  function shortest_prql_version (line 4875) | fn shortest_prql_version() {
  function test_loop (line 4904) | fn test_loop() {
  function test_loop_2 (line 4950) | fn test_loop_2() {
  function test_params (line 4990) | fn test_params() {
  function test_datetime (line 5019) | fn test_datetime() {
  function test_datetime_sqlite (line 5039) | fn test_datetime_sqlite() {
  function test_datetime_parsing (line 5072) | fn test_datetime_parsing() {
  function test_lower (line 5089) | fn test_lower() {
  function test_upper (line 5105) | fn test_upper() {
  function test_1535 (line 5121) | fn test_1535() {
  function test_read_parquet_duckdb (line 5135) | fn test_read_parquet_duckdb() {
  function test_read_parquet_with_named_args (line 5166) | fn test_read_parquet_with_named_args() {
  function test_read_json_duckdb (line 5215) | fn test_read_json_duckdb() {
  function test_read_json_clickhouse (line 5235) | fn test_read_json_clickhouse() {
  function test_read_json_generic (line 5255) | fn test_read_json_generic() {
  function test_excess_columns (line 5275) | fn test_excess_columns() {
  function test_regex_search (line 5302) | fn test_regex_search() {
  function test_intervals (line 5318) | fn test_intervals() {
  function test_into (line 5333) | fn test_into() {
  function test_array_01 (line 5358) | fn test_array_01() {
  function test_array_02 (line 5406) | fn test_array_02() {
  function test_array_03 (line 5447) | fn test_array_03() {
  function test_double_stars (line 5461) | fn test_double_stars() {
  function test_lineage (line 5518) | fn test_lineage() {
  function test_type_as_column_name (line 5572) | fn test_type_as_column_name() {
  function test_error_code (line 5591) | fn test_error_code() {
  function large_query (line 5602) | fn large_query() {
  function test_returning_constants_only (line 5631) | fn test_returning_constants_only() {
  function test_conflicting_names_at_split (line 5694) | fn test_conflicting_names_at_split() {
  function test_relation_literal_quoting (line 5730) | fn test_relation_literal_quoting() {
  function test_relation_var_name_clashes_01 (line 5755) | fn test_relation_var_name_clashes_01() {
  function test_relation_var_name_clashes_02 (line 5790) | fn test_relation_var_name_clashes_02() {
  function test_select_this (line 5810) | fn test_select_this() {
  function test_select_bare_wildcard (line 5831) | fn test_select_bare_wildcard() {
  function test_select_repeated_and_derived (line 5851) | fn test_select_repeated_and_derived() {
  function test_group_exclude (line 5888) | fn test_group_exclude() {
  function test_table_declarations (line 5925) | fn test_table_declarations() {
  function test_param_declarations (line 5954) | fn test_param_declarations() {
  function test_relation_aliasing (line 5973) | fn test_relation_aliasing() {
  function test_import (line 5988) | fn test_import() {
  function unstable_ordering (line 6009) | fn unstable_ordering() {
  function test_type_error_placement (line 6060) | fn test_type_error_placement() {
  function test_missing_columns_group_complex_compute (line 6075) | fn test_missing_columns_group_complex_compute() {
  function test_append_select_compute (line 6120) | fn test_append_select_compute() {
  function test_append_select_multiple (line 6180) | fn test_append_select_multiple() {
  function test_append_with_cte (line 6265) | fn test_append_with_cte() {
  function test_distinct_on_sort_on_compute (line 6320) | fn test_distinct_on_sort_on_compute() {
  function test_sort_cast_filter_join_select (line 6381) | fn test_sort_cast_filter_join_select() {
  function test_sort_filter_derive_join_select (line 6436) | fn test_sort_filter_derive_join_select() {
  function test_sort_cast_filter_join_select_with_alias (line 6485) | fn test_sort_cast_filter_join_select_with_alias() {
  function test_redshift_keyword_quoting (line 6578) | fn test_redshift_keyword_quoting(
  function test_redshift_quotes_only_keywords_mixed (line 6594) | fn test_redshift_quotes_only_keywords_mixed() {
  function test_redshift_uses_double_pipe_over_concat (line 6628) | fn test_redshift_uses_double_pipe_over_concat() {
  function test_redshift_interval_quoting (line 6657) | fn test_redshift_interval_quoting(#[case] query: &str, #[case] expected:...
  function test_redshift_text_contains_uses_double_pipe (line 6665) | fn test_redshift_text_contains_uses_double_pipe() {
  function test_snowflake_row_number_requires_order_by (line 6683) | fn test_snowflake_row_number_requires_order_by() {
  function test_snowflake_row_number_with_explicit_sort (line 6712) | fn test_snowflake_row_number_with_explicit_sort() {
  function test_snowflake_text_length_uses_length (line 6740) | fn test_snowflake_text_length_uses_length() {
  function test_group_with_only_sort (line 6757) | fn test_group_with_only_sort() {
  function test_group_empty_preserves_sort (line 6775) | fn test_group_empty_preserves_sort() {
  function test_source_column_name (line 6796) | fn test_source_column_name() {
  function test_column_inference_with_into (line 6869) | fn test_column_inference_with_into() {
  function test_distinct_on_columns_propagated (line 6897) | fn test_distinct_on_columns_propagated() {
  function test_sort_take_before_aggregate (line 6937) | fn test_sort_take_before_aggregate() {
  function test_aggregate_with_operations_and_filter (line 6972) | fn test_aggregate_with_operations_and_filter() {
  function test_partial_application_of_transform (line 7026) | fn test_partial_application_of_transform() {

FILE: web/book/src/lib.rs
  type ComparisonPreprocessor (line 14) | pub struct ComparisonPreprocessor;
  method name (line 17) | fn name(&self) -> &str {
  method run (line 21) | fn run(&self, _ctx: &PreprocessorContext, mut book: Book) -> Result<Book> {
  method supports_renderer (line 34) | fn supports_renderer(&self, renderer: &str) -> Result<bool> {
  type LangTag (line 41) | pub enum LangTag {
  function code_block_lang_tags (line 58) | pub fn code_block_lang_tags(event: &Event) -> Option<Vec<LangTag>> {
  function replace_examples (line 66) | fn replace_examples(text: &str) -> Result<String> {
  function table_of_comparison (line 139) | fn table_of_comparison(prql: &str, sql: &str) -> String {
  function table_of_prql_only (line 172) | fn table_of_prql_only(prql: &str) -> String {
  function table_of_error (line 194) | fn table_of_error(prql: &str, message: &str) -> String {
  function test_replace_examples (line 225) | fn test_replace_examples() -> Result<()> {
  function test_admonition (line 312) | fn test_admonition() -> Result<()> {
  function test_table (line 335) | fn test_table() -> Result<()> {

FILE: web/book/src/main.rs
  function main (line 4) | fn main() {
  function main (line 48) | fn main() -> ! {

FILE: web/book/tests/documentation/book.rs
  function test_prql_examples_compile (line 28) | fn test_prql_examples_compile() -> Result<()> {
  function test_prql_examples_rq_serialize (line 87) | fn test_prql_examples_rq_serialize() -> Result<()> {
  function test_prql_examples_display_then_compile (line 112) | fn test_prql_examples_display_then_compile() -> Result<()> {
  type Example (line 167) | struct Example {
  function collect_book_examples (line 177) | fn collect_book_examples() -> Result<Vec<Example>> {

FILE: web/book/tests/documentation/main.rs
  function compile (line 11) | fn compile(prql: &str) -> Result<String, prqlc::ErrorMessages> {

FILE: web/book/tests/documentation/readme.rs
  function test_readme_examples (line 6) | fn test_readme_examples() {

FILE: web/book/tests/documentation/website.rs
  function sql_normalize (line 9) | fn sql_normalize(sql: &str) -> String {
  function test_website_examples (line 15) | fn test_website_examples() {

FILE: web/book/theme/highlight.js
  function n (line 1) | function n(e){return e instanceof Map?e.clear=e.delete=e.set=()=>{throw ...
  class a (line 1) | class a{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data,thi...
    method constructor (line 1) | constructor(e){void 0===e.data&&(e.data={}),this.data=e.data,this.isMa...
    method ignoreMatch (line 1) | ignoreMatch(){this.isMatchIgnored=!0}
  function i (line 1) | function i(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replac...
  function r (line 1) | function r(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n...
  class o (line 1) | class o{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e...
    method constructor (line 1) | constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(...
    method addText (line 1) | addText(e){this.buffer+=i(e)}
    method openNode (line 1) | openNode(e){if(!s(e))return;let n=e.kind;n=e.sublanguage?"language-"+n...
    method closeNode (line 1) | closeNode(e){s(e)&&(this.buffer+="</span>")}
    method value (line 1) | value(){return this.buffer}
    method span (line 1) | span(e){this.buffer+=`<span class="${e}">`}
  class l (line 1) | class l{constructor(){this.rootNode={children:[]},this.stack=[this.rootN...
    method constructor (line 1) | constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}
    method top (line 1) | get top(){return this.stack[this.stack.length-1]}
    method root (line 1) | get root(){return this.rootNode}
    method add (line 1) | add(e){this.top.children.push(e)}
    method openNode (line 1) | openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}
    method closeNode (line 1) | closeNode(){if(this.stack.length>1)return this.stack.pop()}
    method closeAllNodes (line 1) | closeAllNodes(){for(;this.closeNode(););}
    method toJSON (line 1) | toJSON(){return JSON.stringify(this.rootNode,null,4)}
    method walk (line 1) | walk(e){return this.constructor._walk(e,this.rootNode)}
    method _walk (line 1) | static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e...
    method _collapse (line 1) | static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(...
  class c (line 1) | class c extends l{constructor(e){super(),this.options=e}addKeyword(e,n){...
    method constructor (line 1) | constructor(e){super(),this.options=e}
    method addKeyword (line 1) | addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNo...
    method addText (line 1) | addText(e){""!==e&&this.add(e)}
    method addSublanguage (line 1) | addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}
    method toHTML (line 1) | toHTML(){return new o(this,this.options).value()}
    method finalize (line 1) | finalize(){return!0}
  function d (line 1) | function d(e){return e?"string"==typeof e?e:e.source:null}
  function g (line 1) | function g(e){return m("(?=",e,")")}
  function u (line 1) | function u(e){return m("(?:",e,")*")}
  function b (line 1) | function b(e){return m("(?:",e,")?")}
  function m (line 1) | function m(...e){return e.map(e=>d(e)).join("")}
  function p (line 1) | function p(...e){const n=(e=>{const n=e[e.length-1];return"object"==type...
  function _ (line 1) | function _(e){return RegExp(e.toString()+"|").exec("").length-1}
  function f (line 1) | function f(e,{joinWith:n}){let t=0;return e.map(e=>{t+=1;const n=t;let a...
  function R (line 1) | function R(e,n){"."===e.input[e.index-1]&&n.ignoreMatch()}
  function D (line 1) | function D(e,n){void 0!==e.className&&(e.scope=e.className,delete e.clas...
  function I (line 1) | function I(e,n){n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.spli...
  function L (line 1) | function L(e,n){Array.isArray(e.illegal)&&(e.illegal=p(...e.illegal))}
  function B (line 1) | function B(e,n){if(e.match){if(e.begin||e.end)throw Error("begin & end a...
  function $ (line 1) | function $(e,n){void 0===e.relevance&&(e.relevance=1)}
  function U (line 1) | function U(e,n,t="keyword"){const a=Object.create(null);return"string"==...
  function j (line 1) | function j(e,n){return n?Number(n):(e=>F.includes(e.toLowerCase()))(e)?0:1}
  function G (line 1) | function G(e,n,{key:t}){let a=0;const i=e[t],r={},s={};for(let e=1;e<=n....
  function W (line 1) | function W(e){(e=>{e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e...
  function Q (line 1) | function Q(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive...
  function X (line 1) | function X(e){return!!e&&(e.endsWithParent||X(e.starts))}
  class V (line 1) | class V extends Error{constructor(e,n){super(e),this.name="HTMLInjection...
    method constructor (line 1) | constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}
  function _ (line 1) | function _(e){return d.noHighlightRe.test(e)}
  function h (line 1) | function h(e,n,t){let a="",i="";"object"==typeof n?(a=e,t=n.ignoreIllega...
  function f (line 1) | function f(e,t,i,r){const l=Object.create(null);function c(){if(!O.keywo...
  function E (line 1) | function E(e,t){t=t||d.languages||Object.keys(n);const a=(e=>{const n={v...
  function y (line 1) | function y(e){let n=null;const t=(e=>{let n=e.className+" ";n+=e.parentN...
  function N (line 1) | function N(){"loading"!==document.readyState?document.querySelectorAll(d...
  function v (line 1) | function v(e){return e=(e||"").toLowerCase(),n[e]||n[i[e]]}
  function k (line 1) | function k(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>...
  function O (line 1) | function O(e){const n=v(e);return n&&!n.disableAutodetect}
  function x (line 1) | function x(e,n){const t=e;r.forEach(e=>{e[t]&&e[t](n)})}
  function ue (line 1) | function ue(e,n,t){return-1===t?"":e.replace(n,a=>ue(e,n,t-1))}
  function we (line 1) | function we(e){const n=e.regex,t=be,a={begin:/<[A-Za-z0-9\\._:-]+/,end:/...

FILE: web/playground/generateBook.cjs
  function depth (line 26) | function depth(path) {
  function isFile (line 30) | function isFile(path) {
  function getSnippets (line 40) | function getSnippets(content, file) {

FILE: web/playground/src/app/App.jsx
  function loadLocalStorage (line 10) | function loadLocalStorage() {
  function saveLocalStorage (line 14) | function saveLocalStorage(files) {
  class App (line 24) | class App extends React.Component {
    method componentDidMount (line 39) | componentDidMount() {
    method saveFile (line 44) | saveFile(filename, content) {
    method render (line 55) | render() {

FILE: web/playground/src/output/Output.jsx
  function Tab (line 12) | function Tab(props) {
  class Output (line 23) | class Output extends React.Component {
    method render (line 28) | render() {
    method renderContent (line 49) | renderContent() {
    method copyOutput (line 133) | async copyOutput() {

FILE: web/playground/src/sidebar/Sidebar.jsx
  function Sidebar (line 5) | function Sidebar({ library, onLoadFile }) {

FILE: web/playground/src/workbench/Workbench.jsx
  class Workbench (line 17) | class Workbench extends React.Component {
    method loadFile (line 33) | loadFile(filename, [outputTab, content]) {
    method componentDidMount (line 40) | componentDidMount() {
    method beforeEditorMount (line 48) | beforeEditorMount(monaco) {
    method onEditorMount (line 60) | onEditorMount(editor) {
    method compile (line 66) | async compile(value) {
    method save (line 143) | save() {
    method rename (line 152) | rename() {
    method render (line 162) | render() {

FILE: web/playground/src/workbench/duckdb.js
  function init (line 3) | async function init() {
  constant CHINOOK_TABLES (line 27) | const CHINOOK_TABLES = [
  function registerChinook (line 41) | async function registerChinook(db) {

FILE: web/playground/src/workbench/prql-syntax.js
  constant TRANSFORMS (line 1) | const TRANSFORMS = [
  constant MODULES (line 16) | const MODULES = ["date", "math", "text"];
  constant BUILTIN_FUNCTIONS (line 17) | const BUILTIN_FUNCTIONS = ["case"];
  constant KEYWORDS (line 18) | const KEYWORDS = ["let", "prql"];
  constant LITERALS (line 19) | const LITERALS = ["null", "true", "false"];

FILE: web/prql-codemirror-demo/src/lang-prql/prql.ts
  function prql (line 38) | function prql() {
Condensed preview — 892 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,484K chars).
[
  {
    "path": ".cargo/config.toml",
    "chars": 247,
    "preview": "[target.wasm32-unknown-unknown]\nrunner = 'wasm-bindgen-test-runner'\n\n[target.x86_64-pc-windows-msvc]\n# https://github.co"
  },
  {
    "path": ".config/insta.yaml",
    "chars": 248,
    "preview": "behavior:\n  # Disabling because of issues with running on Windows\n  # force_update: true\nreview:\n  # The default (true) "
  },
  {
    "path": ".config/lychee.toml",
    "chars": 878,
    "preview": "# Lychee link checker configuration\n# See: https://github.com/lycheeverse/lychee\n\n# Retry configuration for network erro"
  },
  {
    "path": ".config/nextest.toml",
    "chars": 1408,
    "preview": "[profile.default]\nfail-fast = false\nfailure-output = \"final\"\nslow-timeout = { period = \"500ms\" }\n\n[[profile.default.over"
  },
  {
    "path": ".config/vscode-recommended/launch.json",
    "chars": 601,
    "preview": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  //"
  },
  {
    "path": ".config/vscode-recommended/settings.json",
    "chars": 285,
    "preview": "{\n  \"files.exclude\": {\n    \"**/.git\": true,\n    \"**/.svn\": true,\n    \"**/.hg\": true,\n    \"**/CVS\": true,\n    \"**/.DS_Sto"
  },
  {
    "path": ".config/vscode-recommended/tasks.json",
    "chars": 287,
    "preview": "{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"prqlc-build\",\n      \"type\": \"cargo\",\n      \"command\": \"build\""
  },
  {
    "path": ".config/wt.toml",
    "chars": 901,
    "preview": "# Worktrunk configuration for PRQL\n#\n# Available template variables:\n#   {{ repo }}      - Repository name\n#   {{ branch"
  },
  {
    "path": ".devcontainer/base-image/Dockerfile",
    "chars": 403,
    "preview": "# syntax=docker/dockerfile:1.4\n\nFROM mcr.microsoft.com/devcontainers/rust:2-1-bookworm\n\n# ========= Install cargo-tools "
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 1593,
    "preview": "// Dev Container for Rust, website, prqlc-js and prqlc-python\n{\n  \"image\": \"ghcr.io/prql/prql-devcontainer-base:latest\","
  },
  {
    "path": ".gitattributes",
    "chars": 640,
    "preview": "# Currently required for:\n# - Elixir tests at\n#   https://github.com/PRQL/prql/blob/5eb4063dbd36bdac07529797dd2cec8c5512"
  },
  {
    "path": ".github/.codecov.yaml",
    "chars": 364,
    "preview": "comment: false\n\nignore:\n  - \"**/tests/**\"\n\ncoverage:\n  status:\n    project:\n      default:\n        removed_code_behavior"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "chars": 710,
    "preview": "# Code of Conduct\n\nWe prefer keeping our rules as short as possible and filling the gaps with the\nmortar of human intera"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 100,
    "preview": "# Contributing\n\nCheck out our\n[Contributing Docs](https://prql-lang.org/book/project/contributing/)\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "chars": 1819,
    "preview": "name: 🐛 Bug report\ndescription: File a bug report to help us improve\nlabels: [bug]\nbody:\n  - type: textarea\n    id: what"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yaml",
    "chars": 27,
    "preview": "blank_issues_enabled: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/something_else.yaml",
    "chars": 154,
    "preview": "name: Something else\ndescription: Anything that's not a bug report\nbody:\n  - type: textarea\n    id: what-happened\n    at"
  },
  {
    "path": ".github/actionlint.yaml",
    "chars": 107,
    "preview": "# Custom runner labels not yet recognized by actionlint\nself-hosted-runner:\n  labels:\n    - macos-15-intel\n"
  },
  {
    "path": ".github/actions/build-prqlc/action.yaml",
    "chars": 4129,
    "preview": "name: build-prqlc\ndescription: >\n  Build prqlc\n\n  Note that much of this is copy/pasted into build-prqlc-c, so changes h"
  },
  {
    "path": ".github/actions/build-prqlc-c/action.yaml",
    "chars": 3613,
    "preview": "name: build-prqlc-c\ndescription: >\n  A version of `build-prqlc` for the C bindings.\n\n  Note that this is quite open to c"
  },
  {
    "path": ".github/actions/build-python/action.yaml",
    "chars": 2339,
    "preview": "name: build-wheel\ndescription: \"Use maturin to build python dists.\"\ninputs:\n  target:\n    description:\n      Maturin bui"
  },
  {
    "path": ".github/actions/time-compilation/action.yaml",
    "chars": 1415,
    "preview": "name: Time Compilation\ndescription: Time the cargo compilation, outputting an HTML file.\n\ninputs:\n  use_cache:\n    requi"
  },
  {
    "path": ".github/dependabot.yaml",
    "chars": 1906,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: cargo\n    directory: \"/\"\n    schedule:\n      # Running daily means the GHA ca"
  },
  {
    "path": ".github/nightly-failure.md",
    "chars": 134,
    "preview": "---\ntitle: Nightly tests failed\nlabels: github_actions\n---\n\nNightly tests [failed on {{ date | date('YYYY-MM-DD') }}]({{"
  },
  {
    "path": ".github/workflows/README.md",
    "chars": 136,
    "preview": "# GitHub Workflows\n\nSee\n[our development docs](https://prql-lang.org/book/project/contributing/development.html)\nfor doc"
  },
  {
    "path": ".github/workflows/build-devcontainer.yaml",
    "chars": 4825,
    "preview": "name: build-devcontainer\n\n# Multi-platform build for devcontainer base image\non:\n  workflow_call:\n    inputs:\n      push"
  },
  {
    "path": ".github/workflows/build-web.yaml",
    "chars": 2441,
    "preview": "name: build-web\n\non:\n  workflow_call:\n  workflow_dispatch:\n\n# We need consistent env vars across all workflows for the c"
  },
  {
    "path": ".github/workflows/claude.yaml",
    "chars": 3591,
    "preview": "name: Claude Code\n\non:\n  issue_comment:\n    types: [created]\n  pull_request_review_comment:\n    types: [created]\n\n# We n"
  },
  {
    "path": ".github/workflows/lint-megalinter.yaml",
    "chars": 4923,
    "preview": "# MegaLinter GitHub Action configuration file\n# More info at https://megalinter.io\nname: lint-megalinter\n\non:\n  workflow"
  },
  {
    "path": ".github/workflows/nightly.yaml",
    "chars": 6549,
    "preview": "# A workflow containing jobs we run only on nightly. This is called by\n# `tests.yaml` on a schedule and on request with "
  },
  {
    "path": ".github/workflows/publish-web.yaml",
    "chars": 1288,
    "preview": "name: publish-web\non:\n  push:\n    branches:\n      - web\n  # Even though releases push to `web` branch, that doesn't caus"
  },
  {
    "path": ".github/workflows/pull-request-target.yaml",
    "chars": 3201,
    "preview": "name: pull-request-target\n\non:\n  pull_request_target:\n    types: [opened, edited, synchronize, labeled, closed]\n    bran"
  },
  {
    "path": ".github/workflows/release.yaml",
    "chars": 13398,
    "preview": "# This workflow runs on tags / releases. It also runs on nightly builds without\n# publishing anything, in order to test "
  },
  {
    "path": ".github/workflows/scripts/set_version.sh",
    "chars": 359,
    "preview": "#!/bin/bash\n\n# We set prefix-key to the version from Cargo.toml for Swatinem/rust-cache@v2\n# since the caches seem to ac"
  },
  {
    "path": ".github/workflows/scripts/util_free_space.sh",
    "chars": 3159,
    "preview": "#!/usr/bin/env bash\n\n# From https://github.com/apache/arrow/blob/4011058f4a56bdcf160f46373355ffa0e22bcd2c/ci/scripts/uti"
  },
  {
    "path": ".github/workflows/test-dotnet.yaml",
    "chars": 859,
    "preview": "name: test-dotnet\n\non:\n  workflow_call:\n  workflow_dispatch:\n\n# We need consistent env vars across all workflows for the"
  },
  {
    "path": ".github/workflows/test-elixir.yaml",
    "chars": 2951,
    "preview": "name: test-elixir\n\non:\n  workflow_call:\n    inputs:\n      oss:\n        type: string\n        default: '[\"ubuntu-24.04\"]'\n"
  },
  {
    "path": ".github/workflows/test-java.yaml",
    "chars": 1316,
    "preview": "name: test-java\n\non:\n  workflow_call:\n    inputs:\n      oss:\n        type: string\n        default: '[\"ubuntu-24.04\"]'\n  "
  },
  {
    "path": ".github/workflows/test-js.yaml",
    "chars": 1817,
    "preview": "name: test-js\n\non:\n  workflow_call:\n    inputs:\n      oss:\n        type: string\n        default: '[\"ubuntu-24.04\"]'\n  wo"
  },
  {
    "path": ".github/workflows/test-php.yaml",
    "chars": 860,
    "preview": "name: test-php\n\non:\n  workflow_call:\n  workflow_dispatch:\n\n# We need consistent env vars across all workflows for the ca"
  },
  {
    "path": ".github/workflows/test-prqlc-c.yaml",
    "chars": 1359,
    "preview": "name: test-prqlc-c\n\non:\n  workflow_call:\n  workflow_dispatch:\n\n# We need consistent env vars across all workflows for th"
  },
  {
    "path": ".github/workflows/test-python.yaml",
    "chars": 2094,
    "preview": "name: test-python\n\non:\n  workflow_call:\n    inputs:\n      oss:\n        type: string\n        default: '[\"ubuntu-24.04\"]'\n"
  },
  {
    "path": ".github/workflows/test-rust.yaml",
    "chars": 7859,
    "preview": "name: test-rust\n\non:\n  # Currently we only run this as `workflow_call`, since `tests.yaml` always calls it.\n  workflow_c"
  },
  {
    "path": ".github/workflows/tests.yaml",
    "chars": 27909,
    "preview": "# This file has transitioning to run almost everything, with rules defined in\n# this file rather than across lots of wor"
  },
  {
    "path": ".gitignore",
    "chars": 864,
    "preview": ".DS_Store\n\ndist\ntarget*/\n*.out\n*.log\n\nlcov.info\n*.profraw\n\n**/.vscode/settings.json\n**/.vscode/launch.json\n**/.vscode/ta"
  },
  {
    "path": ".markdownlint-cli2.yaml",
    "chars": 531,
    "preview": "config:\n  # We use prettier for line length & wrapping\n  MD013: false\n  # Code block style — generally this is fine, but"
  },
  {
    "path": ".mega-linter.yaml",
    "chars": 2068,
    "preview": "GITHUB_COMMENT_REPORTER: false\nDISABLE:\n  - RUST\n  - JAVASCRIPT\n  - PYTHON\nDISABLE_LINTERS:\n  - SPELL_CSPELL\n  - CSS_STY"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 3792,
    "preview": "repos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v6.0.0\n    hooks:\n      - id: end-of-file-fixer"
  },
  {
    "path": ".prettierignore",
    "chars": 486,
    "preview": "# prettier respects the root `.gitignore` file, so prefer that for files which\n# we also want to ignore from our version"
  },
  {
    "path": ".prettierrc.yaml",
    "chars": 183,
    "preview": "proseWrap: always\n# TODO: fix\n# overrides:\n#   # https://github.com/NiklasPor/prettier-plugin-go-template\n#   - files:\n#"
  },
  {
    "path": ".sqlfluff",
    "chars": 62,
    "preview": "[sqlfluff]\ndialect = ansi\nexclude_rules = references.keywords\n"
  },
  {
    "path": ".typos.toml",
    "chars": 809,
    "preview": "[files]\nextend-exclude = [\n  \"web/book/theme/highlight.js\",\n  \"prqlc/prqlc/tests/integration/data/\",\n  \"prqlc/prqlc/test"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 218,
    "preview": "{\n  \"recommendations\": [\n    // Keep in sync with Taskfile.yaml\n    \"prql-lang.prql-vscode\",\n    \"rust-lang.rust-analyze"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 66713,
    "preview": "# PRQL Changelog\n\n## [unreleased]\n\n**Language**:\n\n**Features**:\n\n**Fixes**:\n\n**Documentation**:\n\n**Web**:\n\n**Integration"
  },
  {
    "path": "CLAUDE.md",
    "chars": 3760,
    "preview": "# Claude\n\n## Development Workflow\n\nUse a tiered testing approach—iterate quickly, validate thoroughly:\n\n**Inner loop** ("
  },
  {
    "path": "Cargo.toml",
    "chars": 1824,
    "preview": "[workspace]\nmembers = [\n  \"prqlc/bindings/elixir/native/prql\",\n  \"prqlc/bindings/java\",\n  \"prqlc/bindings/js\",\n  \"prqlc/"
  },
  {
    "path": "LICENSE",
    "chars": 10273,
    "preview": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AN"
  },
  {
    "path": "README.md",
    "chars": 8203,
    "preview": "# PRQL\n\n<!-- User badges on first line (language docs & chat) -->\n\n<!-- Discord online count is blocked rate limits, can"
  },
  {
    "path": "Taskfile.yaml",
    "chars": 13053,
    "preview": "# yaml-language-server: $schema=https://json.schemastore.org/taskfile.json\n\n# Root Taskfile - handles setup, orchestrati"
  },
  {
    "path": "bacon.toml",
    "chars": 1924,
    "preview": "# Initial bacon config file; edits and contributions welcome.\n\ndefault_job = \"clippy\"\n\n# PRQL additions\n[jobs.test]\ncomm"
  },
  {
    "path": "flake.nix",
    "chars": 3126,
    "preview": "{\n  description = \"PRQL development environment\";\n\n  inputs = {\n    nixpkgs.url = \"github:nixos/nixpkgs\";\n    flake-util"
  },
  {
    "path": "grammars/CotEditor/PRQL.yaml",
    "chars": 2688,
    "preview": "---\nkind: code\nextensions:\n  - keyString: prql\nfilenames: []\nmetadata:\n  author: vanillajonathan\n  description:\n    PRQL"
  },
  {
    "path": "grammars/CotEditor/README.md",
    "chars": 288,
    "preview": "# PRQL syntax style for CotEditor\n\n[CotEditor](https://coteditor.com/)'s syntax style file for the PRQL query\nlanguage.\n"
  },
  {
    "path": "grammars/GtkSourceView/README.md",
    "chars": 908,
    "preview": "# Syntax highlighting for GtkSourceView\n\nThis is a syntax highlighting file the\n[GtkSourceView](https://gitlab.gnome.org"
  },
  {
    "path": "grammars/GtkSourceView/prql.lang",
    "chars": 13605,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n Copyright (C) 2024 The PRQL Project\n\n https://prql-lang.org/\n https://gith"
  },
  {
    "path": "grammars/KSyntaxHighlighting/README.md",
    "chars": 1318,
    "preview": "# Syntax highlighting for KSyntaxHighlighting\n\nThis is a syntax highlighting file the\n[KSyntaxHighlighting](https://inve"
  },
  {
    "path": "grammars/KSyntaxHighlighting/prql.xml",
    "chars": 19358,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE language\n[\n  <!ENTITY digitPart \"[0-9](?:_?[0-9])*\">\n  <!ENTITY beforeD"
  },
  {
    "path": "grammars/README.md",
    "chars": 4495,
    "preview": "# Grammars / syntax highlighting\n\nPRQL contains multiple grammar definitions to enable tools to highlight PRQL\ncode. The"
  },
  {
    "path": "grammars/emacs/README.md",
    "chars": 380,
    "preview": "# Syntax highlighting for GNU Emacs\n\nThis is a syntax highlighting file for GNU Emacs.\n\n## Installation\n\nCopy the `prql-"
  },
  {
    "path": "grammars/emacs/prql-mode.el",
    "chars": 2264,
    "preview": ";;; prql-mode.el --- Major mode for PRQL language -*- lexical-binding: t;\n\n;; URL: https://github.com/PRQL/prql\n;; Keywo"
  },
  {
    "path": "grammars/nano/README.md",
    "chars": 398,
    "preview": "# Syntax highlighting for GNU nano\n\nThis is a syntax highlighting file the [GNU nano](https://nano-editor.org/) text\nedi"
  },
  {
    "path": "grammars/nano/prql.nanorc",
    "chars": 1028,
    "preview": "## Syntax highlighting for PRQL.\n\nsyntax python \"\\.prql$\"\nmagic \"PRQL script\"\ncomment \"#\"\n\n# Types.\ncolor green \"\\<(int("
  },
  {
    "path": "grammars/prql-lezer/.gitignore",
    "chars": 35,
    "preview": "/node_modules/\n/src/parser.*\n/dist\n"
  },
  {
    "path": "grammars/prql-lezer/README.md",
    "chars": 849,
    "preview": "# prql-lezer\n\nA Lezer / CodeMirror grammar for PRQL. It's largely fully-functioning, with a\nfew small TODOs in the [gram"
  },
  {
    "path": "grammars/prql-lezer/package.json",
    "chars": 1152,
    "preview": "{\n  \"name\": \"prql-lezer\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Lezer-based PRQL grammar\",\n  \"main\": \"dist/index.cjs\","
  },
  {
    "path": "grammars/prql-lezer/rollup.config.js",
    "chars": 337,
    "preview": "import { nodeResolve } from \"@rollup/plugin-node-resolve\";\n\nexport default {\n  input: \"./src/parser.js\",\n  output: [\n   "
  },
  {
    "path": "grammars/prql-lezer/src/highlight.js",
    "chars": 960,
    "preview": "import { styleTags, tags as t } from \"@lezer/highlight\";\n\nexport const prqlHighlight = styleTags({\n  \"CallExpression/Ide"
  },
  {
    "path": "grammars/prql-lezer/src/prql.grammar",
    "chars": 6802,
    "preview": "// TODO:\n// - Do we want to highlight built-in transforms such as `from` differently to\n//   normal functions?\n// - A fe"
  },
  {
    "path": "grammars/prql-lezer/test/arithmetics.txt",
    "chars": 814,
    "preview": "# Plus\n\nfilter 10 + 10.5\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(BinaryExpression(Integer,ArithOp,Float))"
  },
  {
    "path": "grammars/prql-lezer/test/arrays.txt",
    "chars": 962,
    "preview": "# Array on one line\n\nfilter [foo, bar, baz]\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(ArrayExpression(Ident"
  },
  {
    "path": "grammars/prql-lezer/test/datetime.txt",
    "chars": 787,
    "preview": "# Date YYYY-MM-DD\n\nfilter @1970-01-01\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(DateTime))))\n\n# Time HH:MM\n"
  },
  {
    "path": "grammars/prql-lezer/test/full_queries.txt",
    "chars": 1537,
    "preview": "# Website showcasing example\n\nfrom invoices\nfilter invoice_date >= @1970-01-16\nderive {\n  transaction_fees = 0.8,\n  inco"
  },
  {
    "path": "grammars/prql-lezer/test/identifiers.txt",
    "chars": 339,
    "preview": "# Basic identifier\n\nfilter foo\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(Identifier))))\n\n\n# Identifier with"
  },
  {
    "path": "grammars/prql-lezer/test/misc.txt",
    "chars": 3493,
    "preview": "# Boolean: true\n\nfilter true\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(Boolean))))\n\n# Boolean: false\n\nfilte"
  },
  {
    "path": "grammars/prql-lezer/test/numbers.txt",
    "chars": 914,
    "preview": "# Integer\n\nfilter 123\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(Integer))))\n\n# Integer with underscore\n\nfil"
  },
  {
    "path": "grammars/prql-lezer/test/operators.txt",
    "chars": 1468,
    "preview": "# == Equals\n\nfilter foo == bar\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(BinaryExpression(Identifier,Compar"
  },
  {
    "path": "grammars/prql-lezer/test/strings.txt",
    "chars": 1273,
    "preview": "# Single-quoted string\n\nfilter 'Hello'\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(String))))\n\n# Double-quote"
  },
  {
    "path": "grammars/prql-lezer/test/test-prql.js",
    "chars": 560,
    "preview": "import { parser } from \"../dist/index.js\";\nimport { fileTests } from \"@lezer/generator/dist/test\";\n\nimport * as fs from "
  },
  {
    "path": "grammars/prql-lezer/test/tuples.txt",
    "chars": 1057,
    "preview": "# Tuple on one line\n\ntest {foo, bar, baz}\n\n==>\n\nQuery(Pipeline(CallExpression(Identifier,ArgList(TupleExpression(Identif"
  },
  {
    "path": "grammars/raku/META6.json",
    "chars": 487,
    "preview": "{\n  \"name\": \"PRQL\",\n  \"version\": \"0.0.1\",\n  \"description\": \"Grammar for PRQL\",\n  \"tags\": [\"data\", \"grammar\", \"pipeline\","
  },
  {
    "path": "grammars/raku/README.md",
    "chars": 594,
    "preview": "# Raku grammar\n\nPRQL grammar for Raku.\n\n## Instructions\n\n```raku\nuse lib '.';\nuse prql;\n\nsay PRQL.parse('from employees'"
  },
  {
    "path": "grammars/raku/lib/prql.rakumod",
    "chars": 5767,
    "preview": "=begin pod\n\n=head1 NAME\n\nprql.rakumod - Grammar for PRQL.\n\n=head1 SYNOPSIS\n\n    use PRQL;\n\n    # Parse a simple PRQL que"
  },
  {
    "path": "grammars/raku/t/arithmetics.rakutest",
    "chars": 942,
    "preview": "use Test;\nuse prql;\n\nplan 6;\n\n# Plus\nok PRQL.parse('filter 10 + 10.5');\n#query(pipeline(call-expression(identifier,arg-l"
  },
  {
    "path": "grammars/raku/t/arrays.rakutest",
    "chars": 1109,
    "preview": "use Test;\nuse prql;\n\nplan 6;\n\n# Array on one line\nok PRQL.parse('filter [foo, bar, baz]');\n#query(pipeline(call-expressi"
  },
  {
    "path": "grammars/raku/t/datetime.rakutest",
    "chars": 922,
    "preview": "use Test;\nuse prql;\n\nplan 7;\n\n# Date YYYY-MM-DD\nok PRQL.parse('filter @1970-01-01');\n#query(pipeline(call-expression(ide"
  },
  {
    "path": "grammars/raku/t/full_queries.rakutest",
    "chars": 1643,
    "preview": "use Test;\nuse prql;\n\nplan 1;\n\nok PRQL.parse(q:to/END/);\n# Website showcasing example\nfrom invoices\nfilter invoice_date >"
  },
  {
    "path": "grammars/raku/t/identifiers.rakutest",
    "chars": 410,
    "preview": "use Test;\nuse prql;\n\nplan 3;\n\n# Basic identifier\nok PRQL.parse('filter foo');\n#query(pipeline(call-expression(identifier"
  },
  {
    "path": "grammars/raku/t/misc.rakutest",
    "chars": 3982,
    "preview": "use Test;\nuse prql;\n\nplan 23;\n\n# Boolean: true\nok PRQL.parse('filter true');\n#query(pipeline(call-expression(identifier,"
  },
  {
    "path": "grammars/raku/t/numbers.rakutest",
    "chars": 1071,
    "preview": "use Test;\nuse prql;\n\nplan 9;\n\n# Integer\nok PRQL.parse('filter 123');\n#query(pipeline(call-expression(identifier,arg-list"
  },
  {
    "path": "grammars/raku/t/operators.rakutest",
    "chars": 1661,
    "preview": "use Test;\nuse prql;\n\nplan 10;\n\n# == Equals\nok PRQL.parse('filter foo == bar');\n#query(pipeline(call-expression(identifie"
  },
  {
    "path": "grammars/raku/t/strings.rakutest",
    "chars": 1466,
    "preview": "use Test;\nuse prql;\n\nplan 11;\n\n# Single-quoted string\nok PRQL.parse(\"filter 'Hello'\");\n#query(pipeline(call-expression(i"
  },
  {
    "path": "grammars/raku/t/tuples.rakutest",
    "chars": 1208,
    "preview": "use Test;\nuse prql;\n\nplan 5;\n\n# Tuple on one line\nok PRQL.parse('test {foo, bar, baz}');\n#query(pipeline(call-expression"
  },
  {
    "path": "grammars/vim/README.md",
    "chars": 454,
    "preview": "# Syntax highlighting for Vim\n\nThis is a syntax highlighting file for Vim and Neovim.\n\n## Installation\n\n### For Vim\n\nCop"
  },
  {
    "path": "prqlc/README.md",
    "chars": 219,
    "preview": "# PRQL compiler\n\nReference implementation of a compiler from PRQL to SQL, written in Rust.\n\nThe bindings for other progr"
  },
  {
    "path": "prqlc/Taskfile.yaml",
    "chars": 2058,
    "preview": "# prqlc Taskfile - core development tasks for fast iteration.\n#\n# This file contains tasks for prqlc development:\n# - te"
  },
  {
    "path": "prqlc/bindings/dotnet/.gitignore",
    "chars": 8,
    "preview": "bin\nobj\n"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/Message.cs",
    "chars": 1277,
    "preview": "using System.Runtime.InteropServices;\n\nnamespace Prql.Compiler\n{\n    /// <summary>\n    /// Compile result message.\n    /"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/MessageKind.cs",
    "chars": 468,
    "preview": "using System;\n\nnamespace Prql.Compiler\n{\n    /// <summary>\n    /// Compile message kind. Currently only Error is impleme"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/NativePrqlCompilerOptions.cs",
    "chars": 404,
    "preview": "namespace Prql.Compiler\n{\n    internal struct NativePrqlCompilerOptions\n    {\n        public bool Format;\n        public"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/NativeResult.cs",
    "chars": 304,
    "preview": "using System;\n\nnamespace Prql.Compiler\n{\n    internal struct NativeResult\n    {\n#pragma warning disable CS0649 // Field "
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/PrqlCompiler.cs",
    "chars": 5647,
    "preview": "using System;\nusing System.Runtime.InteropServices;\n\nnamespace Prql.Compiler\n{\n    /// <summary>\n    /// The PRQL compil"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/PrqlCompiler.csproj",
    "chars": 1300,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n  </PropertyG"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/PrqlCompilerOptions.cs",
    "chars": 946,
    "preview": "using System.Runtime.InteropServices;\n\nnamespace Prql.Compiler\n{\n    /// <summary>\n    /// Compilation options for SQL b"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/Result.cs",
    "chars": 939,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\n\nnamespace Prql.Compiler\n{\n  "
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/SourceLocation.cs",
    "chars": 699,
    "preview": "using System.Runtime.InteropServices;\n\nnamespace Prql.Compiler\n{\n    /// <summary>\n    /// Location within a source file"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler/Span.cs",
    "chars": 510,
    "preview": "using System.Runtime.InteropServices;\n\nnamespace Prql.Compiler\n{\n    /// <summary>\n    /// Identifier of a location in s"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler.Tests/CompilerTest.cs",
    "chars": 1295,
    "preview": "using Prql.Compiler;\n\nnamespace Prql.Compiler.Tests;\n\nsealed public class CompilerTest\n{\n    [Fact]\n    public void ToCo"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler.Tests/PrqlCompiler.Tests.csproj",
    "chars": 982,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>e"
  },
  {
    "path": "prqlc/bindings/dotnet/PrqlCompiler.Tests/Usings.cs",
    "chars": 20,
    "preview": "global using Xunit;\n"
  },
  {
    "path": "prqlc/bindings/dotnet/README.md",
    "chars": 1016,
    "preview": "# prql-dotnet\n\n`prql-net` offers PRQL bindings for .NET bindings as a `netstandard2.0` library.\n\nIt provides the `PrqlCo"
  },
  {
    "path": "prqlc/bindings/dotnet/prql-net.sln",
    "chars": 1490,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.3190"
  },
  {
    "path": "prqlc/bindings/elixir/.formatter.exs",
    "chars": 97,
    "preview": "# Used by \"mix format\"\n[\n  inputs: [\"{mix,.formatter}.exs\", \"{config,lib,test}/**/*.{ex,exs}\"]\n]\n"
  },
  {
    "path": "prqlc/bindings/elixir/.gitignore",
    "chars": 649,
    "preview": "# The directory Mix will write compiled artifacts to.\n/_build/\n\n# If you run \"mix test --cover\", coverage assets end up "
  },
  {
    "path": "prqlc/bindings/elixir/README.md",
    "chars": 1055,
    "preview": "# PRQL\n\n[PRQL](https://prql-lang.org/) bindings for Elixir.\n\n## Installation\n\n```elixir\ndef deps do\n  [\n    {:prql, \"~> "
  },
  {
    "path": "prqlc/bindings/elixir/lib/prql/errors.ex",
    "chars": 320,
    "preview": "defmodule PRQL.PRQLError do\n  @moduledoc \"\"\"\n  Represents an error returned from PRQL compiler.\n\n  `:error` contains the"
  },
  {
    "path": "prqlc/bindings/elixir/lib/prql/native.ex",
    "chars": 839,
    "preview": "defmodule PRQL.Native do\n  @moduledoc false\n  use Rustler, otp_app: :prql\n\n  def compile(_prql_query, _options), do: e()"
  },
  {
    "path": "prqlc/bindings/elixir/lib/prql.ex",
    "chars": 3877,
    "preview": "defmodule PRQL do\n  @moduledoc \"\"\"\n  Documentation for `PRQL`.\n\n  This module provide Elixir bindings for [PRQL](https:/"
  },
  {
    "path": "prqlc/bindings/elixir/mix.exs",
    "chars": 794,
    "preview": "# Testing Claude commit capability\ndefmodule PRQL.MixProject do\n  use Mix.Project\n\n  def project do\n    [\n      app: :pr"
  },
  {
    "path": "prqlc/bindings/elixir/native/prql/.cargo/config.toml",
    "chars": 382,
    "preview": "# Note that this doesn't apply when compiling from the workspace root\n\n# (also it seems to work at first glance without "
  },
  {
    "path": "prqlc/bindings/elixir/native/prql/Cargo.toml",
    "chars": 559,
    "preview": "[package]\nauthors = [\"Kasun Vithanage <kasvith.me@gmail.com>\"]\ndescription = \"Elixir NIF bindings for prqlc\"\nname = \"prq"
  },
  {
    "path": "prqlc/bindings/elixir/native/prql/README.md",
    "chars": 179,
    "preview": "# NIF for Elixir.PRQL\n\n## To build the NIF module:\n\n- Your NIF will now build along with your project.\n- NIFs are loaded"
  },
  {
    "path": "prqlc/bindings/elixir/native/prql/src/lib.rs",
    "chars": 4390,
    "preview": "// These bindings aren't relevant on wasm\n#![cfg(not(target_family = \"wasm\"))]\n// TODO: unclear why we need this `allow`"
  },
  {
    "path": "prqlc/bindings/elixir/test/prql_test.exs",
    "chars": 1199,
    "preview": "defmodule PRQLTest do\n  use ExUnit.Case\n  doctest PRQL\n\n  @compile_opts [signature_comment: false]\n\n  test \"compiles PRQ"
  },
  {
    "path": "prqlc/bindings/elixir/test/test_helper.exs",
    "chars": 15,
    "preview": "ExUnit.start()\n"
  },
  {
    "path": "prqlc/bindings/java/.gitignore",
    "chars": 43,
    "preview": "target/\n\n**/libprql_java*\n**/prql_java.dll\n"
  },
  {
    "path": "prqlc/bindings/java/Cargo.toml",
    "chars": 422,
    "preview": "[package]\nname = \"prql-java\"\npublish = false\n\nedition.workspace = true\nlicense.workspace = true\nrepository.workspace = t"
  },
  {
    "path": "prqlc/bindings/java/DEVELOPMENT.md",
    "chars": 2180,
    "preview": "# development description for prql-java module\n\n---\n\n## Implementation\n\nWe implement Rust bindings to Java with\n[JNI](ht"
  },
  {
    "path": "prqlc/bindings/java/README.md",
    "chars": 677,
    "preview": "# prql-java\n\n`prql-java` offers Java bindings to the `prqlc` Rust library. It exposes a Java\nnative method `public stati"
  },
  {
    "path": "prqlc/bindings/java/cross.sh",
    "chars": 2590,
    "preview": "#!/bin/bash\n\nPRQL_JAVA_MODULE=$1\necho PRQL_JAVA_MODULE=\"${PRQL_JAVA_MODULE}\"\nCONTEXT_PATH=$(pwd)\necho CONTEXT_PATH=\"${CO"
  },
  {
    "path": "prqlc/bindings/java/java/.mvn/wrapper/maven-wrapper.properties",
    "chars": 1019,
    "preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE f"
  },
  {
    "path": "prqlc/bindings/java/java/build.sh",
    "chars": 1154,
    "preview": "#!/bin/sh\nset -e\n\n# TODO: use a task file for these build scripts\n\nJAVA_SRC_HOME=$1\nARCH=\"$(uname -m)\"\nKERNEL_NAME=\"$(un"
  },
  {
    "path": "prqlc/bindings/java/java/mvnw",
    "chars": 9781,
    "preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
  },
  {
    "path": "prqlc/bindings/java/java/mvnw.cmd",
    "chars": 6702,
    "preview": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software F"
  },
  {
    "path": "prqlc/bindings/java/java/pom.xml",
    "chars": 7849,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "prqlc/bindings/java/java/src/main/java/org/prql/prql4j/Environment.java",
    "chars": 4982,
    "preview": "// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.\n// Original License: https://github.com/faceboo"
  },
  {
    "path": "prqlc/bindings/java/java/src/main/java/org/prql/prql4j/NativeLibraryLoader.java",
    "chars": 5006,
    "preview": "// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.\n// Original License: https://github.com/faceboo"
  },
  {
    "path": "prqlc/bindings/java/java/src/main/java/org/prql/prql4j/PrqlCompiler.java",
    "chars": 944,
    "preview": "package org.prql.prql4j;\n\nimport java.io.IOException;\n\npublic class PrqlCompiler {\n\n    /**\n     * compile PRQL to SQL\n "
  },
  {
    "path": "prqlc/bindings/java/java/src/main/resources/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "prqlc/bindings/java/java/src/test/java/org/prql/prql4j/PrqlCompilerTest.java",
    "chars": 674,
    "preview": "package org.prql.prql4j;\n\nimport org.junit.Test;\n\npublic class PrqlCompilerTest {\n    @Test\n    public void compile() th"
  },
  {
    "path": "prqlc/bindings/java/java/src/test/resources/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "prqlc/bindings/java/src/lib.rs",
    "chars": 2456,
    "preview": "use std::str::FromStr;\n\nuse jni::objects::{JClass, JString};\nuse jni::sys::{jboolean, jstring};\nuse jni::JNIEnv;\nuse prq"
  },
  {
    "path": "prqlc/bindings/js/Cargo.toml",
    "chars": 2452,
    "preview": "[package]\ndescription = \"Javascript bindings for prqlc\"\nname = \"prqlc-js\"\npublish = false\n\nedition.workspace = true\nlice"
  },
  {
    "path": "prqlc/bindings/js/README.md",
    "chars": 4011,
    "preview": "# prqlc-js\n\nJavaScript bindings for [`prqlc`](https://github.com/PRQL/prql/).\n\n## Installation\n\n```sh\nnpm install prqlc\n"
  },
  {
    "path": "prqlc/bindings/js/package.json",
    "chars": 1225,
    "preview": "{\n  \"browser\": \"dist/web/prqlc_js.js\",\n  \"description\": \"JavaScript bindings for prqlc\",\n  \"devDependencies\": {\n    \"cha"
  },
  {
    "path": "prqlc/bindings/js/src/lib.rs",
    "chars": 3635,
    "preview": "#![cfg(target_family = \"wasm\")]\n\nuse std::{default::Default, str::FromStr};\n\nuse prqlc::Target;\nuse wasm_bindgen::prelud"
  },
  {
    "path": "prqlc/bindings/js/tests/test_all.mjs",
    "chars": 3852,
    "preview": "import assert from \"assert\";\nimport { expect } from \"chai\";\nimport prqlc from \"../dist/node/prqlc_js.js\";\n\nconst employe"
  },
  {
    "path": "prqlc/bindings/php/.editorconfig",
    "chars": 58,
    "preview": "root = true\n\n[*.php]\nindent_size = 4\nindent_style = space\n"
  },
  {
    "path": "prqlc/bindings/php/.gitignore",
    "chars": 13,
    "preview": "vendor/\nlib/\n"
  },
  {
    "path": "prqlc/bindings/php/README.md",
    "chars": 1410,
    "preview": "# prql-php\n\n`prql-php` offers PHP bindings to `prqlc` crate through FFI.\n\nIt provides the `Compiler` class which contain"
  },
  {
    "path": "prqlc/bindings/php/composer.json",
    "chars": 728,
    "preview": "{\n  \"name\": \"prql/compiler\",\n  \"description\": \"PRQL compiler bindings.\",\n  \"keywords\": [\n    \"prql\",\n    \"sql\"\n  ],\n  \"h"
  },
  {
    "path": "prqlc/bindings/php/phpstan.neon",
    "chars": 784,
    "preview": "parameters:\n    level: 9\n    paths:\n        - src\n        - tests\n    ignoreErrors:\n        # Since PHPStan doesn't know"
  },
  {
    "path": "prqlc/bindings/php/src/Compiler.php",
    "chars": 7099,
    "preview": "<?php\n\n/**\n * PRQL compiler bindings.\n *\n * This library requires the PHP FFI extension.\n * It also requires the libprql"
  },
  {
    "path": "prqlc/bindings/php/src/Message.php",
    "chars": 839,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Prql\\Compiler;\n\n/**\n * Compile result message.\n */\nfinal class Message\n{\n    "
  },
  {
    "path": "prqlc/bindings/php/src/MessageKind.php",
    "chars": 314,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Prql\\Compiler;\n\n/**\n * Compile message kind. Currently only Error is implemen"
  },
  {
    "path": "prqlc/bindings/php/src/Options.php",
    "chars": 999,
    "preview": "<?php\n\n/**\n * PRQL compiler bindings.\n *\n * This library requires the PHP FFI extension.\n * It also requires the libprql"
  },
  {
    "path": "prqlc/bindings/php/src/Result.php",
    "chars": 250,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Prql\\Compiler;\n\n/**\n * Result of compilation.\n */\nfinal class Result\n{\n    /*"
  },
  {
    "path": "prqlc/bindings/php/src/SourceLocation.php",
    "chars": 381,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Prql\\Compiler;\n\n/**\n * Location within a source file.\n */\nfinal class SourceL"
  },
  {
    "path": "prqlc/bindings/php/src/Span.php",
    "chars": 283,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Prql\\Compiler;\n\n/**\n * Identifier of a location in source.\n * Contains offset"
  },
  {
    "path": "prqlc/bindings/php/tests/CompilerTest.php",
    "chars": 2053,
    "preview": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Prql\\Compiler\\Test;\n\nuse Prql\\Compiler\\Compiler;\nuse Prql\\Compiler\\Options;\nu"
  },
  {
    "path": "prqlc/bindings/prqlc-c/Cargo.toml",
    "chars": 760,
    "preview": "[package]\nname = \"prqlc-c\"\npublish = false\n\nedition.workspace = true\nlicense.workspace = true\nrepository.workspace = tru"
  },
  {
    "path": "prqlc/bindings/prqlc-c/README.md",
    "chars": 2457,
    "preview": "# PRQL C library\n\n## Description\n\nThis module compiles PRQL as a library (both `.a` and `.so` are generated). This\nallow"
  },
  {
    "path": "prqlc/bindings/prqlc-c/cbindgen.toml",
    "chars": 353,
    "preview": "language = \"C\"\n\nheader = '''/*\n * PRQL is a modern language for transforming data — a simple, powerful, pipelined SQL re"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-c/Makefile",
    "chars": 547,
    "preview": "PRQL_PROJECT=../../../../..\n\nrun: build\n\t./main.out\n\nbuild-prql:\n\tcargo build --package prqlc-c --release\n\nUNAME_S := $("
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-c/README.md",
    "chars": 110,
    "preview": "# Basic C example\n\nA minimal example for using prql-lib with `gcc` and `make`.\n\n## How to run\n\n      make run\n"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-c/main.c",
    "chars": 1657,
    "preview": "#include <stdio.h>\n\n#include <prqlc.h>\n\nvoid print_result(CompileResult res) {\n  printf(\"---- [ Compiled with %ld errors"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-cpp/Makefile",
    "chars": 530,
    "preview": "PRQL_PROJECT=../../../../..\n\nrun: build\n\t./main.out\n\nbuild-prql:\n\tcargo build --package prqlc-c --release\n\nUNAME_S := $("
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-cpp/README.md",
    "chars": 109,
    "preview": "# Basic C++ example\n\nA minimal example for using prqlc-c with `gcc` and `make`.\n\n## How to run\n\n    make run\n"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-cpp/main.cpp",
    "chars": 468,
    "preview": "#include <cstring>\n#include <iostream>\n\n#include \"prqlc.hpp\"\n\nusing namespace prqlc;\n\nvoid print_result(CompileResult re"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-zig/.gitignore",
    "chars": 23,
    "preview": "zig-cache/\nzig-out/\nc/\n"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-zig/README.md",
    "chars": 116,
    "preview": "# Basic Zig example\n\nA minimal example for using prql-lib with Zig.\n\nRun with `task zig` from the root of the repo.\n"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-zig/Taskfile.yaml",
    "chars": 753,
    "preview": "# yaml-language-server: $schema=https://json.schemastore.org/taskfile.json\n\nversion: 3\n\nvars:\n  project_root: \"../../../"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-zig/build.zig",
    "chars": 3695,
    "preview": "const std = @import(\"std\");\n\n// Although this function looks imperative, note that its job is to\n// declaratively constr"
  },
  {
    "path": "prqlc/bindings/prqlc-c/examples/minimal-zig/src/main.zig",
    "chars": 912,
    "preview": "const std = @import(\"std\");\nconst prql = @cImport({\n    @cInclude(\"../c/prqlc.h\");\n});\n\npub fn main() !void {\n    var ta"
  },
  {
    "path": "prqlc/bindings/prqlc-c/prqlc.h",
    "chars": 4882,
    "preview": "/*\n * PRQL is a modern language for transforming data — a simple, powerful,\n * pipelined SQL replacement\n *\n * License: "
  },
  {
    "path": "prqlc/bindings/prqlc-c/prqlc.hpp",
    "chars": 4601,
    "preview": "/*\n * PRQL is a modern language for transforming data — a simple, powerful,\n * pipelined SQL replacement\n *\n * License: "
  },
  {
    "path": "prqlc/bindings/prqlc-c/src/lib.rs",
    "chars": 10350,
    "preview": "#![cfg(not(target_family = \"wasm\"))]\n\nextern crate libc;\n\nuse std::ffi::CStr;\nuse std::ffi::CString;\nuse std::str::FromS"
  },
  {
    "path": "prqlc/bindings/prqlc-python/.gitignore",
    "chars": 647,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n.pytest_cache/\n*.py[cod]\n\n# C extensions\n*.so\n\n# Distribution / pac"
  },
  {
    "path": "prqlc/bindings/prqlc-python/Cargo.toml",
    "chars": 930,
    "preview": "[package]\nbuild = \"build.rs\"\ndescription = \"Python bindings for prqlc\"\nname = \"prqlc-python\"\npublish = false\n\nedition.wo"
  },
  {
    "path": "prqlc/bindings/prqlc-python/README.md",
    "chars": 4003,
    "preview": "# PRQL - Python Bindings\n\nPython bindings for [PRQL](https://github.com/PRQL/prql), the Pipelined\nRelational Query Langu"
  },
  {
    "path": "prqlc/bindings/prqlc-python/Taskfile.yaml",
    "chars": 443,
    "preview": "version: \"3\"\n\nvars:\n  build_dir: \"../../../target/python\"\n\ntasks:\n  build:\n    desc: Build\n    vars:\n      profile: \"dev"
  },
  {
    "path": "prqlc/bindings/prqlc-python/build.rs",
    "chars": 257,
    "preview": "// From https://pyo3.rs/v0.14.5/building_and_distribution.html#macos\n// Note the alternative static option with `config."
  },
  {
    "path": "prqlc/bindings/prqlc-python/noxfile.py",
    "chars": 1364,
    "preview": "\"\"\"Nox session configuration.\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom typing import List\n\nimport nox\nfrom nox.sessio"
  },
  {
    "path": "prqlc/bindings/prqlc-python/pyproject.toml",
    "chars": 1285,
    "preview": "[build-system]\nbuild-backend = \"maturin\"\nrequires = [\"maturin[uv_build]>=1.7.0,<2.0\"]\n\n[project]\nclassifiers = [\n  \"Prog"
  },
  {
    "path": "prqlc/bindings/prqlc-python/python/prqlc/__init__.py",
    "chars": 200,
    "preview": "# ruff: noqa: F403, F405\n#\n# This is the default module init provided automatically by Maturin.\nfrom .prqlc import *\n\n__"
  },
  {
    "path": "prqlc/bindings/prqlc-python/python/prqlc/__init__.pyi",
    "chars": 523,
    "preview": "from typing import List, Optional\n\nclass CompileOptions:\n    def __init__(\n        self,\n        *,\n        format: bool"
  },
  {
    "path": "prqlc/bindings/prqlc-python/python/prqlc/debug.pyi",
    "chars": 90,
    "preview": "def prql_lineage(prql_query: str) -> str: ...\ndef pl_to_lineage(pl_json: str) -> str: ...\n"
  },
  {
    "path": "prqlc/bindings/prqlc-python/python/prqlc/py.typed",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "prqlc/bindings/prqlc-python/python/tests/test_all.py",
    "chars": 2574,
    "preview": "import json\n\nimport prqlc\n\n\ndef test_all() -> None:\n    \"\"\"\n    Test the basic python functions\n\n    Because the AST was"
  },
  {
    "path": "prqlc/bindings/prqlc-python/src/lib.rs",
    "chars": 9617,
    "preview": "#![cfg(not(target_family = \"wasm\"))]\nuse std::str::FromStr;\n\nuse prqlc_lib::ErrorMessages;\nuse pyo3::{exceptions, prelud"
  },
  {
    "path": "prqlc/packages/snap/snapcraft.yaml",
    "chars": 959,
    "preview": "name: prqlc\ntitle: PRQL Compiler\nbase: core22\nversion: \"0.13.12\"\nsummary: CLI for PRQL, a modern language for transformi"
  }
]

// ... and 692 more files (download for full content)

About this extraction

This page contains the full source code of the PRQL/prql GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 892 files (3.1 MB), approximately 866.6k tokens, and a symbol index with 2039 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!