2016-02-26 17:27:07 +00:00
// Copyright © 2016 Abcum Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2016-05-23 12:32:02 +00:00
package sql
2016-02-26 17:27:07 +00:00
import (
"testing"
2016-05-23 12:32:02 +00:00
"time"
2016-02-26 17:27:07 +00:00
2016-05-23 12:32:02 +00:00
"github.com/abcum/fibre"
2016-02-26 17:27:07 +00:00
. "github.com/smartystreets/goconvey/convey"
)
type tester struct {
skip bool
sql string
err string
2016-05-23 12:32:02 +00:00
res Statement
2016-02-26 17:27:07 +00:00
}
func testerr ( err error ) string {
if err != nil {
return err . Error ( )
}
return ""
}
2016-05-23 12:32:02 +00:00
var c * fibre . Context
2016-02-26 17:27:07 +00:00
2016-05-23 12:32:02 +00:00
func testsql ( t * testing . T , test tester ) {
2016-02-26 17:27:07 +00:00
if test . skip {
Convey ( " ❗️ " + test . sql , t , nil )
return
}
2016-05-23 12:32:02 +00:00
s , e := ParseString ( c , test . sql )
2016-02-26 17:27:07 +00:00
Convey ( test . sql , t , func ( ) {
if test . err == "" {
So ( e , ShouldBeNil )
So ( s , ShouldResemble , test . res )
}
if test . err != "" {
Convey ( testerr ( e ) , func ( ) {
So ( testerr ( e ) , ShouldResemble , test . err )
} )
}
} )
}
2016-05-23 12:32:02 +00:00
func TestMain ( t * testing . T ) {
c = fibre . NewContext ( nil , nil , nil )
c . Set ( "KV" , "" )
c . Set ( "NS" , "" )
c . Set ( "DB" , "" )
}
2016-02-26 17:27:07 +00:00
// Ensure the parser can parse a multi-statement query.
func Test_Parse_General ( t * testing . T ) {
s := ` SELECT a FROM b `
2016-05-23 12:32:02 +00:00
q , err := ParseString ( c , s )
2016-02-26 17:27:07 +00:00
if err != nil {
t . Fatalf ( "unexpected error: %s" , err )
} else if len ( q . Statements ) != 1 {
t . Fatalf ( "unexpected statement count: %d" , len ( q . Statements ) )
}
}
// Ensure the parser can parse a multi-statement query.
func Test_Parse_General_Single ( t * testing . T ) {
s := ` SELECT a FROM b `
2016-05-23 12:32:02 +00:00
q , err := ParseString ( c , s )
2016-02-26 17:27:07 +00:00
if err != nil {
t . Fatalf ( "unexpected error: %s" , err )
} else if len ( q . Statements ) != 1 {
t . Fatalf ( "unexpected statement count: %d" , len ( q . Statements ) )
}
}
// Ensure the parser can parse a multi-statement query.
func Test_Parse_General_Multi ( t * testing . T ) {
s := ` SELECT a FROM b; SELECT c FROM d `
2016-05-23 12:32:02 +00:00
q , err := ParseString ( c , s )
2016-02-26 17:27:07 +00:00
if err != nil {
t . Fatalf ( "unexpected error: %s" , err )
} else if len ( q . Statements ) != 2 {
t . Fatalf ( "unexpected statement count: %d" , len ( q . Statements ) )
}
}
func Test_Parse_Queries_Malformed ( t * testing . T ) {
var tests = [ ] tester {
2016-05-23 12:32:02 +00:00
{
sql : ` ` ,
err : "Your SQL query is empty" ,
} ,
2016-02-26 17:27:07 +00:00
{
sql : "SELECT ` FROM person" ,
2016-02-27 12:02:41 +00:00
err : "Found ` FROM person` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT ' FROM person ` ,
2016-02-27 12:02:41 +00:00
err : "Found ` FROM person` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT " FROM person ` ,
2016-02-27 12:02:41 +00:00
err : "Found ` FROM person` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT "\" FROM person ` ,
2016-02-27 12:02:41 +00:00
err : "Found `\" FROM person` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` ! ` ,
2016-09-06 13:30:59 +00:00
err : "Found `!` but expected `USE, LET, BEGIN, CANCEL, COMMIT, ROLLBACK, SELECT, CREATE, UPDATE, INSERT, UPSERT, MODIFY, DELETE, RELATE, RECORD, DEFINE, RESYNC, REMOVE`" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` SELECT * FROM person;;; ` ,
2016-09-06 13:30:59 +00:00
err : "Found `;` but expected `USE, LET, BEGIN, CANCEL, COMMIT, ROLLBACK, SELECT, CREATE, UPDATE, INSERT, UPSERT, MODIFY, DELETE, RELATE, RECORD, DEFINE, RESYNC, REMOVE`" ,
2016-02-26 17:27:07 +00:00
} ,
}
for _ , test := range tests {
testsql ( t , test )
}
}
2016-05-23 12:32:02 +00:00
func Test_Parse_Queries_Use ( t * testing . T ) {
2016-02-26 17:27:07 +00:00
var tests = [ ] tester {
2016-02-28 09:38:12 +00:00
{
2016-05-23 12:32:02 +00:00
sql : ` USE ` ,
2016-07-21 21:43:52 +00:00
err : "Found `` but expected `NAMESPACE, DATABASE`" ,
2016-02-28 09:38:12 +00:00
} ,
2016-02-26 17:27:07 +00:00
{
2016-05-23 12:32:02 +00:00
sql : ` USE NAMESPACE ` ,
err : "Found `` but expected `namespace name`" ,
} ,
{
sql : ` USE NAMESPACE name ` ,
res : & Query { Statements : [ ] Statement { & UseStatement {
NS : "name" ,
} } } ,
} ,
{
sql : ` USE NAMESPACE 1 ` ,
err : "Found `1` but expected `namespace name`" ,
} ,
{
sql : ` USE NAMESPACE 1.3000 ` ,
err : "Found `1.3000` but expected `namespace name`" ,
} ,
{
sql : ` USE NAMESPACE 123.123.123.123 ` ,
res : & Query { Statements : [ ] Statement { & UseStatement {
NS : "123.123.123.123" ,
} } } ,
} ,
{
sql : ` USE NAMESPACE { "some":"thing"} ` ,
err : "Found `{\"some\":\"thing\"}` but expected `namespace name`" ,
} ,
{
sql : ` USE NAMESPACE name something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` USE NAMESPACE '' ` ,
res : & Query { Statements : [ ] Statement { & UseStatement {
NS : "" ,
} } } ,
} ,
{
sql : ` USE DATABASE ` ,
err : "Found `` but expected `database name`" ,
} ,
{
sql : ` USE DATABASE name ` ,
res : & Query { Statements : [ ] Statement { & UseStatement {
DB : "name" ,
} } } ,
} ,
{
sql : ` USE DATABASE 1 ` ,
res : & Query { Statements : [ ] Statement { & UseStatement {
DB : "1" ,
} } } ,
} ,
{
sql : ` USE DATABASE 1.3000 ` ,
res : & Query { Statements : [ ] Statement { & UseStatement {
DB : "1.3000" ,
} } } ,
} ,
{
sql : ` USE DATABASE 123.123.123.123 ` ,
res : & Query { Statements : [ ] Statement { & UseStatement {
DB : "123.123.123.123" ,
} } } ,
} ,
{
sql : ` USE DATABASE { "some":"thing"} ` ,
err : "Found `{\"some\":\"thing\"}` but expected `database name`" ,
} ,
{
sql : ` USE DATABASE name something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` USE DATABASE '' ` ,
res : & Query { Statements : [ ] Statement { & UseStatement {
DB : "" ,
} } } ,
} ,
}
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Explain ( t * testing . T ) {
var tests = [ ] tester {
{
sql : ` EXPLAIN SELECT ALL FROM person ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
EX : true ,
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "ALL" } } ,
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
2016-02-26 17:27:07 +00:00
} ,
2016-05-23 12:32:02 +00:00
}
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Select ( t * testing . T ) {
var tests = [ ] tester {
2016-02-26 17:27:07 +00:00
{
sql : ` SELECT ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT FROM ` ,
2016-02-27 12:02:41 +00:00
err : "Found `FROM` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT * ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `FROM`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT * FROM ` ,
2016-09-07 15:58:50 +00:00
err : "Found `` but expected `table name or record id`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT * FROM per!son ` ,
2016-02-27 12:02:41 +00:00
err : "Found `!` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT * FROM person; ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
sql : ` SELECT ALL FROM person; ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "ALL" } } ,
What : [ ] Expr { & Table { "person" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM @ ` ,
2016-09-07 15:58:50 +00:00
err : "Found `@` but expected `table name or record id`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT * FROM @person ` ,
2016-09-07 15:58:50 +00:00
err : "Found `@person` but expected `table name or record id`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT * FROM @person: ` ,
2016-09-07 15:58:50 +00:00
err : "Found `@person:` but expected `table name or record id`" ,
} ,
{
sql : ` SELECT * FROM @person WHERE ` ,
err : "Found `@person` but expected `table name or record id`" ,
} ,
{
sql : ` SELECT * FROM person:uuid ` ,
err : "Found `:` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT * FROM person ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM person, tweet ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } , & Table { "tweet" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM @person:1a ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "1a" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM @person:123456 ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "person" , ID : float64 ( 123456 ) } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM @person:123.456 ` ,
2016-05-24 12:51:52 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : float64 ( 123.456 ) } } ,
} } } ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` SELECT * FROM @person:123.456.789.012 ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "123.456.789.012" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM @person:⟨123.456.789.012⟩ ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "123.456.789.012" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
2016-09-07 15:58:50 +00:00
{
sql : ` SELECT * FROM @person: { 123.456.789.012} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "person" , ID : "123.456.789.012" } } ,
} } } ,
} ,
2016-05-23 12:32:02 +00:00
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM @person:⟨A250C5A3-948F-4657-88AD-FF5F27B5B24E⟩ ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "person" , ID : "A250C5A3-948F-4657-88AD-FF5F27B5B24E" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
2016-09-07 15:58:50 +00:00
{
sql : ` SELECT * FROM @person: { A250C5A3-948F-4657-88AD-FF5F27B5B24E} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "person" , ID : "A250C5A3-948F-4657-88AD-FF5F27B5B24E" } } ,
} } } ,
} ,
2016-05-23 12:32:02 +00:00
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM @person:⟨8250C5A3-948F-4657-88AD-FF5F27B5B24E⟩ ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "person" , ID : "8250C5A3-948F-4657-88AD-FF5F27B5B24E" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
2016-09-07 15:58:50 +00:00
{
sql : ` SELECT * FROM @person: { 8250C5A3-948F-4657-88AD-FF5F27B5B24E} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "person" , ID : "8250C5A3-948F-4657-88AD-FF5F27B5B24E" } } ,
} } } ,
} ,
2016-05-23 12:32:02 +00:00
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM @person:⟨Tobie Morgan Hitchcock⟩ ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "person" , ID : "Tobie Morgan Hitchcock" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
2016-09-07 15:58:50 +00:00
{
sql : ` SELECT * FROM @person: { Tobie Morgan Hitchcock} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "person" , ID : "Tobie Morgan Hitchcock" } } ,
} } } ,
} ,
2016-02-26 17:27:07 +00:00
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM @⟨email addresses⟩:⟨tobie@abcum.com⟩ ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "email addresses" , ID : "tobie@abcum.com" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
2016-09-07 15:58:50 +00:00
{
sql : ` SELECT * FROM @ { email addresses}: { tobie@abcum.com} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "email addresses" , ID : "tobie@abcum.com" } } ,
} } } ,
} ,
2016-02-26 17:27:07 +00:00
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM @⟨email addresses⟩:⟨tobie+spam@abcum.com⟩ ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "email addresses" , ID : "tobie+spam@abcum.com" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
2016-09-07 15:58:50 +00:00
{
sql : ` SELECT * FROM @ { email addresses}: { tobie+spam@abcum.com} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Thing { TB : "email addresses" , ID : "tobie+spam@abcum.com" } } ,
} } } ,
} ,
2016-05-23 12:32:02 +00:00
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM @⟨email addresses⟩:⟨this\qis\nodd⟩ ` ,
2016-09-07 15:58:50 +00:00
err : "Found `@email addresses:thisqis\nodd` but expected `table name or record id`" ,
} ,
{
sql : ` SELECT * FROM @ { email addresses}: { this\qis\nodd} ` ,
err : "Found `@email addresses:thisqis\nodd` but expected `table name or record id`" ,
2016-09-06 13:30:59 +00:00
} ,
{
sql : ` SELECT *, temp AS test FROM person ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field {
{ Expr : & All { } , Alias : "*" } ,
{ Expr : & Ident { "temp" } , Alias : "test" } ,
} ,
What : [ ] Expr { & Table { "person" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : "SELECT `email addresses` AS emails FROM person" ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field {
{ Expr : & Ident { "email addresses" } , Alias : "emails" } ,
} ,
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : "SELECT emails AS `email addresses` FROM person" ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field {
{ Expr : & Ident { "emails" } , Alias : "email addresses" } ,
} ,
What : [ ] Expr { & Table { "person" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : "SELECT * FROM person WHERE id = '\x0A'" ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr { & BinaryExpression { LHS : & Ident { "id" } , Op : EQ , RHS : "\n" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : "SELECT * FROM person WHERE id = '\x0D'" ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr { & BinaryExpression { LHS : & Ident { "id" } , Op : EQ , RHS : "\r" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE id = "\b\n\r\t" ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr { & BinaryExpression { LHS : & Ident { "id" } , Op : EQ , RHS : "\n\r\t" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE ` ,
err : "Found `` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE id ` ,
err : "Found `` but expected `IS, IN, =, !=, ==, !==, ?=, <, <=, >, >=, ∋, ∌, ∈, ∉, CONTAINS, CONTAINSALL, CONTAINSNONE, CONTAINSSOME, ALLCONTAINEDIN, NONECONTAINEDIN, SOMECONTAINEDIN`" ,
2016-05-23 12:32:02 +00:00
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE id = ` ,
err : "Found `` but expected `field value`" ,
2016-05-23 12:32:02 +00:00
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE id = 1 ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr { & BinaryExpression { LHS : & Ident { "id" } , Op : EQ , RHS : float64 ( 1 ) } } ,
2016-05-23 12:32:02 +00:00
} } } ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old = EMPTY ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr {
& BinaryExpression { LHS : & Ident { "old" } , Op : EQ , RHS : & Empty { } } ,
2016-02-26 17:27:07 +00:00
} ,
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old != EMPTY ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr {
& BinaryExpression { LHS : & Ident { "old" } , Op : NEQ , RHS : & Empty { } } ,
2016-02-26 17:27:07 +00:00
} ,
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old = MISSING ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr {
& BinaryExpression { LHS : & Ident { "old" } , Op : EQ , RHS : & Void { } } ,
2016-02-26 17:27:07 +00:00
} ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old != MISSING ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr {
& BinaryExpression { LHS : & Ident { "old" } , Op : NEQ , RHS : & Void { } } ,
} ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old IS EMPTY ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr {
& BinaryExpression { LHS : & Ident { "old" } , Op : EQ , RHS : & Empty { } } ,
} ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old IS NOT EMPTY ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr {
& BinaryExpression { LHS : & Ident { "old" } , Op : NEQ , RHS : & Empty { } } ,
} ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old IS MISSING ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr {
& BinaryExpression { LHS : & Ident { "old" } , Op : EQ , RHS : & Void { } } ,
} ,
} } } ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old IS NOT MISSING ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr {
& BinaryExpression { LHS : & Ident { "old" } , Op : NEQ , RHS : & Void { } } ,
} ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old = true ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Cond : [ ] Expr {
2016-09-06 13:30:59 +00:00
& BinaryExpression { LHS : & Ident { "old" } , Op : EQ , RHS : true } ,
2016-05-23 12:32:02 +00:00
} ,
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE old = false ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Cond : [ ] Expr {
2016-09-06 13:30:59 +00:00
& BinaryExpression { LHS : & Ident { "old" } , Op : EQ , RHS : false } ,
2016-05-23 12:32:02 +00:00
} ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-09-06 13:30:59 +00:00
sql : ` SELECT * FROM person WHERE id != null AND id > 13.9 AND id < 31 AND id >= 15 AND id <= 29.9 ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Cond : [ ] Expr {
2016-09-06 13:30:59 +00:00
& BinaryExpression { LHS : & Ident { "id" } , Op : NEQ , RHS : & Null { } } ,
& BinaryExpression { LHS : & Ident { "id" } , Op : GT , RHS : float64 ( 13.9 ) } ,
& BinaryExpression { LHS : & Ident { "id" } , Op : LT , RHS : float64 ( 31 ) } ,
& BinaryExpression { LHS : & Ident { "id" } , Op : GTE , RHS : float64 ( 15 ) } ,
& BinaryExpression { LHS : & Ident { "id" } , Op : LTE , RHS : float64 ( 29.9 ) } ,
2016-02-26 17:27:07 +00:00
} ,
} } } ,
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` SELECT * FROM person WHERE test IN ["London":"Paris"] ` ,
err : ` Invalid JSON: ["London":"Paris"] ` ,
} ,
{
sql : ` SELECT * FROM person WHERE test IN ["London","Paris"] ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr { & BinaryExpression { LHS : & Ident { "test" } , Op : INS , RHS : [ ] interface { } { "London" , "Paris" } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM person WHERE test = { ` ,
2016-09-06 13:30:59 +00:00
err : "Found `{` but expected `field value`" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` SELECT * FROM person WHERE test = { "name","London"} ` ,
err : ` Invalid JSON: { "name","London"} ` ,
} ,
{
sql : "SELECT * FROM person WHERE test = {\"name\":\"\x0A\"}" ,
2016-09-06 13:30:59 +00:00
err : "Invalid JSON: {\"name\":\"\n\"}" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : "SELECT * FROM person WHERE test = {\"name\":\"\x0D\"}" ,
2016-09-06 13:30:59 +00:00
err : "Invalid JSON: {\"name\":\"\r\"}" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` SELECT * FROM person WHERE test = { "name":"London"} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr { & BinaryExpression { LHS : & Ident { "test" } , Op : EQ , RHS : map [ string ] interface { } { "name" : "London" } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM person WHERE test = { "name":"\b\t\r\n\f\"\\"} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr { & BinaryExpression { LHS : & Ident { "test" } , Op : EQ , RHS : map [ string ] interface { } { "name" : "\b\t\r\n\f\"\\" } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` SELECT * FROM person WHERE test = { "name": { "f":"first", "l":"last"}} ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
Cond : [ ] Expr { & BinaryExpression { LHS : & Ident { "test" } , Op : EQ , RHS : map [ string ] interface { } { "name" : map [ string ] interface { } { "f" : "first" , "l" : "last" } } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
2016-02-26 17:27:07 +00:00
} ,
}
2016-05-23 12:32:02 +00:00
bday1 , _ := time . Parse ( "2006-01-02" , "1987-06-22" )
bday2 , _ := time . Parse ( time . RFC3339 , "1987-06-22T08:00:00Z" )
bday3 , _ := time . Parse ( time . RFC3339 , "1987-06-22T08:30:00.193943735Z" )
bday4 , _ := time . Parse ( time . RFC3339 , "2016-03-14T11:19:31.193943735Z" )
tests = append ( tests , tester {
sql : ` SELECT * FROM person WHERE bday >= "1987-06-22" AND bday >= "1987-06-22T08:00:00Z" AND bday >= "1987-06-22T08:30:00.193943735Z" AND bday <= "2016-03-14T11:19:31.193943735Z" ` ,
res : & Query { Statements : [ ] Statement { & SelectStatement {
2016-09-06 13:30:59 +00:00
Expr : [ ] * Field { { Expr : & All { } , Alias : "*" } } ,
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Cond : [ ] Expr {
2016-09-06 13:30:59 +00:00
& BinaryExpression { LHS : & Ident { "bday" } , Op : GTE , RHS : bday1 } ,
& BinaryExpression { LHS : & Ident { "bday" } , Op : GTE , RHS : bday2 } ,
& BinaryExpression { LHS : & Ident { "bday" } , Op : GTE , RHS : bday3 } ,
& BinaryExpression { LHS : & Ident { "bday" } , Op : LTE , RHS : bday4 } ,
2016-05-23 12:32:02 +00:00
} ,
} } } ,
} )
2016-02-26 17:27:07 +00:00
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Create ( t * testing . T ) {
var tests = [ ] tester {
{
sql : ` CREATE ` ,
2016-09-07 15:58:50 +00:00
err : "Found `` but expected `table name or record id`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` INSERT INTO ` ,
2016-09-07 15:58:50 +00:00
err : "Found `` but expected `table name or record id`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` CREATE person ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & CreateStatement {
What : [ ] Expr {
2016-09-06 13:30:59 +00:00
& Table { "person" } ,
2016-05-23 12:32:02 +00:00
} ,
} } } ,
} ,
{
sql : ` CREATE person SET 123 ` ,
err : "Found `123` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` CREATE person SET firstname ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `=, +=, -=`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` CREATE person SET firstname = EMPTY ` ,
err : "Found `EMPTY` but expected `field value`" ,
} ,
{
sql : ` CREATE person SET firstname = VOID ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
Data : [ ] Expr { & BinaryExpression { LHS : & Ident { "firstname" } , Op : EQ , RHS : & Void { } } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
sql : ` CREATE person SET firstname = "Tobie" something ` ,
2016-02-27 12:02:41 +00:00
err : "Found `something` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
2016-05-23 12:32:02 +00:00
{
sql : ` CREATE person SET firstname = "Tobie" ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
Data : [ ] Expr { & BinaryExpression { LHS : & Ident { "firstname" } , Op : EQ , RHS : "Tobie" } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` CREATE person MERGE something ` ,
err : "Found `something` but expected `json`" ,
} ,
{
sql : ` CREATE person MERGE { "firstname"::"Tobie"} ` ,
err : "Found `{\"firstname\"::\"Tobie\"}` but expected `json`" ,
} ,
{
sql : ` CREATE person MERGE { "firstname":"Tobie"} something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` CREATE person MERGE { "firstname":"Tobie"} ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-07-04 10:37:37 +00:00
Data : [ ] Expr { & MergeExpression { JSON : map [ string ] interface { } { "firstname" : "Tobie" } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` CREATE person CONTENT something ` ,
err : "Found `something` but expected `json`" ,
} ,
{
sql : ` CREATE person CONTENT { "firstname"::"Tobie"} ` ,
err : "Found `{\"firstname\"::\"Tobie\"}` but expected `json`" ,
} ,
{
sql : ` CREATE person CONTENT { "firstname":"Tobie"} something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` CREATE person CONTENT { "firstname":"Tobie"} ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-07-04 10:37:37 +00:00
Data : [ ] Expr { & ContentExpression { JSON : map [ string ] interface { } { "firstname" : "Tobie" } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` CREATE person RETURN ID ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : ID ,
} } } ,
} ,
{
sql : ` CREATE person RETURN NONE ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : NONE ,
} } } ,
} ,
{
sql : ` CREATE person RETURN FULL ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : FULL ,
} } } ,
} ,
{
sql : ` CREATE person RETURN BOTH ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : BOTH ,
} } } ,
} ,
{
sql : ` CREATE person RETURN DIFF ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : DIFF ,
} } } ,
} ,
{
sql : ` CREATE person RETURN BEFORE ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : BEFORE ,
} } } ,
} ,
{
sql : ` CREATE person RETURN AFTER ` ,
res : & Query { Statements : [ ] Statement { & CreateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : AFTER ,
} } } ,
} ,
{
sql : ` CREATE person RETURN SOMETHING ` ,
err : "Found `SOMETHING` but expected `ID, NONE, FULL, BOTH, DIFF, BEFORE, AFTER`" ,
} ,
2016-02-26 17:27:07 +00:00
}
for _ , test := range tests {
testsql ( t , test )
}
}
2016-05-23 12:32:02 +00:00
func Test_Parse_Queries_Update ( t * testing . T ) {
2016-02-26 17:27:07 +00:00
var tests = [ ] tester {
{
2016-05-23 12:32:02 +00:00
sql : ` UPDATE ` ,
2016-09-07 15:58:50 +00:00
err : "Found `` but expected `table name or record id`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` UPSERT INTO ` ,
2016-09-07 15:58:50 +00:00
err : "Found `` but expected `table name or record id`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` UPDATE person ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
What : [ ] Expr {
2016-09-06 13:30:59 +00:00
& Table { "person" } ,
2016-05-23 12:32:02 +00:00
} ,
} } } ,
} ,
{
sql : ` UPDATE person SET 123 ` ,
err : "Found `123` but expected `field name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` UPDATE person SET firstname ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `=, +=, -=`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` UPDATE person SET firstname = EMPTY ` ,
err : "Found `EMPTY` but expected `field value`" ,
} ,
{
sql : ` UPDATE person SET firstname = VOID ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
Data : [ ] Expr { & BinaryExpression { LHS : & Ident { "firstname" } , Op : EQ , RHS : & Void { } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` UPDATE person SET firstname = "Tobie" something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` UPDATE person SET firstname = "Tobie" ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
Data : [ ] Expr { & BinaryExpression { LHS : & Ident { "firstname" } , Op : EQ , RHS : "Tobie" } } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` UPDATE person MERGE something ` ,
err : "Found `something` but expected `json`" ,
} ,
{
sql : ` UPDATE person MERGE { "firstname"::"Tobie"} ` ,
err : "Found `{\"firstname\"::\"Tobie\"}` but expected `json`" ,
} ,
{
sql : ` UPDATE person MERGE { "firstname":"Tobie"} something ` ,
2016-02-27 12:02:41 +00:00
err : "Found `something` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
2016-05-23 12:32:02 +00:00
{
sql : ` UPDATE person MERGE { "firstname":"Tobie"} ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-07-04 10:37:37 +00:00
Data : [ ] Expr { & MergeExpression { JSON : map [ string ] interface { } { "firstname" : "Tobie" } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` UPDATE person CONTENT something ` ,
err : "Found `something` but expected `json`" ,
} ,
{
sql : ` UPDATE person CONTENT { "firstname"::"Tobie"} ` ,
err : "Found `{\"firstname\"::\"Tobie\"}` but expected `json`" ,
} ,
{
sql : ` UPDATE person CONTENT { "firstname":"Tobie"} something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` UPDATE person CONTENT { "firstname":"Tobie"} ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-07-04 10:37:37 +00:00
Data : [ ] Expr { & ContentExpression { JSON : map [ string ] interface { } { "firstname" : "Tobie" } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` UPDATE person RETURN ID ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : ID ,
} } } ,
} ,
{
sql : ` UPDATE person RETURN NONE ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : NONE ,
} } } ,
} ,
{
sql : ` UPDATE person RETURN FULL ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : FULL ,
} } } ,
} ,
{
sql : ` UPDATE person RETURN BOTH ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : BOTH ,
} } } ,
} ,
{
sql : ` UPDATE person RETURN DIFF ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : DIFF ,
} } } ,
} ,
{
sql : ` UPDATE person RETURN BEFORE ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : BEFORE ,
} } } ,
} ,
{
sql : ` UPDATE person RETURN AFTER ` ,
res : & Query { Statements : [ ] Statement { & UpdateStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : AFTER ,
} } } ,
} ,
{
sql : ` UPDATE person RETURN SOMETHING ` ,
err : "Found `SOMETHING` but expected `ID, NONE, FULL, BOTH, DIFF, BEFORE, AFTER`" ,
} ,
2016-02-26 17:27:07 +00:00
}
for _ , test := range tests {
testsql ( t , test )
}
}
2016-05-23 12:32:02 +00:00
func Test_Parse_Queries_Modify ( t * testing . T ) {
2016-02-26 17:27:07 +00:00
2016-05-23 12:32:02 +00:00
var tests = [ ] tester {
{
sql : ` MODIFY ` ,
2016-09-07 15:58:50 +00:00
err : "Found `` but expected `table name or record id`" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` MODIFY @person:test ` ,
err : "Found `` but expected `DIFF`" ,
} ,
{
sql : ` MODIFY @person:test DIFF ` ,
err : "Found `` but expected `json`" ,
} ,
2016-09-06 13:30:59 +00:00
{
sql : ` MODIFY @person:test DIFF { invalid} ` ,
err : "Found `{invalid}` but expected `json`" ,
} ,
2016-05-23 12:32:02 +00:00
{
sql : ` MODIFY @person:test DIFF { "diff": true} ` ,
res : & Query { Statements : [ ] Statement { & ModifyStatement {
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "test" } } ,
2016-07-04 10:37:37 +00:00
Diff : [ ] Expr { & DiffExpression { JSON : map [ string ] interface { } { "diff" : true } } } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} RETURN ID ` ,
res : & Query { Statements : [ ] Statement { & ModifyStatement {
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "test" } } ,
2016-07-04 10:37:37 +00:00
Diff : [ ] Expr { & DiffExpression { JSON : map [ string ] interface { } { "diff" : true } } } ,
2016-05-23 12:32:02 +00:00
Echo : ID ,
} } } ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} RETURN NONE ` ,
res : & Query { Statements : [ ] Statement { & ModifyStatement {
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "test" } } ,
2016-07-04 10:37:37 +00:00
Diff : [ ] Expr { & DiffExpression { JSON : map [ string ] interface { } { "diff" : true } } } ,
2016-05-23 12:32:02 +00:00
Echo : NONE ,
} } } ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} RETURN FULL ` ,
res : & Query { Statements : [ ] Statement { & ModifyStatement {
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "test" } } ,
2016-07-04 10:37:37 +00:00
Diff : [ ] Expr { & DiffExpression { JSON : map [ string ] interface { } { "diff" : true } } } ,
2016-05-23 12:32:02 +00:00
Echo : FULL ,
} } } ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} RETURN BOTH ` ,
res : & Query { Statements : [ ] Statement { & ModifyStatement {
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "test" } } ,
2016-07-04 10:37:37 +00:00
Diff : [ ] Expr { & DiffExpression { JSON : map [ string ] interface { } { "diff" : true } } } ,
2016-05-23 12:32:02 +00:00
Echo : BOTH ,
} } } ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} RETURN DIFF ` ,
res : & Query { Statements : [ ] Statement { & ModifyStatement {
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "test" } } ,
2016-07-04 10:37:37 +00:00
Diff : [ ] Expr { & DiffExpression { JSON : map [ string ] interface { } { "diff" : true } } } ,
2016-05-23 12:32:02 +00:00
Echo : DIFF ,
} } } ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} RETURN BEFORE ` ,
res : & Query { Statements : [ ] Statement { & ModifyStatement {
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "test" } } ,
2016-07-04 10:37:37 +00:00
Diff : [ ] Expr { & DiffExpression { JSON : map [ string ] interface { } { "diff" : true } } } ,
2016-05-23 12:32:02 +00:00
Echo : BEFORE ,
} } } ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} RETURN AFTER ` ,
res : & Query { Statements : [ ] Statement { & ModifyStatement {
2016-05-24 12:51:52 +00:00
What : [ ] Expr { & Thing { TB : "person" , ID : "test" } } ,
2016-07-04 10:37:37 +00:00
Diff : [ ] Expr { & DiffExpression { JSON : map [ string ] interface { } { "diff" : true } } } ,
2016-05-23 12:32:02 +00:00
Echo : AFTER ,
} } } ,
} ,
{
sql : ` MODIFY @person:test DIFF { "diff": true} RETURN SOMETHING ` ,
err : "Found `SOMETHING` but expected `ID, NONE, FULL, BOTH, DIFF, BEFORE, AFTER`" ,
} ,
2016-02-26 17:27:07 +00:00
}
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Delete ( t * testing . T ) {
2016-05-23 12:32:02 +00:00
var tests = [ ] tester {
{
sql : ` DELETE ` ,
2016-09-07 15:58:50 +00:00
err : "Found `` but expected `table name or record id`" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` DELETE FROM ` ,
2016-09-07 15:58:50 +00:00
err : "Found `` but expected `table name or record id`" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` DELETE person ` ,
res : & Query { Statements : [ ] Statement { & DeleteStatement {
What : [ ] Expr {
2016-09-06 13:30:59 +00:00
& Table { "person" } ,
2016-05-23 12:32:02 +00:00
} ,
} } } ,
} ,
{
sql : ` DELETE person RETURN ID ` ,
res : & Query { Statements : [ ] Statement { & DeleteStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : ID ,
} } } ,
} ,
{
sql : ` DELETE person RETURN NONE ` ,
res : & Query { Statements : [ ] Statement { & DeleteStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : NONE ,
} } } ,
} ,
{
sql : ` DELETE person RETURN FULL ` ,
res : & Query { Statements : [ ] Statement { & DeleteStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : FULL ,
} } } ,
} ,
{
sql : ` DELETE person RETURN BOTH ` ,
res : & Query { Statements : [ ] Statement { & DeleteStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : BOTH ,
} } } ,
} ,
{
sql : ` DELETE person RETURN DIFF ` ,
res : & Query { Statements : [ ] Statement { & DeleteStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : DIFF ,
} } } ,
} ,
{
sql : ` DELETE person RETURN BEFORE ` ,
res : & Query { Statements : [ ] Statement { & DeleteStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : BEFORE ,
} } } ,
} ,
{
sql : ` DELETE person RETURN AFTER ` ,
res : & Query { Statements : [ ] Statement { & DeleteStatement {
2016-09-06 13:30:59 +00:00
What : [ ] Expr { & Table { "person" } } ,
2016-05-23 12:32:02 +00:00
Echo : AFTER ,
} } } ,
} ,
{
sql : ` DELETE person RETURN SOMETHING ` ,
err : "Found `SOMETHING` but expected `ID, NONE, FULL, BOTH, DIFF, BEFORE, AFTER`" ,
} ,
}
2016-02-26 17:27:07 +00:00
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Relate ( t * testing . T ) {
var tests = [ ] tester { }
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Record ( t * testing . T ) {
var tests = [ ] tester { }
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Define ( t * testing . T ) {
var tests = [ ] tester {
{
sql : ` DEFINE ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `RULES, TABLE, FIELD, INDEX`" ,
2016-02-26 17:27:07 +00:00
} ,
2016-09-06 13:30:59 +00:00
// ----------------------------------------------------------------------
2016-02-26 17:27:07 +00:00
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE TABLE ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `name`" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` DEFINE TABLE person ` ,
res : & Query { Statements : [ ] Statement { & DefineTableStatement {
2016-09-06 13:30:59 +00:00
What : [ ] string { "person" } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE TABLE person something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
// ----------------------------------------------------------------------
2016-09-06 13:30:59 +00:00
{
sql : ` DEFINE RULES ` ,
err : "Found `` but expected `ON`" ,
} ,
{
sql : ` DEFINE RULES ON ` ,
err : "Found `` but expected `name`" ,
} ,
{
sql : ` DEFINE RULES ON person ` ,
err : "Found `` but expected `FOR`" ,
} ,
{
sql : ` DEFINE RULES ON person FOR ` ,
err : "Found `` but expected `SELECT, CREATE, UPDATE, DELETE, RELATE, RECORD`" ,
} ,
{
sql : ` DEFINE RULES ON person FOR select, create, update, delete ` ,
err : "Found `` but expected `ACCEPT, REJECT, CUSTOM`" ,
} ,
{
sql : ` DEFINE RULES ON person FOR select, create, update, delete ACCEPT ` ,
res : & Query { Statements : [ ] Statement { & DefineRulesStatement {
What : [ ] string { "person" } ,
When : [ ] string { "SELECT" , "CREATE" , "UPDATE" , "DELETE" } ,
Rule : "ACCEPT" ,
} } } ,
} ,
{
sql : ` DEFINE RULES ON person FOR select, create, update, delete ACCEPT something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` DEFINE RULES ON person FOR select, create, update, delete REJECT ` ,
res : & Query { Statements : [ ] Statement { & DefineRulesStatement {
What : [ ] string { "person" } ,
When : [ ] string { "SELECT" , "CREATE" , "UPDATE" , "DELETE" } ,
Rule : "REJECT" ,
} } } ,
} ,
{
sql : ` DEFINE RULES ON person FOR select, create, update, delete REJECT something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` DEFINE RULES ON person FOR select, create, update, delete CUSTOM ` ,
err : "Found `` but expected `js/lua script`" ,
} ,
{
sql : ` DEFINE RULES ON person FOR select, create, update, delete CUSTOM "return true" ` ,
res : & Query { Statements : [ ] Statement { & DefineRulesStatement {
What : [ ] string { "person" } ,
When : [ ] string { "SELECT" , "CREATE" , "UPDATE" , "DELETE" } ,
Rule : "CUSTOM" ,
Code : "return true" ,
} } } ,
} ,
{
sql : ` DEFINE RULES ON person FOR select, create, update, delete CUSTOM "return true" something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
// ----------------------------------------------------------------------
2016-05-23 12:32:02 +00:00
{
sql : ` DEFINE FIELD ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE FIELD temp ` ,
err : "Found `` but expected `ON`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE FIELD temp ON ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE FIELD temp ON person ` ,
err : "Found `` but expected `TYPE`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE FIELD temp ON person TYPE ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `any, url, uuid, color, email, phone, array, object, domain, string, number, custom, boolean, datetime, latitude, longitude`" ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE something ` ,
err : "Found `something` but expected `any, url, uuid, color, email, phone, array, object, domain, string, number, custom, boolean, datetime, latitude, longitude`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE FIELD temp ON person TYPE any ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE FIELD temp ON person TYPE url ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "url" ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE FIELD temp ON person TYPE email ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "email" ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE phone ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "phone" ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE array ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "array" ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE object ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "object" ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE string ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "string" ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE number ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "number" ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
2016-07-04 10:37:37 +00:00
sql : ` DEFINE FIELD temp ON person TYPE custom ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "custom" ,
2016-07-04 10:37:37 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE custom ENUM ["default","notdefault"] ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "custom" ,
2016-07-04 10:37:37 +00:00
Enum : [ ] interface { } { "default" , "notdefault" } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
2016-09-06 13:30:59 +00:00
{
sql : ` DEFINE FIELD temp ON person TYPE custom ENUM ["default" "notdefault"] ` ,
err : ` Invalid JSON: ["default" "notdefault"] ` ,
} ,
2016-05-23 12:32:02 +00:00
{
sql : ` DEFINE FIELD temp ON person TYPE any DEFAULT true ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Default : true ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any DEFAULT false ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Default : false ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any DEFAULT 100 ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
Default : float64 ( 100 ) ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any DEFAULT "default" ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Default : "default" ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any DEFAULT "this\nis\nsome\ntext" ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Default : "this\nis\nsome\ntext" ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any DEFAULT { "default":true} ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Default : map [ string ] interface { } { "default" : true } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any DEFAULT something ` ,
2016-09-06 13:30:59 +00:00
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
Default : & Ident { "something" } ,
} } } ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MIN ` ,
err : "Found `` but expected `number`" ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MIN 1 ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Min : 1 ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MIN 1.0 ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Min : 1 ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MIN 1.0001 ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Min : 1.0001 ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MIN something ` ,
err : "Found `something` but expected `number`" ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MAX ` ,
err : "Found `` but expected `number`" ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MAX 100 ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Max : 100 ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MAX 100.0 ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Max : 100 ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MAX 100.0001 ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-07-04 10:37:37 +00:00
Max : 100.0001 ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MAX something ` ,
err : "Found `something` but expected `number`" ,
} ,
2016-09-06 13:30:59 +00:00
{
sql : ` DEFINE FIELD temp ON person TYPE any CODE ` ,
err : "Found `` but expected `js/lua script`" ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any CODE "return doc.data.id" ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
Code : "return doc.data.id" ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any CODE something ` ,
err : "Found `something` but expected `js/lua script`" ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MATCH ` ,
err : "Found `` but expected `regular expression`" ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MATCH /.*/ ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
Match : ".*" ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MATCH something ` ,
err : "Found `something` but expected `regular expression`" ,
} ,
2016-05-23 12:32:02 +00:00
{
sql : ` DEFINE FIELD temp ON person TYPE any NOTNULL ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Notnull : true ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any NOTNULL true ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Notnull : true ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` DEFINE FIELD temp ON person TYPE any NOTNULL false ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Notnull : false ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any READONLY ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Readonly : true ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any READONLY true ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Readonly : true ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any READONLY false ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Readonly : false ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MANDATORY ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Mandatory : true ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MANDATORY true ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Mandatory : true ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any MANDATORY false ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
2016-05-23 12:32:02 +00:00
Mandatory : false ,
} } } ,
} ,
2016-09-06 13:30:59 +00:00
{
sql : ` DEFINE FIELD temp ON person TYPE any VALIDATE ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
Validate : true ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any VALIDATE true ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
Validate : true ,
} } } ,
} ,
{
sql : ` DEFINE FIELD temp ON person TYPE any VALIDATE false ` ,
res : & Query { Statements : [ ] Statement { & DefineFieldStatement {
Name : "temp" ,
What : [ ] string { "person" } ,
Type : "any" ,
Validate : false ,
} } } ,
} ,
2016-05-23 12:32:02 +00:00
{
sql : ` DEFINE FIELD temp ON person TYPE any something ` ,
2016-02-27 12:02:41 +00:00
err : "Found `something` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
2016-05-23 12:32:02 +00:00
// ----------------------------------------------------------------------
2016-02-26 17:27:07 +00:00
{
sql : ` DEFINE INDEX ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` DEFINE INDEX temp ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `ON`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` DEFINE INDEX temp ON ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` DEFINE INDEX temp ON person ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `COLUMNS`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` DEFINE INDEX temp ON person COLUMNS ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` DEFINE INDEX temp ON person COLUMNS firstname, lastname ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & DefineIndexStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Cols : [ ] string { "firstname" , "lastname" } ,
2016-05-23 12:32:02 +00:00
Uniq : false ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
sql : ` DEFINE INDEX temp ON person COLUMNS firstname, lastname UNIQUE ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & DefineIndexStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
Cols : [ ] string { "firstname" , "lastname" } ,
2016-05-23 12:32:02 +00:00
Uniq : true ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
sql : ` DEFINE INDEX temp ON person COLUMNS firstname, lastname something UNIQUE ` ,
2016-02-27 12:02:41 +00:00
err : "Found `something` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` DEFINE INDEX temp ON person COLUMNS firstname, lastname UNIQUE something ` ,
2016-02-27 12:02:41 +00:00
err : "Found `something` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
}
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Resync ( t * testing . T ) {
var tests = [ ] tester {
{
sql : ` RESYNC ` ,
2016-05-23 12:32:02 +00:00
err : "Found `` but expected `INDEX`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` RESYNC INDEX ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `ON`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-07-04 10:37:37 +00:00
sql : ` RESYNC INDEX ON ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-07-04 10:37:37 +00:00
sql : ` RESYNC INDEX ON person ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & ResyncIndexStatement {
2016-09-06 13:30:59 +00:00
What : [ ] string { "person" } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-07-04 10:37:37 +00:00
sql : ` RESYNC INDEX ON person something ` ,
2016-02-27 12:02:41 +00:00
err : "Found `something` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
}
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Remove ( t * testing . T ) {
var tests = [ ] tester {
{
sql : ` REMOVE ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `RULES, TABLE, FIELD, INDEX`" ,
2016-05-23 12:32:02 +00:00
} ,
2016-09-06 13:30:59 +00:00
// ----------------------------------------------------------------------
2016-05-23 12:32:02 +00:00
{
sql : ` REMOVE TABLE ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` REMOVE TABLE person ` ,
res : & Query { Statements : [ ] Statement { & RemoveTableStatement {
2016-09-06 13:30:59 +00:00
What : [ ] string { "person" } ,
2016-05-23 12:32:02 +00:00
} } } ,
} ,
2016-09-06 13:30:59 +00:00
// ----------------------------------------------------------------------
2016-05-23 12:32:02 +00:00
{
2016-09-06 13:30:59 +00:00
sql : ` REMOVE RULES ` ,
err : "Found `` but expected `ON`" ,
} ,
{
sql : ` REMOVE RULES ON ` ,
err : "Found `` but expected `name`" ,
} ,
{
sql : ` REMOVE RULES ON person ` ,
err : "Found `` but expected `FOR`" ,
} ,
{
sql : ` REMOVE RULES ON person FOR ` ,
err : "Found `` but expected `SELECT, CREATE, UPDATE, DELETE, RELATE, RECORD`" ,
} ,
{
sql : ` REMOVE RULES ON person FOR select, create, update, delete ` ,
res : & Query { Statements : [ ] Statement { & RemoveRulesStatement {
What : [ ] string { "person" } ,
When : [ ] string { "SELECT" , "CREATE" , "UPDATE" , "DELETE" } ,
} } } ,
} ,
{
sql : ` REMOVE RULES ON person FOR select, create, update, delete something ` ,
2016-05-23 12:32:02 +00:00
err : "Found `something` but expected `EOF, ;`" ,
} ,
// ----------------------------------------------------------------------
{
sql : ` REMOVE FIELD ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` REMOVE FIELD temp ` ,
err : "Found `` but expected `ON`" ,
} ,
{
sql : ` REMOVE FIELD temp ON ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `name`" ,
2016-05-23 12:32:02 +00:00
} ,
{
sql : ` REMOVE FIELD temp ON person ` ,
res : & Query { Statements : [ ] Statement { & RemoveFieldStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` REMOVE FIELD temp ON person something ` ,
2016-02-27 12:02:41 +00:00
err : "Found `something` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
2016-05-23 12:32:02 +00:00
// ----------------------------------------------------------------------
2016-02-26 17:27:07 +00:00
{
sql : ` REMOVE INDEX ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` REMOVE INDEX temp ` ,
2016-02-27 12:02:41 +00:00
err : "Found `` but expected `ON`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` REMOVE INDEX temp ON ` ,
2016-09-06 13:30:59 +00:00
err : "Found `` but expected `name`" ,
2016-02-26 17:27:07 +00:00
} ,
{
sql : ` REMOVE INDEX temp ON person ` ,
2016-05-23 12:32:02 +00:00
res : & Query { Statements : [ ] Statement { & RemoveIndexStatement {
2016-09-06 13:30:59 +00:00
Name : "temp" ,
What : [ ] string { "person" } ,
2016-02-26 17:27:07 +00:00
} } } ,
} ,
{
2016-05-23 12:32:02 +00:00
sql : ` REMOVE INDEX temp ON person something ` ,
2016-02-27 12:02:41 +00:00
err : "Found `something` but expected `EOF, ;`" ,
2016-02-26 17:27:07 +00:00
} ,
}
for _ , test := range tests {
testsql ( t , test )
}
}
2016-09-06 13:30:59 +00:00
func Test_Parse_Queries_Begin ( t * testing . T ) {
var tests = [ ] tester {
{
sql : ` BEGIN ` ,
res : & Query { Statements : [ ] Statement { & BeginStatement { } } } ,
} ,
{
sql : ` BEGIN something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` BEGIN TRANSACTION ` ,
res : & Query { Statements : [ ] Statement { & BeginStatement { } } } ,
} ,
{
sql : ` BEGIN TRANSACTION something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
}
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Cancel ( t * testing . T ) {
var tests = [ ] tester {
{
sql : ` CANCEL ` ,
res : & Query { Statements : [ ] Statement { & CancelStatement { } } } ,
} ,
{
sql : ` CANCEL something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` CANCEL TRANSACTION ` ,
res : & Query { Statements : [ ] Statement { & CancelStatement { } } } ,
} ,
{
sql : ` CANCEL TRANSACTION something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
}
for _ , test := range tests {
testsql ( t , test )
}
}
func Test_Parse_Queries_Commit ( t * testing . T ) {
var tests = [ ] tester {
{
sql : ` Commit ` ,
res : & Query { Statements : [ ] Statement { & CommitStatement { } } } ,
} ,
{
sql : ` Commit something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
{
sql : ` Commit TRANSACTION ` ,
res : & Query { Statements : [ ] Statement { & CommitStatement { } } } ,
} ,
{
sql : ` Commit TRANSACTION something ` ,
err : "Found `something` but expected `EOF, ;`" ,
} ,
}
for _ , test := range tests {
testsql ( t , test )
}
}