Skip to content

Commit

Permalink
fix: improve regular expression for issue gogf#4106
Browse files Browse the repository at this point in the history
  • Loading branch information
sanrentai committed Jan 9, 2025
1 parent 972734b commit f1e71b4
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 12 deletions.
8 changes: 2 additions & 6 deletions contrib/drivers/mssql/mssql_do_filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,8 @@ func (d *Driver) parseSql(toBeCommittedSql string) (string, error) {
}

func (d *Driver) handleSelectSqlReplacement(toBeCommittedSql string) (newSql string, err error) {
toBeCommittedSql, err = gdb.FormatMultiLineSqlToSingle(toBeCommittedSql)
if err != nil {
return "", err
}
// SELECT * FROM USER WHERE ID=1 LIMIT 1
match, err := gregex.MatchString(`^SELECT(.+?)LIMIT\s+1$`, toBeCommittedSql)
match, err := gregex.MatchString(`^SELECT([\s\S]+?)LIMIT\s+1$`, toBeCommittedSql)
if err != nil {
return "", err
}
Expand All @@ -102,7 +98,7 @@ func (d *Driver) handleSelectSqlReplacement(toBeCommittedSql string) (newSql str
}

// SELECT * FROM USER WHERE AGE>18 ORDER BY ID DESC LIMIT 100, 200
pattern := `(?i)SELECT(.+?)(ORDER BY.+?)?\s*LIMIT\s*(\d+)(?:\s*,\s*(\d+))?`
pattern := `(?i)SELECT([\s\S]+?)(ORDER BY[\s\S]+?)?\s*LIMIT\s*(\d+)(?:\s*,\s*(\d+))?`
if !gregex.IsMatchString(pattern, toBeCommittedSql) {
return toBeCommittedSql, nil
}
Expand Down
35 changes: 29 additions & 6 deletions contrib/drivers/mssql/mssql_do_filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,21 @@ func TestDriver_handleSelectSqlReplacement(t *testing.T) {
d := &Driver{}

// LIMIT 1
inputSql := `SELECT a,
b
FROM User WHERE ID = 1 LIMIT 1`
expectedSql := `SELECT TOP 1 a, b FROM User WHERE ID = 1`
inputSql := `SELECT * FROM User WHERE ID = 1 LIMIT 1`
expectedSql := `SELECT TOP 1 * FROM User WHERE ID = 1`
resultSql, err := d.handleSelectSqlReplacement(inputSql)
t.AssertNil(err)
t.Assert(resultSql, expectedSql)

// MultiLine LIMIT 1
inputSql = `SELECT *
FROM User WHERE ID = 1 LIMIT 1`
expectedSql = `SELECT TOP 1 *
FROM User WHERE ID = 1`
resultSql, err = d.handleSelectSqlReplacement(inputSql)
t.AssertNil(err)
t.Assert(resultSql, expectedSql)

// LIMIT query with offset and number of rows
inputSql = "SELECT * FROM User ORDER BY ID DESC LIMIT 100, 200"
expectedSql = "SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY ID DESC) as ROW_NUMBER__, * FROM (SELECT * FROM User) as InnerQuery ) as TMP_ WHERE TMP_.ROW_NUMBER__ > 100 AND TMP_.ROW_NUMBER__ <= 300"
Expand Down Expand Up @@ -102,8 +109,10 @@ FROM User WHERE ID = 1 LIMIT 1`
t.Assert(resultSql, expectedSql)

// Complex query with ORDER BY and LIMIT
inputSql = "SELECT name, age FROM User WHERE age > 18 ORDER BY age ASC LIMIT 10, 5"
expectedSql = "SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY age ASC) as ROW_NUMBER__, * FROM (SELECT name, age FROM User WHERE age > 18) as InnerQuery ) as TMP_ WHERE TMP_.ROW_NUMBER__ > 10 AND TMP_.ROW_NUMBER__ <= 15"
inputSql = `SELECT name,
age FROM User WHERE age > 18 ORDER BY age ASC LIMIT 10, 5`
expectedSql = `SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY age ASC) as ROW_NUMBER__, * FROM (SELECT name,
age FROM User WHERE age > 18) as InnerQuery ) as TMP_ WHERE TMP_.ROW_NUMBER__ > 10 AND TMP_.ROW_NUMBER__ <= 15`
resultSql, err = d.handleSelectSqlReplacement(inputSql)
t.AssertNil(err)
t.Assert(resultSql, expectedSql)
Expand All @@ -129,5 +138,19 @@ FROM User WHERE ID = 1 LIMIT 1`
t.AssertNil(err)
t.Assert(resultSql, expectedSql)

// MultiLine Queries with comment and complex ORDER BY and LIMIT
inputSql = `SELECT name, -- 名称
age -- 年龄
FROM User WHERE age > 18
ORDER BY age DESC,
name ASC LIMIT 20, 10`
expectedSql = `SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY age DESC,
name ASC) as ROW_NUMBER__, * FROM (SELECT name, -- 名称
age -- 年龄
FROM User WHERE age > 18) as InnerQuery ) as TMP_ WHERE TMP_.ROW_NUMBER__ > 20 AND TMP_.ROW_NUMBER__ <= 30`
resultSql, err = d.handleSelectSqlReplacement(inputSql)
t.AssertNil(err)
t.Assert(resultSql, expectedSql)

})
}

0 comments on commit f1e71b4

Please sign in to comment.