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

Skip to content

Commit 125de09

Browse files
committed
Adding support for FrontBase
1 parent dc6e732 commit 125de09

29 files changed

Lines changed: 1178 additions & 33 deletions

data/txt/keywords.txt

Lines changed: 750 additions & 0 deletions
Large diffs are not rendered by default.

data/xml/queries.xml

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,4 +1560,72 @@
15601560
<search_table/>
15611561
<search_column/>
15621562
</dbms>
1563+
1564+
<dbms value="FrontBase">
1565+
<cast query="CAST(%s AS NCHAR VARYING(4000))"/>
1566+
<length query="CHAR_LENGTH(%s)"/>
1567+
<isnull query="COALESCE(%s,' ')"/>
1568+
<delimiter query="||"/>
1569+
<limit query="TOP (%d,%d)"/>
1570+
<limitregexp query="\s+TOP\s*\(([\d]+)\s*\,\s*([\d]+)\)" query2="\s+TOP\s+([\d]+)"/>
1571+
<limitgroupstart query="1"/>
1572+
<limitgroupstop query="2"/>
1573+
<limitstring query=" TOP "/>
1574+
<order query="ORDER BY %s ASC"/>
1575+
<count query="COUNT(%s)"/>
1576+
<comment query=";--"/>
1577+
<substring query="SUBSTRING((%s) FROM %d FOR %d)"/>
1578+
<concatenate query="%s||%s"/>
1579+
<case query="SELECT (CASE WHEN (%s) THEN '1' ELSE '0' END)"/>
1580+
<hex/>
1581+
<inference query="SUBSTRING((%s) FROM %d FOR 1)>'%c'"/>
1582+
<banner/>
1583+
<current_user query="CURRENT_USER"/>
1584+
<current_db query="CURRENT_SCHEMA"/>
1585+
<hostname/>
1586+
<table_comment/>
1587+
<column_comment/>
1588+
<is_dba query="(SELECT UPPER(CURRENT_USER) FROM INFORMATION_SCHEMA.IO_STATISTICS)='_SYSTEM'"/>
1589+
<check_udf/>
1590+
<users>
1591+
<inband query="SELECT user_name FROM INFORMATION_SCHEMA.USERS"/>
1592+
<blind query="SELECT TOP (%d,1) user_name FROM INFORMATION_SCHEMA.USERS" count="SELECT COUNT(user_name) FROM INFORMATION_SCHEMA.USERS"/>
1593+
</users>
1594+
<passwords>
1595+
<inband query="SELECT user_name,password FROM INFORMATION_SCHEMA.USERS" condition="user_name"/>
1596+
<blind query="SELECT TOP (%d,1) password FROM INFORMATION_SCHEMA.USERS WHERE user_name='%s'" count="SELECT COUNT(password) FROM INFORMATION_SCHEMA.USERS WHERE user_name='%s'"/>
1597+
</passwords>
1598+
<privileges/>
1599+
<roles/>
1600+
<statements/>
1601+
<dbs>
1602+
<inband query="SELECT &quot;schema_name&quot; FROM INFORMATION_SCHEMA.SCHEMATA"/>
1603+
<blind query="SELECT TOP (%d,1) &quot;schema_name&quot; FROM INFORMATION_SCHEMA.SCHEMATA" count="SELECT COUNT(&quot;schema_name&quot;) FROM INFORMATION_SCHEMA.SCHEMATA"/>
1604+
</dbs>
1605+
<tables>
1606+
<inband query="SELECT &quot;schema_name&quot;,&quot;table_name&quot; FROM INFORMATION_SCHEMA.TABLES AS a JOIN INFORMATION_SCHEMA.SCHEMATA AS b ON a.schema_pk=b.schema_pk" condition="&quot;schema_name&quot;"/>
1607+
<blind query="SELECT TOP (%d,1) &quot;table_name&quot; FROM INFORMATION_SCHEMA.TABLES AS a JOIN INFORMATION_SCHEMA.SCHEMATA AS b ON a.schema_pk=b.schema_pk WHERE &quot;schema_name&quot;='%s'" count="SELECT COUNT(&quot;table_name&quot;) FROM INFORMATION_SCHEMA.TABLES AS a JOIN INFORMATION_SCHEMA.SCHEMATA AS b ON a.schema_pk=b.schema_pk WHERE &quot;schema_name&quot;='%s'"/>
1608+
</tables>
1609+
<columns>
1610+
<inband query="SELECT &quot;column_name&quot;,data_type FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.DATA_TYPE_DESCRIPTOR,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.DATA_TYPE_DESCRIPTOR.column_name_pk=INFORMATION_SCHEMA.COLUMNS.column_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;table_name&quot;='%s' AND &quot;schema_name&quot;='%s'" condition="&quot;column_name&quot;"/>
1611+
<blind query="SELECT &quot;column_name&quot; FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;table_name&quot;='%s' AND &quot;schema_name&quot;='%s'" query2="SELECT data_type FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.DATA_TYPE_DESCRIPTOR,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.DATA_TYPE_DESCRIPTOR.column_name_pk=INFORMATION_SCHEMA.COLUMNS.column_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;table_name&quot;='%s' AND &quot;column_name&quot;='%s' AND &quot;schema_name&quot;='%s'" count="SELECT COUNT(&quot;column_name&quot;) FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;table_name&quot;='%s' AND &quot;schema_name&quot;='%s'" condition="&quot;column_name&quot;"/>
1612+
</columns>
1613+
<dump_table>
1614+
<inband query="SELECT %s FROM %s.%s"/>
1615+
<blind query="SELECT TOP (%d,1) %s FROM %s.%s" count="SELECT COUNT(*) FROM %s.%s"/>
1616+
</dump_table>
1617+
<search_db>
1618+
<inband query="SELECT &quot;schema_name&quot; FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s" condition="&quot;schema_name&quot;"/>
1619+
<blind query="SELECT &quot;schema_name&quot; FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s" count="SELECT COUNT(&quot;schema_name&quot;) FROM INFORMATION_SCHEMA.SCHEMATA WHERE %s" condition="&quot;schema_name&quot;"/>
1620+
</search_db>
1621+
<search_table>
1622+
<inband query="SELECT &quot;schema_name&quot;,&quot;table_name&quot; FROM INFORMATION_SCHEMA.TABLES AS a JOIN INFORMATION_SCHEMA.SCHEMATA AS b ON a.schema_pk=b.schema_pk WHERE %s" condition="&quot;table_name&quot;" condition2="&quot;schema_name&quot;"/>
1623+
<blind query="SELECT &quot;schema_name&quot; FROM INFORMATION_SCHEMA.TABLES AS a JOIN INFORMATION_SCHEMA.SCHEMATA AS b ON a.schema_pk=b.schema_pk WHERE %s" query2="SELECT &quot;table_name&quot; FROM INFORMATION_SCHEMA.TABLES AS a JOIN INFORMATION_SCHEMA.SCHEMATA AS b ON a.schema_pk=b.schema_pk WHERE &quot;schema_name&quot;='%s'" count="SELECT COUNT(&quot;schema_name&quot;) FROM INFORMATION_SCHEMA.TABLES AS a JOIN INFORMATION_SCHEMA.SCHEMATA AS b ON a.schema_pk=b.schema_pk WHERE %s" count2="SELECT COUNT(&quot;table_name&quot;) FROM INFORMATION_SCHEMA.TABLES AS a JOIN INFORMATION_SCHEMA.SCHEMATA AS b ON a.schema_pk=b.schema_pk WHERE &quot;schema_name&quot;='%s'" condition="&quot;table_name&quot;" condition2="&quot;schema_name&quot;"/>
1624+
</search_table>
1625+
<!-- NOTE: Not working properly with DISTINCT(...) in subquery -->
1626+
<search_column>
1627+
<inband query="SELECT &quot;schema_name&quot;,&quot;table_name&quot; FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND %s" condition="&quot;column_name&quot;" condition2="&quot;schema_name&quot;" condition3="&quot;table_name&quot;"/>
1628+
<blind query="SELECT &quot;schema_name&quot; FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND %s" query2="SELECT &quot;table_name&quot; FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;schema_name&quot;='%s'" count="SELECT COUNT(&quot;schema_name&quot;) FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND %s" count2="SELECT COUNT(&quot;table_name&quot;) FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;schema_name&quot;='%s'" condition="&quot;column_name&quot;" condition2="&quot;schema_name&quot;" condition3="&quot;table_name&quot;"/>
1629+
</search_column>
1630+
</dbms>
15631631
</root>

lib/controller/handler.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from lib.core.settings import DERBY_ALIASES
2121
from lib.core.settings import EXTREMEDB_ALIASES
2222
from lib.core.settings import FIREBIRD_ALIASES
23+
from lib.core.settings import FRONTBASE_ALIASES
2324
from lib.core.settings import H2_ALIASES
2425
from lib.core.settings import HSQLDB_ALIASES
2526
from lib.core.settings import INFORMIX_ALIASES
@@ -55,6 +56,8 @@
5556
from plugins.dbms.extremedb import ExtremeDBMap
5657
from plugins.dbms.firebird.connector import Connector as FirebirdConn
5758
from plugins.dbms.firebird import FirebirdMap
59+
from plugins.dbms.frontbase.connector import Connector as FrontBaseConn
60+
from plugins.dbms.frontbase import FrontBaseMap
5861
from plugins.dbms.h2.connector import Connector as H2Conn
5962
from plugins.dbms.h2 import H2Map
6063
from plugins.dbms.hsqldb.connector import Connector as HSQLDBConn
@@ -117,6 +120,7 @@ def setHandler():
117120
(DBMS.CUBRID, CUBRID_ALIASES, CubridMap, CubridConn),
118121
(DBMS.CACHE, CACHE_ALIASES, CacheMap, CacheConn),
119122
(DBMS.EXTREMEDB, EXTREMEDB_ALIASES, ExtremeDBMap, ExtremeDBConn),
123+
(DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, FrontBaseConn),
120124
]
121125

122126
_ = 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: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ def getFields(self, query):
535535
"""
536536

537537
prefixRegex = r"(?:\s+(?:FIRST|SKIP|LIMIT(?: \d+)?)\s+\d+)*"
538-
fieldsSelectTop = re.search(r"\ASELECT\s+TOP\s+[\d]+\s+(.+?)\s+FROM", query, re.I)
538+
fieldsSelectTop = re.search(r"\ASELECT\s+TOP\s+([\d]|\([^)]+\))+\s+(.+?)\s+FROM", query, re.I)
539539
fieldsSelectRownum = re.search(r"\ASELECT\s+([^()]+?),\s*ROWNUM AS LIMIT FROM", query, re.I)
540540
fieldsSelectDistinct = re.search(r"\ASELECT%s\s+DISTINCT\((.+?)\)\s+FROM" % prefixRegex, query, re.I)
541541
fieldsSelectCase = re.search(r"\ASELECT%s\s+(\(CASE WHEN\s+.+\s+END\))" % prefixRegex, query, re.I)
@@ -560,7 +560,7 @@ def getFields(self, query):
560560
if fieldsSelect:
561561
fieldsToCastStr = fieldsSelect.group(1)
562562
elif fieldsSelectTop:
563-
fieldsToCastStr = fieldsSelectTop.group(1)
563+
fieldsToCastStr = fieldsSelectTop.group(2)
564564
elif fieldsSelectRownum:
565565
fieldsToCastStr = fieldsSelectRownum.group(1)
566566
elif fieldsSelectDistinct:
@@ -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, DBMS.CACHE, DBMS.EXTREMEDB):
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, DBMS.EXTREMEDB, DBMS.FRONTBASE):
664664
if fieldsExists:
665665
concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1)
666666
concatenatedQuery += "||'%s'" % kb.chars.stop
@@ -983,6 +983,11 @@ def limitQuery(self, num, query, field=None, uniqueField=None):
983983
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num)
984984
limitedQuery += " %s" % limitStr
985985

986+
elif Backend.getIdentifiedDbms() in (DBMS.FRONTBASE,):
987+
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1)
988+
if query.startswith("SELECT "):
989+
limitedQuery = query.replace("SELECT ", "SELECT %s " % limitStr, 1)
990+
986991
elif Backend.getIdentifiedDbms() in (DBMS.MONETDB,):
987992
if query.startswith("SELECT ") and field is not None and field in query:
988993
original = query.split("SELECT ", 1)[1].split(" FROM", 1)[0]

lib/core/common.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2821,6 +2821,10 @@ def urlencode(value, safe="%&=-_", convall=False, limit=False, spaceplus=False):
28212821
28222822
>>> urlencode('AND 1>(2+3)#')
28232823
'AND%201%3E%282%2B3%29%23'
2824+
>>> urlencode('AND COUNT(SELECT name FROM users WHERE name LIKE \\'%DBA%\\')>0')
2825+
'AND%20COUNT%28SELECT%20name%20FROM%20users%20WHERE%20name%20LIKE%20%27%25DBA%25%27%29%3E0'
2826+
>>> urlencode('AND COUNT(SELECT name FROM users WHERE name LIKE \\'%_SYSTEM%\\')>0')
2827+
'AND%20COUNT%28SELECT%20name%20FROM%20users%20WHERE%20name%20LIKE%20%27%25_SYSTEM%25%27%29%3E0'
28242828
"""
28252829

28262830
if conf.get("direct"):
@@ -2843,8 +2847,8 @@ def urlencode(value, safe="%&=-_", convall=False, limit=False, spaceplus=False):
28432847
# encoded (when not representing URL encoded char)
28442848
# except in cases when tampering scripts are used
28452849
if all('%' in _ for _ in (safe, value)) and not kb.tamperFunctions:
2846-
value = re.sub(r"%(?![0-9a-fA-F]{2})", "%25", value)
28472850
value = re.sub(r"(?<= ')%", "%25", value) # e.g. LIKE '%DBA%'
2851+
value = re.sub(r"%(?![0-9a-fA-F]{2})", "%25", value)
28482852

28492853
while True:
28502854
result = _urllib.parse.quote(getBytes(value), safe)
@@ -4086,12 +4090,13 @@ def safeSQLIdentificatorNaming(name, isTable=False):
40864090
if _:
40874091
retVal = re.sub(r"(?i)\A\[?%s\]?\." % DEFAULT_MSSQL_SCHEMA, "%s." % DEFAULT_MSSQL_SCHEMA, retVal)
40884092

4089-
if retVal.upper() in kb.keywords or (retVal or " ")[0].isdigit() or not re.match(r"\A[A-Za-z0-9_@%s\$]+\Z" % ('.' if _ else ""), retVal): # MsSQL is the only DBMS where we automatically prepend schema to table name (dot is normal)
4093+
# Note: SQL 92 has restrictions for identifiers starting with underscore (e.g. http://www.frontbase.com/documentation/FBUsers_4.pdf)
4094+
if retVal.upper() in kb.keywords or (not isTable and (retVal or " ")[0] == '_') or (retVal or " ")[0].isdigit() or not re.match(r"\A[A-Za-z0-9_@%s\$]+\Z" % ('.' if _ else ""), retVal): # MsSQL is the only DBMS where we automatically prepend schema to table name (dot is normal)
40904095
retVal = unsafeSQLIdentificatorNaming(retVal)
40914096

40924097
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)
40934098
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, DBMS.CACHE, DBMS.EXTREMEDB):
4099+
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):
40954100
retVal = "\"%s\"" % retVal
40964101
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL):
40974102
retVal = "\"%s\"" % retVal.upper()
@@ -4129,7 +4134,7 @@ def unsafeSQLIdentificatorNaming(name):
41294134
if isinstance(name, six.string_types):
41304135
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE):
41314136
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, DBMS.CACHE, DBMS.EXTREMEDB):
4137+
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):
41334138
retVal = name.replace("\"", "")
41344139
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL):
41354140
retVal = name.replace("\"", "").upper()

lib/core/dicts.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from lib.core.settings import DERBY_ALIASES
2020
from lib.core.settings import EXTREMEDB_ALIASES
2121
from lib.core.settings import FIREBIRD_ALIASES
22+
from lib.core.settings import FRONTBASE_ALIASES
2223
from lib.core.settings import H2_ALIASES
2324
from lib.core.settings import HSQLDB_ALIASES
2425
from lib.core.settings import INFORMIX_ALIASES
@@ -242,6 +243,7 @@
242243
DBMS.CUBRID: (CUBRID_ALIASES, "CUBRID-Python", "https://github.com/CUBRID/cubrid-python", None),
243244
DBMS.CACHE: (CACHE_ALIASES, "python jaydebeapi & python-jpype", "https://pypi.python.org/pypi/JayDeBeApi/ & http://jpype.sourceforge.net/", None),
244245
DBMS.EXTREMEDB: (EXTREMEDB_ALIASES, None, None, None),
246+
DBMS.FRONTBASE: (FRONTBASE_ALIASES, None, None, None),
245247
}
246248

247249
# Reference: https://blog.jooq.org/tag/sysibm-sysdummy1/
@@ -255,6 +257,7 @@
255257
DBMS.INFORMIX: " FROM SYSMASTER:SYSDUAL",
256258
DBMS.DERBY: " FROM SYSIBM.SYSDUMMY1",
257259
DBMS.MIMERSQL: " FROM SYSTEM.ONEROW",
260+
DBMS.FRONTBASE: " FROM INFORMATION_SCHEMA.IO_STATISTICS"
258261
}
259262

260263
HEURISTIC_NULL_EVAL = {

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, DBMS.CACHE):
167+
if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE):
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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class DBMS(object):
5656
CUBRID = "Cubrid"
5757
CACHE = "InterSystems Cache"
5858
EXTREMEDB = "eXtremeDB"
59+
FRONTBASE = "FrontBase"
5960

6061
class DBMS_DIRECTORY_NAME(object):
6162
ACCESS = "access"
@@ -82,6 +83,7 @@ class DBMS_DIRECTORY_NAME(object):
8283
CUBRID = "cubrid"
8384
CACHE = "cache"
8485
EXTREMEDB = "extremedb"
86+
FRONTBASE = "frontbase"
8587

8688
class FORK(object):
8789
MARIADB = "MariaDB"
@@ -426,3 +428,8 @@ class TIMEOUT_STATE(object):
426428
class HINT(object):
427429
PREPEND = 0
428430
APPEND = 1
431+
432+
class FUZZ_UNION_COLUMN:
433+
STRING = "<string>"
434+
INTEGER = "<integer>"
435+
NULL = "NULL"

lib/core/option.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1920,6 +1920,7 @@ def _setKnowledgeBaseAttributes(flushAll=True):
19201920
kb.forceWhere = None
19211921
kb.forkNote = None
19221922
kb.futileUnion = None
1923+
kb.fuzzUnionTest = None
19231924
kb.heavilyDynamic = False
19241925
kb.headersFile = None
19251926
kb.headersFp = {}
@@ -2019,6 +2020,7 @@ def _setKnowledgeBaseAttributes(flushAll=True):
20192020
kb.uChar = NULL
20202021
kb.udfFail = False
20212022
kb.unionDuplicates = False
2023+
kb.unionTemplate = None
20222024
kb.webSocketRecvCount = None
20232025
kb.wizardMode = False
20242026
kb.xpCmdshellAvailable = False

0 commit comments

Comments
 (0)