用pegjs重写sql分割方法

This commit is contained in:
HSunboy 2018-07-06 16:22:57 +08:00
parent 01834251ee
commit a948c4562a
4 changed files with 105 additions and 40 deletions

View File

@ -4,6 +4,7 @@
1. 解析sql生成语法树(不支持CREATE等语句具体可以查看`core/astParser`文件)支持单条sql语句 1. 解析sql生成语法树(不支持CREATE等语句具体可以查看`core/astParser`文件)支持单条sql语句
2. 去除sql中的的注释(目前支持`--`,`/**/`类型注释) 2. 去除sql中的的注释(目前支持`--`,`/**/`类型注释)
3. sql分割,根据`;`将sql分割为数组
## 用法 ## 用法

View File

@ -113,7 +113,7 @@ module.exports = (function(){
result0 = parse_union_stmt(); result0 = parse_union_stmt();
if (result0 !== null) { if (result0 !== null) {
result0 = (function(offset, union_stmt) { result0 = (function(offset, union_stmt) {
return union_stmt; return {lines,text:union_stmt};
})(pos0, result0); })(pos0, result0);
} }
if (result0 === null) { if (result0 === null) {
@ -229,6 +229,24 @@ module.exports = (function(){
if (result2 === null) { if (result2 === null) {
pos = pos4; pos = pos4;
} }
if (result2 === null) {
pos4 = pos;
if (input.charCodeAt(pos) === 59) {
result2 = ";";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\";\"");
}
}
if (result2 !== null) {
result2 = (function(offset) {isSplit=true;return ";"})(pos4);
}
if (result2 === null) {
pos = pos4;
}
}
} }
if (result2 !== null) { if (result2 !== null) {
result1 = [result1, result2]; result1 = [result1, result2];
@ -241,7 +259,16 @@ module.exports = (function(){
pos = pos3; pos = pos3;
} }
if (result1 !== null) { if (result1 !== null) {
result1 = (function(offset, words, stmt) {return words.join("")+stmt})(pos2, result1[0], result1[1]); result1 = (function(offset, words, stmt) {
const text=words.join("")+stmt;
let index=Math.max(lines.length-1,0);
lines[index]=(lines[index]||'')+text;
if(isSplit){
isSplit=false;
lines.push('');
}
return text;
})(pos2, result1[0], result1[1]);
} }
if (result1 === null) { if (result1 === null) {
pos = pos2; pos = pos2;
@ -348,6 +375,24 @@ module.exports = (function(){
if (result2 === null) { if (result2 === null) {
pos = pos4; pos = pos4;
} }
if (result2 === null) {
pos4 = pos;
if (input.charCodeAt(pos) === 59) {
result2 = ";";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\";\"");
}
}
if (result2 !== null) {
result2 = (function(offset) {isSplit=true;return ";"})(pos4);
}
if (result2 === null) {
pos = pos4;
}
}
} }
if (result2 !== null) { if (result2 !== null) {
result1 = [result1, result2]; result1 = [result1, result2];
@ -360,7 +405,16 @@ module.exports = (function(){
pos = pos3; pos = pos3;
} }
if (result1 !== null) { if (result1 !== null) {
result1 = (function(offset, words, stmt) {return words.join("")+stmt})(pos2, result1[0], result1[1]); result1 = (function(offset, words, stmt) {
const text=words.join("")+stmt;
let index=Math.max(lines.length-1,0);
lines[index]=(lines[index]||'')+text;
if(isSplit){
isSplit=false;
lines.push('');
}
return text;
})(pos2, result1[0], result1[1]);
} }
if (result1 === null) { if (result1 === null) {
pos = pos2; pos = pos2;
@ -400,7 +454,12 @@ module.exports = (function(){
pos = pos1; pos = pos1;
} }
if (result0 !== null) { if (result0 !== null) {
result0 = (function(offset, stmt, other) {return stmt.join("")+other.join("")})(pos0, result0[0], result0[1]); result0 = (function(offset, stmt, other) {
const text=stmt.join("")+other.join("")
let index=Math.max(lines.length-1,0);
lines[index]=lines[index]+other.join("");
return text;
})(pos0, result0[0], result0[1]);
} }
if (result0 === null) { if (result0 === null) {
pos = pos0; pos = pos0;
@ -771,6 +830,17 @@ module.exports = (function(){
matchFailed("\"'\""); matchFailed("\"'\"");
} }
} }
if (result0 === null) {
if (input.charCodeAt(pos) === 59) {
result0 = ";";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\";\"");
}
}
}
} }
} }
} }
@ -911,6 +981,10 @@ module.exports = (function(){
} }
let lines=[];
let isSplit=false;
var result = parseFunctions[startRule](); var result = parseFunctions[startRule]();
/* /*

View File

@ -6,7 +6,7 @@ const commentFilter = require('../core/comment');
* @param {String} sql * @param {String} sql
*/ */
function filterComments(sql) { function filterComments(sql) {
return commentFilter.parse(sql) return commentFilter.parse(sql).text;
} }
/** /**
@ -22,36 +22,7 @@ function cleanSql(sql) {
* @param {String} sqlText * @param {String} sqlText
*/ */
function splitSql(sqlText) { function splitSql(sqlText) {
sqlText=cleanSql(sqlText); return commentFilter.parse(sqlText).lines
if (!sqlText) {
return sqlText;
}
sqlText = sqlText.trim();
if (!endsWith(sqlText, ';')) {
sqlText += ';';
}
let results = [];
let index = 0;
let tmpChar = null;
for (let i = 0; i < sqlText.length; i++) {
let char = sqlText[i];
if (char == "'" || char == '"') {
if (tmpChar == char) {
tmpChar = null;
} else {
tmpChar = char;
}
} else if (char == ';') {
if (tmpChar == null) {
results.push(sqlText.substring(index, i));
index = i + 1;
}
}
}
return results;
} }
exports.filterComments = filterComments; exports.filterComments = filterComments;

View File

@ -1,9 +1,14 @@
{
let lines=[];
let isSplit=false;
}
start start
= union_stmt:union_stmt = union_stmt:union_stmt
{ {
return union_stmt; return {lines,text:union_stmt};
} }
@ -11,10 +16,24 @@ union_stmt
=stmt: =stmt:
( (
words:(!kw_start word:. {return word})* words:(!kw_start word:. {return word})*
stmt:(comment:comment {return ''}/quote:quote {return quote}) stmt:(comment:comment {return ''}/quote:quote {return quote}/";" {isSplit=true;return ";"})
{return words.join("")+stmt} {
const text=words.join("")+stmt;
let index=Math.max(lines.length-1,0);
lines[index]=(lines[index]||'')+text;
if(isSplit){
isSplit=false;
lines.push('');
}
return text;
}
)* other:.* )* other:.*
{return stmt.join("")+other.join("")} {
const text=stmt.join("")+other.join("")
let index=Math.max(lines.length-1,0);
lines[index]=lines[index]+other.join("");
return text;
}
comment comment
=comment:(multiLine/singleLine) =comment:(multiLine/singleLine)
@ -57,7 +76,7 @@ quote
kw_start=KW_SINGLE_LINE_START/KW_MULTI_LINE_START/"\""/"'" kw_start=KW_SINGLE_LINE_START/KW_MULTI_LINE_START/"\""/"'"/";"
KW_SINGLE_LINE_START = "--"; KW_SINGLE_LINE_START = "--";