src/parsesql

The parsesql module implements a high performance SQL file parser. It parses PostgreSQL syntax and the SQL ANSI standard.

Unstable API.

Types

SqlLexer = object of BaseLexer
the parser object.
SqlNode = ref SqlNodeObj
an SQL abstract syntax tree node
SqlNodeKind = enum
  nkNone, nkIdent, nkQuotedIdent, nkStringLit, nkBitStringLit, nkHexStringLit,
  nkIntegerLit, nkNumericLit, nkPrimaryKey, nkForeignKey, nkNotNull, nkNull,
  nkStmtList, nkDot, nkDotDot, nkPrefix, nkInfix, nkCall, nkPrGroup,
  nkColumnReference, nkReferences, nkDefault, nkCheck, nkConstraint, nkUnique,
  nkIdentity, nkColumnDef,  ## name, datatype, constraints
  nkInsert, nkUpdate, nkDelete, nkSelect, nkSelectDistinct, nkSelectColumns,
  nkSelectPair, nkAsgn, nkFrom, nkFromItemPair, nkJoin, nkNaturalJoin, nkUsing,
  nkGroup, nkLimit, nkOffset, nkHaving, nkOrder, nkDesc, nkUnion, nkIntersect,
  nkExcept, nkColumnList, nkValueList, nkWhere, nkCreateTable,
  nkCreateTableIfNotExists, nkCreateType, nkCreateTypeIfNotExists,
  nkCreateIndex, nkCreateIndexIfNotExists, nkEnumDef
kind of SQL abstract syntax tree
SqlNodeObj = object
  case kind*: SqlNodeKind    ## kind of syntax tree
  of LiteralNodes:
    strVal*: string          ## AST leaf: the identifier, numeric literal
                             ## string literal, etc.
  else:
    sons*: seq[SqlNode]      ## the node's children
an SQL abstract syntax tree node
SqlParseError = object of ValueError
Invalid SQL encountered
SqlParser = object of SqlLexer
  ## Determines whether type parameters (e.g., sizes in types like VARCHAR(255)) are included in the SQL AST.
SQL parser object

Procs

proc `$`(n: SqlNode): string {....raises: [Exception], tags: [RootEffect],
                               forbids: [].}
an alias for renderSql.
proc `[]`(n: SqlNode; i: BackwardsIndex): SqlNode {....raises: [], tags: [],
    forbids: [].}
proc `[]`(n: SqlNode; i: int): SqlNode {....raises: [], tags: [], forbids: [].}
proc add(father, n: SqlNode) {....raises: [], tags: [], forbids: [].}
proc len(n: SqlNode): int {....raises: [], tags: [], forbids: [].}
proc newNode(k: SqlNodeKind): SqlNode {....raises: [], tags: [], forbids: [].}
proc newNode(k: SqlNodeKind; s: string): SqlNode {....raises: [], tags: [],
    forbids: [].}
proc newNode(k: SqlNodeKind; sons: seq[SqlNode]): SqlNode {....raises: [],
    tags: [], forbids: [].}
proc parseSql(input: Stream; filename: string; considerTypeParams = false): SqlNode {....raises: [
    IOError, OSError, IOError, OSError, ValueError, SqlParseError, Exception],
    tags: [ReadIOEffect, RootEffect, WriteIOEffect], forbids: [].}
parses the SQL from input into an AST and returns the AST. filename is only used for error messages. Syntax errors raise an SqlParseError exception.
proc parseSql(input: string; filename = ""; considerTypeParams = false): SqlNode {.
    ...raises: [IOError, OSError, ValueError, SqlParseError, Exception],
    tags: [ReadIOEffect, RootEffect, WriteIOEffect], forbids: [].}
parses the SQL from input into an AST and returns the AST. filename is only used for error messages. Syntax errors raise an SqlParseError exception.
proc renderSql(n: SqlNode; upperCase = false): string {....raises: [Exception],
    tags: [RootEffect], forbids: [].}
Converts an SQL abstract syntax tree to its string representation.
proc treeRepr(s: SqlNode): string {....raises: [], tags: [], forbids: [].}