Git Product home page Git Product logo

wrappers's Introduction

Supabase

Supabase is an open source Firebase alternative. We're building the features of Firebase using enterprise-grade open source tools.

  • Hosted Postgres Database. Docs
  • Authentication and Authorization. Docs
  • Auto-generated APIs.
  • Functions.
    • Database Functions. Docs
    • Edge Functions Docs
  • File Storage. Docs
  • AI + Vector/Embeddings Toolkit. Docs
  • Dashboard

Supabase Dashboard

Watch "releases" of this repo to get notified of major updates.

Watch this repo

Documentation

For full documentation, visit supabase.com/docs

To see how to Contribute, visit Getting Started

Community & Support

  • Community Forum. Best for: help with building, discussion about database best practices.
  • GitHub Issues. Best for: bugs and errors you encounter using Supabase.
  • Email Support. Best for: problems with your database or infrastructure.
  • Discord. Best for: sharing your applications and hanging out with the community.

How it works

Supabase is a combination of open source tools. We’re building the features of Firebase using enterprise-grade, open source products. If the tools and communities exist, with an MIT, Apache 2, or equivalent open license, we will use and support that tool. If the tool doesn't exist, we build and open source it ourselves. Supabase is not a 1-to-1 mapping of Firebase. Our aim is to give developers a Firebase-like developer experience using open source tools.

Architecture

Supabase is a hosted platform. You can sign up and start using Supabase without installing anything. You can also self-host and develop locally.

Architecture

  • Postgres is an object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance.
  • Realtime is an Elixir server that allows you to listen to PostgreSQL inserts, updates, and deletes using websockets. Realtime polls Postgres' built-in replication functionality for database changes, converts changes to JSON, then broadcasts the JSON over websockets to authorized clients.
  • PostgREST is a web server that turns your PostgreSQL database directly into a RESTful API
  • GoTrue is a JWT based API for managing users and issuing JWT tokens.
  • Storage provides a RESTful interface for managing Files stored in S3, using Postgres to manage permissions.
  • pg_graphql a PostgreSQL extension that exposes a GraphQL API
  • postgres-meta is a RESTful API for managing your Postgres, allowing you to fetch tables, add roles, and run queries, etc.
  • Kong is a cloud-native API gateway.

Client libraries

Our approach for client libraries is modular. Each sub-library is a standalone implementation for a single external system. This is one of the ways we support existing tools.

Language Client Feature-Clients (bundled in Supabase client)
Supabase PostgREST GoTrue Realtime Storage Functions
⚡️ Official ⚡️
JavaScript (TypeScript) supabase-js postgrest-js gotrue-js realtime-js storage-js functions-js
Flutter supabase-flutter postgrest-dart gotrue-dart realtime-dart storage-dart functions-dart
Swift supabase-swift postgrest-swift auth-swift realtime-swift storage-swift functions-swift
💚 Community 💚
C# supabase-csharp postgrest-csharp gotrue-csharp realtime-csharp storage-csharp functions-csharp
Go - postgrest-go gotrue-go - storage-go functions-go
Java - - gotrue-java - storage-java -
Kotlin supabase-kt postgrest-kt gotrue-kt realtime-kt storage-kt functions-kt
Python supabase-py postgrest-py gotrue-py realtime-py storage-py functions-py
Ruby supabase-rb postgrest-rb - - - -
Rust - postgrest-rs - - - -
Godot Engine (GDScript) supabase-gdscript postgrest-gdscript gotrue-gdscript realtime-gdscript storage-gdscript functions-gdscript

Badges

Made with Supabase

[![Made with Supabase](https://supabase.com/badge-made-with-supabase.svg)](https://supabase.com)
<a href="https://supabase.com">
  <img
    width="168"
    height="30"
    src="https://supabase.com/badge-made-with-supabase.svg"
    alt="Made with Supabase"
  />
</a>

Made with Supabase (dark)

[![Made with Supabase](https://supabase.com/badge-made-with-supabase-dark.svg)](https://supabase.com)
<a href="https://supabase.com">
  <img
    width="168"
    height="30"
    src="https://supabase.com/badge-made-with-supabase-dark.svg"
    alt="Made with Supabase"
  />
</a>

Translations

wrappers's People

Contributors

0xflotus avatar aayushyavajpayee avatar ankrgyl avatar arnaud avatar ashleyconnor avatar burmecia avatar csmithxc avatar dependabot[bot] avatar edmcbane avatar encima avatar glarrain-cdd avatar ibotty avatar imor avatar isaiah-hamilton avatar j0 avatar jocubeit avatar kamilogorek avatar kav avatar kiwicopple avatar olirice avatar packysauce avatar papparapa avatar tedverse avatar w3b6x9 avatar workingjubilee avatar yrashk avatar zer0exploit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wrappers's Issues

`permission denied for table wrappers_fdw_stats` error when `wrappers` is created in the `extensions` schema

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

permission denied for table wrappers_fdw_stats error when wrappers is created in the extensions schema. We recently also updated the docs to suggest creating the wrappers extension in the extensions schema to fix an RLS warning (ticket id 2081530023).

To Reproduce

Steps to reproduce:

  1. Run create extension if not exists wrappers with schema extensions; from dashboard.
  2. Run \dp wrappers_fdw_stats from psql and notice the permissions:
postgres=# \dp wrappers_fdw_stats
                                                Access privileges
   Schema   |        Name        | Type  |           Access privileges            | Column privileges | Policies 
------------+--------------------+-------+----------------------------------------+-------------------+----------
 extensions | wrappers_fdw_stats | table | postgres=a*r*w*d*D*x*t*/supabase_admin+|                   | 
            |                    |       | supabase_admin=arwdDxt/supabase_admin  |                   | 
(1 row)
  1. Create a foreign data table and run a select query from anon role and observe the error permission denied for table wrappers_fdw_stats.

Expected behavior

There should be no error when running a select query on a foreign table.

Screenshots

N/A

System information

  • wrappers version 0.1.19

Additional context

The permissions are missing only when the wrappers extension is created in the extensions schema. To confirm this:

  1. Run drop extension wrappers if exists cascade; to drop the extension if it is present.
  2. Run create extension if not exists wrappers;
  3. Run \dp wrappers_fdw_stats from psql and notice the permissions:
postgres=# \dp wrappers_fdw_stats
                                             Access privileges
 Schema |        Name        | Type  |           Access privileges           | Column privileges | Policies 
--------+--------------------+-------+---------------------------------------+-------------------+----------
 public | wrappers_fdw_stats | table | postgres=arwdDxt/supabase_admin      +|                   | 
        |                    |       | supabase_admin=arwdDxt/supabase_admin+|                   | 
        |                    |       | anon=arwdDxt/supabase_admin          +|                   | 
        |                    |       | authenticated=arwdDxt/supabase_admin +|                   | 
        |                    |       | service_role=arwdDxt/supabase_admin   |                   | 
(1 row)

Notice additional permissions when the extension is created in the public schema. See ticket 2117241996 for details.

"target column number not match" error when reading stripe customers table

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

ERROR: target column number not match returned when running select * from stripe.customers;

To Reproduce

Steps to reproduce:

  1. create extension if not exists wrappers;
  2. create foreign data wrapper stripe_wrapper handler stripe_fdw_handler validator stripe_fdw_validator;
  3. create server stripe_server foreign data wrapper stripe_wrapper options (api_key '<Stripe API Key>');
  4. create schema stripe;
  5. create foreign table stripe.customers(id text, email text, name text, description text, created timestamp, attr jsonb) server stripe_server options (object 'customers', rowid_column 'id');
  6. Insert a test customer in Stripe from the Stripe Dashboard.
  7. select * from stripe.customers;
  8. Observe that you get this error: ERROR: target column number not match.

Expected behavior

Stripe customers should be returned.

Screenshots

N/A

System information

Occurs with master/main branch.

Additional context

Looks like attr column is causing this. It works when running select id, email, name, description, created from stripe.customers; but fails with select id, email, name, description, created, attr from stripe.customers;;

Queries made to stripe foreign table returns error after being queried a few times

Bug report

Describe the bug

When querying a view table with fields from a local table and a foreign table created with the stripe FDW, the client returns the following error after an arbitrary number of requests (usually three):

{
  code: 'HV00J',
  details: 'Wrappers',
  hint: null,
  message: 'required option "object" is not specified'
}

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  1. Setup a stripe account with test users
  2. Create a local PostgreSQL DB using Supabase CLI
  3. Add a local table that contains a field referencing a stripe customer ID
CREATE TABLE public.users
(
    id       uuid NOT NULL,
    customer text
);
  1. Add the stripe server and stripe wrapper
CREATE EXTENSION IF NOT EXISTS wrappers;
CREATE FOREIGN DATA WRAPPER stripe_wrapper
    HANDLER stripe_fdw_handler
    VALIDATOR stripe_fdw_validator;


CREATE SERVER stripe_server
    FOREIGN DATA WRAPPER stripe_wrapper
    OPTIONS (
        api_key '<Add api secret key here>'
        );
  1. Create the subscriptions foreign table
CREATE FOREIGN TABLE public.subscriptions (
    id TEXT,
    customer TEXT,
    currency TEXT,
    current_period_start TIMESTAMP,
    current_period_end TIMESTAMP,
    attrs JSONB
    )
    SERVER stripe_server
    OPTIONS (
        object 'subscriptions'
        );
  1. Create a view table that combines fields from the users table and the subscriptions table
CREATE VIEW public.vw_users_with_stripe_subscription AS
SELECT u.id,
       s.customer,
       s.attrs
FROM public.users u
         LEFT JOIN public.subscriptions s ON s.customer = u.customer;
  1. Update the tables so that the view table will contain a record of the the user WITH the stripe data as well.
  2. Write a query using the supabase client to return that record
supabase.from('vw_users_with_stripe_subscription')
.select(
'id, customer, attrs',
).eq('id', '<Add user ID here>').single(),

Expected behavior

The record containing the users subscription information, customer id, and user id should be returned each time the request is made.

Screenshots

Video capture

System information

  • OS: macOS
  • Browser: Chrome
  • Version of supabase-js: 1.36.7
  • Version of Node.js: v16.14.2

Additional context

The issue occurs after some arbitrary number of successful queries (usually three) of the view table. Eventually, the error message 'required option "object" is not specified' is received. I've also tried to make the query using an rpc function but it resulted in the same error message after some requests. Once the error is returned, it will be returned every subsequent request. If I drop the wrapper, the server, the view table, and recreate all three on the DB, the error will not return until some arbitrary number of requests are made.

The error appears to come from this function: https://github.com/supabase/wrappers/blob/main/supabase-wrappers/src/utils.rs#L276

Bigquery cannot insert

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

After follow this tutorial:
https://supabase.com/docs/guides/database/extensions/wrappers/bigquery#basic-example

I can query the table people without issue.

If I try to insert as it say in the doc, it's possible.

I get this error:

Failed to run SQL query: option 'rowid_column' is required

insert into people(id,name,ts) values (4, 'test name', current_timestamp);

To Reproduce

Follow the BigQuery tutorial in Supabase doc, then try to do the insert i shared.

Expected behavior

Insert should work as shared in the doc

Screenshots

CleanShot 2023-08-04 at 06 38 09@2x

System information

  • OS: [e.g. macOS, Windows]
  • Browser (if applies) [e.g. chrome, safari]
  • Version of supabase-js: [e.g. 6.0.2]
  • Version of Node.js: [e.g. 10.10.0]

Additional context

Add any other context about the problem here.

`qual.deparse()` null check is incorrect

Bug report

Describe the bug

The qual.deparse() incorrectly treats null check conditions.

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  1. for any query with null check in condition like select x from foo where x is null
  2. the qual.deparse() will return string like x is 'null'

Expected behavior

The null check qual should be deparsed correctly like x is null

Screenshots

N/A

System information

  • OS: any
  • Version of wrappers: v0.1.7
  • Affected FDWs: any

Additional context

N/A

[Bug] Inserting data Clickhouse `RETURNING is not supported`

Bug report

Describe the bug

When inserting data via Supabase-js / Postgrest, I get a 500 error response with the following body:

{
    "code": "HV000",
    "details": "Wrappers",
    "hint": null,
    "message": "RETURNING is not supported"
}

To Reproduce

Clickhouse table:

CREATE TABLE glucose
(
    `timestamp` DateTime64(3, 'Europe/Amsterdam'),
    `profile_id` String,
    `sensor_id` String,
    `glucose_mmol` Float32,
    `glucose_mg` Int16
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (timestamp, profile_id);

Postgres table:

create server clickhouse_server
  foreign data wrapper clickhouse_wrapper
  options (
    conn_string 'tcp://default:@localhost:9000/default'
  );

create foreign table glucose (
  timestamp timestamp,
  profile_id text,
  sensor_id text,
  glucose_mmol real,
  glucose_mg integer
)
  server clickhouse_server
  options (
    table 'glucose',
    rowid_column 'timestamp'
  );

You can reproduce this error by trying to insert the following data (but any data will do):

const uploadData = {"sensor_id":"b4d0f5a6-5fe3-4341-90c2-c18baedeb31f","timestamp":"2023-05-20T19:34:00.000Z","glucose_mg":222,"glucose_mmol":12.3,"profile_id":"c7922835-bdc9-49eb-a3f5-0d3013c67bbf"};
Supabase.from('glucose').insert(uploadData)

Expected behavior

To insert the data and not give me an error

System information

  • OS: MacOs
  • Browser: Safari iOS
  • Version of supabase-js: v2.21.0
  • Version of Node.js: v19.6.1

Improve Airtable docs

Improve documentation

Link

I referenced these docs: https://supabase.github.io/wrappers/airtable/
(The same as the Supabase.com ones I think: https://supabase.com/docs/guides/database/extensions/wrappers/airtable)

Describe the problem

Here's the trouble I ran into:

  • there was no list of supported data types. I had to hunt for that (can't recall where I found it)
  • it wasn't clear whether arrays are a supported data type, but trying to use them indicates that they are not. Airtable uses arrays of strings for linked records, and that was important to me
  • there was no documentation for how to update a foreign wrapper table
  • documentation was unclear about how column names are associated with Airtable's column names. I experimented and found that it accepted "Whatever" as a column name even though that column was not in my Airtable base. I used quoted column names for my Airtable columns with spaces: "Business Name". I'm not sure if that was correct.
  • I managed to do a successful query but it returned null values for all the columns in my table (however it did return the correct number of rows). The documentation did not point me to a solution or a way to debug this. At this point I gave up.

Describe the improvement

Add documentation to address my confusion above.

Additional context

Airtable API description of my table:

Screen Shot 2023-10-10 at 1 19 28 PM

Some commands I ran (secrets removed):


create extension if not exists wrappers;

create foreign data wrapper airtable_wrapper
  handler airtable_fdw_handler
  validator airtable_fdw_validator;

-- Save your Airtable API key in Vault and retrieve the `key_id`
insert into vault.secrets (name, secret)
values (
  'airtable',
  '<Airtable API Key or PAT>' -- Airtable API key or Personal Access Token (PAT)
)
returning key_id;

create server airtable_server
  foreign data wrapper airtable_wrapper
  options (
    api_key_id '<key_ID>' -- The Key ID from above.
  );

create foreign table my_foreign_table (
  "Business Name" text,
  "City" text,
  "State" text
  --"Whatever" text
  --"Industry" text[],
  -- other fields
)
server airtable_server
options (
  base_id 'appxxxx',
  table_id 'tblxxxx'
);

SELECT 
*
 FROM my_foreign_table;

Result from that SELECT *

Business Name City State
null null null
null null null

stripe - tls_process_server_certificate:certificate verify failed:

Bug report

Describe the bug

The basic issue is that the stripe fdw is returning an error:

request failed: Request error: error sending request for url (https://api.stripe.com/v1/invoices?limit=100): 
error trying to connect: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:../ssl/statem/statem_clnt.c:1914: 
(unable to get local issuer certificate)

I've described the bug at supabase/supabase#12712

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

To re-produce this, I followed the instructions on setting up the stripe fdw and ran the following:

-- select pgsodium.create_key(name := 'stripe');



-- insert into vault.secrets (secret, key_id)
-- values (
--   'sk_test_MyPrivateKey,
--   (select id from pgsodium.valid_key where name = 'stripe')
-- )
-- returning
--     key_id;



-- create server stripe_server
--   foreign data wrapper stripe_wrapper
--   options (
--     api_key_id '14b9cdd9-1ad7-4fa9-ae2c-2821417b6673'
--   );

-- create schema stripe;

-- create foreign table stripe.accounts (
--   id text,
--   business_type text,
--   country text,
--   email text,
--   type text,
--   created timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'accounts'
--   );

-- create foreign table stripe.balance (
--   balance_type text,
--   amount bigint,
--   currency text,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'balance'
--   );


-- create foreign table stripe.balance_transactions (
--   id text,
--   amount bigint,
--   currency text,
--   description text,
--   fee bigint,
--   net bigint,
--   status text,
--   type text,
--   created timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'balance_transactions'
--   );


-- create foreign table stripe.customers (
--   id text,
--   email text,
--   name text,
--   description text,
--   created timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'customers',
--     rowid_column 'id'
--   );


-- create foreign table stripe.events (
--   id text,
--   type text,
--   api_version text,
--   created timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'events'
--   );


-- create foreign table stripe.files (
--   id text,
--   filename text,
--   purpose text,
--   title text,
--   size bigint,
--   type text,
--   url text,
--   created timestamp,
--   expires_at timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'files'
--   );

-- create foreign table stripe.file_links (
--   id text,
--   file text,
--   url text,
--   created timestamp,
--   expired bool,
--   expires_at timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'file_links'
--   );

-- create foreign table stripe.invoices (
--   id text,
--   customer text,
--   subscription text,
--   status text,
--   total bigint,
--   currency text,
--   period_start timestamp,
--   period_end timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'invoices'
--   );

-- create foreign table stripe.mandates (
--   id text,
--   payment_method text,
--   status text,
--   type text,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'mandates'
--   );


-- create foreign table stripe.payment_intents (
--   id text,
--   customer text,
--   amount bigint,
--   currency text,
--   payment_method text,
--   created timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'payment_intents'
--   );

-- create foreign table stripe.payouts (
--   id text,
--   amount bigint,
--   currency text,
--   arrival_date timestamp,
--   description text,
--   statement_descriptor text,
--   status text,
--   created timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'payouts'
--   );

-- create foreign table stripe.products (
--   id text,
--   name text,
--   active bool,
--   default_price text,
--   description text,
--   created timestamp,
--   updated timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'products',
--     rowid_column 'id'
--   );

-- create foreign table stripe.refunds (
--   id text,
--   amount bigint,
--   currency text,
--   charge text,
--   payment_intent text,
--   reason text,
--   status text,
--   created timestamp,
--   attrs jsonb
-- )
--   server stripe_server
--   options (
--     object 'refunds'
--   );

-- select * from stripe.customers limit 10;
-- select * from stripe.invoices limit 10;
-- select * from stripe.subscriptions limit 10;

Running each of these 3 select statements resulted in the above error.

Expected behavior

A clear and concise description of what you expected to happen.

System information

  • OS: Ubuntu 22.10
  • Version of supabase-js:1.38.7

Remove unnecessary semicolon in SQL query

Improve documentation

Link

S3 - wrappers

Describe the problem

In the SQL query provided, there is an unnecessary semicolon (;) after the values clause. This results in an "Invalid SQL query" error when executed in the SQL editor.

insert into
  vault.secrets (secret, key_id)
values 
  (
    'AKIAXXXXXX',
    (select id from pgsodium.valid_key where name = 'vault_access_key_id')
  );
returning
  key_id;

This returns 'Invalid SQL query' in the SQL editor.

Describe the improvement

By removing the semicolon, the query will execute correctly in the SQL editor without generating an error.

insert into
  vault.secrets (secret, key_id)
values 
  (
    'AKIAXXXXXX',
    (select id from pgsodium.valid_key where name = 'vault_access_key_id')
  )
returning
  key_id;

Updating to 0.1.16 from 0.1.14 broke my wrapper due to access issues to `wrappers.wrappers_fdw_stats`

Bug report

  • I confirm this is a bug with Supabase, not with my own application. -> Well I can't be 100% sure...
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

I was using a wrapper on my Cloud Supabase install. I needed to upgrade to be able to use the Airtable wrapper. To do so, I paused the project and reinstalled, as per advice offered on Discord (https://discord.com/channels/839993398554656828/1006358244786196510/threads/1144271220414631956)

Since then queries on the foreign tables fail because of permission denied for table wrappers_fdw_stats, even with the postgres user in psql.

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  1. Pause/Resume your project on Supabase from a previous version
  2. `select * from stripe.customers limit 3;
  3. see the following error message
ERROR:  permission denied for table wrappers_fdw_stats
CONTEXT:  SQL statement "insert into wrappers.wrappers_fdw_stats as s (fdw_name, create_times) values($1, $2)
         on conflict(fdw_name)
         do update set
            create_times = coalesce(s.create_times, 0) + excluded.create_times,
            updated_at = timezone('utc'::text, now())"

Expected behavior

My previously configured foreign tables to work as previously

System information

Irrelevant as the problem happens server-side at Supabase's

Additional context

I tried grant all on wrappers.wrappers_fdw_stats to postgres; but even that failed with the same error.

Cant find Clerk FDW inside extension list

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

Can't find Clerk FDW inside the extension list

To Reproduce

As per this blog post - https://supabase.com/blog/supabase-wrappers-v02 under "New Wrappers and Improvements", it is mentioned as Clerk as supported FDW.

Expected behavior

However, I cant find inside the Supabase instance, (updated to latest pg version as well)

image

Screenshots

If applicable, add screenshots to help explain your problem.

System information

  • OS: [e.g. macOS, Windows]
  • Browser (if applies) [e.g. chrome, safari]
  • Version of supabase-js: [e.g. 6.0.2]
  • Version of Node.js: [e.g. 10.10.0]

Additional context

Paul and Tembo team agreed that it will be supported as long as Tembo maintains this (on X)

Support json data type for Airtable FDW

The Airtable FDW currently only supports below data types:

  • bool
  • char
  • int2
  • float4
  • int4
  • float8
  • int8
  • numeric
  • text
  • date
  • timestamp

It will be great if json data type can be supported.

`EXPLAIN ANALYZE` crashes the backend for queries with quals

Bug report

EXPLAIN ANALYZE crashes the backend for queries with quals

Running an EXPLAIN ANALYZE query using quals on an fdw table crashes the backend.

To Reproduce

  • deploy helloworld_fdw as per documentation
  • EXPLAIN ANALYZE SELECT * FROM hello WHERE id IS NOT NULL

Removing the qual eliminates the problem; both of these work:

  • EXPLAIN ANALYZE SELECT * FROM hello
  • EXPLAIN ANALYZE SELECT * FROM hello WHERE true

Expected behavior

Query should not crash the backend

System information

  • OS: Linux (PopOs) kernel 6.0.6 x86_64

Replace references to PGX with references to PGRX

Improve documentation

Link

https://github.com/supabase/wrappers

Describe the problem

The documentation refers to PGX, but evidently PGX is now PGRX. Perhaps its name changed, but in any case, this changes the installation instructions and leads to confusion.

Describe the improvement

Change all references to PGX, to PGRX. For instance:

  1. Built on top of pgx, providing higher level interfaces, without hiding lower-level C APIs. -> Built on top of pgrx, providing higher level interfaces, without hiding lower-level C APIs.
  2. Wrappers is a pgx extension, you can follow the pgx installation steps to install Wrappers. -> Wrappers is a pgrx extension, you can follow the pgrx installation steps to install Wrappers.
  3. cargo pgx install --pg-config [path_to_pg_config] --features stripe_fdw -> cargo pgrx install --pg-config [path_to_pg_config] --features stripe_fdw
  4. Run it using pgx with feature -> Run it using pgrx with feature
  5. cargo pgrx run pg14 --features helloworld_fdw
  6. cargo pgx test --features all_fdws,pg15 -> cargo pgrx test --features all_fdws,pg15
  7. Windows is not supported, that limitation inherits from pgrx -> Windows is not supported, that limitation inherits from pgrx

Clickhouse FDW w/ View and Vault Error

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

Using Clickhouse private schema w/ a public view that exposes some data doesn't work when using Vault conn_string_id.

I was able to get clickhouse working w/ a FDW that stores everything in a private schema table. It exposes a public view. When switching to vault, and attempting to access my view, I get the error:

permission denied for schema vault

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  1. Setup a new private schema (I called it clickhouse).
  2. Follow all steps outlined in clickhouse docs (using Vault)
  3. Create a foreign table in a private instead of public schema (i.e. create foreign table clickhouse.my_priv_table ...)
  4. Create a public view from that table: CREATE VIEW my_public_table my WITH (security_invoker) AS SELECT * FROM clickhouse.my_priv_table;
  5. Attempt to access the public view w/ an authenticated user.

Expected behavior

I should be able to access the public view when using vault to store connection details.

Screenshots

Screenshot 2024-03-22 at 5 01 32 PM

System information

  • OS: [e.g. macOS, Windows]
  • Browser (if applies) [e.g. chrome, safari]
  • Version of supabase-js: [e.g. 6.0.2]
  • Version of Node.js: [e.g. 10.10.0]

Additional context

Add any other context about the problem here.

`postgres` ownership not preserved during pause/restore

Bug report

If you create a Wrapper in Supabase Studio it is owned by the postgres role.

If you then pause and restore the project, the owner of the foreign data wrapper + server change to supabase_admin

Note that the ownership changes for:

  • The foreign data wrapper create foreign data wrapper ...
  • The foreign server create server

but not the foreign tables (these continue to be owned by postgres)

I tested with airtable and firebase

There is an associated support ticket (resolved): https://app.hubspot.com/live-messages/19953346/inbox/5492182653#email

please update in the notion task as well as here

Parquet support in s3

It would be amazing if the s3 FDW supported parquet.

(bonus points if there was some sort of compression support)

feat: create a FDW can read file data from S3

Feature request

Describe the feature

Create a FDW can read file data from S3, it will also be compatible with Supabase Storage.

Additional context

  • Read-only should be enough for the first stage, we can implement writing in the next release.
  • If we can support multiple sequence files read and common compressions like gzip, that will be great.

Stripe joins failing to return results.

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

Joining stripe fdw tables seems to fail or return incomplete results. I'm not sure if this is expected and just not yet implemented or a bug or what so opening an issue before I dig deeper.

e.g.

SELECT stripe_customers.email, stripe_subscriptions.currency 
FROM stripe_customers 
INNER JOIN stripe_subscriptions ON stripe_customers.id = stripe_subscriptions.customer

Using the mock data returns nothing and using our stripe account data returns a single row even though there are additional valid results.

To Reproduce

Add the following test and run the test suite.

  let results = c
                .select(
                    "SELECT stripe_customers.email, stripe_subscriptions.currency FROM stripe_customers INNER JOIN stripe_subscriptions ON stripe_customers.id = stripe_subscriptions.customer",
                    None,
                    None,
                ).unwrap()
                .filter_map(|r| {
                    r.get_by_name::<&str, _>("email")
                        .unwrap()
                        .zip(r.get_by_name::<&str, _>("currency").unwrap())
                })
                .collect::<Vec<_>>();
            assert_ne!(results, vec![]);

Run the query above against a stripe account with customers and subscriptions.

Expected behavior

Joined rows are returned.

Hello World Wrapper

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

There is no function for hello_world_fdw_handler()

CREATE FOREIGN DATA WRAPPER helloworld_wrapper
HANDLER hello_world_fdw_handler
VALIDATOR hello_world_fdw_validator;

Always returns this error.
ERROR: function hello_world_fdw_handler() does not exist

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  • Have a local instance of Supabase running
  • Download the Repo for the wrapper
  • install the hello world fdw.

Expected behavior

Getting data from Postgres.

Screenshots

image

System information

-Mac M2

Additional context

Can't find any other people that have documented having the same problem.

I get 'undefined symbol: __pgrx_marker' while testing helloworld_fdw

If I clone the source code from github and build it, it can work without any error.

I failed to run it with error 'undefined symbol: __pgrx_marker"' if I create a new project with the same code of helloworld_fdw.

below is my Cargo.toml:

[dependencies]
pgrx = "=0.11.0"
supabase-wrappers = { git = "https://github.com/supabase/wrappers.git", tag = "v0.2.0"}

I tested pgrx 0.11.0 + tag 0.2.0 and pgrx0.11.2+main branch. the results are the same.

the detailed error message are:

The application panicked (crashed).
Message:  Couldn't call __pgrx_marker: DlSym { desc: "/home/liyang/Project/random_fdw/target/debug/librandom_fdw.so: undefined symbol: __pgrx_marker" }
Location: /home/liyang/.cargo/registry/src/index.crates.io-6f17d22bba15001f/cargo-pgrx-0.11.0/src/command/schema.rs:413

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   0: cargo_pgrx::command::schema::generate_schema with pg_version=15.5 profile=Dev test=false path=/opt/pg15/share/postgresql/extension/random_fdw--0.1.0.sql features=["pg15"]
      at /home/liyang/.cargo/registry/src/index.crates.io-6f17d22bba15001f/cargo-pgrx-0.11.0/src/command/schema.rs:176
   1: cargo_pgrx::command::install::install_extension with pg_version=15.5 profile=Dev test=false features=["pg15"]
      at /home/liyang/.cargo/registry/src/index.crates.io-6f17d22bba15001f/cargo-pgrx-0.11.0/src/command/install.rs:114
   2: cargo_pgrx::command::run::run with pg_version=15.5 profile=Dev
      at /home/liyang/.cargo/registry/src/index.crates.io-6f17d22bba15001f/cargo-pgrx-0.11.0/src/command/run.rs:94
   3: cargo_pgrx::command::run::execute
      at /home/liyang/.cargo/registry/src/index.crates.io-6f17d22bba15001f/cargo-pgrx-0.11.0/src/command/run.rs:55

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

the rust version is: rustc 1.75.0 (82e1608df 2023-12-21)

WIP: Salesforce Remote Wrapper

Feature request

Simple REST Client that calls the Salesforce API

This is something I would like to work on, and am creating this ticket to track it.

Is your feature request related to a problem? Please describe.

Not my current problem, but one I've had in the past many times. Salesforce API connections are necessary to any business, and could be revolutionary in this context for every and any business reason a Salesforce customer could have. I've worked a ton with the Salesforce API, and can make this extensible so that some of their subsidiary API's (i.e. SteelBrick/CPQ) could be plugged in.

Salesforce also has its own Meta API that describes all of its API objects and relationships, making way for reflection in creating staging tables ranging from ETL Staging Tables to joins between the customer table and Salesforce. But that would require a separate schema with separate permissions, but still something to keep in mind.

But there are three problems businesses who use Salesforce usually need to solve:

Snapshots:

These are regularly performed queries used to capture the current state of the Salesforce data. I say "current state" because Salesforce only keeps an audit log if you specify it, and they take maintenance from Salesforce Devs in most cases. But these "Snapshot Queries" are made of a small group of primitive-equivalent types, from PickLists (which could be proxied/equivalent to an Enum/MultiSelect), String, Float, etc, with few exceptions.

Live Updates:

Salesforce provides a long-polling endpoint that uses the Bayeux Protocol to allow consumers to listen to custom "Topics" which are broadcast during CRUD events on Salesforce Objects, and ChangeSets which are broadcasted every time an object or object type experiences a change. This allows consumers to maintain state or at least eventual consistency. I don't think this problem could be solved in this context, as we're not working on a Materialize type of SQL Streaming, but I don't think that's outside the realm of possibilities

Roles/Permissions

Typically, if a Salesforce customer integrates with an app, there is only ever one permission set that gives all the access that integration would ever need. Our case would be unique in that perhaps this is being used for a static query in a deployment that has service_role access, but this would be extremely useful in data exploration, and in one-off queries. I, as a hypothetical admin or CTO, want to know that there are read-only credentials with tight access on schema/table/column/row. This is cleanly managed by just creating Salesforce API Keys for whomever and storing them as Env Vars on their machine, so there is no new level of risk or need for access/role permissions.

Describe the solution you'd like

I would like to be able to perform CRUD statements via the Salesforce API from SQL. I want the SQL client to consume the Meta API of my organization, which shows me all the objects and fields I have access to, so I can see what "tables" and "columns" I have access to at query time.

I would also like to be able to perform SOQL queries via string parameters:

select * from Accounts where soql_condition = "AccountId = ..."

This would allow me to perform functions and joins on my Salesforce Instance as part of my query, as I already have a massive subset of views and functions in my Salesforce's Apex repository, and SOQL exposes the full functionality of Salesforce to me (as in it can all be set up to be called on CRUD Triggers.

Describe alternatives you've considered

// TODO
A clear and concise description of any alternative solutions or features you've considered.

Additional context

// TODO:
Add any other context or screenshots about the feature request here.

Personal Access Tokens don't work with the Airtable Wrapper

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

API keys will be deprecated by the end of January 2024 on Airtable. After this date, API keys will stop working and we'll have to migrate to personal access tokens. Personal access tokens allow you to more securely grant API access to Airtable data.

Personal access tokens should be passed with your API requests as a Authorization: Bearer header.

curl https://api.airtable.com/v0/YOUR_BASE_ID/YOUR_TABLE_ID_OR_NAME -H \
"Authorization: Bearer YOUR_TOKEN"

I looked into the source code of the airtable_fdw and it looks like we're already authenticating using Authorization: Bearer header, but when I tried creating a personal access token to use with the wrapper, I get the following error:

Error running SQL: Failed to run sql query: invalid secret id "<TOKEN>": failed to parse a UUID

This is an example (won't work) of a token:

patbYo3eCBwtOuRLL.db934f8b0634c9f2f5471458b55222fb1231d1a3600bd09ww87f8c760b475b74

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  1. Follow the steps to create the Airtable integration (https://supabase.com/docs/guides/database/extensions/wrappers/airtable)
  2. Instead of using the API Key, use a Personal Access Token (https://airtable.com/create/tokens)
  3. Run your select query and see the error

Expected behavior

A clear and concise description of what you expected to happen.

The Airtable wrapper should work with Personal Access tokens.

Screenshots

N/A

System information

N/A

Additional context

N/A

Binary release does not work on newer distros

Bug report

  • [x ] I confirm this is a bug with Supabase, not with my own application.
  • [ x] I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

The released wrappers need libssl1.1 which is not included in modern Debian and Ubuntu. That way it's necessary to build the extension locally before including in a modern PostgreSQL-Container.

I am a little confused that it uses the old libssl, because the ubuntu-latest runner should be Ubuntu 22.04 which uses a new openssl.

Clickhouse parametized query: unsupported operator expression in qual

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

I have a quite complex view in clickhouse that looks like this

CREATE VIEW IF NOT EXISTS mau_final_param as
SELECT DISTINCT ON (m.date,m.app_id) 
  m.date AS date,
  m.app_id AS app_id,
  COALESCE(m.total, 0) AS mau,
  COALESCE(l.get, 0) AS get,
  COALESCE(l.fail, 0) AS fail,
  COALESCE(l.install, 0) AS install,
  COALESCE(l.uninstall, 0) AS uninstall,
  COALESCE(l.bandwidth, 0) AS bandwidth,
  COALESCE(s.storage_added, 0) AS storage_added,
  COALESCE(s.storage_deleted, 0) AS storage_deleted
  FROM (SELECT result.1 date, uniqMerge(arrayJoin(result.2)) total, app_id
    FROM (
        SELECT 
            groupArray((date, value)) data,
            arrayMap(
                (x, index) -> (x.1, arrayMap(y -> y.2, arraySlice(data, index))), 
                data, 
                arrayEnumerate(data)) result_as_array,
            arrayJoin(result_as_array) result, app_id
        FROM (        
            SELECT app_id, date, total value
            FROM (
                /* emulate the original data */
                SELECT app_id, total, date from mau where hasAll({app_list:Array(String)}, [app_id]) 
            ORDER BY date desc, app_id)
        ) group by app_id
    ) group by app_id, date order by date desc) m
  LEFT JOIN logs_daily l ON m.date = l.date AND m.app_id = l.app_id
  LEFT JOIN app_storage_daily s ON l.date = s.date AND l.app_id = s.app_id
  group by m.app_id, m.date, l.get, l.install, l.uninstall, l.bandwidth, l.fail, s.storage_added, s.storage_deleted, m.total;

This view uses parametrized query, in clickhouse I can use this view like this:

select * from mau_final_param(app_list=['com.demo.app']);

Now, I would like to do the same in supabase with clickhouse fdw
As such, I created a foreign table:

create foreign table clickhouse_app_usage_parm (
 date date,
 app_id text,
 bandwidth bigint,
 mau bigint,
 get bigint,
 fail bigint,
 uninstall bigint,
 install bigint,
 storage_added bigint,
 storage_deleted bigint,
 _app_list text[]
)
server clickhouse_server
options (
 table '(select * from mau_final_param(app_list=${_app_list}))'
);

and then I tried to fetch this view like this:

DO $$
DECLARE app_ids text[];
BEGIN
    select array_agg(app_id) INTO app_ids FROM apps;
    select * from clickhouse_app_usage_parm where _app_list=app_ids;
END $$;

Unfortunately this did not work and I got the following error:

WARNING:  unsupported operator expression in qual: {OPEXPR :opno 1070 :opfuncid 744 :opresulttype 16 :opretset false :opcollid 0 :inputcollid 100 :args ({VAR :varno 1 :varattno 11 :vartype 1009 :vartypmod -1 :varcollid 100 :varlevelsup 0 :varnosyn 1 :varattnosyn 11 :location 46} {CONST :consttype 1009 :consttypmod -1 :constcollid 100 :constlen -1 :constbyval false :constisnull false :location 56 :constvalue 64 [ 0 1 0 0 1 0 0 0 0 0 0 0 25 0 0 0 2 0 0 0 1 0 0 0 84 0 0 0 99 111 109 46 100 101 109 111 97 100 109 105 110 46 97 112 112 0 0 0 64 0 0 0 99 111 109 46 100 101 109 111 46 97 112 112 ]}) :location 55}
DETAIL:  Wrappers
ERROR:  unmatched query parameter: _app_list
CONTEXT:  SQL statement "select * from clickhouse_app_usage_parm where _app_list=app_ids"
PL/pgSQL function inline_code_block line 5 at SQL statement

To Reproduce

Please see above

Expected behavior

I would expect the parametrized query to work one way or the other. And the unsupported operator expression in qual to be fixed

Screenshots

If applicable, add screenshots to help explain your problem.

System information

  • OS: linux (endevourOS, based on arch)
  • version of wrappers: 0.2.0
  • Clickhouse version: 23.12.1.1368

Stripe Wrapper Rate Limit?

I set up the Stripe wrapper then created a database view for my stripe products. I'm loading the products on getServerSideProps. It does work, until I refresh the page 4 times fast, then all data from the foreign table returns empty for an arbitrary amount of time. Are there rate limits to the Stripe Wrapper? Should I not be querying a view to a foreign Stripe table in realtime? I'm thinking I need to pull the entire thing and just use Stripe's API directly for listing products. Their API docs say they support 100 requests per second, but the wrapper can't even do 4...

create view
  public.stripe_products as
select
  products.id,
  products.name,
  products.active,
  products.default_price,
  products.description,
  products.created,
  products.updated,
  products.attrs,
  products.attrs -> 'metadata'::text as metadata
from
  stripe.products;

Using service role server side:

    const { data: products, error } = await supabaseAdmin.from('stripe_products').select('*').limit(3)
    const { data: prices } = await supabaseAdmin.from('stripe_prices').select('*').order('unit_amount').limit(3)

I'm thinking of using a materialized view? But only for products listings... For customer data it needs to be realtime I think. But at that point I may as well just use getStaticProps, fetch the data from their API, and then re-deploy when I make changes to my subscription pricing.

Firebase FDW not support nested collection

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

For Firebase FDW, it can only support base level collection, the nested collection like collection1/document/collection2 is not supported.

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  1. Create a Firebase foreign table using object option firestore/collection1/document/collection2
  2. Query that table only return data from collection1

Expected behavior

Return data from collection2

Screenshots

N/A

System information

  • OS: Mac
  • Version of Wrappers: v0.1.19

Additional context

N/A

BigQuery wrapper: JSON, Numeric not supported

Trying to query a table with JSON data type in BigQuery.

Foreign table, with json column type, gets created fine but upon querying, the wrapper returns:

Failed to run sql query: get table metadata failed: Request error (error: error decoding response body: unknown variant `JSON`, expected one of `STRING`, `BYTES`, `INTEGER`, `INT64`, `FLOAT`, `FLOAT64`, `NUMERIC`, `BIGNUMERIC`, `BOOLEAN`, `BOOL`, `TIMESTAMP`, `DATE`, `TIME`, `DATETIME`, `RECORD`, `STRUCT` at line 15 column 22)

Add Stripe API URL configuration and documentation

Improve documentation

Link

https://supabase.github.io/wrappers/stripe/#connecting-to-stripe

Describe the problem

Its missing, and confusing. Is there a reason why https://api.stripe.com is not inserted by default?

Describe the improvement

add that https://api.stripe.com is the default base URL.
Documented herehttps://stripe.com/docs/api

Without this, all DB operations fail, so making it undefined if it is not valid seems off.

Additional context

Uploading Screenshot 2024-01-05 at 4.48.29 PM.png…

BigQuery wrapper: all columns must be defined

The BQ wrapper works great out-of-the-box on supabase cloud. A game changer really for us as we only started evaluating SB yesterday.

One word of caution though - or a feature request ?: when creating the PG foreign table as per the instructions, the list of columns must match exactly the source table. Ideally one would want to define any subset instead i.e. if you only need the read a few fields. If no plan to change, please update the documentation ( + also update https://supabase.com/docs/guides/database/extensions/wrappers and https://supabase.github.io/wrappers/ as BigQuery is available)

Workaround (especially if lots of columns): create & use a BQ view as source.

add limitation description for each FDW

Improve documentation

All the FDW documents on https://supabase.github.io/wrappers/

Describe the problem

Each FDW is based on different 3rd party lib, which has specific limitations. For example, ClickHouse FDW needs to read the FULL result set from remote to local, this will exhaust local PG memory if the data set is large. The current documents didn't clearly specify those FDW specific limitations.

Describe the improvement

For each FDW, we need a separate section to clearly describe what are the limitations and pitfalls.

Additional context

N/A

Server died

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

Sometimes the requested query is too long to run or too big i'm not sure, and then the CPU of supabase goes crazy, the only way to make it go down is to reboot the instance, can we have a way to limit the response time or the usage of the wrapper to not kill the db itself?

Expected behavior

Never make the db died

Screenshots

If applicable, add screenshots to help explain your problem.

System information

  • OS: [e.g. macOS, Windows]
  • Browser (if applies) [e.g. chrome, safari]
  • Version of supabase-js: [e.g. 6.0.2]
  • Version of Node.js: [e.g. 10.10.0]

Additional context

Add any other context about the problem here.

Stripe FDW randomly returns no data

I am querying stripe FDW tables using an rpc call using supabase-js from my web app. About half the time, the query returns no results. It should return 2 rows, and does so about half the time. I can reproduce it reliably by just refreshing the page. It is not obvious when it will return results and when not. It may be a function of how quickly I refresh, but isn't always. I can refresh after waiting several minutes, get no results, refresh again and get results as well as vice-versa. There isn't any rhyme or reason to it as far as I can tell. When it returns no results, it does not have an error, just an empty result: {data: [], error: null}.

Supabase support is telling me to use pg_cron and to build what is effectively a materialized view of the stripe FDW data within supabase. If that is the recommended workflow, I think it should be documented as such.

Here is the rpc call with the query, it joins the product and price tables. There are two products, and those were populated once a while ago and have not changed.

 create or replace function public.get_subscription_prices()
returns table (
    name text,
    product_id text,
    price_id text, 
    price real
)
language plpgsql security definer as
$$
#variable_conflict use_column
begin
    set statement_timeout to 60000;
    return QUERY
        select p.name, p.id as product_id, q.id as price_id, (q.unit_amount / 100.0)::real as price
        from stripe.products p
        left join stripe.prices q on p.id = q.product
        where p.active and q.active;
end
$$;

BigQuery foreign data wrapper does not get all rows

Bug report

It appears that the BigQuery foreign data wrapper is not bringing all rows over to postgres in all situations.

Describe the bug

As suggested in the blog post I am using the FWD for a very simple etl sync job. Just getting any new data from bigquery into postgres. But it appears that only an arbitrarily cut off number (35000) of rows are being considered for the input.

To Reproduce

`

create foreign table bq_entries (
id INTEGER
,project_shortname text
,user_shortname text
,description text
,user_id INTEGER
,firstname text
,lastname text
,email text
,duration INTEGER
,day DATE
)
server my_bigquery_server_lab
options (
table 'entries_join', -- Note that this is a view inside bigquery
location 'europe-west6',
startup_cost '42'
);

select count(*) from local_entries --149932, is the count before new insert. This data was brought in the first time via CSV. Now creating a regular updating job for getting data from bigquery

insert into local_entries
select b.* from bq_entries b
where b.id not in ( select id from local_entries )

select count(*) from local_entries; -- 170612 resulting merged count is smaller than expected. (20680 were added via insert. Expected 87729 to be added)

select count(*) from bq_entries; --35000 the wrong count. On bigquery there are 258341. It is also strange that this is such a clean number 35000 seems like some kind data import limit setting.

select count(distinct id) from bq_entries; -- 258341 the correct count. <-- This is most interesting a different type of aggregation gets the correct count. It is of course also just very strange that a count(distinct) would get more rows than without a distinct.

`

Connecting to Clickhouse Cloud - secure connection

Bug report

I'm trying to connect to my Clickhouse Cloud instance via a foreign data wrapper. TCP connections to CH cloud instances must be secure - post 9440 and ssl enabled. I have my port correctly configured but currently I get the following error:

Failed to run sql query: connection failed: Input/output error: `Connection reset by peer (os error 104)`

I've encountered this error before from client code that doesn't have ssl enabled.

Are secure TCP connections currently enabled for the Clickhouse FDW?

BigQuery wrapper: generated column error

As a workaround for the wrapper not supporting JSON column type, we wanted to use a generated column to cast to json on-the-fly.

The idea was to add a column like jsonCol json GENERATED ALWAYS AS (cast(jsonStringCol as json)) STORED.
However that fails and I suspect the wrapper tries to map it with a source column instead of computing it.

To reproduce:

Using the steps at https://github.com/supabase/wrappers/tree/main/wrappers/src/fdw/bigquery_fdw, edit the foreign table ddl like so:

create foreign table people (
  id bigint,
  name text, 
  ts timestamp,
  test text generated always as (substring(name, 3, 2)) stored
)
  server bq_tmp
  options (
    table 'people',     -- source table in BigQuery, required
  );

select * from people

Error

Failed to run sql query: get table metadata failed: Response error (error: ResponseError { error: NestedResponseError { 
code: 400, errors: [{"reason": "invalid", "message": "Selected non-existent field: test", "domain": "global"}], 
message: "Selected non-existent field: test", status: "INVALID_ARGUMENT" } })

Workaround

Suboptimal, create/use a view

Return `Result<T, E>` from trait methods

Currently, error handling is implemented the way it is in pgx, which is by panicing and catching the panic at the transaction boundary. This is good at the interface with postgres, but for a higher level API, using the standard rust Result method of error handling is generally more ergonomic. This because interfaces signal fallibility and it allows using the standard machinery for handling and converting errors.

struct HelloWorldFdw{ url: String }

impl ForeignDataWrapper for HelloWorldFdw {
    fn new(options: &HashMap<String, String>) -> Self {
        Self {
            url: require_option("url", options).unwrap()
        }
    }
}

Here, fn new is fallible, but nothing signals its fallibility to the casual reader or implementer.
require_option diverges, so the unwrap is safe (actually require_option could return String instead of Option<String>, because if it would be None, it would panic through report_error).
If new returned Result<Self, WrappersError>, this could be rewritten as, for example:

struct HelloWorldFdw{ url: String }

impl ForeignDataWrapper for HelloWorldFdw {
    fn new(options: &HashMap<String, String>) -> Result<Self, WrappersError> {
        Ok(Self {
            url: require_option("url", options)?
        })
    }
}

Where require_option() returns a Result<String, WrappersError>, with the error being a WrappersError::OptionNameNotFound(String), with the string representing the option name. It is now clear that fn new is fallible, and require_option is actually just options.get(<name>).ok_or(WrappersError::OptionNameNotFound(<name>))
Of course other errors could also be returned from new(). I imagine WrappersError to look something like:

enum WrappersError {
    OptionNameNotFound(String),
    ColumnNameNotFound(String),
    InvalidDataType(String),
    // ... etc
    Other(Box<dyn Error>),
}

impl WrappersError {
    fn error_code(&self) -> PgSqlErrorCode {
        match self {
            OptionNameNotFound(_) => PgSqlErrorCode::ERROR_CODE_FDW_OPTION_NAME_NOT_FOUND
        }
    }
}

impl Display for WrappersError{ /*...*/}

In FdwState, errors would be converted to the panic-y kind:

match Wrapper::new(options) {
    Err(e) => report_error(e.error_code(), &e.to_string()),
    Ok(wrapper) => wrapper,
}

I'd be happy to make a PR implementing this by the way.

Firebase Wrapper: Failed to retrieve rows from table

Bug report

Describe the bug

Looks like this foreign table setting from Supabase doc is not correct:

create foreign table firebase_users (
uid text,
email text,
created_at timestamp,
attrs jsonb
)
server firebase_server
options (
object 'auth/users'
);

But the error message returns the right user data in the error message, in the format:

{
"kind": "identitytoolkit#DownloadAccountResponse",
"users": [...]
}

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

insert into vault.secrets (name, secret)
values (
  'firebase',
  '{
    ************************
  }'
)
returning key_id;

create server firebase_server
  foreign data wrapper firebase_wrapper
  options (
    sa_key_id '***************************', -- The Key ID from above.
    project_id 'xxxxxxxx'
);

create foreign table firebase_users (
  uid text,
  email text,
  created_at timestamp,
  attrs jsonb
)
  server firebase_server
  options (
    object 'auth/users'
  );

Expected behavior

Display user data in Rows or return them from a Select query on the foreign table

Screenshots

Screenshot 2024-01-06 at 21 52 04

System information

  • OS: [e.g. macOS, Windows] macOS
  • Browser (if applies) [e.g. chrome, safari]: Chrome Version 120.0.6099.199
  • Version of supabase-js: [e.g. 6.0.2]
  • Version of Node.js: [e.g. 10.10.0]

Support `import foreign schema` for wrappers with static schema.

Enhancement

Describe the enhancement

For foreign data sources like Stripe which have a fixed schema (as opposed to something like Airtable where the user can create any schema) support import foreign schema statement.

Additional context

This will make is easy for users to create all foreign tables by writing something like:

import foreign schema stripe_schema
from server stripe_server into stripe;

Instead of manually specifying tables like:

create foreign table stripe.accounts (
  id text,
  business_type text,
  country text,
  email text,
  type text,
  created timestamp,
  attrs jsonb
)
  server stripe_server
  options (
    object 'accounts'
  );

See FDW routines for import foreign schema.

Stripe Wrapper: selecting `attrs` field and using a where clause filters out rows

Bug report

Describe the bug

If a query to a stripe foreign table selects the attrs field and uses a WHERE clause, then no rows will be returned, unless all columns used in the WHERE clause are also selected.

To Reproduce

  1. Start a local environment with the supabase CLI (supabase init; supabase db start)
  2. Connect to the database with psql (docker exec -it supabase_db_foo psql -U postgres)
  3. Create a stripe account and create customers and charges in test mode.
  4. Follow instructions at https://supabase.github.io/wrappers/stripe/#wrapper to create the wrapper extension, add stripe test keys (I used the "Auth Insecure" method because vault isn't available in the CLI currently), create the foreign server, and create the foreign tables.
  5. Run SELECT queries that select attrs with and without including columns used in a where clause

Some example queries and the results (with added explanatory headers):

################################################################################
# Basic demonstration that selecting attrs without the column in the WHERE
# clause filters out all rows
################################################################################

postgres=# select id from stripe.customers where id = 'cus_NCPzasyajP5YPj';
         id
--------------------
 cus_NCPzasyajP5YPj
(1 row)

postgres=# select id, attrs from stripe.customers where id = 'cus_NCPzasyajP5YPj';
         id         |    attrs
--------------------+-----------------------------------------------------------
 cus_NCPzasyajP5YPj | {"id": "cus_NCPzasyajP5YPj", "name": "abc", "email": "[email protected]", ... }
(1 row)

postgres=# select attrs from stripe.customers where id = 'cus_NCPzasyajP5YPj';
 attrs
-------
(0 rows)



################################################################################
# Explain analyze results for the above
################################################################################

postgres=# explain analyze select id from stripe.customers where id = 'cus_NCPzasyajP5YPj';
                                                     QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
 Foreign Scan on customers  (cost=0.00..1.00 rows=1 width=0) (actual time=0.008..0.009 rows=1 loops=1)
   Filter: (id = 'cus_NCPzasyajP5YPj'::text)
   Wrappers: quals = [Qual { field: "id", operator: "=", value: Cell(String("cus_NCPzasyajP5YPj")), use_or: false }]
   Wrappers: tgts = ["id"]
   Wrappers: sorts = []
   Wrappers: limit = None
 Planning Time: 8.022 ms
 Execution Time: 352.394 ms
(8 rows)

postgres=# explain analyze select attrs from stripe.customers where id = 'cus_NCPzasyajP5YPj';
                                                     QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
 Foreign Scan on customers  (cost=0.00..1.00 rows=1 width=0) (actual time=0.060..0.061 rows=0 loops=1)
   Filter: (id = 'cus_NCPzasyajP5YPj'::text)
   Rows Removed by Filter: 1
   Wrappers: quals = [Qual { field: "id", operator: "=", value: Cell(String("cus_NCPzasyajP5YPj")), use_or: false }]
   Wrappers: tgts = ["attrs", "id"]
   Wrappers: sorts = []
   Wrappers: limit = None
 Planning Time: 8.165 ms
 Execution Time: 361.643 ms
(9 rows)



################################################################################
# If there are 2 columns in the WHERE clause, they both need to be selected in
# order for a row to be returned
################################################################################

postgres=# select id, name, attrs from stripe.customers where id = 'cus_NCPzasyajP5YPj' and name = 'abc';
         id         | name |    attrs
--------------------+------+----------------------------------------------------
 cus_NCPzasyajP5YPj | abc  | {"id": "cus_NCPzasyajP5YPj", "name": "abc", "email": "[email protected]", ... }
(1 row)

postgres=# select name, attrs from stripe.customers where id = 'cus_NCPzasyajP5YPj' and name = 'abc';
 name | attrs
------+-------
(0 rows)

postgres=# select id, attrs from stripe.customers where id = 'cus_NCPzasyajP5YPj' and name = 'abc';
 id | attrs
----+-------
(0 rows)



################################################################################
# The stripe charges table behaves the same
################################################################################

postgres=# select id, attrs from stripe.charges where id = 'ch_3MZiaiI3rSV8HFQa0lzuJV2I';
             id              |    attrs
-----------------------------+--------------------------------------------------
 ch_3MZiaiI3rSV8HFQa0lzuJV2I | {"id": "ch_3MZiaiI3rSV8HFQa0lzuJV2I", "paid": true, "order": null, "amount": 4900, ... }
(1 row)

postgres=# select attrs from stripe.charges where id = 'ch_3MZiaiI3rSV8HFQa0lzuJV2I';
 attrs
-------
(0 rows)

Expected behavior

I'd expect that select attrs from stripe.customers where id = 'foo' would return a row if there existed a row with id = 'foo', rather than needing to do select id, attrs from stripe.customers where id = 'foo' in order to return a row.

System information

  • OS: Ubuntu 22.04.1 LTS
  • Supabase CLI version: 1.36.5
  • Supabase postgres docker image tag: 15.1.0.33
  • Postgres server version: PostgreSQL 15.1 (Debian 15.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
  • Psql version: 15.1
  • Docker version: 23.0.1
  • Wrappers extension version: 0.1.7

Uppercased columns for Airtable FDW never return a value

Bug report

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

Quoted column names with uppercase letters do not return a value for Airtable wrapper.

To Reproduce

  1. Create a foreign data table with a quoted column name with an uppercase letter:
create foreign table my_foreign_table (
  "Full Name" text
)
server airtable_server
options (
  base_id 'appXXXX',
  table_id 'tblXXXX'
);
  1. Run select * from my_foreign_table.
  2. Note that the Full Name column never returns a value.

Expected behavior

The Full Name column should return a value.

Screenshots

N/A

System information

Reproducible on latest wrappers ref.

Additional context

N/A

Use of GitHub-specific emoji syntax breaks documentation in other contexts

Improve documentation

Link

https://pgt.dev/extensions/wrappers

Describe the problem

If you take a look at the README as it appears on the Trunk web site, you'll notice that instead of emojis ✅ and ❌, you see :white_check_mark: and :x: in the columns.

Describe the improvement

Instead of using GitHub-specific syntax, just use emojis.

Additional context

Emojis are part of unicode, and are far more widely supported than GitHub's alternative emoji codes.

Generic OpenAPI Wrapper for REST APIs

We could use an OpenAPI spec, which many REST services expose as a JSON endpoint:

    create server example_api
      foreign data wrapper example_api_wrapper
      options (
        open_api_url 'https://api.example.com/'
      );

Then we'd map:

    GET -> SELECT (which would map selected columns into a table)
    POST -> INSERT
    PATCH -> UPDATE
    DELETE -> DELETE

`wrappers_fdw` result, linker errors and new release?

Bug report

I've been trying to implement my own FDW using this crate, however I'm running into two issues (details on both below):

  • when trying to supabase-wrappers from crates (version v0.1.17) I'm getting an error from wrappers_fwd
  • when I try building with supabase-wrappers = { git = "https://github.com/supabase/wrappers", branch = "main" }, compiling seems to almost succeed, then I get a linker error right at the end

If instead I put my code as a new crate in the workspace, and use supabase-wrappers = { path = "../supabase-wrappers", default-features = false }, it builds fine.

I think the main request here is a new release of supabase-wrappers to crates.io, but any help with the linker error would be much appreciated.

I'm building on MacOS with cargo pgrx run pg15, using pgrx = { version = "=0.11.2" } and cargo --version cargo 1.77.1 (e52e36006 2024-03-26).

wrappers_fwd error with v0.1.17:

   |
71 | / #[wrappers_fdw(
72 | |     version = "0.0.1",
73 | |     author = "TESTING",
74 | |     website = "TODO: Add website here",
75 | |     error_type = "MyFdwError"
76 | | )]
   | |__^ expected `()`, found `Result<(), MyFdwError>`
   |
   = note: expected unit type `()`
                   found enum `std::result::Result<(), MyFdwError>`
   = note: this error originates in the attribute macro `wrappers_fdw` (in Nightly builds, run with -Z macro-backtrace for more info)
help: try adding a return type
   |
76 | )] -> std::result::Result<(), MyFdwError>
   |    ++++++++++++++++++++++++++++++++++++++++++++
help: consider using `Result::expect` to unwrap the `std::result::Result<(), MyFdwError>` value, panicking if the value is a `Result::Err`
   |
76 | )].expect("REASON")
   |   +++++++++++++++++
Linker Error

Building with

supabase-wrappers = { git = "https://github.com/supabase/wrappers", branch = "main" }
➤ cargo pgrx run pg15
       Using CliArgument("pg15") and `pg_config` from /Users/samuel/.pgrx/15.6/pgrx-install/bin/pg_config
    Stopping Postgres v15
    Building extension with features cshim pg15
     Running command "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/bin/cargo" "build" "--features" "cshim pg15" "--no-default-features" "--message-format=json-render-diagnostics"
   Compiling memchr v2.7.2
   Compiling proc-macro2 v1.0.79
   Compiling libc v0.2.153
   Compiling num-traits v0.2.18
   Compiling ahash v0.8.11
   Compiling zerocopy v0.7.32
   Compiling allocator-api2 v0.2.16
   Compiling libm v0.2.8
   Compiling num-bigint v0.4.4
   Compiling num-rational v0.4.1
   Compiling bitflags v2.5.0
   Compiling regex-syntax v0.8.3
   Compiling quote v1.0.35
   Compiling hashbrown v0.14.3
   Compiling indexmap v2.2.6
   Compiling bytes v1.6.0
   Compiling syn v2.0.58
   Compiling core-foundation-sys v0.8.6
   Compiling arrow-schema v49.0.0
   Compiling iana-time-zone v0.1.60
   Compiling static_assertions v1.1.0
   Compiling syn v1.0.109
   Compiling rustversion v1.0.15
   Compiling heck v0.4.1
   Compiling lexical-util v0.8.5
   Compiling rustix v0.38.32
   Compiling dirs-sys v0.4.1
   Compiling nom v7.1.3
   Compiling errno v0.3.8
   Compiling crc32fast v1.4.0
   Compiling clang-sys v1.7.0
   Compiling num-integer v0.1.46
   Compiling num-complex v0.4.5
   Compiling half v2.4.1
   Compiling chrono v0.4.37
   Compiling num-iter v0.1.44
   Compiling regex-automata v0.4.6
   Compiling cexpr v0.6.0
   Compiling num v0.4.1
   Compiling arrow-buffer v49.0.0
   Compiling regex v1.10.4
   Compiling pathsearch v0.2.0
   Compiling dirs v5.0.1
   Compiling lazy_static v1.4.0
   Compiling adler v1.0.2
   Compiling xattr v1.3.1
   Compiling lexical-parse-integer v0.8.6
   Compiling miniz_oxide v0.7.2
   Compiling bindgen v0.68.1
   Compiling arrow-data v49.0.0
   Compiling lexical-write-integer v0.8.5
   Compiling petgraph v0.6.4
   Compiling filetime v0.2.23
   Compiling jobserver v0.1.28
   Compiling arrow-array v49.0.0
   Compiling aho-corasick v1.1.3
   Compiling cc v1.0.91
   Compiling serde_derive v1.0.197
   Compiling thiserror-impl v1.0.58
   Compiling strum_macros v0.26.2
   Compiling arrow-select v49.0.0
   Compiling pgrx-sql-entity-graph v0.11.2
   Compiling thiserror v1.0.58
   Compiling pest v2.7.9
   Compiling tar v0.4.40
   Compiling flate2 v1.0.28
   Compiling lexical-write-float v0.8.5
   Compiling lexical-parse-float v0.8.5
   Compiling proc-macro2-diagnostics v0.10.1
   Compiling semver-parser v0.10.2
   Compiling pkg-config v0.3.30
   Compiling vcpkg v0.2.15
   Compiling unicode-width v0.1.11
   Compiling strum v0.26.2
   Compiling semver v0.11.0
   Compiling serde v1.0.197
   Compiling rustc_version v0.3.3
   Compiling comfy-table v7.1.1
   Compiling lexical-core v0.8.5
   Compiling atomic-traits v0.3.0
   Compiling enum-map-derive v0.17.0
   Compiling yansi v1.0.1
   Compiling either v1.10.0
   Compiling base64 v0.21.7
   Compiling rust_decimal v1.35.0
   Compiling itertools v0.12.1
   Compiling enum-map v2.7.3
   Compiling arrow-cast v49.0.0
   Compiling arrow-string v49.0.0
   Compiling arrow-ord v49.0.0
   Compiling arrow-arith v49.0.0
   Compiling arrow-row v49.0.0
   Compiling strum_macros v0.25.3
   Compiling serde_json v1.0.115
   Compiling toml_datetime v0.6.5
   Compiling serde_spanned v0.6.5
   Compiling serde_cbor v0.11.2
   Compiling toml_edit v0.22.9
   Compiling arrayvec v0.7.4
   Compiling pgrx-macros v0.11.2
   Compiling libduckdb-sys v0.10.1
   Compiling strum v0.25.0
   Compiling arrow v49.0.0
   Compiling ouroboros_macro v0.18.3
   Compiling supabase-wrappers-macros v0.1.15 (https://github.com/supabase/wrappers?branch=main#ec2fa29e)
   Compiling hashlink v0.8.4
   Compiling cast v0.3.0
   Compiling aliasable v0.1.3
   Compiling smallvec v1.13.2
   Compiling fallible-iterator v0.3.0
   Compiling fallible-streaming-iterator v0.1.9
   Compiling toml v0.8.12
   Compiling cargo_toml v0.16.3
   Compiling ouroboros v0.18.3
   Compiling pgrx-pg-config v0.11.2
   Compiling pgrx-pg-sys v0.11.2
   Compiling pgrx v0.11.2
   Compiling supabase-wrappers v0.1.17 (https://github.com/supabase/wrappers?branch=main#ec2fa29e)
   Compiling duckdb v0.10.1
   Compiling duckgres v0.1.0 (/Users/samuel/code/duckfire/duckgres)
error: linking with `cc` failed: exit status: 1
  |
  = note: env -u IPHONEOS_DEPLOYMENT_TARGET -u TVOS_DEPLOYMENT_TARGET LC_ALL="C" PATH="/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/bin:/Users/samuel/.rye/shims:/Users/samuel/.turso:/Users/samuel/Downloads/google-cloud-sdk/bin:/Applications/PyCharm.app/Contents/MacOS:/Users/samuel/.pyenv/shims:/Users/samuel/.cargo/env:/Users/samuel/.config/yarn/global/node_modules/.bin:/Users/samuel/.yarn/bin:/usr/local/opt/[email protected]/bin:/Users/samuel/bin:/Users/samuel/.cargo/env:/Users/samuel/bin:/Applications/PyCharm.app/Contents/MacOS:/Users/samuel/.cargo/env:/Users/samuel/.config/yarn/global/node_modules/.bin:/Users/samuel/.yarn/bin:/usr/local/opt/[email protected]/bin:/Users/samuel/bin:/Users/samuel/.cargo/env:/Users/samuel/.pyenv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Users/samuel/.cargo/bin:/usr/local/bin" VSLANG="1033" ZERO_AR_DATE="1" "cc" "-Wl,-exported_symbols_list,/var/folders/f3/cn0463x50lb8mwkd2kw2hss40000gn/T/rustcWZbHR6/list" "-arch" "arm64" "/var/folders/f3/cn0463x50lb8mwkd2kw2hss40000gn/T/rustcWZbHR6/symbols.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.102kckojw7t5z11v.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.12hv1y5ms5v5i0zk.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.13z6csk850rpdai0.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.18y1wyqq76hovrlv.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.19526gg7v7ffyxto.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1a54eaqb1zawlb6r.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1doyyresi90eyzcy.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1du39v25u4rp9o1h.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1ec2idwlw6mw8mwa.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1kz7wb0cuuxarquq.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1lvo3nz7y4s59tgg.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1qrsam7jzw3lf0p4.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1r6eoh9ede79jeb1.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1txivv5j6j8j4940.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1wngzx6wdp0u5lns.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.1zuok6u2qub5c32p.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.216ui5li0cfibz9u.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.21gr6frqmd6bk91z.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.23ndhqlx5atxvmjr.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.23vab2ddj3aac71t.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.26183j22rg80j1vt.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.28gr5f3lzl30c6n5.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2bqdzdyiwccggf5g.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2cly7cuj9izruja8.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2e8uqap4zuiu4htd.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2igt3e4ngs2ihohn.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2knxyl23gc03ee46.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2ko5w7yg103pyq0l.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2n0m3w4nux2cnxwl.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2nkzmigb1k8kry6o.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2nx4patd32mibs15.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2ugmoevmrmquvh12.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2v5dhdnqjfq0rfph.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.2zzzn22cmtd6a202.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3366drm1zqm6hmkt.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.350my4wpxdu14xmp.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.36vjjerbi6lapmqh.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.37wk50ttbived2uq.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.38zn9ngcyrla8n1l.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.39dxz2nqfjbz01bw.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3aumkvwkv8kw1f3l.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3aw3uej1fnr4dsd0.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3blhjhcmb4nwxzv7.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3boaribfli1tyql6.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3brsd5985flxw89h.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3fcpfx5qzjsumiuc.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3hjscrzefcum3y8i.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3hwxt2yrhoyi1lxg.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3juiqn1tuh66qtz8.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3lu7apzxl26td054.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3q195598mf9b3zdm.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3q3nraiirge21ijd.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3qxn9b4hzmls2mio.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3s1dnkoy3ldv12ex.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3u4srcje3zjh10xz.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3uk3d9jh93y0ke4y.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3vu67ztax4vktznq.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3vvhr1cfhn85y2s8.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3x9l63aw8w4tamjy.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3y20ejhs4wex5x16.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3zj1ml0ofvlo5356.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3zp21jtk4gop0f39.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.3zuqcoa9yxna5jvl.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.40uj451b6jzixm8t.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.41hzbqp5sq2nqfjb.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.41jvw3duymfjls4v.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.4620ite4qm20i52n.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.47m567qkqx39reg4.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.482051fkhe5mvrz8.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.4862w0325hzpgi82.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.49m9iu0w3ok46gyo.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.49st5m2euv6286v2.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.4gm1fxo45g2wkk53.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.4iw37f55jgh8rhs3.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.4q5niu9cyszxdstj.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.4qnvcmjp5zozsofu.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.4s9495fgpbyoht33.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.50k8ys1vu135kg76.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.518xhnfzfcrclnk5.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.51npcf7kgke739f.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.5488he46u14je5n4.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.570iky7hurilw4c3.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.58lh9hnek1v51p2k.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.5easepmdr021a2gc.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.5esx8yoaf0hcwz0s.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.5fecz5a6aq5uvs8d.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.5g7ah6uuf0ty8ioj.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.898ldijkbmdwyxw.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.8gdx0y861iw8ih5.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.cqjznlnncvp04jb.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.f0vqh3b9f6v6o9n.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.gzqw1m0nq4vhm21.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.j01lhasj4e023in.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.ljp5a4k4xg73k3x.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.lu8p5t6xb085ekq.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.nxwhn0rwpqahwkw.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.odtrwvzv65fiqep.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.p8larvzrc6s8obs.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.s7oszds3uysm6sj.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.snkzf3awr4sb6pz.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.w4ybl5i9i8bsnem.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.xbwuxybeztvh99r.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.xymw9jd478uaevf.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.yig28lsx45e8tso.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.ze28ce3prnjdqdk.rcgu.o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/duckgres.133an1wbmvyytjs6.rcgu.o" "-L" "/Users/samuel/code/duckfire/duckgres/target/debug/deps" "-L" "/Users/samuel/code/duckfire/duckgres/target/debug/build/libduckdb-sys-49329ca0975970bc/out" "-L" "/Users/samuel/code/duckfire/duckgres/target/debug/build/pgrx-pg-sys-f872a450cde60f74/out/cshim" "-L" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libduckdb-717b3b4e186fef2f.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libsmallvec-90dd63944a6b1268.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/librust_decimal-ac3bd7da7d9cb678.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrayvec-d137bedf3be0c886.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libfallible_streaming_iterator-00fae9b4c635e48a.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libfallible_iterator-4592e8d58eff1fda.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libstrum-8b20e9f69f23a2ba.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libhashlink-9cf6f51e78d8b259.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow-ae995b50839e3851.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_row-ea27466847bbc60d.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_string-1ca93784ab18a0fc.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libregex-1dfd7f30bde234ff.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libregex_automata-df3e194905a40d63.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libaho_corasick-7a2e6b26067be7fe.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libmemchr-5cad9c9b896c042e.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libregex_syntax-4e97633453d488e3.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_cast-028ef861711018cf.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libbase64-b45b0bbc2b2cc541.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libcomfy_table-f937792bec4fa82c.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libunicode_width-79124411ee86fa9a.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libstrum-0de871f5b39dd3d5.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liblexical_core-d1fcc245706dd2c0.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liblexical_write_float-898395c3f91b31b1.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liblexical_write_integer-74f2cf23c91cd2c8.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liblexical_parse_float-815257e03943f4ee.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liblexical_parse_integer-36379b4dd2fa6e76.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liblexical_util-04741126bdfe8795.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_arith-b9d53d6ac885e133.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_ord-80b78f84b5bc7ddf.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_select-76a364a86230a693.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_array-b1f93a155bfe776f.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libchrono-47c458758e568c34.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libiana_time_zone-4a3a8f2178bb90e8.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libcore_foundation_sys-b971a31306e3fcc2.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_data-fe16c301ef9259f8.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_schema-7635ebe00362f120.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libarrow_buffer-3233d17133bd9028.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libbytes-8bf72d324ca1055f.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libhalf-00256ba84465d3ef.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libnum-33137f0b67f82dbc.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libnum_iter-15bc4893dc498a89.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libnum_rational-e5aebc44fe38dc23.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libnum_complex-512f0a67e87cc942.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libnum_bigint-6ef12919d4170a18.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libnum_integer-8b9ec87c0c4df0aa.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libnum_traits-17248b9e125d0f33.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liblibduckdb_sys-b12357de322cf71d.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libcast-4426c943191e5322.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libsupabase_wrappers-e41f49d343244dbd.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libtokio-1cb47b2f7e5459b5.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libsocket2-df90fea842f5f8bd.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libpin_project_lite-06336865bf0a4c84.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libmio-8f03b38c51f11a08.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libouroboros-bc329bda9b4999b4.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libstatic_assertions-8b9669df2a96d8c3.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libaliasable-b92c53d9c1a4b754.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libpgrx-93c8d5f403380538.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libheapless-f75c934116a235d5.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libstable_deref_trait-3be95b479cb75b6d.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libhash32-c13424d25bbc42b7.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libbyteorder-6669d586601557c4.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libseahash-793f9daca0288453.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libserde_cbor-65453b10cdb41ebd.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libhalf-919d0015e5688af2.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libatomic_traits-be3eb08683f3b0be.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libthiserror-0b5627216e140801.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libuuid-95c3ba24057f5080.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libserde_json-85cc4a1de2982946.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libitoa-d69778506b8b9c0c.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libryu-54278e7888408096.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libenum_map-1315788345e9f20d.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libbitvec-7207f16742549613.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libwyz-3e2e1ec28586d027.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libtap-692e0b8743550dea.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libradium-31d97be6fb58b7ff.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libfunty-c19e78cb3a82ed2e.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libpgrx_pg_sys-94db225c3065d8b5.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libserde-40634b855be663ec.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libpgrx_sql_entity_graph-9df2bcc37ece5421.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libunescape-de6a7341766421a2.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libpetgraph-9a391455a37b5315.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libindexmap-cab9abbaf8594ffb.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libequivalent-8a4981e3c57ace3e.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libhashbrown-181ef4d6fc7ad34f.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libahash-10062c3c88f2d005.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libgetrandom-409ab5a4d78988a6.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liblibc-c7231a5447b9cb3e.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libcfg_if-041709df2f5d193e.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libzerocopy-c206ae876dd654c2.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/liballocator_api2-4efc7444e8497832.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libfixedbitset-3a1d38041303bd60.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libconvert_case-ed7a0df4d5fb65c8.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libunicode_segmentation-596526c1faa796d6.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libeyre-8804a000ab1aa832.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libindenter-c820ee2dd3fc9d05.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libonce_cell-5ee9f6cd1097b921.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libsyn-073cc83b10484598.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libquote-a1ee418069fba39d.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libproc_macro2-7ff50c9553398970.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libunicode_ident-fb12c460d0adeb19.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libproc_macro-eb0929e1ab51fedb.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libsptr-608a83eba360d55e.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libmemoffset-76b0209a30332020.rlib" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libbitflags-4f5688c52207b0de.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libstd-5a416d22eb834453.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libpanic_unwind-34cbca7d446a7dbe.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libobject-67b28e97c3bccf6f.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libmemchr-65f22f7356ad1bde.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libaddr2line-1dc88d69604ffec4.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libgimli-0e0075c91f97c3a7.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_demangle-f8d63a9735955de6.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libstd_detect-7775b375d2e86954.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libhashbrown-44e9fde8456f7bc5.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_std_workspace_alloc-212481e0bc40a704.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libminiz_oxide-01055f979d05f279.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libadler-e2323f5313814830.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libunwind-9c19b78ac041eb7f.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcfg_if-833ac996cbe25600.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/liblibc-3401e9c5ee035758.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/liballoc-a54fcdb9c76f0d03.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_std_workspace_core-c88d60982dfae036.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcore-83deb947260652c5.rlib" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcompiler_builtins-75ceb14b5d550d7c.rlib" "-framework" "CoreFoundation" "-lc++" "-liconv" "-lSystem" "-lc" "-lm" "-L" "/Users/samuel/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib" "-o" "/Users/samuel/code/duckfire/duckgres/target/debug/deps/libduckgres.dylib" "-Wl,-dead_strip" "-dynamiclib" "-Wl,-dylib" "-nodefaultlibs"
  = note: ld: Undefined symbols:
            _AllocSetContextCreateInternal, referenced from:
                pgrx_pg_sys::include::pg15::AllocSetContextCreateInternal::_$u7b$$u7b$closure$u7d$$u7d$::ha40d22f7ae37ca21 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _ArrayGetNItems, referenced from:
                pgrx_pg_sys::include::pg15::ArrayGetNItems::_$u7b$$u7b$closure$u7d$$u7d$::heab63c8f72df291a in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _BlessTupleDesc, referenced from:
                pgrx_pg_sys::include::pg15::BlessTupleDesc::_$u7b$$u7b$closure$u7d$$u7d$::hb39f90efa1a98be7 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _CacheMemoryContext, referenced from:
                pgrx::memcxt::PgMemoryContexts::value::h844405e7ee1b4499 in libpgrx-93c8d5f403380538.rlib[11](pgrx-93c8d5f403380538.pgrx.4a16de93af1e10dc-cgu.08.rcgu.o)
            _CopyErrorData, referenced from:
                pgrx_pg_sys::include::pg15::CopyErrorData::_$u7b$$u7b$closure$u7d$$u7d$::h387d875a52c3e802 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _CreateTupleDescCopyConstr, referenced from:
                pgrx_pg_sys::include::pg15::CreateTupleDescCopyConstr::_$u7b$$u7b$closure$u7d$$u7d$::h92576fc4aaea1bb9 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _CurTransactionContext, referenced from:
                pgrx::memcxt::PgMemoryContexts::value::h844405e7ee1b4499 in libpgrx-93c8d5f403380538.rlib[11](pgrx-93c8d5f403380538.pgrx.4a16de93af1e10dc-cgu.08.rcgu.o)
            _CurrentMemoryContext, referenced from:
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h0c59d9bea1075818 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h0e9552007976cf04 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h3c0b621ac3ed9a57 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h461fd96d64b081a6 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h49c9b15e71f40c05 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h5c7ab97888bce8a5 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h6952fe8e6cf88eaa in duckgres.1kz7wb0cuuxarquq.rcgu.o
                ...
            _DecrTupleDescRefCount, referenced from:
                pgrx_pg_sys::include::pg15::DecrTupleDescRefCount::_$u7b$$u7b$closure$u7d$$u7d$::h7762fc9e1aa7e158 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _ErrorContext, referenced from:
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h0c59d9bea1075818 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h0e9552007976cf04 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h3c0b621ac3ed9a57 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h461fd96d64b081a6 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h49c9b15e71f40c05 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h5c7ab97888bce8a5 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h6952fe8e6cf88eaa in duckgres.1kz7wb0cuuxarquq.rcgu.o
                ...
            _ExceptionalCondition, referenced from:
                _pgrx_planner_rt_fetch in libpgrx_pg_sys-94db225c3065d8b5.rlib[12](pgrx-cshim.o)
                _pgrx_planner_rt_fetch in libpgrx_pg_sys-94db225c3065d8b5.rlib[12](pgrx-cshim.o)
                _pgrx_list_nth in libpgrx_pg_sys-94db225c3065d8b5.rlib[12](pgrx-cshim.o)
                _pgrx_list_nth in libpgrx_pg_sys-94db225c3065d8b5.rlib[12](pgrx-cshim.o)
            _ExecFetchSlotHeapTuple, referenced from:
                pgrx_pg_sys::include::pg15::ExecFetchSlotHeapTuple::_$u7b$$u7b$closure$u7d$$u7d$::hfcfd8d0e0015c304 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _ExecFindJunkAttributeInTlist, referenced from:
                pgrx_pg_sys::include::pg15::ExecFindJunkAttributeInTlist::_$u7b$$u7b$closure$u7d$$u7d$::hca0d9556ba1959b9 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _ExecStoreVirtualTuple, referenced from:
                pgrx_pg_sys::include::pg15::ExecStoreVirtualTuple::_$u7b$$u7b$closure$u7d$$u7d$::h1c0f2ba416f6f35e in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _ExplainPropertyText, referenced from:
                pgrx_pg_sys::include::pg15::ExplainPropertyText::_$u7b$$u7b$closure$u7d$$u7d$::h892a4ab0e981b8fe in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _FreeErrorData, referenced from:
                pgrx_pg_sys::include::pg15::FreeErrorData::_$u7b$$u7b$closure$u7d$$u7d$::ha456eaace77cf1b7 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _GetDatabaseEncoding, referenced from:
                pgrx_pg_sys::include::pg15::GetDatabaseEncoding::_$u7b$$u7b$closure$u7d$$u7d$::hfa65238f28aa2639 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _GetForeignServer, referenced from:
                pgrx_pg_sys::include::pg15::GetForeignServer::_$u7b$$u7b$closure$u7d$$u7d$::hc10294bdaa355a08 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _GetForeignTable, referenced from:
                pgrx_pg_sys::include::pg15::GetForeignTable::_$u7b$$u7b$closure$u7d$$u7d$::hd4f17d063c2eeab1 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _HeapTupleHeaderGetDatum, referenced from:
                pgrx_pg_sys::include::pg15::HeapTupleHeaderGetDatum::_$u7b$$u7b$closure$u7d$$u7d$::hd27da04c3919faa7 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _MemoryContextAlloc, referenced from:
                pgrx_pg_sys::include::pg15::MemoryContextAlloc::_$u7b$$u7b$closure$u7d$$u7d$::h0e785af4445c3fa3 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _MemoryContextDelete, referenced from:
                pgrx_pg_sys::include::pg15::MemoryContextDelete::_$u7b$$u7b$closure$u7d$$u7d$::h902c51e2d55b6749 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _MemoryContextRegisterResetCallback, referenced from:
                pgrx_pg_sys::include::pg15::MemoryContextRegisterResetCallback::_$u7b$$u7b$closure$u7d$$u7d$::h90cdba4a683cbdd3 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _MemoryContextReset, referenced from:
                pgrx_pg_sys::include::pg15::MemoryContextReset::_$u7b$$u7b$closure$u7d$$u7d$::h5637082c22e6fd9b in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _MemoryContextStrdup, referenced from:
                pgrx_pg_sys::include::pg15::MemoryContextStrdup::_$u7b$$u7b$closure$u7d$$u7d$::h223760730a867544 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _MessageContext, referenced from:
                pgrx::memcxt::PgMemoryContexts::value::h844405e7ee1b4499 in libpgrx-93c8d5f403380538.rlib[11](pgrx-93c8d5f403380538.pgrx.4a16de93af1e10dc-cgu.08.rcgu.o)
            _PG_exception_stack, referenced from:
                pgrx_pg_sys::include::pg15::CopyErrorData::hf71e0a7e384db0f4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::CopyErrorData::hf71e0a7e384db0f4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::CopyErrorData::hf71e0a7e384db0f4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::CopyErrorData::hf71e0a7e384db0f4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::FreeErrorData::hde9f2f86818bc222 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::FreeErrorData::hde9f2f86818bc222 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::FreeErrorData::hde9f2f86818bc222 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::FreeErrorData::hde9f2f86818bc222 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                ...
            _PortalContext, referenced from:
                pgrx::memcxt::PgMemoryContexts::value::h844405e7ee1b4499 in libpgrx-93c8d5f403380538.rlib[11](pgrx-93c8d5f403380538.pgrx.4a16de93af1e10dc-cgu.08.rcgu.o)
            _PostmasterContext, referenced from:
                pgrx::memcxt::PgMemoryContexts::value::h844405e7ee1b4499 in libpgrx-93c8d5f403380538.rlib[11](pgrx-93c8d5f403380538.pgrx.4a16de93af1e10dc-cgu.08.rcgu.o)
            _RelationClose, referenced from:
                pgrx_pg_sys::include::pg15::RelationClose::_$u7b$$u7b$closure$u7d$$u7d$::h5e5789d2af681903 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _ReleaseSysCache, referenced from:
                pgrx_pg_sys::include::pg15::ReleaseSysCache::_$u7b$$u7b$closure$u7d$$u7d$::ha2f9a78605574639 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _SearchSysCache1, referenced from:
                pgrx_pg_sys::include::pg15::SearchSysCache1::_$u7b$$u7b$closure$u7d$$u7d$::h6ed40896fac90228 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _TopMemoryContext, referenced from:
                pgrx::memcxt::PgMemoryContexts::value::h844405e7ee1b4499 in libpgrx-93c8d5f403380538.rlib[11](pgrx-93c8d5f403380538.pgrx.4a16de93af1e10dc-cgu.08.rcgu.o)
            _TopTransactionContext, referenced from:
                pgrx::memcxt::PgMemoryContexts::value::h844405e7ee1b4499 in libpgrx-93c8d5f403380538.rlib[11](pgrx-93c8d5f403380538.pgrx.4a16de93af1e10dc-cgu.08.rcgu.o)
            _add_path, referenced from:
                pgrx_pg_sys::include::pg15::add_path::_$u7b$$u7b$closure$u7d$$u7d$::h0e8d8ab111836289 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _add_row_identity_var, referenced from:
                pgrx_pg_sys::include::pg15::add_row_identity_var::_$u7b$$u7b$closure$u7d$$u7d$::h6bfac508f56d8b73 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _bms_equal, referenced from:
                pgrx_pg_sys::include::pg15::bms_equal::_$u7b$$u7b$closure$u7d$$u7d$::h56699a2c9ed22abd in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _bms_is_member, referenced from:
                pgrx_pg_sys::include::pg15::bms_is_member::_$u7b$$u7b$closure$u7d$$u7d$::h48099ce967a64bef in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _create_foreignscan_path, referenced from:
                pgrx_pg_sys::include::pg15::create_foreignscan_path::_$u7b$$u7b$closure$u7d$$u7d$::h4b19fe90aa2d443f in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _defGetString, referenced from:
                pgrx_pg_sys::include::pg15::defGetString::_$u7b$$u7b$closure$u7d$$u7d$::h6bfbffb6c51a515b in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _end_MultiFuncCall, referenced from:
                pgrx_pg_sys::include::pg15::end_MultiFuncCall::_$u7b$$u7b$closure$u7d$$u7d$::h849ae6853b4b8d6c in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _errcode, referenced from:
                pgrx_pg_sys::submodules::panic::do_ereport::hd80e2f184ea81edd in libpgrx_pg_sys-94db225c3065d8b5.rlib[10](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.7.rcgu.o)
            _errcontext_msg, referenced from:
                pgrx_pg_sys::submodules::panic::do_ereport::hd80e2f184ea81edd in libpgrx_pg_sys-94db225c3065d8b5.rlib[10](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.7.rcgu.o)
            _errdetail, referenced from:
                pgrx_pg_sys::submodules::panic::do_ereport::hd80e2f184ea81edd in libpgrx_pg_sys-94db225c3065d8b5.rlib[10](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.7.rcgu.o)
            _errfinish, referenced from:
                pgrx_pg_sys::submodules::panic::do_ereport::hd80e2f184ea81edd in libpgrx_pg_sys-94db225c3065d8b5.rlib[10](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.7.rcgu.o)
            _errhint, referenced from:
                pgrx_pg_sys::submodules::panic::do_ereport::hd80e2f184ea81edd in libpgrx_pg_sys-94db225c3065d8b5.rlib[10](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.7.rcgu.o)
            _errmsg, referenced from:
                pgrx_pg_sys::submodules::panic::do_ereport::hd80e2f184ea81edd in libpgrx_pg_sys-94db225c3065d8b5.rlib[10](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.7.rcgu.o)
            _error_context_stack, referenced from:
                pgrx_pg_sys::include::pg15::CopyErrorData::hf71e0a7e384db0f4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::CopyErrorData::hf71e0a7e384db0f4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::CopyErrorData::hf71e0a7e384db0f4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::FreeErrorData::hde9f2f86818bc222 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::FreeErrorData::hde9f2f86818bc222 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::FreeErrorData::hde9f2f86818bc222 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::MemoryContextAlloc::hd16ae6cea95467f8 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::MemoryContextAlloc::hd16ae6cea95467f8 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                pgrx_pg_sys::include::pg15::MemoryContextAlloc::hd16ae6cea95467f8 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
                ...
            _errstart, referenced from:
                pgrx_pg_sys::submodules::panic::do_ereport::hd80e2f184ea81edd in libpgrx_pg_sys-94db225c3065d8b5.rlib[10](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.7.rcgu.o)
            _extract_actual_clauses, referenced from:
                pgrx_pg_sys::include::pg15::extract_actual_clauses::_$u7b$$u7b$closure$u7d$$u7d$::hbbf5fcc5b73e81c7 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _get_attgenerated, referenced from:
                pgrx_pg_sys::include::pg15::get_attgenerated::_$u7b$$u7b$closure$u7d$$u7d$::h0088b62b788cd59d in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _get_attname, referenced from:
                pgrx_pg_sys::include::pg15::get_attname::_$u7b$$u7b$closure$u7d$$u7d$::h1d03ec124d1752b8 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _get_atttype, referenced from:
                pgrx_pg_sys::include::pg15::get_atttype::_$u7b$$u7b$closure$u7d$$u7d$::h8b2ddae44238ee9b in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _get_call_result_type, referenced from:
                pgrx_pg_sys::include::pg15::get_call_result_type::_$u7b$$u7b$closure$u7d$$u7d$::h880beb3aec0ca383 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _get_collation_name, referenced from:
                pgrx_pg_sys::include::pg15::get_collation_name::_$u7b$$u7b$closure$u7d$$u7d$::h5270144a03c9cca4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _get_fn_expr_argtype, referenced from:
                pgrx_pg_sys::include::pg15::get_fn_expr_argtype::_$u7b$$u7b$closure$u7d$$u7d$::h3563519b9d4e6be8 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _get_typlenbyvalalign, referenced from:
                pgrx_pg_sys::include::pg15::get_typlenbyvalalign::_$u7b$$u7b$closure$u7d$$u7d$::h88d487971b8467f0 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _getmissingattr, referenced from:
                pgrx_pg_sys::include::pg15::getmissingattr::_$u7b$$u7b$closure$u7d$$u7d$::h2f0784ae0ff933bc in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _heap_form_tuple, referenced from:
                pgrx_pg_sys::include::pg15::heap_form_tuple::_$u7b$$u7b$closure$u7d$$u7d$::h3e0bcc5fd33fd08b in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _heap_getsysattr, referenced from:
                pgrx_pg_sys::include::pg15::heap_getsysattr::_$u7b$$u7b$closure$u7d$$u7d$::h56c95503ca48586d in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _init_MultiFuncCall, referenced from:
                pgrx_pg_sys::include::pg15::init_MultiFuncCall::_$u7b$$u7b$closure$u7d$$u7d$::haa34b55759092b22 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _jsonb_in, referenced from:
                pgrx_pg_sys::include::pg15::jsonb_in::_$u7b$$u7b$closure$u7d$$u7d$::h37e071d3b4780598 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _jsonb_out, referenced from:
                pgrx_pg_sys::include::pg15::jsonb_out::_$u7b$$u7b$closure$u7d$$u7d$::h9388b2500d327530 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _lappend, referenced from:
                pgrx_pg_sys::include::pg15::lappend::_$u7b$$u7b$closure$u7d$$u7d$::ha9a8a24ebf967609 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _list_free, referenced from:
                pgrx_pg_sys::include::pg15::list_free::_$u7b$$u7b$closure$u7d$$u7d$::h16bc3388632862ba in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _list_union, referenced from:
                pgrx_pg_sys::include::pg15::list_union::_$u7b$$u7b$closure$u7d$$u7d$::h97b9448b3930e2f3 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _makeConst, referenced from:
                pgrx_pg_sys::include::pg15::makeConst::_$u7b$$u7b$closure$u7d$$u7d$::hcc79716bc5df40f4 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _makeVar, referenced from:
                pgrx_pg_sys::include::pg15::makeVar::_$u7b$$u7b$closure$u7d$$u7d$::h438abe599744d0f0 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _make_foreignscan, referenced from:
                pgrx_pg_sys::include::pg15::make_foreignscan::_$u7b$$u7b$closure$u7d$$u7d$::h0646b210a5b67e9e in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _nocachegetattr, referenced from:
                pgrx_pg_sys::include::pg15::nocachegetattr::_$u7b$$u7b$closure$u7d$$u7d$::he5819f198a5e3689 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _nodeToString, referenced from:
                pgrx_pg_sys::include::pg15::nodeToString::_$u7b$$u7b$closure$u7d$$u7d$::hd04e83bc4955f106 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _palloc, referenced from:
                pgrx_pg_sys::include::pg15::palloc::_$u7b$$u7b$closure$u7d$$u7d$::h501a365a4ff94beb in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _palloc0, referenced from:
                pgrx_pg_sys::include::pg15::palloc0::_$u7b$$u7b$closure$u7d$$u7d$::hbebef1713ea6622a in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _per_MultiFuncCall, referenced from:
                pgrx_pg_sys::include::pg15::per_MultiFuncCall::_$u7b$$u7b$closure$u7d$$u7d$::h54cd4b1ed23a04da in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _pfree, referenced from:
                pgrx_pg_sys::include::pg15::pfree::_$u7b$$u7b$closure$u7d$$u7d$::ha6811858778eb671 in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _pg_detoast_datum, referenced from:
                pgrx_pg_sys::include::pg15::pg_detoast_datum::_$u7b$$u7b$closure$u7d$$u7d$::h1e6956375edd764d in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _pg_detoast_datum_packed, referenced from:
                pgrx_pg_sys::include::pg15::pg_detoast_datum_packed::_$u7b$$u7b$closure$u7d$$u7d$::h8862279d3601ccaa in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _pg_re_throw, referenced from:
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h0c59d9bea1075818 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h0e9552007976cf04 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h3c0b621ac3ed9a57 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h461fd96d64b081a6 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h49c9b15e71f40c05 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h5c7ab97888bce8a5 in duckgres.1kz7wb0cuuxarquq.rcgu.o
                pgrx_pg_sys::submodules::panic::pgrx_extern_c_guard::h6952fe8e6cf88eaa in duckgres.1kz7wb0cuuxarquq.rcgu.o
                ...
            _pull_var_clause, referenced from:
                pgrx_pg_sys::include::pg15::pull_var_clause::_$u7b$$u7b$closure$u7d$$u7d$::h4888f949494e696a in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _relation_close, referenced from:
                pgrx_pg_sys::include::pg15::relation_close::_$u7b$$u7b$closure$u7d$$u7d$::h71c4c2dd2e863c8f in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _relation_open, referenced from:
                pgrx_pg_sys::include::pg15::relation_open::_$u7b$$u7b$closure$u7d$$u7d$::h40393794807b24cc in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
            _slot_getsomeattrs_int, referenced from:
                pgrx_pg_sys::include::pg15::slot_getsomeattrs_int::_$u7b$$u7b$closure$u7d$$u7d$::h1b2fd6a500916fbe in libpgrx_pg_sys-94db225c3065d8b5.rlib[3](pgrx_pg_sys-94db225c3065d8b5.pgrx_pg_sys.fb457daf81665331-cgu.0.rcgu.o)
          clang: error: linker command failed with exit code 1 (use -v to see invocation)


error: could not compile `duckgres` (lib) due to 1 previous error

use Value to store secrets

Feature request

The connection secrets (passwords, api keys and etc.) are currently defined in server's option, which is not secure. To keep the secrets safe, we'd better to use Vault to store and manage them.

Describe the solution you'd like

Use Vault to save secrets and manage access permission. Server's option only stores the secret's id, decryption should happen when access the secrets using Vault's pgsodium_masks.secrets view.

Describe alternatives you've considered

Some other possible solutions:

  • Stores secrets in server's option (current solution, not safe)
  • Stores secrets on the host and read through filesystem and manage by Extension web interface (need host filesystem access, tight coupled with platform)
  • Not store secrets at all but provided by the user when querying (too much hassle, not good DX)

Additional context

N/A

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.