Add SQL OPTION query statement

This commit is contained in:
Tobie Morgan Hitchcock 2019-01-23 01:27:30 +00:00
parent 62f02015ba
commit 7c962f7bdc
13 changed files with 201 additions and 28 deletions

View file

@ -21,10 +21,17 @@ import (
"github.com/abcum/surreal/sql" "github.com/abcum/surreal/sql"
) )
// QueryError occurs when a query can not be run. // OptsError occurs when a query can not be run.
type QueryError struct { type OptsError struct{}
// Error returns the string representation of the error.
func (e *OptsError) Error() string {
return fmt.Sprintf("Unable to set database options.")
} }
// QueryError occurs when a query can not be run.
type QueryError struct{}
// Error returns the string representation of the error. // Error returns the string representation of the error.
func (e *QueryError) Error() string { func (e *QueryError) Error() string {
return fmt.Sprintf("Unable to perform live query.") return fmt.Sprintf("Unable to perform live query.")

View file

@ -25,6 +25,10 @@ import (
// table, and executes them in name order. // table, and executes them in name order.
func (d *document) event(ctx context.Context, met method) (err error) { func (d *document) event(ctx context.Context, met method) (err error) {
if !d.i.e.opts.events {
return nil
}
// Check if this query has been run // Check if this query has been run
// in forced mode, because of an // in forced mode, because of an
// index or foreign table update. // index or foreign table update.

View file

@ -32,6 +32,7 @@ type executor struct {
dbo *mem.Cache dbo *mem.Cache
time int64 time int64
lock *mutex lock *mutex
opts *options
send chan *Response send chan *Response
cache *cache cache *cache
} }
@ -42,6 +43,8 @@ func newExecutor() (e *executor) {
e.dbo = mem.New() e.dbo = mem.New()
e.opts = newOptions()
e.send = make(chan *Response) e.send = make(chan *Response)
e.cache = new(cache) e.cache = new(cache)

View file

@ -322,7 +322,7 @@ func (d *document) mrgFld(ctx context.Context, met method) (err error) {
// We are setting the value of the field // We are setting the value of the field
if fd.Value != nil { if fd.Value != nil && d.i.e.opts.fields {
// Reset the variables // Reset the variables
@ -342,7 +342,7 @@ func (d *document) mrgFld(ctx context.Context, met method) (err error) {
// We are checking the value of the field // We are checking the value of the field
if fd.Assert != nil { if fd.Assert != nil && d.i.e.opts.fields {
// Reset the variables // Reset the variables

69
db/opt.go Normal file
View file

@ -0,0 +1,69 @@
// 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.
package db
import (
"context"
"strings"
"github.com/abcum/surreal/cnf"
"github.com/abcum/surreal/sql"
)
type options struct {
fields bool
events bool
tables bool
}
func newOptions() *options {
return &options{
fields: true,
events: true,
tables: true,
}
}
func (e *executor) executeOpt(ctx context.Context, stm *sql.OptStatement) (out []interface{}, err error) {
if k, ok := ctx.Value(ctxKeyKind).(cnf.Kind); ok {
if k >= cnf.AuthSC {
return nil, new(OptsError)
}
}
switch strings.ToUpper(stm.Name) {
case "PROCESS_FIELD_QUERIES":
e.opts.fields = stm.What
case "TRIGGER_EVENT_QUERIES":
e.opts.events = stm.What
case "TRIGGER_TABLE_QUERIES":
e.opts.tables = stm.What
case "IMPORT":
switch stm.What {
case true:
e.opts.fields = false // Set field queries
e.opts.events = false // Set event queries
e.opts.tables = true // Set table queries
case false:
e.opts.fields = true // Set field queries
e.opts.events = true // Set event queries
e.opts.tables = true // Set table queries
}
}
return
}

View file

@ -29,6 +29,10 @@ import (
// this table, and executes them in name order. // this table, and executes them in name order.
func (d *document) table(ctx context.Context, when method) (err error) { func (d *document) table(ctx context.Context, when method) (err error) {
if !d.i.e.opts.tables {
return nil
}
// Check if this query has been run // Check if this query has been run
// in forced mode, because of an // in forced mode, because of an
// index or foreign table update. // index or foreign table update.

View file

@ -53,19 +53,6 @@ type WriteableStatement interface {
Writeable() bool Writeable() bool
} }
// --------------------------------------------------
// Trans
// --------------------------------------------------
// UseStatement represents a SQL BEGIN TRANSACTION statement.
type BeginStatement struct{}
// UseStatement represents a SQL CANCEL TRANSACTION statement.
type CancelStatement struct{}
// UseStatement represents a SQL COMMIT TRANSACTION statement.
type CommitStatement struct{}
// -------------------------------------------------- // --------------------------------------------------
// Use // Use
// -------------------------------------------------- // --------------------------------------------------
@ -76,6 +63,29 @@ type UseStatement struct {
DB string DB string
} }
// --------------------------------------------------
// Options
// --------------------------------------------------
// OptStatement represents a SQL OPTION statement.
type OptStatement struct {
Name string
What bool
}
// --------------------------------------------------
// Trans
// --------------------------------------------------
// BeginStatement represents a SQL BEGIN TRANSACTION statement.
type BeginStatement struct{}
// CancelStatement represents a SQL CANCEL TRANSACTION statement.
type CancelStatement struct{}
// CommitStatement represents a SQL COMMIT TRANSACTION statement.
type CommitStatement struct{}
// -------------------------------------------------- // --------------------------------------------------
// Info // Info
// -------------------------------------------------- // --------------------------------------------------

View file

@ -184,6 +184,19 @@ func (p *parser) parseCond() (exp Expr, err error) {
// //
// -------------------------------------------------- // --------------------------------------------------
func (p *parser) parseBool() (bool, error) {
tok, lit, err := p.shouldBe(TRUE, FALSE)
if err != nil {
return false, &ParseError{Found: lit, Expected: []string{"true", "false"}}
}
val, err := p.declare(tok, lit)
return val.(bool), err
}
func (p *parser) parseBinary() ([]byte, error) { func (p *parser) parseBinary() ([]byte, error) {
_, lit, err := p.shouldBe(STRING, REGION) _, lit, err := p.shouldBe(STRING, REGION)

51
sql/option.go Normal file
View file

@ -0,0 +1,51 @@
// 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.
package sql
func (p *parser) parseOptionStatement() (stmt *OptStatement, err error) {
stmt = &OptStatement{What: true}
if _, _, _, err = p.a.get(AuthDB); err != nil {
return nil, err
}
_, lit, err := p.shouldBe(IDENT, STRING)
if err != nil {
return nil, &ParseError{Found: lit, Expected: []string{"name"}}
}
// The first part of a SET expression must
// always be an identifier, specifying a
// variable name to set.
stmt.Name = lit
// The next part might be a = operator,
// which mist be followed by a TRUE or
// FALSE boolean value.
if _, _, exi := p.mightBe(EQ); exi {
stmt.What, err = p.parseBool()
if err != nil {
return nil, err
}
}
return
}

View file

@ -167,6 +167,7 @@ func (p *parser) parseSingle() (stmt Statement, err error) {
UPSERT, UPSERT,
DEFINE, DEFINE,
REMOVE, REMOVE,
OPTION,
) )
switch tok { switch tok {
@ -218,6 +219,8 @@ func (p *parser) parseSingle() (stmt Statement, err error) {
return p.parseDefineStatement() return p.parseDefineStatement()
case REMOVE: case REMOVE:
return p.parseRemoveStatement() return p.parseRemoveStatement()
case OPTION:
return p.parseOptionStatement()
default: default:
return nil, err return nil, err

View file

@ -269,7 +269,7 @@ func Test_Parse_Queries_Malformed(t *testing.T) {
}, },
{ {
sql: `!`, sql: `!`,
err: "Found `!` but expected `USE, INFO, BEGIN, CANCEL, COMMIT, IF, LET, RETURN, LIVE, KILL, SELECT, CREATE, UPDATE, DELETE, RELATE, INSERT, UPSERT, DEFINE, REMOVE`", err: "Found `!` but expected `USE, INFO, BEGIN, CANCEL, COMMIT, IF, LET, RETURN, LIVE, KILL, SELECT, CREATE, UPDATE, DELETE, RELATE, INSERT, UPSERT, DEFINE, REMOVE, OPTION`",
}, },
} }

View file

@ -140,16 +140,11 @@ func toQuote(s string) bool {
// Statements // Statements
// --------------------------------------------- // ---------------------------------------------
func (this BeginStatement) String() string { func (this OptStatement) String() string {
return "BEGIN TRANSACTION" return print("OPTION %v%v",
} quote(this.Name),
maybe(this.What == false, print(" = %v", this.What)),
func (this CancelStatement) String() string { )
return "CANCEL TRANSACTION"
}
func (this CommitStatement) String() string {
return "COMMIT TRANSACTION"
} }
func (this UseStatement) String() string { func (this UseStatement) String() string {
@ -163,6 +158,18 @@ func (this UseStatement) String() string {
} }
} }
func (this BeginStatement) String() string {
return "BEGIN TRANSACTION"
}
func (this CancelStatement) String() string {
return "CANCEL TRANSACTION"
}
func (this CommitStatement) String() string {
return "COMMIT TRANSACTION"
}
func (this InfoStatement) String() string { func (this InfoStatement) String() string {
switch this.Kind { switch this.Kind {
case ALL: case ALL:

View file

@ -162,6 +162,7 @@ const (
NULL NULL
NUMERIC NUMERIC
ON ON
OPTION
OR OR
ORDER ORDER
PARALLEL PARALLEL
@ -340,6 +341,7 @@ var tokens = [...]string{
NULL: "NULL", NULL: "NULL",
NUMERIC: "NUMERIC", NUMERIC: "NUMERIC",
ON: "ON", ON: "ON",
OPTION: "OPTION",
OR: "OR", OR: "OR",
ORDER: "ORDER", ORDER: "ORDER",
PARALLEL: "PARALLEL", PARALLEL: "PARALLEL",