Take in input a query string and return its fields (columns) and more details. Example: Input: SELECT user, password FROM mysql.user Output: user,password @param query: query to be processed @type query: C{str} @return: query fiel
(self, query)
| 579 | return nulledCastedConcatFields |
| 580 | |
| 581 | def getFields(self, query): |
| 582 | """ |
| 583 | Take in input a query string and return its fields (columns) and |
| 584 | more details. |
| 585 | |
| 586 | Example: |
| 587 | |
| 588 | Input: SELECT user, password FROM mysql.user |
| 589 | Output: user,password |
| 590 | |
| 591 | @param query: query to be processed |
| 592 | @type query: C{str} |
| 593 | |
| 594 | @return: query fields (columns) and more details |
| 595 | @rtype: C{str} |
| 596 | """ |
| 597 | |
| 598 | prefixRegex = r"(?:\s+(?:FIRST|SKIP|LIMIT(?: \d+)?)\s+\d+)*" |
| 599 | fieldsSelectTop = re.search(r"\ASELECT\s+TOP(\s+\d+|\s*\([^)]+\))\s+(.+?)\s+FROM", query, re.I) |
| 600 | fieldsSelectRownum = re.search(r"\ASELECT\s+([^()]+?),\s*ROWNUM AS LIMIT FROM", query, re.I) |
| 601 | fieldsSelectDistinct = re.search(r"\ASELECT%s\s+DISTINCT\((.+?)\)\s+FROM" % prefixRegex, query, re.I) |
| 602 | fieldsSelectCase = re.search(r"\ASELECT%s\s+(\(CASE WHEN\s+.+\s+END\))" % prefixRegex, query, re.I) |
| 603 | fieldsSelectFrom = re.search(r"\ASELECT%s\s+(.+?)\s+FROM " % prefixRegex, query, re.I) |
| 604 | fieldsExists = re.search(r"EXISTS\(([^)]*)\)\Z", query, re.I) |
| 605 | fieldsSelect = re.search(r"\ASELECT%s\s+(.*)" % prefixRegex, query, re.I) |
| 606 | fieldsSubstr = re.search(r"\A(SUBSTR|MID\()", query, re.I) |
| 607 | fieldsMinMaxstr = re.search(r"(?:MIN|MAX)\(([^\(\)]+)\)", query, re.I) |
| 608 | fieldsNoSelect = query |
| 609 | |
| 610 | _ = zeroDepthSearch(query, " FROM ") |
| 611 | if not _: |
| 612 | fieldsSelectFrom = None |
| 613 | |
| 614 | if re.search(r"\bWHERE\b.+(MIN|MAX)", query, re.I): |
| 615 | fieldsMinMaxstr = None |
| 616 | |
| 617 | fieldsToCastStr = fieldsNoSelect |
| 618 | |
| 619 | if fieldsSubstr: |
| 620 | fieldsToCastStr = query |
| 621 | elif fieldsMinMaxstr: |
| 622 | fieldsToCastStr = fieldsMinMaxstr.group(1) |
| 623 | elif fieldsExists: |
| 624 | if fieldsSelect: |
| 625 | fieldsToCastStr = fieldsSelect.group(1) |
| 626 | elif fieldsSelectTop: |
| 627 | fieldsToCastStr = fieldsSelectTop.group(2) |
| 628 | elif fieldsSelectRownum: |
| 629 | fieldsToCastStr = fieldsSelectRownum.group(1) |
| 630 | elif fieldsSelectDistinct: |
| 631 | if Backend.getDbms() in (DBMS.HSQLDB,): |
| 632 | fieldsToCastStr = fieldsNoSelect |
| 633 | else: |
| 634 | fieldsToCastStr = fieldsSelectDistinct.group(1) |
| 635 | elif fieldsSelectCase: |
| 636 | fieldsToCastStr = fieldsSelectCase.group(1) |
| 637 | elif fieldsSelectFrom: |
| 638 | fieldsToCastStr = query[:unArrayizeValue(_)] if _ else query |
no test coverage detected