npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@careteam/sql-parser

v0.0.5

Published

Lexer and Parser for SQL Syntax

Downloads

14

Readme

SQL Parser

fork from https://github.com/mistic100/sql-parser

SQL Parser is a lexer, grammar and parser for SQL written in JS. Currently it is only capable of parsing fairly basic SELECT queries but full SQL support will hopefully come in time. See the specs for examples of currently supported queries.

Installation

The package is distributed on NPM and can be installed with...

npm install @tencent/sql-parser

To build from source you'll need to run the following from the root of the project...

npm install
npm run compile

Tests are written using Mocha and can be run with...

npm test

Lexer

The lexer takes a SQL query string as input and returns a stream of tokens in the format

['NAME', 'value', lineNumber]

Here is a simple example...

lexer.tokenize('select * from my_table')

[
  ['SELECT','select',1],
  ['STAR','*',1],
  ['FROM','from',1],
  ['LITERAL','my_table',1]
]

The tokenized output is in a format compatible with JISON.

Parser

The parser only currently supports SELECT queries but is able to produce a Select object with properties for where, group, order, limit. See lib/nodes.coffee for more info of the returned object structure. Calling .toString() on a Select object should give you back a well formatted version of the original SQL input.

tokens = lexer.tokenize("select * from my_table where foo = 'bar'")
parser.parse(tokens).toString()

SELECT *
  FROM `my_table`
  WHERE `foo` = 'bar'

区别

query parse 添加 group 字段区分是否由 () 包裹

官方单个 query parse 格式为:

{
    "conditions": "and / or / = /...",
    "left": {},
    "right: {}
}

改为:

{
    "conditions": "and / or / = /...",
    "left": {},
    "right: {},
    "group: true/false ()括起来则 group 为 true
}

如:

select * from user where  name = b and (c = 1 or c = 3)

官方结果:

{
"conditions": {
  "operation": "and",
  "left": {
    "operation": "=",
    "left": {
      "value": "name",
      "value2": null,
      "nested": false,
      "values": [
        "name"
      ]
    },
    "right": {
      "value": "b",
      "value2": null,
      "nested": false,
      "values": [
        "b"
      ]
    }
  },
  "right": {
    "operation": "or",
    "left": {
      "operation": "=",
      "left": {
        "value": "c",
        "value2": null,
        "nested": false,
        "values": [
          "c"
        ]
      },
      "right": {
        "value": 1
      }
    },
    "right": {
      "operation": "=",
      "left": {
        "value": "c",
        "value2": null,
        "nested": false,
        "values": [
          "c"
        ]
      },
      "right": {
        "value": 3
      }
    }
  }
}

修改后结果:

{
"conditions": {
  "operation": "and",
  "left": {
    "operation": "=",
    "left": {
      "value": "name",
      "value2": null,
      "nested": false,
      "values": [
        "name"
      ]
    },
    "group": false,
    "right": {
      "value": "b",
      "value2": null,
      "nested": false,
      "values": [
        "b"
      ]
    }
  },
  "group": false,
  "right": {
    "operation": "or",
    "left": {
      "operation": "=",
      "left": {
        "value": "c",
        "value2": null,
        "nested": false,
        "values": [
          "c"
        ]
      },
      "group": false,
      "right": {
        "value": 1
      }
    },
    "group": true,
    "right": {
      "operation": "=",
      "left": {
        "value": "c",
        "value2": null,
        "nested": false,
        "values": [
          "c"
        ]
      },
      "group": false,
      "right": {
        "value": 3
      }
    }
  }
}

query 参数格式支持多种

@xxx:[type] $xxx:[type] #{xxx}:[type]

type 可为:number, float, string, date, boolean

select * from table where a = @abc:number;
select * from table where a = @abc;
select * from table where a = ${abc};
select * from table where a = ${abc}:number;


parsed 内容:
{
  "value": "abc",
  "origin": "${abc}:number",  // :number 非必须
  "type": "number",         // 有 type 时才有这个字段
  "parameter": true
}