Files
PgTidy/README.md
T
Hein 4ff729eeeb feat(format): skip non-plpgsql bodies; keep literals and embedded code safe
- Only restyle bodies for plpgsql/sql; skip pl* (plpython3u, plperl, ...), c and internal
- Keep LANGUAGE clause on DO blocks
- Carry multi-line string and dollar-quoted literals verbatim in bodies and DML
- Format dollar-quoted literals that contain code (declare/begin/select/...), never format() templates
- Fix code joined onto -- comments, early flush after raise exception, dropped comment before BEGIN
- Regenerate test_mm_proc golden; document in README, plan, todo
2026-10-06 14:43:43 +02:00

106 lines
2.7 KiB
Markdown

<p align="center">
<img src="assets/logo_256.png" alt="PgTidy" width="128" />
</p>
# PgTidy
A PostgreSQL linter and formatter. Enforces consistent SQL style, detects PG-specific issues, and formats migrations, schemas, functions, procedures, and triggers.
Ships as a **CLI**, **LSP server**, **VSCode extension**, and **DataGrip plugin**.
---
## Install
```bash
go install git.warky.dev/wdevs/pgtidy/cmd/pgtidy@latest
```
Or download a pre-built binary from [Releases](https://git.warky.dev/wdevs/pgtidy/releases).
---
## CLI
```
pgtidy fmt [flags] [files...] Format SQL/PL-pgSQL (stdin if no files)
pgtidy lint [flags] [files...] Lint SQL
pgtidy config Print effective configuration
pgtidy lsp Start LSP server (stdio)
pgtidy version
```
**fmt flags**
| Flag | Effect |
|------|--------|
| `-w`, `--write` | Rewrite files in place |
| `-l`, `--list` | List unformatted files |
| `-d`, `--diff` | Print unified diff |
| `--check` | Exit non-zero if not formatted (CI) |
**Examples**
```bash
pgtidy fmt -w schema.sql # format in place
pgtidy fmt --check migrations/ # CI check
cat query.sql | pgtidy fmt # stdin → stdout
pgtidy lint schema.sql # lint a file
```
---
## Config — `.pgtidy.yaml`
Discovered by walking up from the target file. Defaults = house style.
```yaml
style:
indent: 2
keyword_case: upper # upper | lower | preserve
identifier_case: lower
type_case: lower
leading_comma: true
```
```bash
pgtidy config # print resolved config
```
---
## House Style (defaults)
- Keywords `UPPERCASE`; data types and identifiers `lowercase`
- 2-space indent
- Leading-comma lists (SELECT columns, function params)
- Function params one-per-line; `LANGUAGE`, `SECURITY`, volatility each on own line
- PL/pgSQL: `DECLARE` block vars 2-space indented; `BEGIN`/`END` at body level
- Procedural languages: bodies in `pl*` languages other than `plpgsql` (e.g. `plpython3u`, `plperl`), `c` and `internal` are left verbatim; `plpgsql` and `sql` bodies are formatted, and the function header is always formatted
- Spaces around binary operators (`=`, `<>`, `||`, `:=`); no space before `(` or around `::`, `->`, `->>`
---
## Build from Source
```bash
git clone https://git.warky.dev/wdevs/pgtidy
cd pgtidy
make build # → dist/pgtidy
make test # all tests + corpus harness
make snapshot # multi-platform binaries (requires goreleaser)
```
---
## Editor Integration
**VSCode** — install the extension from the marketplace or build locally:
```bash
make vscode-package
```
**DataGrip / JetBrains** — install via the plugin marketplace (LSP4IJ-based).
**Other LSP editors** — run `pgtidy lsp` as a stdio LSP server.