GoSQLX
Overview
GoSQLX is a high-performance SQL parsing library designed for production use. It provides zero-copy tokenization, intelligent object pooling, and comprehensive SQL dialect support while maintaining a simple, idiomatic Go API.
Key Features
- Blazing Fast: 1.38M+ ops/sec sustained, 1.5M+ ops/sec peak throughput
- Memory Efficient: 60-80% reduction through intelligent object pooling
- Thread-Safe: Race-free, linear scaling to 128+ cores, 0 race conditions detected
- Production-Grade Testing: Token 100%, Keywords 100%, Errors 95.6%, Tokenizer 76.1%, Parser 76.1%, CLI 63.3% coverage
- Complete JOIN Support: All JOIN types (INNER/LEFT/RIGHT/FULL OUTER/CROSS/NATURAL) with proper tree logic
- Advanced SQL Features: CTEs with RECURSIVE support, Set Operations (UNION/EXCEPT/INTERSECT)
- Window Functions: Complete SQL-99 window function support with OVER clause, PARTITION BY, ORDER BY, frame specs
- MERGE Statements: Full SQL:2003 MERGE support with WHEN MATCHED/NOT MATCHED clauses
- Grouping Operations: GROUPING SETS, ROLLUP, CUBE (SQL-99 T431)
- Materialized Views: CREATE, DROP, REFRESH MATERIALIZED VIEW support
- Table Partitioning: PARTITION BY RANGE, LIST, HASH support
- SQL Injection Detection: Built-in security scanner (
pkg/sql/security) for injection pattern detection
- Unicode Support: Complete UTF-8 support for international SQL
- Multi-Dialect: PostgreSQL, MySQL, SQL Server, Oracle, SQLite
- PostgreSQL Extensions: LATERAL JOIN, DISTINCT ON, FILTER clause, JSON/JSONB operators, aggregate ORDER BY
- Zero-Copy: Direct byte slice operations, <1ฮผs latency
- Intelligent Errors: Structured error codes with typo detection, context highlighting, and helpful hints
- Production Ready: Battle-tested with 0 race conditions detected, ~80-85% SQL-99 compliance
| 1.38M+ |
8M+ |
<1ฮผs |
14x |
575x |
100% โญ |
| Ops/sec |
Tokens/sec |
Latency |
Faster Tokens |
Cache Speedup |
Token Coverage |
โ
v1.6.0 Released โข LSP Server โข VSCode Extension โข PostgreSQL JSON/JSONB โข 10 Linter Rules โข ~85% SQL-99 compliance
๐ What's New in v1.6.0
| Feature |
Description |
| ๐ LSP Server |
Full Language Server Protocol for IDE integration with diagnostics, completion, hover |
| ๐ VSCode Extension |
Official extension with syntax highlighting, formatting, and autocomplete |
| ๐ PostgreSQL Extensions |
LATERAL JOIN, JSON/JSONB operators (->, ->>, @>, #>), DISTINCT ON, FILTER clause |
| ๐ Linter Rules |
10 built-in rules (L001-L010) with auto-fix for SELECT *, missing aliases, etc. |
| ๐ก๏ธ Security Scanner |
Enhanced SQL injection detection with severity classification |
| โก Performance |
14x faster token comparison, 575x faster keyword suggestions via caching |
| ๐๏ธ go-task |
Modern task runner (Taskfile.yml) replacing Makefile |
| ๐ข Structured Errors |
Error codes E1001-E3004 for tokenizer, parser, and semantic errors |
See CHANGELOG.md for the complete list of 20+ PRs merged in this release.
Project Stats
Installation
Library Installation
go get github.com/ajitpratap0/GoSQLX
CLI Installation
# Install the CLI tool
go install github.com/ajitpratap0/GoSQLX/cmd/gosqlx@latest
# Or build from source
git clone https://github.com/ajitpratap0/GoSQLX.git
cd GoSQLX
go build -o gosqlx ./cmd/gosqlx
Requirements:
- Go 1.24 or higher
- No external dependencies
Quick Start
CLI Usage
Standard Usage:
# Validate SQL syntax
gosqlx validate "SELECT * FROM users WHERE active = true"
# Format SQL files with intelligent indentation
gosqlx format -i query.sql
# Analyze SQL structure and complexity
gosqlx analyze "SELECT COUNT(*) FROM orders GROUP BY status"
# Parse SQL to AST representation
gosqlx parse -f json complex_query.sql
# Unix Pipeline Support (NEW in v1.5.0)
cat query.sql | gosqlx format # Format from stdin
echo "SELECT * FROM users" | gosqlx validate # Validate from pipe
gosqlx format query.sql | gosqlx validate # Chain commands
cat *.sql | gosqlx format | tee formatted.sql # Pipeline composition
Pipeline/Stdin Support (New in v1.6.0):
# Auto-detect piped input
echo "SELECT * FROM users" | gosqlx validate
cat query.sql | gosqlx format
cat complex.sql | gosqlx analyze --security
# Explicit stdin marker
gosqlx validate -
gosqlx format - < query.sql
# Input redirection
gosqlx validate < query.sql
gosqlx parse < complex_query.sql
# Full pipeline chains
cat query.sql | gosqlx format | gosqlx validate
echo "select * from users" | gosqlx format > formatted.sql
find . -name "*.sql" -exec cat {} \; | gosqlx validate
# Works on Windows PowerShell too!
Get-Content query.sql | gosqlx format
"SELECT * FROM users" | gosqlx validate
Cross-Platform Pipeline Examples:
# Unix/Linux/macOS
cat query.sql | gosqlx format | tee formatted.sql | gosqlx validate
echo "SELECT 1" | gosqlx validate && echo "Valid!"
# Windows PowerShell
Get-Content query.sql | gosqlx format | Set-Content formatted.sql
"SELECT * FROM users" | gosqlx validate
# Git hooks (pre-commit)
git diff --cached --name-only --diff-filter=ACM "*.sql" | \
xargs cat | gosqlx validate --quiet
Language Server Protocol (LSP) (v1.6.0):
# Start LSP server for IDE integration
gosqlx lsp
# With debug logging
gosqlx lsp --log /tmp/gosqlx-lsp.log
The LSP server provides real-time SQL intelligence for IDEs:
- Diagnostics: Real-time syntax error detection with position info
- Hover: Documentation for 60+ SQL keywords
- Completion: 100+ SQL keywords, functions, and 22 snippets
- Formatting: SQL code formatting via
textDocument/formatting
- Document Symbols: SQL statement outline navigation
- Signature Help: Function signatures for 20+ SQL functions
- Code Actions: Quick fixes (add semicolon, uppercase keywords)
Linting (v1.6.0):
# Run built-in linter rules
gosqlx lint query.sql
# With auto-fix
gosqlx lint --fix query.sql
# Specific rules
gosqlx lint --rules L001,L002,L003 query.sql
Available rules (L001-L010):
L001: Avoid SELECT *
L002: Missing table aliases in JOIN
L003: Implicit column aliases
L004: Missing WHERE clause in UPDATE/DELETE
L005: Inefficient LIKE patterns
L006: Use explicit JOIN syntax (not comma joins)
L007: ORDER BY ordinal numbers
L008: Inconsistent keyword casing
L009: Missing column list in INSERT
L010: Avoid DISTINCT without ORDER BY
IDE Integration:
// VSCode settings.json
{
"gosqlx.lsp.enable": true,
"gosqlx.lsp.path": "gosqlx"
}
-- Neovim (nvim-lspconfig)
require('lspconfig.configs').gosqlx = {
default_config = {
cmd = { 'gosqlx', 'lsp' },
filetypes = { 'sql' },
root_dir = function() return vim.fn.getcwd() end,
},
}
require('lspconfig').gosqlx.setup{}
Library Usage - Simple API
GoSQLX provides a simple, high-level API that handles all complexity for you:
package main
import (
"fmt"
"log"
"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"
)
func main() {
// Parse SQL in one line - that's it!
ast, err := gosqlx.Parse("SELECT * FROM users WHERE active = true")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Successfully parsed %d statement(s)\n", len(ast.Statements))
}
That's it! Just 3 lines of code. No pool management, no manual cleanup - everything is handled for you.
More Examples
// Validate SQL without parsing
if err := gosqlx.Validate("SELECT * FROM users"); err != nil {
fmt.Println("Invalid SQL:", err)
}
// Parse multiple queries efficiently
queries := []string{
"SELECT * FROM users",
"SELECT * FROM orders",
}
asts, err := gosqlx.ParseMultiple(queries)
// Parse with timeout for long queries
ast, err := gosqlx.ParseWithTimeout(sql, 5*time.Second)
// Parse from byte slice (zero-copy)
ast, err := gosqlx.ParseBytes([]byte("SELECT * FROM users"))
Advanced Usage - Low-Level API
For performance-critical code that needs fine-grained control, use the low-level API:
package main
import (
"fmt"
"github.com/ajitpratap0/GoSQLX/pkg/sql/tokenizer"
"github.com/ajitpratap0/GoSQLX/pkg/sql/parser"
)
func main() {
// Get tokenizer from pool (always return it!)
tkz := tokenizer.GetTokenizer()
defer tokenizer.PutTokenizer(tkz)
// Tokenize SQL
sql := "SELECT id, name FROM users WHERE age > 18"
tokens, err := tkz.Tokenize([]byte(sql))
if err != nil {
panic(err)
}
// Convert tokens
converter := parser.NewTokenConverter()
result, err := converter.Convert(tokens)
if err != nil {
panic(err)
}
// Parse to AST
p := parser.NewParser()
defer p.Release()
ast, err := p.Parse(result.Tokens)
if err != nil {
panic(err)
}
fmt.Printf("Statement type: %T\n", ast)
}
Note: The simple API has < 1% performance overhead compared to low-level API. Use the simple API unless you need fine-grained control.
Documentation
Comprehensive Guides
Getting Started
Quick Links
Advanced SQL Features (v1.2.0)
GoSQLX now supports Common Table Expressions (CTEs) and Set Operations alongside complete JOIN support:
Common Table Expressions (CTEs)
// Simple CTE
sql := `
WITH sales_summary AS (
SELECT region, SUM(amount) as total
FROM sales
GROUP BY region
)
SELECT region FROM sales_summary WHERE total > 1000
`
// Recursive CTE for hierarchical data
sql := `
WITH RECURSIVE employee_tree AS (
SELECT employee_id, manager_id, name
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, e.manager_id, e.name
FROM employees e
JOIN employee_tree et ON e.manager_id = et.employee_id
)
SELECT * FROM employee_tree
`
// Multiple CTEs in single query
sql := `
WITH regional AS (SELECT region, total FROM sales),
summary AS (SELECT region FROM regional WHERE total > 1000)
SELECT * FROM summary
`
Set Operations
// UNION - combine results with deduplication
sql := "SELECT name FROM users UNION SELECT name FROM customers"
// UNION ALL - combine results preserving duplicates
sql := "SELECT id FROM orders UNION ALL SELECT id FROM invoices"
// EXCEPT - set difference
sql := "SELECT product FROM inventory EXCEPT SELECT product FROM discontinued"
// INTERSECT - set intersection
sql := "SELECT customer_id FROM orders INTERSECT SELECT customer_id FROM payments"
// Left-associative parsing for multiple operations
sql := "SELECT a FROM t1 UNION SELECT b FROM t2 INTERSECT SELECT c FROM t3"
// Parsed as: (SELECT a FROM t1 UNION SELECT b FROM t2) INTERSECT SELECT c FROM t3
Complete JOIN Support
GoSQLX supports all JOIN types with proper left-associative tree logic:
// Complex JOIN query with multiple table relationships
sql := `
SELECT u.name, o.order_date, p.product_name, c.category_name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
INNER JOIN products p ON o.product_id = p.id
RIGHT JOIN categories c ON p.category_id = c.id
WHERE u.active = true
ORDER BY o.order_date DESC
`
// Parse with automatic JOIN tree construction
tkz := tokenizer.GetTokenizer()
defer tokenizer.PutTokenizer(tkz)
tokens, err := tkz.Tokenize([]byte(sql))
parser := parser.NewParser()
ast, err := parser.Parse(tokens)
// Access JOIN information
if selectStmt, ok := ast.Statements[0].(*ast.SelectStatement); ok {
fmt.Printf("Found %d JOINs:\n", len(selectStmt.Joins))
for i, join := range selectStmt.Joins {
fmt.Printf("JOIN %d: %s (left: %s, right: %s)\n",
i+1, join.Type, join.Left.Name, join.Right.Name)
}
}
Supported JOIN Types:
- โ
INNER JOIN - Standard inner joins
- โ
LEFT JOIN / LEFT OUTER JOIN - Left outer joins
- โ
RIGHT JOIN / RIGHT OUTER JOIN - Right outer joins
- โ
FULL JOIN / FULL OUTER JOIN - Full outer joins
- โ
CROSS JOIN - Cartesian product joins
- โ
NATURAL JOIN - Natural joins (implicit ON clause)
- โ
USING (column) - Single-column using clause
Advanced SQL Features (v1.4+)
MERGE Statements (SQL:2003 F312)
sql := `
MERGE INTO target_table t
USING source_table s ON t.id = s.id
WHEN MATCHED THEN
UPDATE SET t.name = s.name, t.value = s.value
WHEN NOT MATCHED THEN
INSERT (id, name, value) VALUES (s.id, s.name, s.value)
`
ast, err := gosqlx.Parse(sql)
GROUPING SETS, ROLLUP, CUBE (SQL-99 T431)
// GROUPING SETS - explicit grouping combinations
sql := `SELECT region, product, SUM(sales)
FROM orders
GROUP BY GROUPING SETS ((region), (product), (region, product), ())`
// ROLLUP - hierarchical subtotals
sql := `SELECT year, quarter, month, SUM(revenue)
FROM sales
GROUP BY ROLLUP (year, quarter, month)`
// CUBE - all possible combinations
sql := `SELECT region, product, SUM(amount)
FROM sales
GROUP BY CUBE (region, product)`
Materialized Views
// Create materialized view
sql := `CREATE MATERIALIZED VIEW sales_summary AS
SELECT region, SUM(amount) as total
FROM sales GROUP BY region`
// Refresh materialized view
sql := `REFRESH MATERIALIZED VIEW CONCURRENTLY sales_summary`
// Drop materialized view
sql := `DROP MATERIALIZED VIEW IF EXISTS sales_summary`
SQL Injection Detection
import "github.com/ajitpratap0/GoSQLX/pkg/sql/security"
// Create scanner
scanner := security.NewScanner()
// Scan for injection patterns
result := scanner.Scan(ast)
if result.HasCritical() {
fmt.Printf("Found %d critical issues!\n", result.CriticalCount)
for _, finding := range result.Findings {
fmt.Printf(" [%s] %s: %s\n",
finding.Severity, finding.Pattern, finding.Description)
}
}
// Detected patterns include:
// - Tautology (1=1, 'a'='a')
// - UNION-based injection
// - Time-based blind (SLEEP, WAITFOR DELAY)
// - Comment bypass (--, /**/)
// - Stacked queries
// - Dangerous functions (xp_cmdshell, LOAD_FILE)
Expression Operators (BETWEEN, IN, LIKE, IS NULL)
// BETWEEN with expressions
sql := `SELECT * FROM orders WHERE amount BETWEEN 100 AND 500`
// IN with subquery
sql := `SELECT * FROM users WHERE id IN (SELECT user_id FROM admins)`
// LIKE with pattern matching
sql := `SELECT * FROM products WHERE name LIKE '%widget%'`
// IS NULL / IS NOT NULL
sql := `SELECT * FROM users WHERE deleted_at IS NULL`
// NULLS FIRST/LAST ordering (SQL-99 F851)
sql := `SELECT * FROM users ORDER BY last_login DESC NULLS LAST`
PostgreSQL-Specific Features (v1.6+)
LATERAL JOIN - Correlated subqueries in FROM clause:
// LATERAL allows referencing columns from preceding tables
sql := `
SELECT u.name, recent_orders.order_date, recent_orders.total
FROM users u
LEFT JOIN LATERAL (
SELECT order_date, total
FROM orders
WHERE user_id = u.id
ORDER BY order_date DESC
LIMIT 1
) AS recent_orders ON true
`
ast, err := gosqlx.Parse(sql)
ORDER BY inside Aggregates - Ordered set functions:
// STRING_AGG with ORDER BY
sql := `SELECT STRING_AGG(name, ', ' ORDER BY name DESC NULLS LAST) FROM users`
// ARRAY_AGG with ORDER BY
sql := `SELECT ARRAY_AGG(value ORDER BY created_at, priority DESC) FROM items`
// JSON_AGG with ORDER BY
sql := `SELECT JSON_AGG(employee_data ORDER BY hire_date) FROM employees`
// Multiple aggregates with different orderings
sql := `
SELECT
department,
STRING_AGG(name, '; ' ORDER BY name ASC NULLS FIRST) AS employee_names,
ARRAY_AGG(salary ORDER BY salary DESC) AS salaries
FROM employees
GROUP BY department
`
ast, err := gosqlx.Parse(sql)
JSON/JSONB Operators - PostgreSQL JSON support:
// Arrow operators for field access
sql := `SELECT data -> 'user' -> 'profile' ->> 'email' FROM users`
// Path operators for nested access
sql := `SELECT data #> '{address,city}', data #>> '{address,zipcode}' FROM users`
// Containment operators
sql := `SELECT * FROM users WHERE data @> '{"active": true}'`
sql := `SELECT * FROM users WHERE '{"admin": true}' <@ data`
// Combined JSON operators in complex queries
sql := `
SELECT
u.id,
u.data ->> 'name' AS user_name,
u.data -> 'settings' ->> 'theme' AS theme
FROM users u
WHERE u.data @> '{"verified": true}'
AND u.data ->> 'status' = 'active'
`
ast, err := gosqlx.Parse(sql)
DISTINCT ON - PostgreSQL unique row selection:
// Select first row per group based on ordering
sql := `
SELECT DISTINCT ON (user_id) user_id, created_at, status
FROM orders
ORDER BY user_id, created_at DESC
`
ast, err := gosqlx.Parse(sql)
FILTER Clause - Conditional aggregation:
// COUNT with FILTER
sql := `
SELECT
COUNT(*) AS total_orders,
COUNT(*) FILTER (WHERE status = 'completed') AS completed_orders,
SUM(amount) FILTER (WHERE region = 'US') AS us_revenue
FROM orders
`
ast, err := gosqlx.Parse(sql)
Examples
Multi-Dialect Support
// PostgreSQL with array operators
sql := `SELECT * FROM users WHERE tags @> ARRAY['admin']`
// MySQL with backticks
sql := "SELECT `user_id`, `name` FROM `users`"
// SQL Server with brackets
sql := "SELECT [user_id], [name] FROM [users]"
Unicode and International SQL
// Japanese
sql := `SELECT "ๅๅ", "ๅนด้ฝข" FROM "ใฆใผใถใผ"`
// Russian
sql := `SELECT "ะธะผั", "ะฒะพะทัะฐัั" FROM "ะฟะพะปัะทะพะฒะฐัะตะปะธ"`
// Arabic
sql := `SELECT "ุงูุงุณู
", "ุงูุนู
ุฑ" FROM "ุงูู
ุณุชุฎุฏู
ูู"`
// Emoji support
sql := `SELECT * FROM users WHERE status = '๐'`
Concurrent Processing
func ProcessConcurrently(queries []string) {
var wg sync.WaitGroup
for _, sql := range queries {
wg.Add(1)
go func(query string) {
defer wg.Done()
// Each goroutine gets its own tokenizer
tkz := tokenizer.GetTokenizer()
defer tokenizer.PutTokenizer(tkz)
tokens, _ := tkz.Tokenize([]byte(query))
// Process tokens...
}(sql)
}
wg.Wait()
}
| Metric |
Previous |
v1.0.0 |
Improvement |
| Sustained Throughput |
2.2M ops/s |
946K+ ops/s |
Production Grade โ
|
| Peak Throughput |
2.2M ops/s |
1.25M+ ops/s |
Enhanced โ
|
| Token Processing |
8M tokens/s |
8M+ tokens/s |
Maintained โ
|
| Simple Query Latency |
200ns |
<280ns |
Optimized โ
|
| Complex Query Latency |
N/A |
<1ฮผs (CTE/Set Ops) |
New Capability โ
|
| Memory Usage |
Baseline |
60-80% reduction |
-70% โ
|
| SQL-92 Compliance |
40% |
~70% |
+75% โ
|
Latest Benchmark Results
BenchmarkParserSustainedLoad-16 946,583 1,057 ns/op 1,847 B/op 23 allocs/op
BenchmarkParserThroughput-16 1,252,833 798 ns/op 1,452 B/op 18 allocs/op
BenchmarkParserSimpleSelect-16 3,571,428 279 ns/op 536 B/op 9 allocs/op
BenchmarkParserComplexSelect-16 985,221 1,014 ns/op 2,184 B/op 31 allocs/op
BenchmarkCTE/SimpleCTE-16 524,933 1,891 ns/op 3,847 B/op 52 allocs/op
BenchmarkCTE/RecursiveCTE-16 387,654 2,735 ns/op 5,293 B/op 71 allocs/op
BenchmarkSetOperations/UNION-16 445,782 2,234 ns/op 4,156 B/op 58 allocs/op
BenchmarkTokensPerSecond-16 815,439 1,378 ns/op 8,847,625 tokens/sec
| Metric |
Value |
Details |
| Sustained Throughput |
946K+ ops/sec |
30s load testing |
| Peak Throughput |
1.25M+ ops/sec |
Concurrent goroutines |
| Token Rate |
8M+ tokens/sec |
Sustained processing |
| Simple Query Latency |
<280ns |
Basic SELECT (p50) |
| Complex Query Latency |
<1ฮผs |
CTEs/Set Operations |
| Memory |
1.8KB/query |
Complex SQL with pooling |
| Scaling |
Linear to 128+ |
Perfect concurrency |
| Pool Efficiency |
95%+ hit rate |
Effective reuse |
Run go test -bench=. -benchmem ./pkg/... for detailed performance analysis.
Testing
# Run all tests with race detection
go test -race ./...
# Run benchmarks
go test -bench=. -benchmem ./...
# Generate coverage report
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
# Run specific test suites
go test -v ./pkg/sql/tokenizer/
go test -v ./pkg/sql/parser/
Project Structure
GoSQLX/
โโโ pkg/
โ โโโ models/ # Core data structures
โ โ โโโ token.go # Token definitions
โ โ โโโ location.go # Position tracking
โ โโโ sql/
โ โโโ tokenizer/ # Lexical analysis
โ โ โโโ tokenizer.go
โ โ โโโ pool.go
โ โโโ parser/ # Syntax analysis
โ โ โโโ parser.go
โ โ โโโ expressions.go
โ โโโ ast/ # Abstract syntax tree
โ โ โโโ nodes.go
โ โ โโโ statements.go
โ โโโ keywords/ # SQL keywords
โโโ examples/ # Usage examples
โ โโโ cmd/
โ โโโ example.go
โ โโโ example_test.go
โโโ docs/ # Documentation
โ โโโ API_REFERENCE.md
โ โโโ USAGE_GUIDE.md
โ โโโ ARCHITECTURE.md
โ โโโ TROUBLESHOOTING.md
โโโ tools/ # Development tools
Development
Prerequisites
- Go 1.24+
- Task - task runner (install:
go install github.com/go-task/task/v3/cmd/task@latest)
- golangci-lint, staticcheck (for code quality, install:
task deps:tools)
Task Runner
This project uses Task as the task runner. Install with:
go install github.com/go-task/task/v3/cmd/task@latest
# Or: brew install go-task (macOS)
Building
# Show all available tasks
task
# Build the project
task build
# Build the CLI binary
task build:cli
# Install CLI globally
task install
# Run all quality checks
task quality
# Run all tests
task test
# Run tests with race detection (recommended)
task test:race
# Clean build artifacts
task clean
Code Quality
# Format code
task fmt
# Run go vet
task vet
# Run golangci-lint
task lint
# Run all quality checks (fmt, vet, lint)
task quality
# Full CI check (format, vet, lint, test:race)
task check
Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
How to Contribute
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature)
- Commit your changes (
git commit -m 'Add amazing feature')
- Push to the branch (
git push origin feature/amazing-feature)
- Open a Pull Request
Development Guidelines
- Write tests for new features
- Ensure all tests pass with race detection
- Follow Go idioms and best practices
- Update documentation for API changes
- Add benchmarks for performance-critical code
Roadmap
Phase 1: Core SQL Enhancements (Q1 2025) - v1.1.0 โ
- โ
Complete JOIN support (INNER/LEFT/RIGHT/FULL OUTER/CROSS/NATURAL)
- โ
Proper join tree logic with left-associative relationships
- โ
USING clause parsing (single-column, multi-column planned for Phase 2)
- โ
Enhanced error handling with contextual JOIN error messages
- โ
Comprehensive test coverage (15+ JOIN scenarios including error cases)
- ๐๏ธ CTE foundation laid (AST structures, tokens, parser integration points)
Phase 2: CTE & Advanced Features (Q1 2025) - v1.2.0 โ
- โ
Common Table Expressions (CTEs) with RECURSIVE support
- โ
Set operations (UNION/EXCEPT/INTERSECT with ALL modifier)
- โ
Left-associative set operation parsing
- โ
CTE column specifications and multiple CTE definitions
- โ
Integration of CTEs with set operations
- โ
Enhanced error handling with contextual messages
- โ
~70% SQL-92 compliance achieved
Phase 3: Dialect Specialization (Q1 2025) - v2.0.0
- ๐ PostgreSQL arrays, JSONB, custom types
- ๐ MySQL-specific syntax and functions
- ๐ SQL Server T-SQL extensions
- ๐ Multi-dialect parser with auto-detection
Phase 4: Intelligence Layer (Q2 2025) - v2.1.0
- ๐ Query optimization suggestions
- ๐ Security vulnerability detection
- ๐ Performance analysis and hints
- ๐ Schema validation
See ARCHITECTURE.md for detailed system design

Get Help
Contributors
Core Team
How to Contribute
We love your input! We want to make contributing as easy and transparent as possible.

Quick Contribution Guide
- ๐ด Fork the repo
- ๐จ Make your changes
- โ
Ensure tests pass (
go test -race ./...)
- ๐ Update documentation
- ๐ Submit a PR
Use Cases
| Industry |
Use Case |
Benefits |
| ๐ฆ FinTech |
SQL validation & auditing |
Fast validation, compliance tracking |
| ๐ Analytics |
Query parsing & optimization |
Real-time analysis, performance insights |
| ๐ก๏ธ Security |
SQL injection detection |
Pattern matching, threat prevention |
| ๐๏ธ DevTools |
IDE integration & linting |
Syntax highlighting, auto-completion |
| ๐ Education |
SQL learning platforms |
Interactive parsing, error explanation |
| ๐ Migration |
Cross-database migration |
Dialect conversion, compatibility check |
Who's Using GoSQLX
Project Metrics
graph LR
A[SQL Input] -->|946K+ ops/sec| B[Tokenizer]
B -->|8M+ tokens/sec| C[Parser]
C -->|Zero-copy| D[AST]
D -->|60-80% less memory| E[Output]
Support This Project
If GoSQLX helps your project, please consider:

Other Ways to Support
- โญ Star this repository
- ๐ฆ Tweet about GoSQLX
- ๐ Write a blog post
- ๐ฅ Create a tutorial
- ๐ Report bugs
- ๐ก Suggest features
- ๐ง Submit PRs
License
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.
Built with โค๏ธ by the GoSQLX Team
Copyright ยฉ 2024-2025 GoSQLX. All rights reserved.