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  }