MyNixOS website logo
Description

Parse PostgreSQL DDL and DML: Haskell bindings for libpg_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.

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
Metadata

Version

0.0.1.1

Platforms (77)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-windows
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows