Skip to main content

Postgres grammar for tree-sitter

Project description

tree-sitter-postgres

A tree-sitter grammar for PostgreSQL, generated directly from PostgreSQL's Bison grammar (gram.y) and keyword list (kwlist.h).

Features

  • Current as of PostgreSQL 18 (generated from REL_18_3)
  • 727 grammar rules covering the full PostgreSQL SQL syntax
  • 494 case-insensitive keywords across all four PG keyword categories
  • Correct operator precedence1 + 2 * 3 parses as 1 + (2 * 3)
  • PL/pgSQL support via a separate grammar with language injection
  • Generated, not hand-written — regenerate for any PostgreSQL version

Quick start

npm install
cd postgres && npx tree-sitter generate && npx tree-sitter test

Regenerating from PostgreSQL source

The grammar is generated from a local PostgreSQL checkout. Set PG_SOURCE_DIR to point at your PostgreSQL source tree:

export PG_SOURCE_DIR=/path/to/postgres

# Using just (recommended)
just generate

# Or run the script directly
node script/generate-grammar.js "$PG_SOURCE_DIR"
cd postgres && npx tree-sitter generate

Input files

File Source
src/backend/parser/gram.y Bison grammar (733 rules, 3236 alternatives)
src/include/parser/kwlist.h Keyword definitions (494 keywords)

Generator scripts

Script Purpose
script/generate-grammar.js Orchestrator — reads PG source, writes postgres/grammar.js
script/parse-gram-y.js Parses Bison grammar: rules, terminals, precedence, %prec annotations
script/parse-kwlist.js Parses keyword list into categories
script/codegen.js Generates tree-sitter grammar with precedence and optional-rule handling
postgres/harvest-conflicts.sh Iteratively discovers GLR conflicts needed by tree-sitter

Repository structure

postgres/               PostgreSQL SQL grammar
  grammar.js            Generated tree-sitter grammar
  src/                  Generated parser (C)
  test/corpus/          Test cases (35 tests)
  known-conflicts.json  GLR conflict pairs

plpgsql/                PL/pgSQL grammar
  grammar.js            Hand-written tree-sitter grammar
  src/scanner.c         External scanner for dollar-quoting and keywords
  test/corpus/          Test cases
  queries/              Highlights and injection queries

script/                 Shared generator code
  generate-grammar.js   SQL grammar orchestrator
  parse-gram-y.js       Bison parser
  parse-kwlist.js       Keyword parser
  codegen.js            Grammar code generator

bindings/               Language bindings (Node, Rust, Python, Go, Swift, C)

Design notes

Empty rule handling

Bison's /* EMPTY */ alternatives cannot be directly translated — tree-sitter forbids non-start rules that match the empty string. The generator propagates optionality upward via a fixpoint loop and wraps references with optional() at call sites.

Operator precedence

Binary operators are split into a separate a_expr_prec rule resolved by static precedence (no GLR), while complex patterns (IS, IN, BETWEEN, LIKE, subquery operators) stay in a_expr with GLR conflict resolution. Both prec.left/prec.right (generation-time) and prec.dynamic (runtime) are emitted.

PL/pgSQL

PL/pgSQL is implemented as a separate hand-written grammar in plpgsql/ with an external scanner for dollar-quoting and context-sensitive keywords. SQL expressions and statements within PL/pgSQL blocks are delegated to the postgres grammar via tree-sitter language injection (plpgsql/queries/injections.scm).

License

BSD 3-Clause

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tree_sitter_postgres-1.2.0.tar.gz (6.0 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tree_sitter_postgres-1.2.0-cp39-abi3-win_arm64.whl (796.8 kB view details)

Uploaded CPython 3.9+Windows ARM64

tree_sitter_postgres-1.2.0-cp39-abi3-win_amd64.whl (779.2 kB view details)

Uploaded CPython 3.9+Windows x86-64

tree_sitter_postgres-1.2.0-cp39-abi3-musllinux_1_2_x86_64.whl (880.7 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

tree_sitter_postgres-1.2.0-cp39-abi3-musllinux_1_2_aarch64.whl (889.8 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

tree_sitter_postgres-1.2.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (889.5 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

tree_sitter_postgres-1.2.0-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (882.2 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

tree_sitter_postgres-1.2.0-cp39-abi3-macosx_11_0_arm64.whl (898.0 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

tree_sitter_postgres-1.2.0-cp39-abi3-macosx_10_9_x86_64.whl (784.9 kB view details)

Uploaded CPython 3.9+macOS 10.9+ x86-64

File details

Details for the file tree_sitter_postgres-1.2.0.tar.gz.

File metadata

  • Download URL: tree_sitter_postgres-1.2.0.tar.gz
  • Upload date:
  • Size: 6.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tree_sitter_postgres-1.2.0.tar.gz
Algorithm Hash digest
SHA256 51b1cdfbab6f10c18fe4131860533aeef309aa9901c808c62f944269ec12b028
MD5 013d1e8b8c6a7849b190b450f9b0ef10
BLAKE2b-256 469035affb4a4bfbf49be59a380c17e409d65d5097bd208552f8ad970d7a87b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0.tar.gz:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_postgres-1.2.0-cp39-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.2.0-cp39-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 d27bf5db5dd8737223aefec15c2571b719d42f95464551647185022b530cc490
MD5 c49b0b124fe9027286a8171d657fc218
BLAKE2b-256 1890b1b463c33d31db8eba45a752f132eb7d8833aba6e520a0edf2ba4904c06a

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0-cp39-abi3-win_arm64.whl:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_postgres-1.2.0-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.2.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5dd1a3eda564f428772e5d164ba8d8a29a539a331462c79bca0e2c642b9f9b30
MD5 e47f82f33a2ba81aa9b4188c662590de
BLAKE2b-256 df8265f88f8a0d879c373fd155f9437e608f12736e6930fe8a465caa04b34897

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0-cp39-abi3-win_amd64.whl:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_postgres-1.2.0-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.2.0-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9b5105064dbcf2b40e539703d0a81c1d328adb48db993d36c7e25a5bf7911d67
MD5 72e4c05f0e5b49810c426f91f83bdb2f
BLAKE2b-256 47b91400a89d312d3e47f17138cd440f38be940af4efd6446993038fa5898fbd

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0-cp39-abi3-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_postgres-1.2.0-cp39-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.2.0-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 455ea397e8535de5bf5f46b51e125b34a19e244e60418d164d153534e287b8cb
MD5 716f147cfd4ae7e978d7c6c60ff4420d
BLAKE2b-256 a5d99e8e762472651797f39efbbce2310a7c69695b787062bd7c3f9693bec847

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0-cp39-abi3-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_postgres-1.2.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.2.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4b775190440183c0f60079df1d7a3b2eceeca92debc3bffaf4d94d1fe284e11c
MD5 dec9b8cfab5855628420419d470f7e86
BLAKE2b-256 50b30158dcfa61d1c04afa323369768bf751f891c82f7ff7ec975b43a111a594

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_postgres-1.2.0-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.2.0-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 3f2554d7c2f68e93a8ff223ba961d0d9f36bcb7feb66eff17b910fba5efc4236
MD5 4075fa9d311ac65ac7c56f170495745c
BLAKE2b-256 9722f945f8d5e92d4a70cf52e8cd16fe810a7a48cc4e64c04612cf5f7a49f0f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_postgres-1.2.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.2.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 be00097e7644e5c30ba381bfd86a3fc12de74ab6c0c5e917b7efdcb073d2220a
MD5 14aa7238d0e59082dab6e8b5e284a779
BLAKE2b-256 e543434e66a13351ead58876f7158c55d3962c96ea295c55075c0b49148c8fcf

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_postgres-1.2.0-cp39-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.2.0-cp39-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d1c146b54371210a08e815b641a6daa60f82cd23fa8ea067f381679b16718519
MD5 a10a7fb327472f5548359374e2ab3aad
BLAKE2b-256 00fd164230bb6ea43792cd0f485ba27974d3697c01fa13d54d7f7fac8c2ddffb

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.2.0-cp39-abi3-macosx_10_9_x86_64.whl:

Publisher: publish.yml on gmr/tree-sitter-postgres

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page