Skip to content

Questions spanning thousands of tables force the model to hand-write 20k-character UNION ALL statements (19% of cost in one batch of sessions) #1489

Open

Description

@anandgupta42

Problem

A warehouse with one table per entity (2,753 tables) has no tool-supported way to query across a set of tables. Every route that would let the engine iterate over a table list is rejected or classified as a write, so the model generates the full UNION ALL text itself and re-types it into sql_execute.

Mechanism

  • DuckDB query_table([...]) rejects subqueries and lateral arguments ("Table function cannot contain subqueries" 36 times, "does not support lateral join column" 34, "Invalid named parameter" 12). An engine limit.
  • The statements that work around it (SET max_expression_depth which DuckDB's own error recommends, SET VARIABLE + query_table(getvariable(...)), EXECUTE IMMEDIATE, CREATE TEMP MACRO ... AS TABLE) are denied as writes (packages/opencode/src/altimate/tools/sql-classify.ts:27, :226-235; sql-execute.ts:113-121).
  • The model builds the text with string_agg; the single huge result cell is clipped in the preview (sql-result-format.ts:40, :178, :342), so it reads the spill file via bash/read and re-types the SQL (output tokens).

Evidence

  • 33 of 44 preview truncations are generated SQL.
  • Median output tokens per session on the affected question: 42,355 (Claude Opus) and 23,545 (gpt-5.6-sol), against 362-3,404 on other questions on the same warehouse.
  • 246-675 s and $5.98-$10.87 per Opus session, the 8 costliest of a 270-session batch; $58.2 of $307.9 (19%) for the two affected questions; context up to 144k tokens; one session used 675 of an 840 s budget; gpt-5.6-sol sessions ran 621-851 s and contributed to budget misses.
  • Generations of 15-25k tokens took 100-160 s each.

Impact

Time and cost, with budget risk. No incorrect answers caused directly in Opus sessions.

Proposed fix

Pick one or more:

  • A table-set primitive on sql_materialize / sql_execute (for example tables: "A*" or a list obtained from a scratch query) that expands UNION ALL BY NAME server-side.
  • Allow session-local non-writing settings (SET max_expression_depth, threads, memory_limit) on read-only connections, and CREATE [TEMP] MACRO in scratch.
  • A query_from: {warehouse, sql} option that classifies the generated text before running it.

Acceptance check

A question over 1,000+ tables completes without any single model output above 2k tokens; median output tokens and cost drop by at least 5x on the affected workload.

Activity

  1. devin-ai-integration commented on Oct 20, 2026

    @devin-ai-integration

    This looks fixed on main. #1522 (Closes #1489) merged into feat/analyst-harness-dab-2026-10, not main, so the issue didn't auto-close. That branch landed on main via #1441 (squash commit b12bce3, 2026-10-16).

    I checked the files #1522 changed against main: 359 of its 368 substantive added lines are on main as written. The other 9 lines read differently on main now. I did not diff each one, but at least sql-materialize.ts and sql-execute.ts were edited again afterwards in #1448.

    Suggest closing.

    Written by Devin

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions