github.com/runner-mei/ql@v1.1.0/parser_test.go (about) 1 // Copyright 2014 The ql Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package ql 6 7 import ( 8 "testing" 9 ) 10 11 func TestParser0(t *testing.T) { 12 table := []struct { 13 src string 14 ok bool 15 }{ 16 {"", true}, 17 {";", true}, 18 {"CREATE", false}, 19 {"CREATE TABLE", false}, 20 {"CREATE TABLE foo (", false}, 21 // 5 22 {"CREATE TABLE foo ()", false}, 23 {"CREATE TABLE foo ();", false}, 24 {"CREATE TABLE foo (a byte)", true}, 25 {"CREATE TABLE foo (a uint8);", true}, 26 {"CREATE TABLE foo (a uint16, b uint32)", true}, 27 // 10 28 {"CREATE TABLE foo (a uint64, b bool);", true}, 29 {"CREATE TABLE foo (a int8, b int16) CREATE TABLE bar (x int32, y int64)", false}, 30 {"CREATE TABLE foo (a int, b float32); CREATE TABLE bar (x float64, y float)", true}, 31 {"INSERT INTO foo VALUES (1234)", true}, 32 {"INSERT INTO foo VALUES (1234, 5678)", true}, 33 // 15 34 {"INSERT INTO foo VALUES (1 || 2)", false}, 35 {"INSERT INTO foo VALUES (1 | 2)", true}, 36 {"INSERT INTO foo VALUES (false || true)", true}, 37 {"INSERT INTO foo VALUES (id())", true}, 38 {"INSERT INTO foo VALUES (bar(5678))", false}, 39 // 20 40 {"INSERT INTO foo VALUES ()", false}, 41 {"CREATE TABLE foo (a.b, b);", false}, 42 {"CREATE TABLE foo (a, b.c);", false}, 43 {"SELECT * FROM t", true}, 44 {"SELECT * FROM t AS u", true}, 45 // 25 46 {"SELECT * FROM t, v", true}, 47 {"SELECT * FROM t AS u, v", true}, 48 {"SELECT * FROM t, v AS w", true}, 49 {"SELECT * FROM t AS u, v AS w", true}, 50 {"SELECT * FROM foo, bar, foo", true}, 51 // 30 52 {"CREATE TABLE foo (a bytes)", false}, 53 {"SELECT DISTINCTS * FROM t", false}, 54 {"SELECT DISTINCT * FROM t", true}, 55 {"INSERT INTO foo (a) VALUES (42)", true}, 56 {"INSERT INTO foo (a,) VALUES (42,)", true}, 57 // 35 58 {"INSERT INTO foo (a,b) VALUES (42,314)", true}, 59 {"INSERT INTO foo (a,b,) VALUES (42,314)", true}, 60 {"INSERT INTO foo (a,b,) VALUES (42,314,)", true}, 61 {"CREATE TABLE foo (a uint16, b uint32,)", true}, 62 {"CREATE TABLE foo (a uint16, b uint32,) -- foo", true}, 63 // 40 64 {"CREATE TABLE foo (a uint16, b uint32,) // foo", true}, 65 {"CREATE TABLE foo (a uint16, b uint32,) /* foo */", true}, 66 {"CREATE TABLE foo /* foo */ (a uint16, b uint32,) /* foo */", true}, 67 {`-- Examples 68 ALTER TABLE Stock ADD Qty int; 69 70 ALTER TABLE Income DROP COLUMN Taxes; 71 72 CREATE TABLE department 73 ( 74 DepartmentID int, 75 DepartmentName string, // optional comma 76 ); 77 78 CREATE TABLE employee 79 ( 80 LastName string, 81 DepartmentID int // optional comma 82 ); 83 84 DROP TABLE Inventory; 85 86 INSERT INTO department (DepartmentID) VALUES (42); 87 88 INSERT INTO department ( 89 DepartmentName, 90 DepartmentID, 91 ) 92 VALUES ( 93 "R&D", 94 42, 95 ); 96 97 INSERT INTO department VALUES ( 98 42, 99 "R&D", 100 ); 101 102 SELECT * FROM Stock; 103 104 SELECT DepartmentID 105 FROM department 106 WHERE DepartmentID == 42 107 ORDER BY DepartmentName; 108 109 SELECT employee.LastName 110 FROM department, employee 111 WHERE department.DepartmentID == employee.DepartmentID 112 ORDER BY DepartmentID; 113 114 SELECT a.b, c.d 115 FROM 116 x AS a, 117 ( 118 SELECT * FROM y; // optional semicolon 119 ) AS c 120 WHERE a.e > c.e; 121 122 SELECT a.b, c.d 123 FROM 124 x AS a, 125 ( 126 SELECT * FROM y // no semicolon 127 ) AS c 128 WHERE a.e > c.e; 129 130 TRUNCATE TABLE department; 131 132 SELECT DepartmentID 133 FROM department 134 WHERE DepartmentID == ?1 135 ORDER BY DepartmentName; 136 137 SELECT employee.LastName 138 FROM department, employee 139 WHERE department.DepartmentID == $1 && employee.LastName > $2 140 ORDER BY DepartmentID; 141 142 `, true}, 143 {"BEGIN TRANSACTION", true}, 144 // 45 145 {"COMMIT", true}, 146 {"ROLLBACK", true}, 147 {` 148 BEGIN TRANSACTION; 149 INSERT INTO foo VALUES (42, 3.14); 150 INSERT INTO foo VALUES (-1, 2.78); 151 COMMIT;`, true}, 152 {` 153 BEGIN TRANSACTION; 154 INSERT INTO AccountA (Amount) VALUES ($1); 155 INSERT INTO AccountB (Amount) VALUES (-$1); 156 COMMIT;`, true}, 157 {` // A 158 BEGIN TRANSACTION; 159 INSERT INTO tmp SELECT * from bar; 160 SELECT * from tmp; 161 162 // B 163 ROLLBACK;`, true}, 164 // 50 165 {`-- 6 166 ALTER TABLE none DROP COLUMN c1; 167 `, true}, 168 } 169 170 for i, test := range table { 171 //dbg("%d ----\n%q\n----\n", i, test.src) 172 l := newLexer(test.src) 173 ok := yyParse(l) == 0 174 if g, e := ok, test.ok; g != e { 175 if !ok { 176 t.Log(l.errs[0]) 177 } 178 t.Error(i, test.src, g, e) 179 return 180 } 181 182 switch ok { 183 case true: 184 if len(l.errs) != 0 { 185 t.Fatal(l.errs) 186 } 187 case false: 188 if len(l.errs) == 0 { 189 t.Fatal(l.errs) 190 } 191 } 192 } 193 }