Agent skill

wren-sql

Write and correct SQL queries targeting Wren Engine — covers MDL query rules, filter strategies, data types (ARRAY, STRUCT, JSON/VARIANT), date/time functions, Calculated Fields, BigQuery dialect quirks, and error diagnosis. Use when generating or debugging SQL for any Wren Engine data source.

Stars 639
Forks 183

Install this agent skill to your Project

npx add-skill https://github.com/Canner/wren-engine/tree/main/skills-archive/wren-sql

Metadata

Additional technical details for this skill

author
wren-engine
version
1.0

SKILL.md

Wren SQL

Version check

Silently fetch https://raw.githubusercontent.com/Canner/wren-engine/main/skills/versions.json. Compare the wren-sql key with this skill's version (from the frontmatter above). If the remote version is newer, notify the user before proceeding:

A newer version of the wren-sql skill is available. Update with:

npx skills add Canner/wren-engine --skill wren-sql --agent claude-code

Then continue with the workflow below regardless of update status.


Wren Engine translates SQL through a semantic layer (MDL — Model Definition Language) before executing it against a backend database. SQL must target MDL model names, not raw database tables.

For specific topics, load the relevant reference file:

Topic Reference
SQL error diagnosis and correction references/correction.md
Date/time functions and intervals references/datetime.md
ARRAY, STRUCT, JSON/VARIANT types references/types.md
BigQuery dialect quirks references/bigquery.md

Context

  • You are querying a semantic layer, not a database directly.
  • Only use model/view/column names defined in the MDL — never raw database table references.
  • Wren Engine uses a generic SQL dialect similar to ANSI SQL (DataFusion/Postgres/DuckDB), but with differences.
  • Check the dataSource field to identify the backend and apply dialect-specific rules if needed.

Core SQL Rules

  • Only SELECT statements. No DELETE, UPDATE, INSERT.
  • Only use tables and columns from the MDL schema.
  • Do not include comments in generated SQL.
  • Prefer CTEs over subqueries.
  • Identifiers are case-sensitive. Quote identifiers containing unicode, special characters (except _), or starting with a digit using double quotes.
    • Examples: "客户"."姓名", "table-name"."col", "123column"
  • Identifier quotes: " (double quotes). String literal quotes: ' (single quotes).
  • For specific date queries, use a range:
    sql
    WHERE ts >= CAST('2024-11-01 00:00:00' AS TIMESTAMP WITH TIME ZONE)
      AND ts <  CAST('2024-11-02 00:00:00' AS TIMESTAMP WITH TIME ZONE)
    
  • For ranking, use DENSE_RANK() + WHERE. Include the ranking column in SELECT.
  • Avoid correlated subqueries — use JOINs instead.
  • Use SAFE_CAST when casting might fail: SAFE_CAST(col AS INT)

Filter Strategies

Column type Strategy
Text LIKE '%value%' for partial match
Numeric BETWEEN 30 AND 40
Date/Timestamp >= '2024-01-01' AND < '2024-02-01'
Exact value = or IN (...)
Primary key / indexed Prefer equality (=)

Supported Cast Types

bool, boolean, int, integer, bigint, smallint, tinyint, float, double, real, decimal, numeric, varchar, char, string, text, date, time, timestamp, timestamp with time zone, bytea

Example: CAST(col AS INT), TIMESTAMP '2024-11-09 00:00:00'


Aggregation

  • All non-aggregated SELECT columns must appear in GROUP BY (window functions excepted).
  • Aggregate conditions go in HAVING, not WHERE.
  • Prefer ordinal GROUP BY for long column names:
    sql
    SELECT very_long_column_name AS alias, COUNT(*) FROM t GROUP BY 1
    

Sorting and Limiting

  • ORDER BY for sort; LIMIT to restrict rows.
  • When ORDER BY appears in a subquery or CTE, always include LIMIT.

Subquery Patterns

  • Prefer CTEs (WITH clause) over nested subqueries.
  • Subquery in SELECT must return a single value per row.
  • Subquery in WHERE: use IN, EXISTS, or comparison operators.
  • IN SUBQUERY in JOIN conditions is not supported — use JOIN ... ON instead.
  • RECURSIVE CTEs are not supported.

Calculated Fields

Columns marked as Calculated Field in the MDL have pre-defined computation logic. Use them directly instead of re-implementing the calculation.

Read the column comment (e.g., column expression: avg(reviews.Score)) to understand what the field represents.

sql
-- Schema has: Rating DOUBLE (Calculated Field: avg(reviews.Score))
--             ReviewCount BIGINT (Calculated Field: count(reviews.Id))

-- Correct — use Calculated Fields directly:
SELECT AVG(Rating) FROM orders WHERE ReviewCount > 10

-- Incorrect — do not re-join and re-aggregate manually

Expand your agent's capabilities with these related and highly-rated skills.

Canner/wren-engine

wren-usage

Wren Engine CLI workflow guide for AI agents. Answer data questions end-to-end using the wren CLI: gather schema context, recall past queries, write SQL through the MDL semantic layer, execute, and learn from confirmed results. Use when: user asks a data question, requests a report or analysis, asks about metrics, revenue, customers, orders, trends, or any business data; user says 'how many', 'show me', 'what is the', 'top N', 'compare', 'trend', 'growth', 'breakdown'; user wants to explore, analyze, filter, aggregate, or summarize data from a database; agent needs to query data, connect a data source, handle errors, or manage MDL changes via the wren CLI.

639 183
Explore
Canner/wren-engine

wren-generate-mdl

Generate a Wren MDL project by exploring a database with available tools (SQLAlchemy, database drivers, MCP connectors, or raw SQL). Guides agents through schema discovery, type normalization, and MDL YAML generation using the wren CLI. Use when: user wants to create or set up a new MDL, onboard a new data source, or scaffold a project from an existing database.

639 183
Explore
Canner/wren-engine

wren-dlt-connector

Connect SaaS data (HubSpot, Stripe, Salesforce, GitHub, Slack, etc.) to Wren Engine for SQL analysis. Guides the user through the full flow: install dlt, pick a SaaS source, set up credentials, run the data pipeline into DuckDB, then auto-generate a Wren semantic project from the loaded data. Use this skill whenever the user mentions: connecting SaaS data, importing data from an API, dlt pipelines, loading HubSpot/Stripe/Salesforce/GitHub/Slack data, querying SaaS data with SQL, or setting up a new data source from a REST API. Also trigger when the user already has a dlt-produced DuckDB file and wants to create a Wren project from it.

639 183
Explore
Canner/wren-engine

wren-usage

Wren Engine — semantic SQL engine for AI agents. Query 22+ data sources (PostgreSQL, BigQuery, Snowflake, MySQL, ClickHouse, etc.) through a modeling layer (MDL). This skill is the main entry point: it guides setup, delegates to focused sub-skills for SQL authoring, MDL generation, project management, and MCP server operations. Use when: write SQL, query data, generate or update MDL, change database connection, manage YAML projects, set up or operate MCP server, or get started with Wren Engine for the first time.

639 183
Explore
Canner/wren-engine

wren-mcp-setup

Set up Wren Engine MCP server via Docker and register it with an AI agent. Covers pulling the Docker image, running the container with docker run, mounting a workspace, configuring connection info via the Web UI (with Docker host hint), registering the MCP server in Claude Code (or other MCP clients) using streamable-http transport, and starting a new session to interact with Wren MCP. Trigger when a user wants to run Wren MCP in Docker, configure Claude Code MCP, or connect an AI client to a Dockerized Wren Engine.

639 183
Explore
Canner/wren-engine

wren-project

Save, load, and build Wren MDL manifests as YAML project directories for version control. Use when a user wants to persist an MDL as human-readable YAML files, load a YAML project back into MDL JSON, or compile a YAML project to a deployable mdl.json file.

639 183
Explore

Didn't find tool you were looking for?

Be as detailed as possible for better results