- ONLINE TOOLS:
- DDL reordering
Abstract Syntax Tree parsers and compilers by DWH.dev as a service
Source
CREATE TABLE t (
id SERIAL,
name VARCHAR(16) NOT NULL
);
ALTER TABLE ONLY public.t
ADD CONSTRAINT t_pk PRIMARY KEY (id);
ALTER TABLE t
ADD email VARCHAR(64) NOT NULL;
AST
[
{
"CreateStmt": {
"relation": {
"RangeVar": {
"relname": "t",
"inh": true,
"relpersistence": "p",
"location": 13
}
},
"tableElts": [
{
"ColumnDef": {
"colname": "id",
"typeName": {
"TypeName": {
"names": [
{
"String": {
"str": "serial"
}
}
],
"typemod": -1,
"location": 22
}
},
"is_local": true,
"location": 19
}
},
{
"ColumnDef": {
"colname": "name",
"typeName": {
"TypeName": {
"names": [
{
"String": {
"str": "pg_catalog"
}
},
{
"String": {
"str": "varchar"
}
}
],
"typmods": [
{
"A_Const": {
"val": {
"Integer": {
"ival": 16
}
},
"location": 45
}
}
],
"typemod": -1,
"location": 37
}
},
"is_local": true,
"constraints": [
{
"Constraint": {
"location": 49,
"contype": 1
}
}
],
"location": 32
}
}
],
"oncommit": 0
}
},
{
"AlterTableStmt": {
"type": 237,
"relation": {
"RangeVar": {
"schemaname": "public",
"relname": "t",
"relpersistence": "p",
"location": 17
}
},
"cmds": [
{
"AlterTableCmd": {
"subtype": 17,
"def": {
"Constraint": {
"conname": "t_pk",
"location": 32,
"contype": 6,
"keys": [
{
"String": {
"str": "id"
}
}
]
}
},
"behavior": 0
}
}
],
"relkind": 39
}
},
{
"AlterTableStmt": {
"type": 237,
"relation": {
"RangeVar": {
"relname": "t",
"inh": true,
"relpersistence": "p",
"location": 12
}
},
"cmds": [
{
"AlterTableCmd": {
"subtype": 0,
"def": {
"ColumnDef": {
"colname": "email",
"typeName": {
"TypeName": {
"names": [
{
"String": {
"str": "pg_catalog"
}
},
{
"String": {
"str": "varchar"
}
}
],
"typmods": [
{
"A_Const": {
"val": {
"Integer": {
"ival": 64
}
},
"location": 35
}
}
],
"typemod": -1,
"location": 27
}
},
"is_local": true,
"constraints": [
{
"Constraint": {
"location": 39,
"contype": 1
}
}
],
"location": 21
}
},
"behavior": 0
}
}
],
"relkind": 39
}
}
]
Compiled
{
"relations": [
{
"type": "TABLE",
"names": {
"original": {
"schema": "public",
"name": "t"
},
"local": null
},
"indexes": [
{
"name": "t_pk",
"relation": {
"schema": "public",
"name": "t"
},
"method": "btree",
"where": null,
"unique": true,
"constraint": {
"name": "t_pk"
},
"columnsParams": [
{
"name": "id",
"ordering": 0,
"nulls_ordering": 0
}
],
"excludeParams": null
}
],
"constraints": [
{
"type": "CONSTR_NOTNULL",
"place": "inline",
"name": null,
"relation": {
"schema": "public",
"name": "t"
},
"columns": [
"name"
],
"constraint": {
"ast": [],
"compiled": null
}
},
{
"type": "CONSTR_PRIMARY",
"place": "detached",
"name": "t_pk",
"columns": [
"id"
],
"relation": {
"schema": "public",
"name": "t"
},
"constraint": {
"ast": null,
"compiled": null
}
},
{
"type": "CONSTR_NOTNULL",
"place": "detached",
"name": null,
"columns": [
"email"
],
"relation": {
"schema": "public",
"name": "t"
},
"constraint": {
"ast": null,
"compiled": null
}
},
{
"type": "CONSTR_NOTNULL",
"place": "generated-notnull",
"name": null,
"relation": {
"schema": "public",
"name": "t"
},
"columns": [
"id"
],
"constraint": {
"ast": null,
"compiled": null
}
}
],
"columns": [
{
"names": {
"original": "id",
"local": null
},
"type": {
"schema": "pg_catalog",
"name": "integer",
"mods": [],
"array": {
"dimension": 0,
"bounds": []
}
},
"kind": "column",
"nullable": "yes",
"sequence": {
"schema": "public",
"name": "t_id_seq"
}
},
{
"names": {
"original": "name",
"local": null
},
"type": {
"schema": "pg_catalog",
"name": "character varying",
"mods": [
16
],
"array": {
"dimension": 0,
"bounds": []
}
},
"kind": "column",
"nullable": "no",
"sequence": null
},
{
"names": {
"original": "email",
"local": null
},
"type": {
"schema": "pg_catalog",
"name": "character varying",
"mods": [
64
],
"array": {
"dimension": 0,
"bounds": []
}
},
"kind": "column",
"nullable": "no",
"sequence": null
}
],
"partition": null,
"inherit": null,
}
],
"types": [],
"functions": [],
"operators": [],
"sequences": [
{
"schema": "public",
"name": "t_id_seq",
"nameSource": "generated",
"type": {
"schema": "pg_catalog",
"name": "integer",
"mods": [],
"array": {
"dimension": 0,
"bounds": [
-1
]
}
},
"increment": null,
"start": null,
"min": null,
"max": null,
"place": "inline",
}
]
}
SQL dialects
PostgreSQL | Snowflake | Cypher | BigQuery | Mysql/MariaDB | |
---|---|---|---|---|---|
AST | |||||
dialect db version | 13 | 5.18 | — | oct 2020 | 8.0/10.5 |
status | production | alpha | production | soon | soon |
origin | official | custom | third party | official | official |
DDL syntax coverage | |||||
DML syntax coverage | with some exceptions 1 | ||||
rest syntax coverage | |||||
db-specified tree | |||||
postgres-like tree | soon | soon | |||
multi-statements | |||||
DDL statements reordering | soon | soon | soon | ||
DDL AST deparser | soon | soon | soon | soon | |
DML AST deparser | soon | soon | soon | soon | |
relation name normalization | soon | soon | soon | soon | |
COMPILER | |||||
status | production | alpha | soon | soon | |
DDL | |||||
DDL behavior coverage | with some exceptions 2 | partial | with some exceptions 2 | with some exceptions 2 | |
UD statements compiler 3 | soon | ||||
VIEW compiler | partial | ||||
DML | |||||
DML result fields base types | partial | ||||
DML result fields UD types | soon | ||||
DML result fields nullable solver | partial | ||||
DML lines count class 4 | soon | ||||
DML parameters types | soon | soon | soon | soon | |
DML parameters nullable solver | soon | soon | soon | soon | |
Relations connections from DML 5 | partial | ||||
syntax auto-recovery 6 | soon | soon | soon | soon | |
scope at position 7 | soon | soon | soon | soon | |
details | Redshift, greenplum and others postgresql-based syntax DBs | — | — | — | — |
- some corner cases
- some rare behavior, cant be use for strong error validation
- parse types from user-defined function, types, special functions behavior (eg timescale)
- none/one/one or none/many/many or none
- list of joined relations with fields inside statement
- parse incomplete statement
- get scope at any cursor position
Start now!
It’s free!
- register an account
- check out the API documentation with examples or get the Postman collection and try it in the Postman app
- Try out our static tool for automatically tracking SQL query result type changes after DDL or DML refactoring
- DDL statements reordering
Who needs it?
Developers who:
- are building database tools (e.g. data governance, database schema modelers, IDE plugins, etc.) 🛠️
- are building serverless and cloud-native applications ☁️
- want to automate code quality control in CI/CD ✅
- are code-generator lovers ❤️
- need deep database insights 💡
Subscribe to updates
We'll notify you about new supported SQL dialects, new compiler features, and more.
FAQ
parsers.dev is a service for AST parsing and compiling different SQL dialects, and supporting open-source and proprietary databases. We use both official and non-official parsers to build AST objects. After compiling DDL, you'll get an object which represents the database schema with relations, functions, and other objects after applying all CREATE, ALTER, and DROP statements. After compiling the DML you'll get return field types, nullability flags for each field, and row amount class (NONE, ONE, ONE_OR_NONE, MANY, MANY_OR_NONE). All this information, which you could never get before, can be used for a lot of purposes, from code quality control (like we use it in holistic.dev) to building awesome brand-new tools for developers, database administrators, and data teams! 🚀
Right now, it is absolutely free for now! After the test period, we'll make our service paid. We plan to make a free tier and charge for incoming data size with a minimum monthly limit. 💰
Everything is protected! We don’t even store your DDL or DML sources, except some statements that are not parsed by AST parsers for future reference.
Soon! Subscribe for news, and we will notify you
We are working on it... 📝
All compilers are created by us and we can’t guarantee 100% compatibility of the results with the behavior of the original systems. This is especially true for cloud-only databases, which are updated seamlessly without notice. We make every effort to bring our results as close as possible to the behavior of real systems. But don’t use this service as the only source of truth. Check all results when in doubt. We would be grateful if you would point out any problems you find (please see our contact info below). Because this is a SaaS, updates can be applied at any time without prior notice. We will do our best to maintain backward compatibility for as long as possible.
Great! Please, mail us at [email protected] and we'll start up a great collaboration! 🤝