summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
authortreeform <starplant@gmail.com>2017-12-13 23:32:54 +0000
committertreeform <starplant@gmail.com>2017-12-14 18:36:17 +0000
commitc6b33de127ada9d715c16c7215f88cde7bb5a0c6 (patch)
tree0690a0690b1edbd72ccff15f2a25bb3c04904c4d /tests
parent6df6ec27ec573fc7f619f7bf9fece6d6b0dc931f (diff)
downloadNim-c6b33de127ada9d715c16c7215f88cde7bb5a0c6.tar.gz
fix
Diffstat (limited to 'tests')
-rw-r--r--tests/stdlib/tparsesql.nim438
1 files changed, 438 insertions, 0 deletions
diff --git a/tests/stdlib/tparsesql.nim b/tests/stdlib/tparsesql.nim
new file mode 100644
index 000000000..e73a1d7ee
--- /dev/null
+++ b/tests/stdlib/tparsesql.nim
@@ -0,0 +1,438 @@
+import unittest
+
+import sequtils
+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
+      FROM
+        table;
+    """
+
+  test "dont require ; at the end":
+    parseCheck "SELECT foo FROM table", """
+      SELECT
+        foo
+      FROM
+        table;
+    """
+
+  test "limit":
+    parseCheck "SELECT foo FROM table limit 10", """
+      SELECT
+        foo
+      FROM
+        table
+      LIMIT
+        10;
+    """
+
+  test "fields":
+    parseCheck "SELECT foo, bar, baz FROM table limit 10", """
+      SELECT
+        foo,
+        bar,
+        baz
+      FROM
+        table
+      LIMIT
+        10;
+    """
+
+  test "as_field":
+    parseCheck "SELECT foo AS bar FROM table", """
+      SELECT
+        foo AS bar
+      FROM
+        table;
+    """
+
+    parseCheck "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;
+    """
+
+  test "select *":
+    parseCheck "SELECT * FROM table", """
+      SELECT
+        *
+      FROM
+        table;
+    """
+    # TODO: COUNT(*)
+    #parseCheck "SELECT COUNT(*) FROM table", """
+    #  SELECT *
+    #  FROM table;
+    #"""
+
+  test "where":
+    parseCheck """
+      SELECT * FROM table
+      WHERE a = b and c = d
+    """, """
+      SELECT
+        *
+      FROM
+        table
+      WHERE
+        ((a = b) and (c = d));
+    """
+
+    parseCheck """
+      SELECT * FROM table
+      WHERE not b
+    """, """
+      SELECT
+        *
+      FROM
+        table
+      WHERE
+        (not b);
+    """
+
+    parseCheck """
+      SELECT
+        *
+      FROM
+        table
+      WHERE
+        a and not b
+    """, """
+      SELECT
+        *
+      FROM
+        table
+      WHERE
+        (a and (not b));
+    """
+
+    parseCheck """
+      SELECT *
+      FROM table
+      WHERE not a and not b
+    """, """
+      SELECT
+        *
+      FROM
+        table
+      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)));
+    """
+
+  test "having":
+    parseCheck """
+      SELECT * FROM table
+      HAVING a = b and c = d
+    """, """
+      SELECT
+        *
+      FROM
+        table
+      HAVING
+        ((a = b) and (c = d));
+    """
+
+  test "group by":
+    parseCheck """
+      SELECT a, b FROM table
+      GROUP BY a
+    """, """
+      SELECT
+        a,
+        b
+      FROM
+        table
+      GROUP BY
+        a;
+    """
+
+    parseCheck """
+      SELECT a, b FROM table
+      GROUP BY 1, 2
+    """, """
+      SELECT
+        a,
+        b
+      FROM
+        table
+      GROUP BY
+        1, 2;
+    """
+
+  test "as table":
+    parseCheck """
+      SELECT t.a FROM t as t
+    """, """
+      SELECT
+        t.a
+      FROM
+        t AS t;
+    """
+
+  test "subselects":
+    parseCheck """
+      SELECT a, b FROM (
+        SELECT * FROM t
+      )
+    """, """
+      SELECT
+        a,
+        b
+      FROM
+        (
+          SELECT
+            *
+          FROM
+            t
+        );
+    """
+
+    parseCheck """
+      SELECT a, b FROM (
+        SELECT * FROM t
+      ) as foo
+    """, """
+      SELECT
+        a,
+        b
+      FROM
+        (
+          SELECT
+            *
+          FROM
+            t
+        ) AS foo;
+    """
+
+    parseCheck """
+      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
+            (
+              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 b),
+        (SELECT * FROM c)
+    ""","""
+      SELECT
+        a,
+        b
+      FROM
+        (
+          SELECT
+            *
+          FROM
+            a
+        ), (
+          SELECT
+            *
+          FROM
+            b
+        ), (
+          SELECT
+            *
+          FROM
+            c
+        );
+    """
+
+  test "original test":
+    parseCheck """
+      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';
+    """, """
+      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');
+    """
+
+  test "joins":
+    parseCheck """
+      SELECT id FROM a
+      JOIN b
+      ON a.id == b.id
+    """, """
+      SELECT
+        id
+      FROM
+        a
+      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);
+    """