A parser for PostgreSQL written in Pharo using PetitParser.
For now, the focus is made on PL/pgSQL source code.
Metacello new
baseline: 'PostgreSQLParser';
repository: 'github://juliendelplanque/PostgreSQLParser/src';
load
You can use the groups defined in the baseline to install only what you need. The following groups are available:
parser: Only the tokenizer and the grammar.parser-tests:parserand its unit tests.ast: Only the Abstract Syntactic Tree model.ast-builder:ast+ the object that builds the AST from the source code (also requiresparser).ast-builder-tests:ast-builder+ its unit tests.visitors:ast+ default visitors of the AST.core:parser+ast+ast-builder.core-tests:core+ all unit tests associated.future: Experimental code of this project, do not use this in production.dev: Everything you need to help in this project development loadsfuturegroup as well.
Let's say you only need the ast group, the following code will load this specific group:
Metacello new
baseline: 'PostgreSQLParser';
repository: 'github://juliendelplanque/PostgreSQLParser/src';
load: 'ast'
To use this project as a dependency, add the following code in your baseline:
[...]
spec baseline: 'PostgreSQLParser' with: [
spec
repository: 'github://juliendelplanque/PostgreSQLParser/src' ]
[...]
The complexity of the parsing process is hidden (for users) behind a facade: PostgreSQLParser class. The class-side methods provide a simple API to parse SQL code and get an AST as return.
For example:
ast := PostgreSQLParser parseSelectQuery: 'SELECT person.id, person.name, person.city_id
FROM person, city
WHERE person.city_id = city.id
LIMIT 10'. "Mind that there is not trailing ';' because this is part of statement's grammar not query grammar."
"... process the AST... "
There other methods work similarly:
PostgreSQLParser class>>#parseUpdateQuery:PostgreSQLParser class>>#parseCRUDQuery:PostgreSQLParser class>>#parseDeleteQuery:PostgreSQLParser class>>#parseInsertQuery:PostgreSQLParser class>>#parseSelectQuery:PostgreSQLParser class>>#parseStoredProcedureBody: