Fix medium/low severity issues: script splitter, EXPLAIN, keyring, imports
execute_script() semicolon splitter (all drivers)
- Add BaseDriver._split_statements() that tracks single/double-quoted
strings and -- / /* */ comments so semicolons inside procedure bodies
are not treated as statement boundaries.
- Replace the naive sql.split(';') in all four drivers with this helper.
- MSSQL execute_script() also pre-splits on GO (case-insensitive, own
line) so scripts pasted from SSMS work correctly.
MSSQL EXPLAIN
- SET SHOWPLAN_TEXT ON/execute/SET SHOWPLAN_TEXT OFF must be separate
execute() calls; pyodbc rejects multiple statements in one call.
Hold self._lock for the entire sequence to keep session state atomic.
Keyring (connections.py)
- Log warnings (with traceback) on load/save failures instead of
silently returning "".
- save_password() now calls delete_password() when password is empty,
so clearing a saved password actually removes the old keyring entry
rather than leaving a stale one behind.
SQLite get_tables() O(N) lock acquisitions
- Run all COUNT(*) queries inside the same `with self._cur() as c:`
block, reducing N+1 lock acquisitions to 1.
Unused import: remove psycopg2.extras from postgres_driver.py.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -69,15 +69,14 @@ class SQLiteDriver(BaseDriver):
|
||||
ORDER BY name
|
||||
""")
|
||||
names = [r[0] for r in c.fetchall()]
|
||||
tables = []
|
||||
for name in names:
|
||||
try:
|
||||
with self._cur() as rc:
|
||||
rc.execute(f'SELECT COUNT(*) FROM "{name}"')
|
||||
row_count = rc.fetchone()[0]
|
||||
except Exception:
|
||||
row_count = 0
|
||||
tables.append(TableInfo(name=name, schema="main", row_count=row_count))
|
||||
tables = []
|
||||
for name in names:
|
||||
try:
|
||||
c.execute(f'SELECT COUNT(*) FROM "{name}"')
|
||||
row_count = c.fetchone()[0]
|
||||
except Exception:
|
||||
row_count = 0
|
||||
tables.append(TableInfo(name=name, schema="main", row_count=row_count))
|
||||
return tables
|
||||
|
||||
def get_views(self, database: str = "") -> list:
|
||||
@@ -164,8 +163,7 @@ class SQLiteDriver(BaseDriver):
|
||||
|
||||
def execute_script(self, sql: str) -> list:
|
||||
results = []
|
||||
stmts = [s.strip() for s in sql.split(';') if s.strip()]
|
||||
for stmt in stmts:
|
||||
for stmt in self._split_statements(sql):
|
||||
try:
|
||||
with self._cur() as c:
|
||||
c.execute(stmt)
|
||||
|
||||
Reference in New Issue
Block a user