Skip to content
A parser for PostgreSQL written in Pharo using PetitParser.
Smalltalk HTML
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

PostgreSQLParser Build Status

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';


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 : parser and its unit tests.
  • ast : Only the Abstract Syntactic Tree model.
  • ast-builder : ast + the object that builds the AST from the source code (also requires parser).
  • 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 loads future group 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'

Use it as a dependency

To use this project as a dependency, add the following code in your baseline:

spec baseline: 'PostgreSQLParser' with: [ 
		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.city_id 
FROM person, city
WHERE person.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:
You can’t perform that action at this time.