Skip to main content
SQL Lookup stage showing database enrichment with parameterized queries
The SQL Lookup stage enriches documents by querying external SQL databases. It executes parameterized queries using document fields as inputs, joining external structured data with your search results.
Stage Category: APPLY (Enriches documents)Transformation: N documents → N documents (with SQL data added)

When to Use

Use CaseDescription
Customer data enrichmentJoin customer details from CRM database
Inventory lookupsAdd real-time stock levels to product results
Pricing dataEnrich with current pricing from ERP
Cross-system joinsCombine vector search with relational data

When NOT to Use

ScenarioRecommended Alternative
Simple key-value lookupsdocument_enrich (collection join)
Read-heavy, cacheable dataConsider pre-indexing in Mixpeek
Real-time transactional queriesDirect database access

Parameters

ParameterTypeDefaultDescription
connection_idstringRequiredDatabase connection identifier
querystringRequiredSQL query with parameter placeholders
parametersobjectRequiredMapping of placeholder names to document fields
result_fieldstringsql_resultField name for query results
multiple_rowsbooleanfalseReturn all rows or just first
timeout_msinteger5000Query timeout in milliseconds

Supported Databases

DatabaseConnection TypeNotes
PostgreSQLpostgresFull support
MySQLmysqlFull support
SQL ServermssqlFull support
SQLitesqliteRead-only

Configuration Examples

{
  "stage_type": "apply",
  "stage_id": "sql_lookup",
  "parameters": {
    "connection_id": "crm_postgres",
    "query": "SELECT name, email, tier FROM customers WHERE id = :customer_id",
    "parameters": {
      "customer_id": "{{DOC.metadata.customer_id}}"
    },
    "result_field": "customer_data"
  }
}

Query Syntax

Parameter Placeholders

Use :name syntax for parameter placeholders:
SELECT * FROM users WHERE id = :user_id AND status = :status
Parameters are properly escaped to prevent SQL injection.

Template Variables

VariableDescription
{{DOC.*}}Any document field
{{INPUT.*}}Input parameters from retriever call
{{CONTEXT.*}}Pipeline context variables

Output Schema

Single Row (default)

{
  "document_id": "doc_123",
  "content": "...",
  "sql_result": {
    "name": "John Doe",
    "email": "[email protected]",
    "tier": "premium"
  }
}

Multiple Rows

{
  "document_id": "doc_123",
  "content": "...",
  "recent_orders": [
    {"order_id": "ord_1", "status": "delivered", "total": 99.99},
    {"order_id": "ord_2", "status": "shipped", "total": 149.99}
  ]
}

No Results

{
  "document_id": "doc_123",
  "content": "...",
  "sql_result": null
}

Security

SQL queries are parameterized to prevent injection attacks. Never concatenate user input directly into query strings.
Security FeatureDescription
Parameterized queriesAll parameters are escaped
Connection isolationEach connection uses dedicated credentials
Read-only optionConfigure connections as read-only
Query timeoutPrevent long-running queries

Performance

MetricValue
Latency10-100ms (depends on query complexity)
Connection poolingAutomatic
Parallel executionUp to 10 concurrent queries
Timeout handlingGraceful with null result
For high-volume lookups, ensure your database has appropriate indexes on the queried columns. Consider caching frequently accessed data.

Common Pipeline Patterns

Search + SQL Enrichment

[
  {
    "stage_type": "filter",
    "stage_id": "semantic_search",
    "parameters": {
      "query": "{{INPUT.query}}",
      "vector_index": "text_extractor_v1_embedding",
      "top_k": 20
    }
  },
  {
    "stage_type": "apply",
    "stage_id": "sql_lookup",
    "parameters": {
      "connection_id": "product_db",
      "query": "SELECT price, stock FROM products WHERE id = :id",
      "parameters": {
        "id": "{{DOC.metadata.product_id}}"
      },
      "result_field": "product_data"
    }
  },
  {
    "stage_type": "filter",
    "stage_id": "structured_filter",
    "parameters": {
      "conditions": {
        "field": "product_data.stock",
        "operator": "gt",
        "value": 0
      }
    }
  }
]

Error Handling

ErrorBehavior
Query timeoutresult_field set to null
Connection failureStage fails, pipeline stops
No rows returnedresult_field set to null
Invalid SQLStage fails with error message