Skip to content

Commit d984593

Browse files
Add SAP HANA Support
1 parent e48cce3 commit d984593

16 files changed

Lines changed: 361 additions & 10 deletions

File tree

data/xml/queries.xml

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1906,4 +1906,77 @@
19061906
<blind query="SELECT DISTINCT(table_schema) FROM INFORMATION_SCHEMA.COLUMNS WHERE %s ORDER BY table_schema" 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"/>
19071907
</search_column>
19081908
</dbms>
1909+
1910+
<dbms value="SAP HANA">
1911+
<cast query="CAST(%s AS VARCHAR(5000))"/>
1912+
<length query="LENGTH(%s)"/>
1913+
<isnull query="IFNULL(%s,' ')"/>
1914+
<delimiter query="||"/>
1915+
<limit query="LIMIT %d OFFSET %d"/>
1916+
<limitregexp query="\s+LIMIT\s+([\d]+)\s+OFFSET\s+([\d]+)" query2="\s+LIMIT\s+([\d]+)"/>
1917+
<limitgroupstart query="2"/>
1918+
<limitgroupstop query="1"/>
1919+
<limitstring query=" OFFSET "/>
1920+
<order query="ORDER BY %s ASC"/>
1921+
<count query="COUNT(%s)"/>
1922+
<comment query="--"/>
1923+
<substring query="SUBSTRING(%s,%d,%d)"/>
1924+
<concatenate query="%s||%s"/>
1925+
<case query="SELECT (CASE WHEN (%s) THEN '1' ELSE '0' END) FROM DUMMY"/>
1926+
<hex query="HEX(%s)"/>
1927+
<inference query="ASCII(SUBSTRING((%s),%d,1))>%d"/>
1928+
<banner query="SELECT VERSION FROM SYS.M_DATABASE"/>
1929+
<current_user query="SELECT CURRENT_USER FROM DUMMY"/>
1930+
<current_db query="SELECT CURRENT_SCHEMA FROM DUMMY"/>
1931+
<hostname query="SELECT HOST FROM SYS.M_HOST_INFORMATION WHERE KEY='host_name'"/>
1932+
<table_comment query="SELECT COMMENTS FROM SYS.TABLES WHERE TABLE_NAME='%s' AND SCHEMA_NAME='%s'"/>
1933+
<column_comment query="SELECT COMMENTS FROM SYS.TABLE_COLUMNS WHERE TABLE_NAME='%s' AND COLUMN_NAME='%s' AND SCHEMA_NAME='%s'"/>
1934+
<is_dba query="EXISTS(SELECT * FROM SYS.GRANTED_PRIVILEGES WHERE GRANTEE=CURRENT_USER AND PRIVILEGE='DBADMIN')"/>
1935+
<check_udf/>
1936+
<users>
1937+
<inband query="SELECT USER_NAME FROM SYS.USERS"/>
1938+
<blind query="SELECT USER_NAME FROM SYS.USERS ORDER BY USER_NAME LIMIT 1 OFFSET %d" count="SELECT COUNT(*) FROM SYS.USERS"/>
1939+
</users>
1940+
<passwords/>
1941+
<privileges>
1942+
<inband query="SELECT GRANTEE,PRIVILEGE FROM SYS.GRANTED_PRIVILEGES WHERE OBJECT_TYPE='SYSTEMPRIVILEGE'" condition="grantee"/>
1943+
<blind query="SELECT PRIVILEGE FROM SYS.GRANTED_PRIVILEGES WHERE OBJECT_TYPE='SYSTEMPRIVILEGE' AND GRANTEE='%s' ORDER BY PRIVILEGE LIMIT 1 OFFSET %d" count="SELECT COUNT(*) FROM SYS.GRANTED_PRIVILEGES WHERE OBJECT_TYPE='SYSTEMPRIVILEGE' AND GRANTEE='%s'"/>
1944+
</privileges>
1945+
<roles>
1946+
<inband query="SELECT GRANTEE,ROLE_NAME FROM SYS.GRANTED_ROLES" condition="grantee"/>
1947+
<blind query="SELECT ROLE_NAME FROM SYS.GRANTED_ROLES WHERE GRANTEE='%s' ORDER BY ROLE_NAME LIMIT 1 OFFSET %d" count="SELECT COUNT(*) FROM SYS.GRANTED_ROLES WHERE GRANTEE='%s'"/>
1948+
</roles>
1949+
<statements>
1950+
<inband query="SELECT STATEMENT_STRING FROM SYS.M_SQL_PLAN_CACHE"/>
1951+
<blind query="SELECT STATEMENT_STRING FROM SYS.M_SQL_PLAN_CACHE ORDER BY LAST_EXECUTION_TIMESTAMP DESC LIMIT 1 OFFSET %d" count="SELECT COUNT(*) FROM SYS.M_SQL_PLAN_CACHE"/>
1952+
</statements>
1953+
<dbs>
1954+
<inband query="SELECT SCHEMA_NAME FROM SYS.SCHEMAS"/>
1955+
<blind query="SELECT SCHEMA_NAME FROM SYS.SCHEMAS ORDER BY SCHEMA_NAME LIMIT 1 OFFSET %d" count="SELECT COUNT(*) FROM SYS.SCHEMAS"/>
1956+
</dbs>
1957+
<tables>
1958+
<inband query="SELECT SCHEMA_NAME,TABLE_NAME FROM SYS.TABLES" condition="schema_name"/>
1959+
<blind query="SELECT TABLE_NAME FROM SYS.TABLES WHERE SCHEMA_NAME='%s' ORDER BY TABLE_NAME LIMIT 1 OFFSET %d" count="SELECT COUNT(*) FROM SYS.TABLES WHERE SCHEMA_NAME='%s'"/>
1960+
</tables>
1961+
<columns>
1962+
<inband query="SELECT COLUMN_NAME,DATA_TYPE_NAME FROM SYS.TABLE_COLUMNS WHERE TABLE_NAME='%s' AND SCHEMA_NAME='%s' ORDER BY POSITION" condition="column_name"/>
1963+
<blind query="SELECT COLUMN_NAME FROM SYS.TABLE_COLUMNS WHERE TABLE_NAME='%s' AND SCHEMA_NAME='%s' ORDER BY POSITION" query2="SELECT DATA_TYPE_NAME FROM SYS.TABLE_COLUMNS WHERE TABLE_NAME='%s' AND COLUMN_NAME='%s' AND SCHEMA_NAME='%s'" count="SELECT COUNT(*) FROM SYS.TABLE_COLUMNS WHERE TABLE_NAME='%s' AND SCHEMA_NAME='%s'" condition="column_name"/>
1964+
</columns>
1965+
<dump_table>
1966+
<inband query="SELECT %s FROM %s.%s"/>
1967+
<blind query="SELECT %s FROM %s.%s LIMIT 1 OFFSET %d" count="SELECT COUNT(*) FROM %s.%s"/>
1968+
</dump_table>
1969+
<search_db>
1970+
<inband query="SELECT SCHEMA_NAME FROM SYS.SCHEMAS WHERE %s" condition="schema_name"/>
1971+
<blind query="SELECT DISTINCT(SCHEMA_NAME) FROM SYS.SCHEMAS WHERE %s ORDER BY SCHEMA_NAME" count="SELECT COUNT(DISTINCT(SCHEMA_NAME)) FROM SYS.SCHEMAS WHERE %s" condition="schema_name"/>
1972+
</search_db>
1973+
<search_table>
1974+
<inband query="SELECT SCHEMA_NAME,TABLE_NAME FROM SYS.TABLES WHERE %s" condition="table_name" condition2="schema_name"/>
1975+
<blind query="SELECT DISTINCT(SCHEMA_NAME) FROM SYS.TABLES WHERE %s ORDER BY SCHEMA_NAME" query2="SELECT TABLE_NAME FROM SYS.TABLES WHERE SCHEMA_NAME='%s'" count="SELECT COUNT(DISTINCT(SCHEMA_NAME)) FROM SYS.TABLES WHERE %s" count2="SELECT COUNT(*) FROM SYS.TABLES WHERE SCHEMA_NAME='%s'" condition="table_name" condition2="schema_name"/>
1976+
</search_table>
1977+
<search_column>
1978+
<inband query="SELECT SCHEMA_NAME,TABLE_NAME FROM SYS.TABLE_COLUMNS WHERE %s" condition="column_name" condition2="schema_name" condition3="table_name"/>
1979+
<blind query="SELECT DISTINCT(SCHEMA_NAME) FROM SYS.TABLE_COLUMNS WHERE %s ORDER BY SCHEMA_NAME" query2="SELECT DISTINCT(TABLE_NAME) FROM SYS.TABLE_COLUMNS WHERE SCHEMA_NAME='%s'" count="SELECT COUNT(DISTINCT(SCHEMA_NAME)) FROM SYS.TABLE_COLUMNS WHERE %s" count2="SELECT COUNT(DISTINCT(TABLE_NAME)) FROM SYS.TABLE_COLUMNS WHERE SCHEMA_NAME='%s'" condition="column_name" condition2="schema_name" condition3="table_name"/>
1980+
</search_column>
1981+
</dbms>
19091982
</root>

lib/controller/handler.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from lib.core.settings import FIREBIRD_ALIASES
2626
from lib.core.settings import FRONTBASE_ALIASES
2727
from lib.core.settings import H2_ALIASES
28+
from lib.core.settings import HANA_ALIASES
2829
from lib.core.settings import HSQLDB_ALIASES
2930
from lib.core.settings import INFORMIX_ALIASES
3031
from lib.core.settings import MAXDB_ALIASES
@@ -57,6 +58,7 @@
5758
from plugins.dbms.firebird import FirebirdMap
5859
from plugins.dbms.frontbase import FrontBaseMap
5960
from plugins.dbms.h2 import H2Map
61+
from plugins.dbms.hana import HANAMap
6062
from plugins.dbms.hsqldb import HSQLDBMap
6163
from plugins.dbms.informix import InformixMap
6264
from plugins.dbms.maxdb import MaxDBMap
@@ -113,6 +115,7 @@ def setHandler():
113115
(DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, "plugins.dbms.virtuoso.connector"),
114116
(DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES, SnowflakeMap, "plugins.dbms.snowflake.connector"),
115117
(DBMS.SPANNER, SPANNER_ALIASES, SpannerMap, "plugins.dbms.spanner.connector"),
118+
(DBMS.HANA, HANA_ALIASES, HANAMap, "plugins.dbms.hana.connector"),
116119
]
117120

118121
_ = 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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ def concatQuery(self, query, unpack=True):
727727
elif fieldsNoSelect:
728728
concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop)
729729

730-
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, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO, DBMS.SNOWFLAKE, DBMS.SPANNER):
730+
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, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO, DBMS.SNOWFLAKE, DBMS.SPANNER, DBMS.HANA):
731731
if fieldsExists:
732732
concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1)
733733
concatenatedQuery += "||'%s'" % kb.chars.stop
@@ -1048,7 +1048,7 @@ def limitQuery(self, num, query, field=None, uniqueField=None):
10481048
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1)
10491049
limitedQuery += " %s" % limitStr
10501050

1051-
elif Backend.getIdentifiedDbms() in (DBMS.H2, DBMS.CRATEDB, DBMS.CLICKHOUSE, DBMS.SNOWFLAKE, DBMS.SPANNER):
1051+
elif Backend.getIdentifiedDbms() in (DBMS.H2, DBMS.CRATEDB, DBMS.CLICKHOUSE, DBMS.SNOWFLAKE, DBMS.SPANNER, DBMS.HANA):
10521052
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num)
10531053
limitedQuery += " %s" % limitStr
10541054

lib/core/common.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4307,7 +4307,7 @@ def safeSQLIdentificatorNaming(name, isTable=False):
43074307
retVal = "`%s`" % retVal
43084308
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, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO, DBMS.SNOWFLAKE):
43094309
retVal = "\"%s\"" % retVal
4310-
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL):
4310+
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.HANA):
43114311
retVal = "\"%s\"" % retVal.upper()
43124312
elif Backend.getIdentifiedDbms() in (DBMS.MSSQL, DBMS.SYBASE):
43134313
if isTable:
@@ -4346,7 +4346,7 @@ def unsafeSQLIdentificatorNaming(name):
43464346
retVal = name.replace("`", "")
43474347
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, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO, DBMS.SNOWFLAKE):
43484348
retVal = name.replace("\"", "")
4349-
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL):
4349+
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.HANA):
43504350
retVal = name.replace("\"", "").upper()
43514351
elif Backend.getIdentifiedDbms() in (DBMS.MSSQL, DBMS.SYBASE):
43524352
retVal = name.replace("[", "").replace("]", "")

lib/core/dicts.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from lib.core.settings import FIREBIRD_ALIASES
2222
from lib.core.settings import FRONTBASE_ALIASES
2323
from lib.core.settings import H2_ALIASES
24+
from lib.core.settings import HANA_ALIASES
2425
from lib.core.settings import HSQLDB_ALIASES
2526
from lib.core.settings import INFORMIX_ALIASES
2627
from lib.core.settings import MAXDB_ALIASES
@@ -254,6 +255,7 @@
254255
DBMS.VIRTUOSO: (VIRTUOSO_ALIASES, None, None, None),
255256
DBMS.SNOWFLAKE: (SNOWFLAKE_ALIASES, None, None, "snowflake"),
256257
DBMS.SPANNER: (SPANNER_ALIASES, None, None, "spanner"),
258+
DBMS.HANA: (HANA_ALIASES, "hdbcli", "https://pypi.org/project/hdbcli/", "hana"),
257259
}
258260

259261
# Reference: https://blog.jooq.org/tag/sysibm-sysdummy1/
@@ -267,7 +269,8 @@
267269
DBMS.INFORMIX: " FROM SYSMASTER:SYSDUAL",
268270
DBMS.DERBY: " FROM SYSIBM.SYSDUMMY1",
269271
DBMS.MIMERSQL: " FROM SYSTEM.ONEROW",
270-
DBMS.FRONTBASE: " FROM INFORMATION_SCHEMA.IO_STATISTICS"
272+
DBMS.FRONTBASE: " FROM INFORMATION_SCHEMA.IO_STATISTICS",
273+
DBMS.HANA: " FROM DUMMY"
271274
}
272275

273276
HEURISTIC_NULL_EVAL = {
@@ -295,6 +298,7 @@
295298
DBMS.CLICKHOUSE: "halfMD5(NULL)",
296299
DBMS.SNOWFLAKE: "BOOLNOT(NULL)",
297300
DBMS.SPANNER: "FARM_FINGERPRINT(NULL)",
301+
DBMS.HANA: "MAP(NULL,NULL,NULL,NULL,NULL)",
298302
}
299303

300304
SQL_STATEMENTS = {

lib/core/dump.py

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

177177
def currentDb(self, data):
178-
if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE, DBMS.SNOWFLAKE):
178+
if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE, DBMS.SNOWFLAKE, DBMS.HANA):
179179
self.string("current database (equivalent to schema on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB)
180180
elif Backend.getIdentifiedDbms() in (DBMS.ALTIBASE, DBMS.DB2, DBMS.MIMERSQL, DBMS.MAXDB, DBMS.VIRTUOSO):
181181
self.string("current database (equivalent to owner on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB)

lib/core/enums.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class DBMS(object):
6262
VIRTUOSO = "Virtuoso"
6363
SNOWFLAKE = "Snowflake"
6464
SPANNER = "Spanner"
65+
HANA = "SAP HANA"
6566

6667
class DBMS_DIRECTORY_NAME(object):
6768
ACCESS = "access"
@@ -94,6 +95,7 @@ class DBMS_DIRECTORY_NAME(object):
9495
VIRTUOSO = "virtuoso"
9596
SNOWFLAKE = "snowflake"
9697
SPANNER = "spanner"
98+
HANA = "hana"
9799

98100
class FORK(object):
99101
MARIADB = "MariaDB"

lib/core/settings.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@
299299
VIRTUOSO_SYSTEM_DBS = ("",)
300300
SNOWFLAKE_SYSTEM_DBS = ("INFORMATION_SCHEMA",)
301301
SPANNER_SYSTEM_DBS = ("INFORMATION_SCHEMA", "SPANNER_SYS")
302+
HANA_SYSTEM_DBS = ("SYS", "SYSTEM", "_SYS_BI", "_SYS_BIC", "_SYS_REPO", "_SYS_STATISTICS", "_SYS_XS", "HANA_XS_BASE")
302303

303304
# Note: (<regular>) + (<forks>)
304305
MSSQL_ALIASES = ("microsoft sql server", "mssqlserver", "mssql", "ms")
@@ -331,20 +332,21 @@
331332
VIRTUOSO_ALIASES = ("virtuoso", "openlink virtuoso")
332333
SNOWFLAKE_ALIASES = ("snowflake",)
333334
SPANNER_ALIASES = ("spanner", "google cloud spanner", "google spanner")
335+
HANA_ALIASES = ("hana", "sap hana", "saphana", "hdb")
334336

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

337-
SUPPORTED_DBMS = set(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 + CLICKHOUSE_ALIASES + CRATEDB_ALIASES + CUBRID_ALIASES + CACHE_ALIASES + EXTREMEDB_ALIASES + RAIMA_ALIASES + VIRTUOSO_ALIASES + SNOWFLAKE_ALIASES + SPANNER_ALIASES)
339+
SUPPORTED_DBMS = set(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 + CLICKHOUSE_ALIASES + CRATEDB_ALIASES + CUBRID_ALIASES + CACHE_ALIASES + EXTREMEDB_ALIASES + RAIMA_ALIASES + VIRTUOSO_ALIASES + SNOWFLAKE_ALIASES + SPANNER_ALIASES + HANA_ALIASES)
338340
SUPPORTED_OS = ("linux", "windows")
339341

340-
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.CLICKHOUSE, CLICKHOUSE_ALIASES), (DBMS.CRATEDB, CRATEDB_ALIASES), (DBMS.CUBRID, CUBRID_ALIASES), (DBMS.CACHE, CACHE_ALIASES), (DBMS.EXTREMEDB, EXTREMEDB_ALIASES), (DBMS.FRONTBASE, FRONTBASE_ALIASES), (DBMS.RAIMA, RAIMA_ALIASES), (DBMS.VIRTUOSO, VIRTUOSO_ALIASES), (DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES), (DBMS.SPANNER, SPANNER_ALIASES))
342+
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.CLICKHOUSE, CLICKHOUSE_ALIASES), (DBMS.CRATEDB, CRATEDB_ALIASES), (DBMS.CUBRID, CUBRID_ALIASES), (DBMS.CACHE, CACHE_ALIASES), (DBMS.EXTREMEDB, EXTREMEDB_ALIASES), (DBMS.FRONTBASE, FRONTBASE_ALIASES), (DBMS.RAIMA, RAIMA_ALIASES), (DBMS.VIRTUOSO, VIRTUOSO_ALIASES), (DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES), (DBMS.SPANNER, SPANNER_ALIASES), (DBMS.HANA, HANA_ALIASES))
341343

342344
USER_AGENT_ALIASES = ("ua", "useragent", "user-agent")
343345
REFERER_ALIASES = ("ref", "referer", "referrer")
344346
HOST_ALIASES = ("host",)
345347

346348
# DBMSes with upper case identifiers
347-
UPPER_CASE_DBMSES = set((DBMS.ORACLE, DBMS.DB2, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.H2, DBMS.HSQLDB, DBMS.DERBY, DBMS.ALTIBASE, DBMS.SNOWFLAKE))
349+
UPPER_CASE_DBMSES = set((DBMS.ORACLE, DBMS.DB2, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.H2, DBMS.HSQLDB, DBMS.DERBY, DBMS.ALTIBASE, DBMS.SNOWFLAKE, DBMS.HANA))
348350

349351
# Default schemas to use (when unable to enumerate)
350352
H2_DEFAULT_SCHEMA = HSQLDB_DEFAULT_SCHEMA = "PUBLIC"

plugins/dbms/hana/__init__.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org)
5+
See the file 'LICENSE' for copying permission
6+
"""
7+
8+
from lib.core.enums import DBMS
9+
from lib.core.settings import HANA_SYSTEM_DBS
10+
from lib.core.unescaper import unescaper
11+
from plugins.dbms.hana.enumeration import Enumeration
12+
from plugins.dbms.hana.filesystem import Filesystem
13+
from plugins.dbms.hana.fingerprint import Fingerprint
14+
from plugins.dbms.hana.syntax import Syntax
15+
from plugins.dbms.hana.takeover import Takeover
16+
from plugins.generic.misc import Miscellaneous
17+
18+
class HANAMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover):
19+
"""
20+
This class defines SAP HANA methods
21+
"""
22+
23+
def __init__(self):
24+
self.excludeDbsList = HANA_SYSTEM_DBS
25+
26+
for cls in self.__class__.__bases__:
27+
cls.__init__(self)
28+
29+
unescaper[DBMS.HANA] = Syntax.escape

0 commit comments

Comments
 (0)