squeal-postgresql-qq
This library provides a Template Haskell quasiquoter
parsing SQL as the quoted language and producing corresponding
squeal-postgresql
expressing. The goal is to provide an easier way to use the
squeal-postgresql
library, by eliminating (or at least reducing) the need for the user to
learn the squeal "DSL" and allowing her to write regular SQL instead.
Stability
I would give this package a 5 out of 10 for stability where 0 is
completely unstable and experimental and 10 is maybe like the aeson
package.
I think I've got a very large and usable segment of SQL supported but
of course there are unsupported features that are kind of important such
as common table expressions.
I don't foresee backwards incompatable changes being a problem because,
after all, the "interface" is mostly the SQL language, which is
stable. Most work will be about supporting new corners of SQL.
In terms of maintenance, I intend to be responsive to any bugs and to keep
up to date with the latest dependencies and GHC versions. In other words,
this is a maintained package, even if I experience a lull in adding new
supported SQL features.
Production usage
I would feel relatively comfortable using this in production. The
risk regarding stability/maintenance is pretty low.
If you have queries that are supported, great! They'll continue to be
supported. If you have a query that is not supported, you can always
fall back to crafting squeal expressions manually. (File an issue! I'll
prioritize real-world usage.)
If you have a supported SQL statement that you find you have to
modify in a way that makes it unsupported, you can always tell GHC to
-ddump-splices
and use the quasi-quoter generated squeal as a starting
point for your modifications.
How to use this library.
See the haddocks.
Most important features not currently implemented
- Prepared statement parameters
- See the haddock documentation for how to get haskell values into
your sql statements.
WITH
clauses (Common Table Expressions)
ON CONFLICT
clause
Other features is not currently implemented
(Generated by an LLM. Maybe not complete.)
TABLESAMPLE
clause
ONLY
keyword for table inheritance
WINDOW
clause and window functions (OVER
)
INTO
clause (SELECT ... INTO ...
)
LIKE
with ESCAPE
IN
with a subquery
OPERATOR()
syntax
- Parameter indirection (e.g.,
$1[i]
)
- Indirection on parenthesized expressions (e.g.,
(expr)[i]
)
- Aggregate
FILTER
clause
WITHIN GROUP
clause
DISTINCT
in function arguments
ORDER BY
in function arguments
- Function name indirection (e.g.,
schema.func
)
SETOF
type modifier
BIT
and BIT VARYING
types
INTERVAL
with qualifiers
- Types with precision/scale (
TIMESTAMP
, TIME
, FLOAT
, NUMERIC
, etc.)
- Qualified type names (e.g.,
schema.my_type
)
CURRENT_TIMESTAMP
with precision
- Multidimensional arrays with explicit bounds
ORDER BY USING
FOR READ ONLY
locking clause
- Advanced
GROUP BY
features (GROUPING SETS
, CUBE
, ROLLUP
)
- Multi-row
VALUES
clause
OVERRIDING
clause for identity columns
- Column indirection in
INSERT
target lists
WHERE CURRENT OF
for cursors
- Complex relation expressions in
UPDATE
or DELETE
targets
- Column indirection in
UPDATE SET
clauses