@@ -3402,19 +3402,39 @@ def parseSqliteTableSchema(value):
34023402 >>> kb.data.cachedColumns = {}
34033403 >>> parseSqliteTableSchema("CREATE TABLE users(\\ n\\ t\\ tid INTEGER,\\ n\\ t\\ tname TEXT\\ n);")
34043404 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'))
34063418 True
34073419 """
34083420
34093421 retVal = False
34103422
3423+ value = extractRegexResult (r"(?s)\((?P<result>.+)\)" , value )
3424+
34113425 if value :
34123426 table = {}
3413- columns = {}
3427+ columns = OrderedDict ()
3428+
3429+ value = re .sub (r"\(.+?\)" , "" , value ).strip ()
34143430
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
34163435 retVal = True
3417- columns [match .group (1 )] = match .group (2 ) or "TEXT"
3436+
3437+ columns [column ] = match .group (3 ) or "TEXT"
34183438
34193439 table [safeSQLIdentificatorNaming (conf .tbl , True )] = columns
34203440 kb .data .cachedColumns [conf .db ] = table
0 commit comments