fork download
  1. from re import*
  2. def s(d,q):
  3. o,f,c=search(r' (?:all|(.*?)) from (\S+)(?:.*?\((.*)\))?',q,I).groups()
  4. for x,l,r in d:
  5. u=str.lower;h=bool;m=o and o.split(', ')or l;y=[]
  6. for g in r:
  7. _,*t=split('(?: (?:(and)|or) |^)(not )?(.*?)=',c or'',p:=0,I)
  8. while t:a,n,k,v,*t=t;p=h(a)&p&(b:=h(n)^any(i==u(k)and(j==eval(v)or list==type(j)and eval(v)in j)for i,j in zip(l,g)))|p|b
  9. if 1-h(c)|p:y+=[j for i,j in zip(l,g)for z in m if i==u(z)],
  10. if u(f)==x:print([m,y])
  11.  
  12. db = [
  13. ["data", ("d1", "d2", "3", "~!@#"), [(123, "", [980, "abc"], "false"), (456, "this isn't empty!", [[],[]], "-123.4444"), (1, "2", [3, 4], "five")]],
  14. ["no", ("yes", "a", "1.5", "what"), []]
  15. ]
  16.  
  17. s(db,"SELECT ALL FROM data")
  18. s(db,"SELECT D1 FROM DATA")
  19. s(db,"SELECT d1, 3 FROM data")
  20. s(db,"SELECT ALL FROM DATA WHERE (NOT d1=123)")
  21. s(db,"SELECT all FROM data WHERE (d1=123)")
  22. s(db,"SELECT ~!@# FROM DATA WHERE (3=[] OR d2=\"\")")
  23. s(db,"SELECT all FROM DATA WHERE (d1=2)")
  24. s(db,"select all from no")
  25. s(db,"select 3 from data where (3=980)")
  26. s(db,"SELECT ALL FROM DATA WHERE (3=[[],[]] AND ~!@#=\"-123.4444\")")
Success #stdin #stdout 0.16s 15496KB
stdin
Standard input is empty
stdout
[('d1', 'd2', '3', '~!@#'), [[123, '', [980, 'abc'], 'false'], [456, "this isn't empty!", [[], []], '-123.4444'], [1, '2', [3, 4], 'five']]]
[['D1'], [[123], [456], [1]]]
[['d1', '3'], [[123, [980, 'abc']], [456, [[], []]], [1, [3, 4]]]]
[('d1', 'd2', '3', '~!@#'), [[456, "this isn't empty!", [[], []], '-123.4444'], [1, '2', [3, 4], 'five']]]
[('d1', 'd2', '3', '~!@#'), [[123, '', [980, 'abc'], 'false']]]
[['~!@#'], [['false'], ['-123.4444']]]
[('d1', 'd2', '3', '~!@#'), []]
[('yes', 'a', '1.5', 'what'), []]
[['3'], [[[980, 'abc']]]]
[('d1', 'd2', '3', '~!@#'), [[456, "this isn't empty!", [[], []], '-123.4444']]]