Skip to content

Commit 4eebbd9

Browse files
committed
Read keyword names dynamically
1 parent 90a86cf commit 4eebbd9

File tree

1 file changed

+27
-38
lines changed

1 file changed

+27
-38
lines changed

Modules/_sqlite/module.c

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

3637
#if SQLITE_VERSION_NUMBER < 3015002
3738
#error "SQLite 3.15.2 or higher required"
@@ -405,51 +406,39 @@ pysqlite_error_name(int rc)
405406
}
406407

407408
static int
408-
add_sequence_constants(PyObject *module)
409+
add_keyword_tuple(PyObject *module)
409410
{
410-
PyObject *kwd;
411-
const char *_keywords[] = {
412-
"ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ALWAYS", "ANALYZE",
413-
"AND", "AS", "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN",
414-
"BETWEEN", "BY", "CASCADE", "CASE", "CAST", "CHECK", "COLLATE",
415-
"COLUMN", "COMMIT", "CONFLICT", "CONSTRAINT", "CREATE", "CROSS",
416-
"CURRENT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP",
417-
"DATABASE", "DEFAULT", "DEFERRABLE", "DEFERRED", "DELETE", "DESC",
418-
"DETACH", "DISTINCT", "DO", "DROP", "EACH", "ELSE", "END", "ESCAPE",
419-
"EXCEPT", "EXCLUDE", "EXCLUSIVE", "EXISTS", "EXPLAIN", "FAIL",
420-
"FILTER", "FIRST", "FOLLOWING", "FOR", "FOREIGN", "FROM", "FULL",
421-
"GENERATED", "GLOB", "GROUP", "GROUPS", "HAVING", "IF", "IGNORE",
422-
"IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER", "INSERT",
423-
"INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY", "LAST",
424-
"LEFT", "LIKE", "LIMIT", "MATCH", "MATERIALIZED", "NATURAL", "NO",
425-
"NOT", "NOTHING", "NOTNULL", "NULL", "NULLS", "OF", "OFFSET", "ON",
426-
"OR", "ORDER", "OTHERS", "OUTER", "OVER", "PARTITION", "PLAN",
427-
"PRAGMA", "PRECEDING", "PRIMARY", "QUERY", "RAISE", "RANGE",
428-
"RECURSIVE", "REFERENCES", "REGEXP", "REINDEX", "RELEASE", "RENAME",
429-
"REPLACE", "RESTRICT", "RETURNING", "RIGHT", "ROLLBACK", "ROW", "ROWS",
430-
"SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP", "TEMPORARY", "THEN",
431-
"TIES", "TO", "TRANSACTION", "TRIGGER", "UNBOUNDED", "UNION", "UNIQUE",
432-
"UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN",
433-
"WHERE", "WINDOW", "WITH", "WITHOUT", NULL
434-
};
435-
PyObject *keywords = PyTuple_New(147);
436-
411+
int count = sqlite3_keyword_count();
412+
PyObject *keywords = PyTuple_New(count);
437413
if (keywords == NULL) {
438-
return -1;
414+
goto error;
439415
}
440-
for (int i = 0; _keywords[i] != NULL; i++) {
441-
kwd = PyUnicode_FromString(_keywords[i]);
442-
if (PyTuple_SetItem(keywords, i, kwd) != 0) {
416+
for (int i = 0; i < count; i++) {
417+
const char *keyword;
418+
int size;
419+
int result = sqlite3_keyword_name(i, &keyword, &size);
420+
if (result != SQLITE_OK) {
421+
pysqlite_state *state = pysqlite_get_state(module);
422+
set_error_from_code(state, result);
423+
goto error;
424+
}
425+
PyObject *kwd = PyUnicode_FromStringAndSize(keyword, size);
426+
if (!kwd) {
427+
goto error;
428+
}
429+
if (PyTuple_SetItem(keywords, i, kwd) < 0) {
443430
Py_DECREF(kwd);
444-
Py_DECREF(keywords);
445-
return -1;
431+
goto error;
446432
}
447433
}
448434
if (PyModule_Add(module, "SQLITE_KEYWORDS", keywords) < 0) {
449-
Py_DECREF(keywords);
450-
return -1;
435+
goto error;
451436
}
452437
return 0;
438+
439+
error:
440+
Py_XDECREF(keywords);
441+
return -1;
453442
}
454443

455444
static int
@@ -750,8 +739,8 @@ module_exec(PyObject *module)
750739
goto error;
751740
}
752741

753-
/* Set sequence constants */
754-
if (add_sequence_constants(module) < 0) {
742+
/* Set the keyword tuple */
743+
if (add_keyword_tuple(module) < 0) {
755744
goto error;
756745
}
757746

0 commit comments

Comments
 (0)