mirror of
https://gitee.com/dromara/mayfly-go
synced 2026-01-02 20:56:36 +08:00
fix: sql切割转义等问题处理
This commit is contained in:
@@ -50,7 +50,7 @@ func (v *MysqlVisitor) VisitEmptyStatement_(ctx *mysqlparser.EmptyStatement_Cont
|
||||
}
|
||||
|
||||
func (v *MysqlVisitor) VisitDdlStatement(ctx *mysqlparser.DdlStatementContext) interface{} {
|
||||
ddlStmt := sqlstmt.DdlStmt{}
|
||||
ddlStmt := &sqlstmt.DdlStmt{}
|
||||
ddlStmt.Node = sqlstmt.NewNode(ctx.GetParser(), ctx)
|
||||
return ddlStmt
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ func SQLSplit(r io.Reader, callback SQLCallback) error {
|
||||
// SQLCallback 是解析出一条 SQL 语句后的回调函数
|
||||
type SQLCallback func(sql string) error
|
||||
|
||||
// parseSQL 主要由阿里通义灵码提供
|
||||
func parseSQL(r io.Reader, callback SQLCallback) error {
|
||||
reader := bufio.NewReaderSize(r, 512*1024)
|
||||
buffer := new(bytes.Buffer) // 使用 bytes.Buffer 来处理数据
|
||||
@@ -34,6 +35,7 @@ func parseSQL(r io.Reader, callback SQLCallback) error {
|
||||
var inMultiLineComment bool
|
||||
var inSingleLineComment bool
|
||||
var stringDelimiter rune
|
||||
var escapeNextChar bool // 用于处理转义符
|
||||
|
||||
for {
|
||||
// 读取数据到缓冲区
|
||||
@@ -68,10 +70,18 @@ func parseSQL(r io.Reader, callback SQLCallback) error {
|
||||
}
|
||||
buffer.Next(size)
|
||||
case inString:
|
||||
if r == stringDelimiter {
|
||||
if escapeNextChar {
|
||||
currentStatement.WriteRune(r)
|
||||
escapeNextChar = false
|
||||
} else if r == '\\' {
|
||||
escapeNextChar = true
|
||||
currentStatement.WriteRune(r)
|
||||
} else if r == stringDelimiter {
|
||||
inString = false
|
||||
currentStatement.WriteRune(r)
|
||||
} else {
|
||||
currentStatement.WriteRune(r)
|
||||
}
|
||||
currentStatement.WriteRune(r)
|
||||
buffer.Next(size)
|
||||
case r == '/' && buffer.Len() >= 2 && buffer.Bytes()[1] == '*':
|
||||
inMultiLineComment = true
|
||||
|
||||
@@ -12,7 +12,7 @@ func TestSQLSplit(t *testing.T) {
|
||||
/*删除*/
|
||||
DELETE FROM t_sys_log
|
||||
WHERE
|
||||
id IN (59) and name='哈哈哈';delete form tsyslog;
|
||||
id IN (59) and name='哈哈哈' and name2="hahah;呵呵呵;";delete form tsyslog;
|
||||
-- alter sql语句
|
||||
ALTER TABLE mayfly_go.t_sys_log
|
||||
DROP COLUMN delete_time;
|
||||
@@ -22,8 +22,7 @@ DROP COLUMN delete_time;
|
||||
INSERT INTO t_sys_log VALUES(15, 2, '用户登录', NULL, '⑴ 成孔;⑵ 砼浇筑;⑶ 桩头掏渣;⑷ 桩基检测配合;
|
||||
⑸ 其他工作;⑹ 甲方现场要求乙方完成的其它临时工作。', '{"ip":"::1 ","username":"test_user"}', 'errCode: 401, errMsg: 您的密码安全等级较低,请修改后重新登录;\n信息嘻嘻嘻', '-', 0, '2024-04-23 20:00:35', 0, NULL, '');
|
||||
`
|
||||
// fmt.Println(allsql)
|
||||
// allsql2 := "select * from t_sys_log"
|
||||
|
||||
err := SQLSplit(strings.NewReader(allsql), func(sql string) error {
|
||||
// if strings.Contains(sql, "INSERT") {
|
||||
// return fmt.Errorf("不能存在INSERT语句")
|
||||
|
||||
Reference in New Issue
Block a user