This commit is contained in:
treeform 2017-12-14 18:31:43 +00:00
commit ee5a76fd9d
2 changed files with 196 additions and 396 deletions

View file

@ -1,346 +1,149 @@
discard """
file: "tparsesql.nim"
output: '''select
foo
from
table;
select
foo
from
table;
select
foo
from
table
limit
10;
select
foo,
bar,
baz
from
table
limit
10;
select
foo as bar
from
table;
select
foo as foo_prime,
bar as bar_prime,
baz as baz_prime
from
table;
select
*
from
table;
select
*
from
table
where
((a = b) and (c = d));
select
*
from
table
where
(not b);
select
*
from
table
where
(a and (not b));
select
*
from
table
where
(((a = b) and (c = d)) or ((n is null) and (((not b) + 1) = 3)));
select
*
from
table
having
((a = b) and (c = d));
select
a,
b
from
table
group by
a;
select
a,
b
from
table
group by
1, 2;
select
t.a
from
t as t;
select
a,
b
from
(
select
*
from
t
);
select
a,
b
from
(
select
*
from
t
) 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');
insert into Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
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"
doAssert $parseSQL("SELECT foo FROM table;") == "select foo from table;"
doAssert $parseSQL("""
SELECT
CustomerName,
ContactName,
Address,
City,
PostalCode,
Country,
CustomerName,
ContactName,
Address,
City,
PostalCode,
Country
FROM table;""") == "select CustomerName, ContactName, Address, City, PostalCode, Country, CustomerName, ContactName, Address, City, PostalCode, Country from table;"
doAssert $parseSQL("SELECT foo FROM table limit 10") == "select foo from table limit 10;"
doAssert $parseSQL("SELECT foo, bar, baz FROM table limit 10") == "select foo, bar, baz from table limit 10;"
doAssert $parseSQL("SELECT foo AS bar FROM table") == "select foo as bar from table;"
doAssert $parseSQL("SELECT foo AS foo_prime, bar AS bar_prime, baz AS baz_prime FROM table") == "select foo as foo_prime, bar as bar_prime, baz as baz_prime from table;"
doAssert $parseSQL("SELECT * FROM table") == "select * from table;"
#TODO add count(*)
#echo $parseSQL "SELECT COUNT(*) FROM table"
echo $parseSQL """
#doAssert $parseSQL("SELECT COUNT(*) FROM table"
doAssert $parseSQL("""
SELECT * FROM table
WHERE a = b and c = d
"""
echo $parseSQL """
""") == "select * from table where a = b and c = d;"
doAssert $parseSQL("""
SELECT * FROM table
WHERE not b
"""
echo $parseSQL """
""") == "select * from table where not b;"
doAssert $parseSQL("""
SELECT
*
FROM
table
WHERE
a and not b
"""
echo $parseSQL """
""") == "select * from table where a and not b;"
doAssert $parseSQL("""
SELECT * FROM table
WHERE a = b and c = d or n is null and not b + 1 = 3
"""
echo $parseSQL """
""") == "select * from table where a = b and c = d or n is null and not b + 1 = 3;"
doAssert $parseSQL("""
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);"
doAssert $parseSQL("""
SELECT * FROM table
HAVING a = b and c = d
"""
echo $parseSQL """
""") == "select * from table having a = b and c = d;"
doAssert $parseSQL("""
SELECT a, b FROM table
GROUP BY a
"""
echo $parseSQL """
""") == "select a, b from table group by a;"
doAssert $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 table group by 1, 2;"
doAssert $parseSQL("SELECT t.a FROM t as t") == "select t.a from t as t;"
doAssert $parseSQL("""
SELECT a, b FROM (
SELECT * FROM t
)
"""
echo $parseSQL """
""") == "select a, b from(select * from t);"
doAssert $parseSQL("""
SELECT a, b FROM (
SELECT * FROM t
) as foo
"""
echo $parseSQL """
""") == "select a, b from(select * from t) as foo;"
doAssert $parseSQL("""
SELECT a, b FROM (
SELECT * FROM (
SELECT * FROM (
SELECT * FROM (
SELECT * FROM inner as inner1
SELECT * FROM innerTable as inner1
) as inner2
) as inner3
) as inner4
) as inner5
"""
echo $parseSQL """
""") == "select a, b from(select * from(select * from(select * from(select * from innerTable as inner1) as inner2) as inner3) as inner4) as inner5;"
doAssert $parseSQL("""
SELECT a, b FROM
(SELECT * FROM a),
(SELECT * FROM b),
(SELECT * FROM c)
"""
echo $parseSQL """
""") == "select a, b from(select * from a),(select * from b),(select * from c);"
doAssert $parseSQL("""
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20;
"""
echo $parseSQL """
""") == "select * from Products where Price between 10 and 20;"
doAssert $parseSQL("""
SELECT id FROM a
JOIN b
ON a.id == b.id
"""
echo $parseSQL """
""") == "select id from a join b on a.id == b.id;"
doAssert $parseSQL("""
SELECT id FROM a
JOIN (SELECT id from c) as b
ON a.id == b.id
"""
echo $parseSQL """
""") == "select id from a join(select id from c) as b on a.id == b.id;"
doAssert $parseSQL("""
SELECT id FROM a
INNER JOIN b
ON a.id == b.id
"""
echo $parseSQL """
""") == "select id from a inner join b on a.id == b.id;"
doAssert $parseSQL("""
SELECT id FROM a
OUTER JOIN b
ON a.id == b.id
"""
echo $parseSQL """
""") == "select id from a outer join b on a.id == b.id;"
doAssert $parseSQL("""
SELECT id FROM a
CROSS JOIN b
ON a.id == b.id
"""
echo $parseSQL """
""") == "select id from a cross join b on a.id == b.id;"
doAssert $parseSQL("""
CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');
CREATE TABLE holidays (
num_weeks int,
@ -348,29 +151,41 @@ CREATE TABLE holidays (
);
CREATE INDEX table1_attr1 ON table1(attr1);
SELECT * FROM myTab WHERE col1 = 'happy';
"""
echo $parseSQL """
""") == "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';"
doAssert $parseSQL("""
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway');
"""
echo $parseSQL """
""") == "insert into Customers (CustomerName , ContactName , Address , City , PostalCode , Country ) values ('Cardinal' , 'Tom B. Erichsen' , 'Skagen 21' , 'Stavanger' , '4006' , 'Norway' );"
doAssert $parseSQL("""
INSERT INTO TableName DEFAULT VALUES
"""
echo $parseSQL """
""") == "insert into TableName default values;"
doAssert $parseSQL("""
UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1;
"""
echo $parseSQL "DELETE FROM table_name;"
echo $parseSQL "DELETE * FROM table_name;"
echo $parseSQL """
""") == "update Customers set ContactName = 'Alfred Schmidt' , City = 'Frankfurt' where CustomerID = 1;"
doAssert $parseSQL("DELETE FROM table_name;") == "delete from table_name;"
doAssert $parseSQL("DELETE * FROM table_name;") == "delete from table_name;"
doAssert $parseSQL("""
--Select all:
SELECT * FROM Customers;
"""
echo $parseSQL """
""") == "select * from Customers;"
doAssert $parseSQL("""
SELECT * FROM Customers WHERE (CustomerName LIKE 'L%'
OR CustomerName LIKE 'R%' /*OR CustomerName LIKE 'S%'
OR CustomerName LIKE 'T%'*/ OR CustomerName LIKE 'W%')
AND Country='USA'
ORDER BY CustomerName;
"""
""") == "select * from Customers where(CustomerName like 'L%' or CustomerName like 'R%' or CustomerName like 'W%') and Country = 'USA' order by CustomerName;"
# parse keywords as identifires
doAssert $parseSQL("""
SELECT `SELECT`, `FROM` as `GROUP` FROM `WHERE`;
""") == """select "SELECT", "FROM" as "GROUP" from "WHERE";"""