poached

December 26, 2025 · View on GitHub

A DuckDB extension that exposes SQL parsing functionality for building IDEs, SQL editors, query analyzers, and other developer tools.

Features

API shape: parse_* returns detailed rows (table functions), while parse_*_names returns names-only lists (scalars).

Tokenization

FunctionKindReturnsDescriptionDeprecated alias of
parse_tokens(query)tablebyte_position bigint, category varcharReturns tokens with byte positions and categories (KEYWORD, IDENTIFIER, OPERATOR, NUMERIC_CONSTANT, STRING_CONSTANT). Uses DuckDB's internal tokenizer for accurate syntax highlighting. Note: comments are stripped before tokenization.-
tokenize_sql(query)tablebyte_position bigint, category varcharDeprecated alias.parse_tokens

Statement Analysis

FunctionKindReturnsDescriptionDeprecated alias of
parse_statements(query)tablestmt_index bigint, stmt_type varchar, error varchar, param_count bigintParse multi-statement SQL, returns statement type and errors.-
num_statements(query)scalarbigintCount statements in a query.-
is_valid_sql(query)scalarbooleanCheck if SQL is syntactically valid.-
sql_error_message(query)scalarvarchar (nullable)Get parse error message (NULL if valid).-

Schema Introspection

FunctionKindReturnsDescriptionDeprecated alias of
parse_columns(query, stmt_index)tablecol_index bigint, col_name varcharGet result column names from SELECT list.-
parse_column_names(query, stmt_index)scalarlist(varchar)Get result column names as array.-

Query Analysis

FunctionKindReturnsDescriptionDeprecated alias of
parse_tables(query)tableschema_name varchar, table_name varchar, context varcharExtract table references with schema and context.-
parse_table_names(query)scalarlist(varchar)Get table names as array.-
parse_functions(query)tablefunction_name varchar, function_type varcharExtract function calls.-
parse_function_names(query)scalarlist(varchar)Get function names as array.-
parse_where(query)tablecolumn_name varchar, operator varchar, value varcharExtract WHERE clause conditions.-

Utilities

FunctionKindReturnsDescriptionDeprecated alias of
parse_keywords()tablekeyword varcharList all SQL keywords.-
parse_keyword_names()scalarlist(varchar)Get keyword names as array.-
is_keyword(str)scalarbooleanCheck if string is a keyword.-
sql_strip_comments(query)scalarvarcharRemove comments from SQL.-
parse_sql_json(query)scalarvarchar (json)Get parse info as JSON.-
sql_keywords()tablekeyword varcharDeprecated alias.parse_keywords
sql_parse_json(query)scalarvarchar (json)Deprecated alias.parse_sql_json

Installation

INSTALL poached FROM community;
LOAD poached;

Example Usage

-- Syntax highlighting
SELECT * FROM parse_tokens('SELECT * FROM users WHERE id = 1');
┌───────────────┬──────────────────┐
│ byte_position │     category     │
├───────────────┼──────────────────┤
0 │ KEYWORD          │
7 │ OPERATOR         │
9 │ KEYWORD          │
14 │ IDENTIFIER       │
20 │ KEYWORD          │
26 │ IDENTIFIER       │
29 │ OPERATOR         │
31 │ NUMERIC_CONSTANT │
└───────────────┴──────────────────┘

-- Validate SQL
SELECT is_valid_sql('SELECT * FROM');  -- false
SELECT sql_error_message('SELECT * FROM');  -- Parser Error: ...

-- Extract functions
SELECT * FROM parse_functions('SELECT COUNT(*), UPPER(name) FROM t');
┌───────────────┬───────────────┐
│ function_name │ function_type │
├───────────────┼───────────────┤
│ count_star    │ aggregate
│ upper         │ scalar
└───────────────┴───────────────┘

-- Get column names from SELECT
SELECT * FROM parse_columns('SELECT 1 AS num, ''hello'' AS str', 0);
┌───────────┬──────────┐
│ col_index │ col_name │
├───────────┼──────────┤
0 │ num      │
1 │ str      │
└───────────┴──────────┘

-- Get parse info as JSON
SELECT parse_sql_json('SELECT 1 + 2 AS result');
-- Returns: {"error":false,"statements":[{"type":"SELECT","query":"SELECT (1 + 2) AS result"}]}

-- Extract table names
SELECT parse_table_names('SELECT * FROM users JOIN orders ON true');
-- Returns: [users, orders]

Deprecated aliases (still supported)

  • tokenize_sql -> parse_tokens
  • sql_keywords -> parse_keywords
  • sql_parse_json -> parse_sql_json

Building from Source

# Clone with submodules
git clone --recurse-submodules <repo>

# Build release
make release

# Run tests
make test_release

Dependencies

  • C/C++ toolchain
  • Make
  • CMake
  • Git

License

MIT License. See LICENSE for details.