Sources
Docs: Flight SQL · Provider Pool · API tokens Web App: Protection → Access Tokens in your Workspace. This guide takes you from no access to a first query result against the data your Providers sync into Parable. You create a token in your Workspace, connect DBeaver or Python to Parable’s SQL endpoint, and query the Provider Pools with read-only SQL. You need:- a Workspace with at least one connected Provider;
- a Workspace Administrator who can give you a role;
- DBeaver, or Python 3.10 or later.
1. Get the Provider Pools Reader role
Ask a Workspace Administrator to give you the Provider Pools Reader role, described as “Query the Provider Pools over SQL”. It lets you query the Provider Pools over SQL, and nothing else. You find tables with SQL (step 7). The administrator:- Opens People → Users.
- Opens the actions on your row and chooses Edit Roles.
- Selects Provider Pools Reader and chooses Save.
2. Create a SQL token
- Sign in to your Workspace and open Protection → Access Tokens. Its
address is
https://<workspace-slug>.parable.work/platform/protection/access-tokens. A Provider Pools Reader or a Data Access member lands there when they open the Workspace. - In Your tokens, choose Create token.
- Under Use it for, keep SQL. The other choice, MCP, creates a token for an MCP host; SQL refuses it.
- Enter a Name that says where you will use it, such as
DBeaver on my laptop. - Under Expires in, choose 30 days, 90 days, 180 days, or 1 year. The default is 90 days.
- Choose Create token.
- Copy the token and store it in your password manager. Parable shows it once and cannot show it again. Then choose I have saved it.
- works only with SQL, and only in the Workspace where you created it;
- runs each query with your roles at that moment, so it stops working when your role or your membership is removed;
- stops working when it expires or is revoked. After a revocation or a removed role, SQL can keep answering for up to 30 seconds.
3. Find your Workspace slug
The slug is the first part of your Workspace’s web address. Forhttps://acme.parable.work, the slug is acme. Your SQL
tool sends it as x-tenant on every call. A token works only with the slug of
the Workspace that created it.
4. Connect DBeaver
DBeaver connects through the Apache Arrow Flight SQL JDBC driver. Other JDBC tools, such as DataGrip, use the same driver, class, URL, and properties.Run DBeaver on Java 21
Recent DBeaver releases run on Java 25. The driver does not support Java 25, and on it Test Connection fails withExceptionInInitializerError and
Could not initialize class org.apache.arrow.memory.RootAllocator. Point
DBeaver at Java 21 before you add the driver:
-
Install Java 21, for example Eclipse Temurin 21 from
Adoptium, or run
brew install openjdk@21on macOS. - Quit DBeaver.
-
Open
dbeaver.iniin a text editor. It is in the DBeaver installation: -
Find the line that reads
-vm. Replace the line below it with the path to Java 21’sjavaprogram (javaw.exeon Windows). If the file has no-vmline, add-vmand the path as two lines at the top of the file. Both lines must come before-vmargs. With Homebrew on macOS, this command prints the path: -
On the line after
-vmargs, add--add-opens=java.base/java.nio=ALL-UNNAMEDif the file does not already have it. - Save the file and start DBeaver.
dbeaver.ini
dbeaver.ini, so repeat these steps after each
upgrade.
Add the driver
-
Download the
flight-sql-jdbc-driverjar, version 18 or 19, from Maven Central. - In DBeaver, open Database → Driver Manager and choose New.
-
On Settings, enter:
-
On Libraries, choose Add File and pick the jar. If DBeaver offers a
list of driver classes, choose
org.apache.arrow.driver.jdbc.ArrowFlightJdbcDriver. - Choose OK.
Create the connection
- Choose Database → New Database Connection, pick Arrow Flight SQL, and choose Next.
-
Set Host to
sql.parable.workand Port to443. Leave Username and Password empty. -
Open Driver properties. Right-click in the list, choose
Add new property, and add these two properties:
- Choose Test Connection. DBeaver reports that it is connected.
- Choose Finish.
useEncryption=false.
5. Connect with Python
Install the ADBC Flight SQL driver and PyArrow:first_query.py:
first_query.py
grpc+tls:// connects with TLS. ADBC requires header names in lowercase, so
write x-tenant exactly as shown. autocommit=True tells the driver not to
open a transaction, since SQL access is read-only and has none.
6. Run a first query
Every Provider table has a three-part address:{connector} is the Provider’s technical name, such as google or github,
and {table} is one of its tables, such as users. There is no USE
statement, so always write the full address.
In DBeaver, select the connection and open SQL Editor → New SQL script. In
Python, pass the SQL to cursor.execute. Run:
<connector> and <table> with a table you can query, for example
providers.google.users. DBeaver’s Database Navigator lists them under the
providers catalog, and the Python script above prints them.
A table can exist before its Provider’s first sync writes rows. An empty
result, or the error No data has been written for this table yet, means the
table has no data yet, not that your connection is wrong.
7. Find tables and columns
List a Provider’s tables and their columns with SQL. A table’s address, such asproviders.google.users, is its catalog, schema and name:
search_available_data.
To find the records themselves, search with
search_everything.
Discover tables and columns
covers the other discovery calls.
What you can query
The Provider Pools Reader role reaches three catalogs:
The Workspace’s other pools,
workspace, artifacts, and parables, need the
Data Access role. With Provider Pools Reader, a query that names them fails
with Query references an unknown relation.
Within these catalogs, the Workspace’s
Provider Policies decide which rows of each
Provider table your roles read. A table hidden from your roles reads as empty,
and its quarantine and quality tables follow it. If your roles hold
All data access, as
Workspace Administrator does, you read every row, and each query is recorded
in the Workspace’s audit events.
System columns
Every table in theproviders catalog has these columns beside the
Provider’s own fields:
A row is written only when a load changes it, so
WHERE dt = '<day>' returns
the rows that changed that day, not the whole table. To read current records,
read the whole table and filter on the state columns:
Limits
- Read-only. Only
SELECTstatements run. Any other statement fails withOnly read-only SELECT queries are supported. There are no transactions. - Plain
EXPLAIN.EXPLAINfollowed by aSELECTreturns the query’s plan and runs nothing: onelogical_planrow and onephysical_planrow. The physical plan names each step, its partitions and its keys. It shows no storage path and no filter condition, because a filter can hold a data policy.EXPLAIN ANALYZEruns the query, so it fails with error codeQL-SQ-008.EXPLAIN VERBOSEand the other forms fail withQL-SQ-009. - One hour per query. The hour covers planning and the whole result,
including the time your tool spends reading it. A longer query fails with
DEADLINE_EXCEEDED, error codeQL-TO-002, andquery <id> exceeded timeout of 3600s. Set your tool’s own timeout to at least an hour if you run long queries. - 2,000,000 rows per result. A query whose result has more rows fails
with
RESOURCE_EXHAUSTEDand error codeQL-SQ-005; nothing is cut off silently. The error can arrive after some rows, so discard any rows your tool read before it. AddLIMIT, filter withWHERE, or aggregate in SQL. To read more rows than that, run one query per range of a column, such as one month at a time. - Paid AI calls. One query may send up to 1,000,000 calls of
ponder(),embed()and the Jev functions, and spend up to $1,000 on them. A call that would pass a limit is not sent, and the query fails withRESOURCE_EXHAUSTEDand error codeQL-SQ-010(calls) orQL-SQ-011(cost). Call the function over fewer rows, or publish the SQL as a Plot. See the AI call limits. - Shared memory. Queries that run at the same time can share
memory and temporary disk. A query that asks for more than is
left fails with
RESOURCE_EXHAUSTEDand error codeQL-IN-009, whether its own size or the queries beside it used the space. Provider tables are partitioned bydt, the day a load wrote the row, so aWHERE dtbound skips the files of other days. Grouping,DISTINCT, joins, and sorts over every day of a large table need the most memory: bounddtfirst, and run large queries one at a time rather than together. - 600 requests a minute from one IP address. A query takes at least two
requests, and DBeaver sends more while you browse. Requests over the limit
are refused with HTTP status 429, which most tools report as
UNAVAILABLE. - The Provider Pools only. The Provider Pools Reader role reaches the three catalogs above and nothing else.
- One Workspace per token. To query another Workspace, create a token there.
ODBC tools
Parable has no ODBC driver. Tools that need one, such as Power BI and Tableau, are not supported. Use DBeaver, another JDBC tool, or Python.Troubleshooting
Tools show an error as a gRPC status and a message, such asUNAUTHENTICATED: token expired, and each tool wraps them in its own words.
Python ADBC, for example, reports PERMISSION_DENIED: insufficient permissions
as UNAUTHORIZED: [FlightSQL] insufficient permissions (PermissionDenied; Prepare).
Match on the message.