Custom dialects
Extend the parser with your own dialect — a company-specific function set, a stricter validator, or a new database entirely.
Register a dialect
Create a class extending Kwasii\LaravelSqlParser\Dialects\Dialect and register it by name:
namespace App\Sql;
use Kwasii\LaravelSqlParser\Dialects\Dialect;
use Kwasii\LaravelSqlParser\Dialects\MySql\MySql;
class AcmeDialect extends MySql
{
// override tokenizer, parser, generator tables
}
// config/laravel-sql-parser.php
'dialects' => [
'acme' => App\Sql\AcmeDialect::class,
],
Or register at runtime (useful in plain PHP):
use Kwasii\LaravelSqlParser\Dialects\Dialect;
Dialect::register('acme', AcmeDialect::class);
Dialect::transpile('SELECT 1', read: 'acme', write: 'postgres');
What to override
Dialects are data-driven: tokenizer tables, parser tables, and generator transforms. Common entry points on Dialect:
tokenizerTable($name) — keywords, single tokens, string handling
parserTable($name) — function parsers, statement parsers
generatorTransform($name) — per-expression SQL output
normalizeIdentifier() / caseSensitive() — identifier rules
canQuote() / quoteIdentifier() — quoting behavior
Start by subclassing the closest built-in dialect (e.g. MySql, Postgres, TSql) and override only what differs.
Tips
- Keep the dialect name lowercase, no spaces. It becomes the value users pass as
from/to.
- Cover your dialect with tests: parse → generate round-trips plus cross-dialect transpiles.
- If your dialect is generally useful, consider contributing it upstream.