Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7ff77ef

Browse files
committed
Adding support for InterSystems Cache (and IRIS)
1 parent 5c82f30 commit 7ff77ef

23 files changed

Lines changed: 459 additions & 36 deletions

data/xml/queries.xml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,4 +1457,64 @@
14571457
<blind query="SELECT DISTINCT(owner_name) FROM db_attribute JOIN db_class ON db_attribute.class_name=db_class.class_name WHERE %s" query2="SELECT DISTINCT(db_class.class_name) FROM db_attribute JOIN db_class ON db_attribute.class_name=db_class.class_name WHERE owner_name='%s'" count="SELECT COUNT(DISTINCT(owner_name)) FROM db_attribute JOIN db_class ON db_attribute.class_name=db_class.class_name WHERE %s" count2="SELECT COUNT(DISTINCT(db_class.class_name)) FROM db_attribute JOIN db_class ON db_attribute.class_name=db_class.class_name WHERE owner_name='%s'" condition="attr_name" condition2="owner_name" condition3="db_class.class_name"/>
14581458
</search_column>
14591459
</dbms>
1460+
1461+
<dbms value="InterSystems Cache">
1462+
<cast query="CAST(%s AS NVARCHAR(4000))"/>
1463+
<length query="CHAR_LENGTH(%s)"/>
1464+
<isnull query="COALESCE(%s,' ')"/>
1465+
<delimiter query="||"/>
1466+
<limit query="SELECT TOP %d %s FROM (%s) WHERE %%VID>%d"/>
1467+
<limitregexp query="TOP\s+(\d+)\s+.+?\s+FROM\s+.+?\s+WHERE\s+.+%%VID>(\d+)"/>
1468+
<limitgroupstart query="2"/>
1469+
<limitgroupstop query="1"/>
1470+
<limitstring/>
1471+
<order query="ORDER BY %s ASC"/>
1472+
<count query="COUNT(%s)"/>
1473+
<comment query="--" query2=";"/>
1474+
<substring query="SUBSTR((%s),%d,%d)"/>
1475+
<concatenate query="%s||%s"/>
1476+
<case query="SELECT (CASE WHEN (%s) THEN 1 ELSE 0 END)"/>
1477+
<inference query="ASCII(SUBSTR((%s),%d,1))>%d"/>
1478+
<banner query="$ZVERSION"/>
1479+
<current_user query="$USERNAME"/>
1480+
<current_db/>
1481+
<hostname/>
1482+
<table_comment/>
1483+
<column_comment/>
1484+
<is_dba query="$USERNAME='_SYSTEM'"/>
1485+
<check_udf/>
1486+
<users/>
1487+
<passwords/>
1488+
<privileges/>
1489+
<roles/>
1490+
<statements/>
1491+
<dbs>
1492+
<inband query="SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA" query2="SELECT db FROM mysql.db"/>
1493+
<blind query="SELECT TOP 1 schema_name FROM (SELECT TOP ALL schema_name FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY schema_name) WHERE %%VID=%d" count="SELECT COUNT(DISTINCT(schema_name)) FROM INFORMATION_SCHEMA.SCHEMATA"/>
1494+
</dbs>
1495+
<tables>
1496+
<inband query="SELECT table_schema,table_name FROM INFORMATION_SCHEMA.TABLES" condition="table_schema"/>
1497+
<blind query="SELECT TOP 1 table_name FROM (SELECT TOP ALL table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='%s' ORDER BY table_name) WHERE %%VID=%d" count="SELECT COUNT(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='%s'"/>
1498+
</tables>
1499+
<columns>
1500+
<inband query="SELECT column_name,data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema='%s'" condition="column_name"/>
1501+
<blind query="SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema='%s' ORDER BY column_name" query2="SELECT data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND column_name='%s' AND table_schema='%s'" count="SELECT COUNT(column_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema='%s'" condition="column_name"/>
1502+
</columns>
1503+
<dump_table>
1504+
<inband query="SELECT %s FROM %s.%s ORDER BY %s"/>
1505+
<blind query="SELECT TOP 1 %s FROM (SELECT TOP ALL * FROM %s.%s ORDER BY %s) WHERE %%VID=%d" count="SELECT COUNT(*) FROM %s.%s"/>
1506+
</dump_table>
1507+
<search_db>
1508+
<inband query="SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s" query2="SELECT db FROM mysql.db WHERE %s" condition="schema_name" condition2="db"/>
1509+
<blind query="SELECT DISTINCT(schema_name) FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s" query2="SELECT DISTINCT(db) FROM mysql.db WHERE %s" count="SELECT COUNT(DISTINCT(schema_name)) FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s" count2="SELECT COUNT(DISTINCT(db)) FROM mysql.db WHERE %s" condition="schema_name" condition2="db"/>
1510+
</search_db>
1511+
<search_table>
1512+
<inband query="SELECT table_schema,table_name FROM INFORMATION_SCHEMA.TABLES WHERE %s" condition="table_name" condition2="table_schema"/>
1513+
<blind query="SELECT DISTINCT(table_schema) FROM INFORMATION_SCHEMA.TABLES WHERE %s" query2="SELECT DISTINCT(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='%s'" count="SELECT COUNT(DISTINCT(table_schema)) FROM INFORMATION_SCHEMA.TABLES WHERE %s" count2="SELECT COUNT(DISTINCT(table_name)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='%s'" condition="table_name" condition2="table_schema"/>
1514+
</search_table>
1515+
<search_column>
1516+
<inband query="SELECT table_schema,table_name FROM INFORMATION_SCHEMA.COLUMNS WHERE %s" condition="column_name" condition2="table_schema" condition3="table_name"/>
1517+
<blind query="SELECT DISTINCT(table_schema) FROM INFORMATION_SCHEMA.COLUMNS WHERE %s" query2="SELECT DISTINCT(table_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='%s'" count="SELECT COUNT(DISTINCT(table_schema)) FROM INFORMATION_SCHEMA.COLUMNS WHERE %s" count2="SELECT COUNT(DISTINCT(table_name)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='%s'" condition="column_name" condition2="table_schema" condition3="table_name"/>
1518+
</search_column>
1519+
</dbms>
14601520
</root>

lib/controller/handler.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from lib.core.exception import SqlmapConnectionException
1414
from lib.core.settings import ACCESS_ALIASES
1515
from lib.core.settings import ALTIBASE_ALIASES
16+
from lib.core.settings import CACHE_ALIASES
1617
from lib.core.settings import CRATEDB_ALIASES
1718
from lib.core.settings import CUBRID_ALIASES
1819
from lib.core.settings import DB2_ALIASES
@@ -39,6 +40,8 @@
3940
from plugins.dbms.access import AccessMap
4041
from plugins.dbms.altibase.connector import Connector as AltibaseConn
4142
from plugins.dbms.altibase import AltibaseMap
43+
from plugins.dbms.cache.connector import Connector as CacheConn
44+
from plugins.dbms.cache import CacheMap
4245
from plugins.dbms.cratedb.connector import Connector as CrateDBConn
4346
from plugins.dbms.cratedb import CrateDBMap
4447
from plugins.dbms.cubrid.connector import Connector as CubridConn
@@ -109,6 +112,7 @@ def setHandler():
109112
(DBMS.MIMERSQL, MIMERSQL_ALIASES, MimerSQLMap, MimerSQLConn),
110113
(DBMS.CRATEDB, CRATEDB_ALIASES, CrateDBMap, CrateDBConn),
111114
(DBMS.CUBRID, CUBRID_ALIASES, CubridMap, CubridConn),
115+
(DBMS.CACHE, CACHE_ALIASES, CacheMap, CacheConn),
112116
]
113117

114118
_ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items)

lib/core/agent.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ def concatQuery(self, query, unpack=True):
660660
elif fieldsNoSelect:
661661
concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop)
662662

663-
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CUBRID):
663+
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE):
664664
if fieldsExists:
665665
concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1)
666666
concatenatedQuery += "||'%s'" % kb.chars.stop
@@ -1011,6 +1011,15 @@ def limitQuery(self, num, query, field=None, uniqueField=None):
10111011
if match:
10121012
orderBy = " ORDER BY %s" % match.group(1)
10131013

1014+
elif Backend.isDbms(DBMS.CACHE):
1015+
match = re.search(r"ORDER BY ([^ ]+)\Z", limitedQuery)
1016+
if match:
1017+
limitedQuery = re.sub(r"\s*%s\s*" % re.escape(match.group(0)), " ", limitedQuery).strip()
1018+
orderBy = " %s" % match.group(0)
1019+
field = match.group(1)
1020+
1021+
limitedQuery = queries[Backend.getIdentifiedDbms()].limit.query % (1, field, limitedQuery, num)
1022+
10141023
elif Backend.isDbms(DBMS.FIREBIRD):
10151024
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num + 1, num + 1)
10161025
limitedQuery += " %s" % limitStr

lib/core/common.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4091,7 +4091,7 @@ def safeSQLIdentificatorNaming(name, isTable=False):
40914091

40924092
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE): # Note: in SQLite double-quotes are treated as string if column/identifier is non-existent (e.g. SELECT "foobar" FROM users)
40934093
retVal = "`%s`" % retVal
4094-
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB):
4094+
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE):
40954095
retVal = "\"%s\"" % retVal
40964096
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL):
40974097
retVal = "\"%s\"" % retVal.upper()
@@ -4129,7 +4129,7 @@ def unsafeSQLIdentificatorNaming(name):
41294129
if isinstance(name, six.string_types):
41304130
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE):
41314131
retVal = name.replace("`", "")
4132-
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB):
4132+
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE):
41334133
retVal = name.replace("\"", "")
41344134
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL):
41354135
retVal = name.replace("\"", "").upper()

lib/core/dicts.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from lib.core.settings import ACCESS_ALIASES
1313
from lib.core.settings import ALTIBASE_ALIASES
1414
from lib.core.settings import BLANK
15+
from lib.core.settings import CACHE_ALIASES
1516
from lib.core.settings import CRATEDB_ALIASES
1617
from lib.core.settings import CUBRID_ALIASES
1718
from lib.core.settings import DB2_ALIASES
@@ -123,9 +124,7 @@
123124
-8: "NCHAR",
124125
-9: "NVARCHAR",
125126
2: "NUMERIC",
126-
2: "DECIMAL",
127127
6: "FLOAT",
128-
6: "NUMBER",
129128
8: "DOUBLE",
130129
7: "REAL",
131130
-5: "BIGINT",
@@ -240,6 +239,7 @@
240239
DBMS.MIMERSQL: (MIMERSQL_ALIASES, "mimerpy", "https://github.com/mimersql/MimerPy", None),
241240
DBMS.CRATEDB: (CRATEDB_ALIASES, "python-psycopg2", "http://initd.org/psycopg/", "postgresql"),
242241
DBMS.CUBRID: (CUBRID_ALIASES, "CUBRID-Python", "https://github.com/CUBRID/cubrid-python", None),
242+
DBMS.CACHE: (CACHE_ALIASES, "python jaydebeapi & python-jpype", "https://pypi.python.org/pypi/JayDeBeApi/ & http://jpype.sourceforge.net/", None),
243243
}
244244

245245
# Reference: https://blog.jooq.org/tag/sysibm-sysdummy1/
@@ -273,6 +273,7 @@
273273
DBMS.MIMERSQL: "ASCII_CHAR(256)",
274274
DBMS.CRATEDB: "MD5(NULL~NULL)", # Note: NULL~NULL also being evaluated on H2 and Ignite
275275
DBMS.CUBRID: "(NULL SETEQ NULL)",
276+
DBMS.CACHE: "%SQLUPPER NULL",
276277
}
277278

278279
SQL_STATEMENTS = {

lib/core/dump.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def currentUser(self, data):
164164
self.string("current user", data, content_type=CONTENT_TYPE.CURRENT_USER)
165165

166166
def currentDb(self, data):
167-
if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.CRATEDB):
167+
if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.CRATEDB, DBMS.CACHE):
168168
self.string("current database (equivalent to schema on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB)
169169
elif Backend.getIdentifiedDbms() in (DBMS.ALTIBASE, DBMS.DB2, DBMS.MIMERSQL, DBMS.MAXDB):
170170
self.string("current database (equivalent to owner on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB)

lib/core/enums.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class DBMS(object):
5454
MIMERSQL = "MimerSQL"
5555
CRATEDB = "CrateDB"
5656
CUBRID = "Cubrid"
57+
CACHE = "InterSystems Cache"
5758

5859
class DBMS_DIRECTORY_NAME(object):
5960
ACCESS = "access"
@@ -78,6 +79,7 @@ class DBMS_DIRECTORY_NAME(object):
7879
MIMERSQL = "mimersql"
7980
CRATEDB = "cratedb"
8081
CUBRID = "cubrid"
82+
CACHE = "cache"
8183

8284
class FORK(object):
8385
MARIADB = "MariaDB"
@@ -91,6 +93,8 @@ class FORK(object):
9193
IGNITE = "Apache Ignite"
9294
AURORA = "Aurora"
9395
ENTERPRISEDB = "EnterpriseDB"
96+
YELLOWBRICK = "Yellowbrick"
97+
IRIS = "Iris"
9498

9599
class CUSTOM_LOGGING(object):
96100
PAYLOAD = 9

lib/core/settings.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from thirdparty.six import unichr as _unichr
1919

2020
# sqlmap version (<major>.<minor>.<month>.<monthly commit>)
21-
VERSION = "1.4.2.38"
21+
VERSION = "1.4.2.39"
2222
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
2323
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
2424
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
@@ -268,11 +268,12 @@
268268
MIMERSQL_SYSTEM_DBS = ("information_schema", "SYSTEM",)
269269
CRATEDB_SYSTEM_DBS = ("information_schema", "pg_catalog", "sys")
270270
CUBRID_SYSTEM_DBS = ("DBA",)
271+
CACHE_SYSTEM_DBS = ("%Dictionary", "INFORMATION_SCHEMA", "%SYS")
271272

272273
# Note: (<regular>) + (<forks>)
273274
MSSQL_ALIASES = ("microsoft sql server", "mssqlserver", "mssql", "ms")
274275
MYSQL_ALIASES = ("mysql", "my") + ("mariadb", "maria", "memsql", "tidb", "percona")
275-
PGSQL_ALIASES = ("postgresql", "postgres", "pgsql", "psql", "pg") + ("cockroach", "cockroachdb")
276+
PGSQL_ALIASES = ("postgresql", "postgres", "pgsql", "psql", "pg") + ("cockroach", "cockroachdb", "redshift", "greenplum", "yellowbrick", "enterprisedb", "aurora")
276277
ORACLE_ALIASES = ("oracle", "orcl", "ora", "or")
277278
SQLITE_ALIASES = ("sqlite", "sqlite3")
278279
ACCESS_ALIASES = ("msaccess", "access", "jet", "microsoft access")
@@ -292,13 +293,14 @@
292293
MIMERSQL_ALIASES = ("mimersql", "mimer")
293294
CRATEDB_ALIASES = ("cratedb", "crate")
294295
CUBRID_ALIASES = ("cubrid",)
296+
CACHE_ALIASES = ("cachedb", "cache")
295297

296298
DBMS_DIRECTORY_DICT = dict((getattr(DBMS, _), getattr(DBMS_DIRECTORY_NAME, _)) for _ in dir(DBMS) if not _.startswith("_"))
297299

298-
SUPPORTED_DBMS = MSSQL_ALIASES + MYSQL_ALIASES + PGSQL_ALIASES + ORACLE_ALIASES + SQLITE_ALIASES + ACCESS_ALIASES + FIREBIRD_ALIASES + MAXDB_ALIASES + SYBASE_ALIASES + DB2_ALIASES + HSQLDB_ALIASES + H2_ALIASES + INFORMIX_ALIASES + MONETDB_ALIASES + DERBY_ALIASES + VERTICA_ALIASES + MCKOI_ALIASES + PRESTO_ALIASES + ALTIBASE_ALIASES + MIMERSQL_ALIASES + CRATEDB_ALIASES + CUBRID_ALIASES
300+
SUPPORTED_DBMS = MSSQL_ALIASES + MYSQL_ALIASES + PGSQL_ALIASES + ORACLE_ALIASES + SQLITE_ALIASES + ACCESS_ALIASES + FIREBIRD_ALIASES + MAXDB_ALIASES + SYBASE_ALIASES + DB2_ALIASES + HSQLDB_ALIASES + H2_ALIASES + INFORMIX_ALIASES + MONETDB_ALIASES + DERBY_ALIASES + VERTICA_ALIASES + MCKOI_ALIASES + PRESTO_ALIASES + ALTIBASE_ALIASES + MIMERSQL_ALIASES + CRATEDB_ALIASES + CUBRID_ALIASES + CACHE_ALIASES
299301
SUPPORTED_OS = ("linux", "windows")
300302

301-
DBMS_ALIASES = ((DBMS.MSSQL, MSSQL_ALIASES), (DBMS.MYSQL, MYSQL_ALIASES), (DBMS.PGSQL, PGSQL_ALIASES), (DBMS.ORACLE, ORACLE_ALIASES), (DBMS.SQLITE, SQLITE_ALIASES), (DBMS.ACCESS, ACCESS_ALIASES), (DBMS.FIREBIRD, FIREBIRD_ALIASES), (DBMS.MAXDB, MAXDB_ALIASES), (DBMS.SYBASE, SYBASE_ALIASES), (DBMS.DB2, DB2_ALIASES), (DBMS.HSQLDB, HSQLDB_ALIASES), (DBMS.H2, H2_ALIASES), (DBMS.INFORMIX, INFORMIX_ALIASES), (DBMS.MONETDB, MONETDB_ALIASES), (DBMS.DERBY, DERBY_ALIASES), (DBMS.VERTICA, VERTICA_ALIASES), (DBMS.MCKOI, MCKOI_ALIASES), (DBMS.PRESTO, PRESTO_ALIASES), (DBMS.ALTIBASE, ALTIBASE_ALIASES), (DBMS.MIMERSQL, MIMERSQL_ALIASES), (DBMS.CRATEDB, CRATEDB_ALIASES), (DBMS.CUBRID, CUBRID_ALIASES))
303+
DBMS_ALIASES = ((DBMS.MSSQL, MSSQL_ALIASES), (DBMS.MYSQL, MYSQL_ALIASES), (DBMS.PGSQL, PGSQL_ALIASES), (DBMS.ORACLE, ORACLE_ALIASES), (DBMS.SQLITE, SQLITE_ALIASES), (DBMS.ACCESS, ACCESS_ALIASES), (DBMS.FIREBIRD, FIREBIRD_ALIASES), (DBMS.MAXDB, MAXDB_ALIASES), (DBMS.SYBASE, SYBASE_ALIASES), (DBMS.DB2, DB2_ALIASES), (DBMS.HSQLDB, HSQLDB_ALIASES), (DBMS.H2, H2_ALIASES), (DBMS.INFORMIX, INFORMIX_ALIASES), (DBMS.MONETDB, MONETDB_ALIASES), (DBMS.DERBY, DERBY_ALIASES), (DBMS.VERTICA, VERTICA_ALIASES), (DBMS.MCKOI, MCKOI_ALIASES), (DBMS.PRESTO, PRESTO_ALIASES), (DBMS.ALTIBASE, ALTIBASE_ALIASES), (DBMS.MIMERSQL, MIMERSQL_ALIASES), (DBMS.CRATEDB, CRATEDB_ALIASES), (DBMS.CUBRID, CUBRID_ALIASES), (DBMS.CACHE, CACHE_ALIASES))
302304

303305
USER_AGENT_ALIASES = ("ua", "useragent", "user-agent")
304306
REFERER_ALIASES = ("ref", "referer", "referrer")
@@ -311,6 +313,10 @@
311313
H2_DEFAULT_SCHEMA = HSQLDB_DEFAULT_SCHEMA = "PUBLIC"
312314
VERTICA_DEFAULT_SCHEMA = "public"
313315
MCKOI_DEFAULT_SCHEMA = "APP"
316+
CACHE_DEFAULT_SCHEMA = "SQLUser"
317+
318+
# DBMSes where OFFSET mechanism starts from 1
319+
PLUS_ONE_DBMSES = set((DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE, DBMS.MSSQL, DBMS.CACHE))
314320

315321
# Names that can't be used to name files on Windows OS
316322
WINDOWS_RESERVED_NAMES = ("CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9")

lib/request/basic.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,8 @@ def decodePage(page, contentEncoding, contentType, percentDecode=True):
343343
# e.g. %20%28%29
344344
if percentDecode:
345345
if b"%" in page:
346-
page = re.sub(b"%([0-9a-fA-F]{2})", lambda _: decodeHex(_.group(1)), page)
346+
page = re.sub(b"%([0-9a-f]{2})", lambda _: decodeHex(_.group(1)), page)
347+
page = re.sub(b"%([0-9A-F]{2})", lambda _: decodeHex(_.group(1)), page) # Note: %DeepSee_SQL in CACHE
347348

348349
# e.g. &amp;
349350
page = re.sub(b"&([^;]+);", lambda _: six.int2byte(HTML_ENTITIES[getText(_.group(1))]) if HTML_ENTITIES.get(getText(_.group(1)), 256) < 256 else _.group(0), page)

lib/utils/deps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def checkDependencies():
4141
__import__("kinterbasdb")
4242
elif dbmsName == DBMS.DB2:
4343
__import__("ibm_db_dbi")
44-
elif dbmsName == DBMS.HSQLDB:
44+
elif dbmsName in (DBMS.HSQLDB, DBMS.CACHE):
4545
__import__("jaydebeapi")
4646
__import__("jpype")
4747
elif dbmsName == DBMS.INFORMIX:

0 commit comments

Comments
 (0)