Skip to content

Commit

Permalink
解决MySQL查询limit改写时,SQL语句中更小的limit值被覆盖的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
hhyo committed Jul 27, 2019
1 parent 6077f53 commit a345f51
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 0 deletions.
4 changes: 4 additions & 0 deletions sql/engines/mysql.py
Expand Up @@ -150,8 +150,12 @@ def filter_sql(self, sql='', limit_num=0):
# LIMIT N, N 或LIMIT N OFFSET N
limit_offset = re.compile(r'limit([\s]*\d+[\s]*)(,|offset)([\s]*\d+[\s]*)$', re.I)
if limit_n.search(sql):
sql_limit = limit_n.search(sql).group(1)
limit_num = min(int(limit_num), int(sql_limit))
sql = limit_n.sub(f'limit {limit_num};', sql)
elif limit_offset.search(sql):
sql_limit = limit_offset.search(sql).group(3)
limit_num = min(int(limit_num), int(sql_limit))
sql = limit_offset.sub(f'limit {limit_num};', sql)
else:
sql = f'{sql} limit {limit_num};'
Expand Down
6 changes: 6 additions & 0 deletions sql/engines/tests.py
Expand Up @@ -343,6 +343,12 @@ def test_filter_sql_with_limit(self):
check_result = new_engine.filter_sql(sql=sql_without_limit, limit_num=1)
self.assertEqual(check_result, 'select user from usertable limit 1;')

def test_filter_sql_with_limit_min(self):
new_engine = MysqlEngine(instance=self.ins1)
sql_without_limit = 'select user from usertable limit 10'
check_result = new_engine.filter_sql(sql=sql_without_limit, limit_num=100)
self.assertEqual(check_result, 'select user from usertable limit 10;')

def test_filter_sql_with_limit_offset(self):
new_engine = MysqlEngine(instance=self.ins1)
sql_without_limit = 'select user from usertable limit 10 offset 100'
Expand Down

0 comments on commit a345f51

Please sign in to comment.