Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

sql-parse

Package Overview
Dependencies
Maintainers
1
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

sql-parse - npm Package Compare versions

Comparing version 0.1.1 to 0.1.3

95

lib/lexter.js

@@ -1,27 +0,15 @@

// +------------------------------------------------------------------------+
// | 词法分析器类 |
// +------------------------------------------------------------------------+
// | Copygight (c) 2003 - 2011 Taobao.com. All Rights Reserved |
// +------------------------------------------------------------------------+
// | Author: yixuan.zzq <yixuan.zzq@taobao.com> |
// +------------------------------------------------------------------------+
// | 2011年10月 |
// +------------------------------------------------------------------------+
var Types = {
UNKNOWN : 0,
KEYWORD : 1,
NUMBER : 2,
STRING : 3,
FUNCTION : 4,
VARIABLE : 5,
PARAMS : 6,
OPERATOR : 7,
COMMAS : 8,
MEMORY : 9,
COMMENT : 99
};
var Types = {
UNKNOWN : 0, /**< 未知的 */
KEYWORD : 1, /**< 关键字 */
NUMBER : 2, /**< 数 字 */
STRING : 3, /**< 字符串 */
FUNCTION : 4, /**< 函数名 */
VARIABLE : 5, /**< 变 量 */
PARAMS : 6, /**< 绑定值 */
OPERATOR : 7, /**< 运算符 */
COMMAS : 8, /**< 标 点 */
MEMORY : 9,
COMMENT : 99, /**< 注 释 */
}
var Parser = function(query) {

@@ -34,3 +22,2 @@ var tks = [], pre = Types.UNKNOWN;

/* {{{ 注释 */
if ('/' == cur && '*' == query.charAt(i + 1)) {

@@ -55,8 +42,6 @@ tmp = '';

'text' : tmp.replace(/^[\*\s]+/, '').replace(/[\s\*]+$/, ''),
'type' : Types.COMMENT,
'type' : Types.COMMENT
};
}
/* }}} */
/* {{{ 字符串 */
else if ("'" == cur || '"' == cur || '`' == cur) {

@@ -69,8 +54,6 @@ tmp = '';

'text' : tmp,
'type' : ('`' == cur) ? Types.VARIABLE : Types.STRING,
'type' : ('`' == cur) ? Types.VARIABLE : Types.STRING
};
}
/* }}} */
/* {{{ 绑定变量 */
else if (':' == cur) {

@@ -88,8 +71,6 @@ tmp = cur;

'text' : tmp,
'type' : Types.PARAMS,
'type' : Types.PARAMS
};
}
/* }}} */
/* {{{ 函数名 */
else if (/^[a-z_]+$/i.test(cur)) {

@@ -110,6 +91,3 @@ tmp = cur;

}
/* }}} */
/* {{{ 数字 */
else if (('-' == cur && Types.VARIABLE != pre) || /\d+/.test(cur)) {

@@ -128,3 +106,3 @@ tmp = cur;

tks[tks.length] = {
'text' : '-', /**< 类型转换 */
'text' : '-',
'type' : Types.OPERATOR

@@ -134,3 +112,3 @@ };

tks[tks.length] = {
'text' : tmp - 0, /**< 类型转换 */
'text' : tmp - 0,
'type' : Types.NUMBER

@@ -140,14 +118,10 @@ };

}
/* }}} */
/* {{{ 标点 */
else if (/^[\,;\(\)]+$/.test(cur)) {
tks[tks.length] = {
'text' : cur,
'type' : Types.COMMAS,
'type' : Types.COMMAS
};
}
/* }}} */
/* {{{ 运算符 */
else if (/^(\+|\-|\*|\/|>|<|=|!)$/.test(cur)) {

@@ -166,6 +140,5 @@ tmp = cur;

'text' : tmp,
'type' : Types.OPERATOR,
'type' : Types.OPERATOR
};
}
/* }}} */

@@ -176,5 +149,4 @@ pre = (tks.length === 0) ? pre : tks[tks.length - 1].type;

return tks;
}
};
/* {{{ public construct() */
var Lexter = function(query) {

@@ -187,3 +159,3 @@ this.tokens = (query instanceof Array) ? query : Parser(query.toString());

"(" : 1,
")" : -1,
")" : -1
};

@@ -199,12 +171,8 @@

}
}
/* }}} */
};
/* {{{ public getAll() */
Lexter.prototype.getAll = function() {
return this.tokens;
}
/* }}} */
};
/* {{{ public indexOf() */
Lexter.prototype.indexOf = function(who, off) {

@@ -221,3 +189,2 @@ var pos = 0;

// xxx: 这里可以用二分法
for (var i = 0; i < this.blocks.length; ++i) {

@@ -236,6 +203,4 @@ pos = this.blocks[i];

return -1;
}
/* }}} */
};
/*{{{ static vars()*/
exports.vars = function(idx,tokens,isString){

@@ -293,6 +258,4 @@ var res;

return res;
}
/*}}}*/
};
/*{{{ static text()*/
exports.text = function(stack,comma){

@@ -323,4 +286,3 @@ var res = [];

return res;
}
/*}}}*/
};

@@ -330,3 +292,2 @@ exports.types = Types;

return new Lexter(query);
}
};

@@ -1,15 +0,8 @@

/*
作者:yixuan
介绍:sql语句(delete语句)解析类
邮箱:yixuan.zzq@taobao.com
*/
var Lexter = require('../lexter.js');
var Tool = require('../sqlParseTool.js');
/*{{{ divideTokens()*/
/**
* 分解sql语句
* @param {Array} tokens 需要分解的tokens
* @return {Object} 分解结果
* Devide tokens
* @param {Array} tokens
* @return {Object}
*/

@@ -37,20 +30,15 @@ function divideTokens(tokens){

return parts;
}
/*}}}*/
/*{{{ parseSource()*/
/**
* 解析Source字段
* @param {Array} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse source
* @param {Array} tokens
* @return {Object}
*/
function parseSource(tokens){
function parseSource(tokens) {
var res = {};
if(!(/^delete$/i.test(tokens.shift().text))){
if (!(/^delete$/i.test(tokens.shift().text))) {
throw new Error("no keyword 'delete'");
}
if(!(/^from$/i.test(tokens.shift().text))){
if (!(/^from$/i.test(tokens.shift().text))) {
throw new Error("no keyword 'from'");

@@ -64,14 +52,12 @@ }

type: get["type"],
source : get["source"],
}
source: get["source"],
};
}
}
exports.parseSource = parseSource;
/*}}}*/
/*{{{ parseWhere()*/
/**
* 解析Where字段
* @param {Array} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse 'where'
* @param {Array} tokens
* @return {Object}
*/

@@ -89,15 +75,12 @@ function parseWhere(tokens){

return res;
}
}
exports.parseWhere = parseWhere;
/*}}}*/
/*{{{ createObj()*/
/**
* 创建sql对应的sql对象,可以选择解析部分
* @param {String} sql 需要分析的sql
* @return {Object} 结果对象
* Create SQL Obj
* @param {String} sql
* @return {Object}
*/
exports.createObj = function(sql){
var res = {};

@@ -114,3 +97,2 @@

return res;
}
/*}}}*/
};

@@ -1,15 +0,8 @@

/*
作者:yixuan
介绍:sql语句(insert语句)解析类
邮箱:yixuan.zzq@taobao.com
*/
var Lexter = require('../lexter.js');
var Tool = require('../sqlParseTool.js');
/*{{{ divideTokens()*/
/**
* 分解sql语句
* @param {Array} tokens 需要分解的tokens
* @return {Object} 分解结果
* Divide tokens
* @param {Array} tokens
* @return {Object}
*/

@@ -37,16 +30,11 @@ function divideTokens(tokens){

return parts;
}
/*}}}*/
/*{{{ parseSource()*/
/**
* 把tokens当做sql中的table字段解析
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse source
* @param {String} tokens
* @return {Object}
*/
function parseSource(tokens){
var res = {};
if(!(/^insert$/i.test(tokens.shift().text))){throw new Error("no keyword 'insert'");}

@@ -104,13 +92,10 @@ if(!(/^into$/i.test(tokens.shift().text))){throw new Error("no keyword 'into'");}

}
}
exports.parseSource = parseSource;
/*}}}*/
/*{{{ parseValues()*/
/**
* 把tokens当做sql中的value字段解析
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse value
* @param {String} tokens
* @return {Object}
*/

@@ -144,8 +129,8 @@ function parseValues(tokens){

var get = Tool.removeParenthese(tokens.slice(pre));
var getText = Tool.removeParenthese(tokens.slice(pre));
var tmp = [];
for(var i = 0;i < get.length; i++){
if(get[i].text === ","){continue;}
tmp.push(get[i]);
for(var i = 0;i < getText.length; i++){
if(getText[i].text === ","){continue;}
tmp.push(getText[i]);
}

@@ -155,12 +140,9 @@ res.push(tmp);

return res;
}
exports.parseValues = parseValues;
/*}}}*/
/*{{{ createObj()*/
/**
* 创建sql对应的sql对象,可以选择解析部分
* @param {String} sql 需要分析的sql
* @return {Object} 结果对象
* Create SQL object
* @param {String} sql
* @return {Object}
*/

@@ -180,5 +162,2 @@ exports.createObj = function(sql){

return res;
}
/*}}}*/
};

@@ -1,7 +0,1 @@

/*
作者:yixuan
介绍:sql语句(select语句)解析类
邮箱:yixuan.zzq@taobao.com
*/
var Lexter = require('../lexter.js');

@@ -11,7 +5,6 @@ var Tool = require('../sqlParseTool.js');

/*{{{ divideUnion()*/
/**
* 根据union划分tokens
* @param {String} tokens sql解析出的tokens
* @return {Array} 解析结果数组
* Divide union
* @param {String} tokens sql
* @return {Array}
*/

@@ -36,11 +29,8 @@ function divideUnion(tokens){

return res;
}
/*}}}*/
/*{{{ divideTokens()*/
/**
* 将所有token分解为几个组成部分(每部分都是token数组)
* @param {Array} tokens sql分解为的tokens
* @return {Object} 分解结果
* Divide tokens
* @param {Array} tokens sql
* @return {Object}
*/

@@ -50,3 +40,3 @@ function divideTokens(tokens){

var posArr = [];
var Map = {}
var Map = {};
var pre = 0;

@@ -99,3 +89,2 @@ var lev = 0;

}
}

@@ -110,10 +99,7 @@

}
/*}}}*/
/*{{{ parseColumn()*/
/**
* 将tokens当做sql中column字段分解
* (介于select和from中间的部分)
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse sql column
* @param {String} tokens
* @return {Object}
*/

@@ -137,5 +123,3 @@ function parseColumn(tokens){

}
/*}}}*/
/*{{{ 判断每个column名字并赋值 */
var colName;

@@ -176,18 +160,13 @@ var tmpVar;

}
/*}}}*/
}
return res;
}
exports.parseColumn = parseColumn;
/*}}}*/
/*{{{ parseSource()*/
/**
* 将tokens当做sql中source字段分解
* (介于from和join中间的部分)
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse source
* (from join)
* @param {String} tokens
* @return {Object}
*/

@@ -210,13 +189,10 @@ function parseSource(tokens){

return res;
}
}
exports.parseSource = parseSource;
/*}}}*/
/*{{{ parseJoinmap()*/
/**
* 将tokens当做sql中join字段分解
* (介于join和where中间的部分)
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse Join map
* @param {String} tokens
* @return {Object}
*/

@@ -243,7 +219,5 @@ function parseJoinmap(tokens){

//如果一个部分的结尾念着下面字段,则这个字段是属于后面一个JOIN的一部分
forNext = (/^(LEFT|RIGHT|OUTER|INNER)$/i.test(tmp[tmp.length-1].text)) ? tmp.pop().text : undefined;
var onPos = undefined;
/*{{{ 分析源和源类型*/
for(var j = 0;j < tmp.length; j++){

@@ -260,5 +234,3 @@ if(/^on$/i.test(tmp[j].text)){

}
/*}}}*/
/*{{{ 分析ON后面的条件元素*/
if(onPos === undefined){

@@ -279,3 +251,2 @@ throw new Error("no keyword 'on' in join part");

}
/*}}}*/

@@ -289,15 +260,11 @@ res[name] = {

}
return res;
}
}
exports.parseJoinmap = parseJoinmap
/*}}}*/
/*{{{ parseWhere()*/
/**
* 将tokens当做sql中where字段分解
* (介于where和group by中间的部分)
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse where
* @param {String} tokens
* @return {Object}
*/

@@ -312,2 +279,3 @@ function parseWhere(tokens){

parts.forEach(function(part){
console.log(part);
res.push(Tool.parseOneWhere(part));

@@ -317,13 +285,10 @@ });

return res;
}
}
exports.parseWhere = parseWhere;
/*}}}*/
/*{{{ parseGroupby()*/
/**
* 将tokens当做sql中group by字段分解
* (介于group by和order by中间的部分)
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse group by
* @param {String} tokens
* @return {Object}
*/

@@ -343,13 +308,10 @@ function parseGroupby(tokens){

return res;
}
}
exports.parseGroupby = parseGroupby;
/*}}}*/
/*{{{ parseOrderby()*/
/**
* 将tokens当做sql中order by字段分解
* (介于order by和limit中间的部分)
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse order by
* @param {String} tokens
* @return {Object}
*/

@@ -381,13 +343,9 @@ function parseOrderby(tokens){

return res;
}
exports.parseOrderby = parseOrderby;
/*}}}*/
/*{{{ parseLimit()*/
/**
* 将tokens当做sql中limit字段分解
* (limit部分)
* @param {String} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse limit
* @param {String} tokens
* @return {Object}
*/

@@ -414,12 +372,10 @@ function parseLimit(tokens){

return res;
}
}
exports.parseLimit = parseLimit;
/*}}}*/
/*{{{ createObj()*/
/**
* 创建sql对应的sql对象,可以选择解析部分
* @param {String} sql 需要分析的sql
* @return {Object} 结果对象
* Create SQL object
* @param {String} sql
* @return {Object}
*/

@@ -451,5 +407,2 @@ exports.createObj= function(sql){

return result;
}
/*}}}*/
};

@@ -1,15 +0,8 @@

/*
作者:yixuan
介绍:sql语句(update语句)解析类
邮箱:yixuan.zzq@taobao.com
*/
var Lexter = require('../lexter.js');
var Tool = require('../sqlParseTool.js');
/*{{{ divideTokens()*/
/**
* 分解Tokens
* @param {Array} tokens 需要分解的tokens
* @return {Object} 分解结果
* Divide tokens
* @param {Array} tokens
* @return {Object}
*/

@@ -47,14 +40,9 @@ function divideTokens(tokens){

}
/*}}}*/
/*{{{ parseSource()*/
/**
* 把tokens当做sql中的table字段解析
* @param {Array} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse source
* @param {Array} tokens
* @return {Object}
*/
function parseSource(tokens){
var res = {};
if(!(/^update$/i.test(tokens.shift().text))){i

@@ -71,12 +59,10 @@ throw new Error("no keyword 'update'");

}
}
}
exports.parseSource = parseSource;
/*}}}*/
/*{{{ parseColumn()*/
/**
* 把tokens当做sql中的set字段解析
* @param {Array} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse column
* @param {Array} tokens
* @return {Object}
*/

@@ -96,10 +82,9 @@ function parseColumn(tokens){

}
exports.parseColumn = parseColumn;
/*}}}*/
/*{{{ parseWhere()*/
/**
* 把tokens当做sql中的where字段解析
* @param {Array} tokens 需要解析的tokens
* @return {Object} 解析结果
* Parse where
* @param {Array} tokens
* @return {Object}
*/

@@ -118,12 +103,10 @@ function parseWhere(tokens){

return res;
}
}
exports.parseWhere = parseWhere;
/*}}}*/
/*{{{ createObj()*/
/**
* 创建sql对应的sql对象,可以选择解析部分
* @param {String} sql 需要分析的sql
* @return {Object} 结果对象
* Create object
* @param {String} sql
* @return {Object}
*/

@@ -144,4 +127,2 @@ exports.createObj = function(sql){

return res;
}
/*}}}*/
};

@@ -8,3 +8,3 @@ var Tool = require(__dirname + '/sqlParseTool.js');

require('fs').readdirSync(__dirname + '/parsers').forEach(function(file) {
var match = file.match(/^(\w+)\.js$/);
var match = file.match(/^(\w+)\.js$/);
if (!match) {

@@ -16,16 +16,19 @@ return;

}
init();
exports.parse = function(sql) {
var parse = function(sql) {
sql = sql.trim();
var who = sql.substr(0,sql.indexOf(' ')).toLowerCase();
if(parsers[who] === undefined){
throw new Error("Unsupport sentence");
throw new Error("Unsupported sentence");
}
return parsers[who].createObj(sql);
}
};
exports.parse = parse;
exports.RELATE = Tool.RELATE;
exports.JOIN = Tool.JOIN;
exports.ORDER = Tool.ORDER;
exports.types = Lexter.types;
exports.types = Lexter.types;
var Lexter = require('./lexter.js');
/*{{{ RELATE*/
var RELATE = {

@@ -18,16 +17,14 @@ "=": 1,

"is null": 20,
"not null": 21,
"not null": 21
};
exports.RELATE = RELATE;
/*}}}*/
/*{{{ ORDER*/
var ORDER = {
'ASC' : 1,
'DESC' : 2
}
};
exports.ORDER = ORDER;
/*}}}*/
/*{{{ JOIN*/
var JOIN = {

@@ -37,10 +34,9 @@ 'INNER JOIN' : 1,

'LEFT JOIN' : 3,
'RIGHT JOIN' : 4,
}
'RIGHT JOIN' : 4
};
exports.JOIN = JOIN;
/*}}}*/
/*{{{ removeParenthese()*/
/**
* 过滤最外面的括号对
* Remove parent
* @param {Array} tokens

@@ -65,10 +61,9 @@ * @return {Array}

}
exports.removeParenthese = removeParenthese;
/*}}}*/
/*{{{ merge()*/
/**
* 拼合一组token的text字段
* @param {Array} parts token组成的数组
* @param {String} sep 连接分隔符
* Merge
* @param {Array} parts token
* @param {String} sep
* @return {String}

@@ -84,13 +79,12 @@ */

}
exports.merge = merge;
/*}}}*/
/*{{{ pickUp()*/
/**
* 将str中的内容按照分隔符提取成数组,类似Array里的split
* @param {String} str 待分割的字符串
* @param {String} sep 分隔符
* Pick up
* @param {String} tokens
* @param {String} sep
* @return {Array}
*/
function pickUp(tokens,sep){
function pickUp(tokens, sep){
tokens.push({text:sep});

@@ -115,11 +109,10 @@ var res = [];

}
exports.pickUp = pickUp;
/*}}}*/
/*{{{ getHint()*/
/**
* 获得hint信息
* @param {array} part 可能包含hint的部分
* @param {int} pos hint出现的位置
* @return {obj||undefined} 返回信息对象或者Undefined
* Hint
* @param {Array} part
* @param {int} pos
* @return {obj||undefined}
*/

@@ -140,10 +133,9 @@ function getHint(part,pos){

}
exports.getHint = getHint;
/*}}}*/
/*{{{ parseOneSource()*/
/**
* 解析一个源
* @param {Object} part 由几个token表示的一个源
* @return {Object} 这个源的解析结果
* Parse one source
* @param {Object} part
* @return {Object}
*/

@@ -156,7 +148,4 @@ function parseOneSource(part){

var idx = part[0].text.indexOf(".");
//确定源种类
type = part[0].text.substr(0,idx);
/*{{{ 确定具体源*/
//例如from字段跟的是(select * from table)这样的子表
if(idx === -1){

@@ -178,3 +167,2 @@ if(part[0].text === "("){

}
//例如sql.()这样的源
}else if(idx === part[0].text.length - 1){

@@ -194,3 +182,2 @@ if(part[1].text !== "("){throw new Error("something wrong in 'source' part");}

if(j === part.length){throw new Error("lack parentheses in 'source' part");}
//列入db.table这样的源
}else{

@@ -200,5 +187,3 @@ source = part[0].text.substr(idx+1);

}
/*}}}*/
/*{{{ 确定源名字,并设置返回对象*/
if(part.length === 0){

@@ -218,15 +203,12 @@ res = {

}
/*}}}*/
return res;
}
}
exports.parseOneSource = parseOneSource;
/*}}}*/
/*{{{ parseOneWhere()*/
/**
* 解析一个条件
* @param {Object} part 由几个token表示的一个条件
* @return {Object} 这个条件的解析结果
* Parse One Where
* @param {Object} part
* @return {Object}
*/

@@ -237,3 +219,2 @@ function parseOneWhere(part){

res["column"] = part[0];
//如果关系是操作符
if(relate.type === Lexter.types.OPERATOR){

@@ -245,3 +226,2 @@ if(RELATE[relate.text] === undefined){

res["values"] = group(part.slice(2),',');
//如果关系是类似 in , like 这样的关键字
}else{

@@ -283,10 +263,9 @@ if(relate.text.toLowerCase() === "between"){

}
exports.parseOneWhere = parseOneWhere;
/*}}}*/
/*{{{ group */
/**
* token分组
* @param {array} part token组
* @param {string} sep 分隔符
* Group
* @param {array} part token
* @param {string} sep
* @param {}

@@ -313,4 +292,2 @@ */

return res;
}
/*}}}*/
}
{
"name": "sql-parse",
"version": "0.1.1",
"version": "0.1.3",
"author": {

@@ -26,2 +26,2 @@ "name": "Andriy Ermolenko",

"license": "MIT"
}
}
# sql-parse
A tool for parsing SQL queries.
### A tool for parsing SQL queries.
[![Build Status](https://travis-ci.org/invercity/sql-parse.svg)](https://travis-ci.org/invercity/sql-parse)
[![NPM Version][npm-image]][npm-url]
# Installing
## Installing

@@ -9,3 +11,3 @@ ```bash

```
# Usage
## Usage

@@ -16,3 +18,3 @@ ```javascript

```
# Testing
## Testing

@@ -22,3 +24,6 @@ * make test

# License
## License
### MIT
[npm-image]: https://img.shields.io/npm/v/sql-parse.svg
[npm-url]: https://npmjs.org/package/sql-parse

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc