Full Code of stac-utils/pgstac for AI

main 19df4cc17995 cached
274 files
9.3 MB
2.4M tokens
8072 symbols
1 requests
Download .txt
Showing preview only (9,783K chars total). Download the full file or copy to clipboard to get everything.
Repository: stac-utils/pgstac
Branch: main
Commit: 19df4cc17995
Files: 274
Total size: 9.3 MB

Directory structure:
gitextract_odjuxhd0/

├── .devcontainer/
│   └── devcontainer.json
├── .dockerignore
├── .editorconfig
├── .github/
│   ├── copilot-instructions.md
│   ├── dependabot.yml
│   ├── instructions/
│   │   ├── migrations.instructions.md
│   │   ├── pypgstac.instructions.md
│   │   ├── scripts.instructions.md
│   │   └── sql-source.instructions.md
│   ├── prompts/
│   │   ├── add-sql-function.prompt.md
│   │   ├── debug-loader.prompt.md
│   │   └── stage-version.prompt.md
│   └── workflows/
│       ├── continuous-integration.yml
│       ├── deploy_mkdocs.yml
│       └── release.yml
├── .gitignore
├── .pre-commit-config.yaml
├── AGENTS.md
├── CHANGELOG.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── docker/
│   ├── pgstac/
│   │   ├── Dockerfile
│   │   └── dbinit/
│   │       └── pgstac.sh
│   └── pypgstac/
│       └── Dockerfile
├── docker-compose.yml
├── docs/
│   ├── mkdocs.yml
│   └── src/
│       ├── benchmark.json
│       ├── item_size_analysis.ipynb
│       ├── pgstac.md
│       └── pypgstac.md
├── scripts/
│   ├── cibuild
│   ├── cipublish
│   ├── console
│   ├── container-scripts/
│   │   ├── format
│   │   ├── initpgstac
│   │   ├── loadsampledata
│   │   ├── makemigration
│   │   ├── pgstac_restore
│   │   ├── resetpgstac
│   │   ├── stageversion
│   │   └── test
│   ├── format
│   ├── makemigration
│   ├── migrate
│   ├── pgstacenv
│   ├── runinpypgstac
│   ├── server
│   ├── setup
│   ├── stageversion
│   ├── test
│   └── update
└── src/
    ├── pgstac/
    │   ├── migrations/
    │   │   ├── pgstac.0.1.9-0.2.3.sql
    │   │   ├── pgstac.0.1.9.sql
    │   │   ├── pgstac.0.2.3-0.2.4.sql
    │   │   ├── pgstac.0.2.3.sql
    │   │   ├── pgstac.0.2.4-0.2.5.sql
    │   │   ├── pgstac.0.2.4-0.2.7.sql
    │   │   ├── pgstac.0.2.4.sql
    │   │   ├── pgstac.0.2.5-0.2.7.sql
    │   │   ├── pgstac.0.2.5.sql
    │   │   ├── pgstac.0.2.7-0.2.8.sql
    │   │   ├── pgstac.0.2.7.sql
    │   │   ├── pgstac.0.2.8-0.2.9.sql
    │   │   ├── pgstac.0.2.8.sql
    │   │   ├── pgstac.0.2.9-0.3.0.sql
    │   │   ├── pgstac.0.2.9.sql
    │   │   ├── pgstac.0.3.0-0.3.1.sql
    │   │   ├── pgstac.0.3.0.sql
    │   │   ├── pgstac.0.3.1-0.3.2.sql
    │   │   ├── pgstac.0.3.1.sql
    │   │   ├── pgstac.0.3.2-0.3.3.sql
    │   │   ├── pgstac.0.3.2.sql
    │   │   ├── pgstac.0.3.3-0.3.4.sql
    │   │   ├── pgstac.0.3.3.sql
    │   │   ├── pgstac.0.3.4-0.3.5.sql
    │   │   ├── pgstac.0.3.4.sql
    │   │   ├── pgstac.0.3.5-0.3.6.sql
    │   │   ├── pgstac.0.3.5.sql
    │   │   ├── pgstac.0.3.6-0.4.0.sql
    │   │   ├── pgstac.0.3.6.sql
    │   │   ├── pgstac.0.4.0-0.4.1.sql
    │   │   ├── pgstac.0.4.0.sql
    │   │   ├── pgstac.0.4.1-0.4.2.sql
    │   │   ├── pgstac.0.4.1.sql
    │   │   ├── pgstac.0.4.2-0.4.3.sql
    │   │   ├── pgstac.0.4.2.sql
    │   │   ├── pgstac.0.4.3-0.4.4.sql
    │   │   ├── pgstac.0.4.3.sql
    │   │   ├── pgstac.0.4.4-0.4.5.sql
    │   │   ├── pgstac.0.4.4.sql
    │   │   ├── pgstac.0.4.5-0.5.0.sql
    │   │   ├── pgstac.0.4.5.sql
    │   │   ├── pgstac.0.5.0-0.5.1.sql
    │   │   ├── pgstac.0.5.0.sql
    │   │   ├── pgstac.0.5.1-0.6.0.sql
    │   │   ├── pgstac.0.5.1.sql
    │   │   ├── pgstac.0.6.0-0.6.1.sql
    │   │   ├── pgstac.0.6.0.sql
    │   │   ├── pgstac.0.6.1-0.6.2.sql
    │   │   ├── pgstac.0.6.1.sql
    │   │   ├── pgstac.0.6.10-0.6.11.sql
    │   │   ├── pgstac.0.6.10.sql
    │   │   ├── pgstac.0.6.11-0.6.12.sql
    │   │   ├── pgstac.0.6.11.sql
    │   │   ├── pgstac.0.6.12-0.6.13.sql
    │   │   ├── pgstac.0.6.12.sql
    │   │   ├── pgstac.0.6.13-0.7.0.sql
    │   │   ├── pgstac.0.6.13-0.7.3.sql
    │   │   ├── pgstac.0.6.13.sql
    │   │   ├── pgstac.0.6.2-0.6.3.sql
    │   │   ├── pgstac.0.6.2.sql
    │   │   ├── pgstac.0.6.3-0.6.4.sql
    │   │   ├── pgstac.0.6.3.sql
    │   │   ├── pgstac.0.6.4-0.6.5.sql
    │   │   ├── pgstac.0.6.4.sql
    │   │   ├── pgstac.0.6.5-0.6.6.sql
    │   │   ├── pgstac.0.6.5.sql
    │   │   ├── pgstac.0.6.6-0.6.7.sql
    │   │   ├── pgstac.0.6.6.sql
    │   │   ├── pgstac.0.6.7-0.6.8.sql
    │   │   ├── pgstac.0.6.7.sql
    │   │   ├── pgstac.0.6.8-0.6.9.sql
    │   │   ├── pgstac.0.6.8.sql
    │   │   ├── pgstac.0.6.9-0.6.10.sql
    │   │   ├── pgstac.0.6.9.sql
    │   │   ├── pgstac.0.7.0-0.7.1.sql
    │   │   ├── pgstac.0.7.0.sql
    │   │   ├── pgstac.0.7.1-0.7.2.sql
    │   │   ├── pgstac.0.7.1.sql
    │   │   ├── pgstac.0.7.10-0.8.0.sql
    │   │   ├── pgstac.0.7.10.sql
    │   │   ├── pgstac.0.7.2-0.7.3.sql
    │   │   ├── pgstac.0.7.2.sql
    │   │   ├── pgstac.0.7.3-0.7.4.sql
    │   │   ├── pgstac.0.7.3.sql
    │   │   ├── pgstac.0.7.4-0.7.5.sql
    │   │   ├── pgstac.0.7.4.sql
    │   │   ├── pgstac.0.7.5-0.7.6.sql
    │   │   ├── pgstac.0.7.5.sql
    │   │   ├── pgstac.0.7.6-0.7.7.sql
    │   │   ├── pgstac.0.7.6.sql
    │   │   ├── pgstac.0.7.7-0.7.8.sql
    │   │   ├── pgstac.0.7.7.sql
    │   │   ├── pgstac.0.7.8-0.7.9.sql
    │   │   ├── pgstac.0.7.8.sql
    │   │   ├── pgstac.0.7.9-0.7.10.sql
    │   │   ├── pgstac.0.7.9.sql
    │   │   ├── pgstac.0.8.0-0.8.1.sql
    │   │   ├── pgstac.0.8.0.sql
    │   │   ├── pgstac.0.8.1-0.8.2.sql
    │   │   ├── pgstac.0.8.1.sql
    │   │   ├── pgstac.0.8.2-0.8.3.sql
    │   │   ├── pgstac.0.8.2.sql
    │   │   ├── pgstac.0.8.3-0.8.4.sql
    │   │   ├── pgstac.0.8.3.sql
    │   │   ├── pgstac.0.8.4-0.8.5.sql
    │   │   ├── pgstac.0.8.4.sql
    │   │   ├── pgstac.0.8.5-0.9.0.sql
    │   │   ├── pgstac.0.8.5.sql
    │   │   ├── pgstac.0.8.6-0.9.0.sql
    │   │   ├── pgstac.0.8.6-0.9.10.sql
    │   │   ├── pgstac.0.8.6.sql
    │   │   ├── pgstac.0.9.0-0.9.1.sql
    │   │   ├── pgstac.0.9.0.sql
    │   │   ├── pgstac.0.9.1-0.9.2.sql
    │   │   ├── pgstac.0.9.1.sql
    │   │   ├── pgstac.0.9.10-0.9.11.sql
    │   │   ├── pgstac.0.9.10.sql
    │   │   ├── pgstac.0.9.11-unreleased.sql
    │   │   ├── pgstac.0.9.11.sql
    │   │   ├── pgstac.0.9.2-0.9.3.sql
    │   │   ├── pgstac.0.9.2.sql
    │   │   ├── pgstac.0.9.3-0.9.4.sql
    │   │   ├── pgstac.0.9.3.sql
    │   │   ├── pgstac.0.9.4-0.9.5.sql
    │   │   ├── pgstac.0.9.4.sql
    │   │   ├── pgstac.0.9.5-0.9.6.sql
    │   │   ├── pgstac.0.9.5.sql
    │   │   ├── pgstac.0.9.6-0.9.7.sql
    │   │   ├── pgstac.0.9.6.sql
    │   │   ├── pgstac.0.9.7-0.9.8.sql
    │   │   ├── pgstac.0.9.7.sql
    │   │   ├── pgstac.0.9.8-0.9.9.sql
    │   │   ├── pgstac.0.9.8.sql
    │   │   ├── pgstac.0.9.9-0.9.10.sql
    │   │   ├── pgstac.0.9.9.sql
    │   │   └── pgstac.unreleased.sql
    │   ├── pgstac.sql
    │   ├── sql/
    │   │   ├── 000_idempotent_pre.sql
    │   │   ├── 001_core.sql
    │   │   ├── 001a_jsonutils.sql
    │   │   ├── 001s_stacutils.sql
    │   │   ├── 002_collections.sql
    │   │   ├── 002a_queryables.sql
    │   │   ├── 002b_cql.sql
    │   │   ├── 003a_items.sql
    │   │   ├── 003b_partitions.sql
    │   │   ├── 004_search.sql
    │   │   ├── 004a_collectionsearch.sql
    │   │   ├── 005_tileutils.sql
    │   │   ├── 006_tilesearch.sql
    │   │   ├── 997_maintenance.sql
    │   │   ├── 998_idempotent_post.sql
    │   │   └── 999_version.sql
    │   └── tests/
    │       ├── basic/
    │       │   ├── collection_searches.sql
    │       │   ├── collection_searches.sql.out
    │       │   ├── cql2_searches.sql
    │       │   ├── cql2_searches.sql.out
    │       │   ├── cql_searches.sql
    │       │   ├── cql_searches.sql.out
    │       │   ├── crud_functions.sql
    │       │   ├── crud_functions.sql.out
    │       │   ├── free_text.sql
    │       │   ├── free_text.sql.out
    │       │   ├── partitions.sql
    │       │   ├── partitions.sql.out
    │       │   ├── search_path.sql
    │       │   ├── search_path.sql.out
    │       │   ├── xyz_searches.sql
    │       │   └── xyz_searches.sql.out
    │       ├── pgtap/
    │       │   ├── 001_core.sql
    │       │   ├── 001a_jsonutils.sql
    │       │   ├── 001b_cursorutils.sql
    │       │   ├── 001s_stacutils.sql
    │       │   ├── 002_collections.sql
    │       │   ├── 002a_queryables.sql
    │       │   ├── 003_items.sql
    │       │   ├── 004_search.sql
    │       │   ├── 004a_collectionsearch.sql
    │       │   ├── 005_tileutils.sql
    │       │   ├── 006_tilesearch.sql
    │       │   ├── 9999_readonly.sql
    │       │   └── 999_version.sql
    │       ├── pgtap.sql
    │       └── testdata/
    │           ├── collections.json
    │           ├── collections.ndjson
    │           ├── items.ndjson
    │           ├── items.pgcopy
    │           ├── items_duplicate_ids.ndjson
    │           ├── items_for_delsert.ndjson
    │           └── items_private.ndjson
    └── pypgstac/
        ├── README.md
        ├── examples/
        │   ├── load_queryables_example.py
        │   └── sample_queryables.json
        ├── pyproject.toml
        ├── src/
        │   └── pypgstac/
        │       ├── __init__.py
        │       ├── db.py
        │       ├── hydration.py
        │       ├── load.py
        │       ├── migrate.py
        │       ├── py.typed
        │       ├── pypgstac.py
        │       └── version.py
        └── tests/
            ├── __init__.py
            ├── conftest.py
            ├── data-files/
            │   ├── hydration/
            │   │   ├── collections/
            │   │   │   ├── chloris-biomass.json
            │   │   │   ├── landsat-c2-l1.json
            │   │   │   └── sentinel-1-grd.json
            │   │   ├── dehydrated-items/
            │   │   │   └── landsat-c2-l1/
            │   │   │       └── LM04_L1GS_001001_19830527_02_T2.json
            │   │   └── raw-items/
            │   │       ├── landsat-c2-l1/
            │   │       │   └── LM04_L1GS_001001_19830527_02_T2.json
            │   │       └── sentinel-1-grd/
            │   │           └── S1A_IW_GRDH_1SDV_20220428T034417_20220428T034442_042968_05213C.json
            │   ├── load/
            │   │   └── dehydrated.txt
            │   └── queryables/
            │       └── test_queryables.json
            ├── hydration/
            │   ├── __init__.py
            │   ├── test_base_item.py
            │   ├── test_dehydrate.py
            │   ├── test_dehydrate_pg.py
            │   ├── test_hydrate.py
            │   └── test_hydrate_pg.py
            ├── test_benchmark.py
            ├── test_load.py
            └── test_queryables.py

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

================================================
FILE: .devcontainer/devcontainer.json
================================================
{
	"name": "PgSTAC",
	"dockerComposeFile": "../docker-compose.yml",
	"service": "pgstac",
	"workspaceFolder": "/opt/src"
}


================================================
FILE: .dockerignore
================================================
.envrc*
*/dist/*
*.pyc
*.egg-info
*.eggs
venv/*
*/.direnv/*
*/.ruff_cache/*
*/.pytest_cache/*
*/.vscode/*
*/.mypy_cache/*
*/.pgadmin/*
*/.ipynb_checkpoints/*
*/.git/*
*/.github/*
*/env/*
Dockerfile
docker compose.yml
*/.devcontainer/*


================================================
FILE: .editorconfig
================================================
root = true

[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true

[*.sql]
indent_style = space
indent_size = 4

[*.py]
indent_style = space
indent_size = 4

[*.{yml,yaml}]
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab

[*.sh]
indent_style = space
indent_size = 4


================================================
FILE: .github/copilot-instructions.md
================================================
# Copilot Instructions for PgSTAC

See `CLAUDE.md` for comprehensive project instructions, architecture, and workflows.
See `AGENTS.md` for specialized agent definitions (sql-developer, migration-engineer, loader-developer).


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
    open-pull-requests-limit: 5
    groups:
      actions-all:
        applies-to: version-updates
        patterns:
          - "*"

  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
    open-pull-requests-limit: 5
    groups:
      docker-base-images:
        applies-to: version-updates
        patterns:
          - "*"

  - package-ecosystem: "pip"
    directory: "/src/pypgstac"
    schedule:
      interval: "weekly"
      day: "monday"
    open-pull-requests-limit: 5
    groups:
      python-dev-tooling:
        applies-to: version-updates
        patterns:
          - "ruff"
          - "ty"
          - "pre-commit"
          - "types-*"
      python-runtime:
        applies-to: version-updates
        patterns:
          - "cachetools"
          - "fire"
          - "hydraters"
          - "orjson"
          - "plpygis"
          - "pydantic"
          - "python-dateutil"
          - "smart-open"
          - "tenacity"
          - "version-parser"
          - "psycopg*"


================================================
FILE: .github/instructions/migrations.instructions.md
================================================
---
applyTo: "src/pgstac/migrations/**"
---

# Migration Files

These files are **generated** — see CLAUDE.md "Migration Process" for the full workflow.

- **DO NOT** create, edit, or hand-modify migration files
- Base (`pgstac.X.Y.Z.sql`) = full schema at that version
- Incremental (`pgstac.X.Y.Z-A.B.C.sql`) = upgrade diff
- Staged (`*.sql.staged`) = needs review before removing `.staged` suffix
- Test: `scripts/test --migrations`


================================================
FILE: .github/instructions/pypgstac.instructions.md
================================================
---
applyTo: "src/pypgstac/**"
---

# pypgstac Python

See CLAUDE.md "pypgstac Loader Internals" for patterns. See AGENTS.md "loader-developer" for critical rules.

- Uses psycopg v3 (not psycopg2), orjson (not json), tenacity, plpygis, fire
- Materialize generators before retry boundaries
- Query `partition_sys_meta` (live VIEW), never `partitions` (stale MATERIALIZED VIEW)
- Test: `scripts/runinpypgstac --build test --pypgstac`


================================================
FILE: .github/instructions/scripts.instructions.md
================================================
---
applyTo: "scripts/**"
---

# Build Scripts

See CLAUDE.md "Development Workflow" for usage. All scripts require the Docker compose environment.

- `runinpypgstac` is the foundation — most scripts delegate to it
- `scripts/container-scripts/` contains the in-container script payload copied into the pypgstac image; keep host wrappers in `scripts/`
- `stageversion` modifies version files AND generates migrations — see CLAUDE.md "Migration Process"
- DO NOT run `stageversion` without understanding its side effects


================================================
FILE: .github/instructions/sql-source.instructions.md
================================================
---
applyTo: "src/pgstac/sql/**"
---

# SQL Source Files

See CLAUDE.md "Critical Rules" for full SQL conventions.

- NEVER edit `pgstac.sql` — it is auto-generated
- `CREATE OR REPLACE FUNCTION`, `IF NOT EXISTS`, `SECURITY DEFINER`
- Grant permissions in `998_idempotent_post.sql`, not inline
- `get_tstz_constraint()` regex must handle fractional seconds (`.` in timestamps)
- Do NOT schema-qualify PostGIS calls — PostGIS may be in `public` or `postgis` schema
- SQL functions used by GENERATED columns must be self-contained (no cross-function deps) — pg_dump orders functions alphabetically and breaks dependency chains
- Test: `scripts/runinpypgstac --build test --pgtap --basicsql`


================================================
FILE: .github/prompts/add-sql-function.prompt.md
================================================
---
description: "Add a new SQL function to PgSTAC"
---

Add a new SQL function following PgSTAC conventions:

1. Determine the correct file in `src/pgstac/sql/` based on the prefix ranges in CLAUDE.md
2. Use `CREATE OR REPLACE FUNCTION` in the `pgstac` schema
3. Add `SECURITY DEFINER` if the function modifies tables
4. Add permission grants in `src/pgstac/sql/998_idempotent_post.sql` if the function should be callable by `pgstac_ingest` or `pgstac_read`
5. Add a test in `src/pgstac/tests/pgtap.sql` or a new `.sql`/`.sql.out` pair in `src/pgstac/tests/basic/`

Test with: `scripts/runinpypgstac --build test --pgtap --basicsql`


================================================
FILE: .github/prompts/debug-loader.prompt.md
================================================
---
description: "Debug a pypgstac data loading issue"
---

Diagnose a pypgstac Loader problem:

1. Check which load mode is being used (`insert`, `ignore`, `upsert`, `delsert`)
2. Verify the loader queries `partition_sys_meta` (live VIEW), not `partitions` (stale MATERIALIZED VIEW)
3. Check that generators are materialized to `list()` before `load_partition()` — generators can't survive tenacity retries
4. Verify `item.pop("partition", None)` uses `None` default for retry safety
5. Check the retry decorator covers: `CheckViolation`, `DeadlockDetected`, `SerializationFailure`, `LockNotAvailable`, `ObjectInUse`
6. Check `before_sleep` handler sets `partition.requires_update = True` on `CheckViolation`
7. Verify `get_tstz_constraint()` regex handles fractional seconds (`.` in timestamps)

Key files:
- `src/pypgstac/src/pypgstac/load.py` — Loader class
- `src/pgstac/sql/003b_partitions.sql` — partition constraint functions


================================================
FILE: .github/prompts/stage-version.prompt.md
================================================
---
description: "Stage a new PgSTAC version and review the migration"
---

Guide me through the PgSTAC release migration process:

1. Confirm all SQL changes are in `src/pgstac/sql/` (never `pgstac.sql` directly)
2. Run `scripts/stageversion {VERSION}` to generate base + incremental migrations
3. Review the `.staged` migration file checking for:
   - Unintended `DROP TABLE` or `DROP COLUMN`
   - Unsafe `ALTER TABLE` for large tables
   - Bare `CREATE` instead of `CREATE OR REPLACE` for functions
   - Missing `IF NOT EXISTS` on indexes
   - Presence of `000_idempotent_pre.sql` and `998_idempotent_post.sql` content
   - `set_version()` called at the end
4. Remove the `.staged` suffix
5. Run `scripts/test --migrations` to validate the full migration chain
6. Update CHANGELOG.md


================================================
FILE: .github/workflows/continuous-integration.yml
================================================
name: CI

on:
  push:
    branches:
      - main
  pull_request:
  workflow_dispatch:
  schedule:
    - cron: '23 4 * * 0'

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}
  DOCKER_BUILDKIT: 1
  PIP_BREAK_SYSTEM_PACKAGES: 1

jobs:
  changes:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
    outputs:
      pgtagprefix: ${{ steps.check.outputs.pgtagprefix }}
      buildpgdocker: ${{ steps.check.outputs.buildpg }}
      pyrustdocker: ${{ steps.check.outputs.pytag }}
      buildpyrustdocker: ${{ steps.check.outputs.buildpy }}

    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
        id: filter
        with:
          filters: |
            pgstac:
              - 'docker/pgstac/**'
            pypgstac:
              - 'docker/pypgstac/**'
      - id: check
        run: |
          buildpg=false;
          ref=$(echo ${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} | tr / _);
          pgref=$ref;
          [[ "${{ steps.filter.outputs.pgstac }}" == "true" ]] && buildpg=true || pgref=main;
          if [[ "${{ github.event_name }}" == "schedule" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
            buildpg=true;
            pgref=main;
          fi
          echo "pgtagprefix=${{ env.REGISTRY }}/${GITHUB_REPOSITORY_OWNER}/pgstac-postgres:$pgref" >>$GITHUB_OUTPUT;
          echo "buildpg=$buildpg" >>$GITHUB_OUTPUT;
          buildpy=false;
          pyref=$ref;
          [[ "${{ steps.filter.outputs.pypgstac }}" == "true" ]] && buildpy=true || pyref=main;
          if [[ "${{ github.event_name }}" == "schedule" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
            buildpy=true;
            pyref=main;
          fi
          echo "pytag=${{ env.REGISTRY }}/${GITHUB_REPOSITORY_OWNER}/pgstac-pyrust:$pyref" >>$GITHUB_OUTPUT;
          echo "buildpy=$buildpy" >>$GITHUB_OUTPUT;

  # This builds a base postgres image that has everything installed to be able to run pgstac. This image does not have pgstac itself installed.
  buildpg:
    name: Build and push base postgres image
    runs-on: ubuntu-latest
    needs: [changes]
    strategy:
      matrix:
        pg_major: [16, 17, 18]
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
      - name: Log in to the Container registry
        uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and Push Base Postgres
        if: ${{ needs.changes.outputs.buildpgdocker == 'true' }}
        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
        with:
          platforms: linux/amd64,linux/arm64
          context: .
          target: pgstacbase
          file: docker/pgstac/Dockerfile
          build-args: |
            PG_MAJOR=${{ matrix.pg_major }}
          tags: ${{ needs.changes.outputs.pgtagprefix }}-pg${{ matrix.pg_major }}
          push: true
          cache-from: type=gha
          cache-to: type=gha, mode=max

  buildpyrust:
    name: Build and push base pyrust
    runs-on: ubuntu-latest
    needs: [changes]
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
      - name: Log in to the Container registry
        uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and Push Base pyrust
        if: ${{ needs.changes.outputs.buildpyrustdocker == 'true' }}
        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
        with:
          platforms: linux/amd64,linux/arm64
          context: .
          target: pyrustbase
          file: docker/pypgstac/Dockerfile
          tags: ${{ needs.changes.outputs.pyrustdocker }}
          push: true
          cache-from: type=gha
          cache-to: type=gha, mode=max

  test:
    name: test
    needs: [changes, buildpg, buildpyrust]
    runs-on: ubuntu-latest
    strategy:
      matrix:
        pg_major: [16, 17, 18]
        flags:
          - ""
          - "--resolution lowest-direct"
    container:
      image: ${{ needs.changes.outputs.pyrustdocker }}
      options: --user root
      env:
        PGPASSWORD: postgres
        PGHOST: postgres
        PGDATABASE: postgres
        PGUSER: postgres
        UV_CACHE_DIR: /tmp/.uv-cache
    services:
      postgres:
        env:
          POSTGRES_PASSWORD: postgres
        image: ${{ needs.changes.outputs.pgtagprefix }}-pg${{ matrix.pg_major }}
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Ensure PostgreSQL client tools
        run: |
          set -euo pipefail
          apt-get update
          apt-get install -y --no-install-recommends gnupg ca-certificates curl
          install -d -m 0755 /etc/apt/keyrings
          curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg
          . /etc/os-release
          echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt ${VERSION_CODENAME}-pgdg main" > /etc/apt/sources.list.d/pgdg.list
          apt-get update
          apt-get install -y --no-install-recommends "postgresql-client-${{ matrix.pg_major }}"

          client_major="$(pg_dump --version | sed -E 's/.* ([0-9]+)\..*/\1/')"
          server_major="$(psql -X -tA -h postgres -d postgres -c 'show server_version' | sed -E 's/^([0-9]+).*/\1/')"
          if [[ "$client_major" != "${{ matrix.pg_major }}" ]]; then
            echo "Expected pg_dump major ${{ matrix.pg_major }}, got ${client_major}" >&2
            exit 1
          fi
          if [[ "$client_major" != "$server_major" ]]; then
            echo "pg_dump major (${client_major}) does not match postgres major (${server_major})" >&2
            exit 1
          fi
      - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
      - name: Install pypgstac
        working-directory: /__w/pgstac/pgstac/src/pypgstac
        run: |
          export UV_CACHE_DIR=/tmp/.uv-cache
          export XDG_CACHE_HOME=/tmp/.cache
          mkdir -p "$UV_CACHE_DIR" "$XDG_CACHE_HOME"
          uv --cache-dir "$UV_CACHE_DIR" venv /tmp/ci-venv
          uv --cache-dir "$UV_CACHE_DIR" pip install --python /tmp/ci-venv/bin/python ${{ matrix.flags }} .[dev,test,psycopg]
          echo "/tmp/ci-venv/bin" >> "$GITHUB_PATH"
      - name: Run tests
        working-directory: /__w/pgstac/pgstac
        run: scripts/container-scripts/test


================================================
FILE: .github/workflows/deploy_mkdocs.yml
================================================
name: Publish docs via GitHub Pages

on:
  push:
    branches:
      - main
    paths:
      - 'README.md'
      - 'CHANGELOG.md'
      - 'CONTRIBUTING.md'
      - 'docs/**'
  pull_request:
    paths:
      - 'README.md'
      - 'CHANGELOG.md'
      - 'CONTRIBUTING.md'
      - 'docs/**'

jobs:
  docs:
    name: ${{ github.event_name == 'push' && 'Deploy docs' || 'Build docs' }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Set up Python 3.12
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: 3.12

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install mkdocs mkdocs-material mkdocs-jupyter pandas seaborn folium

      - name: Build docs
        if: github.event_name == 'pull_request'
        run: mkdocs build -f docs/mkdocs.yml

      - name: Deploy docs
        if: github.event_name == 'push'
        run: mkdocs gh-deploy --force -f docs/mkdocs.yml


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  push:
    tags:
      - "*"

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  tag:
    name: tag
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Tag Release
        uses: "marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0" # v1.2.1
        with:
          repo_token: "${{ secrets.GITHUB_TOKEN }}"
          prerelease: false

  # This builds a base postgres image that has everything installed to be able to run pgstac.
  buildpg:
    name: Build and push base postgres image
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
        # Temporary workaround for ARM builds
        # https://github.com/docker/setup-qemu-action/issues/198
        with:
          image: tonistiigi/binfmt:qemu-v7.0.0-28
      - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
      - name: Log in to the Container registry
        uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-postgres
      - name: Build and Push Base Postgres
        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
        with:
          platforms: linux/amd64,linux/arm64
          context: .
          target: pgstacbase
          file: docker/pgstac/Dockerfile
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          push: true
          cache-from: type=gha
          cache-to: type=gha, mode=max

  # This builds a postgres image that already has pgstac installed to the tagged version
  buildpgstac:
    name: Build and push base postgres with pgstac installed
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
        # Temporary workaround for ARM builds
        # https://github.com/docker/setup-qemu-action/issues/198
        with:
          image: tonistiigi/binfmt:qemu-v7.0.0-28
      - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
      - name: Log in to the Container registry
        uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
      - name: Build and Push Base Postgres
        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
        with:
          platforms: linux/amd64,linux/arm64
          context: .
          target: pgstac
          file: docker/pgstac/Dockerfile
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          push: true
          cache-from: type=gha
          cache-to: type=gha, mode=max

  buildpyrust:
    name: Build and push base pyrust
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
        # Temporary workaround for ARM builds
        # https://github.com/docker/setup-qemu-action/issues/198
        with:
          image: tonistiigi/binfmt:qemu-v7.0.0-28
      - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
      - name: Log in to the Container registry
        uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-pyrust
      - name: Build and Push Base Postgres
        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
        with:
          platforms: linux/amd64,linux/arm64
          context: .
          target: pyrustbase
          file: docker/pypgstac/Dockerfile
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          push: true
          cache-from: type=gha
          cache-to: type=gha, mode=max

  buildpypgstac:
    name: Build and push base pyrust
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
        # Temporary workaround for ARM builds
        # https://github.com/docker/setup-qemu-action/issues/198
        with:
          image: tonistiigi/binfmt:qemu-v7.0.0-28
      - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
      - name: Log in to the Container registry
        uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-pypgstac
      - name: Build and Push Base Postgres
        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
        with:
          platforms: linux/amd64,linux/arm64
          context: .
          target: pypgstac
          file: docker/pypgstac/Dockerfile
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          push: true
          cache-from: type=gha
          cache-to: type=gha, mode=max

  buildpypgstacruntime:
    name: Build and push pypgstac runtime image
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
        with:
          image: tonistiigi/binfmt:qemu-v7.0.0-28
      - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
      - name: Log in to the Container registry
        uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-pypgstac-runtime
      - name: Build and Push pypgstac runtime
        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
        with:
          platforms: linux/amd64,linux/arm64
          context: .
          target: pypgstac-runtime
          file: docker/pypgstac/Dockerfile
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          push: true
          cache-from: type=gha
          cache-to: type=gha, mode=max

  releasetopypi:
    name: Release
    runs-on: ubuntu-latest
    permissions:
      id-token: write
    environment:
      name: pypi
      url: https://pypi.org/p/pypgstac
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Setup Python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: "3.x"
      - name: Install build
        working-directory: /home/runner/work/pgstac/pgstac/src/pypgstac
        run: pip install build
      - name: Build
        working-directory: /home/runner/work/pgstac/pgstac/src/pypgstac
        run: python -m build
      - name: Publish to PyPI
        uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
        with:
          packages-dir: /home/runner/work/pgstac/pgstac/src/pypgstac/dist


================================================
FILE: .gitignore
================================================
.so
.envrc
src/pypgstac/dist
*.pyc
*.egg-info
*.eggs
venv
env
.direnv
src/pypgstac/target
src/pypgstac/python/pypgstac/*.so
.vscode
.ipynb_checkpoints
.venv
.pytest_cache
.plans/
.env
src/pgstacrust/target/


================================================
FILE: .pre-commit-config.yaml
================================================
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
    -   id: trailing-whitespace
    -   id: check-yaml
    -   id: check-added-large-files
    -   id: check-toml
    -   id: detect-aws-credentials
        args: [--allow-missing-credential]
    -   id: detect-private-key
    -   id: check-json
    -   id: mixed-line-ending
    -   id: check-merge-conflict
    -   id: check-executables-have-shebangs
    -   id: check-symlinks

-   repo: local
    hooks:
    -   id: dockerbuild
        name: dockerbuild
        entry: scripts/update
        language: script
        pass_filenames: false
        verbose: true
        fail_fast: true
        files: Dockerfile$|\.rs$
    -   id: sql
        name: sql
        entry: scripts/test
        args: [--basicsql, --pgtap]
        language: script
        pass_filenames: false
        verbose: true
        fail_fast: true
        files: sql\/.*\.sql$
    -   id: formatting
        name: formatting
        entry: scripts/test
        args: [--formatting]
        language: script
        pass_filenames: false
        verbose: true
        fail_fast: true
        files: ^(src/pypgstac/(src/pypgstac|tests)/.*\.py|src/pypgstac/pyproject\.toml)$
    -   id: pypgstac
        name: pypgstac
        entry: scripts/test
        args: [--pypgstac]
        language: script
        pass_filenames: false
        verbose: true
        fail_fast: true
        files: pypgstac\/.*\.py$
    -   id: migrations
        name: migrations
        entry: scripts/test
        args: [--migrations]
        language: script
        pass_filenames: false
        verbose: true
        fail_fast: true
        files: migrations\/.*\.sql$


================================================
FILE: AGENTS.md
================================================
# PgSTAC Agents

## sql-developer

PostgreSQL SQL developer for PgSTAC. Works exclusively in `src/pgstac/sql/` files. See CLAUDE.md for full SQL rules, file map, and partition architecture.

### Key Constraints

- NEVER edit `pgstac.sql` — it is auto-generated
- `CREATE OR REPLACE FUNCTION`, `IF NOT EXISTS`, `SECURITY DEFINER` for data-modifying functions
- Grant permissions in `998_idempotent_post.sql`, not inline
- Use `run_or_queue()` for deferrable operations
- Do NOT schema-qualify PostGIS calls (PostGIS may be in `public` or `postgis` schema)
- Avoid cross-function deps in SQL functions used by GENERATED columns — pg_dump orders alphabetically, so inline the logic (see `search_hash` pattern)
- Test: `scripts/runinpypgstac --build test --pgtap --basicsql`

---

## migration-engineer

Migration specialist for PgSTAC. See CLAUDE.md "Migration Process" for full workflow.

### Quick Reference

1. Edit SQL in `src/pgstac/sql/*.sql`
2. `scripts/stageversion VERSION` → generates base + incremental `.staged` migration
3. Review `.staged` file (watch for DROPs, unsafe ALTERs, missing `CREATE OR REPLACE`)
4. Remove `.staged` suffix → `scripts/test --migrations`

### Review Checklist

- No unintended `DROP TABLE/COLUMN`, safe `ALTER TABLE` for large tables
- `CREATE OR REPLACE` (not bare `CREATE`), `IF NOT EXISTS` for indexes
- `000_idempotent_pre.sql` and `998_idempotent_post.sql` included
- `set_version()` called at end

---

## loader-developer

Specialist in pypgstac bulk loading (`src/pypgstac/src/pypgstac/load.py`). See CLAUDE.md "pypgstac Loader Internals" for full details.

### Critical Patterns

- **Materialize generators**: `list(g)` before `load_partition()` — generators can't survive tenacity retries
- **Live view only**: Query `partition_sys_meta` (VIEW), never `partitions` (stale MATERIALIZED VIEW)
- **Retry safety**: `item.pop("partition", None)` with `None` default; `before_sleep` sets `partition.requires_update = True` on `CheckViolation`
- **Retry scope**: `CheckViolation`, `DeadlockDetected`, `SerializationFailure`, `LockNotAvailable`, `ObjectInUse`
- **Load modes**: `insert`, `ignore`/`insert_ignore`, `upsert`, `delsert`
- Test: `scripts/runinpypgstac --build test --pypgstac`


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

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).


## [Unreleased]

### Added
- `scripts/makemigration` host wrapper for the in-container `makemigration` helper.
- `.env.example` documenting all supported environment variables for local development.
- All host-facing scripts (`test`, `format`, `migrate`, `server`, `stageversion`,
  `runinpypgstac`, `console`) now accept `--help` / `-h` and honor environment-variable
  counterparts for common flags (`PGSTAC_BUILD_POLICY`, `PGSTAC_FAST`, `PGSTAC_WATCH`,
  `PGSTAC_STRICT`).
- `scripts/pgstacenv` gains `ensure_env_file` (auto-creates `.env` from `.env.example`
  on first run) and `first_available_pgport` (avoids port collisions on shared machines).
- `scripts/test` expanded from a 3-line wrapper to a full-featured test runner supporting
  `--fast`, `--watch`, `--build-policy`, `--no-strict`, and stale-image detection.
- PostgreSQL 16, 17, and 18-beta added to the CI and Docker build matrix. (Closes #334)
- Weekly scheduled CI run (`cron: '23 4 * * 0'`) to catch upstream base-image CVEs without
  requiring a code change. (Closes #202)
- `workflow_dispatch` trigger for manual CI runs.
- `pg_tle` v1.5.2 built and pre-loaded in the `pgstacbase` image; database init runs
  `CREATE EXTENSION IF NOT EXISTS pg_tle`.
- `pypgstac-runtime` Docker target: slim Python 3.13-trixie image without the Rust/build
  toolchain, for production deployments where the Rust build environment is not needed.
- Dependabot coverage expanded to Docker base images and pip packages (two new
  ecosystems with grouped update policies).

### Changed
- In-container helper scripts moved from `docker/pypgstac/bin/` to
  `scripts/container-scripts/`; container `PATH` updated accordingly.
- `docker/pgstac/Dockerfile` and `docker/pypgstac/Dockerfile` base images updated from
  `bullseye` to `trixie`. (Closes #231)
- All Docker `RUN` layers now use BuildKit cache mounts for apt, uv, and git caches,
  significantly reducing incremental rebuild times.
- `docker-compose.yml`: adds `env_file: .env`, explicit `PGHOST`/`PGPORT` defaults,
  a pgstac healthcheck, and a `service_healthy` dependency on pypgstac.
- `runinpypgstac` gains `--build-policy {always,missing,never}` replacing the bare
  `--build` flag; `PGSTAC_BUILD_POLICY` env var provides a persistent default.
- Dev tooling: `flake8`, `black`, and `mypy` removed in favour of `ruff==0.15.11` and
  `ty==0.0.31`. `pre-commit` pinned to `3.5.0`. `pre-commit-hooks` updated to v5.0.0.
- `pypgstac` package floor raised to Python 3.11; metadata now advertises 3.11-3.14.
- `pypgstac` settings now use `pydantic-settings` (`BaseSettings` from
  `pydantic_settings`) and require `pydantic>=2,<3`.
- `cachetools` upper bound removed (`cachetools>=5.3.0`) since `pypgstac` only uses
  `cachetools.func.lru_cache`; no known incompatible API changes affect this usage.
- `pypgstac` developer tooling config now consistently targets Ruff + ty:
  removes stale mypy config, pins Ruff to `0.15.11` to match pre-commit,
  and adds minimal `[tool.ty]` project settings.
- Formatting/type-check pipeline now uses `scripts/test --formatting` as the
  single pre-commit entry point (removing duplicate direct Ruff pre-commit hooks)
  and aligns Ruff line-length handling with the formatter (`E501` ignored;
  explicit `line-length = 88`).
- GitHub Actions updated: `dorny/paths-filter` v2→v3, `docker/build-push-action`
  v4→v6, `astral-sh/setup-uv` v8.0.0→v8.1.0; all SHA pins refreshed.
- Dependabot groups reworked: `actions-all` (replaces `minor-and-patch`), new
  `docker-base-images`, `python-dev-tooling`, and `python-runtime` groups.
- `docker-compose.yml` removes explicit `container_name` entries to avoid conflicts
  between concurrent local instances.

### Removed
- PL/Rust support: `pgstacbase-plrust` and `pgstac-plrust` Docker targets removed; the
  pgstac image no longer builds or ships PL/Rust or the Rust toolchain. (Closes #339)
- `flake8`, `black`, and `mypy` removed from dev dependencies.

### Fixed
- `load.py`: Use timezone-aware `MIN_DATETIME_UTC` / `MAX_DATETIME_UTC` sentinel
  constants (instead of naive `datetime.min` / `datetime.max`) to avoid
  `TypeError: can't compare offset-naive and offset-aware datetimes`.
- CI `lowest-direct` dependency install: avoid uv cache permission failures by using
  a writable temp cache path in the test job install step.
- `pypgstac` dependency floor for `orjson` raised to `>=3.11.0` to avoid selecting
  the broken `3.9.0` sdist under `--resolution lowest-direct`.
- `pydantic` minimum raised to `>=2.10` so `--resolution lowest-direct` on Python 3.13
  does not resolve to `pydantic-core==2.0.1`, which fails to build.


## [v0.9.11]


### Fixed
- Fix timestamp regex in partition constraint parsing to handle fractional seconds (microseconds), preventing incorrect `(-infinity, infinity)` constraint bounds.
- Add explicit ANALYZE before `st_estimatedextent()` in `update_partition_stats` for deterministic spatial extent calculation.
- Consolidate materialized view refreshes in `update_partition_stats` to a single unconditional refresh, reducing redundant operations.
- Use `partition_sys_meta` (live VIEW) instead of `partitions` (stale MATERIALIZED VIEW) in loader `_partition_update()` for real-time partition bounds.
- Expand loader retry to 10 attempts and add `SerializationFailure`, `LockNotAvailable`, `ObjectInUse` to retryable exceptions.
- Add `before_sleep` retry handler to force partition constraint refresh on `CheckViolation`.
- Materialize `itertools.groupby` generators with `list()` before `load_partition()` to prevent silent data loss on retry.
- Use safe `item.pop('partition', None)` to avoid `KeyError` on retry.
- Inline `search_tohash` into `search_hash` to eliminate cross-function dependency that broke pg_dump/pg_restore (pg_dump orders functions alphabetically).

### Added
- `pgstac_restore` script for restoring pg_dump backups — installs a temporary event trigger to fix search_path during restore.
- Race condition tests for sequential and concurrent loader operations with new-Loader-per-item pattern.
- Search path independence tests verifying `partition_sys_meta`, `partition_stats`, `partitions`, `partitions_view`, and `partition_steps` work identically with and without `pgstac` in `search_path`.
- pg_dump/pg_restore test (`--pgdump`) validating backup and restore of a pgstac database with sample data.
- Documentation for pg_dump/pg_restore best practices with PgSTAC.

## [v0.9.10]

### Fixed
- Improved performance and correctness of partition constraint parsing.

##[v0.9.9]

### Changed
* changed container images to use non-root `user`
* fix bug where closed and broken db connections are reused.

### Fixed
* replace space-separated terms with adjacency operator in free-text search (#387)

## [v0.9.8]

### Fixed
- Allow array as q parameter for full text search


## [v0.9.7]

### Fixed
- Fix bad handling of leading +/- terms in free-text search
- Use consistent tsquery config in free-text search

## [v0.9.6]

### Added

- Add `load_queryables` function to pypgstac for loading queryables from a JSON file
- Add support for specifying collection IDs when loading queryables

### Fixed
- Added missing 0.8.6-0.9.0 migration script

## [v0.9.5]

### Changed

 - Pin to `plpygic>=0.5.0` and use `geom.ewkb` instead of `geom.wkt` when formatting items in `Loader.format_item`. Fixes (#357)

## [v0.9.4]

### Changed
 - Relax pypgstac dependencies

## [v0.9.3]

### Fixed

- Fix CI issue with tests not running
- Fix for issue with nulls in title or keywords for free text search

### Changed

- Replace hardcoded org name in CI

## [v0.9.2]

### Added

- Add limited support for free-text search in the search functions. (Fixes #293)
  - the `q` parameter is converted from the
    [OGC API - Features syntax](https://docs.ogc.org/DRAFTS/24-031.html) into a `tsquery`
    statement which is used to compare to the description, title, and keywords fields in items or collection_search
  - the text search is un-indexed and will be very slow for item-level searches!
  - Add support for Postgres 17
  - Support for adding data to the private field using the pypgstac loader

### Fixed

- Add `open=True` in `psycopg.ConnectionPool` to avoid future behavior change
- Switch from postgres `server_version` to `server_version_num` to get PG version (Fixes #300)
- Allow read-only replicas work even when the context extension is enabled (Fixes #300)
- Consistently ensure use of instantiated postgres fields when addressing with 'properties.' prefix

### Changed
- Move rust hydration to a separate repo

## [v0.9.1]

### Fixed

- Fixed double nested extent when using trigger based update collection extent. (Fixes #274)
- Fix time formatting (Fixes #275)
- Relaxes smart-open dependency check (Fixes #273)
- Switch to uv for docker image

## [v0.9.0]

### Breaking Changes

- Context Extension has been deprecated. Context is now reported using OGC Features compliant numberMatched and numberReturned
- Paging return from search using prev/next properties has been deprecated. Paging is now available in the spec compliant Links

### Added

- Add support for Casei and Accenti (Fixes #237). (Also, requires the addition of the unaccent extension)
- Add numberReturned and numberMatched fields for ItemCollection. BREAKING CHANGE: As the context extension is deprecated, this also removes the "context" item from results.
- Updated docs on automated updates of collection extents. (CLOSES #247)
- stac search now returns paging information using standards compliant links rather than prev/next properties (Fixes #265)

### Fixed

- Fixes issue when there is a None rather than an empty dictionary in hydration.
- Use "debug" log level rather than "log" to prevent growth in log messages due to differences in how client_min_messages and log_min_messages treat log levels. (Fixes #242)
- Refactor search_query and search_where functions to eliminate race condition when running identical queries. (Fixes #233)
- Fixes CQL2 Parser for Between operator (Fixes #251)
- Update PyO3 for rust hydration performance improvements.

## [v0.8.6]

### Fixed

 - Relax version requirement for smart-open (Fixes #273)
 - Use uv pip in docker build

## [v0.8.5]

### Fixed

- Fix issue when installing or migrating pgstac using a non superuser (particularly when using the default role found on RDS). (FIXES #239). Backports fix into migrations for 0.8.2, 0.8.3, and 0.8.4.
- Adds fixes/updates to documentation
- Fixes issue when using geometry with the strict queryables setting set.

## [v0.8.4]

### Fixed

- Make release deployment use postgres images without plrust
- Update versions of plrust in dockerfile (used for development, there is no plrust code yet)
- Update incremental migration tests to start at v0.3.0 rather than v0.1.9 due to a breaking change in pg_partman at version 5 that has no ability to pin a version. Migrating from prior to v0.3.0 should still work fine as long as pg_partman has not been updated on the database.

## [v0.8.3]

### Added

- Add support for arm64 to Docker images

### Fixed

- Fixes a critical bug when using the ingest_staging_upsert table or the upsert_item/upsert_items functions to update records with existing data where the existing row would get deleted, but the new row would not get added.

## [v0.8.2]

### Added

- Add support functions and tests for Collection Search
- Add configuration parameter for base_url to be able to generate absolute links
- With this release, this is only used to create links for paging in collection_search
- Adds read only mode to allow use of pgstac on read replicas
- Note: Turning on romode disables any caching (particularly when context is turned on) and does not allow to store q query hash that can be used with geometry_search.
- Add option to pypgstac loader "--usequeue" that forces use of the query queue for the loading process
- Add "pypgstac runqueue" command to run any commands that are set in the query queue

### Fixed

- Fix bug with end_datetime constraint management leading to inability to add data outside of constraints
- Fix bugs dealing with table ownership to ensure that all pgstac tables are owned by the pgstac_admin role
- Fixes issues with errors/warnings caused when doing index maintenance
- Fixes issues with errors/warnings caused with partition management
- Make sure that pgstac_ingest role always has read/write permissions on all tables
- Remove call to create_table_constraints from check_partition function. create_table_constraints was being called twice as it also gets called from update_partition_stats
- Add NOT NULL constraint to collections table (FIXES #224)
- Fix issue with indexes not getting created as the pg_admin role using SECURITY DEFINER

### Changed

- Revert pydantic requirement back to '>=1.7' and use basesettings conditionally from pydantic or pydantic.v1 to allow compatibility with pydantic 2 as well as with stac-fastapi that requires pydantic <2

## [v0.8.1]

### Fixed

- Fix issue with CI building/pushing docker images

## [v0.8.0]

### Fixed

- Revert an optimisation which limited the number of results from a search query to the number of item IDs specified in the query.
This fixes an issue where items with the same ID that are in multiple collections could be left out of search results.

### Changed

- update `pydantic` requirement to `~=2.0`
- update docker and ci workflows to build binary wheels for rust additions to pypgstac
- split docker into database service and python/rust container
- Modify scripts to auto-generate unreleased migration
- Add pre commit tasks to generate migration and to rebuild and compile pypgstac with maturin for rust
- Add private jsonb column to items and collections table to hold private metadata that should not be returned as part of a stac item
- Add generated columns to collections with the bounding box as a geometry and the datetime and end_datetime from the extents (this is to help with forthcoming work on collections search)
- Add PLRust to the Docker postgres image for forthcoming work to add optional PLRust functions for expensive json manipulation (including hydration)
- Remove default queryable for eo:cloud_cover

## [v0.7.10]

### Fixed

- Return an empty jsonb array from all_collections() when the collections table is empty, instead of NULL. Fixes #186.
- Add delete trigger to collections to clean up partition_stats records and remove any partitions. Fixes #185
- Fixes boolean casting in get_setting_bool function

## [v0.7.9]

### Fixed

- Update docker image to use postgis 3.3.3

## [v0.7.8]

### Fixed

- Fix issue with search_query not returning all fields on first use of a query. Fixes #182

## [v0.7.7]

### Fixed

- Fix migrations for 0.7.4->0.7.5 and 0.7.5->0.7.6 to use the partition_view rather than the materialized view to avoid issue with refreshing the materialized view when run in the same statement that is accessing the view. Fixes #180.

### Added

- Add a short cirucit for id searches that sets the limit to be no more than the number of ids in the filter.
- Add 'timing' configuration variable that adds a "timing" element to the return object with the amount of time that it took to return a search.
- Reduce locking when updating statistics in the search table. Use skip locked to skip updating last_used and count when there is a lock being held.

## [v0.7.6]

### Fixed

- Fix issue with checking for existing collections in queryable trigger function that prevented adding scoped queryable entries.

## [v0.7.5]

### Fixed

- Default sort not getting set when sortby not included in query with token (Fixes [#177](https://github.com/stac-utils/pgstac/issues/177))
- Fixes regression in performance between with changes for partition structure at v0.7.0. Changes the normal view for partitions and partition_steps into indexed materialized views. Adds refreshing of the views to existing triggers to make sure they stay up to date.

## [v0.7.4]

### Added

- Add --v and --vv options to scripts/test to change logging to notice / log when running tests.
- Add framework for option to cache expensive item formatting/hydrating calls. Note: this only provides functionality to add and read from the cached calls, but does not have any wiring to remove any entries from the cache.
- Update the costs for json formatting functions to 5000 to help the query planner choose to prefer using indexes on json fields.

### Fixed

- Fix bug in foreign key and unique collection detection in queryables trigger function, update tests to catch.
- Add collection id to tokens to ensure uniqueness and improve speed when looking up token values. Update tests to use the new keys. Old item id only tokens are still valid, but new results will all contain the new keys.
- Improve performance when looking for whether next/prev links should be added.
- Update Search function to remove the use of cursors and temp tables.
- Update get_token_filter to remove the use of temp tables.

## [v0.7.3]

### Fixed

- Use IF EXISTS when dropping constraints to avoid race conditions
- Rework function that finds indexes that need to be added to be added and to find functionally identical indexes better.

## [v0.7.2]

### Fixed

- Use version_parser for parsing versions in pypgstac
- Fix issue with dropping functions/procedures in 0.6.13->0.7.0 migrations
- Fix issue with CREATE OR REPLACE TRIGGER on PG 13
- Fix issue identifying duplicate indexes in maintain_partition_queries function
- Ensure that pgstac_read role has read permissions to all partitions
- Fix issue (and add tests) caused by bug in psycopg datetime types not being able to translate 'infinity', '-infinity'

## [v0.7.1]

### Fixed

- Fix permission issue when running incremental migrations.
- Make sure that pypgstac migrate runs in a single transaction
- Don't try to use concurrently when building indexes by default (this was tripping things up when using with pg_cron)
- Don't short circuit search for requests with ids (Fixes #159)
- Fix for issue with pagination when sorting by columns with nulls (Fixes #161 Fixes #152)
- Fixes issue where duplicate datetime,end_datetime index was being built.
- Fix bug in pypgstac loader when using delsert option

### Added

- Add trigger to detect duplicate configurations for name/collection combination in queryables
- Add trigger to ensure collections added to queryables exist
- Add tests for queryables triggers
- Add more tests for different pagination scenarios

## [v0.7.0]

### Added

- Reorganize code base to create clearer separation between pgstac sql code and pypgstac.
- Move Python tooling to use hatch with all python project configuration in pyproject.toml
- Rework testing framework to not rely on pypgstac or migrations. This allows to run tests on any code updates without creating a version first. If a new version has been staged, the tests will still run through all incremental migrations to make sure they pass as well.
- Add pre-commit to run formatting as well as the tests appropriate for which files have changed.
- Add a query queue to allow for deferred processing of steps that do not change the ability to get results, but enhance performance. The query queue allows to use pg_cron or similar to run tasks that are placed in the queue.
- Modify triggers to allow the use of the query queue for building indexes, adding constraints that are used solely for constraint exclusion, and updating partition and collection spatial and temporal extents. The use of the queue is controlled by the new configuration parameter "use_queue" which can be set as the pgstac.use_queue GUC or by setting in the pgstac_settings table.
- Reorganize how partitions are created and updated to maintain more metadata about partition extents and better tie the constraints to the actual temporal extent of a partition.
- Add "partitions" view that shows stats about number of records, the partition range, constraint ranges, actual date range and spatial extent of each partition.
- Add ability to automatically update the extent object on a collection using the partition metadata via triggers. This is controlled by the new configuration parameter "update_collection_extent" which can be set as the pgstac.update_collection_extent GUC or by setting in the pgstac_settings table. This can be combined with "use_queue" to defer the processing.
- Add many new tests.
- Migrations now make sure that all objects in the pgstac schema are owned by the pgstac_admin role. Functions marked as "SECURITY DEFINER" have been moved to the lower level functions responsible for creating/altering partitions and adding records to the search/search_wheres tables. This should open the door for approaches to using Row Level Security.
- Allow pypgstac loader to load data on pgstac databases that have the same major version even if minor version differs. [162] (<https://github.com/stac-utils/pgstac/issues/162>) Cherry picked from <https://github.com/stac-utils/pgstac/pull/164>.

### Fixed

- Allow empty strings in datetime intervals
- Set search_path and application_name upon connection rather than as kwargs for compatibility with RDS [156] (<https://github.com/stac-utils/pgstac/issues/156>)

## [v0.6.13]

### Fixed

- Fix issue with sorting and paging where in some circumstances the aggregation of data changed the expected order

## [v0.6.12]

### Added

- Add ability to merge enum, min, and max from queryables where collections have different values.
- Add tooling in pypgstac and pgstac to add stac_extension definitions to the database.
- Modify missing_queryables function to try to use stac_extension definitions to populate queryable definitions from the stac_extension schemas.
- Add validate_constraints procedure
- Add analyze_items procedure
- Add check_pgstac_settings function to check system and pgstac settings.

### Fixed

- Fix issue with upserts in the trigger for using the items_staging tables
- Fix for generating token query for sorting. [152] (<https://github.com/stac-utils/pgstac/pull/152>)

## [v0.6.11]

### Fixed

- update pypgstac requirements to support python 3.11 [142](https://github.com/stac-utils/pgstac/pull/142)
- rename pgstac setting `default-filter-lang` to `default_filter_lang` to allow pgstac on postgresql>=14

## [v0.6.10]

### Fixed

- Makes sure that passing in a non-existing collection does not return a queryable object.

## [v0.6.9]

### Fixed

- Set cursor_tuple_fraction to 1 in search function to let query planner know to expect the entire table result within the search function to be returned. The default cursor_tuple_fraction of .1 within that function was at times creating bad query plans leading to slow queries.

## [v0.6.8]

### Added

- Add get_queryables function to return a composite queryables json for either a single collection (text), a list of collections(text[]), or for the full repository (null::text).
- Add missing_queryables(collection text, tablesample int) function to help identify if there are any properties in a collection without entries in the queryables table. The tablesample parameter is an int <=100 that is the approximate percentage of the collection to scan to look for missing queryables rather than reading every item.
- Add missing_queryables(tablesample int) function that scans all collections using a sample of records to identify missing queryables.

## [v0.6.7]

### Added

- Add get_queryables function to return a composite queryables json for either a single collection (text), a list of collections(text[]), or for the full repository (null::text).
- Add missing_queryables(collection text, tablesample int) function to help identify if there are any properties in a collection without entries in the queryables table. The tablesample parameter is an int <=100 that is the approximate percentage of the collection to scan to look for missing queryables rather than reading every item.
- Add missing_queryables(tablesample int) function that scans all collections using a sample of records to identify missing queryables.

## [v0.6.6]

### Added

- Add support for array operators in CQL2 (a_equals, a_contains, a_contained_by, a_overlaps).
- Add check in loader to make sure that pypgstac and pgstac versions match before loading data [#123](https://github.com/stac-utils/pgstac/issues/123)

## [v0.6.5]

### Fixed

- Fix for type casting when using the "in" operator [#122](https://github.com/stac-utils/pgstac/issues/122)
- Fix failure of pypgstac load for large items [#121](https://github.com/stac-utils/pgstac/pull/121)

## [v0.6.4]

### Fixed

- Fixed casts for numeric data when a property is not in the queryables table to use the type from the incoming json filter
- Fixed issue loader grouping an unordered iterable by partition, speeding up loads of items with mixed partitions [#116](https://github.com/stac-utils/pgstac/pull/116)

## [v0.6.3]

### Fixed

- Fixed content_hydrate argument ordering which caused incorrect behavior in database hydration [#115](https://github.com/stac-utils/pgstac/pull/115)

### Added

- Skip partition updates when unnecessary, which can drastically improve large ingest performance into existing partitions. [#114](https://github.com/stac-utils/pgstac/pull/114)

## [v0.6.2]

### Fixed

- Ensure special keys are not in content when loaded [#112](https://github.com/stac-utils/pgstac/pull/112/files)

## [v0.6.1]

### Fixed

- Fix issue where using equality operator against an array was only comparing the first element of the array

## [v0.6.0]

### Fixed

- Fix function signatures for transactional functions (delete_item etc) to make sure that they are marked as volatile
- Fix function for getting start/end dates from a stac item

### Changed

- Update hydration/dehydration logic to make sure that it matches hydration/dehydration in pypgstac
- Update fields logic in pgstac to only use full paths and to match logic in stac-fastapi
- Always include id and collection on features regardless of fields setting

### Added

- Add tests to ensure that pgstac and pypgstac hydration logic is equivalent
- Add conf item to search to allow returning results without hydrating. This allows an application using pgstac to shift the CPU load of rehydrating items from the database onto the application server.
- Add "--dehydrated" option to loader to be able to load a dehydrated file (or iterable) of items such as would be output using pg_dump or postgresql copy.
- Add "--chunksize" option to loader that can split the processing of an iterable or file into chunks of n records at a time

## [v0.5.1]

### Fixed

### Changed

### Added

- Add conf item to search to allow returning results without hydrating. This allows an application using pgstac to shift the CPU load of rehydrating items from the database onto the application server.

## [v0.5.0]

Version 0.5.0 is a major refactor of how data is stored. It is recommended to start a new database from scratch and to move data over rather than to use the inbuilt migration which will be very slow for larger amounts of data.

### Fixed

### Changed

- The partition layout has been changed from being hardcoded to a partition to week to using nested partitions. The first level is by collection, for each collection, there is an attribute partition_trunc which can be set to NULL (no temporal partitions), month, or year.

- CQL1 and Query Code have been refactored to translate to CQL2 to reduce duplicated code in query parsing.

- Unused functions have been stripped from the project.

- Pypgstac has been changed to use Fire rather than Typo.

- Pypgstac has been changed to use Psycopg3 rather than Asyncpg to enable easier use as both sync and async.

- Indexing has been reworked to eliminate indexes that from logs were not being used. The global json index on properties has been removed. Indexes on individual properties can be added either globally or per collection using the new queryables table.

- Triggers for maintaining partitions have been updated to reduce lock contention and to reflect the new data layout.

- The data pager which optimizes "order by datetime" searches has been updated to get time periods from the new partition layout and partition metadata.

- Tests have been updated to reflect the many changes.

### Added

- On ingest, the content in an item is compared to the metadata available at the collection level and duplicate information is stripped out (this is primarily data in the item_assets property). Logic is added in to merge this data back in on data usage.

## [v0.4.5]

### Fixed

- Fixes support for using the intersects parameter at the base of a search (regression from changes in 0.4.4)
- Fixes issue where results for a search on id returned [None] rather than [] (regression from changes in 0.4.4)

### Changed

- Changes requirement for PostgreSQL to 13+, the triggers used to main partitions are not available to be used on partitions prior to 13 ([#90](https://github.com/stac-utils/pgstac/pull/90))
- Bump requirement for asyncpg to 0.25.0 ([#82](https://github.com/stac-utils/pgstac/pull/82))

### Added

- Added more tests.

## [v0.4.4]

### Added

- Adds support for using ids, collections, datetime, bbox, and intersects parameters separated from the filter-lang (Fixes #85)
  - Previously use of these parameters was translated into cql-json and then to SQL, so was not available when using cql2-json
  - The deprecated query parameter is still only available when filter-lang is set to cql-json

### Changed

- Add PLPGSQL for item lookups by id so that the query plan for the simple query can be cached
  - Use item_by_id function when looking up records used for paging filters
  - Add a short circuit to search to use item_by_id lookup when using the ids parameter
    - This short circuit avoids using the query cache for this simple case
    - Ordering when using the ids parameter is hard coded to return results in the same order as the array passed in (this avoids the overhead of full parsing and additional overhead to sort)

### Fixed

- Fix to make sure that filtering on the search_wheres table leverages the functional index on the hash of the query rather than on the query itself.

## [v0.4.3]

### Fixed

- Fix for optimization when using equals with json properties. Allow optimization for both "eq" and "=" (was only previously enabled for "eq")

## [v0.4.2]

### Changed

- Add support for updated CQL2 spec to use timestamp or interval key

### Fixed

- Fix for 0.3.4 -> 0.3.5 migration making sure that partitions get renamed correctly

## [v0.4.1]

### Changed

- Update `typer` to 0.4.0 to avoid clashes with `click` ([#76](https://github.com/stac-utils/pgstac/pull/76))

### Fixed

- Fix logic in getting settings to make sure that filter-lang set on query is respected. ([#77](https://github.com/stac-utils/pgstac/pull/77))
- Fix for large queries in the query cache. ([#71](https://github.com/stac-utils/pgstac/pull/71))

## [v0.4.0]

### Fixed

- Fixes syntax for IN, BETWEEN, ISNULL, and NOT in CQL 1 ([#69](https://github.com/stac-utils/pgstac/pull/69))

### Added

- Adds support for modifying settings through pgstac_settings table and by passing in 'conf' object in search json to support AWS RDS where custom user configuration settings are not allowed and changing settings on the fly for a given query.
- Adds support for CQL2-JSON ([#67](https://github.com/stac-utils/pgstac/pull/67))
  - Adds tests for all examples in <https://github.com/radiantearth/stac-api-spec/blob/f5da775080ff3ff46d454c2888b6e796ee956faf/fragments/filter/README.md>
  - filter-lang parameter controls which dialect of CQL to use
    - Adds 'default-filter-lang' setting to control what dialect to use when 'filter-lang' is not present
    - old style stac 'query' object and top level ids, collections, datetime, bbox, and intersects parameters are only available with cql-json

## [v0.3.4]

### Added

- add `geometrysearch`, `geojsonsearch` and `xyzsearch` for optimized searches for tiled requets ([#39](https://github.com/stac-utils/pgstac/pull/39))
- add `create_items` and `upsert_items` methods for bulk insert ([#39](https://github.com/stac-utils/pgstac/pull/39))

## [v0.3.3]

### Fixed

- Fixed CQL term to be "id", not "ids" ([#46](https://github.com/stac-utils/pgstac/pull/46))
- Make sure featureCollection response has empty features `[]` not `null` ([#46](https://github.com/stac-utils/pgstac/pull/46))
- Fixed bugs for `sortby` and `pagination` ([#46](https://github.com/stac-utils/pgstac/pull/46))
- Make sure pgtap errors get caught in CI ([#46](https://github.com/stac-utils/pgstac/pull/46))

## [v0.3.2]

## Fixed

- Fixed CQL term to be "collections", not "collection" ([#43](https://github.com/stac-utils/pgstac/pull/43))

## [v0.3.1]

_TODO_

## [v0.2.8]

### Added

- Type hints to pypgstac that pass mypy checks ([#18](https://github.com/stac-utils/pgstac/pull/18))

### Fixed

- Fixed issue with pypgstac loads which caused some writes to fail ([#18](https://github.com/stac-utils/pgstac/pull/18))

[Unreleased]: https://github.com/stac-utils/pgstac/compare/v0.9.11...HEAD
[v0.9.11]: https://github.com/stac-utils/pgstac/compare/v0.9.10...v0.9.11
[v0.9.10]: https://github.com/stac-utils/pgstac/compare/v0.9.9...v0.9.10
[v0.9.9]: https://github.com/stac-utils/pgstac/compare/v0.9.8...v0.9.9
[v0.9.8]: https://github.com/stac-utils/pgstac/compare/v0.9.7...v0.9.8
[v0.9.7]: https://github.com/stac-utils/pgstac/compare/v0.9.6...v0.9.7
[v0.9.6]: https://github.com/stac-utils/pgstac/compare/v0.9.5...v0.9.6
[v0.9.5]: https://github.com/stac-utils/pgstac/compare/v0.9.4...v0.9.5
[v0.9.4]: https://github.com/stac-utils/pgstac/compare/v0.9.3...v0.9.4
[v0.9.3]: https://github.com/stac-utils/pgstac/compare/v0.9.2...v0.9.3
[v0.9.2]: https://github.com/stac-utils/pgstac/compare/v0.9.1...v0.9.2
[v0.9.1]: https://github.com/stac-utils/pgstac/compare/v0.9.0...v0.9.1
[v0.9.0]: https://github.com/stac-utils/pgstac/compare/v0.8.5...v0.9.0
[v0.8.5]: https://github.com/stac-utils/pgstac/compare/v0.8.4...v0.8.5
[v0.8.4]: https://github.com/stac-utils/pgstac/compare/v0.8.3...v0.8.4
[v0.8.3]: https://github.com/stac-utils/pgstac/compare/v0.8.2...v0.8.3
[v0.8.2]: https://github.com/stac-utils/pgstac/compare/v0.8.1...v0.8.2
[v0.8.1]: https://github.com/stac-utils/pgstac/compare/v0.8.0...v0.8.1
[v0.8.0]: https://github.com/stac-utils/pgstac/compare/v0.7.10...v0.8.0
[v0.7.10]: https://github.com/stac-utils/pgstac/compare/v0.7.9...v0.7.10
[v0.7.9]: https://github.com/stac-utils/pgstac/compare/v0.7.8...v0.7.9
[v0.7.8]: https://github.com/stac-utils/pgstac/compare/v0.7.7...v0.7.8
[v0.7.7]: https://github.com/stac-utils/pgstac/compare/v0.7.6...v0.7.7
[v0.7.6]: https://github.com/stac-utils/pgstac/compare/v0.7.5...v0.7.6
[v0.7.5]: https://github.com/stac-utils/pgstac/compare/v0.7.4...v0.7.5
[v0.7.4]: https://github.com/stac-utils/pgstac/compare/v0.7.3...v0.7.4
[v0.7.3]: https://github.com/stac-utils/pgstac/compare/v0.7.2...v0.7.3
[v0.7.2]: https://github.com/stac-utils/pgstac/compare/v0.7.1...v0.7.2
[v0.7.1]: https://github.com/stac-utils/pgstac/compare/v0.7.0...v0.7.1
[v0.7.0]: https://github.com/stac-utils/pgstac/compare/v0.6.13...v0.7.0
[v0.6.13]: https://github.com/stac-utils/pgstac/compare/v0.6.12...v0.6.13
[v0.6.12]: https://github.com/stac-utils/pgstac/compare/v0.6.11...v0.6.12
[v0.6.11]: https://github.com/stac-utils/pgstac/compare/v0.6.10...v0.6.11
[v0.6.10]: https://github.com/stac-utils/pgstac/compare/v0.6.9...v0.6.10
[v0.6.9]: https://github.com/stac-utils/pgstac/compare/v0.6.8...v0.6.9
[v0.6.8]: https://github.com/stac-utils/pgstac/compare/v0.6.7...v0.6.8
[v0.6.7]: https://github.com/stac-utils/pgstac/compare/v0.6.6...v0.6.7
[v0.6.6]: https://github.com/stac-utils/pgstac/compare/v0.6.5...v0.6.6
[v0.6.5]: https://github.com/stac-utils/pgstac/compare/v0.6.4...v0.6.5
[v0.6.4]: https://github.com/stac-utils/pgstac/compare/v0.6.3...v0.6.4
[v0.6.3]: https://github.com/stac-utils/pgstac/compare/v0.6.2...v0.6.3
[v0.6.2]: https://github.com/stac-utils/pgstac/compare/v0.6.1...v0.6.2
[v0.6.1]: https://github.com/stac-utils/pgstac/compare/v0.6.0...v0.6.1
[v0.6.0]: https://github.com/stac-utils/pgstac/compare/v0.5.1...v0.6.0
[v0.5.1]: https://github.com/stac-utils/pgstac/compare/v0.5.0...v0.5.1
[v0.5.0]: https://github.com/stac-utils/pgstac/compare/v0.4.5...v0.5.0
[v0.4.5]: https://github.com/stac-utils/pgstac/compare/v0.4.4...v0.4.5
[v0.4.4]: https://github.com/stac-utils/pgstac/compare/v0.4.3...v0.4.4
[v0.4.3]: https://github.com/stac-utils/pgstac/compare/v0.4.2...v0.4.3
[v0.4.2]: https://github.com/stac-utils/pgstac/compare/v0.4.1...v0.4.2
[v0.4.1]: https://github.com/stac-utils/pgstac/compare/v0.4.0...v0.4.1
[v0.4.0]: https://github.com/stac-utils/pgstac/compare/v0.3.4...v0.4.0
[v0.3.4]: https://github.com/stac-utils/pgstac/compare/v0.3.3...v0.3.4
[v0.3.3]: https://github.com/stac-utils/pgstac/compare/v0.3.2...v0.3.3
[v0.3.2]: https://github.com/stac-utils/pgstac/compare/v0.3.1...v0.3.2
[v0.3.1]: https://github.com/stac-utils/pgstac/compare/v0.3.0...v0.3.1
[v0.2.8]: https://github.com/stac-utils/pgstac/compare/ff02c9cee7bbb0a2de21530b0aeb34e823f2e95c...v0.2.8


================================================
FILE: CLAUDE.md
================================================
# PgSTAC Development Instructions

## Project Overview

PgSTAC is a PostgreSQL extension (SQL functions + schema) for Spatio-Temporal Asset Catalogs (STAC), paired with pypgstac, a Python package for database migrations and bulk data ingestion.

- **Repository**: stac-utils/pgstac
- **License**: MIT
- **Docs**: https://stac-utils.github.io/pgstac/

## Architecture

```
src/pgstac/sql/          ← ALL SQL source files (edit ONLY here)
src/pgstac/pgstac.sql    ← Assembled output (DO NOT edit directly)
src/pgstac/migrations/   ← Base + incremental migration files
src/pgstac/tests/        ← PGTap and basic SQL tests
src/pypgstac/src/pypgstac/ ← Python package source
src/pypgstac/tests/        ← pytest tests
scripts/                 ← Host-facing entrypoint scripts
scripts/container-scripts/ ← Scripts copied into the pypgstac container image
```

### Documentation Files

- **`CHANGELOG.md`** — the single source of truth for release notes
- **`docs/src/release-notes.md`** — a **manual copy** of `CHANGELOG.md`, served by mkdocs. Keep them identical; update both when changing either.

### Database Roles

- **pgstac_admin** – schema owner, migrations
- **pgstac_ingest** – read/write, execute functions
- **pgstac_read** – SELECT only

## Critical Rules

### SQL Changes

**ONLY edit files in `src/pgstac/sql/`**. Never edit `pgstac.sql` directly — it is assembled by concatenating all `sql/*.sql` files in alphabetical order during `stageversion`.

File execution order (alphabetical by prefix):
`000_idempotent_pre` → `001_core` → `001a_jsonutils` → `001s_stacutils` → `002_collections` → `002a_queryables` → `002b_cql` → `003a_items` → `003b_partitions` → `004_search` → `004a_collectionsearch` → `005_tileutils` → `006_tilesearch` → `997_maintenance` → `998_idempotent_post` → `999_version`

Prefix ranges: `000-001` setup/core, `002` collections, `003` items/partitions, `004-006` search/tiles, `997-998` maintenance/post, `999` version (auto-generated).

### Idempotency

`000_idempotent_pre.sql` and `998_idempotent_post.sql` are included in both base installs and incremental migrations. Use `IF NOT EXISTS`, `CREATE OR REPLACE`, `ON CONFLICT DO NOTHING`.

### Partitioning

Items partitioned by `LIST(collection)`, optionally sub-partitioned by `RANGE(datetime)` (year/month via `collections.partition_trunc`). Naming: `_items_{key}[_{YYYY|YYYYMM}]`.

Key functions: `check_partition()` (create/update), `update_partition_stats()` (recalculate constraints), `partition_sys_meta` (live VIEW — always current), `partitions` (MATERIALIZED VIEW — stale between refreshes).

### Search Path

PgSTAC installs into the `pgstac` schema. All connections must have `search_path` set to `pgstac, public`.

### pg_dump / pg_restore Compatibility

PgSTAC functions reference PostGIS functions (e.g. `st_makeenvelope`, `st_geomfromgeojson`) **without schema qualification** because PostGIS may be installed in either `public` or `postgis` schema. `pg_dump` clears `search_path` during restore, breaking these references.

**Rules to maintain dump/restore compatibility:**

- **Do NOT schema-qualify PostGIS function calls** in PgSTAC SQL
- **Avoid cross-function dependencies in SQL functions used by GENERATED columns** — pg_dump orders functions alphabetically, so `func_a` calling `func_b` may be created before `func_b` exists. Inline the logic instead.
- Use `pgstac_restore` (via `scripts/container-scripts/pgstac_restore` in the image) to restore dumps — it installs a temporary event trigger that sets the correct `search_path` before each DDL command
- Test with `scripts/test --pgdump`

## Development Workflow

### Setup

```bash
scripts/setup          # Build Docker images, start database
scripts/server         # Start database (use --detach for background)
```

### Running Tests

```bash
scripts/test                    # All test suites
scripts/test --pypgstac         # pytest only
scripts/test --pgtap            # PGTap SQL tests
scripts/test --basicsql         # SQL output comparison tests
scripts/test --migrations       # Full migration chain test
scripts/test --formatting       # ruff + ty
scripts/test --pgdump           # pg_dump/pg_restore round-trip test
```

All tests run inside Docker via `scripts/runinpypgstac`. Use `--build` to rebuild images first.

### Docker Architecture

- **pgstac** container: PostgreSQL 17 + PostGIS 3 + extensions, port 5439→5432
- **pypgstac** container: Python + Rust build tools, runs scripts
- Credentials: `username` / `password`, database: `postgis`

## Migration Process

### Creating Migrations (Release)

```bash
scripts/stageversion 0.9.11
```

This runs inside Docker and:
1. Removes old `*unreleased*` migration files
2. Writes `SELECT set_version('0.9.11');` to `999_version.sql`
3. Concatenates all `sql/*.sql` → `migrations/pgstac.0.9.11.sql` (base migration)
4. Copies the base migration to `pgstac.sql`
5. Updates `version.py` and `pyproject.toml` version strings
6. Runs `makemigration -f 0.9.10 -t 0.9.11` to generate incremental migration

### How makemigration Works

`makemigration` (copied from `scripts/container-scripts/makemigration` into the image) generates incremental migrations by diffing schemas:

1. Creates two temp databases: `migra_from`, `migra_to`
2. Loads old base migration into `migra_from`
3. Loads new base migration into `migra_to`
4. Runs `migra --schema pgstac --unsafe` to calculate the SQL diff
5. Wraps the diff with `000_idempotent_pre.sql`, `998_idempotent_post.sql`, and `set_version()`
6. Output: `migrations/pgstac.0.9.10-0.9.11.sql`

**Important**: The generated migration is created with a `.staged` suffix. You MUST:
1. Review the `.staged` file for correctness
2. Remove the `.staged` suffix to enable it
3. Run `scripts/test --migrations` to validate

### Running Migrations

```bash
pypgstac migrate                    # Migrate to current pypgstac version
pypgstac migrate --toversion 0.9.10 # Migrate to specific version
```

The `Migrate` class (in `migrate.py`) builds a directed graph of all available migration files and uses BFS to find the shortest path from the current DB version to the target.

## Testing Details

### Test Database Setup

Tests create `pgstac_test_db_template` from `pgstac.sql`, then clone it per test suite:
- `pgstac_test_pgtap` – PGTap tests
- `pgstac_test_basicsql` – basic SQL tests
- `pgstac_test_pypgstac` – pytest (function-scoped fixture creates fresh DB per test)

### Test Types

1. **PGTap**: SQL assertions in `src/pgstac/tests/pgtap.sql`
2. **Basic SQL**: `.sql` files in `src/pgstac/tests/basic/`, output compared to `.sql.out`
3. **Pytest**: `src/pypgstac/tests/test_load.py`, `test_benchmark.py`, `test_queryables.py`, `hydration/`
4. **Migration**: Installs v0.3.0, migrates to latest, runs all test suites against migrated DB
5. **pg_dump**: Dumps a database with sample data, restores via `pgstac_restore`, verifies counts match

### Pytest Fixtures (conftest.py)

- `db` – function-scoped `PgstacDB` connected to fresh test DB
- `loader` – `Loader(db)` instance

## PR Checklist

1. Changes only in `src/pgstac/sql/` for SQL, `src/pypgstac/` for Python
2. Tests added if appropriate
3. `CHANGELOG.md` updated under `## [UNRELEASED]`
4. `docs/src/release-notes.md` updated to match `CHANGELOG.md` (they must stay identical)
5. Docs updated if needed
6. All tests pass: `scripts/test` (or `scripts/runinpypgstac --build test --pypgstac`)

## Release Checklist

1. `scripts/stageversion VERSION`
2. Review `.staged` migration, remove suffix
3. `scripts/test --migrations`
4. Move CHANGELOG "Unreleased" → new version
5. Copy updated `CHANGELOG.md` to `docs/src/release-notes.md` (keep identical)
6. Create PR, merge
7. `git tag vVERSION && git push origin vVERSION`
8. CI publishes to PyPI + ghcr.io

## Common Patterns

### Adding a new SQL function

1. Edit the appropriate file in `src/pgstac/sql/` (use `CREATE OR REPLACE FUNCTION`)
2. Add `SECURITY DEFINER` if the function modifies tables
3. Grant execute in `998_idempotent_post.sql` if needed
4. Add PGTap or basic SQL tests

### Adding a new queryable

```sql
INSERT INTO queryables (name, definition, property_wrapper, property_index_type)
VALUES ('prop_name', '{"$ref": "..."}', 'to_int', 'BTREE')
ON CONFLICT DO NOTHING;
```

### Loading test data

```bash
scripts/runinpypgstac --build loadsampledata
```


================================================
FILE: CONTRIBUTING.md
================================================
# Development - Contributing

PgSTAC uses a dockerized development environment.

Local-only planning notes now live under `.plans/` and are intentionally gitignored.
If you keep local execution settings, start from `.env.example` and write overrides to
`.env`.

To build the docker images and set up the test database, use:

```bash
scripts/setup
```

To bring up the development database:
```
scripts/server
```

To run tests, use:
```bash
scripts/test
```

To set up pre-commit using the project uv workflow:

```bash
uv tool install pre-commit==3.5.0
pre-commit install
```

Useful options:

```bash
scripts/test --fast
scripts/test --pypgstac
scripts/test --build-policy always
```

`scripts/test` defaults to `PGSTAC_BUILD_POLICY=always` so the container image reflects
your current checkout. If you intentionally want to reuse an existing image, set
`PGSTAC_BUILD_POLICY=missing` or pass `--build-policy missing`.

To rebuild docker images:
```bash
scripts/update
```

Container-only helper scripts now live in `scripts/container-scripts/` and are copied
into the `pypgstac` image during build. Top-level `scripts/` remain the host-facing
entrypoint surface.

To drop into a console, use
```bash
scripts/console
```

To drop into a psql console on the database container, use:
```bash
scripts/console --db
```

To run migrations on the development database, use
```bash
scripts/migrate
```

To stage code and configurations and create template migrations for a version release, use
```bash
scripts/stageversion [version]
```

To generate only the incremental migration, use:

```bash
scripts/makemigration --from 0.9.10 --to 0.9.11
```

Examples:
```
scripts/stageversion 0.2.8
```

This will create a base migration for the new version and will create incremental migrations between any existing base migrations. The incremental migrations that are automatically generated by this script will have the extension ".staged" on the file. You must manually review (and make any modifications necessary) this file and remove the ".staged" extension to enable the migration.

### Making Changes to SQL
All changes to SQL should only be made in the `/src/pgstac/sql` directory. SQL Files will be run in alphabetical order.

### Adding Tests

There are three different types of tests within the project: (1) pgTap tests, (2) basic SQL tests, and (3) PyPgSTAC tests.

PgSTAC tests can be written using PGTap or basic SQL output comparisons. Additional testing is available using PyTest in the PyPgSTAC module. Tests can be run using the `scripts/test` command.

PGTap tests can be written using [PGTap](https://pgtap.org/) syntax. Tests should be added to the `/src/pgstac/tests/pgtap` directory. Any new SQL files added to this directory must be added to `/src/pgstac/tests/pgtap.sql`.

The Basic SQL tests will run any file ending in '.sql' in the `/src/pgstac/tests/basic` directory and will compare the exact results to the corresponding '.sql.out' file.

PyPgSTAC tests are pytest tests, and they are located in `/src/pypgstac/tests`

All tests can be found in tests/pgtap.sql and are run using `scripts/test`.

Individual tests can be run with any combination of the following flags `--formatting --basicsql --pgtap --migrations --pypgstac`. The `--formatting` suite runs Ruff lint/format checks and Ty type checks. If pre-commit is installed, tests will be run on commit based on which files have changed.


### To make a PR
1) Make any changes.
2) Make sure there are tests if appropriate.
3) Update Changelog using "### Unreleased" as the version.
4) Make any changes necessary to the docs.
5) Ensure all tests pass (pre-commit will take care of this if installed and the tests will also run on CI)
6) Create PR against the "main" branch.



### Release Process
1) Run "scripts/stageversion VERSION" (where version is the next version using semantic versioning ie 0.7.0
2) Check the incremental migration created in the /src/pgstac/migrations file with the .staged extension to make sure that the generated SQL looks appropriate.
3) Run the tests against the incremental migrations "scripts/test --migrations"
4) Move any "Unreleased" changes in the CHANGELOG.md to the new version.
5) Open a PR for the version change.
6) Once the PR has been merged, start the release process.
7) Create a git tag `git tag v0.2.8` using new version number
8) Push the git tag `git push origin v0.2.8`
9) The CI process will push pypgstac to PyPi, create a docker image on ghcr.io, and create a release on github.


### Get Involved

Issues and pull requests are more than welcome: https://github.com/stac-utils/pgstac/issues

### A Note on Hydration and Dehydration

Dehydration refers to stripping redundant attributes of STAC items when storing them within the database. For many collections, dehydration saves a significant amount of memory.

Rehydration is the process of adding the stripped attributes back to the STAC items, such as during the export of an STAC collection or the response to a search query.

PgSTAC, a versatile tool, is designed to seamlessly integrate with PyPgSTAC or alternative backends. This flexibility allows for direct calls for both rehydration and dehydration, giving developers and technical users a sense of control over the process.

Hydration and dehydration are de-facto settings that users can not opt out of. In the future, we may provide a configuration for use cases where the size benefits do not justify the added complexity.


================================================
FILE: LICENSE
================================================
    MIT License

    Copyright (c) Microsoft Corporation and other contributors.

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE


================================================
FILE: README.md
================================================

<p align="center">
  <img src="https://user-images.githubusercontent.com/10407788/174893876-7a3b5b7a-95a5-48c4-9ff2-cc408f1b6af9.png"/>
  <p align="center">PostgreSQL schema and functions for Spatio-Temporal Asset Catalog (STAC)</p>
</p>

<p align="center">
  <a href="https://github.com/stac-utils/pgstac/actions?query=workflow%3ACI" target="_blank">
      <img src="https://github.com/stac-utils/pgstac/workflows/CI/badge.svg" alt="Test">
  </a>
  <a href="https://pypi.org/project/pypgstac" target="_blank">
      <img src="https://img.shields.io/pypi/v/pypgstac?color=%2334D058&label=pypi%20package" alt="Package version">
  </a>
  <a href="https://github.com/stac-utils/pgstac/blob/master/LICENSE" target="_blank">
      <img src="https://img.shields.io/github/license/stac-utils/pgstac.svg" alt="License">
  </a>
</p>

---

**Documentation**: <a href="https://stac-utils.github.io/pgstac/" target="_blank">https://stac-utils.github.io/pgstac/</a>

**Source Code**: <a href="https://github.com/stac-utils/pgstac" target="_blank">https://github.com/stac-utils/pgstac</a>

---

**PgSTAC** is a set of SQL functions and schema to build highly performant databases for Spatio-Temporal Asset Catalogs ([STAC](https://stacspec.org/)). The project also provides **pypgstac** (a Python module) to help with database migrations and document ingestion (collections and items).

PgSTAC provides functionality for STAC Filters, CQL2 search, and utilities to help manage the indexing and partitioning of STAC Collections and Items.

PgSTAC is used in production to scale to hundreds of millions of STAC items. PgSTAC implements core data models and functions to provide a STAC API from a PostgreSQL database. PgSTAC is entirely within the database and does not provide an HTTP-facing API. The [STAC FastAPI](https://github.com/stac-utils/stac-fastapi) PgSTAC backend and [Franklin](https://github.com/azavea/franklin) can be used to expose a PgSTAC catalog. Integrating PgSTAC with any other language with PostgreSQL drivers is also possible.

PgSTAC Documentation: https://stac-utils.github.io/pgstac/pgstac

pyPgSTAC Documentation: https://stac-utils.github.io/pgstac/pypgstac

## Project structure

```
/
 ├── src/pypgstac           - pyPgSTAC python module
 ├── src/pypgstac/tests/    - pyPgSTAC tests
 ├── scripts/               - scripts to set up the environment, create migrations, and run tests
 ├── src/pgstac/sql/        - PgSTAC SQL code
 ├── src/pgstac/migrations/ - Migrations for incremental upgrades
 └── src/pgstac/tests/      - test suite
```

## Contribution & Development

See [CONTRIBUTING.md](https://github.com//stac-utils/pgstac/blob/master/CONTRIBUTING.md)

## License

See [LICENSE](https://github.com//stac-utils/pgstac/blob/master/LICENSE)

## Authors

See [contributors](https://github.com/stac-utils/pgstac/graphs/contributors) for a listing of individual contributors.

## Changes

See [CHANGELOG.md](https://github.com/stac-utils/pgstac/blob/master/CHANGELOG.md).


================================================
FILE: docker/pgstac/Dockerfile
================================================
# syntax=docker/dockerfile:1.7
ARG PG_MAJOR=17
ARG POSTGIS_MAJOR=3
ARG PG_TLE_VERSION=1.5.2
ARG DEBIAN_SUITE=trixie

# Base postgres image that pgstac can be installed onto
FROM postgres:${PG_MAJOR}-${DEBIAN_SUITE} AS pgstacbase
ARG POSTGIS_MAJOR
ARG PG_MAJOR
ARG PG_TLE_VERSION
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
    --mount=type=cache,target=/root/.cache/git,sharing=locked \
    apt-get update \
    && apt-get install -y --no-install-recommends \
        postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
        postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts \
        postgresql-$PG_MAJOR-pgtap \
        postgresql-$PG_MAJOR-plpgsql-check \
        postgresql-$PG_MAJOR-partman \
        postgresql-server-dev-$PG_MAJOR \
        build-essential \
        ca-certificates \
        curl \
        git \
        flex \
        bison \
        libkrb5-dev \
    && GIT_TERMINAL_PROMPT=0 git clone --branch v${PG_TLE_VERSION} --depth 1 https://github.com/aws/pg_tle.git /tmp/pg_tle \
    && make -C /tmp/pg_tle \
    && make -C /tmp/pg_tle install \
    && rm -rf /tmp/pg_tle \
    && sed -i "s/^#shared_preload_libraries = .*/shared_preload_libraries = 'pg_tle'/" /usr/share/postgresql/$PG_MAJOR/postgresql.conf.sample \
    && sed -i "s/^#shared_preload_libraries = .*/shared_preload_libraries = 'pg_tle'/" /usr/share/postgresql/postgresql.conf.sample \
    && apt-get purge -y --auto-remove \
        postgresql-server-dev-$PG_MAJOR \
        build-essential \
        curl \
        git \
        flex \
        bison \
        libkrb5-dev \
    && apt-get clean && apt-get -y autoremove \
    && rm -rf /var/lib/apt/lists/*

# The pgstacbase image with latest version of pgstac installed
FROM pgstacbase AS pgstac
WORKDIR /docker-entrypoint-initdb.d
COPY docker/pgstac/dbinit/pgstac.sh 990_pgstac.sh
COPY src/pgstac/pgstac.sql 999_pgstac.sql


================================================
FILE: docker/pgstac/dbinit/pgstac.sh
================================================
SYSMEM=$(cat /proc/meminfo | grep -i 'memtotal' | grep -o '[[:digit:]]*')
SHARED_BUFFERS=$(( $SYSMEM/4 ))
EFFECTIVE_CACHE_SIZE=$(( $SYSMEM*3/4 ))
MAINTENANCE_WORK_MEM=$(( $SYSMEM/8 ))
WORK_MEM=$(( $SHARED_BUFFERS/50 ))

psql -X -q -v ON_ERROR_STOP=1 <<EOSQL
CREATE EXTENSION IF NOT EXISTS pg_tle;
ALTER SYSTEM SET search_path TO pgstac, public;
ALTER SYSTEM SET client_min_messages TO WARNING;
ALTER SYSTEM SET shared_buffers='${SHARED_BUFFERS}kB';
ALTER SYSTEM SET effective_cache_size='${EFFECTIVE_CACHE_SIZE}kB';
ALTER SYSTEM SET maintenance_work_mem='${MAINTENANCE_WORK_MEM}kB';
ALTER SYSTEM SET work_mem='${WORK_MEM}kB';
ALTER SYSTEM SET effective_io_concurrency=200;
ALTER SYSTEM SET random_page_cost=1.1;
EOSQL


================================================
FILE: docker/pypgstac/Dockerfile
================================================
# syntax=docker/dockerfile:1.7
FROM rust:1-slim-trixie AS pyrustbase
ENV PYTHONWRITEBYTECODE=1
ENV PYTHONBUFFERED=1
ENV PIP_ROOT_USER_ACTION=ignore
ENV UV_BREAK_SYSTEM_PACKAGES=1
ENV PYTHONPATH="/opt/src/pypgstac:$PYTHONPATH"
ENV PATH="/opt/pgstac/container-scripts:$PATH"
ENV UV_CACHE_DIR=/root/.cache/uv
ARG PG_MAJOR=17
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
    --mount=type=cache,target=/root/.cache/uv,sharing=locked \
    apt-get update \
    && apt-get install -y --no-install-recommends \
        adduser \
        ca-certificates \
        curl \
        postgresql-client-${PG_MAJOR} \
        python3 python-is-python3 python3-pip python3-venv \
        build-essential clang gcc git libssl-dev llvm make pkg-config \
    && curl -LsSf https://astral.sh/uv/install.sh | UV_INSTALL_DIR=/usr/local/bin sh \
    && apt-get clean && apt-get -y autoremove \
    && rm -rf /var/lib/apt/lists/*

FROM pyrustbase AS pypgstac
COPY ./src/pypgstac/pyproject.toml /tmp/pyproject.toml
WORKDIR /tmp
RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
    uv pip compile /tmp/pyproject.toml \
    --extra dev \
    --extra test \
    --extra psycopg \
    --extra migrations \
    >/tmp/requirements.txt \
    && uv pip install --system -r /tmp/requirements.txt
COPY scripts/container-scripts /opt/pgstac/container-scripts
COPY src/pypgstac /opt/src/pypgstac
COPY src/pgstac /opt/src/pgstac
WORKDIR /opt/src/pypgstac
RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
    uv pip install --system -e . \
    && rm -rf /usr/local/cargo/registry

RUN addgroup --gid 1000 user && \
    adduser --uid 1000 --gid 1000 --disabled-password --gecos "" --home /home/user user && \
    chown -R user:user /opt/src/pypgstac /opt/src/pgstac
USER user

# Optional runtime-optimized image: no build toolchain, only pypgstac package + runtime deps.
FROM python:3.13-slim-trixie AS pypgstac-runtime
ENV PYTHONWRITEBYTECODE=1
ENV PYTHONBUFFERED=1
ENV UV_BREAK_SYSTEM_PACKAGES=1
ENV PATH="/opt/pgstac/container-scripts:$PATH"
ENV UV_CACHE_DIR=/root/.cache/uv
ARG PG_MAJOR=17
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
    --mount=type=cache,target=/root/.cache/uv,sharing=locked \
    apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        postgresql-client-${PG_MAJOR} \
    && curl -LsSf https://astral.sh/uv/install.sh | UV_INSTALL_DIR=/usr/local/bin sh \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
COPY ./src/pypgstac/pyproject.toml /tmp/pyproject.toml
RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
    uv pip compile /tmp/pyproject.toml \
    --extra psycopg \
    --extra migrations \
    >/tmp/requirements.txt \
    && uv pip install --system -r /tmp/requirements.txt
COPY scripts/container-scripts /opt/pgstac/container-scripts
COPY src/pypgstac /opt/src/pypgstac
COPY src/pgstac /opt/src/pgstac
WORKDIR /opt/src/pypgstac
RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
    uv pip install --system .


================================================
FILE: docker-compose.yml
================================================
services:
  pgstac:
    image: pgstac
    env_file:
      - .env
    build:
      context: .
      network: host
      dockerfile: docker/pgstac/Dockerfile
      target: pgstac
    platform: linux/amd64
    environment:
      - POSTGRES_USER=${POSTGRES_USER:-username}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-password}
      - POSTGRES_DB=${POSTGRES_DB:-postgis}
      - PGHOST=/var/run/postgresql
      - PGPORT=5432
      - PGUSER=${PGUSER:-username}
      - PGPASSWORD=${PGPASSWORD:-password}
      - PGDATABASE=${PGDATABASE:-postgis}
    ports:
      - "${PGPORT:-5439}:5432"
    volumes:
      - pgstac-pgdata:/var/lib/postgresql/data
    command: postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h /var/run/postgresql -p 5432 -U ${PGUSER:-username} -d ${PGDATABASE:-postgis}"]
      interval: 5s
      timeout: 5s
      retries: 12
      start_period: 5s
  pypgstac:
    image: pypgstac
    env_file:
      - .env
    build:
      context: .
      network: host
      dockerfile: docker/pypgstac/Dockerfile
      target: pypgstac
    platform: linux/amd64
    environment:
      - PGHOST=pgstac
      - PGPORT=5432
      - PGUSER=${PGUSER:-username}
      - PGPASSWORD=${PGPASSWORD:-password}
      - PGDATABASE=${PGDATABASE:-postgis}
    depends_on:
      pgstac:
        condition: service_healthy
volumes:
  pgstac-pgdata:


================================================
FILE: docs/mkdocs.yml
================================================
site_name: pgstac
site_description: PostgreSQL schema and functions for Spatio-Temporal Asset Catalog (STAC).

docs_dir: 'src'
site_dir: 'build'

repo_name: "stac-utils/pgstac"
repo_url: "https://github.com/stac-utils/pgstac"
edit_uri: "blob/master/docs/src"
site_url: "https://stac-utils.github.io/pgstac/"

extra:
  social:
    - icon: "fontawesome/brands/github"
      link: "https://github.com/stac-utils"
    - icon: "fontawesome/brands/twitter"
      link: "https://twitter.com/STACspec"

nav:
  - Home: "index.md"
  - PgSTAC: "pgstac.md"
  - pyPgSTAC: "pypgstac.md"
  - Performance:
    - item_size_analysis.ipynb
  - Development - Contributing: "contributing.md"
  - Release Notes: "release-notes.md"

plugins:
  - search
  - mkdocs-jupyter:
      include_source: True
      include_requirejs: True
      execute: True
      show_input: False

theme:
  name: material
  palette:
    primary: indigo
    scheme: default

# https://github.com/kylebarron/cogeo-mosaic/blob/mkdocs/mkdocs.yml#L50-L75
markdown_extensions:
  - admonition
  - attr_list
  - codehilite:
      guess_lang: false
  - def_list
  - footnotes
  - pymdownx.arithmatex
  - pymdownx.betterem
  - pymdownx.caret:
      insert: false
  - pymdownx.details
  - pymdownx.emoji
  - pymdownx.escapeall:
      hardbreak: true
      nbsp: true
  - pymdownx.magiclink:
      hide_protocol: true
      repo_url_shortener: true
  - pymdownx.smartsymbols
  - pymdownx.superfences
  - pymdownx.tasklist:
      custom_checkbox: true
  - pymdownx.tilde
  - toc:
      permalink: true


================================================
FILE: docs/src/benchmark.json
================================================
{
    "machine_info": {
        "node": "quercus",
        "processor": "x86_64",
        "machine": "x86_64",
        "python_compiler": "GCC 13.2.0",
        "python_implementation": "CPython",
        "python_implementation_version": "3.12.3",
        "python_version": "3.12.3",
        "python_build": [
            "main",
            "Nov  6 2024 18:32:19"
        ],
        "release": "6.8.0-51-generic",
        "system": "Linux",
        "cpu": {
            "python_version": "3.12.3.final.0 (64 bit)",
            "cpuinfo_version": [
                9,
                0,
                0
            ],
            "cpuinfo_version_string": "9.0.0",
            "arch": "X86_64",
            "bits": 64,
            "count": 16,
            "arch_string_raw": "x86_64",
            "vendor_id_raw": "AuthenticAMD",
            "brand_raw": "AMD Ryzen 7 7840U w/ Radeon  780M Graphics",
            "hz_advertised_friendly": "1.7866 GHz",
            "hz_actual_friendly": "1.7866 GHz",
            "hz_advertised": [
                1786629000,
                0
            ],
            "hz_actual": [
                1786629000,
                0
            ],
            "stepping": 1,
            "model": 116,
            "family": 25,
            "flags": [
                "3dnowext",
                "3dnowprefetch",
                "abm",
                "adx",
                "aes",
                "amd_lbr_v2",
                "aperfmperf",
                "apic",
                "arat",
                "avx",
                "avx2",
                "avx512_bf16",
                "avx512_bitalg",
                "avx512_vbmi2",
                "avx512_vnni",
                "avx512_vpopcntdq",
                "avx512bitalg",
                "avx512bw",
                "avx512cd",
                "avx512dq",
                "avx512f",
                "avx512ifma",
                "avx512vbmi",
                "avx512vbmi2",
                "avx512vl",
                "avx512vnni",
                "avx512vpopcntdq",
                "bmi1",
                "bmi2",
                "bpext",
                "cat_l3",
                "cdp_l3",
                "clflush",
                "clflushopt",
                "clwb",
                "clzero",
                "cmov",
                "cmp_legacy",
                "constant_tsc",
                "cpb",
                "cppc",
                "cpuid",
                "cqm",
                "cqm_llc",
                "cqm_mbm_local",
                "cqm_mbm_total",
                "cqm_occup_llc",
                "cr8_legacy",
                "cx16",
                "cx8",
                "dbx",
                "de",
                "decodeassists",
                "erms",
                "extapic",
                "extd_apicid",
                "f16c",
                "flush_l1d",
                "flushbyasid",
                "fma",
                "fpu",
                "fsgsbase",
                "fsrm",
                "fxsr",
                "fxsr_opt",
                "gfni",
                "ht",
                "hw_pstate",
                "ibpb",
                "ibrs",
                "ibrs_enhanced",
                "ibs",
                "invpcid",
                "irperf",
                "lahf_lm",
                "lbrv",
                "lm",
                "mba",
                "mca",
                "mce",
                "misalignsse",
                "mmx",
                "mmxext",
                "monitor",
                "movbe",
                "msr",
                "mtrr",
                "mwaitx",
                "nonstop_tsc",
                "nopl",
                "npt",
                "nrip_save",
                "nx",
                "ospke",
                "osvw",
                "osxsave",
                "overflow_recov",
                "pae",
                "pat",
                "pausefilter",
                "pci_l2i",
                "pclmulqdq",
                "pdpe1gb",
                "perfctr_core",
                "perfctr_llc",
                "perfctr_nb",
                "perfmon_v2",
                "pfthreshold",
                "pge",
                "pku",
                "pni",
                "popcnt",
                "pqe",
                "pqm",
                "pse",
                "pse36",
                "rapl",
                "rdpid",
                "rdpru",
                "rdrand",
                "rdrnd",
                "rdseed",
                "rdt_a",
                "rdtscp",
                "rep_good",
                "sep",
                "sha",
                "sha_ni",
                "skinit",
                "smap",
                "smca",
                "smep",
                "ssbd",
                "sse",
                "sse2",
                "sse4_1",
                "sse4_2",
                "sse4a",
                "ssse3",
                "stibp",
                "succor",
                "svm",
                "svm_lock",
                "syscall",
                "tce",
                "topoext",
                "tsc",
                "tsc_scale",
                "umip",
                "user_shstk",
                "v_spec_ctrl",
                "v_vmsave_vmload",
                "vaes",
                "vgif",
                "vmcb_clean",
                "vme",
                "vmmcall",
                "vnmi",
                "vpclmulqdq",
                "wbnoinvd",
                "wdt",
                "x2apic",
                "x2avic",
                "xgetbv1",
                "xsave",
                "xsavec",
                "xsaveerptr",
                "xsaveopt",
                "xsaves"
            ],
            "l3_cache_size": 1048576,
            "l2_cache_size": 8388608,
            "l1_data_cache_size": 262144,
            "l1_instruction_cache_size": 262144,
            "l2_cache_line_size": 1024,
            "l2_cache_associativity": 6
        }
    },
    "commit_info": {
        "id": "6da165b7c4f6da321d0b58bbb78da2887763a0d8",
        "time": "2024-12-09T10:50:39-06:00",
        "author_time": "2024-12-09T10:50:39-06:00",
        "dirty": true,
        "project": "pgstac",
        "branch": "feat/search-benchmarks"
    },
    "benchmarks": [
        {
            "group": "xyzsearch",
            "name": "test1[3-0.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-0.5]",
            "params": {
                "zoom": 3,
                "item_width": 0.5
            },
            "param": "3-0.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 4.781100236999919,
                "max": 4.923354106998886,
                "mean": 4.84395678366612,
                "stddev": 0.07255507461212232,
                "rounds": 3,
                "median": 4.827416006999556,
                "iqr": 0.10669040249922546,
                "q1": 4.792679179499828,
                "q3": 4.8993695819990535,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 4.781100236999919,
                "hd15iqr": 4.923354106998886,
                "ops": 0.20644279969053644,
                "total": 14.53187035099836,
                "data": [
                    4.781100236999919,
                    4.827416006999556,
                    4.923354106998886
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-0.75]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-0.75]",
            "params": {
                "zoom": 3,
                "item_width": 0.75
            },
            "param": "3-0.75",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 2.147751219003112,
                "max": 2.1683643510004913,
                "mean": 2.158085888334123,
                "stddev": 0.010306680943796004,
                "rounds": 3,
                "median": 2.158142094998766,
                "iqr": 0.015459848998034431,
                "q1": 2.1503489380020255,
                "q3": 2.16580878700006,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 2.147751219003112,
                "hd15iqr": 2.1683643510004913,
                "ops": 0.4633735874024566,
                "total": 6.474257665002369,
                "data": [
                    2.1683643510004913,
                    2.158142094998766,
                    2.147751219003112
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-1]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-1]",
            "params": {
                "zoom": 3,
                "item_width": 1
            },
            "param": "3-1",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 1.1977020270023786,
                "max": 1.2047663939993072,
                "mean": 1.2008456296668253,
                "stddev": 0.003595734342317445,
                "rounds": 3,
                "median": 1.2000684679987899,
                "iqr": 0.005298275247696438,
                "q1": 1.1982936372514814,
                "q3": 1.2035919124991779,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 1.1977020270023786,
                "hd15iqr": 1.2047663939993072,
                "ops": 0.8327465040426971,
                "total": 3.6025368890004756,
                "data": [
                    1.2047663939993072,
                    1.1977020270023786,
                    1.2000684679987899
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-1.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-1.5]",
            "params": {
                "zoom": 3,
                "item_width": 1.5
            },
            "param": "3-1.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.5610035069985315,
                "max": 0.5700876880000578,
                "mean": 0.5648575563330572,
                "stddev": 0.004695826663797881,
                "rounds": 3,
                "median": 0.5634814740005822,
                "iqr": 0.006813135751144728,
                "q1": 0.5616229987490442,
                "q3": 0.5684361345001889,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 0.5610035069985315,
                "hd15iqr": 0.5700876880000578,
                "ops": 1.7703578340914847,
                "total": 1.6945726689991716,
                "data": [
                    0.5610035069985315,
                    0.5634814740005822,
                    0.5700876880000578
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-2]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-2]",
            "params": {
                "zoom": 3,
                "item_width": 2
            },
            "param": "3-2",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.3394572959987272,
                "max": 0.3474930239972309,
                "mean": 0.3423380219983301,
                "stddev": 0.0035336363516854353,
                "rounds": 4,
                "median": 0.3412008839986811,
                "iqr": 0.004039818997625844,
                "q1": 0.34031811249951716,
                "q3": 0.344357931497143,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 0.3394572959987272,
                "hd15iqr": 0.3474930239972309,
                "ops": 2.921089495588889,
                "total": 1.3693520879933203,
                "data": [
                    0.3394572959987272,
                    0.3474930239972309,
                    0.3412228389970551,
                    0.3411789290003071
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-3]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-3]",
            "params": {
                "zoom": 3,
                "item_width": 3
            },
            "param": "3-3",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.1616739819983195,
                "max": 0.1732538390024274,
                "mean": 0.1683614392864651,
                "stddev": 0.004645194475107718,
                "rounds": 7,
                "median": 0.16951855400111526,
                "iqr": 0.007849024001188809,
                "q1": 0.16395422725054232,
                "q3": 0.17180325125173113,
                "iqr_outliers": 0,
                "stddev_outliers": 3,
                "outliers": "3;0",
                "ld15iqr": 0.1616739819983195,
                "hd15iqr": 0.1732538390024274,
                "ops": 5.939602347414667,
                "total": 1.1785300750052556,
                "data": [
                    0.16951855400111526,
                    0.17012289500053157,
                    0.1732538390024274,
                    0.1616739819983195,
                    0.16210973700071918,
                    0.16948769800001173,
                    0.17236337000213098
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-4]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-4]",
            "params": {
                "zoom": 3,
                "item_width": 4
            },
            "param": "3-4",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.11248960100056138,
                "max": 0.12265536899940344,
                "mean": 0.11735441244430452,
                "stddev": 0.0035863367674561345,
                "rounds": 9,
                "median": 0.11760097699880134,
                "iqr": 0.00569761775295774,
                "q1": 0.1145561129978887,
                "q3": 0.12025373075084644,
                "iqr_outliers": 0,
                "stddev_outliers": 3,
                "outliers": "3;0",
                "ld15iqr": 0.11248960100056138,
                "hd15iqr": 0.12265536899940344,
                "ops": 8.52119642688844,
                "total": 1.0561897119987407,
                "data": [
                    0.11948643000141601,
                    0.11310462300025392,
                    0.12265536899940344,
                    0.11510762000034447,
                    0.12055026199959684,
                    0.1150399429971003,
                    0.11760097699880134,
                    0.12015488700126298,
                    0.11248960100056138
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-5]",
            "params": {
                "zoom": 3,
                "item_width": 5
            },
            "param": "3-5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.08600778799882391,
                "max": 0.11819229899992933,
                "mean": 0.09380789238415534,
                "stddev": 0.008470383289679074,
                "rounds": 13,
                "median": 0.09278260499922908,
                "iqr": 0.009015565500703815,
                "q1": 0.08737023674893862,
                "q3": 0.09638580224964244,
                "iqr_outliers": 1,
                "stddev_outliers": 1,
                "outliers": "1;1",
                "ld15iqr": 0.08600778799882391,
                "hd15iqr": 0.11819229899992933,
                "ops": 10.66008386485086,
                "total": 1.2195026009940193,
                "data": [
                    0.0995918389999133,
                    0.09643121099725249,
                    0.09386423999967519,
                    0.09064780799963046,
                    0.08600778799882391,
                    0.09290014300131588,
                    0.09637066600043909,
                    0.08746462799899746,
                    0.11819229899992933,
                    0.09278260499922908,
                    0.08708706299876212,
                    0.09196810800131061,
                    0.08619420299874037
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-6]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-6]",
            "params": {
                "zoom": 3,
                "item_width": 6
            },
            "param": "3-6",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.06886182499874849,
                "max": 0.08020066499739187,
                "mean": 0.0725205675997131,
                "stddev": 0.003679136903194388,
                "rounds": 15,
                "median": 0.07074371199996676,
                "iqr": 0.005597590749857773,
                "q1": 0.06958281574952707,
                "q3": 0.07518040649938484,
                "iqr_outliers": 0,
                "stddev_outliers": 2,
                "outliers": "2;0",
                "ld15iqr": 0.06886182499874849,
                "hd15iqr": 0.08020066499739187,
                "ops": 13.789191578306898,
                "total": 1.0878085139956966,
                "data": [
                    0.07045519399980549,
                    0.07074371199996676,
                    0.06936405300075421,
                    0.06957183299891767,
                    0.07550127799913753,
                    0.078494495999621,
                    0.08020066499739187,
                    0.07361344899982214,
                    0.07421779200012679,
                    0.07616023700029473,
                    0.06961576400135527,
                    0.06898055299825501,
                    0.07236440099950414,
                    0.06966326200199546,
                    0.06886182499874849
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-8]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-8]",
            "params": {
                "zoom": 3,
                "item_width": 8
            },
            "param": "3-8",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.05374020599992946,
                "max": 0.05982637700071791,
                "mean": 0.0563469560555758,
                "stddev": 0.0016293739578158342,
                "rounds": 18,
                "median": 0.05618607450014679,
                "iqr": 0.0021514159998332616,
                "q1": 0.05518398200001684,
                "q3": 0.0573353979998501,
                "iqr_outliers": 0,
                "stddev_outliers": 4,
                "outliers": "4;0",
                "ld15iqr": 0.05374020599992946,
                "hd15iqr": 0.05982637700071791,
                "ops": 17.747187603420596,
                "total": 1.0142452090003644,
                "data": [
                    0.055682651000097394,
                    0.05374020599992946,
                    0.05650308599797427,
                    0.059472557997651165,
                    0.05982637700071791,
                    0.057392383001570124,
                    0.056449657000484876,
                    0.055928424997546244,
                    0.05518398200001684,
                    0.05479692000153591,
                    0.0573353979998501,
                    0.057961112001066795,
                    0.055098496999562485,
                    0.05566840800020145,
                    0.05707300100038992,
                    0.05644372400274733,
                    0.055237412998394575,
                    0.05445141100062756
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[3-10]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-10]",
            "params": {
                "zoom": 3,
                "item_width": 10
            },
            "param": "3-10",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.047568563000822905,
                "max": 0.05683792700074264,
                "mean": 0.05166188815055648,
                "stddev": 0.0025601894529204182,
                "rounds": 20,
                "median": 0.05139943300127925,
                "iqr": 0.002679176501260372,
                "q1": 0.05012959849955223,
                "q3": 0.0528087750008126,
                "iqr_outliers": 1,
                "stddev_outliers": 6,
                "outliers": "6;1",
                "ld15iqr": 0.047568563000822905,
                "hd15iqr": 0.05683792700074264,
                "ops": 19.356628954128315,
                "total": 1.0332377630111296,
                "data": [
                    0.05180252200079849,
                    0.048698882001190213,
                    0.049534752000909066,
                    0.050387244002195075,
                    0.05197231200145325,
                    0.05162442900109454,
                    0.056070921000355156,
                    0.047568563000822905,
                    0.05047629700129619,
                    0.05343033399913111,
                    0.04820377700161771,
                    0.05592725600217818,
                    0.05117443700146396,
                    0.05683792700074264,
                    0.049871952996909386,
                    0.05052141399937682,
                    0.051092513000185136,
                    0.0516481759987073,
                    0.05420683799820836,
                    0.0521872160024941
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-0.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-0.5]",
            "params": {
                "zoom": 4,
                "item_width": 0.5
            },
            "param": "4-0.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 1.1995517129980726,
                "max": 1.2396531550002692,
                "mean": 1.2173349196661245,
                "stddev": 0.020431746778374022,
                "rounds": 3,
                "median": 1.2127998910000315,
                "iqr": 0.030076081501647423,
                "q1": 1.2028637574985623,
                "q3": 1.2329398390002098,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 1.1995517129980726,
                "hd15iqr": 1.2396531550002692,
                "ops": 0.8214666184670588,
                "total": 3.6520047589983733,
                "data": [
                    1.2396531550002692,
                    1.1995517129980726,
                    1.2127998910000315
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-0.75]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-0.75]",
            "params": {
                "zoom": 4,
                "item_width": 0.75
            },
            "param": "4-0.75",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.5314996209999663,
                "max": 0.5415407899999991,
                "mean": 0.5360264716667492,
                "stddev": 0.0050928958379338005,
                "rounds": 3,
                "median": 0.5350390040002821,
                "iqr": 0.007530876750024618,
                "q1": 0.5323844667500452,
                "q3": 0.5399153435000699,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 0.5314996209999663,
                "hd15iqr": 0.5415407899999991,
                "ops": 1.8655795055989435,
                "total": 1.6080794150002475,
                "data": [
                    0.5350390040002821,
                    0.5314996209999663,
                    0.5415407899999991
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-1]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-1]",
            "params": {
                "zoom": 4,
                "item_width": 1
            },
            "param": "4-1",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.326569004002522,
                "max": 0.3346178480023809,
                "mean": 0.32932656225148094,
                "stddev": 0.003615016240426719,
                "rounds": 4,
                "median": 0.3280596985005104,
                "iqr": 0.004467878499781364,
                "q1": 0.32709262300159025,
                "q3": 0.3315605015013716,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 0.326569004002522,
                "hd15iqr": 0.3346178480023809,
                "ops": 3.036499677291072,
                "total": 1.3173062490059237,
                "data": [
                    0.326569004002522,
                    0.3285031550003623,
                    0.32761624200065853,
                    0.3346178480023809
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-1.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-1.5]",
            "params": {
                "zoom": 4,
                "item_width": 1.5
            },
            "param": "4-1.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.17086795599971083,
                "max": 0.18105750900213025,
                "mean": 0.17587526450127675,
                "stddev": 0.004035728323823642,
                "rounds": 6,
                "median": 0.17464539750108088,
                "iqr": 0.006878126998344669,
                "q1": 0.17357860000265646,
                "q3": 0.18045672700100113,
                "iqr_outliers": 0,
                "stddev_outliers": 3,
                "outliers": "3;0",
                "ld15iqr": 0.17086795599971083,
                "hd15iqr": 0.18105750900213025,
                "ops": 5.685847881085863,
                "total": 1.0552515870076604,
                "data": [
                    0.17497487199943862,
                    0.17431592300272314,
                    0.17086795599971083,
                    0.17357860000265646,
                    0.18105750900213025,
                    0.18045672700100113
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-2]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-2]",
            "params": {
                "zoom": 4,
                "item_width": 2
            },
            "param": "4-2",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.11330923400237225,
                "max": 0.14413199599948712,
                "mean": 0.1252486348890266,
                "stddev": 0.009915628744136859,
                "rounds": 9,
                "median": 0.1253533779999998,
                "iqr": 0.013842049500453868,
                "q1": 0.11569722474996524,
                "q3": 0.1295392742504191,
                "iqr_outliers": 0,
                "stddev_outliers": 3,
                "outliers": "3;0",
                "ld15iqr": 0.11330923400237225,
                "hd15iqr": 0.14413199599948712,
                "ops": 7.984118955755683,
                "total": 1.1272377140012395,
                "data": [
                    0.1253533779999998,
                    0.11330923400237225,
                    0.12463980100073968,
                    0.1159379529999569,
                    0.11497503999999026,
                    0.12647421499787015,
                    0.12787050000042655,
                    0.14413199599948712,
                    0.1345455970003968
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-3]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-3]",
            "params": {
                "zoom": 4,
                "item_width": 3
            },
            "param": "4-3",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.06794780299969716,
                "max": 0.07971649299724959,
                "mean": 0.07236937333267027,
                "stddev": 0.0032234028131627192,
                "rounds": 15,
                "median": 0.07156555899928208,
                "iqr": 0.004010758501863165,
                "q1": 0.0702488237475336,
                "q3": 0.07425958224939677,
                "iqr_outliers": 0,
                "stddev_outliers": 4,
                "outliers": "4;0",
                "ld15iqr": 0.06794780299969716,
                "hd15iqr": 0.07971649299724959,
                "ops": 13.817999990177643,
                "total": 1.085540599990054,
                "data": [
                    0.07195737400252256,
                    0.07060383200223441,
                    0.07430707499952405,
                    0.06810927799961064,
                    0.07010990799972205,
                    0.07129841300047701,
                    0.07156555899928208,
                    0.07971649299724959,
                    0.07411710399901494,
                    0.07689898899843683,
                    0.07484374299747287,
                    0.06794780299969716,
                    0.07022745199719793,
                    0.07031293899854063,
                    0.07352463799907127
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-4]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-4]",
            "params": {
                "zoom": 4,
                "item_width": 4
            },
            "param": "4-4",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.055022680997353746,
                "max": 0.07121412800188409,
                "mean": 0.0596297509411456,
                "stddev": 0.004634585881486992,
                "rounds": 17,
                "median": 0.05803015600031358,
                "iqr": 0.0026907579995167907,
                "q1": 0.05688350125001307,
                "q3": 0.05957425924952986,
                "iqr_outliers": 3,
                "stddev_outliers": 3,
                "outliers": "3;3",
                "ld15iqr": 0.055022680997353746,
                "hd15iqr": 0.06487147699954221,
                "ops": 16.77015221792553,
                "total": 1.0137057659994753,
                "data": [
                    0.05694494400086114,
                    0.05621355599942035,
                    0.06983209000100032,
                    0.07121412800188409,
                    0.06487147699954221,
                    0.059164040998439305,
                    0.060804914002801524,
                    0.056618432001414476,
                    0.05837447899830295,
                    0.055022680997353746,
                    0.057981475998531096,
                    0.05858107200037921,
                    0.0578116910000972,
                    0.05820825400223839,
                    0.05803015600031358,
                    0.05669917299746885,
                    0.05733320199942682
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-5]",
            "params": {
                "zoom": 4,
                "item_width": 5
            },
            "param": "4-5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.048144559001229936,
                "max": 0.05387930500000948,
                "mean": 0.05032130766700166,
                "stddev": 0.0013144622688698053,
                "rounds": 21,
                "median": 0.050033582003379706,
                "iqr": 0.0009133455005212454,
                "q1": 0.049734376998458174,
                "q3": 0.05064772249897942,
                "iqr_outliers": 3,
                "stddev_outliers": 3,
                "outliers": "3;3",
                "ld15iqr": 0.04908135299774585,
                "hd15iqr": 0.0535943450013292,
                "ops": 19.872297568605372,
                "total": 1.0567474610070349,
                "data": [
                    0.0535943450013292,
                    0.05037315099980333,
                    0.049767618998885155,
                    0.05091931800052407,
                    0.05014399900028366,
                    0.050104821002605604,
                    0.05055837699910626,
                    0.049749811998481164,
                    0.04908135299774585,
                    0.049688071998389205,
                    0.050033582003379706,
                    0.0509157589985989,
                    0.050990560001082486,
                    0.04938530599974911,
                    0.049980152001808165,
                    0.04927488500106847,
                    0.04977712100298959,
                    0.048144559001229936,
                    0.04999440000028699,
                    0.050390964999678545,
                    0.05387930500000948
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-6]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-6]",
            "params": {
                "zoom": 4,
                "item_width": 6
            },
            "param": "4-6",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.043895156999496976,
                "max": 0.04860524800096755,
                "mean": 0.046354956408487684,
                "stddev": 0.0013497296070651744,
                "rounds": 22,
                "median": 0.04642711300039082,
                "iqr": 0.0015482629969483241,
                "q1": 0.04566782300025807,
                "q3": 0.04721608599720639,
                "iqr_outliers": 0,
                "stddev_outliers": 8,
                "outliers": "8;0",
                "ld15iqr": 0.043895156999496976,
                "hd15iqr": 0.04860524800096755,
                "ops": 21.572666171613484,
                "total": 1.019809040986729,
                "data": [
                    0.04666873200039845,
                    0.04600739599845838,
                    0.045710566999332514,
                    0.04721608599720639,
                    0.043895156999496976,
                    0.04667348099974333,
                    0.04566782300025807,
                    0.04652031700243242,
                    0.04593021999971825,
                    0.04669129100147984,
                    0.04403644800186157,
                    0.04860524800096755,
                    0.04782636699746945,
                    0.04569038199770148,
                    0.04524751200005994,
                    0.04787148499963223,
                    0.04827398699853802,
                    0.046333908998349216,
                    0.04409462699914002,
                    0.04688363699824549,
                    0.04830604399830918,
                    0.04565832499793032
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-8]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-8]",
            "params": {
                "zoom": 4,
                "item_width": 8
            },
            "param": "4-8",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.03777335199993104,
                "max": 0.0432480769995891,
                "mean": 0.04046258422170434,
                "stddev": 0.0014892429420970946,
                "rounds": 27,
                "median": 0.04061341799751972,
                "iqr": 0.0017895870014399407,
                "q1": 0.03936346749924269,
                "q3": 0.04115305450068263,
                "iqr_outliers": 0,
                "stddev_outliers": 9,
                "outliers": "9;0",
                "ld15iqr": 0.03777335199993104,
                "hd15iqr": 0.0432480769995891,
                "ops": 24.714190139729013,
                "total": 1.092489773986017,
                "data": [
                    0.039341798998066224,
                    0.0414837219977926,
                    0.038832438996905694,
                    0.0399212099982833,
                    0.03942847300277208,
                    0.04115958400143427,
                    0.04072858699873905,
                    0.0432480769995891,
                    0.041842292001092574,
                    0.03887399599989294,
                    0.03982503799852566,
                    0.03982266300226911,
                    0.039465280999138486,
                    0.04093755499707186,
                    0.039434409998648334,
                    0.04061341799751972,
                    0.038854998998431256,
                    0.04075708299933467,
                    0.04294649800067418,
                    0.04074164800113067,
                    0.03777335199993104,
                    0.039088900997739984,
                    0.04110259200024302,
                    0.038892993001354625,
                    0.043079480001324555,
                    0.04113346599842771,
                    0.04316021799968439
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[4-10]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-10]",
            "params": {
                "zoom": 4,
                "item_width": 10
            },
            "param": "4-10",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.03276643600111129,
                "max": 0.03718326400121441,
                "mean": 0.03496493973090345,
                "stddev": 0.001112401201614798,
                "rounds": 26,
                "median": 0.03509476799990807,
                "iqr": 0.0016206899999815505,
                "q1": 0.03410217000055127,
                "q3": 0.03572286000053282,
                "iqr_outliers": 0,
                "stddev_outliers": 8,
                "outliers": "8;0",
                "ld15iqr": 0.03276643600111129,
                "hd15iqr": 0.03718326400121441,
                "ops": 28.600077897922386,
                "total": 0.9090884330034896,
                "data": [
                    0.03396681500089471,
                    0.03627852499994333,
                    0.035353603001567535,
                    0.03601612800048315,
                    0.03626427700146451,
                    0.03524199599996791,
                    0.03479556399906869,
                    0.034837120001611765,
                    0.03572286000053282,
                    0.033217616997717414,
                    0.03414016399983666,
                    0.03410217000055127,
                    0.03650292800011812,
                    0.03567655399820069,
                    0.03583802900175215,
                    0.03504727499966975,
                    0.03346695399886812,
                    0.03514226100014639,
                    0.03276643600111129,
                    0.03558394300125656,
                    0.03486442800203804,
                    0.03718326400121441,
                    0.03358331300114514,
                    0.03385520899973926,
                    0.03416866199768265,
                    0.0354723379969073
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-0.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-0.5]",
            "params": {
                "zoom": 5,
                "item_width": 0.5
            },
            "param": "5-0.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.3528902499965625,
                "max": 0.3613380259994301,
                "mean": 0.3563750256653293,
                "stddev": 0.00441362560369112,
                "rounds": 3,
                "median": 0.3548968009999953,
                "iqr": 0.00633583200215071,
                "q1": 0.3533918877474207,
                "q3": 0.3597277197495714,
                "iqr_outliers": 0,
                "stddev_outliers": 1,
                "outliers": "1;0",
                "ld15iqr": 0.3528902499965625,
                "hd15iqr": 0.3613380259994301,
                "ops": 2.8060327688032127,
                "total": 1.069125076995988,
                "data": [
                    0.3548968009999953,
                    0.3613380259994301,
                    0.3528902499965625
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-0.75]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-0.75]",
            "params": {
                "zoom": 5,
                "item_width": 0.75
            },
            "param": "5-0.75",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.1738603650010191,
                "max": 0.18968734400186804,
                "mean": 0.1816396906663916,
                "stddev": 0.006070635494990262,
                "rounds": 6,
                "median": 0.1798818664992723,
                "iqr": 0.00968734199705068,
                "q1": 0.17841967999993358,
                "q3": 0.18810702199698426,
                "iqr_outliers": 0,
                "stddev_outliers": 3,
                "outliers": "3;0",
                "ld15iqr": 0.1738603650010191,
                "hd15iqr": 0.18968734400186804,
                "ops": 5.50540466310664,
                "total": 1.0898381439983496,
                "data": [
                    0.1738603650010191,
                    0.17841967999993358,
                    0.18043218900129432,
                    0.17933154399725026,
                    0.18810702199698426,
                    0.18968734400186804
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-1]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-1]",
            "params": {
                "zoom": 5,
                "item_width": 1
            },
            "param": "5-1",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.11908579000009922,
                "max": 0.14131123699917225,
                "mean": 0.13000069355580812,
                "stddev": 0.009213577351100307,
                "rounds": 9,
                "median": 0.1281640450033592,
                "iqr": 0.019572380000681733,
                "q1": 0.12101755949879589,
                "q3": 0.14058993949947762,
                "iqr_outliers": 0,
                "stddev_outliers": 5,
                "outliers": "5;0",
                "ld15iqr": 0.11908579000009922,
                "hd15iqr": 0.14131123699917225,
                "ops": 7.69226665372142,
                "total": 1.1700062420022732,
                "data": [
                    0.12073260299803223,
                    0.12111254499905044,
                    0.11908579000009922,
                    0.1252064270011033,
                    0.14116875800027628,
                    0.1281640450033592,
                    0.13282783700196887,
                    0.14131123699917225,
                    0.1403969999992114
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-1.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-1.5]",
            "params": {
                "zoom": 5,
                "item_width": 1.5
            },
            "param": "5-1.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.07683741799701238,
                "max": 0.08334037099848501,
                "mean": 0.07977976357064367,
                "stddev": 0.001969583375656267,
                "rounds": 14,
                "median": 0.0792417389984621,
                "iqr": 0.003077533001487609,
                "q1": 0.0782598229998257,
                "q3": 0.08133735600131331,
                "iqr_outliers": 0,
                "stddev_outliers": 3,
                "outliers": "3;0",
                "ld15iqr": 0.07683741799701238,
                "hd15iqr": 0.08334037099848501,
                "ops": 12.534506938147496,
                "total": 1.1169166899890115,
                "data": [
                    0.07964304999768501,
                    0.07898171299893875,
                    0.0782598229998257,
                    0.08133735600131331,
                    0.0809538520006754,
                    0.07811615699756658,
                    0.08290818000023137,
                    0.08173985699977493,
                    0.07891759799895226,
                    0.0780294860014692,
                    0.07683741799701238,
                    0.07950176499798545,
                    0.07835006399909616,
                    0.08334037099848501
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-2]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-2]",
            "params": {
                "zoom": 5,
                "item_width": 2
            },
            "param": "5-2",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.05488625500220223,
                "max": 0.0652931129989156,
                "mean": 0.05818601472209492,
                "stddev": 0.0029684394659227147,
                "rounds": 18,
                "median": 0.057458582497929456,
                "iqr": 0.0033470590024080593,
                "q1": 0.05617568099842174,
                "q3": 0.0595227400008298,
                "iqr_outliers": 2,
                "stddev_outliers": 4,
                "outliers": "4;2",
                "ld15iqr": 0.05488625500220223,
                "hd15iqr": 0.06502834500133758,
                "ops": 17.18626038879186,
                "total": 1.0473482649977086,
                "data": [
                    0.05642501900001662,
                    0.0652931129989156,
                    0.05617568099842174,
                    0.05500854599813465,
                    0.05781774499700987,
                    0.05565800999829662,
                    0.05653662999975495,
                    0.05488625500220223,
                    0.05593465900165029,
                    0.05695694200039725,
                    0.05792698200093582,
                    0.0595227400008298,
                    0.05911192699932144,
                    0.05862750099913683,
                    0.059550049001700245,
                    0.06502834500133758,
                    0.05978870100079803,
                    0.057099419998849044
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-3]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-3]",
            "params": {
                "zoom": 5,
                "item_width": 3
            },
            "param": "5-3",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.04489852500046254,
                "max": 0.05440302599890856,
                "mean": 0.048053970475891786,
                "stddev": 0.002020601273945267,
                "rounds": 21,
                "median": 0.047797962000913685,
                "iqr": 0.0021989167489664396,
                "q1": 0.04697752375068376,
                "q3": 0.0491764404996502,
                "iqr_outliers": 1,
                "stddev_outliers": 5,
                "outliers": "5;1",
                "ld15iqr": 0.04489852500046254,
                "hd15iqr": 0.05440302599890856,
                "ops": 20.80993495639846,
                "total": 1.0091333799937274,
                "data": [
                    0.04763054699651548,
                    0.04489852500046254,
                    0.047797962000913685,
                    0.04580801299744053,
                    0.04957300499881967,
                    0.04843555300249136,
                    0.04801880300146877,
                    0.049190688998351106,
                    0.04728741300277761,
                    0.049315358002786525,
                    0.048169592999329325,
                    0.047464323997701285,
                    0.05080188200008706,
                    0.046753120001085335,
                    0.0470523250005499,
                    0.04726841699812212,
                    0.04648834699764848,
                    0.05440302599890856,
                    0.04917169100008323,
                    0.04577358000096865,
                    0.047831206997216213
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-4]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-4]",
            "params": {
                "zoom": 5,
                "item_width": 4
            },
            "param": "5-4",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.03521118299977388,
                "max": 0.042654497003240976,
                "mean": 0.038113435110938516,
                "stddev": 0.0017210758691116373,
                "rounds": 27,
                "median": 0.037680810997699155,
                "iqr": 0.0016856995016496512,
                "q1": 0.03702540874837723,
                "q3": 0.03871110825002688,
                "iqr_outliers": 2,
                "stddev_outliers": 8,
                "outliers": "8;2",
                "ld15iqr": 0.03521118299977388,
                "hd15iqr": 0.04135794299872941,
                "ops": 26.237467105477485,
                "total": 1.02906274799534,
                "data": [
                    0.03717857399897184,
                    0.04093288200238021,
                    0.037019471998064546,
                    0.039954528998350725,
                    0.037556142000539694,
                    0.04005070199855254,
                    0.03872921500078519,
                    0.042654497003240976,
                    0.038476314999570604,
                    0.03755851599999005,
                    0.03729255600046599,
                    0.03865678799775196,
                    0.037043218999315286,
                    0.03655166799944709,
                    0.03736498299986124,
                    0.03565524099758477,
                    0.03813792900109547,
                    0.03521118299977388,
                    0.03823172700140276,
                    0.03802275899943197,
                    0.03685324800244416,
                    0.03694704699955764,
                    0.037680810997699155,
                    0.04135794299872941,
                    0.03627146300277673,
                    0.03928250799799571,
                    0.03839083099956042
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-5]",
            "params": {
                "zoom": 5,
                "item_width": 5
            },
            "param": "5-5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.03793965599834337,
                "max": 0.04555513000013889,
                "mean": 0.04055096839983889,
                "stddev": 0.001934729870115932,
                "rounds": 30,
                "median": 0.04005605349993857,
                "iqr": 0.0014117259997874498,
                "q1": 0.03940837000118336,
                "q3": 0.04082009600097081,
                "iqr_outliers": 4,
                "stddev_outliers": 7,
                "outliers": "7;4",
                "ld15iqr": 0.03793965599834337,
                "hd15iqr": 0.04337045899956138,
                "ops": 24.66032352519534,
                "total": 1.2165290519951668,
                "data": [
                    0.03940837000118336,
                    0.03993316499690991,
                    0.040693049999390496,
                    0.04137338500004262,
                    0.040091078997647855,
                    0.04555513000013889,
                    0.04147193300013896,
                    0.03979306199835264,
                    0.039633960001083324,
                    0.04014094599915552,
                    0.03979187299773912,
                    0.03993672700016759,
                    0.040509015998395626,
                    0.04054226000152994,
                    0.04337045899956138,
                    0.03941786699942895,
                    0.040662180002982495,
                    0.038028702001611236,
                    0.03920414999811328,
                    0.04003408700009459,
                    0.045365158999629784,
                    0.03905455000131042,
                    0.040078019999782555,
                    0.038662733997625764,
                    0.04082009600097081,
                    0.042519153001194354,
                    0.04443430100218393,
                    0.03793965599834337,
                    0.03873634800038417,
                    0.039327634000073886
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-6]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-6]",
            "params": {
                "zoom": 5,
                "item_width": 6
            },
            "param": "5-6",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.032226272000116296,
                "max": 0.039702834001218434,
                "mean": 0.03612378748385386,
                "stddev": 0.0015639443296231721,
                "rounds": 31,
                "median": 0.03627503800089471,
                "iqr": 0.0017682202478681575,
                "q1": 0.03527353050230886,
                "q3": 0.037041750750177016,
                "iqr_outliers": 2,
                "stddev_outliers": 8,
                "outliers": "8;2",
                "ld15iqr": 0.03333166900119977,
                "hd15iqr": 0.039702834001218434,
                "ops": 27.682590050862384,
                "total": 1.1198374119994696,
                "data": [
                    0.03657423999902676,
                    0.03635696099809138,
                    0.03394788699733908,
                    0.03865205299734953,
                    0.035572141998272855,
                    0.03539641799943638,
                    0.03511977200105321,
                    0.037492039999051485,
                    0.03589865500180167,
                    0.03558995099956519,
                    0.035221881000325084,
                    0.03523375500299153,
                    0.03443706300095073,
                    0.03573005499856663,
                    0.03539285700026085,
                    0.037199960999714676,
                    0.03654574699976365,
                    0.032226272000116296,
                    0.03487518600013573,
                    0.03635221399963484,
                    0.0382186829992861,
                    0.03577517599842395,
                    0.038712609002686804,
                    0.03627503800089471,
                    0.03629640900180675,
                    0.03712872200048878,
                    0.03653862300052424,
                    0.03333166900119977,
                    0.03698030699888477,
                    0.037062232000607764,
                    0.039702834001218434
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-8]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-8]",
            "params": {
                "zoom": 5,
                "item_width": 8
            },
            "param": "5-8",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.030467855001916178,
                "max": 0.03646382800070569,
                "mean": 0.03345623115592389,
                "stddev": 0.0012971261642753505,
                "rounds": 32,
                "median": 0.033450998498665285,
                "iqr": 0.0016723429998819483,
                "q1": 0.03265430600004038,
                "q3": 0.03432664899992233,
                "iqr_outliers": 0,
                "stddev_outliers": 8,
                "outliers": "8;0",
                "ld15iqr": 0.030467855001916178,
                "hd15iqr": 0.03646382800070569,
                "ops": 29.889798266262165,
                "total": 1.0705993969895644,
                "data": [
                    0.03300872199906735,
                    0.033955015998799354,
                    0.03407256100035738,
                    0.03350977099762531,
                    0.03443825599970296,
                    0.033723488999385154,
                    0.033799476997955935,
                    0.03339222599970526,
                    0.03351808200022788,
                    0.032727325000450946,
                    0.03438245200231904,
                    0.03174541200132808,
                    0.03243880700028967,
                    0.03119449600126245,
                    0.03338629100107937,
                    0.03163974199924269,
                    0.030467855001916178,
                    0.03351452199785854,
                    0.03527769399806857,
                    0.03313814099965384,
                    0.03427084599752561,
                    0.03279144299813197,
                    0.03513284099972225,
                    0.03254091800044989,
                    0.03258128699962981,
                    0.03308114999890677,
                    0.03646382800070569,
                    0.03286386999752722,
                    0.034547491999546764,
                    0.03583811000135029,
                    0.032556353999098064,
                    0.034600921000674134
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[5-10]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-10]",
            "params": {
                "zoom": 5,
                "item_width": 10
            },
            "param": "5-10",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.03186058700157446,
                "max": 0.039468946000852156,
                "mean": 0.036132189964389126,
                "stddev": 0.0015354948988810695,
                "rounds": 28,
                "median": 0.0361070445014775,
                "iqr": 0.0010786809998535318,
                "q1": 0.035639239500596887,
                "q3": 0.03671792050045042,
                "iqr_outliers": 4,
                "stddev_outliers": 7,
                "outliers": "7;4",
                "ld15iqr": 0.03407731799961766,
                "hd15iqr": 0.03914836900003138,
                "ops": 27.676152510699513,
                "total": 1.0117013190028956,
                "data": [
                    0.03186058700157446,
                    0.03628336000110721,
                    0.03606133100038278,
                    0.03678203500021482,
                    0.034916751999844564,
                    0.03575975299827405,
                    0.03663480899922433,
                    0.036408030002348823,
                    0.03615038200223353,
                    0.03407731799961766,
                    0.03781619399887859,
                    0.03565883000192116,
                    0.039468946000852156,
                    0.03572532099860837,
                    0.03914836900003138,
                    0.03829468500043731,
                    0.03606370700072148,
                    0.03556978099732078,
                    0.03700169099829509,
                    0.0358013100012613,
                    0.03665380600068602,
                    0.036865149002551334,
                    0.03629761000047438,
                    0.03508416700060479,
                    0.03599721799764666,
                    0.036259615000744816,
                    0.03561964899927261,
                    0.033440913997765165
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-0.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-0.5]",
            "params": {
                "zoom": 6,
                "item_width": 0.5
            },
            "param": "6-0.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.1268487230008759,
                "max": 0.14295829899856471,
                "mean": 0.1350773039998785,
                "stddev": 0.005595496365896534,
                "rounds": 8,
                "median": 0.1347099775011884,
                "iqr": 0.009163152501059812,
                "q1": 0.13076628749877273,
                "q3": 0.13992943999983254,
                "iqr_outliers": 0,
                "stddev_outliers": 3,
                "outliers": "3;0",
                "ld15iqr": 0.1268487230008759,
                "hd15iqr": 0.14295829899856471,
                "ops": 7.403168188794318,
                "total": 1.080618431999028,
                "data": [
                    0.14295829899856471,
                    0.13436564999938128,
                    0.13881217000016477,
                    0.1410467099995003,
                    0.13178797499858774,
                    0.1297445999989577,
                    0.13505430500299553,
                    0.1268487230008759
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-0.75]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-0.75]",
            "params": {
                "zoom": 6,
                "item_width": 0.75
            },
            "param": "6-0.75",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.07463744200140354,
                "max": 0.08529722000093898,
                "mean": 0.07939257461503775,
                "stddev": 0.002691959172431208,
                "rounds": 13,
                "median": 0.0788595570011239,
                "iqr": 0.0035290212490508566,
                "q1": 0.07768084224881022,
                "q3": 0.08120986349786108,
                "iqr_outliers": 0,
                "stddev_outliers": 2,
                "outliers": "2;0",
                "ld15iqr": 0.07463744200140354,
                "hd15iqr": 0.08529722000093898,
                "ops": 12.595636365854672,
                "total": 1.0321034699954907,
                "data": [
                    0.07994239300023764,
                    0.07783370899778674,
                    0.0776900429991656,
                    0.0788595570011239,
                    0.07463744200140354,
                    0.08125438799834228,
                    0.0776532399977441,
                    0.08181836599760572,
                    0.08119502199770068,
                    0.07718187399950693,
                    0.08529722000093898,
                    0.0806061100010993,
                    0.07813410600283532
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-1]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-1]",
            "params": {
                "zoom": 6,
                "item_width": 1
            },
            "param": "6-1",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.05851480500132311,
                "max": 0.06430774700129405,
                "mean": 0.06168284427783672,
                "stddev": 0.0016228951986026318,
                "rounds": 18,
                "median": 0.06135784850084747,
                "iqr": 0.0027047200019296724,
                "q1": 0.060831270999187836,
                "q3": 0.06353599100111751,
                "iqr_outliers": 0,
                "stddev_outliers": 7,
                "outliers": "7;0",
                "ld15iqr": 0.05851480500132311,
                "hd15iqr": 0.06430774700129405,
                "ops": 16.211963175623378,
                "total": 1.110291197001061,
                "data": [
                    0.06118627600153559,
                    0.06430774700129405,
                    0.06387675199948717,
                    0.06353599100111751,
                    0.06052612900020904,
                    0.060831270999187836,
                    0.062220438001531875,
                    0.05851480500132311,
                    0.06128720299966517,
                    0.06124683300004108,
                    0.05954658799964818,
                    0.06385656800193829,
                    0.061428494002029765,
                    0.06006544800038682,
                    0.06371408899940434,
                    0.06163390099754906,
                    0.06156741099766805,
                    0.06094525299704401
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-1.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-1.5]",
            "params": {
                "zoom": 6,
                "item_width": 1.5
            },
            "param": "6-1.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.042510893999860855,
                "max": 0.049666887000057613,
                "mean": 0.04612569804472018,
                "stddev": 0.0016540591589389979,
                "rounds": 22,
                "median": 0.04573744499793975,
                "iqr": 0.0020493189986154903,
                "q1": 0.04529991500021424,
                "q3": 0.04734923399882973,
                "iqr_outliers": 0,
                "stddev_outliers": 8,
                "outliers": "8;0",
                "ld15iqr": 0.042510893999860855,
                "hd15iqr": 0.049666887000057613,
                "ops": 21.679888703916664,
                "total": 1.014765356983844,
                "data": [
                    0.04734923399882973,
                    0.04429187900313991,
                    0.042510893999860855,
                    0.04473474900078145,
                    0.04529991500021424,
                    0.04554212900256971,
                    0.04442604599898914,
                    0.045679858998482814,
                    0.047726801996759605,
                    0.04783722299907822,
                    0.04555756400077371,
                    0.04424794700025814,
                    0.048447506997035816,
                    0.04612629199982621,
                    0.04820410599859315,
                    0.046539479997591116,
                    0.04555162799806567,
                    0.04567985799803864,
                    0.046430245998635655,
                    0.049666887000057613,
                    0.04712008099886589,
                    0.04579503099739668
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-2]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-2]",
            "params": {
                "zoom": 6,
                "item_width": 2
            },
            "param": "6-2",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.042301935001887614,
                "max": 0.0495885320015077,
                "mean": 0.044751182250062506,
                "stddev": 0.0019226710688970588,
                "rounds": 24,
                "median": 0.04421233649918577,
                "iqr": 0.0012057274998369394,
                "q1": 0.04363173349884164,
                "q3": 0.04483746099867858,
                "iqr_outliers": 4,
                "stddev_outliers": 6,
                "outliers": "6;4",
                "ld15iqr": 0.042301935001887614,
                "hd15iqr": 0.04736823900020681,
                "ops": 22.345778362058876,
                "total": 1.0740283740015002,
                "data": [
                    0.04329690899976413,
                    0.04402592499900493,
                    0.04481430699888733,
                    0.0441862139996374,
                    0.043782525001006434,
                    0.044828555997810327,
                    0.04367328999796882,
                    0.044974595999519806,
                    0.043363400000089314,
                    0.04945198999848799,
                    0.04400217899819836,
                    0.04736823900020681,
                    0.0480746960020042,
                    0.0495885320015077,
                    0.04359017699971446,
                    0.04392381500292686,
                    0.04484636599954683,
                    0.0427697380000609,
                    0.042301935001887614,
                    0.044630275002418784,
                    0.044303760998445796,
                    0.04423845899873413,
                    0.04352725300122984,
                    0.04446523700244143
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-3]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-3]",
            "params": {
                "zoom": 6,
                "item_width": 3
            },
            "param": "6-3",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.03260270100145135,
                "max": 0.04594939700109535,
                "mean": 0.03932017700019599,
                "stddev": 0.0033886416698431653,
                "rounds": 27,
                "median": 0.039124662998801796,
                "iqr": 0.0042791097512235865,
                "q1": 0.037114231248779106,
                "q3": 0.04139334100000269,
                "iqr_outliers": 0,
                "stddev_outliers": 8,
                "outliers": "8;0",
                "ld15iqr": 0.03260270100145135,
                "hd15iqr": 0.04594939700109535,
                "ops": 25.432235465140852,
                "total": 1.0616447790052916,
                "data": [
                    0.03918521699961275,
                    0.039124662998801796,
                    0.04085459300040384,
                    0.03933006999795907,
                    0.038238919998548226,
                    0.04558013800124172,
                    0.045501774999138433,
                    0.0415183059994888,
                    0.03773312100020121,
                    0.04012320200126851,
                    0.03787322599964682,
                    0.04200154600039241,
                    0.04346076600268134,
                    0.04594939700109535,
                    0.0377901150022808,
                    0.042507349000516115,
                    0.04101844600154436,
                    0.040246685999591136,
                    0.035464149001199985,
                    0.037032602998806396,
                    0.037015980000433046,
                    0.03260270100145135,
                    0.037359115998697234,
                    0.034945289000461344,
                    0.03660397899875534,
                    0.03765594699871144,
                    0.034927479002362816
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-4]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-4]",
            "params": {
                "zoom": 6,
                "item_width": 4
            },
            "param": "6-4",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.036126680999586824,
                "max": 0.04487012900062837,
                "mean": 0.03896573932161118,
                "stddev": 0.002392502885028669,
                "rounds": 28,
                "median": 0.03843424250044336,
                "iqr": 0.0034972590001416393,
                "q1": 0.037080099999002414,
                "q3": 0.04057735899914405,
                "iqr_outliers": 0,
                "stddev_outliers": 8,
                "outliers": "8;0",
                "ld15iqr": 0.036126680999586824,
                "hd15iqr": 0.04487012900062837,
                "ops": 25.663570547098022,
                "total": 1.091040701005113,
                "data": [
                    0.04196949600009248,
                    0.038218742000026396,
                    0.03735437100112904,
                    0.04305352200026391,
                    0.04069430999879842,
                    0.041581241002859315,
                    0.03641519799930393,
                    0.036954242998035625,
                    0.04046040799948969,
                    0.03879103300278075,
                    0.03729975600072066,
                    0.03675952399862581,
                    0.04079879699929734,
                    0.04363412499878905,
                    0.039502240000729216,
                    0.036126680999586824,
                    0.03678683200269006,
                    0.03678920699894661,
                    0.038649743000860326,
                    0.0372059569999692,
                    0.04487012900062837,
                    0.039962922000995604,
                    0.037445797002874315,
                    0.03743511100037722,
                    0.036178923000989016,
                    0.03801689899773919,
                    0.03899881599863875,
                    0.039086677999875974
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-5]",
            "params": {
                "zoom": 6,
                "item_width": 5
            },
            "param": "6-5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.03487881000182824,
                "max": 0.04174747499928344,
                "mean": 0.037700271428808003,
                "stddev": 0.002003219081389196,
                "rounds": 28,
                "median": 0.03710860299906926,
                "iqr": 0.0032580150000285357,
                "q1": 0.03605426000103762,
                "q3": 0.039312275001066155,
                "iqr_outliers": 0,
                "stddev_outliers": 10,
                "outliers": "10;0",
                "ld15iqr": 0.03487881000182824,
                "hd15iqr": 0.04174747499928344,
                "ops": 26.52500796680916,
                "total": 1.0556076000066241,
                "data": [
                    0.036404519003554014,
                    0.03566244100147742,
                    0.04006503599885036,
                    0.041011334000359057,
                    0.037138285999390064,
                    0.035888034999516094,
                    0.03707891999874846,
                    0.03828286599673447,
                    0.035546086000977084,
                    0.035413106001215056,
                    0.036980372002290096,
                    0.03811782800039509,
                    0.03661348899913719,
                    0.03766901900235098,
                    0.03919829200094682,
                    0.03589159600232961,
                    0.03487881000182824,
                    0.03893351800070377,
                    0.03942625800118549,
                    0.04164892799963127,
                    0.04174747499928344,
                    0.034936987998662516,
                    0.036812959999224404,
                    0.039606730999366846,
                    0.03621692399974563,
                    0.03673459600031492,
                    0.03782693399989512,
                    0.03987625299851061
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-6]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-6]",
            "params": {
                "zoom": 6,
                "item_width": 6
            },
            "param": "6-6",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.030040474000998074,
                "max": 0.04595891800272511,
                "mean": 0.03633510730008614,
                "stddev": 0.0043045462862126484,
                "rounds": 30,
                "median": 0.036877674001516425,
                "iqr": 0.007704540999839082,
                "q1": 0.032137285998032894,
                "q3": 0.039841826997871976,
                "iqr_outliers": 0,
                "stddev_outliers": 10,
                "outliers": "10;0",
                "ld15iqr": 0.030040474000998074,
                "hd15iqr": 0.04595891800272511,
                "ops": 27.521592044331992,
                "total": 1.0900532190025842,
                "data": [
                    0.03704330600157846,
                    0.04039037099937559,
                    0.04017309099799604,
                    0.03581323899925337,
                    0.039841826997871976,
                    0.04328981499929796,
                    0.037152539000089746,
                    0.041258303997892654,
                    0.039796708999347175,
                    0.037076551001518965,
                    0.035965216000477085,
                    0.04216067000015755,
                    0.037044493001303636,
                    0.03418779300045571,
                    0.04595891800272511,
                    0.040525724998587975,
                    0.03705755299961311,
                    0.03956755600302131,
                    0.03671204200145439,
                    0.03355851100059226,
                    0.03365587200096343,
                    0.03159586599940667,
                    0.031034261999593582,
                    0.03230351200181758,
                    0.032137285998032894,
                    0.030491656998492545,
                    0.03206011000293074,
                    0.030754054998396896,
                    0.03140589599934174,
                    0.030040474000998074
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-8]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-8]",
            "params": {
                "zoom": 6,
                "item_width": 8
            },
            "param": "6-8",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.029466998999851057,
                "max": 0.035118658997816965,
                "mean": 0.0317732569141039,
                "stddev": 0.0011116560823296769,
                "rounds": 35,
                "median": 0.03184639699975378,
                "iqr": 0.0011015400014002807,
                "q1": 0.03125985899987427,
                "q3": 0.03236139900127455,
                "iqr_outliers": 2,
                "stddev_outliers": 9,
                "outliers": "9;2",
                "ld15iqr": 0.02967003300000215,
                "hd15iqr": 0.035118658997816965,
                "ops": 31.473008974289563,
                "total": 1.1120639919936366,
                "data": [
                    0.03141539699936402,
                    0.03188201500233845,
                    0.032318950001354096,
                    0.03188201599914464,
                    0.03234269700260484,
                    0.03293398499954492,
                    0.030158020999806467,
                    0.032220401997619774,
                    0.03297316599855549,
                    0.03193544500027201,
                    0.03320944299775874,
                    0.029466998999851057,
                    0.03263121700001648,
                    0.03162436600177898,
                    0.029878999997890787,
                    0.03160299400042277,
                    0.03261221899811062,
                    0.035118658997816965,
                    0.03143676900072023,
                    0.031933069996739505,
                    0.030959464998886688,
                    0.030906036001397297,
                    0.033446908000769326,
                    0.030955902999266982,
                    0.03253385599964531,
                    0.03125273499972536,
                    0.031281231000320986,
                    0.03155075399990892,
                    0.03188320400295197,
                    0.031553127999359276,
                    0.031422522999491775,
                    0.03236763300083112,
                    0.02967003300000215,
                    0.03184639699975378,
                    0.03085735599961481
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[6-10]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-10]",
            "params": {
                "zoom": 6,
                "item_width": 10
            },
            "param": "6-10",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.026975998996931594,
                "max": 0.04209300799993798,
                "mean": 0.03214526745681984,
                "stddev": 0.0029009541935060648,
                "rounds": 35,
                "median": 0.032535049998841714,
                "iqr": 0.003922621500350942,
                "q1": 0.029960930250126694,
                "q3": 0.033883551750477636,
                "iqr_outliers": 1,
                "stddev_outliers": 8,
                "outliers": "8;1",
                "ld15iqr": 0.026975998996931594,
                "hd15iqr": 0.04209300799993798,
                "ops": 31.10877834017969,
                "total": 1.1250843609886942,
                "data": [
                    0.029685470999538666,
                    0.03109126299750642,
                    0.028255932997126365,
                    0.026975998996931594,
                    0.029716340999584645,
                    0.02902888099924894,
                    0.030137841000396293,
                    0.030155651998938993,
                    0.029178483000578126,
                    0.03001792199938791,
                    0.029941933000372956,
                    0.029191544999775942,
                    0.028652499000600073,
                    0.030491664001601748,
                    0.030851424002321437,
                    0.03384704099880764,
                    0.03787088199896971,
                    0.032096925999212544,
                    0.034644923001906136,
                    0.032717895999667235,
                    0.03391234399896348,
                    0.03392421700118575,
                    0.033438600999943446,
                    0.0338957220010343,
                    0.03235932600000524,
                    0.03323913299755077,
                    0.03395390199875692,
                    0.034150997998949606,
                    0.0335490249999566,
                    0.033031350998498965,
                    0.034173557000030996,
                    0.04209300799993798,
                    0.032535049998841714,
                    0.03348016000018106,
                    0.032797448002384044
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[7-0.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-0.5]",
            "params": {
                "zoom": 7,
                "item_width": 0.5
            },
            "param": "7-0.5",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.05863600000157021,
                "max": 0.06823670299854712,
                "mean": 0.06251938735273571,
                "stddev": 0.0022581559398568876,
                "rounds": 17,
                "median": 0.06236657000044943,
                "iqr": 0.002586880998023844,
                "q1": 0.06106378149979719,
                "q3": 0.06365066249782103,
                "iqr_outliers": 1,
                "stddev_outliers": 4,
                "outliers": "4;1",
                "ld15iqr": 0.05863600000157021,
                "hd15iqr": 0.06823670299854712,
                "ops": 15.995038376783489,
                "total": 1.062829584996507,
                "data": [
                    0.06236657000044943,
                    0.06587986099839327,
                    0.0637236809998285,
                    0.06111394300023676,
                    0.06390177900175331,
                    0.061628056999325054,
                    0.06823670299854712,
                    0.06362632299715187,
                    0.062382007999985944,
                    0.06094534600197221,
                    0.06093109799985541,
                    0.05984113399972557,
                    0.0634387259997311,
                    0.06276551399787422,
                    0.06230958200103487,
                    0.05863600000157021,
                    0.06110325999907218
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[7-0.75]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-0.75]",
            "params": {
                "zoom": 7,
                "item_width": 0.75
            },
            "param": "7-0.75",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.04354155399778392,
                "max": 0.048738473997218534,
                "mean": 0.045375971043066114,
                "stddev": 0.0013899984103265528,
                "rounds": 23,
                "median": 0.04513969400068163,
                "iqr": 0.0020098417462577345,
                "q1": 0.04439405400171381,
                "q3": 0.046403895747971546,
                "iqr_outliers": 0,
                "stddev_outliers": 8,
                "outliers": "8;0",
                "ld15iqr": 0.04354155399778392,
                "hd15iqr": 0.048738473997218534,
                "ops": 22.038095869086856,
                "total": 1.0436473339905206,
                "data": [
                    0.044486663999123266,
                    0.04644456099777017,
                    0.04354155399778392,
                    0.046033746999455616,
                    0.04451278499982436,
                    0.04513969400068163,
                    0.04362229300022591,
                    0.048738473997218534,
                    0.04672833400036325,
                    0.04391912500068429,
                    0.04572267000185093,
                    0.04478943299909588,
                    0.044901042001583846,
                    0.044947346999833826,
                    0.04373271399890655,
                    0.04566924100072356,
                    0.046489682001265464,
                    0.04436318400257733,
                    0.04370896799809998,
                    0.04515987799823051,
                    0.04768887899990659,
                    0.04702516499673948,
                    0.04628189999857568
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[7-1]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-1]",
            "params": {
                "zoom": 7,
                "item_width": 1
            },
            "param": "7-1",
            "extra_info": {},
            "options": {
                "disable_gc": false,
                "timer": "perf_counter",
                "min_rounds": 3,
                "max_time": 1.0,
                "min_time": 5e-06,
                "warmup": 2
            },
            "stats": {
                "min": 0.038548863001778955,
                "max": 0.044610154000110924,
                "mean": 0.04028780892568412,
                "stddev": 0.0012854161512075718,
                "rounds": 27,
                "median": 0.04029422899839119,
                "iqr": 0.0013024955014770967,
                "q1": 0.039389784499689995,
                "q3": 0.04069228000116709,
                "iqr_outliers": 1,
                "stddev_outliers": 6,
                "outliers": "6;1",
                "ld15iqr": 0.038548863001778955,
                "hd15iqr": 0.044610154000110924,
                "ops": 24.821404456236987,
                "total": 1.0877708409934712,
                "data": [
                    0.03955571199912811,
                    0.04021467699931236,
                    0.03939067399915075,
                    0.0399344689976715,
                    0.03902379099963582,
                    0.0392315739991318,
                    0.03859041900068405,
                    0.04195054699812317,
                    0.040376155000558356,
                    0.042304368998884456,
                    0.04080359200088424,
                    0.039497534999100026,
                    0.04029422899839119,
                    0.03935624400037341,
                    0.04052694500205689,
                    0.039895288999105105,
                    0.038548863001778955,
                    0.04146493200096302,
                    0.04038209099962842,
                    0.03889556200010702,
                    0.041216779998649145,
                    0.0405756250002014,
                    0.044610154000110924,
                    0.04053881900108536,
                    0.04073116500148899,
                    0.03938948799986974,
                    0.040471140997397015
                ],
                "iterations": 1
            }
        },
        {
            "group": "xyzsearch",
            "name": "test1[7-1.5]",
            "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-1.5]",
            "params": {
                "zoom": 7,
                "item_width": 1.5
            },
            "p
Download .txt
gitextract_odjuxhd0/

├── .devcontainer/
│   └── devcontainer.json
├── .dockerignore
├── .editorconfig
├── .github/
│   ├── copilot-instructions.md
│   ├── dependabot.yml
│   ├── instructions/
│   │   ├── migrations.instructions.md
│   │   ├── pypgstac.instructions.md
│   │   ├── scripts.instructions.md
│   │   └── sql-source.instructions.md
│   ├── prompts/
│   │   ├── add-sql-function.prompt.md
│   │   ├── debug-loader.prompt.md
│   │   └── stage-version.prompt.md
│   └── workflows/
│       ├── continuous-integration.yml
│       ├── deploy_mkdocs.yml
│       └── release.yml
├── .gitignore
├── .pre-commit-config.yaml
├── AGENTS.md
├── CHANGELOG.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── docker/
│   ├── pgstac/
│   │   ├── Dockerfile
│   │   └── dbinit/
│   │       └── pgstac.sh
│   └── pypgstac/
│       └── Dockerfile
├── docker-compose.yml
├── docs/
│   ├── mkdocs.yml
│   └── src/
│       ├── benchmark.json
│       ├── item_size_analysis.ipynb
│       ├── pgstac.md
│       └── pypgstac.md
├── scripts/
│   ├── cibuild
│   ├── cipublish
│   ├── console
│   ├── container-scripts/
│   │   ├── format
│   │   ├── initpgstac
│   │   ├── loadsampledata
│   │   ├── makemigration
│   │   ├── pgstac_restore
│   │   ├── resetpgstac
│   │   ├── stageversion
│   │   └── test
│   ├── format
│   ├── makemigration
│   ├── migrate
│   ├── pgstacenv
│   ├── runinpypgstac
│   ├── server
│   ├── setup
│   ├── stageversion
│   ├── test
│   └── update
└── src/
    ├── pgstac/
    │   ├── migrations/
    │   │   ├── pgstac.0.1.9-0.2.3.sql
    │   │   ├── pgstac.0.1.9.sql
    │   │   ├── pgstac.0.2.3-0.2.4.sql
    │   │   ├── pgstac.0.2.3.sql
    │   │   ├── pgstac.0.2.4-0.2.5.sql
    │   │   ├── pgstac.0.2.4-0.2.7.sql
    │   │   ├── pgstac.0.2.4.sql
    │   │   ├── pgstac.0.2.5-0.2.7.sql
    │   │   ├── pgstac.0.2.5.sql
    │   │   ├── pgstac.0.2.7-0.2.8.sql
    │   │   ├── pgstac.0.2.7.sql
    │   │   ├── pgstac.0.2.8-0.2.9.sql
    │   │   ├── pgstac.0.2.8.sql
    │   │   ├── pgstac.0.2.9-0.3.0.sql
    │   │   ├── pgstac.0.2.9.sql
    │   │   ├── pgstac.0.3.0-0.3.1.sql
    │   │   ├── pgstac.0.3.0.sql
    │   │   ├── pgstac.0.3.1-0.3.2.sql
    │   │   ├── pgstac.0.3.1.sql
    │   │   ├── pgstac.0.3.2-0.3.3.sql
    │   │   ├── pgstac.0.3.2.sql
    │   │   ├── pgstac.0.3.3-0.3.4.sql
    │   │   ├── pgstac.0.3.3.sql
    │   │   ├── pgstac.0.3.4-0.3.5.sql
    │   │   ├── pgstac.0.3.4.sql
    │   │   ├── pgstac.0.3.5-0.3.6.sql
    │   │   ├── pgstac.0.3.5.sql
    │   │   ├── pgstac.0.3.6-0.4.0.sql
    │   │   ├── pgstac.0.3.6.sql
    │   │   ├── pgstac.0.4.0-0.4.1.sql
    │   │   ├── pgstac.0.4.0.sql
    │   │   ├── pgstac.0.4.1-0.4.2.sql
    │   │   ├── pgstac.0.4.1.sql
    │   │   ├── pgstac.0.4.2-0.4.3.sql
    │   │   ├── pgstac.0.4.2.sql
    │   │   ├── pgstac.0.4.3-0.4.4.sql
    │   │   ├── pgstac.0.4.3.sql
    │   │   ├── pgstac.0.4.4-0.4.5.sql
    │   │   ├── pgstac.0.4.4.sql
    │   │   ├── pgstac.0.4.5-0.5.0.sql
    │   │   ├── pgstac.0.4.5.sql
    │   │   ├── pgstac.0.5.0-0.5.1.sql
    │   │   ├── pgstac.0.5.0.sql
    │   │   ├── pgstac.0.5.1-0.6.0.sql
    │   │   ├── pgstac.0.5.1.sql
    │   │   ├── pgstac.0.6.0-0.6.1.sql
    │   │   ├── pgstac.0.6.0.sql
    │   │   ├── pgstac.0.6.1-0.6.2.sql
    │   │   ├── pgstac.0.6.1.sql
    │   │   ├── pgstac.0.6.10-0.6.11.sql
    │   │   ├── pgstac.0.6.10.sql
    │   │   ├── pgstac.0.6.11-0.6.12.sql
    │   │   ├── pgstac.0.6.11.sql
    │   │   ├── pgstac.0.6.12-0.6.13.sql
    │   │   ├── pgstac.0.6.12.sql
    │   │   ├── pgstac.0.6.13-0.7.0.sql
    │   │   ├── pgstac.0.6.13-0.7.3.sql
    │   │   ├── pgstac.0.6.13.sql
    │   │   ├── pgstac.0.6.2-0.6.3.sql
    │   │   ├── pgstac.0.6.2.sql
    │   │   ├── pgstac.0.6.3-0.6.4.sql
    │   │   ├── pgstac.0.6.3.sql
    │   │   ├── pgstac.0.6.4-0.6.5.sql
    │   │   ├── pgstac.0.6.4.sql
    │   │   ├── pgstac.0.6.5-0.6.6.sql
    │   │   ├── pgstac.0.6.5.sql
    │   │   ├── pgstac.0.6.6-0.6.7.sql
    │   │   ├── pgstac.0.6.6.sql
    │   │   ├── pgstac.0.6.7-0.6.8.sql
    │   │   ├── pgstac.0.6.7.sql
    │   │   ├── pgstac.0.6.8-0.6.9.sql
    │   │   ├── pgstac.0.6.8.sql
    │   │   ├── pgstac.0.6.9-0.6.10.sql
    │   │   ├── pgstac.0.6.9.sql
    │   │   ├── pgstac.0.7.0-0.7.1.sql
    │   │   ├── pgstac.0.7.0.sql
    │   │   ├── pgstac.0.7.1-0.7.2.sql
    │   │   ├── pgstac.0.7.1.sql
    │   │   ├── pgstac.0.7.10-0.8.0.sql
    │   │   ├── pgstac.0.7.10.sql
    │   │   ├── pgstac.0.7.2-0.7.3.sql
    │   │   ├── pgstac.0.7.2.sql
    │   │   ├── pgstac.0.7.3-0.7.4.sql
    │   │   ├── pgstac.0.7.3.sql
    │   │   ├── pgstac.0.7.4-0.7.5.sql
    │   │   ├── pgstac.0.7.4.sql
    │   │   ├── pgstac.0.7.5-0.7.6.sql
    │   │   ├── pgstac.0.7.5.sql
    │   │   ├── pgstac.0.7.6-0.7.7.sql
    │   │   ├── pgstac.0.7.6.sql
    │   │   ├── pgstac.0.7.7-0.7.8.sql
    │   │   ├── pgstac.0.7.7.sql
    │   │   ├── pgstac.0.7.8-0.7.9.sql
    │   │   ├── pgstac.0.7.8.sql
    │   │   ├── pgstac.0.7.9-0.7.10.sql
    │   │   ├── pgstac.0.7.9.sql
    │   │   ├── pgstac.0.8.0-0.8.1.sql
    │   │   ├── pgstac.0.8.0.sql
    │   │   ├── pgstac.0.8.1-0.8.2.sql
    │   │   ├── pgstac.0.8.1.sql
    │   │   ├── pgstac.0.8.2-0.8.3.sql
    │   │   ├── pgstac.0.8.2.sql
    │   │   ├── pgstac.0.8.3-0.8.4.sql
    │   │   ├── pgstac.0.8.3.sql
    │   │   ├── pgstac.0.8.4-0.8.5.sql
    │   │   ├── pgstac.0.8.4.sql
    │   │   ├── pgstac.0.8.5-0.9.0.sql
    │   │   ├── pgstac.0.8.5.sql
    │   │   ├── pgstac.0.8.6-0.9.0.sql
    │   │   ├── pgstac.0.8.6-0.9.10.sql
    │   │   ├── pgstac.0.8.6.sql
    │   │   ├── pgstac.0.9.0-0.9.1.sql
    │   │   ├── pgstac.0.9.0.sql
    │   │   ├── pgstac.0.9.1-0.9.2.sql
    │   │   ├── pgstac.0.9.1.sql
    │   │   ├── pgstac.0.9.10-0.9.11.sql
    │   │   ├── pgstac.0.9.10.sql
    │   │   ├── pgstac.0.9.11-unreleased.sql
    │   │   ├── pgstac.0.9.11.sql
    │   │   ├── pgstac.0.9.2-0.9.3.sql
    │   │   ├── pgstac.0.9.2.sql
    │   │   ├── pgstac.0.9.3-0.9.4.sql
    │   │   ├── pgstac.0.9.3.sql
    │   │   ├── pgstac.0.9.4-0.9.5.sql
    │   │   ├── pgstac.0.9.4.sql
    │   │   ├── pgstac.0.9.5-0.9.6.sql
    │   │   ├── pgstac.0.9.5.sql
    │   │   ├── pgstac.0.9.6-0.9.7.sql
    │   │   ├── pgstac.0.9.6.sql
    │   │   ├── pgstac.0.9.7-0.9.8.sql
    │   │   ├── pgstac.0.9.7.sql
    │   │   ├── pgstac.0.9.8-0.9.9.sql
    │   │   ├── pgstac.0.9.8.sql
    │   │   ├── pgstac.0.9.9-0.9.10.sql
    │   │   ├── pgstac.0.9.9.sql
    │   │   └── pgstac.unreleased.sql
    │   ├── pgstac.sql
    │   ├── sql/
    │   │   ├── 000_idempotent_pre.sql
    │   │   ├── 001_core.sql
    │   │   ├── 001a_jsonutils.sql
    │   │   ├── 001s_stacutils.sql
    │   │   ├── 002_collections.sql
    │   │   ├── 002a_queryables.sql
    │   │   ├── 002b_cql.sql
    │   │   ├── 003a_items.sql
    │   │   ├── 003b_partitions.sql
    │   │   ├── 004_search.sql
    │   │   ├── 004a_collectionsearch.sql
    │   │   ├── 005_tileutils.sql
    │   │   ├── 006_tilesearch.sql
    │   │   ├── 997_maintenance.sql
    │   │   ├── 998_idempotent_post.sql
    │   │   └── 999_version.sql
    │   └── tests/
    │       ├── basic/
    │       │   ├── collection_searches.sql
    │       │   ├── collection_searches.sql.out
    │       │   ├── cql2_searches.sql
    │       │   ├── cql2_searches.sql.out
    │       │   ├── cql_searches.sql
    │       │   ├── cql_searches.sql.out
    │       │   ├── crud_functions.sql
    │       │   ├── crud_functions.sql.out
    │       │   ├── free_text.sql
    │       │   ├── free_text.sql.out
    │       │   ├── partitions.sql
    │       │   ├── partitions.sql.out
    │       │   ├── search_path.sql
    │       │   ├── search_path.sql.out
    │       │   ├── xyz_searches.sql
    │       │   └── xyz_searches.sql.out
    │       ├── pgtap/
    │       │   ├── 001_core.sql
    │       │   ├── 001a_jsonutils.sql
    │       │   ├── 001b_cursorutils.sql
    │       │   ├── 001s_stacutils.sql
    │       │   ├── 002_collections.sql
    │       │   ├── 002a_queryables.sql
    │       │   ├── 003_items.sql
    │       │   ├── 004_search.sql
    │       │   ├── 004a_collectionsearch.sql
    │       │   ├── 005_tileutils.sql
    │       │   ├── 006_tilesearch.sql
    │       │   ├── 9999_readonly.sql
    │       │   └── 999_version.sql
    │       ├── pgtap.sql
    │       └── testdata/
    │           ├── collections.json
    │           ├── collections.ndjson
    │           ├── items.ndjson
    │           ├── items.pgcopy
    │           ├── items_duplicate_ids.ndjson
    │           ├── items_for_delsert.ndjson
    │           └── items_private.ndjson
    └── pypgstac/
        ├── README.md
        ├── examples/
        │   ├── load_queryables_example.py
        │   └── sample_queryables.json
        ├── pyproject.toml
        ├── src/
        │   └── pypgstac/
        │       ├── __init__.py
        │       ├── db.py
        │       ├── hydration.py
        │       ├── load.py
        │       ├── migrate.py
        │       ├── py.typed
        │       ├── pypgstac.py
        │       └── version.py
        └── tests/
            ├── __init__.py
            ├── conftest.py
            ├── data-files/
            │   ├── hydration/
            │   │   ├── collections/
            │   │   │   ├── chloris-biomass.json
            │   │   │   ├── landsat-c2-l1.json
            │   │   │   └── sentinel-1-grd.json
            │   │   ├── dehydrated-items/
            │   │   │   └── landsat-c2-l1/
            │   │   │       └── LM04_L1GS_001001_19830527_02_T2.json
            │   │   └── raw-items/
            │   │       ├── landsat-c2-l1/
            │   │       │   └── LM04_L1GS_001001_19830527_02_T2.json
            │   │       └── sentinel-1-grd/
            │   │           └── S1A_IW_GRDH_1SDV_20220428T034417_20220428T034442_042968_05213C.json
            │   ├── load/
            │   │   └── dehydrated.txt
            │   └── queryables/
            │       └── test_queryables.json
            ├── hydration/
            │   ├── __init__.py
            │   ├── test_base_item.py
            │   ├── test_dehydrate.py
            │   ├── test_dehydrate_pg.py
            │   ├── test_hydrate.py
            │   └── test_hydrate_pg.py
            ├── test_benchmark.py
            ├── test_load.py
            └── test_queryables.py
Download .txt
Showing preview only (842K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (8072 symbols across 161 files)

FILE: src/pgstac/migrations/pgstac.0.1.9.sql
  type migrations (line 9) | CREATE TABLE migrations (
  function textarr (line 15) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function array_idents (line 24) | CREATE OR REPLACE FUNCTION array_idents(_js jsonb)
  function stac_geom (line 31) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_datetime (line 49) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function jsonb_paths (line 53) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 80) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 103) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 109) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 116) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 124) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function empty_arr (line 142) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function filter_jsonb (line 151) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function properties_idx (line 186) | CREATE OR REPLACE FUNCTION properties_idx(_in jsonb) RETURNS jsonb AS $$
  type collections (line 196) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 201) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 207) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 215) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 224) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 233) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 239) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 266) | CREATE TABLE IF NOT EXISTS items (
  type items_template (line 279) | CREATE TABLE items_template (
  function make_partitions (line 313) | CREATE OR REPLACE FUNCTION make_partitions(st timestamptz, et timestampt...
  function get_partition (line 326) | CREATE OR REPLACE FUNCTION get_partition(timestamptz) RETURNS text AS $$
  type items (line 330) | CREATE INDEX "datetime_id_idx" ON items (datetime, id)
  type items (line 331) | CREATE INDEX "properties_idx" ON items USING GIN (properties)
  type items (line 332) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 333) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function get_item (line 394) | CREATE OR REPLACE FUNCTION get_item(_id text) RETURNS jsonb AS $$
  function delete_item (line 398) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 406) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 412) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 420) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function analyze_empty_partitions (line 441) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function backfill_partitions (line 508) | CREATE OR REPLACE FUNCTION backfill_partitions()
  function collection_temporal_extent (line 572) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 578) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type items_partitions (line 600) | CREATE VIEW items_partitions AS
  function items_by_partition (line 621) | CREATE OR REPLACE FUNCTION items_by_partition(
  function split_stac_path (line 689) | CREATE OR REPLACE FUNCTION split_stac_path(IN path text, OUT col text, O...
  function sort (line 749) | CREATE OR REPLACE FUNCTION sort(_sort jsonb) RETURNS text AS $$
  function rsort (line 754) | CREATE OR REPLACE FUNCTION rsort(_sort jsonb) RETURNS text AS $$
  function bbox_geom (line 759) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS box3d AS $$
  function in_array_q (line 785) | CREATE OR REPLACE FUNCTION in_array_q(col text, arr jsonb) RETURNS text ...
  function count_by_delim (line 789) | CREATE OR REPLACE FUNCTION count_by_delim(text, text) RETURNS int AS $$
  function stac_query_op (line 795) | CREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) ...
  function filter_by_order (line 871) | CREATE OR REPLACE FUNCTION filter_by_order(item_id text, _sort jsonb, _t...
  function filter_by_order (line 881) | CREATE OR REPLACE FUNCTION filter_by_order(_item item, _sort jsonb, _typ...
  function search_dtrange (line 922) | CREATE OR REPLACE FUNCTION search_dtrange(IN _indate jsonb, OUT _tstzran...
  type pgstac_tmp_sorts (line 1009) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.2.3.sql
  type migrations (line 9) | CREATE TABLE migrations (
  function textarr (line 15) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function array_idents (line 24) | CREATE OR REPLACE FUNCTION array_idents(_js jsonb)
  function stac_geom (line 31) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_datetime (line 49) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function jsonb_paths (line 53) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 80) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 103) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 109) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 116) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 124) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function empty_arr (line 142) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function filter_jsonb (line 151) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function properties_idx (line 186) | CREATE OR REPLACE FUNCTION properties_idx(_in jsonb) RETURNS jsonb AS $$
  type collections (line 196) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 201) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 207) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 215) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 224) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 233) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 239) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 266) | CREATE TABLE IF NOT EXISTS items (
  type items_template (line 279) | CREATE TABLE items_template (
  function make_partitions (line 313) | CREATE OR REPLACE FUNCTION make_partitions(st timestamptz, et timestampt...
  function get_partition (line 326) | CREATE OR REPLACE FUNCTION get_partition(timestamptz) RETURNS text AS $$
  type items (line 330) | CREATE INDEX "datetime_id_idx" ON items (datetime, id)
  type items (line 331) | CREATE INDEX "properties_idx" ON items USING GIN (properties)
  type items (line 332) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 333) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function get_item (line 394) | CREATE OR REPLACE FUNCTION get_item(_id text) RETURNS jsonb AS $$
  function delete_item (line 398) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 406) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 412) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 420) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function analyze_empty_partitions (line 441) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function backfill_partitions (line 508) | CREATE OR REPLACE FUNCTION backfill_partitions()
  function collection_temporal_extent (line 572) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 578) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type items_partitions (line 600) | CREATE VIEW items_partitions AS
  function items_by_partition (line 621) | CREATE OR REPLACE FUNCTION items_by_partition(
  function split_stac_path (line 689) | CREATE OR REPLACE FUNCTION split_stac_path(IN path text, OUT col text, O...
  function sort (line 749) | CREATE OR REPLACE FUNCTION sort(_sort jsonb) RETURNS text AS $$
  function rsort (line 754) | CREATE OR REPLACE FUNCTION rsort(_sort jsonb) RETURNS text AS $$
  function bbox_geom (line 759) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS box3d AS $$
  function in_array_q (line 785) | CREATE OR REPLACE FUNCTION in_array_q(col text, arr jsonb) RETURNS text ...
  function count_by_delim (line 789) | CREATE OR REPLACE FUNCTION count_by_delim(text, text) RETURNS int AS $$
  function stac_query_op (line 795) | CREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) ...
  function filter_by_order (line 871) | CREATE OR REPLACE FUNCTION filter_by_order(item_id text, _sort jsonb, _t...
  function filter_by_order (line 881) | CREATE OR REPLACE FUNCTION filter_by_order(_item item, _sort jsonb, _typ...
  function search_dtrange (line 922) | CREATE OR REPLACE FUNCTION search_dtrange(IN _indate jsonb, OUT _tstzran...
  type pgstac_tmp_sorts (line 1009) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.2.4-0.2.5.sql
  function bbox_geom (line 4) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  type pgstac_tmp_sorts (line 76) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.2.4-0.2.7.sql
  function stac_query_op (line 4) | CREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) ...
  type pgstac_tmp_sorts (line 136) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.2.4.sql
  type migrations (line 9) | CREATE TABLE migrations (
  function textarr (line 15) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function array_idents (line 24) | CREATE OR REPLACE FUNCTION array_idents(_js jsonb)
  function stac_geom (line 31) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_datetime (line 49) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function jsonb_paths (line 53) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 80) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 103) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 109) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 116) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 124) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function empty_arr (line 142) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function filter_jsonb (line 151) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function properties_idx (line 186) | CREATE OR REPLACE FUNCTION properties_idx(_in jsonb) RETURNS jsonb AS $$
  type collections (line 196) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 201) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 207) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 215) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 224) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 233) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 239) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 266) | CREATE TABLE IF NOT EXISTS items (
  type items_template (line 279) | CREATE TABLE items_template (
  function make_partitions (line 313) | CREATE OR REPLACE FUNCTION make_partitions(st timestamptz, et timestampt...
  function get_partition (line 326) | CREATE OR REPLACE FUNCTION get_partition(timestamptz) RETURNS text AS $$
  type items (line 330) | CREATE INDEX "datetime_id_idx" ON items (datetime, id)
  type items (line 331) | CREATE INDEX "properties_idx" ON items USING GIN (properties)
  type items (line 332) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 333) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function get_item (line 394) | CREATE OR REPLACE FUNCTION get_item(_id text) RETURNS jsonb AS $$
  function delete_item (line 398) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 406) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 412) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 420) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function analyze_empty_partitions (line 441) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function backfill_partitions (line 508) | CREATE OR REPLACE FUNCTION backfill_partitions()
  function collection_temporal_extent (line 572) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 578) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type items_partitions (line 600) | CREATE VIEW items_partitions AS
  function items_by_partition (line 621) | CREATE OR REPLACE FUNCTION items_by_partition(
  function split_stac_path (line 689) | CREATE OR REPLACE FUNCTION split_stac_path(IN path text, OUT col text, O...
  function sort (line 749) | CREATE OR REPLACE FUNCTION sort(_sort jsonb) RETURNS text AS $$
  function rsort (line 754) | CREATE OR REPLACE FUNCTION rsort(_sort jsonb) RETURNS text AS $$
  function bbox_geom (line 759) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS box3d AS $$
  function in_array_q (line 785) | CREATE OR REPLACE FUNCTION in_array_q(col text, arr jsonb) RETURNS text ...
  function count_by_delim (line 789) | CREATE OR REPLACE FUNCTION count_by_delim(text, text) RETURNS int AS $$
  function stac_query_op (line 795) | CREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) ...
  function filter_by_order (line 871) | CREATE OR REPLACE FUNCTION filter_by_order(item_id text, _sort jsonb, _t...
  function filter_by_order (line 881) | CREATE OR REPLACE FUNCTION filter_by_order(_item item, _sort jsonb, _typ...
  function search_dtrange (line 922) | CREATE OR REPLACE FUNCTION search_dtrange(IN _indate jsonb, OUT _tstzran...
  type pgstac_tmp_sorts (line 1009) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.2.5.sql
  type migrations (line 9) | CREATE TABLE migrations (
  function textarr (line 15) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function array_idents (line 24) | CREATE OR REPLACE FUNCTION array_idents(_js jsonb)
  function stac_geom (line 31) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_datetime (line 49) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function jsonb_paths (line 53) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 80) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 103) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 109) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 116) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 124) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function empty_arr (line 142) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function filter_jsonb (line 151) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function properties_idx (line 185) | CREATE OR REPLACE FUNCTION properties_idx(_in jsonb) RETURNS jsonb AS $$
  type collections (line 195) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 200) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 206) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 214) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 223) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 232) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 238) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 265) | CREATE TABLE IF NOT EXISTS items (
  type items_template (line 278) | CREATE TABLE items_template (
  function make_partitions (line 312) | CREATE OR REPLACE FUNCTION make_partitions(st timestamptz, et timestampt...
  function get_partition (line 325) | CREATE OR REPLACE FUNCTION get_partition(timestamptz) RETURNS text AS $$
  type items (line 329) | CREATE INDEX "datetime_id_idx" ON items (datetime, id)
  type items (line 330) | CREATE INDEX "properties_idx" ON items USING GIN (properties)
  type items (line 331) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 332) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function get_item (line 393) | CREATE OR REPLACE FUNCTION get_item(_id text) RETURNS jsonb AS $$
  function delete_item (line 397) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 405) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 411) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 419) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function analyze_empty_partitions (line 440) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function backfill_partitions (line 507) | CREATE OR REPLACE FUNCTION backfill_partitions()
  function collection_temporal_extent (line 571) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 577) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type items_partitions (line 599) | CREATE VIEW items_partitions AS
  function items_by_partition (line 620) | CREATE OR REPLACE FUNCTION items_by_partition(
  function split_stac_path (line 688) | CREATE OR REPLACE FUNCTION split_stac_path(IN path text, OUT col text, O...
  function sort (line 748) | CREATE OR REPLACE FUNCTION sort(_sort jsonb) RETURNS text AS $$
  function rsort (line 753) | CREATE OR REPLACE FUNCTION rsort(_sort jsonb) RETURNS text AS $$
  function bbox_geom (line 758) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function in_array_q (line 784) | CREATE OR REPLACE FUNCTION in_array_q(col text, arr jsonb) RETURNS text ...
  function count_by_delim (line 788) | CREATE OR REPLACE FUNCTION count_by_delim(text, text) RETURNS int AS $$
  function stac_query_op (line 794) | CREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) ...
  function filter_by_order (line 872) | CREATE OR REPLACE FUNCTION filter_by_order(item_id text, _sort jsonb, _t...
  function filter_by_order (line 882) | CREATE OR REPLACE FUNCTION filter_by_order(_item item, _sort jsonb, _typ...
  function search_dtrange (line 923) | CREATE OR REPLACE FUNCTION search_dtrange(IN _indate jsonb, OUT _tstzran...
  type pgstac_tmp_sorts (line 1010) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.2.7.sql
  type migrations (line 9) | CREATE TABLE migrations (
  function textarr (line 15) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function array_idents (line 24) | CREATE OR REPLACE FUNCTION array_idents(_js jsonb)
  function stac_geom (line 31) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_datetime (line 49) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function jsonb_paths (line 53) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 80) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 103) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 109) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 116) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 124) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function empty_arr (line 142) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function filter_jsonb (line 151) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function properties_idx (line 185) | CREATE OR REPLACE FUNCTION properties_idx(_in jsonb) RETURNS jsonb AS $$
  type collections (line 195) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 200) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 206) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 214) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 223) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 232) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 238) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 265) | CREATE TABLE IF NOT EXISTS items (
  type items_template (line 278) | CREATE TABLE items_template (
  function make_partitions (line 312) | CREATE OR REPLACE FUNCTION make_partitions(st timestamptz, et timestampt...
  function get_partition (line 325) | CREATE OR REPLACE FUNCTION get_partition(timestamptz) RETURNS text AS $$
  type items (line 329) | CREATE INDEX "datetime_id_idx" ON items (datetime, id)
  type items (line 330) | CREATE INDEX "properties_idx" ON items USING GIN (properties)
  type items (line 331) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 332) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function get_item (line 393) | CREATE OR REPLACE FUNCTION get_item(_id text) RETURNS jsonb AS $$
  function delete_item (line 397) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 405) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 411) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 419) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function analyze_empty_partitions (line 440) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function backfill_partitions (line 507) | CREATE OR REPLACE FUNCTION backfill_partitions()
  function collection_temporal_extent (line 571) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 577) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type items_partitions (line 599) | CREATE VIEW items_partitions AS
  function items_by_partition (line 620) | CREATE OR REPLACE FUNCTION items_by_partition(
  function split_stac_path (line 688) | CREATE OR REPLACE FUNCTION split_stac_path(IN path text, OUT col text, O...
  function sort (line 748) | CREATE OR REPLACE FUNCTION sort(_sort jsonb) RETURNS text AS $$
  function rsort (line 753) | CREATE OR REPLACE FUNCTION rsort(_sort jsonb) RETURNS text AS $$
  function bbox_geom (line 758) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function in_array_q (line 784) | CREATE OR REPLACE FUNCTION in_array_q(col text, arr jsonb) RETURNS text ...
  function count_by_delim (line 788) | CREATE OR REPLACE FUNCTION count_by_delim(text, text) RETURNS int AS $$
  function stac_query_op (line 794) | CREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) ...
  function filter_by_order (line 872) | CREATE OR REPLACE FUNCTION filter_by_order(item_id text, _sort jsonb, _t...
  function filter_by_order (line 882) | CREATE OR REPLACE FUNCTION filter_by_order(_item item, _sort jsonb, _typ...
  function search_dtrange (line 923) | CREATE OR REPLACE FUNCTION search_dtrange(IN _indate jsonb, OUT _tstzran...
  type pgstac_tmp_sorts (line 1010) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.2.8.sql
  type migrations (line 9) | CREATE TABLE migrations (
  function textarr (line 15) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function array_idents (line 24) | CREATE OR REPLACE FUNCTION array_idents(_js jsonb)
  function stac_geom (line 31) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_datetime (line 49) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function jsonb_paths (line 53) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 80) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 103) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 109) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 116) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 124) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function empty_arr (line 142) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function filter_jsonb (line 151) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function properties_idx (line 185) | CREATE OR REPLACE FUNCTION properties_idx(_in jsonb) RETURNS jsonb AS $$
  type collections (line 195) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 200) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 206) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 214) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 223) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 232) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 238) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 244) | CREATE TABLE IF NOT EXISTS items (
  type items_template (line 257) | CREATE TABLE items_template (
  function make_partitions (line 274) | CREATE OR REPLACE FUNCTION make_partitions(st timestamptz, et timestampt...
  function get_partition (line 287) | CREATE OR REPLACE FUNCTION get_partition(timestamptz) RETURNS text AS $$
  type items (line 291) | CREATE INDEX "datetime_id_idx" ON items (datetime, id)
  type items (line 292) | CREATE INDEX "properties_idx" ON items USING GIN (properties)
  type items (line 293) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 294) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function get_item (line 306) | CREATE OR REPLACE FUNCTION get_item(_id text) RETURNS jsonb AS $$
  function delete_item (line 310) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 318) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 324) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 332) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function analyze_empty_partitions (line 353) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function backfill_partitions (line 364) | CREATE OR REPLACE FUNCTION backfill_partitions()
  function collection_temporal_extent (line 428) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 434) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_by_partition (line 452) | CREATE OR REPLACE FUNCTION items_by_partition(
  function split_stac_path (line 520) | CREATE OR REPLACE FUNCTION split_stac_path(IN path text, OUT col text, O...
  function sort (line 580) | CREATE OR REPLACE FUNCTION sort(_sort jsonb) RETURNS text AS $$
  function rsort (line 585) | CREATE OR REPLACE FUNCTION rsort(_sort jsonb) RETURNS text AS $$
  function bbox_geom (line 590) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function in_array_q (line 616) | CREATE OR REPLACE FUNCTION in_array_q(col text, arr jsonb) RETURNS text ...
  function count_by_delim (line 620) | CREATE OR REPLACE FUNCTION count_by_delim(text, text) RETURNS int AS $$
  function stac_query_op (line 626) | CREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) ...
  function filter_by_order (line 704) | CREATE OR REPLACE FUNCTION filter_by_order(item_id text, _sort jsonb, _t...
  function filter_by_order (line 714) | CREATE OR REPLACE FUNCTION filter_by_order(_item item, _sort jsonb, _typ...
  function search_dtrange (line 755) | CREATE OR REPLACE FUNCTION search_dtrange(IN _indate jsonb, OUT _tstzran...
  type pgstac_tmp_sorts (line 842) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.2.9-0.3.0.sql
  function notice (line 9) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 21) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 29) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 34) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 39) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function textarr (line 58) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 69) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 96) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 119) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 125) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 132) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 140) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 158) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 192) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 196) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 205) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 256) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 273) | CREATE OR REPLACE FUNCTION partition_count(
  function stac_datetime (line 324) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 331) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  function stac_daterange (line 339) | CREATE OR REPLACE FUNCTION stac_daterange(value jsonb) RETURNS tstzrange...
  type collections (line 344) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 349) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 355) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 363) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 372) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 381) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 387) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 393) | CREATE TABLE IF NOT EXISTS items (
  function properties_idx (line 405) | CREATE OR REPLACE FUNCTION properties_idx (IN content jsonb) RETURNS jso...
  function analyze_empty_partitions (line 443) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function items_partition_name (line 454) | CREATE OR REPLACE FUNCTION items_partition_name(timestamptz) RETURNS tex...
  function items_partition_exists (line 458) | CREATE OR REPLACE FUNCTION items_partition_exists(text) RETURNS boolean ...
  function items_partition_exists (line 462) | CREATE OR REPLACE FUNCTION items_partition_exists(timestamptz) RETURNS b...
  function items_partition_create_worker (line 466) | CREATE OR REPLACE FUNCTION items_partition_create_worker(partition text,...
  function items_partition_create (line 509) | CREATE OR REPLACE FUNCTION items_partition_create(st timestamptz, et tim...
  type items_staging (line 522) | CREATE UNLOGGED TABLE items_staging (
  function items_staging_insert_triggerfunc (line 526) | CREATE OR REPLACE FUNCTION items_staging_insert_triggerfunc() RETURNS TR...
  type items_staging_ignore (line 556) | CREATE UNLOGGED TABLE items_staging_ignore (
  function items_staging_ignore_insert_triggerfunc (line 560) | CREATE OR REPLACE FUNCTION items_staging_ignore_insert_triggerfunc() RET...
  type items_staging_upsert (line 590) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_upsert_insert_triggerfunc (line 594) | CREATE OR REPLACE FUNCTION items_staging_upsert_insert_triggerfunc() RET...
  function items_update_triggerfunc (line 626) | CREATE OR REPLACE FUNCTION items_update_triggerfunc() RETURNS TRIGGER AS $$
  function delete_item (line 675) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 683) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 688) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 696) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 701) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 707) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 713) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_path (line 731) | CREATE OR REPLACE FUNCTION items_path(
  function parse_dtrange (line 787) | CREATE OR REPLACE FUNCTION parse_dtrange(IN _indate jsonb, OUT _tstzrang...
  function cql_and_append (line 844) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 861) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1035) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1173) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function sort_dir_to_op (line 1212) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1225) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1247) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1252) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1357) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1361) | CREATE OR REPLACE FUNCTION search_hash(jsonb) RETURNS text AS $$
  type searches (line 1366) | CREATE TABLE IF NOT EXISTS searches(
  function search_query (line 1378) | CREATE OR REPLACE FUNCTION search_query(_search jsonb = '{}'::jsonb, upd...
  function search (line 1439) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  type items (line 1597) | CREATE INDEX "datetime_idx" ON items (datetime)
  type items (line 1598) | CREATE INDEX "end_datetime_idx" ON items (end_datetime)
  type items (line 1599) | CREATE INDEX "properties_idx" ON items USING GIN (properties jsonb_path_...
  type items (line 1600) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 1601) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  type items (line 1602) | CREATE UNIQUE INDEX "items_id_datetime_idx" ON items (datetime, id)

FILE: src/pgstac/migrations/pgstac.0.2.9.sql
  type migrations (line 9) | CREATE TABLE migrations (
  function textarr (line 15) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function array_idents (line 24) | CREATE OR REPLACE FUNCTION array_idents(_js jsonb)
  function stac_geom (line 31) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_datetime (line 49) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function jsonb_paths (line 53) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 80) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 103) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 109) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 116) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 124) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function empty_arr (line 142) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function filter_jsonb (line 151) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function properties_idx (line 185) | CREATE OR REPLACE FUNCTION properties_idx(_in jsonb) RETURNS jsonb AS $$
  type collections (line 195) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 200) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 206) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 214) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 223) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 232) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 238) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 244) | CREATE TABLE IF NOT EXISTS items (
  type items_template (line 257) | CREATE TABLE items_template (
  function make_partitions (line 274) | CREATE OR REPLACE FUNCTION make_partitions(st timestamptz, et timestampt...
  function get_partition (line 287) | CREATE OR REPLACE FUNCTION get_partition(timestamptz) RETURNS text AS $$
  type items (line 291) | CREATE INDEX "datetime_id_idx" ON items (datetime, id)
  type items (line 292) | CREATE INDEX "properties_idx" ON items USING GIN (properties)
  type items (line 293) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 294) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function get_item (line 306) | CREATE OR REPLACE FUNCTION get_item(_id text) RETURNS jsonb AS $$
  function delete_item (line 310) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 318) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 324) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 332) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function analyze_empty_partitions (line 353) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function backfill_partitions (line 364) | CREATE OR REPLACE FUNCTION backfill_partitions()
  function collection_temporal_extent (line 428) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 434) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_by_partition (line 452) | CREATE OR REPLACE FUNCTION items_by_partition(
  function split_stac_path (line 520) | CREATE OR REPLACE FUNCTION split_stac_path(IN path text, OUT col text, O...
  function sort (line 580) | CREATE OR REPLACE FUNCTION sort(_sort jsonb) RETURNS text AS $$
  function rsort (line 585) | CREATE OR REPLACE FUNCTION rsort(_sort jsonb) RETURNS text AS $$
  function bbox_geom (line 590) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function in_array_q (line 616) | CREATE OR REPLACE FUNCTION in_array_q(col text, arr jsonb) RETURNS text ...
  function count_by_delim (line 620) | CREATE OR REPLACE FUNCTION count_by_delim(text, text) RETURNS int AS $$
  function stac_query_op (line 626) | CREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) ...
  function filter_by_order (line 704) | CREATE OR REPLACE FUNCTION filter_by_order(item_id text, _sort jsonb, _t...
  function filter_by_order (line 714) | CREATE OR REPLACE FUNCTION filter_by_order(_item item, _sort jsonb, _typ...
  function search_dtrange (line 755) | CREATE OR REPLACE FUNCTION search_dtrange(IN _indate jsonb, OUT _tstzran...
  type pgstac_tmp_sorts (line 842) | CREATE TEMP TABLE pgstac_tmp_sorts ON COMMIT DROP AS SELECT * FROM sort_...

FILE: src/pgstac/migrations/pgstac.0.3.0-0.3.1.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.sort_sqlorderby(_search jsonb DEFAULT ...

FILE: src/pgstac/migrations/pgstac.0.3.0.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function notice (line 10) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 22) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 30) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 35) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 40) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function textarr (line 59) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 70) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 97) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 120) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 126) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 133) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 141) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 159) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 193) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 197) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 206) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 255) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 272) | CREATE OR REPLACE FUNCTION partition_count(
  function stac_datetime (line 323) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 330) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  function stac_daterange (line 338) | CREATE OR REPLACE FUNCTION stac_daterange(value jsonb) RETURNS tstzrange...
  type collections (line 343) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 348) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 354) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 362) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 371) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 380) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 386) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 392) | CREATE TABLE items (
  function properties_idx (line 404) | CREATE OR REPLACE FUNCTION properties_idx (IN content jsonb) RETURNS jso...
  type items (line 441) | CREATE INDEX "datetime_idx" ON items (datetime)
  type items (line 442) | CREATE INDEX "end_datetime_idx" ON items (end_datetime)
  type items (line 443) | CREATE INDEX "properties_idx" ON items USING GIN (properties jsonb_path_...
  type items (line 444) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 445) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  type items (line 446) | CREATE UNIQUE INDEX "items_id_datetime_idx" ON items (datetime, id)
  function analyze_empty_partitions (line 450) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function items_partition_name (line 461) | CREATE OR REPLACE FUNCTION items_partition_name(timestamptz) RETURNS tex...
  function items_partition_exists (line 465) | CREATE OR REPLACE FUNCTION items_partition_exists(text) RETURNS boolean ...
  function items_partition_exists (line 469) | CREATE OR REPLACE FUNCTION items_partition_exists(timestamptz) RETURNS b...
  function items_partition_create_worker (line 473) | CREATE OR REPLACE FUNCTION items_partition_create_worker(partition text,...
  function items_partition_create (line 516) | CREATE OR REPLACE FUNCTION items_partition_create(st timestamptz, et tim...
  type items_staging (line 529) | CREATE UNLOGGED TABLE items_staging (
  function items_staging_insert_triggerfunc (line 533) | CREATE OR REPLACE FUNCTION items_staging_insert_triggerfunc() RETURNS TR...
  type items_staging_ignore (line 563) | CREATE UNLOGGED TABLE items_staging_ignore (
  function items_staging_ignore_insert_triggerfunc (line 567) | CREATE OR REPLACE FUNCTION items_staging_ignore_insert_triggerfunc() RET...
  type items_staging_upsert (line 597) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_upsert_insert_triggerfunc (line 601) | CREATE OR REPLACE FUNCTION items_staging_upsert_insert_triggerfunc() RET...
  function items_update_triggerfunc (line 633) | CREATE OR REPLACE FUNCTION items_update_triggerfunc() RETURNS TRIGGER AS $$
  function delete_item (line 682) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 690) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 695) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 703) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 708) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 714) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 720) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_path (line 738) | CREATE OR REPLACE FUNCTION items_path(
  function parse_dtrange (line 794) | CREATE OR REPLACE FUNCTION parse_dtrange(IN _indate jsonb, OUT _tstzrang...
  function cql_and_append (line 851) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 868) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1042) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1180) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function sort_dir_to_op (line 1219) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1232) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1254) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1259) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1364) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1368) | CREATE OR REPLACE FUNCTION search_hash(jsonb) RETURNS text AS $$
  type searches (line 1373) | CREATE TABLE IF NOT EXISTS searches(
  function search_query (line 1385) | CREATE OR REPLACE FUNCTION search_query(_search jsonb = '{}'::jsonb, upd...
  function search (line 1446) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...

FILE: src/pgstac/migrations/pgstac.0.3.1.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function notice (line 10) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 22) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 30) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 35) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 40) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function textarr (line 59) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 70) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 97) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 120) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 126) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 133) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 141) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 159) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 193) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 197) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 206) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 255) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 272) | CREATE OR REPLACE FUNCTION partition_count(
  function stac_datetime (line 323) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 330) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  function stac_daterange (line 338) | CREATE OR REPLACE FUNCTION stac_daterange(value jsonb) RETURNS tstzrange...
  type collections (line 343) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 348) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 354) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 362) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 371) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 380) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 386) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 392) | CREATE TABLE items (
  function properties_idx (line 404) | CREATE OR REPLACE FUNCTION properties_idx (IN content jsonb) RETURNS jso...
  type items (line 441) | CREATE INDEX "datetime_idx" ON items (datetime)
  type items (line 442) | CREATE INDEX "end_datetime_idx" ON items (end_datetime)
  type items (line 443) | CREATE INDEX "properties_idx" ON items USING GIN (properties jsonb_path_...
  type items (line 444) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 445) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  type items (line 446) | CREATE UNIQUE INDEX "items_id_datetime_idx" ON items (datetime, id)
  function analyze_empty_partitions (line 450) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function items_partition_name (line 461) | CREATE OR REPLACE FUNCTION items_partition_name(timestamptz) RETURNS tex...
  function items_partition_exists (line 465) | CREATE OR REPLACE FUNCTION items_partition_exists(text) RETURNS boolean ...
  function items_partition_exists (line 469) | CREATE OR REPLACE FUNCTION items_partition_exists(timestamptz) RETURNS b...
  function items_partition_create_worker (line 473) | CREATE OR REPLACE FUNCTION items_partition_create_worker(partition text,...
  function items_partition_create (line 516) | CREATE OR REPLACE FUNCTION items_partition_create(st timestamptz, et tim...
  type items_staging (line 529) | CREATE UNLOGGED TABLE items_staging (
  function items_staging_insert_triggerfunc (line 533) | CREATE OR REPLACE FUNCTION items_staging_insert_triggerfunc() RETURNS TR...
  type items_staging_ignore (line 563) | CREATE UNLOGGED TABLE items_staging_ignore (
  function items_staging_ignore_insert_triggerfunc (line 567) | CREATE OR REPLACE FUNCTION items_staging_ignore_insert_triggerfunc() RET...
  type items_staging_upsert (line 597) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_upsert_insert_triggerfunc (line 601) | CREATE OR REPLACE FUNCTION items_staging_upsert_insert_triggerfunc() RET...
  function items_update_triggerfunc (line 633) | CREATE OR REPLACE FUNCTION items_update_triggerfunc() RETURNS TRIGGER AS $$
  function delete_item (line 682) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 690) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 695) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 703) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 708) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 714) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 720) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_path (line 738) | CREATE OR REPLACE FUNCTION items_path(
  function parse_dtrange (line 794) | CREATE OR REPLACE FUNCTION parse_dtrange(IN _indate jsonb, OUT _tstzrang...
  function cql_and_append (line 851) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 868) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1042) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1180) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function sort_dir_to_op (line 1219) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1232) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1254) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1259) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1364) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1368) | CREATE OR REPLACE FUNCTION search_hash(jsonb) RETURNS text AS $$
  type searches (line 1373) | CREATE TABLE IF NOT EXISTS searches(
  function search_query (line 1385) | CREATE OR REPLACE FUNCTION search_query(_search jsonb = '{}'::jsonb, upd...
  function search (line 1446) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...

FILE: src/pgstac/migrations/pgstac.0.3.2-0.3.3.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.add_filters_to_cql(j jsonb)
  function pgstac (line 183) | CREATE OR REPLACE FUNCTION pgstac.search(_search jsonb DEFAULT '{}'::jsonb)
  function pgstac (line 332) | CREATE OR REPLACE FUNCTION pgstac.sort_sqlorderby(_search jsonb DEFAULT ...

FILE: src/pgstac/migrations/pgstac.0.3.2.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function notice (line 10) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 22) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 30) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 35) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 40) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function textarr (line 59) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 70) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 97) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 120) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 126) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 133) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 141) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 159) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 193) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 197) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 206) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 255) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 272) | CREATE OR REPLACE FUNCTION partition_count(
  function stac_datetime (line 323) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 330) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  function stac_daterange (line 338) | CREATE OR REPLACE FUNCTION stac_daterange(value jsonb) RETURNS tstzrange...
  type collections (line 343) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 348) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 354) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 362) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 371) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 380) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 386) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 392) | CREATE TABLE items (
  function properties_idx (line 404) | CREATE OR REPLACE FUNCTION properties_idx (IN content jsonb) RETURNS jso...
  type items (line 441) | CREATE INDEX "datetime_idx" ON items (datetime)
  type items (line 442) | CREATE INDEX "end_datetime_idx" ON items (end_datetime)
  type items (line 443) | CREATE INDEX "properties_idx" ON items USING GIN (properties jsonb_path_...
  type items (line 444) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 445) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  type items (line 446) | CREATE UNIQUE INDEX "items_id_datetime_idx" ON items (datetime, id)
  function analyze_empty_partitions (line 450) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function items_partition_name (line 461) | CREATE OR REPLACE FUNCTION items_partition_name(timestamptz) RETURNS tex...
  function items_partition_exists (line 465) | CREATE OR REPLACE FUNCTION items_partition_exists(text) RETURNS boolean ...
  function items_partition_exists (line 469) | CREATE OR REPLACE FUNCTION items_partition_exists(timestamptz) RETURNS b...
  function items_partition_create_worker (line 473) | CREATE OR REPLACE FUNCTION items_partition_create_worker(partition text,...
  function items_partition_create (line 516) | CREATE OR REPLACE FUNCTION items_partition_create(st timestamptz, et tim...
  type items_staging (line 529) | CREATE UNLOGGED TABLE items_staging (
  function items_staging_insert_triggerfunc (line 533) | CREATE OR REPLACE FUNCTION items_staging_insert_triggerfunc() RETURNS TR...
  type items_staging_ignore (line 563) | CREATE UNLOGGED TABLE items_staging_ignore (
  function items_staging_ignore_insert_triggerfunc (line 567) | CREATE OR REPLACE FUNCTION items_staging_ignore_insert_triggerfunc() RET...
  type items_staging_upsert (line 597) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_upsert_insert_triggerfunc (line 601) | CREATE OR REPLACE FUNCTION items_staging_upsert_insert_triggerfunc() RET...
  function items_update_triggerfunc (line 633) | CREATE OR REPLACE FUNCTION items_update_triggerfunc() RETURNS TRIGGER AS $$
  function delete_item (line 682) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 690) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 695) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 703) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 708) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 714) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 720) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_path (line 738) | CREATE OR REPLACE FUNCTION items_path(
  function parse_dtrange (line 794) | CREATE OR REPLACE FUNCTION parse_dtrange(IN _indate jsonb, OUT _tstzrang...
  function cql_and_append (line 851) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 868) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1042) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1180) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function sort_dir_to_op (line 1219) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1232) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1254) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1259) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1364) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1368) | CREATE OR REPLACE FUNCTION search_hash(jsonb) RETURNS text AS $$
  type searches (line 1373) | CREATE TABLE IF NOT EXISTS searches(
  function search_query (line 1385) | CREATE OR REPLACE FUNCTION search_query(_search jsonb = '{}'::jsonb, upd...
  function search (line 1446) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...

FILE: src/pgstac/migrations/pgstac.0.3.3-0.3.4.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.create_items(data jsonb)
  function pgstac (line 14) | CREATE OR REPLACE FUNCTION pgstac.ftime()
  function pgstac (line 22) | CREATE OR REPLACE FUNCTION pgstac.geojsonsearch(geojson jsonb, queryhash...
  function pgstac (line 39) | CREATE OR REPLACE FUNCTION pgstac.geometrysearch(geom geometry, queryhas...
  function pgstac (line 171) | CREATE OR REPLACE FUNCTION pgstac.upsert_items(data jsonb)
  function pgstac (line 181) | CREATE OR REPLACE FUNCTION pgstac.xyzsearch(_x integer, _y integer, _z i...

FILE: src/pgstac/migrations/pgstac.0.3.3.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function notice (line 10) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 22) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 30) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 35) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 40) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function textarr (line 59) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 70) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 97) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 120) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 126) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 133) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 141) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 159) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 193) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 197) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 206) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 255) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 272) | CREATE OR REPLACE FUNCTION partition_count(
  function stac_datetime (line 323) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 330) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  function stac_daterange (line 338) | CREATE OR REPLACE FUNCTION stac_daterange(value jsonb) RETURNS tstzrange...
  type collections (line 343) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 348) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 354) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 362) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 371) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 380) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 386) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 392) | CREATE TABLE items (
  function properties_idx (line 404) | CREATE OR REPLACE FUNCTION properties_idx (IN content jsonb) RETURNS jso...
  type items (line 441) | CREATE INDEX "datetime_idx" ON items (datetime)
  type items (line 442) | CREATE INDEX "end_datetime_idx" ON items (end_datetime)
  type items (line 443) | CREATE INDEX "properties_idx" ON items USING GIN (properties jsonb_path_...
  type items (line 444) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 445) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  type items (line 446) | CREATE UNIQUE INDEX "items_id_datetime_idx" ON items (datetime, id)
  function analyze_empty_partitions (line 450) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function items_partition_name (line 461) | CREATE OR REPLACE FUNCTION items_partition_name(timestamptz) RETURNS tex...
  function items_partition_exists (line 465) | CREATE OR REPLACE FUNCTION items_partition_exists(text) RETURNS boolean ...
  function items_partition_exists (line 469) | CREATE OR REPLACE FUNCTION items_partition_exists(timestamptz) RETURNS b...
  function items_partition_create_worker (line 473) | CREATE OR REPLACE FUNCTION items_partition_create_worker(partition text,...
  function items_partition_create (line 516) | CREATE OR REPLACE FUNCTION items_partition_create(st timestamptz, et tim...
  type items_staging (line 529) | CREATE UNLOGGED TABLE items_staging (
  function items_staging_insert_triggerfunc (line 533) | CREATE OR REPLACE FUNCTION items_staging_insert_triggerfunc() RETURNS TR...
  type items_staging_ignore (line 563) | CREATE UNLOGGED TABLE items_staging_ignore (
  function items_staging_ignore_insert_triggerfunc (line 567) | CREATE OR REPLACE FUNCTION items_staging_ignore_insert_triggerfunc() RET...
  type items_staging_upsert (line 597) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_upsert_insert_triggerfunc (line 601) | CREATE OR REPLACE FUNCTION items_staging_upsert_insert_triggerfunc() RET...
  function items_update_triggerfunc (line 633) | CREATE OR REPLACE FUNCTION items_update_triggerfunc() RETURNS TRIGGER AS $$
  function delete_item (line 682) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 690) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 695) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 703) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 708) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 714) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 720) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_path (line 738) | CREATE OR REPLACE FUNCTION items_path(
  function parse_dtrange (line 794) | CREATE OR REPLACE FUNCTION parse_dtrange(IN _indate jsonb, OUT _tstzrang...
  function cql_and_append (line 851) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 868) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1042) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1180) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function sort_dir_to_op (line 1219) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1232) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1258) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1263) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1370) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1374) | CREATE OR REPLACE FUNCTION search_hash(jsonb) RETURNS text AS $$
  type searches (line 1379) | CREATE TABLE IF NOT EXISTS searches(
  function search_query (line 1391) | CREATE OR REPLACE FUNCTION search_query(_search jsonb = '{}'::jsonb, upd...
  function search (line 1452) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...

FILE: src/pgstac/migrations/pgstac.0.3.4-0.3.5.sql
  type temp_migrations (line 3) | CREATE TEMP TABLE temp_migrations AS SELECT version, max(datetime) as da...
  type "pgstac" (line 17) | create table "pgstac"."search_wheres" (
  function pgstac (line 46) | CREATE OR REPLACE FUNCTION pgstac.search_hash(jsonb, jsonb)
  type migrations_pkey (line 58) | CREATE UNIQUE INDEX migrations_pkey ON pgstac.migrations USING btree (ve...
  type search_wheres_pkey (line 60) | CREATE UNIQUE INDEX search_wheres_pkey ON pgstac.search_wheres USING btr...
  function pgstac (line 81) | CREATE OR REPLACE FUNCTION pgstac.context()
  function pgstac (line 89) | CREATE OR REPLACE FUNCTION pgstac.context_estimated_cost()
  function pgstac (line 97) | CREATE OR REPLACE FUNCTION pgstac.context_estimated_count()
  function pgstac (line 105) | CREATE OR REPLACE FUNCTION pgstac.context_stats_ttl()
  function pgstac (line 113) | CREATE OR REPLACE FUNCTION pgstac.drop_partition_constraints(partition t...
  function pgstac (line 139) | CREATE OR REPLACE FUNCTION pgstac.field_orderby(p text)
  function pgstac (line 151) | CREATE OR REPLACE FUNCTION pgstac.get_setting(setting text, INOUT _defau...
  function pgstac (line 174) | CREATE OR REPLACE FUNCTION pgstac.get_version()
  function pgstac (line 183) | CREATE OR REPLACE FUNCTION pgstac.items_count(_where text)
  function pgstac (line 259) | CREATE OR REPLACE FUNCTION pgstac.partition_queries(_where text DEFAULT ...
  function pgstac (line 312) | CREATE OR REPLACE FUNCTION pgstac.search_query(_search jsonb DEFAULT '{}...
  function pgstac (line 356) | CREATE OR REPLACE FUNCTION pgstac.set_version(text)
  function pgstac (line 501) | CREATE OR REPLACE FUNCTION pgstac.items_partition_name(timestamp with ti...
  type "pgstac" (line 510) | create or replace view "pgstac"."items_partitions" as  SELECT all_items_...
  function pgstac (line 519) | CREATE OR REPLACE FUNCTION pgstac.items_path(dotpath text, OUT field tex...
  function pgstac (line 572) | CREATE OR REPLACE FUNCTION pgstac.items_staging_ignore_insert_triggerfunc()
  function pgstac (line 622) | CREATE OR REPLACE FUNCTION pgstac.items_staging_insert_triggerfunc()
  function pgstac (line 674) | CREATE OR REPLACE FUNCTION pgstac.items_staging_upsert_insert_triggerfunc()
  function pgstac (line 726) | CREATE OR REPLACE FUNCTION pgstac.partition_cursor(_where text DEFAULT '...
  function pgstac (line 745) | CREATE OR REPLACE FUNCTION pgstac.search(_search jsonb DEFAULT '{}'::jsonb)
  function pgstac (line 907) | CREATE OR REPLACE FUNCTION pgstac.sort_sqlorderby(_search jsonb DEFAULT ...

FILE: src/pgstac/migrations/pgstac.0.3.4.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function notice (line 10) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 22) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 30) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 35) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 40) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function textarr (line 59) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 70) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 97) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 120) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 126) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 133) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 141) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 159) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 193) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 197) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 206) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 255) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 272) | CREATE OR REPLACE FUNCTION partition_count(
  function stac_datetime (line 323) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 330) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  function stac_daterange (line 338) | CREATE OR REPLACE FUNCTION stac_daterange(value jsonb) RETURNS tstzrange...
  type collections (line 343) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 348) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 354) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 362) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 371) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 380) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 386) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 392) | CREATE TABLE items (
  function properties_idx (line 404) | CREATE OR REPLACE FUNCTION properties_idx (IN content jsonb) RETURNS jso...
  type items (line 441) | CREATE INDEX "datetime_idx" ON items (datetime)
  type items (line 442) | CREATE INDEX "end_datetime_idx" ON items (end_datetime)
  type items (line 443) | CREATE INDEX "properties_idx" ON items USING GIN (properties jsonb_path_...
  type items (line 444) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 445) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  type items (line 446) | CREATE UNIQUE INDEX "items_id_datetime_idx" ON items (datetime, id)
  function analyze_empty_partitions (line 450) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function items_partition_name (line 461) | CREATE OR REPLACE FUNCTION items_partition_name(timestamptz) RETURNS tex...
  function items_partition_exists (line 465) | CREATE OR REPLACE FUNCTION items_partition_exists(text) RETURNS boolean ...
  function items_partition_exists (line 469) | CREATE OR REPLACE FUNCTION items_partition_exists(timestamptz) RETURNS b...
  function items_partition_create_worker (line 473) | CREATE OR REPLACE FUNCTION items_partition_create_worker(partition text,...
  function items_partition_create (line 516) | CREATE OR REPLACE FUNCTION items_partition_create(st timestamptz, et tim...
  type items_staging (line 529) | CREATE UNLOGGED TABLE items_staging (
  function items_staging_insert_triggerfunc (line 533) | CREATE OR REPLACE FUNCTION items_staging_insert_triggerfunc() RETURNS TR...
  type items_staging_ignore (line 563) | CREATE UNLOGGED TABLE items_staging_ignore (
  function items_staging_ignore_insert_triggerfunc (line 567) | CREATE OR REPLACE FUNCTION items_staging_ignore_insert_triggerfunc() RET...
  type items_staging_upsert (line 597) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_upsert_insert_triggerfunc (line 601) | CREATE OR REPLACE FUNCTION items_staging_upsert_insert_triggerfunc() RET...
  function items_update_triggerfunc (line 633) | CREATE OR REPLACE FUNCTION items_update_triggerfunc() RETURNS TRIGGER AS $$
  function delete_item (line 682) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 690) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 695) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 703) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function create_items (line 707) | CREATE OR REPLACE FUNCTION create_items(data jsonb) RETURNS VOID AS $$
  function upsert_items (line 712) | CREATE OR REPLACE FUNCTION upsert_items(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 718) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 724) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 730) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_path (line 748) | CREATE OR REPLACE FUNCTION items_path(
  function parse_dtrange (line 804) | CREATE OR REPLACE FUNCTION parse_dtrange(IN _indate jsonb, OUT _tstzrang...
  function cql_and_append (line 861) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 878) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1052) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1190) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function sort_dir_to_op (line 1229) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1242) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1268) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1273) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1380) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1384) | CREATE OR REPLACE FUNCTION search_hash(jsonb) RETURNS text AS $$
  type searches (line 1389) | CREATE TABLE IF NOT EXISTS searches(
  function search_query (line 1401) | CREATE OR REPLACE FUNCTION search_query(_search jsonb = '{}'::jsonb, upd...
  function search (line 1462) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 1607) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 1624) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 1630) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 1770) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.3.5-0.3.6.sql
  type search_wheres_partitions (line 2) | CREATE INDEX search_wheres_partitions ON pgstac.search_wheres USING gin ...
  function pgstac (line 6) | CREATE OR REPLACE FUNCTION pgstac.validate_constraints()
  function pgstac (line 35) | CREATE OR REPLACE FUNCTION pgstac.drop_partition_constraints(partition t...
  function pgstac (line 61) | CREATE OR REPLACE FUNCTION pgstac.items_staging_ignore_insert_triggerfunc()
  function pgstac (line 121) | CREATE OR REPLACE FUNCTION pgstac.items_staging_insert_triggerfunc()
  function pgstac (line 179) | CREATE OR REPLACE FUNCTION pgstac.items_staging_upsert_insert_triggerfunc()
  function pgstac (line 241) | CREATE OR REPLACE FUNCTION pgstac.partition_checks(partition text, OUT m...

FILE: src/pgstac/migrations/pgstac.0.3.5.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function get_version (line 10) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 14) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  function context (line 21) | CREATE OR REPLACE FUNCTION get_setting(IN setting text, INOUT _default a...
  function context_estimated_count (line 44) | CREATE OR REPLACE FUNCTION context_estimated_count() RETURNS int AS $$
  function context_estimated_cost (line 48) | CREATE OR REPLACE FUNCTION context_estimated_cost() RETURNS float AS $$
  function context_stats_ttl (line 52) | CREATE OR REPLACE FUNCTION context_stats_ttl() RETURNS interval AS $$
  function notice (line 57) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 69) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 77) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 82) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 87) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function array_reverse (line 106) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function textarr (line 114) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 125) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 152) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 175) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 181) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 188) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 196) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 214) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 248) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 252) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 262) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 313) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 330) | CREATE OR REPLACE FUNCTION partition_count(
  function partition_checks (line 387) | CREATE OR REPLACE FUNCTION partition_checks(
  function stac_geom (line 454) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_datetime (line 472) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 479) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  function stac_daterange (line 487) | CREATE OR REPLACE FUNCTION stac_daterange(value jsonb) RETURNS tstzrange...
  type collections (line 492) | CREATE TABLE IF NOT EXISTS collections (
  function create_collection (line 497) | CREATE OR REPLACE FUNCTION create_collection(data jsonb) RETURNS VOID AS $$
  function update_collection (line 503) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 511) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 520) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 529) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 535) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type items (line 541) | CREATE TABLE items (
  function properties_idx (line 553) | CREATE OR REPLACE FUNCTION properties_idx (IN content jsonb) RETURNS jso...
  type items (line 590) | CREATE INDEX "datetime_idx" ON items (datetime)
  type items (line 591) | CREATE INDEX "end_datetime_idx" ON items (end_datetime)
  type items (line 592) | CREATE INDEX "properties_idx" ON items USING GIN (properties jsonb_path_...
  type items (line 593) | CREATE INDEX "collection_idx" ON items (collection_id)
  type items (line 594) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  type items (line 595) | CREATE UNIQUE INDEX "items_id_datetime_idx" ON items (datetime, id)
  function analyze_empty_partitions (line 599) | CREATE OR REPLACE FUNCTION analyze_empty_partitions() RETURNS VOID AS $$
  function items_partition_name (line 610) | CREATE OR REPLACE FUNCTION items_partition_name(timestamptz) RETURNS tex...
  function items_partition_exists (line 614) | CREATE OR REPLACE FUNCTION items_partition_exists(text) RETURNS boolean ...
  function items_partition_exists (line 618) | CREATE OR REPLACE FUNCTION items_partition_exists(timestamptz) RETURNS b...
  function items_partition_create_worker (line 622) | CREATE OR REPLACE FUNCTION items_partition_create_worker(partition text,...
  function items_partition_create (line 665) | CREATE OR REPLACE FUNCTION items_partition_create(st timestamptz, et tim...
  type items_staging (line 678) | CREATE UNLOGGED TABLE items_staging (
  function items_staging_insert_triggerfunc (line 682) | CREATE OR REPLACE FUNCTION items_staging_insert_triggerfunc() RETURNS TR...
  type items_staging_ignore (line 735) | CREATE UNLOGGED TABLE items_staging_ignore (
  function items_staging_ignore_insert_triggerfunc (line 739) | CREATE OR REPLACE FUNCTION items_staging_ignore_insert_triggerfunc() RET...
  type items_staging_upsert (line 789) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_upsert_insert_triggerfunc (line 793) | CREATE OR REPLACE FUNCTION items_staging_upsert_insert_triggerfunc() RET...
  function items_update_triggerfunc (line 844) | CREATE OR REPLACE FUNCTION items_update_triggerfunc() RETURNS TRIGGER AS $$
  function delete_item (line 895) | CREATE OR REPLACE FUNCTION delete_item(_id text) RETURNS VOID AS $$
  function create_item (line 903) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 908) | CREATE OR REPLACE FUNCTION update_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 916) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function create_items (line 920) | CREATE OR REPLACE FUNCTION create_items(data jsonb) RETURNS VOID AS $$
  function upsert_items (line 925) | CREATE OR REPLACE FUNCTION upsert_items(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 931) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 937) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 943) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  function items_path (line 961) | CREATE OR REPLACE FUNCTION items_path(
  function parse_dtrange (line 1017) | CREATE OR REPLACE FUNCTION parse_dtrange(IN _indate jsonb, OUT _tstzrang...
  function cql_and_append (line 1074) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 1091) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1265) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1403) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function sort_dir_to_op (line 1442) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function field_orderby (line 1455) | CREATE OR REPLACE FUNCTION field_orderby(p text) RETURNS text AS $$
  function sort_sqlorderby (line 1463) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1489) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1494) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1601) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1605) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 1609) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 1619) | CREATE TABLE IF NOT EXISTS search_wheres(
  function where_stats (line 1633) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search (line 1807) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 1967) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 1984) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 1990) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 2130) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.3.6-0.4.0.sql
  type "pgstac" (line 14) | create table "pgstac"."pgstac_settings" (
  type pgstac_settings_pkey (line 20) | CREATE UNIQUE INDEX pgstac_settings_pkey ON pgstac.pgstac_settings USING...
  function pgstac (line 34) | CREATE OR REPLACE FUNCTION pgstac.context_estimated_cost(conf jsonb DEFA...
  function pgstac (line 42) | CREATE OR REPLACE FUNCTION pgstac.context_estimated_count(conf jsonb DEF...
  function pgstac (line 50) | CREATE OR REPLACE FUNCTION pgstac.context_stats_ttl(conf jsonb DEFAULT N...
  function pgstac (line 58) | CREATE OR REPLACE FUNCTION pgstac.cql2_query(j jsonb, recursion integer ...
  function pgstac (line 223) | CREATE OR REPLACE FUNCTION pgstac.get_setting(_setting text, conf jsonb ...
  function pgstac (line 235) | CREATE OR REPLACE FUNCTION pgstac.where_stats(inwhere text, updatestats ...
  function pgstac (line 548) | CREATE OR REPLACE FUNCTION pgstac.items_staging_ignore_insert_triggerfunc()
  function pgstac (line 611) | CREATE OR REPLACE FUNCTION pgstac.items_staging_insert_triggerfunc()
  function pgstac (line 671) | CREATE OR REPLACE FUNCTION pgstac.items_staging_upsert_insert_triggerfunc()
  function pgstac (line 736) | CREATE OR REPLACE FUNCTION pgstac.search(_search jsonb DEFAULT '{}'::jsonb)
  function pgstac (line 908) | CREATE OR REPLACE FUNCTION pgstac.search_query(_search jsonb DEFAULT '{}...

FILE: src/pgstac/migrations/pgstac.0.3.6.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function get_version (line 10) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 14) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  function context (line 21) | CREATE OR REPLACE FUNCTION get_setting(IN setting text, INOUT _default a...
  function context_estimated_count (line 44) | CREATE OR REPLACE FUNCTION context_estimated_count() RETURNS int AS $$
  function context_estimated_cost (line 48) | CREATE OR REPLACE FUNCTION context_estimated_cost() RETURNS float AS $$
  function context_stats_ttl (line 52) | CREATE OR REPLACE FUNCTION context_stats_ttl() RETURNS interval AS $$
  function notice (line 57) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 69) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 77) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 82) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 87) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function array_reverse (line 106) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function textarr (line 114) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 125) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 152) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 175) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 181) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 188) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 196) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 214) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 248) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 252) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 262) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 313) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 330) | CREATE OR REPLACE FUNCTION partition_count(
  function partition_checks (line 387) | CREATE OR REPLACE FUNCTION partition_checks(
  function bbox_geom (line 1099) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function cql_and_append (line 1125) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 1142) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1316) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1454) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function sort_dir_to_op (line 1493) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function field_orderby (line 1506) | CREATE OR REPLACE FUNCTION field_orderby(p text) RETURNS text AS $$
  function sort_sqlorderby (line 1514) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1540) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1545) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1652) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1656) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 1660) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 1670) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 1683) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  function where_stats (line 1685) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search (line 1859) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2029) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2046) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2052) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 2192) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.4.0-0.4.1.sql
  type search_wheres_where (line 8) | CREATE UNIQUE INDEX search_wheres_where ON pgstac.search_wheres USING bt...
  type search_wheres_pkey (line 10) | CREATE UNIQUE INDEX search_wheres_pkey ON pgstac.search_wheres USING btr...

FILE: src/pgstac/migrations/pgstac.0.4.0.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function get_version (line 10) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 14) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 21) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 36) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 45) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 50) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 55) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 60) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 65) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 77) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 85) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 90) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 95) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function array_reverse (line 114) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function textarr (line 122) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 133) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 160) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 183) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 189) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 196) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 204) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 222) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 256) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 260) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 270) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 321) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 338) | CREATE OR REPLACE FUNCTION partition_count(
  function partition_checks (line 395) | CREATE OR REPLACE FUNCTION partition_checks(
  function bbox_geom (line 1115) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function cql_and_append (line 1141) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 1158) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1332) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1668) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function parse_sort_dir (line 1692) | CREATE OR REPLACE FUNCTION parse_sort_dir(_dir text, reverse boolean def...
  function sort_dir_to_op (line 1704) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function field_orderby (line 1717) | CREATE OR REPLACE FUNCTION field_orderby(p text) RETURNS text AS $$
  function sort_sqlorderby (line 1725) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1751) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1756) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1863) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1867) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 1871) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 1881) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 1894) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  function where_stats (line 1896) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search (line 2070) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2240) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2257) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2263) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 2403) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.4.1-0.4.2.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.cql2_query(j jsonb, recursion integer ...
  function pgstac (line 173) | CREATE OR REPLACE FUNCTION pgstac.parse_dtrange(_indate jsonb, OUT _tstz...

FILE: src/pgstac/migrations/pgstac.0.4.1.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function get_version (line 10) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 14) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 21) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 36) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 45) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 50) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 55) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 60) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 65) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 77) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 85) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 90) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 95) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function array_reverse (line 114) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function textarr (line 122) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 133) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 160) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 183) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 189) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 196) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 204) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 222) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 256) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 260) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 270) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 321) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 338) | CREATE OR REPLACE FUNCTION partition_count(
  function partition_checks (line 395) | CREATE OR REPLACE FUNCTION partition_checks(
  function bbox_geom (line 1115) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function cql_and_append (line 1141) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 1158) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1332) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1668) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function parse_sort_dir (line 1698) | CREATE OR REPLACE FUNCTION parse_sort_dir(_dir text, reverse boolean def...
  function sort_dir_to_op (line 1710) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function field_orderby (line 1723) | CREATE OR REPLACE FUNCTION field_orderby(p text) RETURNS text AS $$
  function sort_sqlorderby (line 1731) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1757) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1762) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1869) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1873) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 1877) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 1886) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 1900) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 1901) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 1903) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search (line 2078) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2248) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2265) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2271) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 2411) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.4.2-0.4.3.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.cql2_query(j jsonb, recursion integer ...

FILE: src/pgstac/migrations/pgstac.0.4.2.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function get_version (line 10) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 14) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 21) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 36) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 45) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 50) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 55) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 60) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 65) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 77) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 85) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 90) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 95) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function array_reverse (line 114) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function textarr (line 122) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 133) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 160) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 183) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 189) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 196) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 204) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 222) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 256) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 260) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 270) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 321) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 338) | CREATE OR REPLACE FUNCTION partition_count(
  function partition_checks (line 395) | CREATE OR REPLACE FUNCTION partition_checks(
  function bbox_geom (line 1119) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function cql_and_append (line 1145) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 1162) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1336) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1676) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function parse_sort_dir (line 1706) | CREATE OR REPLACE FUNCTION parse_sort_dir(_dir text, reverse boolean def...
  function sort_dir_to_op (line 1718) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function field_orderby (line 1731) | CREATE OR REPLACE FUNCTION field_orderby(p text) RETURNS text AS $$
  function sort_sqlorderby (line 1739) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1765) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1770) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1877) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1881) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 1885) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 1894) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 1908) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 1909) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 1911) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search (line 2086) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2256) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2273) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2279) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 2419) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.4.3-0.4.4.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.base_stac_query(j jsonb)
  function pgstac (line 51) | CREATE OR REPLACE FUNCTION pgstac.item_by_id(_id text)
  function pgstac (line 100) | CREATE OR REPLACE FUNCTION pgstac.get_token_filter(_search jsonb DEFAULT...
  function pgstac (line 211) | CREATE OR REPLACE FUNCTION pgstac.search(_search jsonb DEFAULT '{}'::jsonb)

FILE: src/pgstac/migrations/pgstac.0.4.3.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function get_version (line 10) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 14) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 21) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 36) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 45) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 50) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 55) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 60) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 65) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 77) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 85) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 90) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 95) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function array_reverse (line 114) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function textarr (line 122) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 133) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 160) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 183) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 189) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 196) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 204) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 222) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 256) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 260) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 270) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 321) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 338) | CREATE OR REPLACE FUNCTION partition_count(
  function partition_checks (line 395) | CREATE OR REPLACE FUNCTION partition_checks(
  function bbox_geom (line 1119) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function cql_and_append (line 1145) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 1162) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function cql_query_op (line 1336) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function cql_to_where (line 1676) | CREATE OR REPLACE FUNCTION cql_to_where(_search jsonb = '{}'::jsonb) RET...
  function parse_sort_dir (line 1706) | CREATE OR REPLACE FUNCTION parse_sort_dir(_dir text, reverse boolean def...
  function sort_dir_to_op (line 1718) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function field_orderby (line 1731) | CREATE OR REPLACE FUNCTION field_orderby(p text) RETURNS text AS $$
  function sort_sqlorderby (line 1739) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1765) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1770) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1877) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1881) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 1885) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 1894) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 1908) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 1909) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 1911) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search (line 2086) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2256) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2273) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2279) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 2419) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.4.4-0.4.5.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.base_stac_query(j jsonb)
  function pgstac (line 51) | CREATE OR REPLACE FUNCTION pgstac.items_staging_ignore_insert_triggerfunc()
  function pgstac (line 114) | CREATE OR REPLACE FUNCTION pgstac.search(_search jsonb DEFAULT '{}'::jsonb)

FILE: src/pgstac/migrations/pgstac.0.4.4.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function get_version (line 10) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 14) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 21) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 36) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 45) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 50) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 55) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 60) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 65) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 77) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 85) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 90) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 95) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function array_reverse (line 114) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function textarr (line 122) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 133) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 160) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 183) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 189) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 196) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 204) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 222) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 256) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 260) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 270) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 321) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 338) | CREATE OR REPLACE FUNCTION partition_count(
  function partition_checks (line 395) | CREATE OR REPLACE FUNCTION partition_checks(
  function bbox_geom (line 1129) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function cql_and_append (line 1155) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 1172) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function base_stac_query (line 1273) | CREATE OR REPLACE FUNCTION base_stac_query(j jsonb) RETURNS text AS $$
  function cql_query_op (line 1389) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function parse_sort_dir (line 1762) | CREATE OR REPLACE FUNCTION parse_sort_dir(_dir text, reverse boolean def...
  function sort_dir_to_op (line 1774) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function field_orderby (line 1787) | CREATE OR REPLACE FUNCTION field_orderby(p text) RETURNS text AS $$
  function sort_sqlorderby (line 1795) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1821) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1826) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1933) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1937) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 1941) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 1950) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 1964) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 1965) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 1967) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search (line 2143) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2326) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2343) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2349) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 2489) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.4.5-0.5.0.sql
  type migrations (line 39) | CREATE TABLE IF NOT EXISTS migrations (
  function get_version (line 44) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 48) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 55) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 71) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 79) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 83) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 88) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 93) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 98) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 110) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_intersection (line 118) | CREATE OR REPLACE FUNCTION array_intersection(_a ANYARRAY, _b ANYARRAY) ...
  function array_map_ident (line 123) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 128) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function array_reverse (line 134) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function to_int (line 141) | CREATE OR REPLACE FUNCTION to_int(jsonb) RETURNS int AS $$
  function to_float (line 145) | CREATE OR REPLACE FUNCTION to_float(jsonb) RETURNS float AS $$
  function to_tstz (line 149) | CREATE OR REPLACE FUNCTION to_tstz(jsonb) RETURNS timestamptz AS $$
  function to_text (line 154) | CREATE OR REPLACE FUNCTION to_text(jsonb) RETURNS text AS $$
  function to_text_array (line 158) | CREATE OR REPLACE FUNCTION to_text_array(jsonb) RETURNS text[] AS $$
  function bbox_geom (line 168) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function geom_bbox (line 194) | CREATE OR REPLACE FUNCTION geom_bbox(_geom geometry) RETURNS jsonb AS $$
  function flip_jsonb_array (line 203) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function stac_geom (line 207) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_daterange (line 223) | CREATE OR REPLACE FUNCTION stac_daterange(
  function stac_datetime (line 251) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 255) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  type stac_extensions (line 260) | CREATE TABLE IF NOT EXISTS stac_extensions(
  function collection_base_item (line 277) | CREATE OR REPLACE FUNCTION collection_base_item(content jsonb) RETURNS j...
  type collections (line 289) | CREATE TABLE IF NOT EXISTS collections (
  function collection_base_item (line 298) | CREATE OR REPLACE FUNCTION collection_base_item(cid text) RETURNS jsonb ...
  function table_empty (line 304) | CREATE OR REPLACE FUNCTION table_empty(text) RETURNS boolean AS $$
  function collections_trigger_func (line 318) | CREATE OR REPLACE FUNCTION collections_trigger_func() RETURNS TRIGGER AS $$
  function partition_collection (line 456) | CREATE OR REPLACE FUNCTION partition_collection(collection text, strateg...
  type partitions (line 460) | CREATE TABLE IF NOT EXISTS partitions (
  type partitions_range_idx (line 471) | CREATE INDEX partitions_range_idx ON partitions USING GIST(partition_range)
  function partitions_trigger_func (line 513) | CREATE OR REPLACE FUNCTION partitions_trigger_func() RETURNS TRIGGER AS $$
  function update_collection (line 713) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 721) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 730) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 739) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 745) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type queryables (line 749) | CREATE TABLE queryables (
  type queryables_name_idx (line 758) | CREATE INDEX queryables_name_idx ON queryables (name)
  type queryables_property_wrapper_idx (line 759) | CREATE INDEX queryables_property_wrapper_idx ON queryables (property_wra...
  function array_to_path (line 773) | CREATE OR REPLACE FUNCTION array_to_path(arr text[]) RETURNS text AS $$
  function create_queryable_indexes (line 828) | CREATE OR REPLACE FUNCTION create_queryable_indexes() RETURNS VOID AS $$
  function queryables_trigger_func (line 860) | CREATE OR REPLACE FUNCTION queryables_trigger_func() RETURNS TRIGGER AS $$
  function temporal_op_query (line 951) | CREATE OR REPLACE FUNCTION temporal_op_query(op text, args jsonb) RETURN...
  function spatial_op_query (line 994) | CREATE OR REPLACE FUNCTION spatial_op_query(op text, args jsonb) RETURNS...
  function cql1_to_cql2 (line 1049) | CREATE OR REPLACE FUNCTION cql1_to_cql2(j jsonb) RETURNS jsonb AS $$
  type cql2_ops (line 1085) | CREATE TABLE cql2_ops (
  function cql2_query (line 1119) | CREATE OR REPLACE FUNCTION cql2_query(j jsonb, wrapper text DEFAULT NULL...
  function paging_dtrange (line 1244) | CREATE OR REPLACE FUNCTION paging_dtrange(
  type items (line 1324) | CREATE TABLE items (
  type items (line 1335) | CREATE INDEX "datetime_idx" ON items USING BTREE (datetime DESC, end_dat...
  type items (line 1336) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function content_slim (line 1344) | CREATE OR REPLACE FUNCTION content_slim(_item jsonb, _collection jsonb) ...
  function content_slim (line 1367) | CREATE OR REPLACE FUNCTION content_slim(_item jsonb) RETURNS jsonb AS $$
  function content_dehydrate (line 1371) | CREATE OR REPLACE FUNCTION content_dehydrate(content jsonb) RETURNS item...
  function include_field (line 1383) | CREATE OR REPLACE FUNCTION include_field(f text, fields jsonb DEFAULT '{...
  function strip_assets (line 1402) | CREATE OR REPLACE FUNCTION key_filter(IN k text, IN val jsonb, INOUT kf ...
  function content_hydrate (line 1437) | CREATE OR REPLACE FUNCTION content_hydrate(
  function content_hydrate (line 1481) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, _collection coll...
  function content_hydrate (line 1510) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, fields jsonb DEF...
  type items_staging (line 1519) | CREATE UNLOGGED TABLE items_staging (
  type items_staging_ignore (line 1522) | CREATE UNLOGGED TABLE items_staging_ignore (
  type items_staging_upsert (line 1525) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_triggerfunc (line 1529) | CREATE OR REPLACE FUNCTION items_staging_triggerfunc() RETURNS TRIGGER A...
  function item_by_id (line 1616) | CREATE OR REPLACE FUNCTION item_by_id(_id text, _collection text DEFAULT...
  function get_item (line 1626) | CREATE OR REPLACE FUNCTION get_item(_id text, _collection text DEFAULT N...
  function delete_item (line 1630) | CREATE OR REPLACE FUNCTION delete_item(_id text, _collection text DEFAUL...
  function create_item (line 1639) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 1644) | CREATE OR REPLACE FUNCTION update_item(content jsonb) RETURNS VOID AS $$
  function upsert_item (line 1654) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function create_items (line 1658) | CREATE OR REPLACE FUNCTION create_items(data jsonb) RETURNS VOID AS $$
  function upsert_items (line 1663) | CREATE OR REPLACE FUNCTION upsert_items(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 1669) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 1675) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 1681) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type partition_steps (line 1696) | CREATE VIEW partition_steps AS
  function chunker (line 1705) | CREATE OR REPLACE FUNCTION chunker(
  function partition_queries (line 1745) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_query_view (line 1805) | CREATE OR REPLACE FUNCTION partition_query_view(
  function stac_search_to_where (line 1835) | CREATE OR REPLACE FUNCTION stac_search_to_where(j jsonb) RETURNS text AS $$
  function sort_dir_to_op (line 1922) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1936) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1965) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1970) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 2079) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 2083) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 2087) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 2096) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 2110) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 2111) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 2113) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search_query (line 2226) | CREATE OR REPLACE FUNCTION search_query(
  function search (line 2270) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2474) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2491) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2497) | CREATE OR REPLACE FUNCTION geometrysearch(
  function geojsonsearch (line 2602) | CREATE OR REPLACE FUNCTION geojsonsearch(
  function xyzsearch (line 2625) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.4.5.sql
  type migrations (line 5) | CREATE TABLE migrations (
  function get_version (line 10) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 14) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 21) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 36) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 45) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 50) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 55) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 60) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 65) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 77) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_map_ident (line 85) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 90) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function estimated_count (line 95) | CREATE OR REPLACE FUNCTION estimated_count(_where text) RETURNS bigint A...
  function array_reverse (line 114) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function textarr (line 122) | CREATE OR REPLACE FUNCTION textarr(_js jsonb)
  function jsonb_paths (line 133) | CREATE OR REPLACE FUNCTION jsonb_paths (IN jdata jsonb, OUT path text[],...
  function jsonb_obj_paths (line 160) | CREATE OR REPLACE FUNCTION jsonb_obj_paths (IN jdata jsonb, OUT path tex...
  function jsonb_val_paths (line 183) | CREATE OR REPLACE FUNCTION jsonb_val_paths (IN jdata jsonb, OUT path tex...
  function path_includes (line 189) | CREATE OR REPLACE FUNCTION path_includes(IN path text[], IN includes tex...
  function path_excludes (line 196) | CREATE OR REPLACE FUNCTION path_excludes(IN path text[], IN excludes tex...
  function jsonb_obj_paths_filtered (line 204) | CREATE OR REPLACE FUNCTION jsonb_obj_paths_filtered (
  function filter_jsonb (line 222) | CREATE OR REPLACE FUNCTION filter_jsonb(
  function flip_jsonb_array (line 256) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function create_cursor (line 260) | CREATE OR REPLACE FUNCTION create_cursor(q text) RETURNS refcursor AS $$
  function partition_queries (line 270) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_cursor (line 321) | CREATE OR REPLACE FUNCTION partition_cursor(
  function partition_count (line 338) | CREATE OR REPLACE FUNCTION partition_count(
  function partition_checks (line 395) | CREATE OR REPLACE FUNCTION partition_checks(
  function bbox_geom (line 1129) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function cql_and_append (line 1155) | CREATE OR REPLACE FUNCTION cql_and_append(existing jsonb, newfilters jso...
  function add_filters_to_cql (line 1172) | CREATE OR REPLACE FUNCTION add_filters_to_cql(j jsonb) RETURNS jsonb AS $$
  function base_stac_query (line 1273) | CREATE OR REPLACE FUNCTION base_stac_query(j jsonb) RETURNS text AS $$
  function cql_query_op (line 1389) | CREATE OR REPLACE FUNCTION cql_query_op(j jsonb, _op text DEFAULT NULL) ...
  function parse_sort_dir (line 1762) | CREATE OR REPLACE FUNCTION parse_sort_dir(_dir text, reverse boolean def...
  function sort_dir_to_op (line 1774) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function field_orderby (line 1787) | CREATE OR REPLACE FUNCTION field_orderby(p text) RETURNS text AS $$
  function sort_sqlorderby (line 1795) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1821) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1826) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 1933) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 1937) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 1941) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 1950) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 1964) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 1965) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 1967) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search (line 2143) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2326) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2343) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2349) | CREATE OR REPLACE FUNCTION geometrysearch(
  function xyzsearch (line 2489) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.5.0-0.5.1.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.content_nonhydrated(_item pgstac.items...

FILE: src/pgstac/migrations/pgstac.0.5.0.sql
  type migrations (line 37) | CREATE TABLE IF NOT EXISTS migrations (
  function get_version (line 42) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 46) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 53) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 69) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 77) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 81) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 86) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 91) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 96) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 108) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_intersection (line 116) | CREATE OR REPLACE FUNCTION array_intersection(_a ANYARRAY, _b ANYARRAY) ...
  function array_map_ident (line 121) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 126) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function array_reverse (line 132) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function to_int (line 139) | CREATE OR REPLACE FUNCTION to_int(jsonb) RETURNS int AS $$
  function to_float (line 143) | CREATE OR REPLACE FUNCTION to_float(jsonb) RETURNS float AS $$
  function to_tstz (line 147) | CREATE OR REPLACE FUNCTION to_tstz(jsonb) RETURNS timestamptz AS $$
  function to_text (line 152) | CREATE OR REPLACE FUNCTION to_text(jsonb) RETURNS text AS $$
  function to_text_array (line 156) | CREATE OR REPLACE FUNCTION to_text_array(jsonb) RETURNS text[] AS $$
  function bbox_geom (line 166) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function geom_bbox (line 192) | CREATE OR REPLACE FUNCTION geom_bbox(_geom geometry) RETURNS jsonb AS $$
  function flip_jsonb_array (line 201) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function stac_geom (line 205) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_daterange (line 221) | CREATE OR REPLACE FUNCTION stac_daterange(
  function stac_datetime (line 249) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 253) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  type stac_extensions (line 258) | CREATE TABLE IF NOT EXISTS stac_extensions(
  function collection_base_item (line 275) | CREATE OR REPLACE FUNCTION collection_base_item(content jsonb) RETURNS j...
  type collections (line 287) | CREATE TABLE IF NOT EXISTS collections (
  function collection_base_item (line 296) | CREATE OR REPLACE FUNCTION collection_base_item(cid text) RETURNS jsonb ...
  function table_empty (line 302) | CREATE OR REPLACE FUNCTION table_empty(text) RETURNS boolean AS $$
  function collections_trigger_func (line 316) | CREATE OR REPLACE FUNCTION collections_trigger_func() RETURNS TRIGGER AS $$
  function partition_collection (line 454) | CREATE OR REPLACE FUNCTION partition_collection(collection text, strateg...
  type partitions (line 458) | CREATE TABLE IF NOT EXISTS partitions (
  type partitions_range_idx (line 469) | CREATE INDEX partitions_range_idx ON partitions USING GIST(partition_range)
  function partitions_trigger_func (line 511) | CREATE OR REPLACE FUNCTION partitions_trigger_func() RETURNS TRIGGER AS $$
  function update_collection (line 711) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 719) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 728) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 737) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 743) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type queryables (line 747) | CREATE TABLE queryables (
  type queryables_name_idx (line 756) | CREATE INDEX queryables_name_idx ON queryables (name)
  type queryables_property_wrapper_idx (line 757) | CREATE INDEX queryables_property_wrapper_idx ON queryables (property_wra...
  function array_to_path (line 771) | CREATE OR REPLACE FUNCTION array_to_path(arr text[]) RETURNS text AS $$
  function create_queryable_indexes (line 826) | CREATE OR REPLACE FUNCTION create_queryable_indexes() RETURNS VOID AS $$
  function queryables_trigger_func (line 858) | CREATE OR REPLACE FUNCTION queryables_trigger_func() RETURNS TRIGGER AS $$
  function temporal_op_query (line 949) | CREATE OR REPLACE FUNCTION temporal_op_query(op text, args jsonb) RETURN...
  function spatial_op_query (line 992) | CREATE OR REPLACE FUNCTION spatial_op_query(op text, args jsonb) RETURNS...
  function cql1_to_cql2 (line 1047) | CREATE OR REPLACE FUNCTION cql1_to_cql2(j jsonb) RETURNS jsonb AS $$
  type cql2_ops (line 1083) | CREATE TABLE cql2_ops (
  function cql2_query (line 1117) | CREATE OR REPLACE FUNCTION cql2_query(j jsonb, wrapper text DEFAULT NULL...
  function paging_dtrange (line 1242) | CREATE OR REPLACE FUNCTION paging_dtrange(
  type items (line 1322) | CREATE TABLE items (
  type items (line 1333) | CREATE INDEX "datetime_idx" ON items USING BTREE (datetime DESC, end_dat...
  type items (line 1334) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function content_slim (line 1342) | CREATE OR REPLACE FUNCTION content_slim(_item jsonb, _collection jsonb) ...
  function content_slim (line 1365) | CREATE OR REPLACE FUNCTION content_slim(_item jsonb) RETURNS jsonb AS $$
  function content_dehydrate (line 1369) | CREATE OR REPLACE FUNCTION content_dehydrate(content jsonb) RETURNS item...
  function include_field (line 1381) | CREATE OR REPLACE FUNCTION include_field(f text, fields jsonb DEFAULT '{...
  function strip_assets (line 1400) | CREATE OR REPLACE FUNCTION key_filter(IN k text, IN val jsonb, INOUT kf ...
  function content_hydrate (line 1435) | CREATE OR REPLACE FUNCTION content_hydrate(
  function content_hydrate (line 1479) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, _collection coll...
  function content_hydrate (line 1508) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, fields jsonb DEF...
  type items_staging (line 1517) | CREATE UNLOGGED TABLE items_staging (
  type items_staging_ignore (line 1520) | CREATE UNLOGGED TABLE items_staging_ignore (
  type items_staging_upsert (line 1523) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_triggerfunc (line 1527) | CREATE OR REPLACE FUNCTION items_staging_triggerfunc() RETURNS TRIGGER A...
  function item_by_id (line 1614) | CREATE OR REPLACE FUNCTION item_by_id(_id text, _collection text DEFAULT...
  function get_item (line 1624) | CREATE OR REPLACE FUNCTION get_item(_id text, _collection text DEFAULT N...
  function delete_item (line 1628) | CREATE OR REPLACE FUNCTION delete_item(_id text, _collection text DEFAUL...
  function create_item (line 1637) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 1642) | CREATE OR REPLACE FUNCTION update_item(content jsonb) RETURNS VOID AS $$
  function upsert_item (line 1652) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function create_items (line 1656) | CREATE OR REPLACE FUNCTION create_items(data jsonb) RETURNS VOID AS $$
  function upsert_items (line 1661) | CREATE OR REPLACE FUNCTION upsert_items(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 1667) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 1673) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 1679) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type partition_steps (line 1694) | CREATE VIEW partition_steps AS
  function chunker (line 1703) | CREATE OR REPLACE FUNCTION chunker(
  function partition_queries (line 1743) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_query_view (line 1803) | CREATE OR REPLACE FUNCTION partition_query_view(
  function stac_search_to_where (line 1833) | CREATE OR REPLACE FUNCTION stac_search_to_where(j jsonb) RETURNS text AS $$
  function sort_dir_to_op (line 1920) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1934) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1963) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1968) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 2077) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 2081) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 2085) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 2094) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 2108) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 2109) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 2111) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search_query (line 2224) | CREATE OR REPLACE FUNCTION search_query(
  function search (line 2268) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2472) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2489) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2495) | CREATE OR REPLACE FUNCTION geometrysearch(
  function geojsonsearch (line 2600) | CREATE OR REPLACE FUNCTION geojsonsearch(
  function xyzsearch (line 2623) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.5.1-0.6.0.sql
  function pgstac (line 16) | CREATE OR REPLACE FUNCTION pgstac.content_hydrate(_base_item jsonb, _ite...
  function pgstac (line 28) | CREATE OR REPLACE FUNCTION pgstac.explode_dotpaths(j jsonb)
  function pgstac (line 37) | CREATE OR REPLACE FUNCTION pgstac.explode_dotpaths_recurse(j jsonb)
  function pgstac (line 52) | CREATE OR REPLACE FUNCTION pgstac.jsonb_exclude(j jsonb, f jsonb)
  function pgstac (line 86) | CREATE OR REPLACE FUNCTION pgstac.jsonb_include(j jsonb, f jsonb)
  function pgstac (line 176) | CREATE OR REPLACE FUNCTION pgstac.partitions_delete_trigger_func()
  function pgstac (line 195) | CREATE OR REPLACE FUNCTION pgstac.strip_jsonb(_a jsonb, _b jsonb)
  function pgstac (line 242) | CREATE OR REPLACE FUNCTION pgstac.collection_base_item(content jsonb)
  function pgstac (line 256) | CREATE OR REPLACE FUNCTION pgstac.collections_trigger_func()
  function pgstac (line 402) | CREATE OR REPLACE FUNCTION pgstac.content_hydrate(_item pgstac.items, _c...
  function pgstac (line 433) | CREATE OR REPLACE FUNCTION pgstac.content_nonhydrated(_item pgstac.items...
  function pgstac (line 457) | CREATE OR REPLACE FUNCTION pgstac.content_slim(_item jsonb)
  function pgstac (line 466) | CREATE OR REPLACE FUNCTION pgstac.delete_item(_id text, _collection text...
  function pgstac (line 478) | CREATE OR REPLACE FUNCTION pgstac.include_field(f text, fields jsonb DEF...
  function pgstac (line 520) | CREATE OR REPLACE FUNCTION pgstac.partition_name(collection text, dt tim...
  function pgstac (line 556) | CREATE OR REPLACE FUNCTION pgstac.search(_search jsonb DEFAULT '{}'::jsonb)

FILE: src/pgstac/migrations/pgstac.0.5.1.sql
  type migrations (line 37) | CREATE TABLE IF NOT EXISTS migrations (
  function get_version (line 42) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 46) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 53) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 69) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 77) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 81) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 86) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 91) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 96) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 108) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_intersection (line 116) | CREATE OR REPLACE FUNCTION array_intersection(_a ANYARRAY, _b ANYARRAY) ...
  function array_map_ident (line 121) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 126) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function array_reverse (line 132) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function to_int (line 139) | CREATE OR REPLACE FUNCTION to_int(jsonb) RETURNS int AS $$
  function to_float (line 143) | CREATE OR REPLACE FUNCTION to_float(jsonb) RETURNS float AS $$
  function to_tstz (line 147) | CREATE OR REPLACE FUNCTION to_tstz(jsonb) RETURNS timestamptz AS $$
  function to_text (line 152) | CREATE OR REPLACE FUNCTION to_text(jsonb) RETURNS text AS $$
  function to_text_array (line 156) | CREATE OR REPLACE FUNCTION to_text_array(jsonb) RETURNS text[] AS $$
  function bbox_geom (line 166) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function geom_bbox (line 192) | CREATE OR REPLACE FUNCTION geom_bbox(_geom geometry) RETURNS jsonb AS $$
  function flip_jsonb_array (line 201) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function stac_geom (line 205) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_daterange (line 221) | CREATE OR REPLACE FUNCTION stac_daterange(
  function stac_datetime (line 249) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 253) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  type stac_extensions (line 258) | CREATE TABLE IF NOT EXISTS stac_extensions(
  function collection_base_item (line 275) | CREATE OR REPLACE FUNCTION collection_base_item(content jsonb) RETURNS j...
  type collections (line 287) | CREATE TABLE IF NOT EXISTS collections (
  function collection_base_item (line 296) | CREATE OR REPLACE FUNCTION collection_base_item(cid text) RETURNS jsonb ...
  function table_empty (line 302) | CREATE OR REPLACE FUNCTION table_empty(text) RETURNS boolean AS $$
  function collections_trigger_func (line 316) | CREATE OR REPLACE FUNCTION collections_trigger_func() RETURNS TRIGGER AS $$
  function partition_collection (line 454) | CREATE OR REPLACE FUNCTION partition_collection(collection text, strateg...
  type partitions (line 458) | CREATE TABLE IF NOT EXISTS partitions (
  type partitions_range_idx (line 469) | CREATE INDEX partitions_range_idx ON partitions USING GIST(partition_range)
  function partitions_trigger_func (line 511) | CREATE OR REPLACE FUNCTION partitions_trigger_func() RETURNS TRIGGER AS $$
  function update_collection (line 711) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 719) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 728) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 737) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 743) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type queryables (line 747) | CREATE TABLE queryables (
  type queryables_name_idx (line 756) | CREATE INDEX queryables_name_idx ON queryables (name)
  type queryables_property_wrapper_idx (line 757) | CREATE INDEX queryables_property_wrapper_idx ON queryables (property_wra...
  function array_to_path (line 771) | CREATE OR REPLACE FUNCTION array_to_path(arr text[]) RETURNS text AS $$
  function create_queryable_indexes (line 826) | CREATE OR REPLACE FUNCTION create_queryable_indexes() RETURNS VOID AS $$
  function queryables_trigger_func (line 858) | CREATE OR REPLACE FUNCTION queryables_trigger_func() RETURNS TRIGGER AS $$
  function temporal_op_query (line 949) | CREATE OR REPLACE FUNCTION temporal_op_query(op text, args jsonb) RETURN...
  function spatial_op_query (line 992) | CREATE OR REPLACE FUNCTION spatial_op_query(op text, args jsonb) RETURNS...
  function cql1_to_cql2 (line 1047) | CREATE OR REPLACE FUNCTION cql1_to_cql2(j jsonb) RETURNS jsonb AS $$
  type cql2_ops (line 1083) | CREATE TABLE cql2_ops (
  function cql2_query (line 1117) | CREATE OR REPLACE FUNCTION cql2_query(j jsonb, wrapper text DEFAULT NULL...
  function paging_dtrange (line 1242) | CREATE OR REPLACE FUNCTION paging_dtrange(
  type items (line 1322) | CREATE TABLE items (
  type items (line 1333) | CREATE INDEX "datetime_idx" ON items USING BTREE (datetime DESC, end_dat...
  type items (line 1334) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function content_slim (line 1342) | CREATE OR REPLACE FUNCTION content_slim(_item jsonb, _collection jsonb) ...
  function content_slim (line 1365) | CREATE OR REPLACE FUNCTION content_slim(_item jsonb) RETURNS jsonb AS $$
  function content_dehydrate (line 1369) | CREATE OR REPLACE FUNCTION content_dehydrate(content jsonb) RETURNS item...
  function include_field (line 1381) | CREATE OR REPLACE FUNCTION include_field(f text, fields jsonb DEFAULT '{...
  function strip_assets (line 1400) | CREATE OR REPLACE FUNCTION key_filter(IN k text, IN val jsonb, INOUT kf ...
  function content_hydrate (line 1435) | CREATE OR REPLACE FUNCTION content_hydrate(
  function content_hydrate (line 1479) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, _collection coll...
  function content_nonhydrated (line 1508) | CREATE OR REPLACE FUNCTION content_nonhydrated(
  function content_hydrate (line 1533) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, fields jsonb DEF...
  type items_staging (line 1542) | CREATE UNLOGGED TABLE items_staging (
  type items_staging_ignore (line 1545) | CREATE UNLOGGED TABLE items_staging_ignore (
  type items_staging_upsert (line 1548) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_triggerfunc (line 1552) | CREATE OR REPLACE FUNCTION items_staging_triggerfunc() RETURNS TRIGGER A...
  function item_by_id (line 1639) | CREATE OR REPLACE FUNCTION item_by_id(_id text, _collection text DEFAULT...
  function get_item (line 1649) | CREATE OR REPLACE FUNCTION get_item(_id text, _collection text DEFAULT N...
  function delete_item (line 1653) | CREATE OR REPLACE FUNCTION delete_item(_id text, _collection text DEFAUL...
  function create_item (line 1662) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function update_item (line 1667) | CREATE OR REPLACE FUNCTION update_item(content jsonb) RETURNS VOID AS $$
  function upsert_item (line 1677) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function create_items (line 1681) | CREATE OR REPLACE FUNCTION create_items(data jsonb) RETURNS VOID AS $$
  function upsert_items (line 1686) | CREATE OR REPLACE FUNCTION upsert_items(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 1692) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 1698) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 1704) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type partition_steps (line 1719) | CREATE VIEW partition_steps AS
  function chunker (line 1728) | CREATE OR REPLACE FUNCTION chunker(
  function partition_queries (line 1768) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_query_view (line 1828) | CREATE OR REPLACE FUNCTION partition_query_view(
  function stac_search_to_where (line 1858) | CREATE OR REPLACE FUNCTION stac_search_to_where(j jsonb) RETURNS text AS $$
  function sort_dir_to_op (line 1945) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 1959) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 1988) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 1993) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 2102) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 2106) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 2110) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 2119) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 2133) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 2134) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 2136) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search_query (line 2249) | CREATE OR REPLACE FUNCTION search_query(
  function search (line 2293) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2507) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2524) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2530) | CREATE OR REPLACE FUNCTION geometrysearch(
  function geojsonsearch (line 2635) | CREATE OR REPLACE FUNCTION geojsonsearch(
  function xyzsearch (line 2658) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.6.0-0.6.1.sql
  function pgstac (line 4) | CREATE OR REPLACE FUNCTION pgstac.to_text(jsonb)

FILE: src/pgstac/migrations/pgstac.0.6.0.sql
  type migrations (line 37) | CREATE TABLE IF NOT EXISTS migrations (
  function get_version (line 42) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 46) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 53) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 69) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 77) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 81) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 86) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 91) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 96) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 108) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_intersection (line 116) | CREATE OR REPLACE FUNCTION array_intersection(_a ANYARRAY, _b ANYARRAY) ...
  function array_map_ident (line 121) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 126) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function array_reverse (line 132) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function to_int (line 139) | CREATE OR REPLACE FUNCTION to_int(jsonb) RETURNS int AS $$
  function to_float (line 143) | CREATE OR REPLACE FUNCTION to_float(jsonb) RETURNS float AS $$
  function to_tstz (line 147) | CREATE OR REPLACE FUNCTION to_tstz(jsonb) RETURNS timestamptz AS $$
  function to_text (line 152) | CREATE OR REPLACE FUNCTION to_text(jsonb) RETURNS text AS $$
  function to_text_array (line 156) | CREATE OR REPLACE FUNCTION to_text_array(jsonb) RETURNS text[] AS $$
  function bbox_geom (line 166) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function geom_bbox (line 192) | CREATE OR REPLACE FUNCTION geom_bbox(_geom geometry) RETURNS jsonb AS $$
  function flip_jsonb_array (line 201) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function explode_dotpaths (line 206) | CREATE OR REPLACE FUNCTION explode_dotpaths(j jsonb) RETURNS SETOF text[...
  function explode_dotpaths_recurse (line 210) | CREATE OR REPLACE FUNCTION explode_dotpaths_recurse(IN j jsonb) RETURNS ...
  function jsonb_set_nested (line 221) | CREATE OR REPLACE FUNCTION jsonb_set_nested(j jsonb, path text[], val js...
  function merge_jsonb (line 284) | CREATE OR REPLACE FUNCTION merge_jsonb(_a jsonb, _b jsonb) RETURNS jsonb...
  function strip_jsonb (line 323) | CREATE OR REPLACE FUNCTION strip_jsonb(_a jsonb, _b jsonb) RETURNS jsonb...
  function stac_geom (line 365) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_daterange (line 381) | CREATE OR REPLACE FUNCTION stac_daterange(
  function stac_datetime (line 415) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 419) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  type stac_extensions (line 424) | CREATE TABLE IF NOT EXISTS stac_extensions(
  function collection_base_item (line 441) | CREATE OR REPLACE FUNCTION collection_base_item(content jsonb) RETURNS j...
  type collections (line 452) | CREATE TABLE IF NOT EXISTS collections (
  function collection_base_item (line 461) | CREATE OR REPLACE FUNCTION collection_base_item(cid text) RETURNS jsonb ...
  function table_empty (line 467) | CREATE OR REPLACE FUNCTION table_empty(text) RETURNS boolean AS $$
  function collections_trigger_func (line 481) | CREATE OR REPLACE FUNCTION collections_trigger_func() RETURNS TRIGGER AS $$
  function partition_collection (line 625) | CREATE OR REPLACE FUNCTION partition_collection(collection text, strateg...
  type partitions (line 629) | CREATE TABLE IF NOT EXISTS partitions (
  type partitions_range_idx (line 640) | CREATE INDEX partitions_range_idx ON partitions USING GIST(partition_range)
  function partitions_delete_trigger_func (line 642) | CREATE OR REPLACE FUNCTION partitions_delete_trigger_func() RETURNS TRIG...
  function partitions_trigger_func (line 698) | CREATE OR REPLACE FUNCTION partitions_trigger_func() RETURNS TRIGGER AS $$
  function update_collection (line 898) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 906) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 915) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 924) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 930) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type queryables (line 934) | CREATE TABLE queryables (
  type queryables_name_idx (line 943) | CREATE INDEX queryables_name_idx ON queryables (name)
  type queryables_property_wrapper_idx (line 944) | CREATE INDEX queryables_property_wrapper_idx ON queryables (property_wra...
  function array_to_path (line 958) | CREATE OR REPLACE FUNCTION array_to_path(arr text[]) RETURNS text AS $$
  function create_queryable_indexes (line 1013) | CREATE OR REPLACE FUNCTION create_queryable_indexes() RETURNS VOID AS $$
  function queryables_trigger_func (line 1045) | CREATE OR REPLACE FUNCTION queryables_trigger_func() RETURNS TRIGGER AS $$
  function temporal_op_query (line 1136) | CREATE OR REPLACE FUNCTION temporal_op_query(op text, args jsonb) RETURN...
  function spatial_op_query (line 1179) | CREATE OR REPLACE FUNCTION spatial_op_query(op text, args jsonb) RETURNS...
  function cql1_to_cql2 (line 1234) | CREATE OR REPLACE FUNCTION cql1_to_cql2(j jsonb) RETURNS jsonb AS $$
  type cql2_ops (line 1270) | CREATE TABLE cql2_ops (
  function cql2_query (line 1304) | CREATE OR REPLACE FUNCTION cql2_query(j jsonb, wrapper text DEFAULT NULL...
  function paging_dtrange (line 1429) | CREATE OR REPLACE FUNCTION paging_dtrange(
  type items (line 1509) | CREATE TABLE items (
  type items (line 1520) | CREATE INDEX "datetime_idx" ON items USING BTREE (datetime DESC, end_dat...
  type items (line 1521) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function content_slim (line 1529) | CREATE OR REPLACE FUNCTION content_slim(_item jsonb) RETURNS jsonb AS $$
  function content_dehydrate (line 1533) | CREATE OR REPLACE FUNCTION content_dehydrate(content jsonb) RETURNS item...
  function include_field (line 1544) | CREATE OR REPLACE FUNCTION include_field(f text, fields jsonb DEFAULT '{...
  function content_hydrate (line 1582) | CREATE OR REPLACE FUNCTION content_hydrate(
  function content_hydrate (line 1595) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, _collection coll...
  function content_nonhydrated (line 1621) | CREATE OR REPLACE FUNCTION content_nonhydrated(
  function content_hydrate (line 1643) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, fields jsonb DEF...
  type items_staging (line 1652) | CREATE UNLOGGED TABLE items_staging (
  type items_staging_ignore (line 1655) | CREATE UNLOGGED TABLE items_staging_ignore (
  type items_staging_upsert (line 1658) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_triggerfunc (line 1662) | CREATE OR REPLACE FUNCTION items_staging_triggerfunc() RETURNS TRIGGER A...
  function item_by_id (line 1749) | CREATE OR REPLACE FUNCTION item_by_id(_id text, _collection text DEFAULT...
  function get_item (line 1759) | CREATE OR REPLACE FUNCTION get_item(_id text, _collection text DEFAULT N...
  function delete_item (line 1763) | CREATE OR REPLACE FUNCTION delete_item(_id text, _collection text DEFAUL...
  function create_item (line 1772) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 1787) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function create_items (line 1791) | CREATE OR REPLACE FUNCTION create_items(data jsonb) RETURNS VOID AS $$
  function upsert_items (line 1796) | CREATE OR REPLACE FUNCTION upsert_items(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 1802) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 1808) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 1814) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type partition_steps (line 1829) | CREATE VIEW partition_steps AS
  function chunker (line 1838) | CREATE OR REPLACE FUNCTION chunker(
  function partition_queries (line 1878) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_query_view (line 1938) | CREATE OR REPLACE FUNCTION partition_query_view(
  function stac_search_to_where (line 1968) | CREATE OR REPLACE FUNCTION stac_search_to_where(j jsonb) RETURNS text AS $$
  function sort_dir_to_op (line 2055) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 2069) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 2098) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 2103) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 2212) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 2216) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 2220) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 2229) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 2243) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 2244) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 2246) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search_query (line 2359) | CREATE OR REPLACE FUNCTION search_query(
  function search (line 2403) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2621) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2638) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2644) | CREATE OR REPLACE FUNCTION geometrysearch(
  function geojsonsearch (line 2749) | CREATE OR REPLACE FUNCTION geojsonsearch(
  function xyzsearch (line 2772) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.6.1.sql
  type migrations (line 37) | CREATE TABLE IF NOT EXISTS migrations (
  function get_version (line 42) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 46) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 53) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 69) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 77) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 81) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 86) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 91) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 96) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 108) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_intersection (line 116) | CREATE OR REPLACE FUNCTION array_intersection(_a ANYARRAY, _b ANYARRAY) ...
  function array_map_ident (line 121) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 126) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function array_reverse (line 132) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function to_int (line 139) | CREATE OR REPLACE FUNCTION to_int(jsonb) RETURNS int AS $$
  function to_float (line 143) | CREATE OR REPLACE FUNCTION to_float(jsonb) RETURNS float AS $$
  function to_tstz (line 147) | CREATE OR REPLACE FUNCTION to_tstz(jsonb) RETURNS timestamptz AS $$
  function to_text (line 152) | CREATE OR REPLACE FUNCTION to_text(jsonb) RETURNS text AS $$
  function to_text_array (line 156) | CREATE OR REPLACE FUNCTION to_text_array(jsonb) RETURNS text[] AS $$
  function bbox_geom (line 166) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function geom_bbox (line 192) | CREATE OR REPLACE FUNCTION geom_bbox(_geom geometry) RETURNS jsonb AS $$
  function flip_jsonb_array (line 201) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function explode_dotpaths (line 206) | CREATE OR REPLACE FUNCTION explode_dotpaths(j jsonb) RETURNS SETOF text[...
  function explode_dotpaths_recurse (line 210) | CREATE OR REPLACE FUNCTION explode_dotpaths_recurse(IN j jsonb) RETURNS ...
  function jsonb_set_nested (line 221) | CREATE OR REPLACE FUNCTION jsonb_set_nested(j jsonb, path text[], val js...
  function merge_jsonb (line 284) | CREATE OR REPLACE FUNCTION merge_jsonb(_a jsonb, _b jsonb) RETURNS jsonb...
  function strip_jsonb (line 323) | CREATE OR REPLACE FUNCTION strip_jsonb(_a jsonb, _b jsonb) RETURNS jsonb...
  function stac_geom (line 365) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_daterange (line 381) | CREATE OR REPLACE FUNCTION stac_daterange(
  function stac_datetime (line 415) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 419) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  type stac_extensions (line 424) | CREATE TABLE IF NOT EXISTS stac_extensions(
  function collection_base_item (line 441) | CREATE OR REPLACE FUNCTION collection_base_item(content jsonb) RETURNS j...
  type collections (line 452) | CREATE TABLE IF NOT EXISTS collections (
  function collection_base_item (line 461) | CREATE OR REPLACE FUNCTION collection_base_item(cid text) RETURNS jsonb ...
  function table_empty (line 467) | CREATE OR REPLACE FUNCTION table_empty(text) RETURNS boolean AS $$
  function collections_trigger_func (line 481) | CREATE OR REPLACE FUNCTION collections_trigger_func() RETURNS TRIGGER AS $$
  function partition_collection (line 625) | CREATE OR REPLACE FUNCTION partition_collection(collection text, strateg...
  type partitions (line 629) | CREATE TABLE IF NOT EXISTS partitions (
  type partitions_range_idx (line 640) | CREATE INDEX partitions_range_idx ON partitions USING GIST(partition_range)
  function partitions_delete_trigger_func (line 642) | CREATE OR REPLACE FUNCTION partitions_delete_trigger_func() RETURNS TRIG...
  function partitions_trigger_func (line 698) | CREATE OR REPLACE FUNCTION partitions_trigger_func() RETURNS TRIGGER AS $$
  function update_collection (line 898) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 906) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 915) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 924) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 930) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type queryables (line 934) | CREATE TABLE queryables (
  type queryables_name_idx (line 943) | CREATE INDEX queryables_name_idx ON queryables (name)
  type queryables_property_wrapper_idx (line 944) | CREATE INDEX queryables_property_wrapper_idx ON queryables (property_wra...
  function array_to_path (line 958) | CREATE OR REPLACE FUNCTION array_to_path(arr text[]) RETURNS text AS $$
  function create_queryable_indexes (line 1013) | CREATE OR REPLACE FUNCTION create_queryable_indexes() RETURNS VOID AS $$
  function queryables_trigger_func (line 1045) | CREATE OR REPLACE FUNCTION queryables_trigger_func() RETURNS TRIGGER AS $$
  function temporal_op_query (line 1136) | CREATE OR REPLACE FUNCTION temporal_op_query(op text, args jsonb) RETURN...
  function spatial_op_query (line 1179) | CREATE OR REPLACE FUNCTION spatial_op_query(op text, args jsonb) RETURNS...
  function cql1_to_cql2 (line 1234) | CREATE OR REPLACE FUNCTION cql1_to_cql2(j jsonb) RETURNS jsonb AS $$
  type cql2_ops (line 1270) | CREATE TABLE cql2_ops (
  function cql2_query (line 1304) | CREATE OR REPLACE FUNCTION cql2_query(j jsonb, wrapper text DEFAULT NULL...
  function paging_dtrange (line 1429) | CREATE OR REPLACE FUNCTION paging_dtrange(
  type items (line 1509) | CREATE TABLE items (
  type items (line 1520) | CREATE INDEX "datetime_idx" ON items USING BTREE (datetime DESC, end_dat...
  type items (line 1521) | CREATE INDEX "geometry_idx" ON items USING GIST (geometry)
  function content_slim (line 1529) | CREATE OR REPLACE FUNCTION content_slim(_item jsonb) RETURNS jsonb AS $$
  function content_dehydrate (line 1533) | CREATE OR REPLACE FUNCTION content_dehydrate(content jsonb) RETURNS item...
  function include_field (line 1544) | CREATE OR REPLACE FUNCTION include_field(f text, fields jsonb DEFAULT '{...
  function content_hydrate (line 1582) | CREATE OR REPLACE FUNCTION content_hydrate(
  function content_hydrate (line 1595) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, _collection coll...
  function content_nonhydrated (line 1621) | CREATE OR REPLACE FUNCTION content_nonhydrated(
  function content_hydrate (line 1643) | CREATE OR REPLACE FUNCTION content_hydrate(_item items, fields jsonb DEF...
  type items_staging (line 1652) | CREATE UNLOGGED TABLE items_staging (
  type items_staging_ignore (line 1655) | CREATE UNLOGGED TABLE items_staging_ignore (
  type items_staging_upsert (line 1658) | CREATE UNLOGGED TABLE items_staging_upsert (
  function items_staging_triggerfunc (line 1662) | CREATE OR REPLACE FUNCTION items_staging_triggerfunc() RETURNS TRIGGER A...
  function item_by_id (line 1749) | CREATE OR REPLACE FUNCTION item_by_id(_id text, _collection text DEFAULT...
  function get_item (line 1759) | CREATE OR REPLACE FUNCTION get_item(_id text, _collection text DEFAULT N...
  function delete_item (line 1763) | CREATE OR REPLACE FUNCTION delete_item(_id text, _collection text DEFAUL...
  function create_item (line 1772) | CREATE OR REPLACE FUNCTION create_item(data jsonb) RETURNS VOID AS $$
  function upsert_item (line 1787) | CREATE OR REPLACE FUNCTION upsert_item(data jsonb) RETURNS VOID AS $$
  function create_items (line 1791) | CREATE OR REPLACE FUNCTION create_items(data jsonb) RETURNS VOID AS $$
  function upsert_items (line 1796) | CREATE OR REPLACE FUNCTION upsert_items(data jsonb) RETURNS VOID AS $$
  function collection_bbox (line 1802) | CREATE OR REPLACE FUNCTION collection_bbox(id text) RETURNS jsonb AS $$
  function collection_temporal_extent (line 1808) | CREATE OR REPLACE FUNCTION collection_temporal_extent(id text) RETURNS j...
  function update_collection_extents (line 1814) | CREATE OR REPLACE FUNCTION update_collection_extents() RETURNS VOID AS $$
  type partition_steps (line 1829) | CREATE VIEW partition_steps AS
  function chunker (line 1838) | CREATE OR REPLACE FUNCTION chunker(
  function partition_queries (line 1878) | CREATE OR REPLACE FUNCTION partition_queries(
  function partition_query_view (line 1938) | CREATE OR REPLACE FUNCTION partition_query_view(
  function stac_search_to_where (line 1968) | CREATE OR REPLACE FUNCTION stac_search_to_where(j jsonb) RETURNS text AS $$
  function sort_dir_to_op (line 2055) | CREATE OR REPLACE FUNCTION sort_dir_to_op(_dir text, prev boolean defaul...
  function sort_sqlorderby (line 2069) | CREATE OR REPLACE FUNCTION sort_sqlorderby(
  function get_sort_dir (line 2098) | CREATE OR REPLACE FUNCTION get_sort_dir(sort_item jsonb) RETURNS text AS $$
  function get_token_filter (line 2103) | CREATE OR REPLACE FUNCTION get_token_filter(_search jsonb = '{}'::jsonb,...
  function search_tohash (line 2212) | CREATE OR REPLACE FUNCTION search_tohash(jsonb) RETURNS jsonb AS $$
  function search_hash (line 2216) | CREATE OR REPLACE FUNCTION search_hash(jsonb, jsonb) RETURNS text AS $$
  type searches (line 2220) | CREATE TABLE IF NOT EXISTS searches(
  type search_wheres (line 2229) | CREATE TABLE IF NOT EXISTS search_wheres(
  type search_wheres_partitions (line 2243) | CREATE INDEX IF NOT EXISTS search_wheres_partitions ON search_wheres USI...
  type search_wheres_where (line 2244) | CREATE UNIQUE INDEX IF NOT EXISTS search_wheres_where ON search_wheres (...
  function where_stats (line 2246) | CREATE OR REPLACE FUNCTION where_stats(inwhere text, updatestats boolean...
  function search_query (line 2359) | CREATE OR REPLACE FUNCTION search_query(
  function search (line 2403) | CREATE OR REPLACE FUNCTION search(_search jsonb = '{}'::jsonb) RETURNS j...
  function tileenvelope (line 2621) | CREATE OR REPLACE FUNCTION tileenvelope(zoom int, x int, y int) RETURNS ...
  function ftime (line 2638) | CREATE OR REPLACE FUNCTION ftime() RETURNS interval as $$
  function geometrysearch (line 2644) | CREATE OR REPLACE FUNCTION geometrysearch(
  function geojsonsearch (line 2749) | CREATE OR REPLACE FUNCTION geojsonsearch(
  function xyzsearch (line 2772) | CREATE OR REPLACE FUNCTION xyzsearch(

FILE: src/pgstac/migrations/pgstac.0.6.10.sql
  type migrations (line 37) | CREATE TABLE IF NOT EXISTS migrations (
  function get_version (line 42) | CREATE OR REPLACE FUNCTION get_version() RETURNS text AS $$
  function set_version (line 46) | CREATE OR REPLACE FUNCTION set_version(text) RETURNS text AS $$
  type pgstac_settings (line 53) | CREATE TABLE IF NOT EXISTS pgstac_settings (
  function get_setting (line 69) | CREATE OR REPLACE FUNCTION get_setting(IN _setting text, IN conf jsonb D...
  function context (line 77) | CREATE OR REPLACE FUNCTION context(conf jsonb DEFAULT NULL) RETURNS text...
  function context_estimated_count (line 81) | CREATE OR REPLACE FUNCTION context_estimated_count(conf jsonb DEFAULT NU...
  function context_estimated_cost (line 86) | CREATE OR REPLACE FUNCTION context_estimated_cost(conf jsonb DEFAULT NUL...
  function context_stats_ttl (line 91) | CREATE OR REPLACE FUNCTION context_stats_ttl(conf jsonb DEFAULT NULL) RE...
  function notice (line 96) | CREATE OR REPLACE FUNCTION notice(VARIADIC text[]) RETURNS boolean AS $$
  function empty_arr (line 108) | CREATE OR REPLACE FUNCTION empty_arr(ANYARRAY) RETURNS BOOLEAN AS $$
  function array_intersection (line 116) | CREATE OR REPLACE FUNCTION array_intersection(_a ANYARRAY, _b ANYARRAY) ...
  function array_map_ident (line 121) | CREATE OR REPLACE FUNCTION array_map_ident(_a text[])
  function array_map_literal (line 126) | CREATE OR REPLACE FUNCTION array_map_literal(_a text[])
  function array_reverse (line 132) | CREATE OR REPLACE FUNCTION array_reverse(anyarray) RETURNS anyarray AS $$
  function to_int (line 139) | CREATE OR REPLACE FUNCTION to_int(jsonb) RETURNS int AS $$
  function to_float (line 143) | CREATE OR REPLACE FUNCTION to_float(jsonb) RETURNS float AS $$
  function to_tstz (line 147) | CREATE OR REPLACE FUNCTION to_tstz(jsonb) RETURNS timestamptz AS $$
  function to_text (line 152) | CREATE OR REPLACE FUNCTION to_text(jsonb) RETURNS text AS $$
  function to_text_array (line 156) | CREATE OR REPLACE FUNCTION to_text_array(jsonb) RETURNS text[] AS $$
  function bbox_geom (line 165) | CREATE OR REPLACE FUNCTION bbox_geom(_bbox jsonb) RETURNS geometry AS $$
  function geom_bbox (line 191) | CREATE OR REPLACE FUNCTION geom_bbox(_geom geometry) RETURNS jsonb AS $$
  function flip_jsonb_array (line 200) | CREATE OR REPLACE FUNCTION flip_jsonb_array(j jsonb) RETURNS jsonb AS $$
  function explode_dotpaths (line 205) | CREATE OR REPLACE FUNCTION explode_dotpaths(j jsonb) RETURNS SETOF text[...
  function explode_dotpaths_recurse (line 209) | CREATE OR REPLACE FUNCTION explode_dotpaths_recurse(IN j jsonb) RETURNS ...
  function jsonb_set_nested (line 220) | CREATE OR REPLACE FUNCTION jsonb_set_nested(j jsonb, path text[], val js...
  function merge_jsonb (line 283) | CREATE OR REPLACE FUNCTION merge_jsonb(_a jsonb, _b jsonb) RETURNS jsonb...
  function strip_jsonb (line 322) | CREATE OR REPLACE FUNCTION strip_jsonb(_a jsonb, _b jsonb) RETURNS jsonb...
  function stac_geom (line 364) | CREATE OR REPLACE FUNCTION stac_geom(value jsonb) RETURNS geometry AS $$
  function stac_daterange (line 380) | CREATE OR REPLACE FUNCTION stac_daterange(
  function stac_datetime (line 414) | CREATE OR REPLACE FUNCTION stac_datetime(value jsonb) RETURNS timestampt...
  function stac_end_datetime (line 418) | CREATE OR REPLACE FUNCTION stac_end_datetime(value jsonb) RETURNS timest...
  type stac_extensions (line 423) | CREATE TABLE IF NOT EXISTS stac_extensions(
  function collection_base_item (line 440) | CREATE OR REPLACE FUNCTION collection_base_item(content jsonb) RETURNS j...
  type collections (line 451) | CREATE TABLE IF NOT EXISTS collections (
  function collection_base_item (line 460) | CREATE OR REPLACE FUNCTION collection_base_item(cid text) RETURNS jsonb ...
  function table_empty (line 466) | CREATE OR REPLACE FUNCTION table_empty(text) RETURNS boolean AS $$
  function collections_trigger_func (line 480) | CREATE OR REPLACE FUNCTION collections_trigger_func() RETURNS TRIGGER AS $$
  function partition_collection (line 624) | CREATE OR REPLACE FUNCTION partition_collection(collection text, strateg...
  type partitions (line 628) | CREATE TABLE IF NOT EXISTS partitions (
  type partitions_range_idx (line 639) | CREATE INDEX partitions_range_idx ON partitions USING GIST(partition_range)
  function partitions_delete_trigger_func (line 641) | CREATE OR REPLACE FUNCTION partitions_delete_trigger_func() RETURNS TRIG...
  function partitions_trigger_func (line 697) | CREATE OR REPLACE FUNCTION partitions_trigger_func() RETURNS TRIGGER AS $$
  function update_collection (line 897) | CREATE OR REPLACE FUNCTION update_collection(data jsonb) RETURNS VOID AS $$
  function upsert_collection (line 905) | CREATE OR REPLACE FUNCTION upsert_collection(data jsonb) RETURNS VOID AS $$
  function delete_collection (line 914) | CREATE OR REPLACE FUNCTION delete_collection(_id text) RETURNS VOID AS $$
  function get_collection (line 923) | CREATE OR REPLACE FUNCTION get_collection(id text) RETURNS jsonb AS $$
  function all_collections (line 929) | CREATE OR REPLACE FUNCTION all_collections() RETURNS jsonb AS $$
  type queryables (line 933) | CREATE TABLE queryables (
  type queryables_name_idx (line 942) | CREATE INDEX queryables_name_idx ON queryables (name)
  type queryables_property_wrapper_idx (line 943) | CREATE INDEX queryables_property_wrapper_idx ON queryables (property_wra...
  function array_to_path (line 956) | CREATE OR REPLACE FUNCTION array_to_path(arr text[]) RETURNS text AS $$
  function create_queryable_indexes (line 1021) | CREATE OR REPLACE FUNCTION create_queryable_indexes() RETURNS VOID AS $$
  function queryables_trigger_func (line 1053) | CREATE OR REPLACE FUNCTION queryables_trigger_func() RETURNS TRIGGER AS $$
  function get_queryables (line 1104) | CREATE OR REPLACE FUNCTION get_queryables(_collection text DEFAULT NULL)...
  function missing_queryables (line 1114) | CREATE OR REPLACE FUNCTION missing_queryables(_collection text, _tablesa...
  function missing_queryables (line 1173) | CREATE OR REPLACE FUNCTION missing_queryables(_tablesample int DEFAULT 5...
  function parse_dtrange (line 1189) | CREATE OR REPLACE FUNCTION parse_dtrange(
  function temporal_op_query (line 1267) | CREATE OR REPLACE FUNCTION temporal_op_query(op text, args jsonb) RETURN...
  function spatial_op_query (line 1310) | CREATE OR REPLACE FUNCTION spatial_op_query(op text, args jsonb) RETURNS...
  function cql1_to_cql2 (line 1365) | CREATE OR REPLACE FUNCTION cql1_to_cql2(j jsonb) RETURNS jsonb AS $$
  type cql2_ops (line 1401) | CREATE T
Copy disabled (too large) Download .json
Condensed preview — 274 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,115K chars).
[
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 123,
    "preview": "{\n\t\"name\": \"PgSTAC\",\n\t\"dockerComposeFile\": \"../docker-compose.yml\",\n\t\"service\": \"pgstac\",\n\t\"workspaceFolder\": \"/opt/src\""
  },
  {
    "path": ".dockerignore",
    "chars": 235,
    "preview": ".envrc*\n*/dist/*\n*.pyc\n*.egg-info\n*.eggs\nvenv/*\n*/.direnv/*\n*/.ruff_cache/*\n*/.pytest_cache/*\n*/.vscode/*\n*/.mypy_cache/"
  },
  {
    "path": ".editorconfig",
    "chars": 371,
    "preview": "root = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = true\ncharset = utf-8\ntrim_trailing_whitespace = true\n\n[*.sql]\ni"
  },
  {
    "path": ".github/copilot-instructions.md",
    "chars": 225,
    "preview": "# Copilot Instructions for PgSTAC\n\nSee `CLAUDE.md` for comprehensive project instructions, architecture, and workflows.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1189,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n  "
  },
  {
    "path": ".github/instructions/migrations.instructions.md",
    "chars": 436,
    "preview": "---\napplyTo: \"src/pgstac/migrations/**\"\n---\n\n# Migration Files\n\nThese files are **generated** — see CLAUDE.md \"Migration"
  },
  {
    "path": ".github/instructions/pypgstac.instructions.md",
    "chars": 434,
    "preview": "---\napplyTo: \"src/pypgstac/**\"\n---\n\n# pypgstac Python\n\nSee CLAUDE.md \"pypgstac Loader Internals\" for patterns. See AGENT"
  },
  {
    "path": ".github/instructions/scripts.instructions.md",
    "chars": 520,
    "preview": "---\napplyTo: \"scripts/**\"\n---\n\n# Build Scripts\n\nSee CLAUDE.md \"Development Workflow\" for usage. All scripts require the "
  },
  {
    "path": ".github/instructions/sql-source.instructions.md",
    "chars": 689,
    "preview": "---\napplyTo: \"src/pgstac/sql/**\"\n---\n\n# SQL Source Files\n\nSee CLAUDE.md \"Critical Rules\" for full SQL conventions.\n\n- NE"
  },
  {
    "path": ".github/prompts/add-sql-function.prompt.md",
    "chars": 634,
    "preview": "---\ndescription: \"Add a new SQL function to PgSTAC\"\n---\n\nAdd a new SQL function following PgSTAC conventions:\n\n1. Determ"
  },
  {
    "path": ".github/prompts/debug-loader.prompt.md",
    "chars": 934,
    "preview": "---\ndescription: \"Debug a pypgstac data loading issue\"\n---\n\nDiagnose a pypgstac Loader problem:\n\n1. Check which load mod"
  },
  {
    "path": ".github/prompts/stage-version.prompt.md",
    "chars": 787,
    "preview": "---\ndescription: \"Stage a new PgSTAC version and review the migration\"\n---\n\nGuide me through the PgSTAC release migratio"
  },
  {
    "path": ".github/workflows/continuous-integration.yml",
    "chars": 7236,
    "preview": "name: CI\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  workflow_dispatch:\n  schedule:\n    - cron: '23 4 * * "
  },
  {
    "path": ".github/workflows/deploy_mkdocs.yml",
    "chars": 1096,
    "preview": "name: Publish docs via GitHub Pages\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - 'README.md'\n      - 'CHAN"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 9107,
    "preview": "name: Release\n\non:\n  push:\n    tags:\n      - \"*\"\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:"
  },
  {
    "path": ".gitignore",
    "chars": 207,
    "preview": ".so\n.envrc\nsrc/pypgstac/dist\n*.pyc\n*.egg-info\n*.eggs\nvenv\nenv\n.direnv\nsrc/pypgstac/target\nsrc/pypgstac/python/pypgstac/*"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 1816,
    "preview": "# See https://pre-commit.com for more information\n# See https://pre-commit.com/hooks.html for more hooks\nrepos:\n-   repo"
  },
  {
    "path": "AGENTS.md",
    "chars": 2229,
    "preview": "# PgSTAC Agents\n\n## sql-developer\n\nPostgreSQL SQL developer for PgSTAC. Works exclusively in `src/pgstac/sql/` files. Se"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 37343,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": "CLAUDE.md",
    "chars": 8340,
    "preview": "# PgSTAC Development Instructions\n\n## Project Overview\n\nPgSTAC is a PostgreSQL extension (SQL functions + schema) for Sp"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5463,
    "preview": "# Development - Contributing\n\nPgSTAC uses a dockerized development environment.\n\nLocal-only planning notes now live unde"
  },
  {
    "path": "LICENSE",
    "chars": 1164,
    "preview": "    MIT License\n\n    Copyright (c) Microsoft Corporation and other contributors.\n\n    Permission is hereby granted, free"
  },
  {
    "path": "README.md",
    "chars": 2989,
    "preview": "\n<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/10407788/174893876-7a3b5b7a-95a5-48c4-9ff2-cc4"
  },
  {
    "path": "docker/pgstac/Dockerfile",
    "chars": 1945,
    "preview": "# syntax=docker/dockerfile:1.7\nARG PG_MAJOR=17\nARG POSTGIS_MAJOR=3\nARG PG_TLE_VERSION=1.5.2\nARG DEBIAN_SUITE=trixie\n\n# B"
  },
  {
    "path": "docker/pgstac/dbinit/pgstac.sh",
    "chars": 718,
    "preview": "SYSMEM=$(cat /proc/meminfo | grep -i 'memtotal' | grep -o '[[:digit:]]*')\nSHARED_BUFFERS=$(( $SYSMEM/4 ))\nEFFECTIVE_CACH"
  },
  {
    "path": "docker/pypgstac/Dockerfile",
    "chars": 3187,
    "preview": "# syntax=docker/dockerfile:1.7\nFROM rust:1-slim-trixie AS pyrustbase\nENV PYTHONWRITEBYTECODE=1\nENV PYTHONBUFFERED=1\nENV "
  },
  {
    "path": "docker-compose.yml",
    "chars": 1355,
    "preview": "services:\n  pgstac:\n    image: pgstac\n    env_file:\n      - .env\n    build:\n      context: .\n      network: host\n      d"
  },
  {
    "path": "docs/mkdocs.yml",
    "chars": 1543,
    "preview": "site_name: pgstac\nsite_description: PostgreSQL schema and functions for Spatio-Temporal Asset Catalog (STAC).\n\ndocs_dir:"
  },
  {
    "path": "docs/src/benchmark.json",
    "chars": 155426,
    "preview": "{\n    \"machine_info\": {\n        \"node\": \"quercus\",\n        \"processor\": \"x86_64\",\n        \"machine\": \"x86_64\",\n        \""
  },
  {
    "path": "docs/src/item_size_analysis.ipynb",
    "chars": 9586,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"f7b04830-7b6a-4e37-a2a3-9961970e06df\",\n   \"metadata\": {},\n   \"so"
  },
  {
    "path": "docs/src/pgstac.md",
    "chars": 19977,
    "preview": "\nPGDatabase Schema and Functions for Storing and Accessing STAC collections and items in PostgreSQL\n\nSTAC Client that us"
  },
  {
    "path": "docs/src/pypgstac.md",
    "chars": 9087,
    "preview": "\n\nPgSTAC includes a Python utility for bulk data loading and managing migrations.\n\npyPgSTAC is available on PyPI\n```\npyt"
  },
  {
    "path": "scripts/cibuild",
    "chars": 334,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\nset -e\n\nif"
  },
  {
    "path": "scripts/cipublish",
    "chars": 1071,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\nset -e\n\nif"
  },
  {
    "path": "scripts/console",
    "chars": 869,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\nsource \"$S"
  },
  {
    "path": "scripts/container-scripts/format",
    "chars": 503,
    "preview": "#!/bin/bash\nset -e\n\nif [[ \"${CI}\" ]]; then\n    set -x\nfi\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /d"
  },
  {
    "path": "scripts/container-scripts/initpgstac",
    "chars": 381,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd ${PGSTAC_PGSTAC_DIR:-/opt"
  },
  {
    "path": "scripts/container-scripts/loadsampledata",
    "chars": 340,
    "preview": "#!/bin/bash\nset -e\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd ${PGSTAC_PGSTAC_DI"
  },
  {
    "path": "scripts/container-scripts/makemigration",
    "chars": 4136,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\nSRCDIR=${PGSTAC_REPO_DIR:-/o"
  },
  {
    "path": "scripts/container-scripts/pgstac_restore",
    "chars": 5021,
    "preview": "#!/bin/bash\nset -e\n\nfunction usage() {\n    cat <<EOF\nUsage: $(basename \"$0\") [options] <dumpfile>\n\nRestore a PgSTAC pg_d"
  },
  {
    "path": "scripts/container-scripts/resetpgstac",
    "chars": 420,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd ${PGSTAC_PGSTAC_DIR:-/opt"
  },
  {
    "path": "scripts/container-scripts/stageversion",
    "chars": 2118,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\nSRCDIR=${PGSTAC_REPO_DIR:-/o"
  },
  {
    "path": "scripts/container-scripts/test",
    "chars": 14213,
    "preview": "#!/bin/bash\nset -e\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\nREPO_DIR=${PGSTAC_REP"
  },
  {
    "path": "scripts/format",
    "chars": 709,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\n\nfunction "
  },
  {
    "path": "scripts/makemigration",
    "chars": 1726,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\n\nfunction "
  },
  {
    "path": "scripts/migrate",
    "chars": 741,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\n\nfunction "
  },
  {
    "path": "scripts/pgstacenv",
    "chars": 826,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\n\nexport PA"
  },
  {
    "path": "scripts/runinpypgstac",
    "chars": 3701,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\nsource \"$S"
  },
  {
    "path": "scripts/server",
    "chars": 966,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\nsource \"$S"
  },
  {
    "path": "scripts/setup",
    "chars": 687,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\nset -e\n\nif"
  },
  {
    "path": "scripts/stageversion",
    "chars": 1218,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\n\nfunction "
  },
  {
    "path": "scripts/test",
    "chars": 2635,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\n\nfunction usage() {\n\tcat <<E"
  },
  {
    "path": "scripts/update",
    "chars": 725,
    "preview": "#!/bin/bash\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\ncd $SCRIPT_DIR/..\nsource \"$S"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.1.9-0.2.3.sql",
    "chars": 86,
    "preview": "SET SEARCH_PATH to pgstac, public;\nINSERT INTO migrations (version) VALUES ('0.2.3');\n"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.1.9.sql",
    "chars": 35445,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS partman;\nCREATE EXTENSION IF NOT EXISTS pg_partman S"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.3-0.2.4.sql",
    "chars": 86,
    "preview": "SET SEARCH_PATH to pgstac, public;\nINSERT INTO migrations (version) VALUES ('0.2.4');\n"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.3.sql",
    "chars": 35445,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS partman;\nCREATE EXTENSION IF NOT EXISTS pg_partman S"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.4-0.2.5.sql",
    "chars": 7132,
    "preview": "SET SEARCH_PATH TO pgstac, public;\nBEGIN;\nDROP FUNCTION IF EXISTS bbox_geom;\nCREATE OR REPLACE FUNCTION bbox_geom(_bbox "
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.4-0.2.7.sql",
    "chars": 8816,
    "preview": "SET SEARCH_PATH TO pgstac, public;\nBEGIN;\n\nCREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) RETUR"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.4.sql",
    "chars": 35445,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS partman;\nCREATE EXTENSION IF NOT EXISTS pg_partman S"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.5-0.2.7.sql",
    "chars": 1783,
    "preview": "SET SEARCH_PATH TO pgstac, public;\nBEGIN;\nCREATE OR REPLACE FUNCTION stac_query_op(att text, _op text, val jsonb) RETURN"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.5.sql",
    "chars": 35570,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS partman;\nCREATE EXTENSION IF NOT EXISTS pg_partman S"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.7-0.2.8.sql",
    "chars": 103,
    "preview": "SET SEARCH_PATH TO pgstac, public;\nBEGIN;\n\nINSERT INTO migrations (version) VALUES ('0.2.8');\n\nCOMMIT;\n"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.7.sql",
    "chars": 35570,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS partman;\nCREATE EXTENSION IF NOT EXISTS pg_partman S"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.8-0.2.9.sql",
    "chars": 86,
    "preview": "SET SEARCH_PATH to pgstac, public;\nINSERT INTO migrations (version) VALUES ('0.2.9');\n"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.8.sql",
    "chars": 30676,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS partman;\nCREATE EXTENSION IF NOT EXISTS pg_partman S"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.9-0.3.0.sql",
    "chars": 48852,
    "preview": "SET SEARCH_PATH to pgstac, public;\nALTER SCHEMA pgstac RENAME TO pgstac_bk;\n\nCREATE SCHEMA pgstac;\n\nALTER TABLE pgstac_b"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.2.9.sql",
    "chars": 30676,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS partman;\nCREATE EXTENSION IF NOT EXISTS pg_partman S"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.0-0.3.1.sql",
    "chars": 732,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.sort_sqlorderby(_"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.0.sql",
    "chars": 48316,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.1-0.3.2.sql",
    "chars": 1692,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.add_filters_to_cq"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.1.sql",
    "chars": 48318,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.2-0.3.3.sql",
    "chars": 10974,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.add_filters_to_cq"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.2.sql",
    "chars": 48321,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.3-0.3.4.sql",
    "chars": 6266,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.create_items(data"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.3.sql",
    "chars": 49082,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.4-0.3.5.sql",
    "chars": 28806,
    "preview": "SET SEARCH_PATH to pgstac, public;\n\nCREATE TEMP TABLE temp_migrations AS SELECT version, max(datetime) as datetime from "
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.4.sql",
    "chars": 55504,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.5-0.3.6.sql",
    "chars": 14273,
    "preview": "SET SEARCH_PATH to pgstac, public;\nCREATE INDEX search_wheres_partitions ON pgstac.search_wheres USING gin (partitions);"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.5.sql",
    "chars": 66800,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.6-0.4.0.sql",
    "chars": 28561,
    "preview": "SET SEARCH_PATH to pgstac, public;\ndrop function if exists \"pgstac\".\"context\"();\n\ndrop function if exists \"pgstac\".\"cont"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.3.6.sql",
    "chars": 68520,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.0-0.4.1.sql",
    "chars": 5517,
    "preview": "SET SEARCH_PATH to pgstac, public;\nalter table \"pgstac\".\"search_wheres\" drop constraint \"search_wheres_pkey\";\n\ndrop inde"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.0.sql",
    "chars": 75093,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.1-0.4.2.sql",
    "chars": 5773,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.cql2_query(j json"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.1.sql",
    "chars": 75572,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.2-0.4.3.sql",
    "chars": 4725,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.cql2_query(j json"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.2.sql",
    "chars": 75821,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.3-0.4.4.sql",
    "chars": 16274,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.base_stac_query(j"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.3.sql",
    "chars": 75829,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.4-0.4.5.sql",
    "chars": 8986,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.base_stac_query(j"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.4.sql",
    "chars": 77866,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.5-0.5.0.sql",
    "chars": 87157,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nALTER SCHEMA pgstac rename to pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.4.5.sql",
    "chars": 77907,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE SCHEMA IF NOT EXISTS pgstac;\nSET SEARCH_PATH TO pgstac, public;\n\nCREATE T"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.5.0-0.5.1.sql",
    "chars": 6474,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.content_nonhydrat"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.5.0.sql",
    "chars": 86941,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.5.1-0.6.0.sql",
    "chars": 23585,
    "preview": "SET SEARCH_PATH to pgstac, public;\nalter table \"pgstac\".\"partitions\" drop constraint \"partitions_collection_fkey\";\n\ndrop"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.5.1.sql",
    "chars": 88071,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.0-0.6.1.sql",
    "chars": 314,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.to_text(jsonb)\n R"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.0.sql",
    "chars": 91211,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.1-0.6.2.sql",
    "chars": 64,
    "preview": "SET SEARCH_PATH to pgstac, public;\nSELECT set_version('0.6.2');\n"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.1.sql",
    "chars": 91283,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.10-0.6.11.sql",
    "chars": 2395,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nUPDATE pgstac_settings SET name='default_filter_lan"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.10.sql",
    "chars": 97736,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.11-0.6.12.sql",
    "chars": 23983,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nalter table \"pgstac\".\"queryables\" drop constraint"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.11.sql",
    "chars": 97736,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.12-0.6.13.sql",
    "chars": 6177,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLA"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.12.sql",
    "chars": 109283,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.13-0.7.0.sql",
    "chars": 62266,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.13-0.7.3.sql",
    "chars": 71093,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.13.sql",
    "chars": 109380,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.2-0.6.3.sql",
    "chars": 512,
    "preview": "SET SEARCH_PATH to pgstac, public;\ndrop function if exists \"pgstac\".\"content_hydrate\"(_base_item jsonb, _item jsonb, fie"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.2.sql",
    "chars": 91283,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.3-0.6.4.sql",
    "chars": 5310,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nINSERT INTO cql2_ops (op, template, types) VALUES\n "
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.3.sql",
    "chars": 91283,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.4-0.6.5.sql",
    "chars": 4869,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.cql2_query(j json"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.4.sql",
    "chars": 92197,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.5-0.6.6.sql",
    "chars": 6513,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.cql2_query(j json"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.5.sql",
    "chars": 92719,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.6-0.6.7.sql",
    "chars": 5879,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION search(_search jsonb = '"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.6.sql",
    "chars": 93382,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.7-0.6.8.sql",
    "chars": 10806,
    "preview": "SET SEARCH_PATH to pgstac, public;\ndrop function if exists \"pgstac\".\"queryable\"(dotpath text, OUT path text, OUT express"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.7.sql",
    "chars": 93411,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.8-0.6.9.sql",
    "chars": 6043,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.search(_search js"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.8.sql",
    "chars": 97115,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.9-0.6.10.sql",
    "chars": 1323,
    "preview": "SET SEARCH_PATH to pgstac, public;\nset check_function_bodies = off;\n\nCREATE OR REPLACE FUNCTION pgstac.get_queryables(_c"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.6.9.sql",
    "chars": 97237,
    "preview": "CREATE EXTENSION IF NOT EXISTS postgis;\nCREATE EXTENSION IF NOT EXISTS btree_gist;\n\nDO $$\n  BEGIN\n    CREATE ROLE pgstac"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.0-0.7.1.sql",
    "chars": 25596,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.0.sql",
    "chars": 124326,
    "preview": "DO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXTENSION IF NO"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.1-0.7.2.sql",
    "chars": 12904,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.1.sql",
    "chars": 128205,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.10-0.8.0.sql",
    "chars": 15709,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.10.sql",
    "chars": 136748,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.2-0.7.3.sql",
    "chars": 14951,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.2.sql",
    "chars": 129117,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.3-0.7.4.sql",
    "chars": 25457,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.3.sql",
    "chars": 128564,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.4-0.7.5.sql",
    "chars": 35126,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.4.sql",
    "chars": 132826,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.5-0.7.6.sql",
    "chars": 9377,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.5.sql",
    "chars": 135003,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.6-0.7.7.sql",
    "chars": 14610,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.6.sql",
    "chars": 135016,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.7-0.7.8.sql",
    "chars": 8604,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.7.sql",
    "chars": 136039,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.8-0.7.9.sql",
    "chars": 6841,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.8.sql",
    "chars": 136063,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.9-0.7.10.sql",
    "chars": 8132,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.7.9.sql",
    "chars": 136063,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.0-0.8.1.sql",
    "chars": 7760,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.0.sql",
    "chars": 137615,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.1-0.8.2.sql",
    "chars": 46866,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.1.sql",
    "chars": 137615,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.2-0.8.3.sql",
    "chars": 12488,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.2.sql",
    "chars": 146803,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.3-0.8.4.sql",
    "chars": 9716,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.3.sql",
    "chars": 147152,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.4-0.8.5.sql",
    "chars": 15676,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.4.sql",
    "chars": 147152,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.5-0.9.0.sql",
    "chars": 40203,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.5.sql",
    "chars": 147164,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.6-0.9.0.sql",
    "chars": 40203,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.6-0.9.10.sql",
    "chars": 61841,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.8.6.sql",
    "chars": 147164,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.0-0.9.1.sql",
    "chars": 12657,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.0.sql",
    "chars": 150854,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.1-0.9.2.sql",
    "chars": 33454,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.1.sql",
    "chars": 150596,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.10-0.9.11.sql",
    "chars": 15635,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.10.sql",
    "chars": 156358,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.11-unreleased.sql",
    "chars": 10888,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.11.sql",
    "chars": 156216,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.2-0.9.3.sql",
    "chars": 13639,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.2.sql",
    "chars": 153335,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.3-0.9.4.sql",
    "chars": 10883,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.3.sql",
    "chars": 153364,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.4-0.9.5.sql",
    "chars": 10883,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.4.sql",
    "chars": 153364,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.5-0.9.6.sql",
    "chars": 10883,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.5.sql",
    "chars": 153364,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.6-0.9.7.sql",
    "chars": 13118,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.6.sql",
    "chars": 153364,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.7-0.9.8.sql",
    "chars": 16308,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.7.sql",
    "chars": 153619,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.8-0.9.9.sql",
    "chars": 14639,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.8.sql",
    "chars": 153975,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.9-0.9.10.sql",
    "chars": 18041,
    "preview": "SET client_min_messages TO WARNING;\nSET SEARCH_PATH to pgstac, public;\nRESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS ("
  },
  {
    "path": "src/pgstac/migrations/pgstac.0.9.9.sql",
    "chars": 154556,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/migrations/pgstac.unreleased.sql",
    "chars": 156220,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/pgstac.sql",
    "chars": 156220,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/sql/000_idempotent_pre.sql",
    "chars": 6261,
    "preview": "RESET ROLE;\nDO $$\nDECLARE\nBEGIN\n  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN\n    CREATE EXT"
  },
  {
    "path": "src/pgstac/sql/001_core.sql",
    "chars": 14299,
    "preview": "\nCREATE TABLE IF NOT EXISTS migrations (\n  version text PRIMARY KEY,\n  datetime timestamptz DEFAULT clock_timestamp() NO"
  },
  {
    "path": "src/pgstac/sql/001a_jsonutils.sql",
    "chars": 8695,
    "preview": "CREATE OR REPLACE FUNCTION to_int(jsonb) RETURNS int AS $$\n    SELECT floor(($1->>0)::float)::int;\n$$ LANGUAGE SQL IMMUT"
  },
  {
    "path": "src/pgstac/sql/001s_stacutils.sql",
    "chars": 2096,
    "preview": "/* looks for a geometry in a stac item first from geometry and falling back to bbox */\nCREATE OR REPLACE FUNCTION stac_g"
  },
  {
    "path": "src/pgstac/sql/002_collections.sql",
    "chars": 3153,
    "preview": "CREATE OR REPLACE FUNCTION collection_base_item(content jsonb) RETURNS jsonb AS $$\n    SELECT jsonb_build_object(\n      "
  },
  {
    "path": "src/pgstac/sql/002a_queryables.sql",
    "chars": 19196,
    "preview": "CREATE OR REPLACE FUNCTION queryable_signature(n text, c text[]) RETURNS text AS $$\n    SELECT concat(n, c);\n$$ LANGUAGE"
  },
  {
    "path": "src/pgstac/sql/002b_cql.sql",
    "chars": 16649,
    "preview": "CREATE OR REPLACE FUNCTION parse_dtrange(\n    _indate jsonb,\n    relative_base timestamptz DEFAULT date_trunc('hour', CU"
  },
  {
    "path": "src/pgstac/sql/003a_items.sql",
    "chars": 11602,
    "preview": "CREATE TABLE items (\n    id text NOT NULL,\n    geometry geometry NOT NULL,\n    collection text NOT NULL,\n    datetime ti"
  },
  {
    "path": "src/pgstac/sql/003b_partitions.sql",
    "chars": 21134,
    "preview": "CREATE TABLE partition_stats (\n    partition text PRIMARY KEY,\n    dtrange tstzrange,\n    edtrange tstzrange,\n    spatia"
  },
  {
    "path": "src/pgstac/sql/004_search.sql",
    "chars": 36412,
    "preview": "\nCREATE OR REPLACE FUNCTION chunker(\n    IN _where text,\n    OUT s timestamptz,\n    OUT e timestamptz\n) RETURNS SETOF RE"
  }
]

// ... and 74 more files (download for full content)

About this extraction

This page contains the full source code of the stac-utils/pgstac GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 274 files (9.3 MB), approximately 2.4M tokens, and a symbol index with 8072 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!