diff --git a/.github/actions/nix-install-ephemeral/action.yml b/.github/actions/nix-install-ephemeral/action.yml index 82eaa32bd..047fb9be6 100644 --- a/.github/actions/nix-install-ephemeral/action.yml +++ b/.github/actions/nix-install-ephemeral/action.yml @@ -44,4 +44,4 @@ runs: substituters = https://cache.nixos.org https://nix-postgres-artifacts.s3.amazonaws.com trusted-public-keys = nix-postgres-artifacts:dGZlQOvKcNEjvT7QEAJbcV6b6uk7VF/hWMjhYleiaLI= cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= ${{ inputs.push-to-cache == 'true' && 'post-build-hook = /etc/nix/upload-to-cache.sh' || '' }} - max-jobs = 8 + max-jobs = 4 diff --git a/.github/workflows/nix-build.yml b/.github/workflows/nix-build.yml index 6a416709b..0a5d51800 100644 --- a/.github/workflows/nix-build.yml +++ b/.github/workflows/nix-build.yml @@ -24,7 +24,7 @@ jobs: fail-fast: false matrix: include: - - runner: blacksmith-32vcpu-ubuntu-2404 + - runner: blacksmith-32vcpu-ubuntu-2404 arch: amd64 - runner: blacksmith-32vcpu-ubuntu-2404-arm arch: arm64 @@ -66,11 +66,11 @@ jobs: sudo rm -rf /tmp/* 2>/dev/null || true echo "=== AFTER CLEANUP ===" df -h - - + - name: Build psql bundle run: > - nix run "github:Mic92/nix-fast-build?rev=b1dae483ab7d4139a6297e02b6de9e5d30e43d48" - -- --skip-cached --no-nom ${{ matrix.runner == 'macos-latest-xlarge' && '--max-jobs 1' || '' }} + nix run "github:Mic92/nix-fast-build?rev=b1dae483ab7d4139a6297e02b6de9e5d30e43d48" + -- --skip-cached --no-nom ${{ matrix.runner == 'macos-latest-xlarge' && '--max-jobs 1' || '' }} --copy-to "s3://nix-postgres-artifacts?secret-key=/etc/nix/nix-secret-key" --flake ".#checks.$(nix eval --raw --impure --expr 'builtins.currentSystem')" env: AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} diff --git a/Dockerfile-15 b/Dockerfile-15 index e79cb2e5b..7347fbe4b 100644 --- a/Dockerfile-15 +++ b/Dockerfile-15 @@ -30,7 +30,7 @@ ARG pg_repack_release=1.4.8 ARG vault_release=0.2.8 ARG groonga_release=12.0.8 ARG pgroonga_release=2.4.0 -ARG wrappers_release=0.5.6 +ARG wrappers_release=0.5.7 ARG hypopg_release=1.3.1 ARG pgvector_release=0.4.0 ARG pg_tle_release=1.3.2 diff --git a/Dockerfile-17 b/Dockerfile-17 index cad7b76b9..240420075 100644 --- a/Dockerfile-17 +++ b/Dockerfile-17 @@ -31,7 +31,7 @@ ARG pg_repack_release=1.4.8 ARG vault_release=0.2.8 ARG groonga_release=12.0.8 ARG pgroonga_release=2.4.0 -ARG wrappers_release=0.5.6 +ARG wrappers_release=0.5.7 ARG hypopg_release=1.3.1 ARG pgvector_release=0.4.0 ARG pg_tle_release=1.3.2 diff --git a/Dockerfile-orioledb-17 b/Dockerfile-orioledb-17 index 19fae02be..9387c0996 100644 --- a/Dockerfile-orioledb-17 +++ b/Dockerfile-orioledb-17 @@ -31,7 +31,7 @@ ARG pg_repack_release=1.4.8 ARG vault_release=0.2.8 ARG groonga_release=12.0.8 ARG pgroonga_release=2.4.0 -ARG wrappers_release=0.5.6 +ARG wrappers_release=0.5.7 ARG hypopg_release=1.3.1 ARG pgvector_release=0.4.0 ARG pg_tle_release=1.3.2 diff --git a/ansible/vars.yml b/ansible/vars.yml index 716a9b8b9..84035bca5 100644 --- a/ansible/vars.yml +++ b/ansible/vars.yml @@ -10,9 +10,9 @@ postgres_major: # Full version strings for each major version postgres_release: - postgresorioledb-17: "17.6.0.013-orioledb" - postgres17: "17.6.1.056" - postgres15: "15.14.1.056" + postgresorioledb-17: "17.6.0.014-orioledb" + postgres17: "17.6.1.057" + postgres15: "15.14.1.057" # Non Postgres Extensions pgbouncer_release: 1.19.0 diff --git a/flake.lock b/flake.lock index 0b1ec8191..b2d4ff6e3 100644 --- a/flake.lock +++ b/flake.lock @@ -252,11 +252,11 @@ ] }, "locked": { - "lastModified": 1749609482, - "narHash": "sha256-R+Y3tXIUAMosrgo/ynhIUPEONZ+cM0ScbgN7KA8OkoE=", + "lastModified": 1764038373, + "narHash": "sha256-M6w2wNBRelcavoDAyFL2iO4NeWknD40ASkH1S3C0YGM=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "a17da8deb943e7c8b4151914abbfe33d5a4e5b0d", + "rev": "ab3536fe850211a96673c6ffb2cb88aab8071cc9", "type": "github" }, "original": { diff --git a/nix/cargo-pgrx/versions.json b/nix/cargo-pgrx/versions.json index 53b2c378c..422bd749c 100644 --- a/nix/cargo-pgrx/versions.json +++ b/nix/cargo-pgrx/versions.json @@ -107,6 +107,14 @@ "cargoHash": "sha256-pK6OxRNubcWhohLvIJIliRtaHSIQOhQp7Q9brPygZYA=" } } + }, + "0.16.1": { + "hash": "sha256-AjoBr+/sEPdzbD0wLUNVm2syCySkGaFOFQ70TST1U9w=", + "rust": { + "1.88.0": { + "cargoHash": "sha256-uWj/V2lJa6HF2GlHX+i5RbSMZFOxZsBzOf6okKDb0j8=" + } + } } } diff --git a/nix/docs/update-extension.md b/nix/docs/update-extension.md index 464ff2885..d9fd9ba34 100644 --- a/nix/docs/update-extension.md +++ b/nix/docs/update-extension.md @@ -5,7 +5,7 @@ There are two types of extension package structures in our codebase: -1. **Old structure (deprecated, soon to be replaced)**: Extensions like `supautils.nix` that directly define a single version +1. **Old structure (deprecated)**: Extensions like `supautils.nix` that directly define a single version in the nix expression for the package 2. **New structure (current standard)**: Extensions that load multiple versions from `nix/ext/versions.json` Most extensions now use the new structure, which supports multiple versions via the `versions.json` file. The instructions below cover both approaches. @@ -143,6 +143,8 @@ These extensions use `mkPgrxExtension` and require additional Rust and pgrx vers 10. **Once approved**: Update `common-nix.vars.yml` if releasing +> **Need to update pgrx or Rust versions?** See [Updating cargo-pgrx Extensions](./updating-pgrx-extensions.md) for the complete guide covering pgrx version updates, Rust toolchain updates (including `nix flake update rust-overlay`), and troubleshooting. + --- ## Updating an Extension (Old Structure - Deprecated) diff --git a/nix/docs/updating-pgrx-extensions.md b/nix/docs/updating-pgrx-extensions.md new file mode 100644 index 000000000..ed615bd9d --- /dev/null +++ b/nix/docs/updating-pgrx-extensions.md @@ -0,0 +1,373 @@ +# Updating cargo-pgrx Extensions + +This guide covers the complete process for updating Rust-based PostgreSQL extensions that use `pgrx` (formerly `pgx`). These extensions include `wrappers`, `pg_graphql`, and `pg_jsonschema`. + +## Overview + +Updating a pgrx extension can involve one or more of these changes: + +1. **Extension version only** - New release of the extension with same Rust/pgrx versions +2. **Extension + pgrx version** - Extension requires a newer pgrx version +3. **Extension + pgrx + Rust version** - Full stack update including the Rust toolchain + +Each scenario requires different file changes. This guide covers all three. + + +## Quick Reference: File Locations + +| Purpose | File | +|---------|------| +| Extension versions | `nix/ext/versions.json` | +| Extension-specific config | `nix/ext//default.nix` | +| pgrx versions + Rust mappings | `nix/cargo-pgrx/versions.json` | +| cargo-pgrx package definitions | `nix/cargo-pgrx/default.nix` | +| pgrx extension builder | `nix/cargo-pgrx/mkPgrxExtension.nix` | +| Overlays (buildPgrxExtension_*) | `nix/overlays/default.nix` | +| Rust toolchain source | `flake.nix` (rust-overlay input) | +| Pinned rust-overlay version | `flake.lock` | + +--- + +## Summary: Which Scenario Am I In? + +| Situation | Scenario | +|-----------|----------| +| Same pgrx and Rust as previous version | 1 - Extension only | +| Extension's Cargo.toml has newer pgrx | 2 - Extension + pgrx | +| Extension requires Rust version not in rust-overlay | 3 - Full stack update | +| "attribute missing" error for Rust version | 3 - Need `nix flake update rust-overlay` | + +--- + +## 1. Updating Extension Version Only + +Use this when the extension has a new release but uses the same pgrx and Rust versions as a previous version. + +### Files to Change + +| File | Change | +|------|--------| +| `nix/ext/versions.json` | Add new version entry | +| `nix/ext//default.nix` | Add old version to `allPreviouslyPackagedVersions` | + +### Steps + +1. **Edit `nix/ext/versions.json`** - Add the new version entry: + + ```json + "wrappers": { + "0.5.6": { + "postgresql": ["15", "17", "orioledb-17"], + "hash": "sha256-...", + "pgrx": "0.16.0", + "rust": "1.87.0" + }, + "0.5.7": { + "postgresql": ["15", "17", "orioledb-17"], + "hash": "", + "pgrx": "0.16.0", + "rust": "1.87.0" + } + } + ``` + + - Copy the `pgrx` and `rust` values from the previous version + - Set `hash` to `""` initially + +2. **Update `allPreviouslyPackagedVersions`** in `nix/ext//default.nix`: + + ```nix + allPreviouslyPackagedVersions = [ + "0.5.6" # Add the previous version here + "0.5.5" + # ... older versions + ]; + ``` + + This ensures migration SQL files are created for users upgrading from older versions. + +3. **Stage your changes**: + + ```bash + git add . + ``` + +4. **Build to get the hash**: + + ```bash + nix build .#psql_17/exts/wrappers-all -L + ``` + + The build will fail and print the correct hash. Copy it to `versions.json`. + +5. **Rebuild to verify**: + + ```bash + nix build .#psql_17/exts/wrappers-all -L + ``` + +--- + +## 2. Updating Extension + pgrx Version + +Use this when the extension requires a newer pgrx version. + +### Files to Change + +| File | Change | +|------|--------| +| `nix/ext/versions.json` | Add new version with new pgrx version | +| `nix/ext//default.nix` | Add old version to `allPreviouslyPackagedVersions` | +| `nix/cargo-pgrx/versions.json` | Add new pgrx version (if not already present) | +| `nix/cargo-pgrx/default.nix` | Add new `cargo-pgrx_x_y_z` entry (if not already present) | +| `nix/overlays/default.nix` | Add new `buildPgrxExtension_x_y_z` (if not already present) | + +### Steps + +1. **Check if the pgrx version exists** in `nix/cargo-pgrx/versions.json`: + + ```bash + cat nix/cargo-pgrx/versions.json | grep "0.16.1" + ``` + +2. **If pgrx version doesn't exist**, add it to `nix/cargo-pgrx/versions.json`: + + ```json + "0.16.1": { + "hash": "", + "rust": { + "1.88.0": { + "cargoHash": "" + } + } + } + ``` + + The `rust` object maps Rust versions to their corresponding `cargoHash`. You'll need to calculate both the `hash` (for the pgrx crate) and `cargoHash` (for cargo dependencies). + +3. **Add cargo-pgrx entry** in `nix/cargo-pgrx/default.nix`: + + ```nix + cargo-pgrx_0_16_1 = mkCargoPgrx { + version = "0.16.1"; + hash = ""; + cargoHash = ""; + }; + ``` + +4. **Add overlay entry** in `nix/overlays/default.nix`: + + ```nix + buildPgrxExtension_0_16_1 = prev.buildPgrxExtension.override { + cargo-pgrx = final.cargo-pgrx.cargo-pgrx_0_16_1; + }; + ``` + +5. **Update `nix/ext/versions.json`** with the new extension version: + + ```json + "0.5.7": { + "postgresql": ["15", "17", "orioledb-17"], + "hash": "", + "pgrx": "0.16.1", + "rust": "1.88.0" + } + ``` + +6. **Stage and build** to calculate hashes: + + ```bash + git add . + nix build .#psql_17/exts/wrappers-all -L + ``` + + You'll need to run this multiple times, updating hashes as they're calculated: + - First failure: pgrx crate hash + - Second failure: cargoHash for pgrx + - Third failure: extension hash + +--- + +## 3. Updating Extension + pgrx + Rust Version + +Use this when you need a newer Rust toolchain version. + +### Files to Change + +All files from scenario 2, plus: + +| File | Change | +|------|--------| +| `flake.lock` | Update rust-overlay input | + +### Understanding rust-overlay + +The Rust toolchain comes from the `rust-overlay` flake input. This overlay provides pre-built Rust versions with hashes already calculated. The overlay is updated daily on GitHub, but your local `flake.lock` pins a specific version. + +### Steps + +1. **Check if your Rust version is available**: + + ```bash + nix eval --raw --impure --expr ' + let + flake = builtins.getFlake (toString ./.); + pkgs = import flake.inputs.nixpkgs { + system = builtins.currentSystem; + overlays = [ (import flake.inputs.rust-overlay) ]; + }; + in + builtins.concatStringsSep "\n" (builtins.attrNames pkgs.rust-bin.stable) + ' + ``` + + This lists all available stable Rust versions. + +2. **If your Rust version is missing, update rust-overlay**: + + ```bash + nix flake update rust-overlay + ``` + + > **IMPORTANT**: Use `nix flake update rust-overlay` (with the input name) to update ONLY the rust-overlay input. Running `nix flake update` without arguments updates ALL inputs, which WILL cause unintended changes. + +3. **Verify the version is now available**: + + ```bash + nix eval --raw --impure --expr ' + let + flake = builtins.getFlake (toString ./.); + pkgs = import flake.inputs.nixpkgs { + system = builtins.currentSystem; + overlays = [ (import flake.inputs.rust-overlay) ]; + }; + in + builtins.concatStringsSep "\n" (builtins.attrNames pkgs.rust-bin.stable) + ' | grep "1.88.0" + ``` + +4. **Add the new Rust version to pgrx mappings** in `nix/cargo-pgrx/versions.json`: + + ```json + "0.16.1": { + "hash": "sha256-...", + "rust": { + "1.87.0": { + "cargoHash": "sha256-..." + }, + "1.88.0": { + "cargoHash": "" + } + } + } + ``` + + Each pgrx version can support multiple Rust versions. The `cargoHash` may differ between Rust versions. + +5. **Continue with extension update** as in scenario 2. + +--- + +## 4. Verification with `nix flake check` + +After making changes, verify everything works: + +```bash +nix flake check -L +``` + +The `-L` flag shows full build logs, which is essential for debugging. + +### What `nix flake check` verifies: + +- All extension builds for all PostgreSQL versions +- Extension test suites +- Migration path validity (upgrade scripts between versions) +- Package structure integrity + +### Testing a specific extension first: + +For faster iteration, test just your extension before running full checks: + +```bash +# Build for one PostgreSQL version +nix build .#psql_17/exts/wrappers-all -L + +# Build for all PostgreSQL versions +nix build .#psql_15/exts/wrappers-all -L +nix build .#psql_17/exts/wrappers-all -L +``` + +--- + +## 5. Troubleshooting + +### Error: `attribute '"X.Y.Z"' missing` + +**Example:** +``` +error: attribute '"1.88.0"' missing +at /nix/store/.../nix/ext/wrappers/default.nix:19:15: + cargo = rust-bin.stable.${rustVersion}.default; +Did you mean one of 1.38.0, 1.48.0, 1.58.0, 1.68.0 or 1.78.0? +``` + +**Cause:** The Rust version specified in `versions.json` isn't available in your pinned `rust-overlay`. + +**Solution:** +```bash +nix flake update rust-overlay +``` + +Then verify the version is available (see section 3). + +### Error: `Unsupported pgrx version X.Y.Z` + +**Cause:** The pgrx version in `versions.json` isn't defined in `nix/cargo-pgrx/versions.json`. + +**Solution:** Add the pgrx version entry to `nix/cargo-pgrx/versions.json` with appropriate Rust version mappings. + +### Error: `Unsupported rust version X.Y.Z for pgrx version A.B.C` + +**Cause:** The Rust version isn't mapped for this pgrx version in `nix/cargo-pgrx/versions.json`. + +**Solution:** Add the Rust version to the pgrx entry: + +```json +"0.16.1": { + "hash": "sha256-...", + "rust": { + "1.87.0": { "cargoHash": "sha256-..." }, + "1.88.0": { "cargoHash": "" } // Add this + } +} +``` + +### Hash Calculation Failures + +When calculating hashes, you'll see errors like: + +``` +hash mismatch in fixed-output derivation: + wanted: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + got: sha256-xYz123ActualHashValue...= +``` + +Copy the `got` value to replace the empty or incorrect hash. + +### Build Fails After Hash Update + +If the build still fails after updating hashes: + +1. **Stage all changes**: `git add .` +2. **Clean Nix cache** (if necessary): `nix store gc` +3. **Rebuild**: `nix build .#psql_17/exts/ -L` + +### CargoLock outputHashes + +Some extensions (like wrappers) have git dependencies that require `outputHashes` in their `cargoLock` configuration. If you see errors about missing hashes for git dependencies: + +1. Check the extension's `default.nix` for the `cargoLock.outputHashes` section +2. Add any new git dependencies with their calculated hashes + +--- diff --git a/nix/ext/versions.json b/nix/ext/versions.json index d1a78336a..5bfc1f303 100644 --- a/nix/ext/versions.json +++ b/nix/ext/versions.json @@ -679,6 +679,16 @@ "hash": "sha256-WanKlNY65KORzyCSV5hsYCVjQp/s23IUfzHMdpMhn1M=", "pgrx": "0.16.0", "rust": "1.87.0" + }, + "0.5.7": { + "postgresql": [ + "15", + "17", + "orioledb-17" + ], + "hash": "sha256-B46ie4qlfD1Wxd7QRv1fIuRmmSrb5s5A7KpQVwadazo=", + "pgrx": "0.16.1", + "rust": "1.88.0" } }, "pg_hashids": { @@ -813,4 +823,4 @@ "hash": "sha256-+QoACPCKiFfuT2lJfSUmgfzC5MXf75KpSoc2PzPxKyM=" } } -} \ No newline at end of file +} diff --git a/nix/ext/wrappers/default.nix b/nix/ext/wrappers/default.nix index 89effcfb3..b37980844 100644 --- a/nix/ext/wrappers/default.nix +++ b/nix/ext/wrappers/default.nix @@ -44,6 +44,7 @@ let ] ++ lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.CoreFoundation + darwin.apple_sdk.frameworks.CoreServices darwin.apple_sdk.frameworks.Security darwin.apple_sdk.frameworks.SystemConfiguration ]; @@ -98,6 +99,11 @@ let "clickhouse-rs-1.1.0-alpha.1" = "sha256-nKiGzdsAgJej8NgyVOqHaD1sZLrNF1RPfEhu2pRwZ6o="; "iceberg-catalog-s3tables-0.6.0" = "sha256-AUK7B0wMqQZwJho91woLs8uOC4k1RdUEEN5Khw2OoqQ="; } + else if builtins.compareVersions "0.5.7" version == 0 then + { + "clickhouse-rs-1.1.0-alpha.1" = "sha256-nKiGzdsAgJej8NgyVOqHaD1sZLrNF1RPfEhu2pRwZ6o="; + "iceberg-catalog-s3tables-0.6.0" = "sha256-AUK7B0wMqQZwJho91woLs8uOC4k1RdUEEN5Khw2OoqQ="; + } else { "clickhouse-rs-1.1.0-alpha.1" = "sha256-nKiGzdsAgJej8NgyVOqHaD1sZLrNF1RPfEhu2pRwZ6o="; diff --git a/nix/tests/expected/z_15_ext_interface.out b/nix/tests/expected/z_15_ext_interface.out index f2b5672aa..e07b6e60e 100644 --- a/nix/tests/expected/z_15_ext_interface.out +++ b/nix/tests/expected/z_15_ext_interface.out @@ -5202,10 +5202,6 @@ order by wrappers | public | duckdb_fdw_handler | | fdw_handler wrappers | public | duckdb_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | duckdb_fdw_validator | options text[], catalog oid | void - wrappers | public | embd_distance | embd embd | real - wrappers | public | embd_in | input cstring | embd - wrappers | public | embd_knn | _left embd, _right embd | boolean - wrappers | public | embd_out | input embd | cstring wrappers | public | firebase_fdw_handler | | fdw_handler wrappers | public | firebase_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | firebase_fdw_validator | options text[], catalog oid | void @@ -5231,6 +5227,10 @@ order by wrappers | public | s3_vectors_fdw_handler | | fdw_handler wrappers | public | s3_vectors_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | s3_vectors_fdw_validator | options text[], catalog oid | void + wrappers | public | s3vec_distance | s3vec s3vec | real + wrappers | public | s3vec_in | input cstring | s3vec + wrappers | public | s3vec_knn | _left s3vec, _right s3vec | boolean + wrappers | public | s3vec_out | input s3vec | cstring wrappers | public | stripe_fdw_handler | | fdw_handler wrappers | public | stripe_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | stripe_fdw_validator | options text[], catalog oid | void diff --git a/nix/tests/expected/z_17_ext_interface.out b/nix/tests/expected/z_17_ext_interface.out index 57f68aa1c..0d932ec2c 100644 --- a/nix/tests/expected/z_17_ext_interface.out +++ b/nix/tests/expected/z_17_ext_interface.out @@ -4846,10 +4846,6 @@ order by wrappers | public | duckdb_fdw_handler | | fdw_handler wrappers | public | duckdb_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | duckdb_fdw_validator | options text[], catalog oid | void - wrappers | public | embd_distance | embd embd | real - wrappers | public | embd_in | input cstring | embd - wrappers | public | embd_knn | _left embd, _right embd | boolean - wrappers | public | embd_out | input embd | cstring wrappers | public | firebase_fdw_handler | | fdw_handler wrappers | public | firebase_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | firebase_fdw_validator | options text[], catalog oid | void @@ -4875,6 +4871,10 @@ order by wrappers | public | s3_vectors_fdw_handler | | fdw_handler wrappers | public | s3_vectors_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | s3_vectors_fdw_validator | options text[], catalog oid | void + wrappers | public | s3vec_distance | s3vec s3vec | real + wrappers | public | s3vec_in | input cstring | s3vec + wrappers | public | s3vec_knn | _left s3vec, _right s3vec | boolean + wrappers | public | s3vec_out | input s3vec | cstring wrappers | public | stripe_fdw_handler | | fdw_handler wrappers | public | stripe_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | stripe_fdw_validator | options text[], catalog oid | void diff --git a/nix/tests/expected/z_orioledb-17_ext_interface.out b/nix/tests/expected/z_orioledb-17_ext_interface.out index 57f68aa1c..0d932ec2c 100644 --- a/nix/tests/expected/z_orioledb-17_ext_interface.out +++ b/nix/tests/expected/z_orioledb-17_ext_interface.out @@ -4846,10 +4846,6 @@ order by wrappers | public | duckdb_fdw_handler | | fdw_handler wrappers | public | duckdb_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | duckdb_fdw_validator | options text[], catalog oid | void - wrappers | public | embd_distance | embd embd | real - wrappers | public | embd_in | input cstring | embd - wrappers | public | embd_knn | _left embd, _right embd | boolean - wrappers | public | embd_out | input embd | cstring wrappers | public | firebase_fdw_handler | | fdw_handler wrappers | public | firebase_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | firebase_fdw_validator | options text[], catalog oid | void @@ -4875,6 +4871,10 @@ order by wrappers | public | s3_vectors_fdw_handler | | fdw_handler wrappers | public | s3_vectors_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | s3_vectors_fdw_validator | options text[], catalog oid | void + wrappers | public | s3vec_distance | s3vec s3vec | real + wrappers | public | s3vec_in | input cstring | s3vec + wrappers | public | s3vec_knn | _left s3vec, _right s3vec | boolean + wrappers | public | s3vec_out | input s3vec | cstring wrappers | public | stripe_fdw_handler | | fdw_handler wrappers | public | stripe_fdw_meta | | TABLE(name text, version text, author text, website text) wrappers | public | stripe_fdw_validator | options text[], catalog oid | void