for param in params:
sql = sql.replace(":" + param, param)
- parsed = parse(sql)
+ try:
+ parsed = parse(sql)
+ except:
+ # Propably it's a PyTables expression
+ for token in ['group by', 'order by', 'limit']:
+ res = re.search('(?i)where (.*)' + token, sql)
+ if res:
+ modified_sql = re.sub('(?i)where (.*)(' + token + ')', '\g<2>', sql)
+ parsed = parse(modified_sql)
+ parsed['where'] = res.group(1)
+ break
+
+ # Always a list of fields
if type(parsed['select']) is not list:
parsed['select'] = [parsed['select']]
operator = list(where)[0]
if operator in ['and', 'or']:
- subexpr = ["({})".format(_translate_where(q)) for q in where[operator]]
+ subexpr = [_translate_where(e) for e in where[operator]]
+ subexpr = filter(lambda e: e, subexpr)
+ subexpr = ["({})".format(e) for e in subexpr]
expr = " {} ".format(_operators[operator]).join(subexpr)
+ elif operator == 'exists':
+ pass
elif where == {'eq': ['rowid', 'p0']}:
nonlocal start, end
start = int(params['p0'])
return expr
if 'where' in parsed_sql:
- try:
+ if type(parsed_sql['where']) is dict:
query = _translate_where(parsed_sql['where'])
- except:
- # Probably it's a PyTables query
- query = str(parsed_sql['where'])[6:] # without where keyword
+ else:
+ query = parsed_sql['where']
# Limit number of rows
if 'limit' in parsed_sql:
for table_row in table_rows:
row = Row()
for field in fields:
- if field['value'] == 'rowid':
+ field_name = field['value']
+ if type(field_name) is dict and 'distinct' in field_name:
+ field_name = field_name['distinct']
+ if field_name == 'rowid':
row['rowid'] = int(table_row.nrow)
- elif field['value'] == '*':
+ elif field_name == '*':
for col in table.colnames:
value = table_row[col]
if type(value) is bytes:
value = value.decode('utf-8')
row[col] = value
else:
- row[field['value']] = table_row[field['value']]
+ row[field_name] = table_row[field_name]
rows.append(row)
# Prepare query description