@@ -3402,19 +3402,39 @@ def parseSqliteTableSchema(value):
3402
3402
>>> kb.data.cachedColumns = {}
3403
3403
>>> parseSqliteTableSchema("CREATE TABLE users(\\ n\\ t\\ tid INTEGER,\\ n\\ t\\ tname TEXT\\ n);")
3404
3404
True
3405
- >>> repr(kb.data.cachedColumns).count(',') == 1
3405
+ >>> tuple(kb.data.cachedColumns[conf.db][conf.tbl].items()) == (('id', 'INTEGER'), ('name', 'TEXT'))
3406
+ True
3407
+ >>> parseSqliteTableSchema("CREATE TABLE dummy(`foo bar` BIGINT, \\ "foo\\ " VARCHAR, 'bar' TEXT)");
3408
+ True
3409
+ >>> tuple(kb.data.cachedColumns[conf.db][conf.tbl].items()) == (('foo bar', 'BIGINT'), ('foo', 'VARCHAR'), ('bar', 'TEXT'))
3410
+ True
3411
+ >>> parseSqliteTableSchema("CREATE TABLE suppliers(\\ n\\ tsupplier_id INTEGER PRIMARY KEY DESC,\\ n\\ tname TEXT NOT NULL\\ n);");
3412
+ True
3413
+ >>> tuple(kb.data.cachedColumns[conf.db][conf.tbl].items()) == (('supplier_id', 'INTEGER'), ('name', 'TEXT'))
3414
+ True
3415
+ >>> parseSqliteTableSchema("CREATE TABLE country_languages (\\ n\\ tcountry_id INTEGER NOT NULL,\\ n\\ tlanguage_id INTEGER NOT NULL,\\ n\\ tPRIMARY KEY (country_id, language_id),\\ n\\ tFOREIGN KEY (country_id) REFERENCES countries (country_id) ON DELETE CASCADE ON UPDATE NO ACTION,\\ tFOREIGN KEY (language_id) REFERENCES languages (language_id) ON DELETE CASCADE ON UPDATE NO ACTION);");
3416
+ True
3417
+ >>> tuple(kb.data.cachedColumns[conf.db][conf.tbl].items()) == (('country_id', 'INTEGER'), ('language_id', 'INTEGER'))
3406
3418
True
3407
3419
"""
3408
3420
3409
3421
retVal = False
3410
3422
3423
+ value = extractRegexResult (r"(?s)\((?P<result>.+)\)" , value )
3424
+
3411
3425
if value :
3412
3426
table = {}
3413
- columns = {}
3427
+ columns = OrderedDict ()
3428
+
3429
+ value = re .sub (r"\(.+?\)" , "" , value ).strip ()
3414
3430
3415
- for match in re .finditer (r"[(,]\s*[\"'`]?(\w+)[\"'`]?(?:\s+(INT|INTEGER|TINYINT|SMALLINT|MEDIUMINT|BIGINT|UNSIGNED BIG INT|INT2|INT8|INTEGER|CHARACTER|VARCHAR|VARYING CHARACTER|NCHAR|NATIVE CHARACTER|NVARCHAR|TEXT|CLOB|LONGTEXT|BLOB|NONE|REAL|DOUBLE|DOUBLE PRECISION|FLOAT|REAL|NUMERIC|DECIMAL|BOOLEAN|DATE|DATETIME|NUMERIC)\b)?" , decodeStringEscape (value ), re .I ):
3431
+ for match in re .finditer (r"(?:\A|,)\s*(([\"'`]).+?\2|\w+)(?:\s+(INT|INTEGER|TINYINT|SMALLINT|MEDIUMINT|BIGINT|UNSIGNED BIG INT|INT2|INT8|INTEGER|CHARACTER|VARCHAR|VARYING CHARACTER|NCHAR|NATIVE CHARACTER|NVARCHAR|TEXT|CLOB|LONGTEXT|BLOB|NONE|REAL|DOUBLE|DOUBLE PRECISION|FLOAT|REAL|NUMERIC|DECIMAL|BOOLEAN|DATE|DATETIME|NUMERIC)\b)?" , decodeStringEscape (value ), re .I ):
3432
+ column = match .group (1 ).strip (match .group (2 ) or "" )
3433
+ if re .search (r"(?i)\A(CONSTRAINT|PRIMARY|UNIQUE|CHECK|FOREIGN)\b" , column .strip ()):
3434
+ continue
3416
3435
retVal = True
3417
- columns [match .group (1 )] = match .group (2 ) or "TEXT"
3436
+
3437
+ columns [column ] = match .group (3 ) or "TEXT"
3418
3438
3419
3439
table [safeSQLIdentificatorNaming (conf .tbl , True )] = columns
3420
3440
kb .data .cachedColumns [conf .db ] = table
0 commit comments