Skip to content

abbychau/mysql-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MySQL Parser

A MySQL-compatible SQL parser extracted from TiDB, now available as a standalone Go module with WASM support.

Worth mentioning the database built on top of mysql-parser: MIST

Features

  • MySQL Compatibility: Supports MySQL 5.7+ SQL syntax
  • Full AST Support: Complete Abstract Syntax Tree generation
  • Visitor Pattern: Easy AST traversal and manipulation
  • WASM Support: Runs in WebAssembly environments
  • Type Safety: Proper handling of MySQL data types
  • Cross-Platform: Optimized for both native and WASM execution

Module Information

Module Path: github.com/abbychau/mysql-parser

This parser provides MySQL-compatible SQL parsing with full AST support and two parser driver options:

  1. Test Driver (test_driver) - Lightweight, basic functionality
  2. Full Driver (parser_driver) - Complete functionality with WASM compatibility

Installation

go get github.com/abbychau/mysql-parser # or go get github.com/abbychau/mysql-parser@v0.1.0

Usage Examples

Basic Usage with Test Driver

package main import ( "fmt" "github.com/abbychau/mysql-parser" "github.com/abbychau/mysql-parser/ast" _ "github.com/abbychau/mysql-parser/test_driver" ) func main() { p := parser.New() sql := "SELECT name, age FROM users WHERE age > 25" stmtNodes, _, err := p.ParseSQL(sql) if err != nil { fmt.Printf("Parse error: %v\n", err) return } fmt.Printf("Successfully parsed %d statements\n", len(stmtNodes)) }

Advanced Usage with Full Parser Driver

package main import ( "fmt" "github.com/abbychau/mysql-parser" "github.com/abbychau/mysql-parser/ast" _ "github.com/abbychau/mysql-parser/parser_driver" ) // ColumnExtractor implements ast.Visitor to extract column names type ColumnExtractor struct { ColNames []string } func (v *ColumnExtractor) Enter(in ast.Node) (ast.Node, bool) { if name, ok := in.(*ast.ColumnName); ok { v.ColNames = append(v.ColNames, name.Name.O) } return in, false } func (v *ColumnExtractor) Leave(in ast.Node) (ast.Node, bool) { return in, true } func main() { p := parser.New() sql := "SELECT users.name, orders.total FROM users JOIN orders ON users.id = orders.user_id" stmtNodes, _, err := p.ParseSQL(sql) if err != nil { fmt.Printf("Parse error: %v\n", err) return } // Extract column names using visitor pattern extractor := &ColumnExtractor{} stmtNodes[0].Accept(extractor) fmt.Printf("Extracted columns: %v\n", extractor.ColNames) }

WASM Usage

For WebAssembly applications, use the full parser driver:

package main import ( "syscall/js" "github.com/abbychau/mysql-parser" "github.com/abbychau/mysql-parser/ast" _ "github.com/abbychau/mysql-parser/parser_driver" ) func parseSQL(this js.Value, args []js.Value) interface{} { sqlText := args[0].String() p := parser.New() stmtNodes, _, err := p.ParseSQL(sqlText) if err != nil { return map[string]interface{}{ "success": false, "error": err.Error(), } } return map[string]interface{}{ "success": true, "count": len(stmtNodes), } } func main() { js.Global().Set("parseSQL", js.FuncOf(parseSQL)) select {} // Keep the program running }

Project Structure

github.com/abbychau/mysql-parser/ ├── ast/ # Abstract Syntax Tree definitions ├── charset/ # Character set support ├── mysql/ # MySQL constants and utilities ├── parser_driver/ # Full parser driver (WASM-compatible) ├── test_driver/ # Lightweight test driver ├── wasm-demo/ # WebAssembly demo application └── docs/ # Documentation 

Parser Drivers

Test Driver (test_driver)

  • Lightweight and minimal dependencies
  • Basic AST node support
  • Suitable for simple parsing tasks
  • Import: _ "github.com/abbychau/mysql-parser/test_driver"

Full Parser Driver (parser_driver)

  • Complete functionality with proper type handling
  • WASM-compatible (no CGO or unsafe operations)
  • Supports all MySQL data types and expressions
  • Full type system including Datum, FieldType, MyDecimal, Time
  • Comprehensive error handling and type conversions
  • Self-contained with no external dependencies
  • Import: _ "github.com/abbychau/mysql-parser/parser_driver"

Building for WASM

cd wasm-demo GOOS=js GOARCH=wasm go build -o parser.wasm main.go

The parser_driver package is specifically designed to work in WASM environments. The demo includes a web interface for testing SQL parsing in the browser.

License

Apache License 2.0 - see LICENSE file for details.

Original Source

This parser is based on TiDB's SQL parser component, modified for standalone use and WASM compatibility.

About

A standalone, cross-platform, MySQL parser for Golang

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages