pg-query: Parse PostgreSQL DDL and DML: Haskell bindings for libpg_query

[ bsd3, data, database, library ] [ Propose Tags ] [ Report a vulnerability ]

pg-query offers Haskell bindings for libpg_query, which makes use of the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parse tree.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.0.1.0, 0.0.1.1
Change log CHANGELOG.md
Dependencies base (>=4.19.1.0 && <5.0), bytestring (>=0.12.1.0 && <1.0), lens (>=5.2.3 && <6.0), proto-lens (>=0.7.1.5 && <1.0), proto-lens-runtime (>=0.7.0.6 && <1.0), temporary (>=1.3 && <2.0), text (>=2.1.1 && <3.0), typed-process (>=0.2.11.1 && <1.0) [details]
License BSD-3-Clause
Author rhizomic
Maintainer rhzmc@proton.me
Category Database, Data
Home page https://git.sr.ht/~rhizomic/pg-query
Uploaded by rhizomic at 2024-11-18T11:55:39Z
Distributions
Downloads 21 total (21 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for pg-query-0.0.1.0

[back to package description]

pg-query

pg-query offers Haskell bindings for libpg_query, which makes use of the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parse tree.

Example

{-# LANGUAGE NoImplicitPrelude #-}

import Data.Either (Either (Left, Right))
import GHC.Base (error)
import GHC.IO (IO)
import PgQuery (parseSql)
import System.IO (print)

main :: IO ()
main = do
  eResult <- parseSql "select u.name, u.address from users u where u.id = $1"
  case eResult of
    Left err -> error err
    Right result -> print result

You should see output that looks like this (formatted for clarity):

{ version: 160001
  stmts {
    stmt {
      select_stmt {
        target_list {
          res_target {
            val {
              column_ref {
                fields {
                  string { sval: "u" }
                }
                fields {
                  string { sval: "name" }
                }
                location: 7
              }
            }
            location: 7
          }
        }
        target_list {
          res_target {
            val {
              column_ref {
                fields {
                  string { sval: "u" }
                }
                fields {
                  string { sval: "address" }
                }
                location: 15
              }
            }
            location: 15
          }
        }
        from_clause {
          range_var {
            relname: "users"
            inh: true
            relpersistence: "p"
            alias { aliasname: "u" }
            location: 30
          }
        }
        where_clause {
          a_expr {
            kind: AEXPR_OP
            name {
              string { sval: "=" }
            }
            lexpr {
              column_ref {
                fields {
                  string { sval: "u" }
                }
                fields {
                  string { sval: "id" }
                }
                location: 44
              }
            }
            rexpr {
              param_ref {
                number: 1
                location: 51
              }
            }
            location: 49
          }
        }
        limit_option: LIMIT_OPTION_DEFAULT
        op: SETOP_NONE
      }
    }
  }
}

Interacting with the parse tree is made possible through the use of proto-lens. Some examples can be seen in test/PgQuery/.

Installation

You'll need to ensure libpg_query is installed before trying to build this package.

Development

Building

make build

Testing

make test