Skip to main content
View source

Hotdata

View as Markdown

A database and tool node backed by one ephemeral Hotdata database per pipeline run — load data, index it, query it, and it is gone when the run ends.

What it does

Every other database node in the catalogue points at a store that outlives the run. This one does the opposite: the first time it is used it provisions a Hotdata database with a TTL, and endGlobal deletes it. That makes it the right choice for scratch work — pull a dataset in, join and aggregate it, emit the answer, leave nothing behind.

As a pipeline node it takes natural-language questions on the questions lane and emits results on table / text / answers, and it loads structured rows arriving on the answers lane. As a tool node an agent drives it directly.

It needs a connected LLM (the llm control connection) to translate questions into SQL, in the same way db_postgres and rocketride_sql do.

Tools

ToolWhat it does
load_dataLoad rows, or a previous query result by result_id, into a table. Creates the table if needed
get_dataAnswer a plain-language question. The bound LLM writes the SQL; failures are retried with the error fed back
get_sqlGenerate the SQL for a question without running it
executeRun one raw read-only SQL statement. Gated by allow_execute
get_schemaLive tables and columns from information_schema
build_indexBuild a bm25, vector or sorted index on a column
dialectThe full SQL dialect briefing — read this before writing SQL by hand

Lanes

LaneDirectionBehaviour
questionsinNatural-language question, answered and emitted to table / text / answers
answersinStructured rows, loaded into the configured table
tableoutQuery results as a Markdown table
textoutQuery results rendered as text
answersoutQuery results as an answer payload

Setup

Set an API key and workspace ID on the node, or export HOTDATA_API_KEY and HOTDATA_WORKSPACE. The default endpoint is https://api.hotdata.dev.

Wire an LLM to the node's llm control connection — without one, natural-language querying cannot work. See examples/db_hotdata.pipe.

SQL dialect

Hotdata runs Apache DataFusion 54 behind the PostgreSQL parser dialect. Treat that as "Postgres syntax, DataFusion semantics and function library" — not as Postgres. Call the dialect tool for the full briefing; the essentials:

  • Postgres syntax works: :: casts, CTEs, window functions, DISTINCT ON, ILIKE, INTERVAL.
  • Unquoted identifiers fold to lowercase — double-quote any name with uppercase or spaces.
  • The function library is DataFusion's. No JSON/JSONB operators (->, ->>, jsonb_*), no pg_catalog, no to_number or age(). Use arrow_typeof, arrow_cast, date_bin, approx_percentile_cont instead.
  • Types are Arrow types (Utf8, Int64, Timestamp, Decimal128) — there is no native JSON, UUID or ENUM.
  • Names are three-part catalog.schema.table; this database's own catalog is default.
  • Search uses engine functions: bm25_search(table, column, query), vector_search(table, column, query), and vector_distance(column, query) for ORDER BY. Build the matching index first with build_index.

Limits

  • The SQL surface is read-only. INSERT, UPDATE, DELETE and all DDL are rejected by the server. load_data is the only way to get data in, and it uploads rather than issuing SQL.
  • allow_execute is an application-level gate on raw SQL. It is not write protection — the SQL surface rejects writes regardless. It exists to keep untrusted callers from running expensive scans, which are billed per TB scanned.
  • load_data is a write path, and the SQL read-only guarantee does not cover it. replace, update and delete modes overwrite or remove existing rows, so they are disabled unless allow_destructive_load is on. Without that gate an agent asked to "delete the bad rows" will route around the SQL guard by calling load_data with mode=replace. Default is append/upsert only.
  • One statement per call; SHOW TABLES and SHOW COLUMNS error, so use information_schema or DESCRIBE.
  • Data is destroyed when the run ends. The configured TTL is only a fallback for a crashed engine.
  • Rate limits are dynamic and unpublished; the node honours Retry-After and retries shed requests, but a sustained overload surfaces as an error.
  • Connections to external warehouses are configured on the Hotdata side, outside RocketRide's view.

Examples

examples/db_hotdata.pipe — Chat → Hotdata → Answers/Table, with Anthropic bound as the SQL-writing LLM.

An agent flow: load_data the rows, build_index on the text column, then get_data with a question, or execute a query using bm25_search.

Upstream docs

Troubleshooting

SymptomCause
apikey is required / workspace_id is requiredNeither the config field nor the env var is set
raw SQL execution is disabledTurn on allow_execute, or use get_data instead
only one statement per callHotdata rejects semicolon-separated batches
Unknown function errorsA Postgres-only function that DataFusion lacks — check dialect
still shedding load after ...s (HTTP 429)Sustained back-pressure; retry later or reduce concurrency
Empty results from a fresh runThe database starts empty every run — load_data first

Schema

FieldTypeDescriptionDefault
hotdata.allow_destructive_loadbooleanAllow destructive loads
Permit load_data to use replace, update or delete modes, which overwrite or remove existing rows. Off by default: load_data is append/upsert only, so an agent cannot destroy data another pipeline step loaded.
false
hotdata.allow_executebooleanAllow direct query execution
Permit trusted callers to submit raw read-only SQL.
false
hotdata.api_urlstringAPI URL
Hotdata API base URL. Leave empty for https://api.hotdata.dev.
""
hotdata.apikeystringAPI Key
Hotdata API key.
""
hotdata.async_after_msintegerRun asynchronously after (milliseconds)
Wait this long before a query continues as an asynchronous job.
5000
hotdata.db_descriptionstringDatabase description
Schema and domain hints for natural-language SQL generation.
""
hotdata.job_timeout_secsintegerJob timeout (seconds)
Maximum time to wait for an asynchronous query.
300
hotdata.max_attemptsintegerMaximum attempts
Maximum SQL-generation attempts.
3
hotdata.max_execute_rowsintegerMaximum execute rows
Maximum rows returned by raw SQL execution.
25000
hotdata.tablestringTable
Table that rows arriving on the answers lane are loaded into. Created on first use.
"pipeline_data"
hotdata.ttlstringDatabase lifetime
Crash-safety expiry for the ephemeral database.
"24h"
hotdata.workspace_idstringWorkspace ID
Hotdata workspace ID.
""