Skip to content

Commit 24069fb

Browse files
authored
Revert "gh-133390: Support SQL keyword completion for sqlite3 CLI (#133393)" temporarily (GH-135232)
This reverts commit 62b3d2d, which broke buildbots
1 parent 4615164 commit 24069fb

File tree

7 files changed

+6
-193
lines changed

7 files changed

+6
-193
lines changed

Doc/whatsnew/3.15.rst

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,6 @@ shelve
134134
(Contributed by Andrea Oliveri in :gh:`134004`.)
135135

136136

137-
sqlite3
138-
-------
139-
140-
* Support SQL keyword completion in the :mod:`sqlite3` command-line interface.
141-
(Contributed by Long Tan in :gh:`133393`.)
142-
143-
144137
ssl
145138
---
146139

Lib/sqlite3/__main__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
from textwrap import dedent
1313
from _colorize import get_theme, theme_no_color
1414

15-
from ._completer import completer
16-
1715

1816
def execute(c, sql, suppress_errors=True, theme=theme_no_color):
1917
"""Helper that wraps execution of SQL code.
@@ -138,9 +136,12 @@ def main(*args):
138136
execute(con, args.sql, suppress_errors=False, theme=theme)
139137
else:
140138
# No SQL provided; start the REPL.
141-
with completer():
142-
console = SqliteInteractiveConsole(con, use_color=True)
143-
console.interact(banner, exitmsg="")
139+
console = SqliteInteractiveConsole(con, use_color=True)
140+
try:
141+
import readline # noqa: F401
142+
except ImportError:
143+
pass
144+
console.interact(banner, exitmsg="")
144145
finally:
145146
con.close()
146147

Lib/sqlite3/_completer.py

Lines changed: 0 additions & 42 deletions
This file was deleted.

Lib/test/test_sqlite3/test_cli.py

Lines changed: 0 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
"""sqlite3 CLI tests."""
22
import sqlite3
3-
import sys
4-
import textwrap
53
import unittest
64

75
from sqlite3.__main__ import main as cli
8-
from test.support.import_helper import import_module
96
from test.support.os_helper import TESTFN, unlink
10-
from test.support.pty_helper import run_pty
117
from test.support import (
128
captured_stdout,
139
captured_stderr,
1410
captured_stdin,
1511
force_not_colorized_test_class,
16-
requires_subprocess,
1712
)
1813

1914

@@ -205,98 +200,5 @@ def test_color(self):
205200
self.assertIn('\x1b[1;35mOperationalError (SQLITE_ERROR)\x1b[0m: '
206201
'\x1b[35mnear "sel": syntax error\x1b[0m', err)
207202

208-
209-
@requires_subprocess()
210-
@force_not_colorized_test_class
211-
class Completion(unittest.TestCase):
212-
PS1 = "sqlite> "
213-
214-
@classmethod
215-
def setUpClass(cls):
216-
_sqlite3 = import_module("_sqlite3")
217-
if not hasattr(_sqlite3, "SQLITE_KEYWORDS"):
218-
raise unittest.SkipTest("unable to determine SQLite keywords")
219-
220-
readline = import_module("readline")
221-
if readline.backend == "editline":
222-
raise unittest.SkipTest("libedit readline is not supported")
223-
224-
def write_input(self, input_, env=None):
225-
script = textwrap.dedent("""
226-
import readline
227-
from sqlite3.__main__ import main
228-
229-
readline.parse_and_bind("set colored-completion-prefix off")
230-
main()
231-
""")
232-
return run_pty(script, input_, env)
233-
234-
def test_complete_sql_keywords(self):
235-
# List candidates starting with 'S', there should be multiple matches.
236-
input_ = b"S\t\tEL\t 1;\n.quit\n"
237-
output = self.write_input(input_)
238-
self.assertIn(b"SELECT", output)
239-
self.assertIn(b"SET", output)
240-
self.assertIn(b"SAVEPOINT", output)
241-
self.assertIn(b"(1,)", output)
242-
243-
# Keywords are completed in upper case for even lower case user input.
244-
input_ = b"sel\t\t 1;\n.quit\n"
245-
output = self.write_input(input_)
246-
self.assertIn(b"SELECT", output)
247-
self.assertIn(b"(1,)", output)
248-
249-
@unittest.skipIf(sys.platform.startswith("freebsd"),
250-
"Two actual tabs are inserted when there are no matching"
251-
" completions in the pseudo-terminal opened by run_pty()"
252-
" on FreeBSD")
253-
def test_complete_no_match(self):
254-
input_ = b"xyzzy\t\t\b\b\b\b\b\b\b.quit\n"
255-
# Set NO_COLOR to disable coloring for self.PS1.
256-
output = self.write_input(input_, env={"NO_COLOR": "1"})
257-
lines = output.decode().splitlines()
258-
indices = (
259-
i for i, line in enumerate(lines, 1)
260-
if line.startswith(f"{self.PS1}xyzzy")
261-
)
262-
line_num = next(indices, -1)
263-
self.assertNotEqual(line_num, -1)
264-
# Completions occupy lines, assert no extra lines when there is nothing
265-
# to complete.
266-
self.assertEqual(line_num, len(lines))
267-
268-
def test_complete_no_input(self):
269-
from _sqlite3 import SQLITE_KEYWORDS
270-
271-
script = textwrap.dedent("""
272-
import readline
273-
from sqlite3.__main__ import main
274-
275-
# Configure readline to ...:
276-
# - hide control sequences surrounding each candidate
277-
# - hide "Display all xxx possibilities? (y or n)"
278-
# - hide "--More--"
279-
# - show candidates one per line
280-
readline.parse_and_bind("set colored-completion-prefix off")
281-
readline.parse_and_bind("set colored-stats off")
282-
readline.parse_and_bind("set completion-query-items 0")
283-
readline.parse_and_bind("set page-completions off")
284-
readline.parse_and_bind("set completion-display-width 0")
285-
286-
main()
287-
""")
288-
input_ = b"\t\t.quit\n"
289-
output = run_pty(script, input_, env={"NO_COLOR": "1"})
290-
lines = output.decode().splitlines()
291-
indices = [
292-
i for i, line in enumerate(lines)
293-
if line.startswith(self.PS1)
294-
]
295-
self.assertEqual(len(indices), 2)
296-
start, end = indices
297-
candidates = [l.strip() for l in lines[start+1:end]]
298-
self.assertEqual(candidates, sorted(SQLITE_KEYWORDS))
299-
300-
301203
if __name__ == "__main__":
302204
unittest.main()

Misc/ACKS

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1868,7 +1868,6 @@ Neil Tallim
18681868
Geoff Talvola
18691869
Anish Tambe
18701870
Musashi Tamura
1871-
Long Tan
18721871
William Tanksley
18731872
Christian Tanzer
18741873
Steven Taschuk

Misc/NEWS.d/next/Library/2025-05-05-03-14-08.gh-issue-133390.AuTggn.rst

Lines changed: 0 additions & 1 deletion
This file was deleted.

Modules/_sqlite/module.c

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
#include "microprotocols.h"
3333
#include "row.h"
3434
#include "blob.h"
35-
#include "util.h"
3635

3736
#if SQLITE_VERSION_NUMBER < 3015002
3837
#error "SQLite 3.15.2 or higher required"
@@ -405,40 +404,6 @@ pysqlite_error_name(int rc)
405404
return NULL;
406405
}
407406

408-
static int
409-
add_keyword_tuple(PyObject *module)
410-
{
411-
#if SQLITE_VERSION_NUMBER >= 3024000
412-
int count = sqlite3_keyword_count();
413-
PyObject *keywords = PyTuple_New(count);
414-
if (keywords == NULL) {
415-
return -1;
416-
}
417-
for (int i = 0; i < count; i++) {
418-
const char *keyword;
419-
int size;
420-
int result = sqlite3_keyword_name(i, &keyword, &size);
421-
if (result != SQLITE_OK) {
422-
pysqlite_state *state = pysqlite_get_state(module);
423-
set_error_from_code(state, result);
424-
goto error;
425-
}
426-
PyObject *kwd = PyUnicode_FromStringAndSize(keyword, size);
427-
if (!kwd) {
428-
goto error;
429-
}
430-
PyTuple_SET_ITEM(keywords, i, kwd);
431-
}
432-
return PyModule_Add(module, "SQLITE_KEYWORDS", keywords);
433-
434-
error:
435-
Py_DECREF(keywords);
436-
return -1;
437-
#else
438-
return 0;
439-
#endif
440-
}
441-
442407
static int
443408
add_integer_constants(PyObject *module) {
444409
#define ADD_INT(ival) \
@@ -737,10 +702,6 @@ module_exec(PyObject *module)
737702
goto error;
738703
}
739704

740-
if (add_keyword_tuple(module) < 0) {
741-
goto error;
742-
}
743-
744705
if (PyModule_AddStringConstant(module, "sqlite_version", sqlite3_libversion())) {
745706
goto error;
746707
}

0 commit comments

Comments
 (0)