hssqlppp-0.0.4: development
Some brief notes on developing with this code.
The project comes with a working cabal file.
UUAGC is used in the type checking, there are some links at the top of
Ast.ag for more information.
Two of the files are generated:
DefaultScope.hs -> generated using ./HsSqlSystem.lhs getscope
template1 (make a backup of this file if you want to regenerate it -
you can get trapped without being able to run HsSqlSystem if the new
file doesn't compile). You shouldn't need to regenerate this file
unless you change the Scope data type, in which case you'll need to
use the DefaultScopeEmpty.hs file to be able to generate a new
scope. There is some info in the DefaultScopeEmpty.hs file along
these lines.
Ast.hs -> this is generated from Ast.ag and Typechecking.ag using
uuagc, see Ast.ag for instructions on how to do this.
If you are editing either of these files directly you're probably
doing something wrong.
See the file usage which gives some information on helper functions
you can try from ghci, and documents a bunch of utility functions you
can run from the command line.
There are rudimentary test for a lot of the functionality, see
ParserTests.lhs and AstCheckTests.lhs (for type checking). These
contain some small examples of how the code can be used. The
HsSqlSystem.lhs file contains a few more examples.
Source file overview:
(The type checking code is a bit spread out, ideally would want one
file for the ast, one file containing type checking code, and then
some clear additional little lib files, but the ast and type checking
are spread out in Ast.ag, AstUtils.lhs, TypeChecking.ag,
TypeCheckingH.lhs and TypeType.lhs. (The little libs also used in the
type checking are Scope.lhs, ScopeReader.lhs and TypeConversion.lhs.))
Ast.ag: uuagc source for the ast data types and the api functions for
type checking asts.
AstCheckTests.lhs: hunit tests for type checking
AstUtils.lhs: some utilities used mainly in type checking
DatabaseLoader.lhs: beginnings of a program to load sql from source
into postgresql, pretty rough and unfinished at
the moment.
DatabaseLoaderTests.lhs: almost empty hunit tests, intended to be used
mainly for testing error source positioning
when using databaseloader.lhs
DBAccess.lhs: some simple wrappers around hdbc to run sql statements
and do simple selects.
DefaultScopeEmpty.hs: an empty version of default scope, used to allow
the default scope generation to run when you've
hosed the DefaultScope.hs file.
DefaultScope.hs: generated file which contains the scope from a
standard template1 database. The intended use is to
support parsing and typechecking sql without having
online access to postgresql. Not sure if this is
useful. It's definitely quick enough to read this
information from a database at type checking time.
HsSqlSystem.lhs: program to expose some functionality on the command
line, mainly utilities to help with developing the
source. Run './HsSqlSystem.lhs help' to list the
commands.
Lexer.lhs: small file to lex sql source code.
ParseErrors.lhs: small utility to add a bit of extra value to parsec errors.
Parser.lhs: one of the main files - takes the output of the lexer and
produces asts.
ParserTests.lhs: lots of hunit tests for the parser.
PrettyPrinter.lhs: code to produce reparsable source from an ast.
Scope.lhs: data type to store mainly information from the pg catalog,
used during type checking, plus some utilities for this
datatype.
ScopeReader.lhs: utility to read a scope data type from a
database. Can access this function from
HsSqlSystem.lhs.
Tests.lhs: small file to pull together the tests from other test
suites, and make them into an executable.
TypeChecking.ag: the uuagc ATTR and SEM constructs used in type
checking, plus the smaller bits of type checking code
inline.
TypeCheckingH.lhs: larger bits of typechecking code and support types,
functions, moved from TypeChecking.ag to mitigate
some of the pain of developing using a
preprocessor.
TypeConversion.lhs: code to support the type conversion algorithms
used in postgresql, which are quite complicated.
In particular, the code used to match an exact
function given a name and a bunch of args.
TypeType.lhs: Some types used by the type checker, should live with
the ast nodes but are here to support splitting the code
out of the ag files for the same reason that
TypeCheckingH.lhs exists.
These files all have (hopefully) useful comments.
You'll find the jargon in this project easier to follow if you're
familiar with SQL and with the work of Date, Darwen, et al.. I plan to
add a glossary at some point, and to try to make the usage more
consistent.