Skip to content
master
Switch branches/tags
Code

Latest commit

I am trying to build FAMIX model out of production PostgreSQL database, here my fixes.
0fa8b4a

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
src
 
 
 
 
 
 
 
 
 
 

PostgreSQLParser Build Status

A parser for PostgreSQL written in Pharo using PetitParser.

For now, the focus is made on PL/pgSQL source code.

Install

Metacello new
	baseline: 'PostgreSQLParser';
	repository: 'github://juliendelplanque/PostgreSQLParser/src';
	load

Groups

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: [ 
	spec
		repository: 'github://juliendelplanque/PostgreSQLParser/src' ]
[...]

Usage

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: