fix
This commit is contained in:
parent
c6b33de127
commit
08d7b5d031
2 changed files with 397 additions and 452 deletions
|
|
@ -662,10 +662,12 @@ proc getPrecedence(p: SqlParser): int =
|
||||||
elif isOpr(p, "=") or isOpr(p, "<") or isOpr(p, ">") or isOpr(p, ">=") or
|
elif isOpr(p, "=") or isOpr(p, "<") or isOpr(p, ">") or isOpr(p, ">=") or
|
||||||
isOpr(p, "<=") or isOpr(p, "<>") or isOpr(p, "!=") or isKeyw(p, "is") or
|
isOpr(p, "<=") or isOpr(p, "<>") or isOpr(p, "!=") or isKeyw(p, "is") or
|
||||||
isKeyw(p, "like"):
|
isKeyw(p, "like"):
|
||||||
result = 3
|
result = 4
|
||||||
elif isKeyw(p, "and"):
|
elif isKeyw(p, "and"):
|
||||||
result = 2
|
result = 3
|
||||||
elif isKeyw(p, "or"):
|
elif isKeyw(p, "or"):
|
||||||
|
result = 2
|
||||||
|
elif isKeyw(p, "between"):
|
||||||
result = 1
|
result = 1
|
||||||
elif p.tok.kind == tkOperator:
|
elif p.tok.kind == tkOperator:
|
||||||
# user-defined operator:
|
# user-defined operator:
|
||||||
|
|
@ -1015,6 +1017,8 @@ proc parseUpdate(p: var SqlParser): SqlNode =
|
||||||
|
|
||||||
proc parseDelete(p: var SqlParser): SqlNode =
|
proc parseDelete(p: var SqlParser): SqlNode =
|
||||||
getTok(p)
|
getTok(p)
|
||||||
|
if isOpr(p, "*"):
|
||||||
|
getTok(p)
|
||||||
result = newNode(nkDelete)
|
result = newNode(nkDelete)
|
||||||
eat(p, "from")
|
eat(p, "from")
|
||||||
result.add(primary(p))
|
result.add(primary(p))
|
||||||
|
|
@ -1156,7 +1160,7 @@ proc open(p: var SqlParser, input: Stream, filename: string) =
|
||||||
|
|
||||||
proc parse(p: var SqlParser): SqlNode =
|
proc parse(p: var SqlParser): SqlNode =
|
||||||
## parses the content of `p`'s input stream and returns the SQL AST.
|
## parses the content of `p`'s input stream and returns the SQL AST.
|
||||||
## Syntax errors raise an `EInvalidSql` exception.
|
## Syntax errors raise an `SqlParseError` exception.
|
||||||
result = newNode(nkStmtList)
|
result = newNode(nkStmtList)
|
||||||
while p.tok.kind != tkEof:
|
while p.tok.kind != tkEof:
|
||||||
parseStmt(p, result)
|
parseStmt(p, result)
|
||||||
|
|
@ -1173,7 +1177,7 @@ proc close(p: var SqlParser) =
|
||||||
proc parseSQL*(input: Stream, filename: string): SqlNode =
|
proc parseSQL*(input: Stream, filename: string): SqlNode =
|
||||||
## parses the SQL from `input` into an AST and returns the AST.
|
## parses the SQL from `input` into an AST and returns the AST.
|
||||||
## `filename` is only used for error messages.
|
## `filename` is only used for error messages.
|
||||||
## Syntax errors raise an `EInvalidSql` exception.
|
## Syntax errors raise an `SqlParseError` exception.
|
||||||
var p: SqlParser
|
var p: SqlParser
|
||||||
open(p, input, filename)
|
open(p, input, filename)
|
||||||
try:
|
try:
|
||||||
|
|
@ -1184,7 +1188,7 @@ proc parseSQL*(input: Stream, filename: string): SqlNode =
|
||||||
proc parseSQL*(input: string, filename=""): SqlNode =
|
proc parseSQL*(input: string, filename=""): SqlNode =
|
||||||
## parses the SQL from `input` into an AST and returns the AST.
|
## parses the SQL from `input` into an AST and returns the AST.
|
||||||
## `filename` is only used for error messages.
|
## `filename` is only used for error messages.
|
||||||
## Syntax errors raise an `EInvalidSql` exception.
|
## Syntax errors raise an `SqlParseError` exception.
|
||||||
parseSQL(newStringStream(input), "")
|
parseSQL(newStringStream(input), "")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1210,7 +1214,7 @@ proc addKeyw(s: var SqlWriter, thing: string) =
|
||||||
s.buffer.add(" ")
|
s.buffer.add(" ")
|
||||||
|
|
||||||
proc rm(s: var SqlWriter, chars = " \L,") =
|
proc rm(s: var SqlWriter, chars = " \L,") =
|
||||||
while s.buffer[^1] in chars:
|
while s.buffer.len > 0 and s.buffer[^1] in chars:
|
||||||
s.buffer = s.buffer[0..^2]
|
s.buffer = s.buffer[0..^2]
|
||||||
|
|
||||||
proc newLine(s: var SqlWriter) =
|
proc newLine(s: var SqlWriter) =
|
||||||
|
|
@ -1253,6 +1257,7 @@ proc ra(n: SqlNode, s: var SqlWriter) =
|
||||||
else:
|
else:
|
||||||
s.add("\"" & replace(n.strVal, "\"", "\"\"") & "\"")
|
s.add("\"" & replace(n.strVal, "\"", "\"\"") & "\"")
|
||||||
of nkStringLit:
|
of nkStringLit:
|
||||||
|
# TODO add e'' as an option?
|
||||||
s.add(escape(n.strVal, "'", "'"))
|
s.add(escape(n.strVal, "'", "'"))
|
||||||
of nkBitStringLit:
|
of nkBitStringLit:
|
||||||
s.add("b'" & n.strVal & "'")
|
s.add("b'" & n.strVal & "'")
|
||||||
|
|
@ -1329,17 +1334,19 @@ proc ra(n: SqlNode, s: var SqlWriter) =
|
||||||
assert n.len == 3
|
assert n.len == 3
|
||||||
s.addKeyw("insert into")
|
s.addKeyw("insert into")
|
||||||
ra(n.sons[0], s)
|
ra(n.sons[0], s)
|
||||||
|
s.add(" ")
|
||||||
ra(n.sons[1], s)
|
ra(n.sons[1], s)
|
||||||
if n.sons[2].kind == nkDefault:
|
if n.sons[2].kind == nkDefault:
|
||||||
s.addKeyw("default values")
|
s.addKeyw("default values")
|
||||||
else:
|
else:
|
||||||
s.newLine()
|
s.newLine()
|
||||||
ra(n.sons[2], s)
|
ra(n.sons[2], s)
|
||||||
|
s.rm(" ")
|
||||||
s.add(';')
|
s.add(';')
|
||||||
of nkUpdate:
|
of nkUpdate:
|
||||||
s.addKeyw("update")
|
s.innerKeyw("update"):
|
||||||
ra(n.sons[0], s)
|
ra(n.sons[0], s)
|
||||||
s.addKeyw("set")
|
s.innerKeyw("set"):
|
||||||
var L = n.len
|
var L = n.len
|
||||||
for i in 1 .. L-2:
|
for i in 1 .. L-2:
|
||||||
if i > 1: s.add(", ")
|
if i > 1: s.add(", ")
|
||||||
|
|
@ -1404,7 +1411,7 @@ proc ra(n: SqlNode, s: var SqlWriter) =
|
||||||
s.innerKeyw("having"):
|
s.innerKeyw("having"):
|
||||||
rs(n, s, "", "", ", ")
|
rs(n, s, "", "", ", ")
|
||||||
of nkOrder:
|
of nkOrder:
|
||||||
s.addKeyw("order by")
|
s.innerKeyw("order by"):
|
||||||
rs(n, s, "", "", ", ")
|
rs(n, s, "", "", ", ")
|
||||||
of nkJoin:
|
of nkJoin:
|
||||||
var joinType = n.sons[0].strVal
|
var joinType = n.sons[0].strVal
|
||||||
|
|
|
||||||
|
|
@ -1,273 +1,301 @@
|
||||||
import unittest
|
discard """
|
||||||
|
file: "tparsesql.nim"
|
||||||
import sequtils
|
output: '''select
|
||||||
import strutils
|
|
||||||
import parsesql
|
|
||||||
|
|
||||||
proc fold(str: string): string =
|
|
||||||
var
|
|
||||||
lines = str.split("\L")
|
|
||||||
minCount = 1000
|
|
||||||
while lines.len > 0 and lines[0].strip().len == 0:
|
|
||||||
lines.delete(0, 0)
|
|
||||||
while lines.len > 0 and lines[lines.len-1].strip().len == 0:
|
|
||||||
lines.delete(lines.len, lines.len)
|
|
||||||
for line in lines:
|
|
||||||
var count = 0
|
|
||||||
while line[count] == ' ':
|
|
||||||
inc count
|
|
||||||
if minCount > count:
|
|
||||||
minCount = count
|
|
||||||
for i, line in lines:
|
|
||||||
lines[i] = line[minCount..^1]
|
|
||||||
return lines.join("\L")
|
|
||||||
|
|
||||||
proc parseCheck(have: string, need: string) =
|
|
||||||
var
|
|
||||||
sql = parseSQL(have)
|
|
||||||
sqlHave = renderSQL(sql, true).strip()
|
|
||||||
sqlNeed = need.fold().strip()
|
|
||||||
var
|
|
||||||
haveLines = sqlHave.split("\L")
|
|
||||||
needLines = sqlNeed.split("\L")
|
|
||||||
for i in 0..<haveLines.len:
|
|
||||||
if haveLines[i] != needLines[i]:
|
|
||||||
echo ""
|
|
||||||
echo " --- have --- "
|
|
||||||
echo sqlHave
|
|
||||||
#echo repr(sql)
|
|
||||||
echo " --- need --- "
|
|
||||||
echo sqlNeed
|
|
||||||
echo " --- lines --- "
|
|
||||||
echo repr haveLines[i]
|
|
||||||
echo repr needLines[i]
|
|
||||||
echo "line: ", i
|
|
||||||
raise newException(Exception, "Two don't equal.")
|
|
||||||
|
|
||||||
|
|
||||||
suite "sql":
|
|
||||||
|
|
||||||
test "basic":
|
|
||||||
parseCheck "SELECT foo FROM table;", """
|
|
||||||
SELECT
|
|
||||||
foo
|
foo
|
||||||
FROM
|
from
|
||||||
table;
|
table;
|
||||||
"""
|
select
|
||||||
|
|
||||||
test "dont require ; at the end":
|
|
||||||
parseCheck "SELECT foo FROM table", """
|
|
||||||
SELECT
|
|
||||||
foo
|
foo
|
||||||
FROM
|
from
|
||||||
table;
|
table;
|
||||||
"""
|
select
|
||||||
|
|
||||||
test "limit":
|
|
||||||
parseCheck "SELECT foo FROM table limit 10", """
|
|
||||||
SELECT
|
|
||||||
foo
|
foo
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
LIMIT
|
limit
|
||||||
10;
|
10;
|
||||||
"""
|
select
|
||||||
|
|
||||||
test "fields":
|
|
||||||
parseCheck "SELECT foo, bar, baz FROM table limit 10", """
|
|
||||||
SELECT
|
|
||||||
foo,
|
foo,
|
||||||
bar,
|
bar,
|
||||||
baz
|
baz
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
LIMIT
|
limit
|
||||||
10;
|
10;
|
||||||
"""
|
select
|
||||||
|
foo as bar
|
||||||
test "as_field":
|
from
|
||||||
parseCheck "SELECT foo AS bar FROM table", """
|
|
||||||
SELECT
|
|
||||||
foo AS bar
|
|
||||||
FROM
|
|
||||||
table;
|
table;
|
||||||
"""
|
select
|
||||||
|
foo as foo_prime,
|
||||||
parseCheck "SELECT foo AS foo_prime, bar AS bar_prime, baz AS baz_prime FROM table", """
|
bar as bar_prime,
|
||||||
SELECT
|
baz as baz_prime
|
||||||
foo AS foo_prime,
|
from
|
||||||
bar AS bar_prime,
|
|
||||||
baz AS baz_prime
|
|
||||||
FROM
|
|
||||||
table;
|
table;
|
||||||
"""
|
select
|
||||||
|
|
||||||
test "select *":
|
|
||||||
parseCheck "SELECT * FROM table", """
|
|
||||||
SELECT
|
|
||||||
*
|
*
|
||||||
FROM
|
from
|
||||||
table;
|
table;
|
||||||
"""
|
select
|
||||||
# TODO: COUNT(*)
|
|
||||||
#parseCheck "SELECT COUNT(*) FROM table", """
|
|
||||||
# SELECT *
|
|
||||||
# FROM table;
|
|
||||||
#"""
|
|
||||||
|
|
||||||
test "where":
|
|
||||||
parseCheck """
|
|
||||||
SELECT * FROM table
|
|
||||||
WHERE a = b and c = d
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
*
|
*
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
WHERE
|
where
|
||||||
((a = b) and (c = d));
|
((a = b) and (c = d));
|
||||||
"""
|
select
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT * FROM table
|
|
||||||
WHERE not b
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
*
|
*
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
WHERE
|
where
|
||||||
(not b);
|
(not b);
|
||||||
"""
|
select
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT
|
|
||||||
*
|
*
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
WHERE
|
where
|
||||||
a and not b
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
*
|
|
||||||
FROM
|
|
||||||
table
|
|
||||||
WHERE
|
|
||||||
(a and (not b));
|
(a and (not b));
|
||||||
"""
|
select
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT *
|
|
||||||
FROM table
|
|
||||||
WHERE not a and not b
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
*
|
*
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
WHERE
|
where
|
||||||
((not a) and (not b));
|
|
||||||
"""
|
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT * FROM table
|
|
||||||
WHERE a = b and c = d or n is null and not b + 1 = 3
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
*
|
|
||||||
FROM
|
|
||||||
table
|
|
||||||
WHERE
|
|
||||||
(((a = b) and (c = d)) or ((n is null) and (((not b) + 1) = 3)));
|
(((a = b) and (c = d)) or ((n is null) and (((not b) + 1) = 3)));
|
||||||
"""
|
select
|
||||||
|
|
||||||
test "having":
|
|
||||||
parseCheck """
|
|
||||||
SELECT * FROM table
|
|
||||||
HAVING a = b and c = d
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
*
|
*
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
HAVING
|
having
|
||||||
((a = b) and (c = d));
|
((a = b) and (c = d));
|
||||||
"""
|
select
|
||||||
|
|
||||||
test "group by":
|
|
||||||
parseCheck """
|
|
||||||
SELECT a, b FROM table
|
|
||||||
GROUP BY a
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
a,
|
a,
|
||||||
b
|
b
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
GROUP BY
|
group by
|
||||||
a;
|
a;
|
||||||
"""
|
select
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT a, b FROM table
|
|
||||||
GROUP BY 1, 2
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
a,
|
a,
|
||||||
b
|
b
|
||||||
FROM
|
from
|
||||||
table
|
table
|
||||||
GROUP BY
|
group by
|
||||||
1, 2;
|
1, 2;
|
||||||
"""
|
select
|
||||||
|
|
||||||
test "as table":
|
|
||||||
parseCheck """
|
|
||||||
SELECT t.a FROM t as t
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
t.a
|
t.a
|
||||||
FROM
|
from
|
||||||
t AS t;
|
t as t;
|
||||||
"""
|
select
|
||||||
|
|
||||||
test "subselects":
|
|
||||||
parseCheck """
|
|
||||||
SELECT a, b FROM (
|
|
||||||
SELECT * FROM t
|
|
||||||
)
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
a,
|
a,
|
||||||
b
|
b
|
||||||
FROM
|
from
|
||||||
(
|
(
|
||||||
SELECT
|
select
|
||||||
*
|
*
|
||||||
FROM
|
from
|
||||||
t
|
t
|
||||||
);
|
);
|
||||||
"""
|
select
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT a, b FROM (
|
|
||||||
SELECT * FROM t
|
|
||||||
) as foo
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
a,
|
a,
|
||||||
b
|
b
|
||||||
FROM
|
from
|
||||||
(
|
(
|
||||||
SELECT
|
select
|
||||||
*
|
*
|
||||||
FROM
|
from
|
||||||
t
|
t
|
||||||
) AS foo;
|
) as foo;
|
||||||
"""
|
select
|
||||||
|
a,
|
||||||
|
b
|
||||||
|
from
|
||||||
|
(
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
(
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
(
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
(
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
inner as inner1
|
||||||
|
) as inner2
|
||||||
|
) as inner3
|
||||||
|
) as inner4
|
||||||
|
) as inner5;
|
||||||
|
select
|
||||||
|
a,
|
||||||
|
b
|
||||||
|
from
|
||||||
|
(
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
a
|
||||||
|
), (
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
b
|
||||||
|
), (
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
c
|
||||||
|
);
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
Products
|
||||||
|
where
|
||||||
|
(Price BETWEEN (10 AND 20));
|
||||||
|
select
|
||||||
|
id
|
||||||
|
from
|
||||||
|
a
|
||||||
|
join
|
||||||
|
b
|
||||||
|
on
|
||||||
|
(a.id == b.id);
|
||||||
|
select
|
||||||
|
id
|
||||||
|
from
|
||||||
|
a
|
||||||
|
join
|
||||||
|
(
|
||||||
|
select
|
||||||
|
id
|
||||||
|
from
|
||||||
|
c
|
||||||
|
) as b
|
||||||
|
on
|
||||||
|
(a.id == b.id);
|
||||||
|
select
|
||||||
|
id
|
||||||
|
from
|
||||||
|
a
|
||||||
|
INNER join
|
||||||
|
b
|
||||||
|
on
|
||||||
|
(a.id == b.id);
|
||||||
|
select
|
||||||
|
id
|
||||||
|
from
|
||||||
|
a
|
||||||
|
OUTER join
|
||||||
|
b
|
||||||
|
on
|
||||||
|
(a.id == b.id);
|
||||||
|
select
|
||||||
|
id
|
||||||
|
from
|
||||||
|
a
|
||||||
|
CROSS join
|
||||||
|
b
|
||||||
|
on
|
||||||
|
(a.id == b.id);
|
||||||
|
create type happiness as enum ('happy', 'very happy', 'ecstatic');
|
||||||
|
create table holidays(
|
||||||
|
num_weeks int,
|
||||||
|
happiness happiness);
|
||||||
|
create index table1_attr1 on table1(attr1);
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
myTab
|
||||||
|
where
|
||||||
|
(col1 = 'happy');
|
||||||
|
|
||||||
parseCheck """
|
insert into Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
|
||||||
SELECT a, b FROM (
|
values ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway');
|
||||||
|
insert into TableName default values;
|
||||||
|
|
||||||
|
update
|
||||||
|
Customers
|
||||||
|
set
|
||||||
|
ContactName = 'Alfred Schmidt', City = 'Frankfurt'
|
||||||
|
where
|
||||||
|
(CustomerID = 1);
|
||||||
|
delete from table_name;
|
||||||
|
delete from table_name;
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
Customers;
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
Customers
|
||||||
|
where
|
||||||
|
((((CustomerName LIKE 'L%') OR (CustomerName LIKE 'R%')) OR (CustomerName LIKE 'W%')) AND (Country = 'USA'))
|
||||||
|
order by
|
||||||
|
CustomerName;
|
||||||
|
|
||||||
|
'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
import parsesql
|
||||||
|
|
||||||
|
echo $parseSQL "SELECT foo FROM table;"
|
||||||
|
echo $parseSQL "SELECT foo FROM table"
|
||||||
|
echo $parseSQL "SELECT foo FROM table limit 10"
|
||||||
|
echo $parseSQL "SELECT foo, bar, baz FROM table limit 10"
|
||||||
|
echo $parseSQL "SELECT foo AS bar FROM table"
|
||||||
|
echo $parseSQL "SELECT foo AS foo_prime, bar AS bar_prime, baz AS baz_prime FROM table"
|
||||||
|
echo $parseSQL "SELECT * FROM table"
|
||||||
|
#TODO add count(*)
|
||||||
|
#echo $parseSQL "SELECT COUNT(*) FROM table"
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT * FROM table
|
||||||
|
WHERE a = b and c = d
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT * FROM table
|
||||||
|
WHERE not b
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT
|
||||||
|
*
|
||||||
|
FROM
|
||||||
|
table
|
||||||
|
WHERE
|
||||||
|
a and not b
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT * FROM table
|
||||||
|
WHERE a = b and c = d or n is null and not b + 1 = 3
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT * FROM table
|
||||||
|
HAVING a = b and c = d
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT a, b FROM table
|
||||||
|
GROUP BY a
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT a, b FROM table
|
||||||
|
GROUP BY 1, 2
|
||||||
|
"""
|
||||||
|
echo $parseSQL "SELECT t.a FROM t as t"
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT a, b FROM (
|
||||||
|
SELECT * FROM t
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT a, b FROM (
|
||||||
|
SELECT * FROM t
|
||||||
|
) as foo
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
SELECT a, b FROM (
|
||||||
SELECT * FROM (
|
SELECT * FROM (
|
||||||
SELECT * FROM (
|
SELECT * FROM (
|
||||||
SELECT * FROM (
|
SELECT * FROM (
|
||||||
|
|
@ -275,164 +303,74 @@ suite "sql":
|
||||||
) as inner2
|
) as inner2
|
||||||
) as inner3
|
) as inner3
|
||||||
) as inner4
|
) as inner4
|
||||||
) as inner5
|
) as inner5
|
||||||
""", """
|
"""
|
||||||
SELECT
|
echo $parseSQL """
|
||||||
a,
|
SELECT a, b FROM
|
||||||
b
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
SELECT
|
|
||||||
*
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
SELECT
|
|
||||||
*
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
SELECT
|
|
||||||
*
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
SELECT
|
|
||||||
*
|
|
||||||
FROM
|
|
||||||
inner AS inner1
|
|
||||||
) AS inner2
|
|
||||||
) AS inner3
|
|
||||||
) AS inner4
|
|
||||||
) AS inner5;
|
|
||||||
"""
|
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT a, b FROM
|
|
||||||
(SELECT * FROM a),
|
(SELECT * FROM a),
|
||||||
(SELECT * FROM b),
|
(SELECT * FROM b),
|
||||||
(SELECT * FROM c)
|
(SELECT * FROM c)
|
||||||
""","""
|
"""
|
||||||
SELECT
|
echo $parseSQL """
|
||||||
a,
|
SELECT * FROM Products
|
||||||
b
|
WHERE Price BETWEEN 10 AND 20;
|
||||||
FROM
|
"""
|
||||||
(
|
echo $parseSQL """
|
||||||
SELECT
|
SELECT id FROM a
|
||||||
*
|
JOIN b
|
||||||
FROM
|
ON a.id == b.id
|
||||||
a
|
"""
|
||||||
), (
|
echo $parseSQL """
|
||||||
SELECT
|
SELECT id FROM a
|
||||||
*
|
JOIN (SELECT id from c) as b
|
||||||
FROM
|
ON a.id == b.id
|
||||||
b
|
"""
|
||||||
), (
|
echo $parseSQL """
|
||||||
SELECT
|
SELECT id FROM a
|
||||||
*
|
INNER JOIN b
|
||||||
FROM
|
ON a.id == b.id
|
||||||
c
|
"""
|
||||||
);
|
echo $parseSQL """
|
||||||
"""
|
SELECT id FROM a
|
||||||
|
OUTER JOIN b
|
||||||
test "original test":
|
ON a.id == b.id
|
||||||
parseCheck """
|
"""
|
||||||
CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');
|
echo $parseSQL """
|
||||||
CREATE TABLE holidays (
|
SELECT id FROM a
|
||||||
|
CROSS JOIN b
|
||||||
|
ON a.id == b.id
|
||||||
|
"""
|
||||||
|
echo $parseSQL """
|
||||||
|
CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');
|
||||||
|
CREATE TABLE holidays (
|
||||||
num_weeks int,
|
num_weeks int,
|
||||||
happiness happiness
|
happiness happiness
|
||||||
);
|
);
|
||||||
CREATE INDEX table1_attr1 ON table1(attr1);
|
CREATE INDEX table1_attr1 ON table1(attr1);
|
||||||
|
SELECT * FROM myTab WHERE col1 = 'happy';
|
||||||
SELECT * FROM myTab WHERE col1 = 'happy';
|
"""
|
||||||
""", """
|
echo $parseSQL """
|
||||||
CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');
|
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
|
||||||
CREATE TABLE holidays(
|
VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway');
|
||||||
num_weeks int,
|
"""
|
||||||
happiness happiness);
|
echo $parseSQL """
|
||||||
CREATE INDEX table1_attr1 ON table1(attr1);
|
INSERT INTO TableName DEFAULT VALUES
|
||||||
SELECT
|
"""
|
||||||
*
|
echo $parseSQL """
|
||||||
FROM
|
UPDATE Customers
|
||||||
myTab
|
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
|
||||||
WHERE
|
WHERE CustomerID = 1;
|
||||||
(col1 = 'happy');
|
"""
|
||||||
"""
|
echo $parseSQL "DELETE FROM table_name;"
|
||||||
|
echo $parseSQL "DELETE * FROM table_name;"
|
||||||
test "joins":
|
echo $parseSQL """
|
||||||
parseCheck """
|
--Select all:
|
||||||
SELECT id FROM a
|
SELECT * FROM Customers;
|
||||||
JOIN b
|
"""
|
||||||
ON a.id == b.id
|
echo $parseSQL """
|
||||||
""", """
|
SELECT * FROM Customers WHERE (CustomerName LIKE 'L%'
|
||||||
SELECT
|
OR CustomerName LIKE 'R%' /*OR CustomerName LIKE 'S%'
|
||||||
id
|
OR CustomerName LIKE 'T%'*/ OR CustomerName LIKE 'W%')
|
||||||
FROM
|
AND Country='USA'
|
||||||
a
|
ORDER BY CustomerName;
|
||||||
JOIN
|
"""
|
||||||
b
|
|
||||||
ON
|
|
||||||
(a.id == b.id);
|
|
||||||
"""
|
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT id FROM a
|
|
||||||
JOIN (SELECT id from c) as b
|
|
||||||
ON a.id == b.id
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
id
|
|
||||||
FROM
|
|
||||||
a
|
|
||||||
JOIN
|
|
||||||
(
|
|
||||||
SELECT
|
|
||||||
id
|
|
||||||
FROM
|
|
||||||
c
|
|
||||||
) AS b
|
|
||||||
ON
|
|
||||||
(a.id == b.id);
|
|
||||||
"""
|
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT id FROM a
|
|
||||||
INNER JOIN b
|
|
||||||
ON a.id == b.id
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
id
|
|
||||||
FROM
|
|
||||||
a
|
|
||||||
INNER JOIN
|
|
||||||
b
|
|
||||||
ON
|
|
||||||
(a.id == b.id);
|
|
||||||
"""
|
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT id FROM a
|
|
||||||
OUTER JOIN b
|
|
||||||
ON a.id == b.id
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
id
|
|
||||||
FROM
|
|
||||||
a
|
|
||||||
OUTER JOIN
|
|
||||||
b
|
|
||||||
ON
|
|
||||||
(a.id == b.id);
|
|
||||||
"""
|
|
||||||
|
|
||||||
parseCheck """
|
|
||||||
SELECT id FROM a
|
|
||||||
CROSS JOIN b
|
|
||||||
ON a.id == b.id
|
|
||||||
""", """
|
|
||||||
SELECT
|
|
||||||
id
|
|
||||||
FROM
|
|
||||||
a
|
|
||||||
CROSS JOIN
|
|
||||||
b
|
|
||||||
ON
|
|
||||||
(a.id == b.id);
|
|
||||||
"""
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue