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.1.2.tar.gz (5.6 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.1.2-cp39-abi3-win_arm64.whl (747.8 kB view details)

Uploaded CPython 3.9+Windows ARM64

tree_sitter_postgres-1.1.2-cp39-abi3-win_amd64.whl (764.4 kB view details)

Uploaded CPython 3.9+Windows x86-64

tree_sitter_postgres-1.1.2-cp39-abi3-musllinux_1_2_x86_64.whl (823.3 kB view details)

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

tree_sitter_postgres-1.1.2-cp39-abi3-musllinux_1_2_aarch64.whl (832.8 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

tree_sitter_postgres-1.1.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (831.8 kB view details)

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

tree_sitter_postgres-1.1.2-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (824.7 kB view details)

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

tree_sitter_postgres-1.1.2-cp39-abi3-macosx_11_0_arm64.whl (841.3 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

tree_sitter_postgres-1.1.2-cp39-abi3-macosx_10_9_x86_64.whl (733.8 kB view details)

Uploaded CPython 3.9+macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: tree_sitter_postgres-1.1.2.tar.gz
  • Upload date:
  • Size: 5.6 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.1.2.tar.gz
Algorithm Hash digest
SHA256 f9a06d0434bee5d3467205f29a6dfa74cd95cd02c122e248aad28fcd8475b82a
MD5 fe53f12d9bfa11724b0aa492b9a2eb9e
BLAKE2b-256 37615ee66c5c8627a24ebb179e5f2fd702ccb93e8105b042207b467dba280bdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2.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.1.2-cp39-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.1.2-cp39-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 3588ac1d4ff28d1d0b622dd2351980ec8ed7509809c14a4c236b19c217a41bdf
MD5 ea925fd806d164112a4d3604b86eb8c9
BLAKE2b-256 bb6d86d926b24e9b5da8e35df14093e8e2caa725c44654d51f4b4d9a2baa0066

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2-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.1.2-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.1.2-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c14b8bc08746c1cd424e551530a397ebd846d2d107d32971099c265e32e12ef3
MD5 91c41841a95eb2c320da46b1f0128301
BLAKE2b-256 9162ba8a474dc387e15f0937c30828b9b728e4c19e420f30de73562b390bb876

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2-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.1.2-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.1.2-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d597078a64a4d441c4468a48fe1235800a8b90c6bab93fb81f62277cd36d730c
MD5 476923e18aed0be9d217bbb32c53767b
BLAKE2b-256 3aa8c95c09e2d6cdc35a13d9b7207910ea448afd31e4e21ade7c59b7c591e7a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2-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.1.2-cp39-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.1.2-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ee3a598fc8819f24a78e4898f8355a4c81323929009be2c614bdca476d779a46
MD5 3c08eda8dbddc93e0bbb64fa6778f7d0
BLAKE2b-256 9060c14a2c36e60fd4944f7ac8e3ede3038a2d12fb653b5a69b21ef640e696e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2-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.1.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.1.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 07d43989361fabc8c7a6171dc154a4d67c8024177363f9dd29d237866e8534bb
MD5 12f7094644818cf4de5419518fea9b67
BLAKE2b-256 f02df82575f9683931357c98f73cb440f2fdaed95e85288fe390a3d01d8c49ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2-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.1.2-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.1.2-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 43766b891ed7a636db4adcbe7d28786272068a4ffa181303ea40450d01055a32
MD5 14216873deb841ebd02515d885e79fba
BLAKE2b-256 ed6651e6330851582484e518ea2c2ee49c1dab866fb0b408b6cfadfccb0706f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2-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.1.2-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.1.2-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b347f394bac90e51b8ef801a241e2b524993f7aef62e6b306c2b8b694a228d43
MD5 cbe1615211d9071b056ca52ae1890e97
BLAKE2b-256 c4e3a0a3ff0c7840c8495f439a9e2accc17f26ee0e4d34b3b574da7c1419f1d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2-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.1.2-cp39-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_postgres-1.1.2-cp39-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cdb0d4110bb3bf7599c9eed8fbb9689128ab00c62877e4d35d37f238d9926977
MD5 424fecd944911fbc98f781830662c8b6
BLAKE2b-256 4bb01c7efbded7bd2728e52c7e10dd7c70a1daf9442be109aadc709398eb77b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_postgres-1.1.2-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