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

Skip to content

Commit d0604ef

Browse files
committed
Major bug fix to correctly handle custom SQL "limited" queries on Oracle
1 parent 2d87a33 commit d0604ef

2 files changed

Lines changed: 11 additions & 21 deletions

File tree

lib/core/agent.py

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,6 @@ def nullAndCastField(self, field):
184184
@rtype: C{str}
185185
"""
186186

187-
if field.upper().endswith(", ROWNUM AS LIMIT"):
188-
return field
189-
190187
nulledCastedField = queries[kb.dbms].cast % field
191188
nulledCastedField = queries[kb.dbms].isnull % nulledCastedField
192189

@@ -257,15 +254,10 @@ def getFields(self, query):
257254
@rtype: C{str}
258255
"""
259256

260-
if query.startswith("SELECT ") and "(SELECT " in query:
261-
firstChar = "\\("
262-
else:
263-
firstChar = "\\A"
264-
265-
fieldsSelectTop = re.search("%sSELECT\s+TOP\s+[\d]+\s+(.+?)\s+FROM" % firstChar, query, re.I)
266-
fieldsSelectDistinct = re.search("%sSELECT\s+DISTINCT\((.+?)\)\s+FROM" % firstChar, query, re.I)
267-
fieldsSelectFrom = re.search("%sSELECT\s+(.+?)\s+FROM\s+" % firstChar, query, re.I)
268-
fieldsSelect = re.search("%sSELECT\s+(.*)" % firstChar, query, re.I)
257+
fieldsSelectTop = re.search("\ASELECT\s+TOP\s+[\d]+\s+(.+?)\s+FROM", query, re.I)
258+
fieldsSelectDistinct = re.search("\ASELECT\s+DISTINCT\((.+?)\)\s+FROM", query, re.I)
259+
fieldsSelectFrom = re.search("\ASELECT\s+(.+?)\s+FROM\s+", query, re.I)
260+
fieldsSelect = re.search("\ASELECT\s+(.*)", query, re.I)
269261
fieldsNoSelect = query
270262

271263
if fieldsSelectTop:
@@ -282,8 +274,9 @@ def getFields(self, query):
282274
fieldsToCastList = fieldsToCastStr.replace(", ", ",")
283275
fieldsToCastList = fieldsToCastList.split(",")
284276

285-
if query.startswith("SELECT ") and "(SELECT " in query:
286-
fieldsSelectFrom = None
277+
# TODO: really needed?!
278+
#if query.startswith("SELECT ") and "(SELECT " in query:
279+
# fieldsSelectFrom = None
287280

288281
return fieldsSelectFrom, fieldsSelect, fieldsNoSelect, fieldsSelectTop, fieldsToCastList, fieldsToCastStr
289282

@@ -331,21 +324,18 @@ def concatQuery(self, query):
331324
elif fieldsNoSelect:
332325
concatQuery = "CONCAT('%s',%s,'%s')" % (temp.start, concatQuery, temp.stop)
333326

334-
elif kb.dbms in ( "Oracle", "PostgreSQL" ):
327+
elif kb.dbms in ( "PostgreSQL", "Oracle" ):
335328
if fieldsSelectFrom:
336329
concatQuery = concatQuery.replace("SELECT ", "'%s'||" % temp.start, 1)
337330
concatQuery = concatQuery.replace(" FROM ", "||'%s' FROM " % temp.stop, 1)
338331
elif fieldsSelect:
339332
concatQuery = concatQuery.replace("SELECT ", "'%s'||" % temp.start, 1)
340333
concatQuery += "||'%s'" % temp.stop
341-
342-
if kb.dbms == "Oracle":
343-
concatQuery += " FROM DUAL"
344334
elif fieldsNoSelect:
345335
concatQuery = "'%s'||%s||'%s'" % (temp.start, concatQuery, temp.stop)
346336

347-
if kb.dbms == "Oracle":
348-
concatQuery += " FROM DUAL"
337+
if kb.dbms == "Oracle" and ( fieldsSelect or fieldsNoSelect ):
338+
concatQuery += " FROM DUAL"
349339

350340
elif kb.dbms == "Microsoft SQL Server":
351341
if fieldsSelectTop:

lib/core/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
" limit ",
8484
" offset ",
8585
" union all ",
86-
" rownum ", ),
86+
" rownum as ", ),
8787

8888
"SQL data definition": (
8989
"create ",

0 commit comments

Comments
 (0)