diff --git a/mylib/oracle.py b/mylib/oracle.py index e74b835..3234884 100644 --- a/mylib/oracle.py +++ b/mylib/oracle.py @@ -49,6 +49,19 @@ class OracleDBUnsupportedWHEREClauses(OracleDBException, TypeError): ) +class OracleDBInvalidOrderByClause(OracleDBException, TypeError): + """ + Raised when trying to select on table with invalid + ORDER BY clause provided + """ + + def __init__(self, order_by): + super().__init__( + "Invalid ORDER BY clause: {order_by}. Must be a string or a list of two values (ordering field name and direction)", + order_by=order_by + ) + + class OracleDB: """ Oracle client """ @@ -352,7 +365,17 @@ class OracleDB: return False if order_by: - sql += ' ORDER BY {0}'.format(order_by) + if isinstance(order_by, str): + sql += ' ORDER BY {0}'.format(order_by) + elif ( + isinstance(order_by, (list, tuple)) and len(order_by) == 2 and + isinstance(order_by[0], str) and + isinstance(order_by[1], str) and + order_by[1].upper() in ('ASC', 'UPPER') + ): + sql += ' ORDER BY "{0}" {1}'.format(order_by[0], order_by[1].upper()) + else: + raise OracleDBInvalidOrderByClause(order_by) if just_try: log.debug("Just-try mode: execute SELECT query : %s", sql)