diff --git a/.gitignore b/.gitignore index 2652053..b5f55c7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,22 @@ +.travis.yml +coverage.txt +analysisVendor.png +.DS_Store y.output + +# Binaries for programs and plugins +bin/ +*.exe +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 +.glide/ +.idea/ diff --git a/README.md b/README.md index 58d4759..d043b72 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# sqlparser [![Build Status](https://img.shields.io/travis/xwb1989/sqlparser.svg)](https://travis-ci.org/xwb1989/sqlparser) [![Coverage](https://img.shields.io/coveralls/xwb1989/sqlparser.svg)](https://coveralls.io/github/xwb1989/sqlparser) [![Report card](https://goreportcard.com/badge/github.com/xwb1989/sqlparser)](https://goreportcard.com/report/github.com/xwb1989/sqlparser) [![GoDoc](https://godoc.org/github.com/xwb1989/sqlparser?status.svg)](https://godoc.org/github.com/xwb1989/sqlparser) +# sqlparser [![Report card](https://goreportcard.com/badge/github.com/CovenantSQL/sqlparser)](https://goreportcard.com/report/github.com/CovenantSQL/sqlparser) [![GoDoc](https://godoc.org/github.com/CovenantSQL/sqlparser?status.svg)](https://godoc.org/github.com/CovenantSQL/sqlparser) -Go package for parsing MySQL SQL queries. +Go package for parsing SQLite or SQL-92 queries. ## Notice @@ -13,7 +13,7 @@ It applies the same LICENSE as vitessio/vitess. ```go import ( - "github.com/xwb1989/sqlparser" + "github.com/CovenantSQL/sqlparser" ) ``` @@ -49,102 +49,4 @@ for { } ``` -See [parse_test.go](https://github.com/xwb1989/sqlparser/blob/master/parse_test.go) for more examples, or read the [godoc](https://godoc.org/github.com/xwb1989/sqlparser). - -## Porting Instructions - -You only need the below if you plan to try and keep this library up to date with [vitessio/vitess](https://github.com/vitessio/vitess). - -### Keeping up to date - -```bash -shopt -s nullglob -VITESS=${GOPATH?}/src/vitess.io/vitess/go/ -XWB1989=${GOPATH?}/src/github.com/xwb1989/sqlparser/ - -# Create patches for everything that changed -LASTIMPORT=1b7879cb91f1dfe1a2dfa06fea96e951e3a7aec5 -for path in ${VITESS?}/{vt/sqlparser,sqltypes,bytes2,hack}; do - cd ${path} - git format-patch ${LASTIMPORT?} . -done; - -# Apply patches to the dependencies -cd ${XWB1989?} -git am --directory dependency -p2 ${VITESS?}/{sqltypes,bytes2,hack}/*.patch - -# Apply the main patches to the repo -cd ${XWB1989?} -git am -p4 ${VITESS?}/vt/sqlparser/*.patch - -# If you encounter diff failures, manually fix them with -patch -p4 < .git/rebase-apply/patch -... -git add name_of_files -git am --continue - -# Cleanup -rm ${VITESS?}/{sqltypes,bytes2,hack}/*.patch ${VITESS?}/*.patch - -# and Finally update the LASTIMPORT in this README. -``` - -### Fresh install - -TODO: Change these instructions to use git to copy the files, that'll make later patching easier. - -```bash -VITESS=${GOPATH?}/src/vitess.io/vitess/go/ -XWB1989=${GOPATH?}/src/github.com/xwb1989/sqlparser/ - -cd ${XWB1989?} - -# Copy all the code -cp -pr ${VITESS?}/vt/sqlparser/ . -cp -pr ${VITESS?}/sqltypes dependency -cp -pr ${VITESS?}/bytes2 dependency -cp -pr ${VITESS?}/hack dependency - -# Delete some code we haven't ported -rm dependency/sqltypes/arithmetic.go dependency/sqltypes/arithmetic_test.go dependency/sqltypes/event_token.go dependency/sqltypes/event_token_test.go dependency/sqltypes/proto3.go dependency/sqltypes/proto3_test.go dependency/sqltypes/query_response.go dependency/sqltypes/result.go dependency/sqltypes/result_test.go - -# Some automated fixes - -# Fix imports -sed -i '.bak' 's_vitess.io/vitess/go/vt/proto/query_github.com/xwb1989/sqlparser/dependency/querypb_g' *.go dependency/sqltypes/*.go -sed -i '.bak' 's_vitess.io/vitess/go/_github.com/xwb1989/sqlparser/dependency/_g' *.go dependency/sqltypes/*.go - -# Copy the proto, but basically drop everything we don't want -cp -pr ${VITESS?}/vt/proto/query dependency/querypb - -sed -i '.bak' 's_.*Descriptor.*__g' dependency/querypb/*.go -sed -i '.bak' 's_.*ProtoMessage.*__g' dependency/querypb/*.go - -sed -i '.bak' 's/proto.CompactTextString(m)/"TODO"/g' dependency/querypb/*.go -sed -i '.bak' 's/proto.EnumName/EnumName/g' dependency/querypb/*.go - -sed -i '.bak' 's/proto.Equal/reflect.DeepEqual/g' dependency/sqltypes/*.go - -# Remove the error library -sed -i '.bak' 's/vterrors.Errorf([^,]*, /fmt.Errorf(/g' *.go dependency/sqltypes/*.go -sed -i '.bak' 's/vterrors.New([^,]*, /errors.New(/g' *.go dependency/sqltypes/*.go -``` - -### Testing - -```bash -VITESS=${GOPATH?}/src/vitess.io/vitess/go/ -XWB1989=${GOPATH?}/src/github.com/xwb1989/sqlparser/ - -cd ${XWB1989?} - -# Test, fix and repeat -go test ./... - -# Finally make some diffs (for later reference) -diff -u ${VITESS?}/sqltypes/ ${XWB1989?}/dependency/sqltypes/ > ${XWB1989?}/patches/sqltypes.patch -diff -u ${VITESS?}/bytes2/ ${XWB1989?}/dependency/bytes2/ > ${XWB1989?}/patches/bytes2.patch -diff -u ${VITESS?}/vt/proto/query/ ${XWB1989?}/dependency/querypb/ > ${XWB1989?}/patches/querypb.patch -diff -u ${VITESS?}/vt/sqlparser/ ${XWB1989?}/ > ${XWB1989?}/patches/sqlparser.patch -``` \ No newline at end of file diff --git a/analyzer.go b/analyzer.go index 95f97d3..3a84715 100644 --- a/analyzer.go +++ b/analyzer.go @@ -25,7 +25,7 @@ import ( "strings" "unicode" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) // These constants are used to identify the SQL statement type. @@ -173,7 +173,7 @@ func IsValue(node Expr) bool { switch v := node.(type) { case *SQLVal: switch v.Type { - case StrVal, HexVal, IntVal, ValArg: + case StrVal, HexVal, IntVal, ValArg, PosArg: return true } } @@ -212,7 +212,7 @@ func NewPlanValue(node Expr) (sqltypes.PlanValue, error) { switch node := node.(type) { case *SQLVal: switch node.Type { - case ValArg: + case ValArg, PosArg: return sqltypes.PlanValue{Key: string(node.Val[1:])}, nil case IntVal: n, err := sqltypes.NewIntegral(string(node.Val)) diff --git a/analyzer_test.go b/analyzer_test.go index 6d8c1ef..658d9fa 100644 --- a/analyzer_test.go +++ b/analyzer_test.go @@ -21,7 +21,7 @@ import ( "strings" "testing" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) func TestPreview(t *testing.T) { @@ -360,140 +360,6 @@ func TestStringIn(t *testing.T) { } } -func TestExtractSetValues(t *testing.T) { - testcases := []struct { - sql string - out map[SetKey]interface{} - scope string - err string - }{{ - sql: "invalid", - err: "syntax error at position 8 near 'invalid'", - }, { - sql: "select * from t", - err: "ast did not yield *sqlparser.Set: *sqlparser.Select", - }, { - sql: "set autocommit=1+1", - err: "invalid syntax: 1 + 1", - }, { - sql: "set transaction_mode='single'", - out: map[SetKey]interface{}{{Key: "transaction_mode", Scope: "session"}: "single"}, - }, { - sql: "set autocommit=1", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: int64(1)}, - }, { - sql: "set autocommit=true", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: int64(1)}, - }, { - sql: "set autocommit=false", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: int64(0)}, - }, { - sql: "set autocommit=on", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: "on"}, - }, { - sql: "set autocommit=off", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: "off"}, - }, { - sql: "set @@global.autocommit=1", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "global"}: int64(1)}, - }, { - sql: "set @@global.autocommit=1", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "global"}: int64(1)}, - }, { - sql: "set @@session.autocommit=1", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: int64(1)}, - }, { - sql: "set @@session.`autocommit`=1", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: int64(1)}, - }, { - sql: "set @@session.'autocommit'=1", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: int64(1)}, - }, { - sql: "set @@session.\"autocommit\"=1", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: int64(1)}, - }, { - sql: "set @@session.'\"autocommit'=1", - out: map[SetKey]interface{}{{Key: "\"autocommit", Scope: "session"}: int64(1)}, - }, { - sql: "set @@session.`autocommit'`=1", - out: map[SetKey]interface{}{{Key: "autocommit'", Scope: "session"}: int64(1)}, - }, { - sql: "set AUTOCOMMIT=1", - out: map[SetKey]interface{}{{Key: "autocommit", Scope: "session"}: int64(1)}, - }, { - sql: "SET character_set_results = NULL", - out: map[SetKey]interface{}{{Key: "character_set_results", Scope: "session"}: nil}, - }, { - sql: "SET foo = 0x1234", - err: "invalid value type: 0x1234", - }, { - sql: "SET names utf8", - out: map[SetKey]interface{}{{Key: "names", Scope: "session"}: "utf8"}, - }, { - sql: "SET names ascii collate ascii_bin", - out: map[SetKey]interface{}{{Key: "names", Scope: "session"}: "ascii"}, - }, { - sql: "SET charset default", - out: map[SetKey]interface{}{{Key: "charset", Scope: "session"}: "default"}, - }, { - sql: "SET character set ascii", - out: map[SetKey]interface{}{{Key: "charset", Scope: "session"}: "ascii"}, - }, { - sql: "SET SESSION wait_timeout = 3600", - out: map[SetKey]interface{}{{Key: "wait_timeout", Scope: "session"}: int64(3600)}, - scope: "session", - }, { - sql: "SET GLOBAL wait_timeout = 3600", - out: map[SetKey]interface{}{{Key: "wait_timeout", Scope: "session"}: int64(3600)}, - scope: "global", - }, { - sql: "set session transaction isolation level repeatable read", - out: map[SetKey]interface{}{{Key: "tx_isolation", Scope: "session"}: "repeatable read"}, - scope: "session", - }, { - sql: "set session transaction isolation level read committed", - out: map[SetKey]interface{}{{Key: "tx_isolation", Scope: "session"}: "read committed"}, - scope: "session", - }, { - sql: "set session transaction isolation level read uncommitted", - out: map[SetKey]interface{}{{Key: "tx_isolation", Scope: "session"}: "read uncommitted"}, - scope: "session", - }, { - sql: "set session transaction isolation level serializable", - out: map[SetKey]interface{}{{Key: "tx_isolation", Scope: "session"}: "serializable"}, - scope: "session", - }, { - sql: "set session tx_read_only = 0", - out: map[SetKey]interface{}{{Key: "tx_read_only", Scope: "session"}: int64(0)}, - scope: "session", - }, { - sql: "set session tx_read_only = 1", - out: map[SetKey]interface{}{{Key: "tx_read_only", Scope: "session"}: int64(1)}, - scope: "session", - }, { - sql: "set session sql_safe_updates = 0", - out: map[SetKey]interface{}{{Key: "sql_safe_updates", Scope: "session"}: int64(0)}, - scope: "session", - }, { - sql: "set session sql_safe_updates = 1", - out: map[SetKey]interface{}{{Key: "sql_safe_updates", Scope: "session"}: int64(1)}, - scope: "session", - }} - for _, tcase := range testcases { - out, _, err := ExtractSetValues(tcase.sql) - if tcase.err != "" { - if err == nil || err.Error() != tcase.err { - t.Errorf("ExtractSetValues(%s): %v, want '%s'", tcase.sql, err, tcase.err) - } - } else if err != nil { - t.Errorf("ExtractSetValues(%s): %v, want no error", tcase.sql, err) - } - if !reflect.DeepEqual(out, tcase.out) { - t.Errorf("ExtractSetValues(%s): %v, want '%v'", tcase.sql, out, tcase.out) - } - } -} - func newStrVal(in string) *SQLVal { return NewStrVal([]byte(in)) } diff --git a/ast.go b/ast.go index c3a0d08..8d77fc3 100644 --- a/ast.go +++ b/ast.go @@ -25,8 +25,8 @@ import ( "log" "strings" - "github.com/xwb1989/sqlparser/dependency/querypb" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) // Instructions for creating new types: If a type @@ -94,6 +94,36 @@ func ParseNext(tokenizer *Tokenizer) (Statement, error) { return tokenizer.ParseTree, nil } +// ParseMultiple returns multiple parsed original query and parsed statement. +func ParseMultiple(tokenizer *Tokenizer) (queries []string, statements []Statement, err error) { + var lastPos int + + for { + if tokenizer.lastChar == ';' { + tokenizer.next() + tokenizer.skipBlank() + lastPos = tokenizer.Position - 1 + } + if tokenizer.lastChar == eofChar { + break + } + + tokenizer.reset() + tokenizer.multi = true + if yyParse(tokenizer) != 0 && tokenizer.partialDDL == nil { + err = tokenizer.LastError + return + } + if tokenizer.partialDDL != nil { + statements = append(statements, tokenizer.partialDDL) + } else { + statements = append(statements, tokenizer.ParseTree) + } + queries = append(queries, string(tokenizer.buf[lastPos:tokenizer.Position-1])) + } + return +} + // SplitStatement returns the first sql statement up to either a ; or EOF // and the remainder from the given buffer func SplitStatement(blob string) (string, string, error) { @@ -207,22 +237,17 @@ type Statement interface { SQLNode } -func (*Union) iStatement() {} -func (*Select) iStatement() {} -func (*Stream) iStatement() {} -func (*Insert) iStatement() {} -func (*Update) iStatement() {} -func (*Delete) iStatement() {} -func (*Set) iStatement() {} -func (*DBDDL) iStatement() {} -func (*DDL) iStatement() {} -func (*Show) iStatement() {} -func (*Use) iStatement() {} -func (*Begin) iStatement() {} -func (*Commit) iStatement() {} -func (*Rollback) iStatement() {} -func (*OtherRead) iStatement() {} -func (*OtherAdmin) iStatement() {} +func (*Union) iStatement() {} +func (*Select) iStatement() {} +func (*Stream) iStatement() {} +func (*Insert) iStatement() {} +func (*Update) iStatement() {} +func (*Delete) iStatement() {} +func (*Set) iStatement() {} +func (*DBDDL) iStatement() {} +func (*DDL) iStatement() {} +func (*Show) iStatement() {} +func (*Explain) iStatement() {} // ParenSelect can actually not be a top level statement, // but we have to allow it because it's a requirement @@ -289,11 +314,16 @@ func (node *Select) SetLimit(limit *Limit) { // Format formats the node. func (node *Select) Format(buf *TrackedBuffer) { - buf.Myprintf("select %v%s%s%s%v from %v%v%v%v%v%v%s", - node.Comments, node.Cache, node.Distinct, node.Hints, node.SelectExprs, - node.From, node.Where, - node.GroupBy, node.Having, node.OrderBy, - node.Limit, node.Lock) + if node.From != nil { + buf.Myprintf("select %v%s%s%s%v from %v%v%v%v%v%v%s", + node.Comments, node.Cache, node.Distinct, node.Hints, node.SelectExprs, + node.From, node.Where, + node.GroupBy, node.Having, node.OrderBy, + node.Limit, node.Lock) + } else { + buf.Myprintf("select %v%s%s%s%v", + node.Comments, node.Cache, node.Distinct, node.Hints, node.SelectExprs) + } } func (node *Select) walkSubtree(visit Visit) error { @@ -659,18 +689,21 @@ type DDL struct { PartitionSpec *PartitionSpec VindexSpec *VindexSpec VindexCols []ColIdent + Options string } // DDL strings. const ( - CreateStr = "create" - AlterStr = "alter" - DropStr = "drop" - RenameStr = "rename" - TruncateStr = "truncate" - CreateVindexStr = "create vindex" - AddColVindexStr = "add vindex" - DropColVindexStr = "drop vindex" + CreateStr = "create" + AlterStr = "alter" + DropStr = "drop" + RenameStr = "rename" + DropIndexStr = "drop index" + CreateIndexStr = "create index" + CreateVirtualTableStr = "create virtual table" + CreateVindexStr = "create vindex" + AddColVindexStr = "add vindex" + DropColVindexStr = "drop vindex" // Vindex DDL param to specify the owner of a vindex VindexOwnerStr = "owner" @@ -691,8 +724,18 @@ func (node *DDL) Format(buf *TrackedBuffer) { exists = " if exists" } buf.Myprintf("%s table%s %v", node.Action, exists, node.Table) + case CreateIndexStr: + buf.Myprintf("%s on %v", node.Action, node.Table) + case CreateVirtualTableStr: + buf.Myprintf("%s virtual table %v", node.Action, node.Table) + case DropIndexStr: + exists := "" + if node.IfExists { + exists = " if exists" + } + buf.Myprintf("%s%s %v", node.Action, exists, node.Table) case RenameStr: - buf.Myprintf("%s table %v to %v", node.Action, node.Table, node.NewName) + buf.Myprintf("alter table %v %s to %v", node.Table, node.Action, node.NewName) case AlterStr: if node.PartitionSpec != nil { buf.Myprintf("%s table %v %v", node.Action, node.Table, node.PartitionSpec) @@ -930,12 +973,6 @@ func (ct *ColumnType) Format(buf *TrackedBuffer) { if ct.Zerofill { opts = append(opts, keywordStrings[ZEROFILL]) } - if ct.Charset != "" { - opts = append(opts, keywordStrings[CHARACTER], keywordStrings[SET], ct.Charset) - } - if ct.Collate != "" { - opts = append(opts, keywordStrings[COLLATE], ct.Collate) - } if ct.NotNull { opts = append(opts, keywordStrings[NOT], keywordStrings[NULL]) } @@ -948,9 +985,6 @@ func (ct *ColumnType) Format(buf *TrackedBuffer) { if ct.Autoincrement { opts = append(opts, keywordStrings[AUTO_INCREMENT]) } - if ct.Comment != nil { - opts = append(opts, keywordStrings[COMMENT_KEYWORD], String(ct.Comment)) - } if ct.KeyOpt == colKeyPrimary { opts = append(opts, keywordStrings[PRIMARY], keywordStrings[KEY]) } @@ -960,9 +994,6 @@ func (ct *ColumnType) Format(buf *TrackedBuffer) { if ct.KeyOpt == colKeyUniqueKey { opts = append(opts, keywordStrings[UNIQUE], keywordStrings[KEY]) } - if ct.KeyOpt == colKeySpatialKey { - opts = append(opts, keywordStrings[SPATIAL], keywordStrings[KEY]) - } if ct.KeyOpt == colKey { opts = append(opts, keywordStrings[KEY]) } @@ -1046,10 +1077,6 @@ func (ct *ColumnType) SQLType() querypb.Type { return sqltypes.Char case keywordStrings[VARCHAR]: return sqltypes.VarChar - case keywordStrings[BINARY]: - return sqltypes.Binary - case keywordStrings[VARBINARY]: - return sqltypes.VarBinary case keywordStrings[DATE]: return sqltypes.Date case keywordStrings[TIME]: @@ -1066,30 +1093,8 @@ func (ct *ColumnType) SQLType() querypb.Type { return sqltypes.Float64 case keywordStrings[DECIMAL]: return sqltypes.Decimal - case keywordStrings[BIT]: - return sqltypes.Bit - case keywordStrings[ENUM]: - return sqltypes.Enum case keywordStrings[SET]: return sqltypes.Set - case keywordStrings[JSON]: - return sqltypes.TypeJSON - case keywordStrings[GEOMETRY]: - return sqltypes.Geometry - case keywordStrings[POINT]: - return sqltypes.Geometry - case keywordStrings[LINESTRING]: - return sqltypes.Geometry - case keywordStrings[POLYGON]: - return sqltypes.Geometry - case keywordStrings[GEOMETRYCOLLECTION]: - return sqltypes.Geometry - case keywordStrings[MULTIPOINT]: - return sqltypes.Geometry - case keywordStrings[MULTILINESTRING]: - return sqltypes.Geometry - case keywordStrings[MULTIPOLYGON]: - return sqltypes.Geometry } panic("unimplemented type " + ct.Type) } @@ -1277,38 +1282,20 @@ func (node VindexParam) walkSubtree(visit Visit) error { // Show represents a show statement. type Show struct { - Type string - OnTable TableName - ShowTablesOpt *ShowTablesOpt - Scope string + Type string + OnTable TableName + ShowCreate bool } // Format formats the node. func (node *Show) Format(buf *TrackedBuffer) { - if node.Type == "tables" && node.ShowTablesOpt != nil { - opt := node.ShowTablesOpt - if opt.DbName != "" { - if opt.Filter != nil { - buf.Myprintf("show %s%stables from %s %v", opt.Extended, opt.Full, opt.DbName, opt.Filter) - } else { - buf.Myprintf("show %s%stables from %s", opt.Extended, opt.Full, opt.DbName) - } - } else { - if opt.Filter != nil { - buf.Myprintf("show %s%stables %v", opt.Extended, opt.Full, opt.Filter) - } else { - buf.Myprintf("show %s%stables", opt.Extended, opt.Full) - } - } - return - } - if node.Scope == "" { - buf.Myprintf("show %s", node.Type) - } else { - buf.Myprintf("show %s %s", node.Scope, node.Type) + buf.Myprintf("show ") + if node.ShowCreate { + buf.Myprintf("create ") } + buf.Myprintf("%s", node.Type) if node.HasOnTable() { - buf.Myprintf(" on %v", node.OnTable) + buf.Myprintf(" %v", node.OnTable) } } @@ -1321,113 +1308,16 @@ func (node *Show) walkSubtree(visit Visit) error { return nil } -// ShowTablesOpt is show tables option -type ShowTablesOpt struct { - Extended string - Full string - DbName string - Filter *ShowFilter -} - -// ShowFilter is show tables filter -type ShowFilter struct { - Like string - Filter Expr -} - -// Format formats the node. -func (node *ShowFilter) Format(buf *TrackedBuffer) { - if node.Like != "" { - buf.Myprintf("like '%s'", node.Like) - } else { - buf.Myprintf("where %v", node.Filter) - } -} - -func (node *ShowFilter) walkSubtree(visit Visit) error { - return nil -} - -// Use represents a use statement. -type Use struct { - DBName TableIdent -} - -// Format formats the node. -func (node *Use) Format(buf *TrackedBuffer) { - if node.DBName.v != "" { - buf.Myprintf("use %v", node.DBName) - } else { - buf.Myprintf("use") - } -} - -func (node *Use) walkSubtree(visit Visit) error { - return Walk(visit, node.DBName) -} - -// Begin represents a Begin statement. -type Begin struct{} - -// Format formats the node. -func (node *Begin) Format(buf *TrackedBuffer) { - buf.WriteString("begin") -} - -func (node *Begin) walkSubtree(visit Visit) error { - return nil -} - -// Commit represents a Commit statement. -type Commit struct{} - -// Format formats the node. -func (node *Commit) Format(buf *TrackedBuffer) { - buf.WriteString("commit") -} - -func (node *Commit) walkSubtree(visit Visit) error { - return nil -} - -// Rollback represents a Rollback statement. -type Rollback struct{} - -// Format formats the node. -func (node *Rollback) Format(buf *TrackedBuffer) { - buf.WriteString("rollback") -} - -func (node *Rollback) walkSubtree(visit Visit) error { - return nil -} - -// OtherRead represents a DESCRIBE, or EXPLAIN statement. -// It should be used only as an indicator. It does not contain -// the full AST for the statement. -type OtherRead struct{} - -// Format formats the node. -func (node *OtherRead) Format(buf *TrackedBuffer) { - buf.WriteString("otherread") -} - -func (node *OtherRead) walkSubtree(visit Visit) error { - return nil +// Explain represents a explain statement. +type Explain struct { } -// OtherAdmin represents a misc statement that relies on ADMIN privileges, -// such as REPAIR, OPTIMIZE, or TRUNCATE statement. -// It should be used only as an indicator. It does not contain -// the full AST for the statement. -type OtherAdmin struct{} - // Format formats the node. -func (node *OtherAdmin) Format(buf *TrackedBuffer) { - buf.WriteString("otheradmin") +func (node *Explain) Format(buf *TrackedBuffer) { + buf.WriteString("explain") } -func (node *OtherAdmin) walkSubtree(visit Visit) error { +func (node *Explain) walkSubtree(visit Visit) error { return nil } @@ -1800,13 +1690,13 @@ type JoinTableExpr struct { // JoinTableExpr.Join const ( - JoinStr = "join" - StraightJoinStr = "straight_join" - LeftJoinStr = "left join" - RightJoinStr = "right join" - NaturalJoinStr = "natural join" - NaturalLeftJoinStr = "natural left join" - NaturalRightJoinStr = "natural right join" + JoinStr = "join" + InnerJoinStr = "inner join" + CrossJoinStr = "cross join" + StraightJoinStr = "straight_join" + LeftJoinStr = "left join" + NaturalJoinStr = "natural join" + NaturalLeftJoinStr = "natural left join" ) // Format formats the node. @@ -1911,34 +1801,33 @@ type Expr interface { SQLNode } -func (*AndExpr) iExpr() {} -func (*OrExpr) iExpr() {} -func (*NotExpr) iExpr() {} -func (*ParenExpr) iExpr() {} -func (*ComparisonExpr) iExpr() {} -func (*RangeCond) iExpr() {} -func (*IsExpr) iExpr() {} -func (*ExistsExpr) iExpr() {} -func (*SQLVal) iExpr() {} -func (*NullVal) iExpr() {} -func (BoolVal) iExpr() {} -func (*ColName) iExpr() {} -func (ValTuple) iExpr() {} -func (*Subquery) iExpr() {} -func (ListArg) iExpr() {} -func (*BinaryExpr) iExpr() {} -func (*UnaryExpr) iExpr() {} -func (*IntervalExpr) iExpr() {} -func (*CollateExpr) iExpr() {} -func (*FuncExpr) iExpr() {} -func (*CaseExpr) iExpr() {} -func (*ValuesFuncExpr) iExpr() {} -func (*ConvertExpr) iExpr() {} -func (*SubstrExpr) iExpr() {} -func (*ConvertUsingExpr) iExpr() {} -func (*MatchExpr) iExpr() {} -func (*GroupConcatExpr) iExpr() {} -func (*Default) iExpr() {} +func (*AndExpr) iExpr() {} +func (*OrExpr) iExpr() {} +func (*NotExpr) iExpr() {} +func (*ParenExpr) iExpr() {} +func (*ComparisonExpr) iExpr() {} +func (*RangeCond) iExpr() {} +func (*IsExpr) iExpr() {} +func (*ExistsExpr) iExpr() {} +func (*SQLVal) iExpr() {} +func (*NullVal) iExpr() {} +func (BoolVal) iExpr() {} +func (*ColName) iExpr() {} +func (ValTuple) iExpr() {} +func (*Subquery) iExpr() {} +func (ListArg) iExpr() {} +func (*BinaryExpr) iExpr() {} +func (*UnaryExpr) iExpr() {} +func (*IntervalExpr) iExpr() {} +func (*CollateExpr) iExpr() {} +func (*FuncExpr) iExpr() {} +func (*CaseExpr) iExpr() {} +func (*ValuesFuncExpr) iExpr() {} +func (*ConvertExpr) iExpr() {} +func (*MatchExpr) iExpr() {} +func (*GroupConcatExpr) iExpr() {} +func (*Default) iExpr() {} +func (*TimeExpr) iExpr() {} // ReplaceExpr finds the from expression from root // and replaces it with to. If from matches root, @@ -2098,21 +1987,22 @@ type ComparisonExpr struct { // ComparisonExpr.Operator const ( - EqualStr = "=" - LessThanStr = "<" - GreaterThanStr = ">" - LessEqualStr = "<=" - GreaterEqualStr = ">=" - NotEqualStr = "!=" - NullSafeEqualStr = "<=>" - InStr = "in" - NotInStr = "not in" - LikeStr = "like" - NotLikeStr = "not like" - RegexpStr = "regexp" - NotRegexpStr = "not regexp" - JSONExtractOp = "->" - JSONUnquoteExtractOp = "->>" + EqualStr = "=" + LessThanStr = "<" + GreaterThanStr = ">" + LessEqualStr = "<=" + GreaterEqualStr = ">=" + NotEqualStr = "!=" + NullSafeEqualStr = "<=>" + NullSafeNotEqualStr = "<>" + InStr = "in" + NotInStr = "not in" + LikeStr = "like" + NotLikeStr = "not like" + RegexpStr = "regexp" + NotRegexpStr = "not regexp" + MatchStr = "match" + NotMatchStr = "not match" ) // Format formats the node. @@ -2266,6 +2156,7 @@ const ( HexVal ValArg BitVal + PosArg ) // SQLVal represents a single value. @@ -2309,6 +2200,11 @@ func NewValArg(in []byte) *SQLVal { return &SQLVal{Type: ValArg, Val: in} } +// NewPosArg build a new PosArg. +func NewPosArg(in []byte) *SQLVal { + return &SQLVal{Type: PosArg, Val: in} +} + // Format formats the node. func (node *SQLVal) Format(buf *TrackedBuffer) { switch node.Type { @@ -2322,6 +2218,8 @@ func (node *SQLVal) Format(buf *TrackedBuffer) { buf.Myprintf("B'%s'", []byte(node.Val)) case ValArg: buf.WriteArg(string(node.Val)) + case PosArg: + buf.WriteArg("?") default: panic("unexpected") } @@ -2626,6 +2524,24 @@ func (node *CollateExpr) replace(from, to Expr) bool { return replaceExprs(from, to, &node.Expr) } +// TimeExpr represents a time expression. +type TimeExpr struct { + Expr ColIdent +} + +// Format formats the node. +func (node *TimeExpr) Format(buf *TrackedBuffer) { + buf.Myprintf(node.Expr.Lowered()) +} + +func (node *TimeExpr) walkSubtree(visit Visit) error { + return nil +} + +func (node *TimeExpr) replace(from, to Expr) bool { + return false +} + // FuncExpr represents a function call. type FuncExpr struct { Qualifier TableIdent @@ -2765,40 +2681,6 @@ func (node *ValuesFuncExpr) replace(from, to Expr) bool { return false } -// SubstrExpr represents a call to SubstrExpr(column, value_expression) or SubstrExpr(column, value_expression,value_expression) -// also supported syntax SubstrExpr(column from value_expression for value_expression) -type SubstrExpr struct { - Name *ColName - From Expr - To Expr -} - -// Format formats the node. -func (node *SubstrExpr) Format(buf *TrackedBuffer) { - - if node.To == nil { - buf.Myprintf("substr(%v, %v)", node.Name, node.From) - } else { - buf.Myprintf("substr(%v, %v, %v)", node.Name, node.From, node.To) - } -} - -func (node *SubstrExpr) replace(from, to Expr) bool { - return replaceExprs(from, to, &node.From, &node.To) -} - -func (node *SubstrExpr) walkSubtree(visit Visit) error { - if node == nil { - return nil - } - return Walk( - visit, - node.Name, - node.From, - node.To, - ) -} - // ConvertExpr represents a call to CONVERT(expr, type) // or it's equivalent CAST(expr AS type). Both are rewritten to the former. type ConvertExpr struct { @@ -2808,7 +2690,7 @@ type ConvertExpr struct { // Format formats the node. func (node *ConvertExpr) Format(buf *TrackedBuffer) { - buf.Myprintf("convert(%v, %v)", node.Expr, node.Type) + buf.Myprintf("cast(%v as %v)", node.Expr, node.Type) } func (node *ConvertExpr) walkSubtree(visit Visit) error { @@ -2826,31 +2708,6 @@ func (node *ConvertExpr) replace(from, to Expr) bool { return replaceExprs(from, to, &node.Expr) } -// ConvertUsingExpr represents a call to CONVERT(expr USING charset). -type ConvertUsingExpr struct { - Expr Expr - Type string -} - -// Format formats the node. -func (node *ConvertUsingExpr) Format(buf *TrackedBuffer) { - buf.Myprintf("convert(%v using %s)", node.Expr, node.Type) -} - -func (node *ConvertUsingExpr) walkSubtree(visit Visit) error { - if node == nil { - return nil - } - return Walk( - visit, - node.Expr, - ) -} - -func (node *ConvertUsingExpr) replace(from, to Expr) bool { - return replaceExprs(from, to, &node.Expr) -} - // ConvertType represents the type in call to CONVERT(expr, type) type ConvertType struct { Type string diff --git a/ast_test.go b/ast_test.go index c02d882..30af5f2 100644 --- a/ast_test.go +++ b/ast_test.go @@ -24,7 +24,7 @@ import ( "testing" "unsafe" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) func TestAppend(t *testing.T) { @@ -110,27 +110,6 @@ func TestSelect(t *testing.T) { } } -func TestRemoveHints(t *testing.T) { - for _, query := range []string{ - "select * from t use index (i)", - "select * from t force index (i)", - } { - tree, err := Parse(query) - if err != nil { - t.Fatal(err) - } - sel := tree.(*Select) - sel.From = TableExprs{ - sel.From[0].(*AliasedTableExpr).RemoveHints(), - } - buf := NewTrackedBuffer(nil) - sel.Format(buf) - if got, want := buf.String(), "select * from t"; got != want { - t.Errorf("stripped query: %s, want %s", got, want) - } - } -} - func TestAddOrder(t *testing.T) { src, err := Parse("select foo, bar from baz order by foo") if err != nil { @@ -290,9 +269,6 @@ func TestReplaceExpr(t *testing.T) { }, { in: "select * from t where interval (select a from b) aa", out: "interval :a aa", - }, { - in: "select * from t where (select a from b) collate utf8", - out: ":a collate utf8", }, { in: "select * from t where func((select a from b), 1)", out: "func(:a, 1)", @@ -314,21 +290,6 @@ func TestReplaceExpr(t *testing.T) { }, { in: "select * from t where substr(a, b, (select a from b))", out: "substr(a, b, :a)", - }, { - in: "select * from t where convert((select a from b), json)", - out: "convert(:a, json)", - }, { - in: "select * from t where convert((select a from b) using utf8)", - out: "convert(:a using utf8)", - }, { - in: "select * from t where match((select a from b), 1) against (a)", - out: "match(:a, 1) against (a)", - }, { - in: "select * from t where match(1, (select a from b), 1) against (a)", - out: "match(1, :a, 1) against (a)", - }, { - in: "select * from t where match(1, a, 1) against ((select a from b))", - out: "match(1, a, 1) against (:a)", }, { in: "select * from t where case (select a from b) when a then b when b then c else d end", out: "case :a when a then b when b then c else d end", diff --git a/comments_test.go b/comments_test.go index 430293b..1f9d61f 100644 --- a/comments_test.go +++ b/comments_test.go @@ -347,29 +347,3 @@ func TestExtractCommentDirectives(t *testing.T) { } } -func TestSkipQueryPlanCacheDirective(t *testing.T) { - stmt, _ := Parse("insert /*vt+ SKIP_QUERY_PLAN_CACHE=1 */ into user(id) values (1), (2)") - if !SkipQueryPlanCacheDirective(stmt) { - t.Errorf("d.SkipQueryPlanCacheDirective(stmt) should be true") - } - - stmt, _ = Parse("insert into user(id) values (1), (2)") - if SkipQueryPlanCacheDirective(stmt) { - t.Errorf("d.SkipQueryPlanCacheDirective(stmt) should be false") - } - - stmt, _ = Parse("update /*vt+ SKIP_QUERY_PLAN_CACHE=1 */ users set name=1") - if !SkipQueryPlanCacheDirective(stmt) { - t.Errorf("d.SkipQueryPlanCacheDirective(stmt) should be true") - } - - stmt, _ = Parse("select /*vt+ SKIP_QUERY_PLAN_CACHE=1 */ * from users") - if !SkipQueryPlanCacheDirective(stmt) { - t.Errorf("d.SkipQueryPlanCacheDirective(stmt) should be true") - } - - stmt, _ = Parse("delete /*vt+ SKIP_QUERY_PLAN_CACHE=1 */ from users") - if !SkipQueryPlanCacheDirective(stmt) { - t.Errorf("d.SkipQueryPlanCacheDirective(stmt) should be true") - } -} diff --git a/dependency/sqltypes/bind_variables.go b/dependency/sqltypes/bind_variables.go index 1879e6d..573febf 100644 --- a/dependency/sqltypes/bind_variables.go +++ b/dependency/sqltypes/bind_variables.go @@ -22,7 +22,7 @@ import ( "reflect" "strconv" - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" ) // NullBindVariable is a bindvar with NULL value. diff --git a/dependency/sqltypes/bind_variables_test.go b/dependency/sqltypes/bind_variables_test.go index ca0636c..58c673b 100644 --- a/dependency/sqltypes/bind_variables_test.go +++ b/dependency/sqltypes/bind_variables_test.go @@ -21,7 +21,7 @@ import ( "strings" "testing" - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" ) func TestProtoConversions(t *testing.T) { diff --git a/dependency/sqltypes/plan_value.go b/dependency/sqltypes/plan_value.go index 7936a6b..d44e551 100644 --- a/dependency/sqltypes/plan_value.go +++ b/dependency/sqltypes/plan_value.go @@ -21,7 +21,7 @@ import ( "errors" "fmt" - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" ) // PlanValue represents a value or a list of values for diff --git a/dependency/sqltypes/plan_value_test.go b/dependency/sqltypes/plan_value_test.go index ea85c9c..ac89b07 100644 --- a/dependency/sqltypes/plan_value_test.go +++ b/dependency/sqltypes/plan_value_test.go @@ -21,7 +21,7 @@ import ( "strings" "testing" - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" ) func TestPlanValueIsNull(t *testing.T) { diff --git a/dependency/sqltypes/testing.go b/dependency/sqltypes/testing.go index 0acaedd..7816018 100644 --- a/dependency/sqltypes/testing.go +++ b/dependency/sqltypes/testing.go @@ -17,7 +17,7 @@ limitations under the License. package sqltypes import ( - querypb "github.com/xwb1989/sqlparser/dependency/querypb" + querypb "github.com/CovenantSQL/sqlparser/dependency/querypb" ) // Functions in this file should only be used for testing. diff --git a/dependency/sqltypes/type.go b/dependency/sqltypes/type.go index 49224e4..38c5826 100644 --- a/dependency/sqltypes/type.go +++ b/dependency/sqltypes/type.go @@ -19,7 +19,7 @@ package sqltypes import ( "fmt" - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" ) // This file provides wrappers and support diff --git a/dependency/sqltypes/type_test.go b/dependency/sqltypes/type_test.go index 613fcda..2e22ffe 100644 --- a/dependency/sqltypes/type_test.go +++ b/dependency/sqltypes/type_test.go @@ -19,7 +19,7 @@ package sqltypes import ( "testing" - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" ) func TestTypeValues(t *testing.T) { diff --git a/dependency/sqltypes/value.go b/dependency/sqltypes/value.go index a3bceee..1fcc281 100644 --- a/dependency/sqltypes/value.go +++ b/dependency/sqltypes/value.go @@ -23,10 +23,9 @@ import ( "fmt" "strconv" - "github.com/xwb1989/sqlparser/dependency/bytes2" - "github.com/xwb1989/sqlparser/dependency/hack" - - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/bytes2" + "github.com/CovenantSQL/sqlparser/dependency/hack" + "github.com/CovenantSQL/sqlparser/dependency/querypb" ) var ( @@ -325,7 +324,11 @@ func encodeBytesSQL(val []byte, b BinWriter) { if encodedChar := SQLEncodeMap[ch]; encodedChar == DontEscape { buf.WriteByte(ch) } else { - buf.WriteByte('\\') + if ch == '\'' { + buf.WriteByte('\'') + } else { + buf.WriteByte('\\') + } buf.WriteByte(encodedChar) } } @@ -359,7 +362,6 @@ var encodeRef = map[byte]byte{ '\r': 'r', '\t': 't', 26: 'Z', // ctl-Z - '\\': '\\', } func init() { diff --git a/dependency/sqltypes/value_test.go b/dependency/sqltypes/value_test.go index 96b137d..2f32eaf 100644 --- a/dependency/sqltypes/value_test.go +++ b/dependency/sqltypes/value_test.go @@ -22,7 +22,7 @@ import ( "strings" "testing" - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" ) const ( @@ -379,8 +379,8 @@ func TestEncode(t *testing.T) { outSQL: "'foo'", outASCII: "'Zm9v'", }, { - in: TestValue(VarChar, "\x00'\"\b\n\r\t\x1A\\"), - outSQL: "'\\0\\'\\\"\\b\\n\\r\\t\\Z\\\\'", + in: TestValue(VarChar, "\x00''\b\n\r\t\x1A\\"), + outSQL: `\x00''\b\n\r\t\x1A\\`, outASCII: "'ACciCAoNCRpc'", }} for _, tcase := range testcases { diff --git a/encodable.go b/encodable.go index badfa42..427553a 100644 --- a/encodable.go +++ b/encodable.go @@ -19,7 +19,7 @@ package sqlparser import ( "bytes" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) // This file contains types that are 'Encodable'. diff --git a/encodable_test.go b/encodable_test.go index 3bfc774..10fb931 100644 --- a/encodable_test.go +++ b/encodable_test.go @@ -20,7 +20,7 @@ import ( "bytes" "testing" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) func TestEncodable(t *testing.T) { diff --git a/github_test.go b/github_test.go deleted file mode 100644 index 01ab03e..0000000 --- a/github_test.go +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2017 Google Inc. - -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 agreedto 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 sqlparser - -// Additional tests to address the GitHub issues for this fork. - -import ( - "io" - "strings" - "testing" -) - -func TestParsing(t *testing.T) { - tests := []struct { - id int // Github issue ID - sql string - skip string - }{ - {id: 9, sql: "select 1 as 测试 from dual", skip: "Broken due to ReadByte()"}, - {id: 12, sql: "SELECT * FROM AccessToken LIMIT 10 OFFSET 13"}, - {id: 14, sql: "SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH)"}, - {id: 15, sql: "select STRAIGHT_JOIN t1.* FROM t1 INNER JOIN t2 ON t1.CommonID = t2.CommonID WHERE t1.FilterID = 1"}, - {id: 16, sql: "SELECT a FROM t WHERE FUNC(a) = 1"}, // Doesn't seem broken, need better example - {id: 21, sql: `CREATE TABLE t (UpdateDatetime TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP)`}, - {id: 21, sql: `CREATE TABLE t (UpdateDatetime TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间')`}, - {id: 24, sql: `select * from t1 join t2 using(id)`}, - } - - for _, test := range tests { - if test.skip != "" { - continue - } - - if _, err := Parse(test.sql); err != nil { - t.Errorf("https://github.com/xwb1989/sqlparser/issues/%d:\nParse(%q) err = %s, want nil", test.id, test.sql, err) - } - } -} - -// ExampleParse is the first example from the README.md. -func ExampleParse() { - sql := "SELECT * FROM table WHERE a = 'abc'" - stmt, err := Parse(sql) - if err != nil { - // Do something with the err - } - - // Otherwise do something with stmt - switch stmt := stmt.(type) { - case *Select: - _ = stmt - case *Insert: - } -} - -// ExampleParseNext is the second example from the README.md. -func ExampleParseNext() { - r := strings.NewReader("INSERT INTO table1 VALUES (1, 'a'); INSERT INTO table2 VALUES (3, 4);") - - tokens := NewTokenizer(r) - for { - stmt, err := ParseNext(tokens) - if err == io.EOF { - break - } - // Do something with stmt or err. - _ = stmt - } -} diff --git a/normalizer.go b/normalizer.go index f652031..d3edb56 100644 --- a/normalizer.go +++ b/normalizer.go @@ -19,9 +19,8 @@ package sqlparser import ( "fmt" - "github.com/xwb1989/sqlparser/dependency/sqltypes" - - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) // Normalize changes the statement to use bind values, and diff --git a/normalizer_test.go b/normalizer_test.go index 20f7e39..c0bd6f2 100644 --- a/normalizer_test.go +++ b/normalizer_test.go @@ -21,8 +21,8 @@ import ( "reflect" "testing" - "github.com/xwb1989/sqlparser/dependency/querypb" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) func TestNormalize(t *testing.T) { diff --git a/parse_next_test.go b/parse_next_test.go index bb92f9f..807a807 100644 --- a/parse_next_test.go +++ b/parse_next_test.go @@ -119,12 +119,12 @@ func TestParseNextEdgeCases(t *testing.T) { want: []string{"select 1 from a", "update a set b = 2"}, }, { name: "Handle ForceEOF statements", - input: "set character set utf8; select 1 from a", - want: []string{"set charset 'utf8'", "select 1 from a"}, + input: "create index b on a; select 1 from a", + want: []string{"create index on a", "select 1 from a"}, }, { name: "Semicolin inside a string", - input: "set character set ';'; select 1 from a", - want: []string{"set charset ';'", "select 1 from a"}, + input: "select ';'; select 1 from a", + want: []string{"select ';'", "select 1 from a"}, }, { name: "Partial DDL", input: "create table a; select 1 from a", diff --git a/parse_test.go b/parse_test.go index ac65962..7e40ba9 100644 --- a/parse_test.go +++ b/parse_test.go @@ -28,8 +28,9 @@ var ( input string output string }{{ - input: "select 1", - output: "select 1 from dual", + input: "select 1", + }, { + input: "insert /* simple */ into a values (1)", }, { input: "select 1 from t", }, { @@ -95,8 +96,6 @@ var ( input: "select /* double union */ 1 from t union select 1 from t union select 1 from t", }, { input: "select /* union all */ 1 from t union all select 1 from t", - }, { - input: "select /* union distinct */ 1 from t union distinct select 1 from t", }, { input: "(select /* union parenthesized select */ 1 from t order by a) union select 1 from t", output: "(select /* union parenthesized select */ 1 from t order by a asc) union select 1 from t", @@ -105,9 +104,6 @@ var ( }, { input: "select /* union order by */ 1 from t union select 1 from t order by a", output: "select /* union order by */ 1 from t union select 1 from t order by a asc", - }, { - input: "select /* union order by limit lock */ 1 from t union select 1 from t order by a limit 1 for update", - output: "select /* union order by limit lock */ 1 from t union select 1 from t order by a asc limit 1 for update", }, { input: "select /* union with limit on lhs */ 1 from t limit 1 union select 1 from t", }, { @@ -126,12 +122,6 @@ var ( input: "select * from t1 where exists (select a from t2 union select b from t3)", }, { input: "select /* distinct */ distinct 1 from t", - }, { - input: "select /* straight_join */ straight_join 1 from t", - }, { - input: "select /* for update */ 1 from t for update", - }, { - input: "select /* lock in share mode */ 1 from t lock in share mode", }, { input: "select /* select list */ 1, 2 from t", }, { @@ -155,16 +145,6 @@ var ( output: "select /* column alias as string without as */ a as b from t", }, { input: "select /* a.* */ a.* from t", - }, { - input: "select next value for t", - output: "select next 1 values from t", - }, { - input: "select next value from t", - output: "select next 1 values from t", - }, { - input: "select next 10 values from t", - }, { - input: "select next :a values from t", }, { input: "select /* `By`.* */ `By`.* from t", }, { @@ -187,16 +167,6 @@ var ( input: "select /* parenthessis in table list 1 */ 1 from (t1), t2", }, { input: "select /* parenthessis in table list 2 */ 1 from t1, (t2)", - }, { - input: "select /* use */ 1 from t1 use index (a) where b = 1", - }, { - input: "select /* keyword index */ 1 from t1 use index (`By`) where b = 1", - }, { - input: "select /* ignore */ 1 from t1 as t2 ignore index (a), t3 use index (b) where b = 1", - }, { - input: "select /* use */ 1 from t1 as t2 use index (a), t3 use index (b) where b = 1", - }, { - input: "select /* force */ 1 from t1 as t2 force index (a), t3 force index (b) where b = 1", }, { input: "select /* table alias */ 1 from t t1", output: "select /* table alias */ 1 from t as t1", @@ -217,15 +187,11 @@ var ( }, { input: "select /* join on */ 1 from t1 join t2 using (a)", }, { - input: "select /* inner join */ 1 from t1 inner join t2", - output: "select /* inner join */ 1 from t1 join t2", - }, { - input: "select /* cross join */ 1 from t1 cross join t2", - output: "select /* cross join */ 1 from t1 join t2", + input: "select /* inner join */ 1 from t1 join t2", }, { - input: "select /* straight_join */ 1 from t1 straight_join t2", + input: "select /* inner join */ 1 from t1 inner join t2", }, { - input: "select /* straight_join on */ 1 from t1 straight_join t2 on a = b", + input: "select /* cross join */ 1 from t1 cross join t2", }, { input: "select /* left join */ 1 from t1 left join t2 on a = b", }, { @@ -236,16 +202,6 @@ var ( }, { input: "select /* left outer join */ 1 from t1 left outer join t2 using (a)", output: "select /* left outer join */ 1 from t1 left join t2 using (a)", - }, { - input: "select /* right join */ 1 from t1 right join t2 on a = b", - }, { - input: "select /* right join */ 1 from t1 right join t2 using (a)", - }, { - input: "select /* right outer join */ 1 from t1 right outer join t2 on a = b", - output: "select /* right outer join */ 1 from t1 right join t2 on a = b", - }, { - input: "select /* right outer join */ 1 from t1 right outer join t2 using (a)", - output: "select /* right outer join */ 1 from t1 right join t2 using (a)", }, { input: "select /* natural join */ 1 from t1 natural join t2", }, { @@ -253,11 +209,6 @@ var ( }, { input: "select /* natural left outer join */ 1 from t1 natural left join t2", output: "select /* natural left outer join */ 1 from t1 natural left join t2", - }, { - input: "select /* natural right join */ 1 from t1 natural right join t2", - }, { - input: "select /* natural right outer join */ 1 from t1 natural right join t2", - output: "select /* natural right outer join */ 1 from t1 natural right join t2", }, { input: "select /* join on */ 1 from t1 join t2 on a = b", }, { @@ -354,14 +305,11 @@ var ( }, { input: "select /* != */ 1 from t where a != b", }, { - input: "select /* <> */ 1 from t where a <> b", - output: "select /* <> */ 1 from t where a != b", - }, { - input: "select /* <=> */ 1 from t where a <=> b", + input: "select /* <> */ 1 from t where a <> b", }, { input: "select /* != */ 1 from t where a != b", }, { - input: "select /* single value expre list */ 1 from t where a in (b)", + input: "select /* single value expression list */ 1 from t where a in (b)", }, { input: "select /* select as a value expression */ 1 from t where a = (select a from t)", }, { @@ -406,10 +354,6 @@ var ( input: "select /* u- */ 1 from t where a = -b", }, { input: "select /* u~ */ 1 from t where a = ~b", - }, { - input: "select /* -> */ a.b -> 'ab' from t", - }, { - input: "select /* -> */ a.b ->> 'ab' from t", }, { input: "select /* empty function */ 1 from t where a = b()", }, { @@ -420,8 +364,6 @@ var ( input: "select /* function with distinct */ count(distinct a) from t", }, { input: "select /* if as func */ 1 from t where a = if(b)", - }, { - input: "select /* current_timestamp as func */ current_timestamp() from t", }, { input: "select /* mod as func */ a from tab where mod(b, 2) = 0", }, { @@ -443,22 +385,20 @@ var ( output: "select /* double quoted string */ 'a' from t", }, { input: "select /* quote quote in string */ 'a''a' from t", - output: "select /* quote quote in string */ 'a\\'a' from t", + output: "select /* quote quote in string */ 'a''a' from t", }, { input: "select /* double quote quote in string */ \"a\"\"a\" from t", output: "select /* double quote quote in string */ 'a\\\"a' from t", }, { input: "select /* quote in double quoted string */ \"a'a\" from t", - output: "select /* quote in double quoted string */ 'a\\'a' from t", + output: "select /* quote in double quoted string */ 'a''a' from t", }, { - input: "select /* backslash quote in string */ 'a\\'a' from t", + input: "select /* backslash quote in string */ 'a''a' from t", + output: "select /* backslash quote in string */ 'a''a' from t", }, { input: "select /* literal backslash in string */ 'a\\\\na' from t", - }, { - input: "select /* all escapes */ '\\0\\'\\\"\\b\\n\\r\\t\\Z\\\\' from t", }, { input: "select /* non-escape */ '\\x' from t", - output: "select /* non-escape */ 'x' from t", }, { input: "select /* unescaped backslash */ '\\n' from t", }, { @@ -486,11 +426,6 @@ var ( output: "select /* hex */ X'f0A1' from t", }, { input: "select /* hex caps */ X'F0a1' from t", - }, { - input: "select /* bit literal */ b'0101' from t", - output: "select /* bit literal */ B'0101' from t", - }, { - input: "select /* bit literal caps */ B'010011011010' from t", }, { input: "select /* 0x */ 0xf0 from t", }, { @@ -517,12 +452,6 @@ var ( output: "select /* binary unary */ a - -b from t", }, { input: "select /* - - */ - -b from t", - }, { - input: "select /* binary binary */ binary binary b from t", - }, { - input: "select /* binary ~ */ binary ~b from t", - }, { - input: "select /* ~ binary */ ~ binary b from t", }, { input: "select /* interval */ adddate('2008-01-02', interval 31 day) from t", }, { @@ -551,9 +480,6 @@ var ( input: "select /* bool in order by */ * from t order by a is null or b asc", }, { input: "select /* string in case statement */ if(max(case a when 'foo' then 1 else 0 end) = 1, 'foo', 'bar') as foobar from t", - }, { - input: "/*!show databases*/", - output: "show databases", }, { input: "select /*!40101 * from*/ t", output: "select * from t", @@ -568,8 +494,6 @@ var ( output: "select 1 from t", }, { input: "select /* dual */ 1 from dual", - }, { - input: "insert /* simple */ into a values (1)", }, { input: "insert /* a.b */ into a.b values (1)", }, { @@ -607,18 +531,8 @@ var ( output: "insert /* cols & paren select */ into a(a, b, c) select * from t", }, { input: "insert /* cols & union with paren select */ into a(b, c) (select d, e from f) union (select g from h)", - }, { - input: "insert /* on duplicate */ into a values (1, 2) on duplicate key update b = func(a), c = d", }, { input: "insert /* bool in insert value */ into a values (1, true, false)", - }, { - input: "insert /* bool in on duplicate */ into a values (1, 2) on duplicate key update b = false, c = d", - }, { - input: "insert /* bool in on duplicate */ into a values (1, 2, 3) on duplicate key update b = values(b), c = d", - }, { - input: "insert /* bool in on duplicate */ into a values (1, 2, 3) on duplicate key update b = values(a.b), c = d", - }, { - input: "insert /* bool expression on duplicate */ into a values (1, 2) on duplicate key update b = func(a), c = a > d", }, { input: "update /* simple */ a set b = 3", }, { @@ -666,251 +580,13 @@ var ( }, { input: "delete /* limit */ from a limit b", }, { - input: "delete a from a join b on a.id = b.id where b.name = 'test'", - }, { - input: "delete a, b from a, b where a.id = b.id and b.name = 'test'", - }, { - input: "delete from a1, a2 using t1 as a1 inner join t2 as a2 where a1.id=a2.id", - output: "delete a1, a2 from t1 as a1 join t2 as a2 where a1.id = a2.id", - }, { - input: "set /* simple */ a = 3", - }, { - input: "set #simple\n b = 4", - }, { - input: "set character_set_results = utf8", - }, { - input: "set @@session.autocommit = true", - }, { - input: "set @@session.`autocommit` = true", - }, { - input: "set @@session.'autocommit' = true", - }, { - input: "set @@session.\"autocommit\" = true", - }, { - input: "set names utf8 collate foo", - output: "set names 'utf8'", - }, { - input: "set character set utf8", - output: "set charset 'utf8'", - }, { - input: "set character set 'utf8'", - output: "set charset 'utf8'", - }, { - input: "set character set \"utf8\"", - output: "set charset 'utf8'", - }, { - input: "set charset default", - output: "set charset default", - }, { - input: "set session wait_timeout = 3600", - output: "set session wait_timeout = 3600", - }, { - input: "set /* list */ a = 3, b = 4", - }, { - input: "set /* mixed list */ a = 3, names 'utf8', charset 'ascii', b = 4", - }, { - input: "set session transaction isolation level repeatable read", - output: "set session tx_isolation = 'repeatable read'", - }, { - input: "set global transaction isolation level repeatable read", - output: "set global tx_isolation = 'repeatable read'", - }, { - input: "set transaction isolation level repeatable read", - output: "set tx_isolation = 'repeatable read'", - }, { - input: "set transaction isolation level read committed", - output: "set tx_isolation = 'read committed'", - }, { - input: "set transaction isolation level read uncommitted", - output: "set tx_isolation = 'read uncommitted'", - }, { - input: "set transaction isolation level serializable", - output: "set tx_isolation = 'serializable'", - }, { - input: "set transaction read write", - output: "set tx_read_only = 0", - }, { - input: "set transaction read only", - output: "set tx_read_only = 1", - }, { - input: "set tx_read_only = 1", - }, { - input: "set tx_read_only = 0", - }, { - input: "set tx_isolation = 'repeatable read'", - }, { - input: "set tx_isolation = 'read committed'", - }, { - input: "set tx_isolation = 'read uncommitted'", - }, { - input: "set tx_isolation = 'serializable'", - }, { - input: "set sql_safe_updates = 0", - }, { - input: "set sql_safe_updates = 1", - }, { - input: "alter ignore table a add foo", - output: "alter table a", - }, { - input: "alter table a add foo", - output: "alter table a", - }, { - input: "alter table a add spatial key foo (column1)", - output: "alter table a", - }, { - input: "alter table a add unique key foo (column1)", - output: "alter table a", - }, { - input: "alter table `By` add foo", - output: "alter table `By`", - }, { - input: "alter table a alter foo", - output: "alter table a", - }, { - input: "alter table a change foo", - output: "alter table a", - }, { - input: "alter table a modify foo", - output: "alter table a", - }, { - input: "alter table a drop foo", - output: "alter table a", - }, { - input: "alter table a disable foo", - output: "alter table a", - }, { - input: "alter table a enable foo", - output: "alter table a", - }, { - input: "alter table a order foo", - output: "alter table a", - }, { - input: "alter table a default foo", - output: "alter table a", - }, { - input: "alter table a discard foo", - output: "alter table a", - }, { - input: "alter table a import foo", - output: "alter table a", - }, { - input: "alter table a rename b", - output: "rename table a to b", - }, { - input: "alter table `By` rename `bY`", - output: "rename table `By` to `bY`", - }, { - input: "alter table a rename to b", - output: "rename table a to b", - }, { - input: "alter table a rename as b", - output: "rename table a to b", - }, { - input: "alter table a rename index foo to bar", - output: "alter table a", - }, { - input: "alter table a rename key foo to bar", - output: "alter table a", - }, { - input: "alter table e auto_increment = 20", - output: "alter table e", - }, { - input: "alter table e character set = 'ascii'", - output: "alter table e", - }, { - input: "alter table e default character set = 'ascii'", - output: "alter table e", - }, { - input: "alter table e comment = 'hello'", - output: "alter table e", - }, { - input: "alter table a reorganize partition b into (partition c values less than (?), partition d values less than (maxvalue))", - output: "alter table a reorganize partition b into (partition c values less than (:v1), partition d values less than (maxvalue))", - }, { - input: "alter table a partition by range (id) (partition p0 values less than (10), partition p1 values less than (maxvalue))", - output: "alter table a", + input: "alter table a rename to b", }, { input: "alter table a add column id int", output: "alter table a", }, { - input: "alter table a add index idx (id)", - output: "alter table a", - }, { - input: "alter table a add fulltext index idx (id)", - output: "alter table a", - }, { - input: "alter table a add spatial index idx (id)", - output: "alter table a", - }, { - input: "alter table a add foreign key", - output: "alter table a", - }, { - input: "alter table a add primary key", - output: "alter table a", - }, { - input: "alter table a add constraint", - output: "alter table a", - }, { - input: "alter table a add id", - output: "alter table a", - }, { - input: "alter table a drop column id int", - output: "alter table a", - }, { - input: "alter table a drop partition p2712", - output: "alter table a", - }, { - input: "alter table a drop index idx (id)", - output: "alter table a", - }, { - input: "alter table a drop fulltext index idx (id)", - output: "alter table a", - }, { - input: "alter table a drop spatial index idx (id)", + input: "alter table a add id int", output: "alter table a", - }, { - input: "alter table a drop foreign key", - output: "alter table a", - }, { - input: "alter table a drop primary key", - output: "alter table a", - }, { - input: "alter table a drop constraint", - output: "alter table a", - }, { - input: "alter table a drop id", - output: "alter table a", - }, { - input: "alter table a add vindex hash (id)", - }, { - input: "alter table a add vindex `hash` (`id`)", - output: "alter table a add vindex hash (id)", - }, { - input: "alter table a add vindex hash (id) using `hash`", - output: "alter table a add vindex hash (id) using hash", - }, { - input: "alter table a add vindex `add` (`add`)", - }, { - input: "alter table a add vindex hash (id) using hash", - }, { - input: "alter table a add vindex hash (id) using `hash`", - output: "alter table a add vindex hash (id) using hash", - }, { - input: "alter table user add vindex name_lookup_vdx (name) using lookup_hash with owner=user, table=name_user_idx, from=name, to=user_id", - }, { - input: "alter table user2 add vindex name_lastname_lookup_vdx (name,lastname) using lookup with owner=`user`, table=`name_lastname_keyspace_id_map`, from=`name,lastname`, to=`keyspace_id`", - output: "alter table user2 add vindex name_lastname_lookup_vdx (name, lastname) using lookup with owner=user, table=name_lastname_keyspace_id_map, from=name,lastname, to=keyspace_id", - }, { - input: "alter table a drop vindex hash", - }, { - input: "alter table a drop vindex `hash`", - output: "alter table a drop vindex hash", - }, { - input: "alter table a drop vindex hash", - output: "alter table a drop vindex hash", - }, { - input: "alter table a drop vindex `add`", - output: "alter table a drop vindex `add`", }, { input: "create table a", }, { @@ -927,272 +603,33 @@ var ( }, { input: "create table a (a int, b char, c garbage)", output: "create table a", - }, { - input: "create vindex hash_vdx using hash", - }, { - input: "create vindex lookup_vdx using lookup with owner=user, table=name_user_idx, from=name, to=user_id", - }, { - input: "create vindex xyz_vdx using xyz with param1=hello, param2='world', param3=123", }, { input: "create index a on b", - output: "alter table b", + output: "create index on b", }, { input: "create unique index a on b", - output: "alter table b", - }, { - input: "create unique index a using foo on b", - output: "alter table b", - }, { - input: "create fulltext index a using foo on b", - output: "alter table b", - }, { - input: "create spatial index a using foo on b", - output: "alter table b", - }, { - input: "create view a", - output: "create table a", - }, { - input: "create or replace view a", - output: "create table a", - }, { - input: "alter view a", - output: "alter table a", - }, { - input: "drop view a", - output: "drop table a", - }, { - input: "drop table a", - output: "drop table a", - }, { - input: "drop table if exists a", - output: "drop table if exists a", - }, { - input: "drop view if exists a", - output: "drop table if exists a", - }, { - input: "drop index b on a", - output: "alter table a", - }, { - input: "analyze table a", - output: "alter table a", - }, { - input: "show binary logs", - output: "show binary logs", - }, { - input: "show binlog events", - output: "show binlog", - }, { - input: "show character set", - output: "show character set", - }, { - input: "show character set like '%foo'", - output: "show character set", - }, { - input: "show collation", - output: "show collation", - }, { - input: "show create database d", - output: "show create database", + output: "create index on b", }, { - input: "show create event e", - output: "show create event", + input: "drop table a", }, { - input: "show create function f", - output: "show create function", + input: "drop table if exists a", }, { - input: "show create procedure p", - output: "show create procedure", + input: "drop index if exists a.b", }, { - input: "show create table t", - output: "show create table", + input: "show create table t", }, { - input: "show create trigger t", - output: "show create trigger", + input: "show index from table t", + output: "show index t", }, { - input: "show create user u", - output: "show create user", - }, { - input: "show create view v", - output: "show create view", - }, { - input: "show databases", - output: "show databases", - }, { - input: "show engine INNODB", - output: "show engine", - }, { - input: "show engines", - output: "show engines", - }, { - input: "show storage engines", - output: "show storage", - }, { - input: "show errors", - output: "show errors", - }, { - input: "show events", - output: "show events", - }, { - input: "show function code func", - output: "show function", - }, { - input: "show function status", - output: "show function", - }, { - input: "show grants for 'root@localhost'", - output: "show grants", - }, { - input: "show index from table", - output: "show index", - }, { - input: "show indexes from table", - output: "show indexes", - }, { - input: "show keys from table", - output: "show keys", - }, { - input: "show master status", - output: "show master", - }, { - input: "show open tables", - output: "show open", - }, { - input: "show plugins", - output: "show plugins", - }, { - input: "show privileges", - output: "show privileges", - }, { - input: "show procedure code p", - output: "show procedure", - }, { - input: "show procedure status", - output: "show procedure", - }, { - input: "show processlist", - output: "show processlist", - }, { - input: "show full processlist", - output: "show processlist", - }, { - input: "show profile cpu for query 1", - output: "show profile", - }, { - input: "show profiles", - output: "show profiles", - }, { - input: "show relaylog events", - output: "show relaylog", - }, { - input: "show slave hosts", - output: "show slave", - }, { - input: "show slave status", - output: "show slave", - }, { - input: "show status", - output: "show status", - }, { - input: "show global status", - output: "show global status", - }, { - input: "show session status", - output: "show session status", - }, { - input: "show table status", - output: "show table", + input: "show table status", }, { input: "show tables", - }, { - input: "show tables like '%keyspace%'", - }, { - input: "show tables where 1 = 0", - }, { - input: "show tables from a", - }, { - input: "show tables from a where 1 = 0", - }, { - input: "show tables from a like '%keyspace%'", - }, { - input: "show full tables", - }, { - input: "show full tables from a", - }, { - input: "show full tables in a", - output: "show full tables from a", - }, { - input: "show full tables from a like '%keyspace%'", - }, { - input: "show full tables from a where 1 = 0", - }, { - input: "show full tables like '%keyspace%'", - }, { - input: "show full tables where 1 = 0", - }, { - input: "show triggers", - output: "show triggers", - }, { - input: "show variables", - output: "show variables", - }, { - input: "show global variables", - output: "show global variables", - }, { - input: "show session variables", - output: "show session variables", - }, { - input: "show vindexes", - output: "show vindexes", - }, { - input: "show vindexes on t", - output: "show vindexes on t", - }, { - input: "show vitess_keyspaces", - }, { - input: "show vitess_shards", - }, { - input: "show vitess_tablets", - }, { - input: "show vschema_tables", - }, { - input: "show warnings", - output: "show warnings", - }, { - input: "show foobar", - output: "show foobar", - }, { - input: "show foobar like select * from table where syntax is 'ignored'", - output: "show foobar", - }, { - input: "use db", - output: "use db", - }, { - input: "use duplicate", - output: "use `duplicate`", - }, { - input: "use `ks:-80@master`", - output: "use `ks:-80@master`", }, { input: "describe foobar", - output: "otherread", + output: "show table foobar", }, { input: "desc foobar", - output: "otherread", - }, { - input: "explain foobar", - output: "otherread", - }, { - input: "truncate table foo", - output: "truncate table foo", - }, { - input: "truncate foo", - output: "truncate table foo", - }, { - input: "repair foo", - output: "otheradmin", - }, { - input: "optimize foo", - output: "otheradmin", + output: "show table foobar", }, { input: "select /* EQ true */ 1 from t where a = true", }, { @@ -1217,97 +654,13 @@ var ( input: "select /* GE true */ 1 from t where a >= true", }, { input: "select /* GE false */ 1 from t where a >= false", - }, { - input: "select * from t order by a collate utf8_general_ci", - output: "select * from t order by a collate utf8_general_ci asc", - }, { - input: "select k collate latin1_german2_ci as k1 from t1 order by k1 asc", - }, { - input: "select * from t group by a collate utf8_general_ci", - }, { - input: "select MAX(k collate latin1_german2_ci) from t1", - }, { - input: "select distinct k collate latin1_german2_ci from t1", - }, { - input: "select * from t1 where 'Müller' collate latin1_german2_ci = k", - }, { - input: "select * from t1 where k like 'Müller' collate latin1_german2_ci", - }, { - input: "select k from t1 group by k having k = 'Müller' collate latin1_german2_ci", - }, { - input: "select k from t1 join t2 order by a collate latin1_german2_ci asc, b collate latin1_german2_ci asc", - }, { - input: "select k collate 'latin1_german2_ci' as k1 from t1 order by k1 asc", - output: "select k collate latin1_german2_ci as k1 from t1 order by k1 asc", }, { input: "select /* drop trailing semicolon */ 1 from dual;", output: "select /* drop trailing semicolon */ 1 from dual", - }, { - input: "select /* cache directive */ sql_no_cache 'foo' from t", - }, { - input: "select binary 'a' = 'A' from t", - }, { - input: "select 1 from t where foo = _binary 'bar'", - }, { - input: "select 1 from t where foo = _binary'bar'", - output: "select 1 from t where foo = _binary 'bar'", - }, { - input: "select match(a) against ('foo') from t", - }, { - input: "select match(a1, a2) against ('foo' in natural language mode with query expansion) from t", - }, { - input: "select title from video as v where match(v.title, v.tag) against ('DEMO' in boolean mode)", }, { input: "select name, group_concat(score) from t group by name", }, { input: "select name, group_concat(distinct id, score order by id desc separator ':') from t group by name", - }, { - input: "select * from t partition (p0)", - }, { - input: "select * from t partition (p0, p1)", - }, { - input: "select e.id, s.city from employees as e join stores partition (p1) as s on e.store_id = s.id", - }, { - input: "select truncate(120.3333, 2) from dual", - }, { - input: "update t partition (p0) set a = 1", - }, { - input: "insert into t partition (p0) values (1, 'asdf')", - }, { - input: "insert into t1 select * from t2 partition (p0)", - }, { - input: "replace into t partition (p0) values (1, 'asdf')", - }, { - input: "delete from t partition (p0) where a = 1", - }, { - input: "stream * from t", - }, { - input: "stream /* comment */ * from t", - }, { - input: "begin", - }, { - input: "start transaction", - output: "begin", - }, { - input: "commit", - }, { - input: "rollback", - }, { - input: "create database test_db", - }, { - input: "create schema test_db", - output: "create database test_db", - }, { - input: "create database if not exists test_db", - output: "create database test_db", - }, { - input: "drop database test_db", - }, { - input: "drop schema test_db", - output: "drop database test_db", - }, { - input: "drop database if exists test_db", - output: "drop database test_db", }} ) @@ -1344,31 +697,16 @@ func TestCaseSensitivity(t *testing.T) { output: "create table A (\n\tB int\n)", }, { input: "create index b on A", - output: "alter table A", - }, { - input: "alter table A foo", - output: "alter table A", - }, { - input: "alter table A convert", - output: "alter table A", - }, { - // View names get lower-cased. - input: "alter view A foo", - output: "alter table a", + output: "create index on A", }, { - input: "alter table A rename to B", - output: "rename table A to B", - }, { - input: "rename table A to B", + input: "alter table A rename to B", }, { input: "drop table B", output: "drop table B", }, { - input: "drop table if exists B", - output: "drop table if exists B", + input: "drop table if exists B", }, { - input: "drop index b on A", - output: "alter table A", + input: "drop index if exists b.A", }, { input: "select a from B", }, { @@ -1395,33 +733,11 @@ func TestCaseSensitivity(t *testing.T) { // IF is an exception. It's always lower-cased. input: "select IF(B, C) from b", output: "select if(B, C) from b", - }, { - input: "select * from b use index (A)", }, { input: "insert into A(A, B) values (1, 2)", }, { input: "CREATE TABLE A (\n\t`A` int\n)", output: "create table A (\n\tA int\n)", - }, { - input: "create view A", - output: "create table a", - }, { - input: "alter view A", - output: "alter table a", - }, { - input: "drop view A", - output: "drop table a", - }, { - input: "drop view if exists A", - output: "drop table if exists a", - }, { - input: "select /* lock in SHARE MODE */ 1 from t lock in SHARE MODE", - output: "select /* lock in SHARE MODE */ 1 from t lock in share mode", - }, { - input: "select next VALUE from t", - output: "select next 1 values from t", - }, { - input: "select /* use */ 1 from t1 use index (A) where b = 1", }} for _, tcase := range validSQL { if tcase.output == "" { @@ -1444,66 +760,19 @@ func TestKeywords(t *testing.T) { input string output string }{{ - input: "select current_timestamp", - output: "select current_timestamp() from dual", - }, { - input: "update t set a = current_timestamp()", - }, { input: "select a, current_date from t", - output: "select a, current_date() from t", - }, { - input: "insert into t(a, b) values (current_date, current_date())", - output: "insert into t(a, b) values (current_date(), current_date())", - }, { - input: "select * from t where a > utc_timestmp()", - }, { - input: "update t set b = utc_timestamp + 5", - output: "update t set b = utc_timestamp() + 5", - }, { - input: "select utc_time, utc_date", - output: "select utc_time(), utc_date() from dual", - }, { - input: "select 1 from dual where localtime > utc_time", - output: "select 1 from dual where localtime() > utc_time()", - }, { - input: "update t set a = localtimestamp(), b = utc_timestamp", - output: "update t set a = localtimestamp(), b = utc_timestamp()", - }, { - input: "insert into t(a) values (unix_timestamp)", + output: "select a, current_date from t", }, { input: "select replace(a, 'foo', 'bar') from t", }, { input: "update t set a = replace('1234', '2', '1')", - }, { - input: "insert into t(a, b) values ('foo', 'bar') on duplicate key update a = replace(hex('foo'), 'f', 'b')", - }, { - input: "update t set a = left('1234', 3)", - }, { - input: "select left(a, 5) from t", }, { input: "update t set d = adddate(date('2003-12-31 01:02:03'), interval 5 days)", - }, { - input: "insert into t(a, b) values (left('foo', 1), 'b')", }, { input: "insert /* qualified function */ into t(a, b) values (test.PI(), 'b')", }, { input: "select /* keyword in qualified id */ * from t join z on t.key = z.key", output: "select /* keyword in qualified id */ * from t join z on t.`key` = z.`key`", - }, { - input: "select /* non-reserved keywords as unqualified cols */ date, view, offset from t", - output: "select /* non-reserved keywords as unqualified cols */ `date`, `view`, `offset` from t", - }, { - input: "select /* share and mode as cols */ share, mode from t where share = 'foo'", - output: "select /* share and mode as cols */ `share`, `mode` from t where `share` = 'foo'", - }, { - input: "select /* unused keywords as cols */ write, varying from t where trailing = 'foo'", - output: "select /* unused keywords as cols */ `write`, `varying` from t where `trailing` = 'foo'", - }, { - input: "select status from t", - output: "select `status` from t", - }, { - input: "select variables from t", - output: "select `variables` from t", }} for _, tcase := range validSQL { @@ -1527,56 +796,41 @@ func TestConvert(t *testing.T) { input string output string }{{ - input: "select cast('abc' as date) from t", - output: "select convert('abc', date) from t", - }, { - input: "select convert('abc', binary(4)) from t", - }, { - input: "select convert('abc', binary) from t", - }, { - input: "select convert('abc', char character set binary) from t", - }, { - input: "select convert('abc', char(4) ascii) from t", - }, { - input: "select convert('abc', char unicode) from t", + input: "select cast('abc' as date) from t", }, { - input: "select convert('abc', char(4)) from t", + input: "select cast('abc' as char(4)) from t", }, { - input: "select convert('abc', char) from t", + input: "select cast('abc' as char) from t", }, { - input: "select convert('abc', nchar(4)) from t", + input: "select cast('abc' as nchar(4)) from t", }, { - input: "select convert('abc', nchar) from t", + input: "select cast('abc' as nchar) from t", }, { - input: "select convert('abc', signed) from t", + input: "select cast('abc' as signed) from t", }, { - input: "select convert('abc', signed integer) from t", - output: "select convert('abc', signed) from t", + input: "select cast('abc' as signed integer) from t", + output: "select cast('abc' as signed) from t", }, { - input: "select convert('abc', unsigned) from t", + input: "select cast('abc' as unsigned) from t", }, { - input: "select convert('abc', unsigned integer) from t", - output: "select convert('abc', unsigned) from t", + input: "select cast('abc' as unsigned integer) from t", + output: "select cast('abc' as unsigned) from t", }, { - input: "select convert('abc', decimal(3, 4)) from t", + input: "select cast('abc' as decimal(3, 4)) from t", }, { - input: "select convert('abc', decimal(4)) from t", + input: "select cast('abc' as decimal(4)) from t", }, { - input: "select convert('abc', decimal) from t", + input: "select cast('abc' as decimal) from t", }, { - input: "select convert('abc', date) from t", + input: "select cast('abc' as date) from t", }, { - input: "select convert('abc', time(4)) from t", + input: "select cast('abc' as time(4)) from t", }, { - input: "select convert('abc', time) from t", + input: "select cast('abc' as time) from t", }, { - input: "select convert('abc', datetime(9)) from t", + input: "select cast('abc' as datetime(9)) from t", }, { - input: "select convert('abc', datetime) from t", - }, { - input: "select convert('abc', json) from t", - }, { - input: "select convert('abc' using ascii) from t", + input: "select cast('abc' as datetime) from t", }} for _, tcase := range validSQL { @@ -1598,20 +852,17 @@ func TestConvert(t *testing.T) { input string output string }{{ - input: "select convert('abc' as date) from t", - output: "syntax error at position 24 near 'as'", - }, { - input: "select convert from t", - output: "syntax error at position 20 near 'from'", + input: "select cast from t", + output: "syntax error at position 17 near 'from'", }, { input: "select cast('foo', decimal) from t", output: "syntax error at position 19", }, { - input: "select convert('abc', datetime(4+9)) from t", - output: "syntax error at position 34", - }, { - input: "select convert('abc', decimal(4+9)) from t", + input: "select cast('abc' as datetime(4+9)) from t", output: "syntax error at position 33", + }, { + input: "select cast('abc', decimal(4+9)) from t", + output: "syntax error at position 19", }} for _, tcase := range invalidSQL { @@ -1631,18 +882,6 @@ func TestSubStr(t *testing.T) { input: "select substr(a, 1) from t", }, { input: "select substr(a, 1, 6) from t", - }, { - input: "select substring(a, 1) from t", - output: "select substr(a, 1) from t", - }, { - input: "select substring(a, 1, 6) from t", - output: "select substr(a, 1, 6) from t", - }, { - input: "select substr(a from 1 for 6) from t", - output: "select substr(a, 1, 6) from t", - }, { - input: "select substring(a from 1 for 6) from t", - output: "select substr(a, 1, 6) from t", }} for _, tcase := range validSQL { @@ -1665,7 +904,6 @@ func TestCreateTable(t *testing.T) { validSQL := []string{ // test all the data types and options "create table t (\n" + - " col_bit bit,\n" + " col_tinyint tinyint auto_increment,\n" + " col_tinyint3 tinyint(3) unsigned,\n" + " col_smallint smallint,\n" + @@ -1674,7 +912,7 @@ func TestCreateTable(t *testing.T) { " col_mediumint5 mediumint(5) unsigned not null,\n" + " col_int int,\n" + " col_int10 int(10) not null,\n" + - " col_integer integer comment 'this is an integer',\n" + + " col_integer integer,\n" + " col_bigint bigint,\n" + " col_bigint10 bigint(10) zerofill not null default 10,\n" + " col_real real,\n" + @@ -1696,14 +934,12 @@ func TestCreateTable(t *testing.T) { " col_year year,\n" + " col_char char,\n" + " col_char2 char(2),\n" + - " col_char3 char(3) character set ascii,\n" + - " col_char4 char(4) character set ascii collate ascii_bin,\n" + + " col_char3 char(3),\n" + + " col_char4 char(4),\n" + " col_varchar varchar,\n" + " col_varchar2 varchar(2),\n" + - " col_varchar3 varchar(3) character set ascii,\n" + - " col_varchar4 varchar(4) character set ascii collate ascii_bin,\n" + - " col_binary binary,\n" + - " col_varbinary varbinary(10),\n" + + " col_varchar3 varchar(3),\n" + + " col_varchar4 varchar(4),\n" + " col_tinyblob tinyblob,\n" + " col_blob blob,\n" + " col_mediumblob mediumblob,\n" + @@ -1712,32 +948,7 @@ func TestCreateTable(t *testing.T) { " col_text text,\n" + " col_mediumtext mediumtext,\n" + " col_longtext longtext,\n" + - " col_text text character set ascii collate ascii_bin,\n" + - " col_json json,\n" + - " col_enum enum('a', 'b', 'c', 'd'),\n" + - " col_enum2 enum('a', 'b', 'c', 'd') character set ascii,\n" + - " col_enum3 enum('a', 'b', 'c', 'd') collate ascii_bin,\n" + - " col_enum4 enum('a', 'b', 'c', 'd') character set ascii collate ascii_bin,\n" + - " col_set set('a', 'b', 'c', 'd'),\n" + - " col_set2 set('a', 'b', 'c', 'd') character set ascii,\n" + - " col_set3 set('a', 'b', 'c', 'd') collate ascii_bin,\n" + - " col_set4 set('a', 'b', 'c', 'd') character set ascii collate ascii_bin,\n" + - " col_geometry1 geometry,\n" + - " col_geometry2 geometry not null,\n" + - " col_point1 point,\n" + - " col_point2 point not null,\n" + - " col_linestring1 linestring,\n" + - " col_linestring2 linestring not null,\n" + - " col_polygon1 polygon,\n" + - " col_polygon2 polygon not null,\n" + - " col_geometrycollection1 geometrycollection,\n" + - " col_geometrycollection2 geometrycollection not null,\n" + - " col_multipoint1 multipoint,\n" + - " col_multipoint2 multipoint not null,\n" + - " col_multilinestring1 multilinestring,\n" + - " col_multilinestring2 multilinestring not null,\n" + - " col_multipolygon1 multipolygon,\n" + - " col_multipolygon2 multipolygon not null\n" + + " col_text text\n" + ")", // test defaults @@ -1748,8 +959,7 @@ func TestCreateTable(t *testing.T) { " s1 varchar default 'c',\n" + " s2 varchar default 'this is a string',\n" + " s3 varchar default null,\n" + - " s4 timestamp default current_timestamp,\n" + - " s5 bit(1) default B'0'\n" + + " s4 timestamp default current_timestamp\n" + ")", // test key field options @@ -1758,8 +968,8 @@ func TestCreateTable(t *testing.T) { " username varchar unique key,\n" + " email varchar unique,\n" + " full_name varchar key,\n" + - " time1 timestamp on update current_timestamp,\n" + - " time2 timestamp default current_timestamp on update current_timestamp\n" + + " time1 timestamp,\n" + + " time2 timestamp default current_timestamp\n" + ")", // test defining indexes separately @@ -1768,10 +978,8 @@ func TestCreateTable(t *testing.T) { " username varchar,\n" + " email varchar,\n" + " full_name varchar,\n" + - " geom point not null,\n" + " status_nonkeyword varchar,\n" + " primary key (id),\n" + - " spatial key geom (geom),\n" + " unique key by_username (username),\n" + " unique by_username2 (username),\n" + " unique index by_username3 (username),\n" + @@ -1786,22 +994,22 @@ func TestCreateTable(t *testing.T) { " email varchar,\n" + " full_name varchar,\n" + " status_nonkeyword varchar,\n" + - " primary key (id) using BTREE,\n" + - " unique key by_username (username) using HASH,\n" + - " unique by_username2 (username) using OTHER,\n" + - " unique index by_username3 (username) using XYZ,\n" + - " index by_status (status_nonkeyword) using PDQ,\n" + - " key by_full_name (full_name) using OTHER\n" + + " primary key (id),\n" + + " unique key by_username (username),\n" + + " unique by_username2 (username),\n" + + " unique index by_username3 (username),\n" + + " index by_status (status_nonkeyword),\n" + + " key by_full_name (full_name)\n" + ")", // test other index options "create table t (\n" + " id int auto_increment,\n" + " username varchar,\n" + " email varchar,\n" + - " primary key (id) comment 'hi',\n" + - " unique key by_username (username) key_block_size 8,\n" + - " unique index by_username4 (username) comment 'hi' using BTREE,\n" + - " unique index by_username4 (username) using BTREE key_block_size 4 comment 'hi'\n" + + " primary key (id),\n" + + " unique key by_username (username),\n" + + " unique index by_username4 (username),\n" + + " unique index by_username4 (username)\n" + ")", // multi-column indexes @@ -1837,7 +1045,6 @@ func TestCreateTable(t *testing.T) { " encryption 'n',\n" + " index directory 'absolute path to directory',\n" + " insert_method no,\n" + - " key_block_size 1024,\n" + " max_rows 100,\n" + " min_rows 10,\n" + " pack_keys 0,\n" + @@ -1873,38 +1080,6 @@ func TestCreateTable(t *testing.T) { if tree != nil || err == nil { t.Errorf("ParseStrictDDL unexpectedly accepted input %s", sql) } - - testCases := []struct { - input string - output string - }{{ - // test key_block_size - input: "create table t (\n" + - " id int auto_increment,\n" + - " username varchar,\n" + - " unique key by_username (username) key_block_size 8,\n" + - " unique key by_username2 (username) key_block_size=8,\n" + - " unique by_username3 (username) key_block_size = 4\n" + - ")", - output: "create table t (\n" + - " id int auto_increment,\n" + - " username varchar,\n" + - " unique key by_username (username) key_block_size 8,\n" + - " unique key by_username2 (username) key_block_size 8,\n" + - " unique by_username3 (username) key_block_size 4\n" + - ")", - }, - } - for _, tcase := range testCases { - tree, err := ParseStrictDDL(tcase.input) - if err != nil { - t.Errorf("input: %s, err: %v", tcase.input, err) - continue - } - if got, want := String(tree.(*DDL)), tcase.output; got != want { - t.Errorf("Parse(%s):\n%s, want\n%s", tcase.input, got, want) - } - } } func TestCreateTableEscaped(t *testing.T) { @@ -2004,30 +1179,15 @@ var ( }, { input: "select * from a natural join b using (c)", output: "syntax error at position 37 near 'using'", - }, { - input: "select next id from a", - output: "expecting value after next at position 15 near 'id'", - }, { - input: "select next 1+1 values from a", - output: "syntax error at position 15", }, { input: "insert into a values (select * from b)", output: "syntax error at position 29 near 'select'", - }, { - input: "select database", - output: "syntax error at position 16", }, { input: "select mod from t", output: "syntax error at position 16 near 'from'", }, { input: "select 1 from t where div 5", output: "syntax error at position 26 near 'div'", - }, { - input: "select 1 from t where binary", - output: "syntax error at position 29", - }, { - input: "select match(a1, a2) against ('foo' in boolean mode with query expansion) from t", - output: "syntax error at position 57 near 'with'", }, { input: "select /* reserved keyword as unqualified column */ * from t where key = 'test'", output: "syntax error at position 71 near 'key'", @@ -2040,16 +1200,13 @@ var ( }, { input: "select * from t where id = ((select a from t1 union select b from t2) order by a limit 1)", output: "syntax error at position 76 near 'order'", - }, { - input: "select /* straight_join using */ 1 from t1 straight_join t2 using (a)", - output: "syntax error at position 66 near 'using'", }, { input: "select 'aa", output: "syntax error at position 11 near 'aa'", excludeMulti: true, }, { input: "select 'aa\\", - output: "syntax error at position 12 near 'aa'", + output: "syntax error at position 12 near 'aa\\'", excludeMulti: true, }, { input: "select /* aa", diff --git a/parsed_query.go b/parsed_query.go index cf4ef03..6b13f2b 100644 --- a/parsed_query.go +++ b/parsed_query.go @@ -20,8 +20,8 @@ import ( "bytes" "fmt" - "github.com/xwb1989/sqlparser/dependency/querypb" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) // ParsedQuery represents a parsed query where diff --git a/parsed_query_test.go b/parsed_query_test.go index dc0e1ac..9ca9d27 100644 --- a/parsed_query_test.go +++ b/parsed_query_test.go @@ -20,9 +20,8 @@ import ( "reflect" "testing" - "github.com/xwb1989/sqlparser/dependency/sqltypes" - - "github.com/xwb1989/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/querypb" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) func TestNewParsedQuery(t *testing.T) { diff --git a/patches/bytes2.patch b/patches/bytes2.patch deleted file mode 100644 index e69de29..0000000 diff --git a/patches/querypb.patch b/patches/querypb.patch deleted file mode 100644 index abf19ea..0000000 --- a/patches/querypb.patch +++ /dev/null @@ -1,1315 +0,0 @@ -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/proto/query/query.pb.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/querypb/query.pb.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/proto/query/query.pb.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/querypb/query.pb.go 2017-10-18 18:06:33.000000000 -0700 -@@ -62,30 +62,24 @@ - SplitQueryResponse - StreamHealthRequest - RealtimeStats -- AggregateStats - StreamHealthResponse - UpdateStreamRequest - UpdateStreamResponse - TransactionMetadata - */ --package query -+package querypb - --import proto "github.com/golang/protobuf/proto" --import fmt "fmt" --import math "math" --import topodata "vitess.io/vitess/go/vt/proto/topodata" --import vtrpc "vitess.io/vitess/go/vt/proto/vtrpc" -- --// Reference imports to suppress errors if they are not otherwise used. --var _ = proto.Marshal --var _ = fmt.Errorf --var _ = math.Inf -- --// This is a compile-time assertion to ensure that this generated file --// is compatible with the proto package it is being compiled against. --// A compilation error at this line likely means your copy of the --// proto package needs to be updated. --const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package -+import "strconv" -+ -+// EnumName is a helper function to simplify printing protocol buffer enums -+// by name. Given an enum map and a value, it returns a useful string. -+func EnumName(m map[int32]string, v int32) string { -+ s, ok := m[v] -+ if ok { -+ return s -+ } -+ return strconv.Itoa(int(v)) -+} - - // Flags sent from the MySQL C API - type MySqlFlag int32 -@@ -159,9 +153,8 @@ - } - - func (x MySqlFlag) String() string { -- return proto.EnumName(MySqlFlag_name, int32(x)) -+ return EnumName(MySqlFlag_name, int32(x)) - } --func (MySqlFlag) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - - // Flag allows us to qualify types by their common properties. - type Flag int32 -@@ -196,9 +189,8 @@ - } - - func (x Flag) String() string { -- return proto.EnumName(Flag_name, int32(x)) -+ return EnumName(Flag_name, int32(x)) - } --func (Flag) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - - // Type defines the various supported data types in bind vars - // and query results. -@@ -375,9 +367,8 @@ - } - - func (x Type) String() string { -- return proto.EnumName(Type_name, int32(x)) -+ return EnumName(Type_name, int32(x)) - } --func (Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - - // TransactionState represents the state of a distributed transaction. - type TransactionState int32 -@@ -403,9 +394,8 @@ - } - - func (x TransactionState) String() string { -- return proto.EnumName(TransactionState_name, int32(x)) -+ return EnumName(TransactionState_name, int32(x)) - } --func (TransactionState) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - - type ExecuteOptions_IncludedFields int32 - -@@ -427,10 +417,7 @@ - } - - func (x ExecuteOptions_IncludedFields) String() string { -- return proto.EnumName(ExecuteOptions_IncludedFields_name, int32(x)) --} --func (ExecuteOptions_IncludedFields) EnumDescriptor() ([]byte, []int) { -- return fileDescriptor0, []int{6, 0} -+ return EnumName(ExecuteOptions_IncludedFields_name, int32(x)) - } - - type ExecuteOptions_Workload int32 -@@ -456,9 +443,8 @@ - } - - func (x ExecuteOptions_Workload) String() string { -- return proto.EnumName(ExecuteOptions_Workload_name, int32(x)) -+ return EnumName(ExecuteOptions_Workload_name, int32(x)) - } --func (ExecuteOptions_Workload) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6, 1} } - - type ExecuteOptions_TransactionIsolation int32 - -@@ -486,10 +472,7 @@ - } - - func (x ExecuteOptions_TransactionIsolation) String() string { -- return proto.EnumName(ExecuteOptions_TransactionIsolation_name, int32(x)) --} --func (ExecuteOptions_TransactionIsolation) EnumDescriptor() ([]byte, []int) { -- return fileDescriptor0, []int{6, 2} -+ return EnumName(ExecuteOptions_TransactionIsolation_name, int32(x)) - } - - // The category of one statement. -@@ -513,10 +496,7 @@ - } - - func (x StreamEvent_Statement_Category) String() string { -- return proto.EnumName(StreamEvent_Statement_Category_name, int32(x)) --} --func (StreamEvent_Statement_Category) EnumDescriptor() ([]byte, []int) { -- return fileDescriptor0, []int{11, 0, 0} -+ return EnumName(StreamEvent_Statement_Category_name, int32(x)) - } - - type SplitQueryRequest_Algorithm int32 -@@ -536,27 +516,22 @@ - } - - func (x SplitQueryRequest_Algorithm) String() string { -- return proto.EnumName(SplitQueryRequest_Algorithm_name, int32(x)) --} --func (SplitQueryRequest_Algorithm) EnumDescriptor() ([]byte, []int) { -- return fileDescriptor0, []int{49, 0} -+ return EnumName(SplitQueryRequest_Algorithm_name, int32(x)) - } - -+/* - // Target describes what the client expects the tablet is. - // If the tablet does not match, an error is returned. - type Target struct { - Keyspace string `protobuf:"bytes,1,opt,name=keyspace" json:"keyspace,omitempty"` - Shard string `protobuf:"bytes,2,opt,name=shard" json:"shard,omitempty"` - TabletType topodata.TabletType `protobuf:"varint,3,opt,name=tablet_type,json=tabletType,enum=topodata.TabletType" json:"tablet_type,omitempty"` -- // cell is used for routing queries between vtgate and vttablets. It -- // is not used when Target is part of the Session sent by the client. -- Cell string `protobuf:"bytes,4,opt,name=cell" json:"cell,omitempty"` - } - - func (m *Target) Reset() { *m = Target{} } --func (m *Target) String() string { return proto.CompactTextString(m) } --func (*Target) ProtoMessage() {} --func (*Target) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } -+func (m *Target) String() string { return "TODO" } -+ -+ - - func (m *Target) GetKeyspace() string { - if m != nil { -@@ -579,12 +554,6 @@ - return topodata.TabletType_UNKNOWN - } - --func (m *Target) GetCell() string { -- if m != nil { -- return m.Cell -- } -- return "" --} - - // VTGateCallerID is sent by VTGate to VTTablet to describe the - // caller. If possible, this information is secure. For instance, -@@ -600,9 +569,9 @@ - } - - func (m *VTGateCallerID) Reset() { *m = VTGateCallerID{} } --func (m *VTGateCallerID) String() string { return proto.CompactTextString(m) } --func (*VTGateCallerID) ProtoMessage() {} --func (*VTGateCallerID) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } -+func (m *VTGateCallerID) String() string { return "TODO" } -+ -+ - - func (m *VTGateCallerID) GetUsername() string { - if m != nil { -@@ -634,9 +603,9 @@ - } - - func (m *EventToken) Reset() { *m = EventToken{} } --func (m *EventToken) String() string { return proto.CompactTextString(m) } --func (*EventToken) ProtoMessage() {} --func (*EventToken) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } -+func (m *EventToken) String() string { return "TODO" } -+ -+ - - func (m *EventToken) GetTimestamp() int64 { - if m != nil { -@@ -658,6 +627,7 @@ - } - return "" - } -+*/ - - // Value represents a typed value. - type Value struct { -@@ -665,10 +635,8 @@ - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - } - --func (m *Value) Reset() { *m = Value{} } --func (m *Value) String() string { return proto.CompactTextString(m) } --func (*Value) ProtoMessage() {} --func (*Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } -+func (m *Value) Reset() { *m = Value{} } -+func (m *Value) String() string { return "TODO" } - - func (m *Value) GetType() Type { - if m != nil { -@@ -692,10 +660,8 @@ - Values []*Value `protobuf:"bytes,3,rep,name=values" json:"values,omitempty"` - } - --func (m *BindVariable) Reset() { *m = BindVariable{} } --func (m *BindVariable) String() string { return proto.CompactTextString(m) } --func (*BindVariable) ProtoMessage() {} --func (*BindVariable) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } -+func (m *BindVariable) Reset() { *m = BindVariable{} } -+func (m *BindVariable) String() string { return "TODO" } - - func (m *BindVariable) GetType() Type { - if m != nil { -@@ -727,10 +693,8 @@ - BindVariables map[string]*BindVariable `protobuf:"bytes,2,rep,name=bind_variables,json=bindVariables" json:"bind_variables,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - } - --func (m *BoundQuery) Reset() { *m = BoundQuery{} } --func (m *BoundQuery) String() string { return proto.CompactTextString(m) } --func (*BoundQuery) ProtoMessage() {} --func (*BoundQuery) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } -+func (m *BoundQuery) Reset() { *m = BoundQuery{} } -+func (m *BoundQuery) String() string { return "TODO" } - - func (m *BoundQuery) GetSql() string { - if m != nil { -@@ -746,6 +710,7 @@ - return nil - } - -+/* - // ExecuteOptions is passed around for all Execute calls. - type ExecuteOptions struct { - // If set, we will try to include an EventToken with the responses. -@@ -774,15 +739,12 @@ - // vitess also sets a rowcount limit on queries, the smallest value wins. - SqlSelectLimit int64 `protobuf:"varint,8,opt,name=sql_select_limit,json=sqlSelectLimit" json:"sql_select_limit,omitempty"` - TransactionIsolation ExecuteOptions_TransactionIsolation `protobuf:"varint,9,opt,name=transaction_isolation,json=transactionIsolation,enum=query.ExecuteOptions_TransactionIsolation" json:"transaction_isolation,omitempty"` -- // skip_query_plan_cache specifies if the query plan shoud be cached by vitess. -- // By default all query plans are cached. -- SkipQueryPlanCache bool `protobuf:"varint,10,opt,name=skip_query_plan_cache,json=skipQueryPlanCache" json:"skip_query_plan_cache,omitempty"` - } - - func (m *ExecuteOptions) Reset() { *m = ExecuteOptions{} } --func (m *ExecuteOptions) String() string { return proto.CompactTextString(m) } --func (*ExecuteOptions) ProtoMessage() {} --func (*ExecuteOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } -+func (m *ExecuteOptions) String() string { return "TODO" } -+ -+ - - func (m *ExecuteOptions) GetIncludeEventToken() bool { - if m != nil { -@@ -833,13 +795,6 @@ - return ExecuteOptions_DEFAULT - } - --func (m *ExecuteOptions) GetSkipQueryPlanCache() bool { -- if m != nil { -- return m.SkipQueryPlanCache -- } -- return false --} -- - // Field describes a single column returned by a query - type Field struct { - // name of the field as returned by mysql C API -@@ -864,9 +819,9 @@ - } - - func (m *Field) Reset() { *m = Field{} } --func (m *Field) String() string { return proto.CompactTextString(m) } --func (*Field) ProtoMessage() {} --func (*Field) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } -+func (m *Field) String() string { return "TODO" } -+ -+ - - func (m *Field) GetName() string { - if m != nil { -@@ -950,9 +905,9 @@ - } - - func (m *Row) Reset() { *m = Row{} } --func (m *Row) String() string { return proto.CompactTextString(m) } --func (*Row) ProtoMessage() {} --func (*Row) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } -+func (m *Row) String() string { return "TODO" } -+ -+ - - func (m *Row) GetLengths() []int64 { - if m != nil { -@@ -980,9 +935,9 @@ - } - - func (m *ResultExtras) Reset() { *m = ResultExtras{} } --func (m *ResultExtras) String() string { return proto.CompactTextString(m) } --func (*ResultExtras) ProtoMessage() {} --func (*ResultExtras) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } -+func (m *ResultExtras) String() string { return "TODO" } -+ -+ - - func (m *ResultExtras) GetEventToken() *EventToken { - if m != nil { -@@ -1016,9 +971,9 @@ - } - - func (m *QueryResult) Reset() { *m = QueryResult{} } --func (m *QueryResult) String() string { return proto.CompactTextString(m) } --func (*QueryResult) ProtoMessage() {} --func (*QueryResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } -+func (m *QueryResult) String() string { return "TODO" } -+ -+ - - func (m *QueryResult) GetFields() []*Field { - if m != nil { -@@ -1066,9 +1021,9 @@ - } - - func (m *StreamEvent) Reset() { *m = StreamEvent{} } --func (m *StreamEvent) String() string { return proto.CompactTextString(m) } --func (*StreamEvent) ProtoMessage() {} --func (*StreamEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } -+func (m *StreamEvent) String() string { return "TODO" } -+ -+ - - func (m *StreamEvent) GetStatements() []*StreamEvent_Statement { - if m != nil { -@@ -1097,9 +1052,9 @@ - } - - func (m *StreamEvent_Statement) Reset() { *m = StreamEvent_Statement{} } --func (m *StreamEvent_Statement) String() string { return proto.CompactTextString(m) } --func (*StreamEvent_Statement) ProtoMessage() {} --func (*StreamEvent_Statement) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 0} } -+func (m *StreamEvent_Statement) String() string { return "TODO" } -+ -+ - - func (m *StreamEvent_Statement) GetCategory() StreamEvent_Statement_Category { - if m != nil { -@@ -1136,6 +1091,7 @@ - return nil - } - -+ - // ExecuteRequest is the payload to Execute - type ExecuteRequest struct { - EffectiveCallerId *vtrpc.CallerID `protobuf:"bytes,1,opt,name=effective_caller_id,json=effectiveCallerId" json:"effective_caller_id,omitempty"` -@@ -1147,9 +1103,9 @@ - } - - func (m *ExecuteRequest) Reset() { *m = ExecuteRequest{} } --func (m *ExecuteRequest) String() string { return proto.CompactTextString(m) } --func (*ExecuteRequest) ProtoMessage() {} --func (*ExecuteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } -+func (m *ExecuteRequest) String() string { return "TODO" } -+ -+ - - func (m *ExecuteRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1199,9 +1155,9 @@ - } - - func (m *ExecuteResponse) Reset() { *m = ExecuteResponse{} } --func (m *ExecuteResponse) String() string { return proto.CompactTextString(m) } --func (*ExecuteResponse) ProtoMessage() {} --func (*ExecuteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } -+func (m *ExecuteResponse) String() string { return "TODO" } -+ -+ - - func (m *ExecuteResponse) GetResult() *QueryResult { - if m != nil { -@@ -1221,9 +1177,9 @@ - } - - func (m *ResultWithError) Reset() { *m = ResultWithError{} } --func (m *ResultWithError) String() string { return proto.CompactTextString(m) } --func (*ResultWithError) ProtoMessage() {} --func (*ResultWithError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } -+func (m *ResultWithError) String() string { return "TODO" } -+ -+ - - func (m *ResultWithError) GetError() *vtrpc.RPCError { - if m != nil { -@@ -1251,9 +1207,9 @@ - } - - func (m *ExecuteBatchRequest) Reset() { *m = ExecuteBatchRequest{} } --func (m *ExecuteBatchRequest) String() string { return proto.CompactTextString(m) } --func (*ExecuteBatchRequest) ProtoMessage() {} --func (*ExecuteBatchRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } -+func (m *ExecuteBatchRequest) String() string { return "TODO" } -+ -+ - - func (m *ExecuteBatchRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1310,9 +1266,9 @@ - } - - func (m *ExecuteBatchResponse) Reset() { *m = ExecuteBatchResponse{} } --func (m *ExecuteBatchResponse) String() string { return proto.CompactTextString(m) } --func (*ExecuteBatchResponse) ProtoMessage() {} --func (*ExecuteBatchResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } -+func (m *ExecuteBatchResponse) String() string { return "TODO" } -+ -+ - - func (m *ExecuteBatchResponse) GetResults() []*QueryResult { - if m != nil { -@@ -1331,9 +1287,9 @@ - } - - func (m *StreamExecuteRequest) Reset() { *m = StreamExecuteRequest{} } --func (m *StreamExecuteRequest) String() string { return proto.CompactTextString(m) } --func (*StreamExecuteRequest) ProtoMessage() {} --func (*StreamExecuteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } -+func (m *StreamExecuteRequest) String() string { return "TODO" } -+ -+ - - func (m *StreamExecuteRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1376,9 +1332,9 @@ - } - - func (m *StreamExecuteResponse) Reset() { *m = StreamExecuteResponse{} } --func (m *StreamExecuteResponse) String() string { return proto.CompactTextString(m) } --func (*StreamExecuteResponse) ProtoMessage() {} --func (*StreamExecuteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } -+func (m *StreamExecuteResponse) String() string { return "TODO" } -+ -+ - - func (m *StreamExecuteResponse) GetResult() *QueryResult { - if m != nil { -@@ -1396,9 +1352,9 @@ - } - - func (m *BeginRequest) Reset() { *m = BeginRequest{} } --func (m *BeginRequest) String() string { return proto.CompactTextString(m) } --func (*BeginRequest) ProtoMessage() {} --func (*BeginRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } -+func (m *BeginRequest) String() string { return "TODO" } -+ -+ - - func (m *BeginRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1434,9 +1390,9 @@ - } - - func (m *BeginResponse) Reset() { *m = BeginResponse{} } --func (m *BeginResponse) String() string { return proto.CompactTextString(m) } --func (*BeginResponse) ProtoMessage() {} --func (*BeginResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } -+func (m *BeginResponse) String() string { return "TODO" } -+ -+ - - func (m *BeginResponse) GetTransactionId() int64 { - if m != nil { -@@ -1454,9 +1410,9 @@ - } - - func (m *CommitRequest) Reset() { *m = CommitRequest{} } --func (m *CommitRequest) String() string { return proto.CompactTextString(m) } --func (*CommitRequest) ProtoMessage() {} --func (*CommitRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } -+func (m *CommitRequest) String() string { return "TODO" } -+ -+ - - func (m *CommitRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1491,9 +1447,9 @@ - } - - func (m *CommitResponse) Reset() { *m = CommitResponse{} } --func (m *CommitResponse) String() string { return proto.CompactTextString(m) } --func (*CommitResponse) ProtoMessage() {} --func (*CommitResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } -+func (m *CommitResponse) String() string { return "TODO" } -+ -+ - - // RollbackRequest is the payload to Rollback - type RollbackRequest struct { -@@ -1504,9 +1460,9 @@ - } - - func (m *RollbackRequest) Reset() { *m = RollbackRequest{} } --func (m *RollbackRequest) String() string { return proto.CompactTextString(m) } --func (*RollbackRequest) ProtoMessage() {} --func (*RollbackRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } -+func (m *RollbackRequest) String() string { return "TODO" } -+ -+ - - func (m *RollbackRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1541,9 +1497,9 @@ - } - - func (m *RollbackResponse) Reset() { *m = RollbackResponse{} } --func (m *RollbackResponse) String() string { return proto.CompactTextString(m) } --func (*RollbackResponse) ProtoMessage() {} --func (*RollbackResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } -+func (m *RollbackResponse) String() string { return "TODO" } -+ -+ - - // PrepareRequest is the payload to Prepare - type PrepareRequest struct { -@@ -1555,9 +1511,9 @@ - } - - func (m *PrepareRequest) Reset() { *m = PrepareRequest{} } --func (m *PrepareRequest) String() string { return proto.CompactTextString(m) } --func (*PrepareRequest) ProtoMessage() {} --func (*PrepareRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } -+func (m *PrepareRequest) String() string { return "TODO" } -+ -+ - - func (m *PrepareRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1599,9 +1555,9 @@ - } - - func (m *PrepareResponse) Reset() { *m = PrepareResponse{} } --func (m *PrepareResponse) String() string { return proto.CompactTextString(m) } --func (*PrepareResponse) ProtoMessage() {} --func (*PrepareResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } -+func (m *PrepareResponse) String() string { return "TODO" } -+ -+ - - // CommitPreparedRequest is the payload to CommitPrepared - type CommitPreparedRequest struct { -@@ -1612,9 +1568,9 @@ - } - - func (m *CommitPreparedRequest) Reset() { *m = CommitPreparedRequest{} } --func (m *CommitPreparedRequest) String() string { return proto.CompactTextString(m) } --func (*CommitPreparedRequest) ProtoMessage() {} --func (*CommitPreparedRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } -+func (m *CommitPreparedRequest) String() string { return "TODO" } -+ -+ - - func (m *CommitPreparedRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1649,9 +1605,9 @@ - } - - func (m *CommitPreparedResponse) Reset() { *m = CommitPreparedResponse{} } --func (m *CommitPreparedResponse) String() string { return proto.CompactTextString(m) } --func (*CommitPreparedResponse) ProtoMessage() {} --func (*CommitPreparedResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } -+func (m *CommitPreparedResponse) String() string { return "TODO" } -+ -+ - - // RollbackPreparedRequest is the payload to RollbackPrepared - type RollbackPreparedRequest struct { -@@ -1663,9 +1619,9 @@ - } - - func (m *RollbackPreparedRequest) Reset() { *m = RollbackPreparedRequest{} } --func (m *RollbackPreparedRequest) String() string { return proto.CompactTextString(m) } --func (*RollbackPreparedRequest) ProtoMessage() {} --func (*RollbackPreparedRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } -+func (m *RollbackPreparedRequest) String() string { return "TODO" } -+ -+ - - func (m *RollbackPreparedRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1707,9 +1663,9 @@ - } - - func (m *RollbackPreparedResponse) Reset() { *m = RollbackPreparedResponse{} } --func (m *RollbackPreparedResponse) String() string { return proto.CompactTextString(m) } --func (*RollbackPreparedResponse) ProtoMessage() {} --func (*RollbackPreparedResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } -+func (m *RollbackPreparedResponse) String() string { return "TODO" } -+ -+ - - // CreateTransactionRequest is the payload to CreateTransaction - type CreateTransactionRequest struct { -@@ -1721,9 +1677,9 @@ - } - - func (m *CreateTransactionRequest) Reset() { *m = CreateTransactionRequest{} } --func (m *CreateTransactionRequest) String() string { return proto.CompactTextString(m) } --func (*CreateTransactionRequest) ProtoMessage() {} --func (*CreateTransactionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } -+func (m *CreateTransactionRequest) String() string { return "TODO" } -+ -+ - - func (m *CreateTransactionRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1765,9 +1721,9 @@ - } - - func (m *CreateTransactionResponse) Reset() { *m = CreateTransactionResponse{} } --func (m *CreateTransactionResponse) String() string { return proto.CompactTextString(m) } --func (*CreateTransactionResponse) ProtoMessage() {} --func (*CreateTransactionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } -+func (m *CreateTransactionResponse) String() string { return "TODO" } -+ -+ - - // StartCommitRequest is the payload to StartCommit - type StartCommitRequest struct { -@@ -1779,9 +1735,9 @@ - } - - func (m *StartCommitRequest) Reset() { *m = StartCommitRequest{} } --func (m *StartCommitRequest) String() string { return proto.CompactTextString(m) } --func (*StartCommitRequest) ProtoMessage() {} --func (*StartCommitRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } -+func (m *StartCommitRequest) String() string { return "TODO" } -+ -+ - - func (m *StartCommitRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1823,9 +1779,9 @@ - } - - func (m *StartCommitResponse) Reset() { *m = StartCommitResponse{} } --func (m *StartCommitResponse) String() string { return proto.CompactTextString(m) } --func (*StartCommitResponse) ProtoMessage() {} --func (*StartCommitResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } -+func (m *StartCommitResponse) String() string { return "TODO" } -+ -+ - - // SetRollbackRequest is the payload to SetRollback - type SetRollbackRequest struct { -@@ -1837,9 +1793,9 @@ - } - - func (m *SetRollbackRequest) Reset() { *m = SetRollbackRequest{} } --func (m *SetRollbackRequest) String() string { return proto.CompactTextString(m) } --func (*SetRollbackRequest) ProtoMessage() {} --func (*SetRollbackRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } -+func (m *SetRollbackRequest) String() string { return "TODO" } -+ -+ - - func (m *SetRollbackRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1881,9 +1837,9 @@ - } - - func (m *SetRollbackResponse) Reset() { *m = SetRollbackResponse{} } --func (m *SetRollbackResponse) String() string { return proto.CompactTextString(m) } --func (*SetRollbackResponse) ProtoMessage() {} --func (*SetRollbackResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } -+func (m *SetRollbackResponse) String() string { return "TODO" } -+ -+ - - // ConcludeTransactionRequest is the payload to ConcludeTransaction - type ConcludeTransactionRequest struct { -@@ -1894,9 +1850,9 @@ - } - - func (m *ConcludeTransactionRequest) Reset() { *m = ConcludeTransactionRequest{} } --func (m *ConcludeTransactionRequest) String() string { return proto.CompactTextString(m) } --func (*ConcludeTransactionRequest) ProtoMessage() {} --func (*ConcludeTransactionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } -+func (m *ConcludeTransactionRequest) String() string { return "TODO" } -+ -+ - - func (m *ConcludeTransactionRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1931,9 +1887,9 @@ - } - - func (m *ConcludeTransactionResponse) Reset() { *m = ConcludeTransactionResponse{} } --func (m *ConcludeTransactionResponse) String() string { return proto.CompactTextString(m) } --func (*ConcludeTransactionResponse) ProtoMessage() {} --func (*ConcludeTransactionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } -+func (m *ConcludeTransactionResponse) String() string { return "TODO" } -+ -+ - - // ReadTransactionRequest is the payload to ReadTransaction - type ReadTransactionRequest struct { -@@ -1944,9 +1900,9 @@ - } - - func (m *ReadTransactionRequest) Reset() { *m = ReadTransactionRequest{} } --func (m *ReadTransactionRequest) String() string { return proto.CompactTextString(m) } --func (*ReadTransactionRequest) ProtoMessage() {} --func (*ReadTransactionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } -+func (m *ReadTransactionRequest) String() string { return "TODO" } -+ -+ - - func (m *ReadTransactionRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -1982,9 +1938,9 @@ - } - - func (m *ReadTransactionResponse) Reset() { *m = ReadTransactionResponse{} } --func (m *ReadTransactionResponse) String() string { return proto.CompactTextString(m) } --func (*ReadTransactionResponse) ProtoMessage() {} --func (*ReadTransactionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } -+func (m *ReadTransactionResponse) String() string { return "TODO" } -+ -+ - - func (m *ReadTransactionResponse) GetMetadata() *TransactionMetadata { - if m != nil { -@@ -2003,9 +1959,9 @@ - } - - func (m *BeginExecuteRequest) Reset() { *m = BeginExecuteRequest{} } --func (m *BeginExecuteRequest) String() string { return proto.CompactTextString(m) } --func (*BeginExecuteRequest) ProtoMessage() {} --func (*BeginExecuteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } -+func (m *BeginExecuteRequest) String() string { return "TODO" } -+ -+ - - func (m *BeginExecuteRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -2054,9 +2010,9 @@ - } - - func (m *BeginExecuteResponse) Reset() { *m = BeginExecuteResponse{} } --func (m *BeginExecuteResponse) String() string { return proto.CompactTextString(m) } --func (*BeginExecuteResponse) ProtoMessage() {} --func (*BeginExecuteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } -+func (m *BeginExecuteResponse) String() string { return "TODO" } -+ -+ - - func (m *BeginExecuteResponse) GetError() *vtrpc.RPCError { - if m != nil { -@@ -2090,9 +2046,9 @@ - } - - func (m *BeginExecuteBatchRequest) Reset() { *m = BeginExecuteBatchRequest{} } --func (m *BeginExecuteBatchRequest) String() string { return proto.CompactTextString(m) } --func (*BeginExecuteBatchRequest) ProtoMessage() {} --func (*BeginExecuteBatchRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } -+func (m *BeginExecuteBatchRequest) String() string { return "TODO" } -+ -+ - - func (m *BeginExecuteBatchRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -2148,9 +2104,9 @@ - } - - func (m *BeginExecuteBatchResponse) Reset() { *m = BeginExecuteBatchResponse{} } --func (m *BeginExecuteBatchResponse) String() string { return proto.CompactTextString(m) } --func (*BeginExecuteBatchResponse) ProtoMessage() {} --func (*BeginExecuteBatchResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } -+func (m *BeginExecuteBatchResponse) String() string { return "TODO" } -+ -+ - - func (m *BeginExecuteBatchResponse) GetError() *vtrpc.RPCError { - if m != nil { -@@ -2183,9 +2139,9 @@ - } - - func (m *MessageStreamRequest) Reset() { *m = MessageStreamRequest{} } --func (m *MessageStreamRequest) String() string { return proto.CompactTextString(m) } --func (*MessageStreamRequest) ProtoMessage() {} --func (*MessageStreamRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} } -+func (m *MessageStreamRequest) String() string { return "TODO" } -+ -+ - - func (m *MessageStreamRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -2221,9 +2177,9 @@ - } - - func (m *MessageStreamResponse) Reset() { *m = MessageStreamResponse{} } --func (m *MessageStreamResponse) String() string { return proto.CompactTextString(m) } --func (*MessageStreamResponse) ProtoMessage() {} --func (*MessageStreamResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} } -+func (m *MessageStreamResponse) String() string { return "TODO" } -+ -+ - - func (m *MessageStreamResponse) GetResult() *QueryResult { - if m != nil { -@@ -2243,9 +2199,9 @@ - } - - func (m *MessageAckRequest) Reset() { *m = MessageAckRequest{} } --func (m *MessageAckRequest) String() string { return proto.CompactTextString(m) } --func (*MessageAckRequest) ProtoMessage() {} --func (*MessageAckRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} } -+func (m *MessageAckRequest) String() string { return "TODO" } -+ -+ - - func (m *MessageAckRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -2291,9 +2247,9 @@ - } - - func (m *MessageAckResponse) Reset() { *m = MessageAckResponse{} } --func (m *MessageAckResponse) String() string { return proto.CompactTextString(m) } --func (*MessageAckResponse) ProtoMessage() {} --func (*MessageAckResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} } -+func (m *MessageAckResponse) String() string { return "TODO" } -+ -+ - - func (m *MessageAckResponse) GetResult() *QueryResult { - if m != nil { -@@ -2317,9 +2273,9 @@ - } - - func (m *SplitQueryRequest) Reset() { *m = SplitQueryRequest{} } --func (m *SplitQueryRequest) String() string { return proto.CompactTextString(m) } --func (*SplitQueryRequest) ProtoMessage() {} --func (*SplitQueryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} } -+func (m *SplitQueryRequest) String() string { return "TODO" } -+ -+ - - func (m *SplitQueryRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -2386,9 +2342,9 @@ - } - - func (m *QuerySplit) Reset() { *m = QuerySplit{} } --func (m *QuerySplit) String() string { return proto.CompactTextString(m) } --func (*QuerySplit) ProtoMessage() {} --func (*QuerySplit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} } -+func (m *QuerySplit) String() string { return "TODO" } -+ -+ - - func (m *QuerySplit) GetQuery() *BoundQuery { - if m != nil { -@@ -2411,9 +2367,9 @@ - } - - func (m *SplitQueryResponse) Reset() { *m = SplitQueryResponse{} } --func (m *SplitQueryResponse) String() string { return proto.CompactTextString(m) } --func (*SplitQueryResponse) ProtoMessage() {} --func (*SplitQueryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} } -+func (m *SplitQueryResponse) String() string { return "TODO" } -+ -+ - - func (m *SplitQueryResponse) GetQueries() []*QuerySplit { - if m != nil { -@@ -2427,12 +2383,11 @@ - } - - func (m *StreamHealthRequest) Reset() { *m = StreamHealthRequest{} } --func (m *StreamHealthRequest) String() string { return proto.CompactTextString(m) } --func (*StreamHealthRequest) ProtoMessage() {} --func (*StreamHealthRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} } -+func (m *StreamHealthRequest) String() string { return "TODO" } -+ - --// RealtimeStats contains information about the tablet status. --// It is only valid for a single tablet. -+ -+// RealtimeStats contains information about the tablet status - type RealtimeStats struct { - // health_error is the last error we got from health check, - // or empty is the server is healthy. This is used for subset selection, -@@ -2464,9 +2419,9 @@ - } - - func (m *RealtimeStats) Reset() { *m = RealtimeStats{} } --func (m *RealtimeStats) String() string { return proto.CompactTextString(m) } --func (*RealtimeStats) ProtoMessage() {} --func (*RealtimeStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} } -+func (m *RealtimeStats) String() string { return "TODO" } -+ -+ - - func (m *RealtimeStats) GetHealthError() string { - if m != nil { -@@ -2510,80 +2465,17 @@ - return 0 - } - --// AggregateStats contains information about the health of a group of --// tablets for a Target. It is used to propagate stats from a vtgate --// to another, or from the Gateway layer of a vtgate to the routing --// layer. --type AggregateStats struct { -- // healthy_tablet_count is the number of healthy tablets in the group. -- HealthyTabletCount int32 `protobuf:"varint,1,opt,name=healthy_tablet_count,json=healthyTabletCount" json:"healthy_tablet_count,omitempty"` -- // unhealthy_tablet_count is the number of unhealthy tablets in the group. -- UnhealthyTabletCount int32 `protobuf:"varint,2,opt,name=unhealthy_tablet_count,json=unhealthyTabletCount" json:"unhealthy_tablet_count,omitempty"` -- // seconds_behind_master_min is the minimum of the -- // seconds_behind_master values of the healthy tablets. It is unset -- // if the tablet type is master. -- SecondsBehindMasterMin uint32 `protobuf:"varint,3,opt,name=seconds_behind_master_min,json=secondsBehindMasterMin" json:"seconds_behind_master_min,omitempty"` -- // seconds_behind_master_max is the maximum of the -- // seconds_behind_master values of the healthy tablets. It is unset -- // if the tablet type is master. -- SecondsBehindMasterMax uint32 `protobuf:"varint,4,opt,name=seconds_behind_master_max,json=secondsBehindMasterMax" json:"seconds_behind_master_max,omitempty"` --} -- --func (m *AggregateStats) Reset() { *m = AggregateStats{} } --func (m *AggregateStats) String() string { return proto.CompactTextString(m) } --func (*AggregateStats) ProtoMessage() {} --func (*AggregateStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} } -- --func (m *AggregateStats) GetHealthyTabletCount() int32 { -- if m != nil { -- return m.HealthyTabletCount -- } -- return 0 --} -- --func (m *AggregateStats) GetUnhealthyTabletCount() int32 { -- if m != nil { -- return m.UnhealthyTabletCount -- } -- return 0 --} -- --func (m *AggregateStats) GetSecondsBehindMasterMin() uint32 { -- if m != nil { -- return m.SecondsBehindMasterMin -- } -- return 0 --} -- --func (m *AggregateStats) GetSecondsBehindMasterMax() uint32 { -- if m != nil { -- return m.SecondsBehindMasterMax -- } -- return 0 --} -- --// StreamHealthResponse is streamed by StreamHealth on a regular basis. --// When StreamHealth is used between a vtgate and vttablet: --// - target describes the tablet. --// - realtime_stats is set. --// - aggregate_stats is not set. --// When StreamHealth is used between two vtgates: --// - target describes the group of tablets. --// - realtime_stats is not set. --// - aggregate_stats is set. -+// StreamHealthResponse is streamed by StreamHealth on a regular basis - type StreamHealthResponse struct { - // target is the current server type. Only queries with that exact Target -- // record will be accepted (the cell may not match, however). -+ // record will be accepted. - Target *Target `protobuf:"bytes,1,opt,name=target" json:"target,omitempty"` - // serving is true iff the tablet is serving. A tablet may not be serving - // if filtered replication is enabled on a master for instance, - // or if a replica should not be used because the keyspace is being resharded. - Serving bool `protobuf:"varint,2,opt,name=serving" json:"serving,omitempty"` -- // tablet_externally_reparented_timestamp can be interpreted as the -- // last time we knew that this tablet was the MASTER of this shard -- // (if StreamHealthResponse describes a group of tablets, between -- // two vtgates, only one master will be present in the group, and -- // this is this master's value). -+ // tablet_externally_reparented_timestamp can be interpreted as the last time -+ // we knew that this tablet was the MASTER of this shard. - // - // It is used by vtgate when determining the current MASTER of a shard. - // If vtgate sees more than one MASTER tablet, this timestamp is used -@@ -2606,12 +2498,8 @@ - // OR - // d) 0 if the vttablet was never a MASTER. - TabletExternallyReparentedTimestamp int64 `protobuf:"varint,3,opt,name=tablet_externally_reparented_timestamp,json=tabletExternallyReparentedTimestamp" json:"tablet_externally_reparented_timestamp,omitempty"` -- // realtime_stats contains information about the tablet status. -- // It is only filled in if the information is about a tablet. -+ // realtime_stats contains information about the tablet status - RealtimeStats *RealtimeStats `protobuf:"bytes,4,opt,name=realtime_stats,json=realtimeStats" json:"realtime_stats,omitempty"` -- // AggregateStats constains information about the group of tablet status. -- // It is only filled in if the information is about a group of tablets. -- AggregateStats *AggregateStats `protobuf:"bytes,6,opt,name=aggregate_stats,json=aggregateStats" json:"aggregate_stats,omitempty"` - // tablet_alias is the alias of the sending tablet. The discovery/healthcheck.go - // code uses it to verify that it's talking to the correct tablet and that it - // hasn't changed in the meantime e.g. due to tablet restarts where ports or -@@ -2620,9 +2508,9 @@ - } - - func (m *StreamHealthResponse) Reset() { *m = StreamHealthResponse{} } --func (m *StreamHealthResponse) String() string { return proto.CompactTextString(m) } --func (*StreamHealthResponse) ProtoMessage() {} --func (*StreamHealthResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} } -+func (m *StreamHealthResponse) String() string { return "TODO" } -+ -+ - - func (m *StreamHealthResponse) GetTarget() *Target { - if m != nil { -@@ -2652,13 +2540,6 @@ - return nil - } - --func (m *StreamHealthResponse) GetAggregateStats() *AggregateStats { -- if m != nil { -- return m.AggregateStats -- } -- return nil --} -- - func (m *StreamHealthResponse) GetTabletAlias() *topodata.TabletAlias { - if m != nil { - return m.TabletAlias -@@ -2682,9 +2563,9 @@ - } - - func (m *UpdateStreamRequest) Reset() { *m = UpdateStreamRequest{} } --func (m *UpdateStreamRequest) String() string { return proto.CompactTextString(m) } --func (*UpdateStreamRequest) ProtoMessage() {} --func (*UpdateStreamRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} } -+func (m *UpdateStreamRequest) String() string { return "TODO" } -+ -+ - - func (m *UpdateStreamRequest) GetEffectiveCallerId() *vtrpc.CallerID { - if m != nil { -@@ -2727,9 +2608,9 @@ - } - - func (m *UpdateStreamResponse) Reset() { *m = UpdateStreamResponse{} } --func (m *UpdateStreamResponse) String() string { return proto.CompactTextString(m) } --func (*UpdateStreamResponse) ProtoMessage() {} --func (*UpdateStreamResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} } -+func (m *UpdateStreamResponse) String() string { return "TODO" } -+ -+ - - func (m *UpdateStreamResponse) GetEvent() *StreamEvent { - if m != nil { -@@ -2747,9 +2628,9 @@ - } - - func (m *TransactionMetadata) Reset() { *m = TransactionMetadata{} } --func (m *TransactionMetadata) String() string { return proto.CompactTextString(m) } --func (*TransactionMetadata) ProtoMessage() {} --func (*TransactionMetadata) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} } -+func (m *TransactionMetadata) String() string { return "TODO" } -+ -+ - - func (m *TransactionMetadata) GetDtid() string { - if m != nil { -@@ -2835,7 +2716,6 @@ - proto.RegisterType((*SplitQueryResponse)(nil), "query.SplitQueryResponse") - proto.RegisterType((*StreamHealthRequest)(nil), "query.StreamHealthRequest") - proto.RegisterType((*RealtimeStats)(nil), "query.RealtimeStats") -- proto.RegisterType((*AggregateStats)(nil), "query.AggregateStats") - proto.RegisterType((*StreamHealthResponse)(nil), "query.StreamHealthResponse") - proto.RegisterType((*UpdateStreamRequest)(nil), "query.UpdateStreamRequest") - proto.RegisterType((*UpdateStreamResponse)(nil), "query.UpdateStreamResponse") -@@ -2851,207 +2731,4 @@ - proto.RegisterEnum("query.SplitQueryRequest_Algorithm", SplitQueryRequest_Algorithm_name, SplitQueryRequest_Algorithm_value) - } - --func init() { proto.RegisterFile("query.proto", fileDescriptor0) } -- --var fileDescriptor0 = []byte{ -- // 3183 bytes of a gzipped FileDescriptorProto -- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x73, 0x1b, 0xc7, -- 0x99, 0xd7, 0xe0, 0x41, 0x02, 0x1f, 0x08, 0xb0, 0xd9, 0x20, 0x25, 0x88, 0xf2, 0x83, 0x3b, 0xb6, -- 0x6c, 0x2e, 0xed, 0xe5, 0xca, 0x94, 0x56, 0xab, 0xb5, 0x77, 0xbd, 0x1a, 0x82, 0x43, 0x19, 0x16, -- 0x5e, 0x6a, 0x0c, 0x24, 0xcb, 0xe5, 0xaa, 0xa9, 0x21, 0xd0, 0x02, 0xa7, 0x38, 0xc0, 0x40, 0x33, -- 0x03, 0x51, 0xbc, 0x69, 0xd7, 0x71, 0xde, 0x0f, 0xe7, 0xe9, 0x38, 0xa9, 0x38, 0xa9, 0xca, 0x3d, -- 0x7f, 0x43, 0x2a, 0x7f, 0x40, 0x6e, 0x39, 0x24, 0x39, 0xe4, 0x90, 0x4a, 0xe5, 0x90, 0x2a, 0x57, -- 0x4e, 0x39, 0xe4, 0x90, 0x4a, 0xf5, 0x63, 0x06, 0x03, 0x12, 0x7a, 0x58, 0xc9, 0x85, 0xb2, 0x4f, -- 0xe8, 0xfe, 0xbe, 0xaf, 0x1f, 0xbf, 0xdf, 0xf7, 0xcd, 0xd7, 0x8d, 0xee, 0x86, 0xdc, 0xed, 0x11, -- 0xf5, 0x0e, 0xd6, 0x87, 0x9e, 0x1b, 0xb8, 0x38, 0xcd, 0x2b, 0xcb, 0x85, 0xc0, 0x1d, 0xba, 0x5d, -- 0x2b, 0xb0, 0x84, 0x78, 0x39, 0x77, 0x27, 0xf0, 0x86, 0x1d, 0x51, 0x51, 0xdf, 0x53, 0x60, 0xc6, -- 0xb0, 0xbc, 0x1e, 0x0d, 0xf0, 0x32, 0x64, 0xf6, 0xe8, 0x81, 0x3f, 0xb4, 0x3a, 0xb4, 0xa4, 0xac, -- 0x28, 0xab, 0x59, 0x12, 0xd5, 0xf1, 0x22, 0xa4, 0xfd, 0x5d, 0xcb, 0xeb, 0x96, 0x12, 0x5c, 0x21, -- 0x2a, 0xf8, 0x3f, 0x20, 0x17, 0x58, 0x3b, 0x0e, 0x0d, 0xcc, 0xe0, 0x60, 0x48, 0x4b, 0xc9, 0x15, -- 0x65, 0xb5, 0xb0, 0xb1, 0xb8, 0x1e, 0x8d, 0x67, 0x70, 0xa5, 0x71, 0x30, 0xa4, 0x04, 0x82, 0xa8, -- 0x8c, 0x31, 0xa4, 0x3a, 0xd4, 0x71, 0x4a, 0x29, 0xde, 0x17, 0x2f, 0xab, 0x5b, 0x50, 0xb8, 0x6e, -- 0x5c, 0xb1, 0x02, 0x5a, 0xb6, 0x1c, 0x87, 0x7a, 0x95, 0x2d, 0x36, 0x9d, 0x91, 0x4f, 0xbd, 0x81, -- 0xd5, 0x8f, 0xa6, 0x13, 0xd6, 0xf1, 0x49, 0x98, 0xe9, 0x79, 0xee, 0x68, 0xe8, 0x97, 0x12, 0x2b, -- 0xc9, 0xd5, 0x2c, 0x91, 0x35, 0xf5, 0x1d, 0x00, 0xfd, 0x0e, 0x1d, 0x04, 0x86, 0xbb, 0x47, 0x07, -- 0xf8, 0x29, 0xc8, 0x06, 0x76, 0x9f, 0xfa, 0x81, 0xd5, 0x1f, 0xf2, 0x2e, 0x92, 0x64, 0x2c, 0xb8, -- 0x0f, 0xa4, 0x65, 0xc8, 0x0c, 0x5d, 0xdf, 0x0e, 0x6c, 0x77, 0xc0, 0xf1, 0x64, 0x49, 0x54, 0x57, -- 0x5f, 0x87, 0xf4, 0x75, 0xcb, 0x19, 0x51, 0xfc, 0x2c, 0xa4, 0x38, 0x60, 0x85, 0x03, 0xce, 0xad, -- 0x0b, 0xd2, 0x39, 0x4e, 0xae, 0x60, 0x7d, 0xdf, 0x61, 0x96, 0xbc, 0xef, 0x39, 0x22, 0x2a, 0xea, -- 0x1e, 0xcc, 0x6d, 0xda, 0x83, 0xee, 0x75, 0xcb, 0xb3, 0x19, 0x19, 0x8f, 0xd9, 0x0d, 0x7e, 0x1e, -- 0x66, 0x78, 0xc1, 0x2f, 0x25, 0x57, 0x92, 0xab, 0xb9, 0x8d, 0x39, 0xd9, 0x90, 0xcf, 0x8d, 0x48, -- 0x9d, 0xfa, 0x0b, 0x05, 0x60, 0xd3, 0x1d, 0x0d, 0xba, 0xd7, 0x98, 0x12, 0x23, 0x48, 0xfa, 0xb7, -- 0x1d, 0x49, 0x24, 0x2b, 0xe2, 0xab, 0x50, 0xd8, 0xb1, 0x07, 0x5d, 0xf3, 0x8e, 0x9c, 0x8e, 0xe0, -- 0x32, 0xb7, 0xf1, 0xbc, 0xec, 0x6e, 0xdc, 0x78, 0x3d, 0x3e, 0x6b, 0x5f, 0x1f, 0x04, 0xde, 0x01, -- 0xc9, 0xef, 0xc4, 0x65, 0xcb, 0x6d, 0xc0, 0x47, 0x8d, 0xd8, 0xa0, 0x7b, 0xf4, 0x20, 0x1c, 0x74, -- 0x8f, 0x1e, 0xe0, 0x7f, 0x8d, 0x23, 0xca, 0x6d, 0x14, 0xc3, 0xb1, 0x62, 0x6d, 0x25, 0xcc, 0x57, -- 0x13, 0x97, 0x14, 0xf5, 0x4f, 0x69, 0x28, 0xe8, 0x77, 0x69, 0x67, 0x14, 0xd0, 0xc6, 0x90, 0xf9, -- 0xc0, 0xc7, 0xeb, 0x50, 0xb4, 0x07, 0x1d, 0x67, 0xd4, 0xa5, 0x26, 0x65, 0xae, 0x36, 0x03, 0xe6, -- 0x6b, 0xde, 0x5f, 0x86, 0x2c, 0x48, 0x55, 0x2c, 0x08, 0x34, 0x28, 0x76, 0xdc, 0xfe, 0xd0, 0xf2, -- 0x26, 0xed, 0x93, 0x7c, 0xfc, 0x05, 0x39, 0xfe, 0xd8, 0x9e, 0x2c, 0x48, 0xeb, 0x58, 0x17, 0x35, -- 0x98, 0x97, 0xfd, 0x76, 0xcd, 0x5b, 0x36, 0x75, 0xba, 0x3e, 0x0f, 0xdd, 0x42, 0x44, 0xd5, 0xe4, -- 0x14, 0xd7, 0x2b, 0xd2, 0x78, 0x9b, 0xdb, 0x92, 0x82, 0x3d, 0x51, 0xc7, 0x6b, 0xb0, 0xd0, 0x71, -- 0x6c, 0x36, 0x95, 0x5b, 0x8c, 0x62, 0xd3, 0x73, 0xf7, 0xfd, 0x52, 0x9a, 0xcf, 0x7f, 0x5e, 0x28, -- 0xb6, 0x99, 0x9c, 0xb8, 0xfb, 0x3e, 0x7e, 0x15, 0x32, 0xfb, 0xae, 0xb7, 0xe7, 0xb8, 0x56, 0xb7, -- 0x34, 0xc3, 0xc7, 0x7c, 0x66, 0xfa, 0x98, 0x37, 0xa4, 0x15, 0x89, 0xec, 0xf1, 0x2a, 0x20, 0xff, -- 0xb6, 0x63, 0xfa, 0xd4, 0xa1, 0x9d, 0xc0, 0x74, 0xec, 0xbe, 0x1d, 0x94, 0x32, 0xfc, 0x2b, 0x28, -- 0xf8, 0xb7, 0x9d, 0x16, 0x17, 0x57, 0x99, 0x14, 0x9b, 0xb0, 0x14, 0x78, 0xd6, 0xc0, 0xb7, 0x3a, -- 0xac, 0x33, 0xd3, 0xf6, 0x5d, 0xc7, 0xe2, 0x5f, 0x40, 0x96, 0x0f, 0xb9, 0x36, 0x7d, 0x48, 0x63, -- 0xdc, 0xa4, 0x12, 0xb6, 0x20, 0x8b, 0xc1, 0x14, 0x29, 0x7e, 0x05, 0x96, 0xfc, 0x3d, 0x7b, 0x68, -- 0xf2, 0x7e, 0xcc, 0xa1, 0x63, 0x0d, 0xcc, 0x8e, 0xd5, 0xd9, 0xa5, 0x25, 0xe0, 0xb0, 0x31, 0x53, -- 0xf2, 0x50, 0x6b, 0x3a, 0xd6, 0xa0, 0xcc, 0x34, 0xea, 0x6b, 0x50, 0x98, 0xe4, 0x11, 0x2f, 0x40, -- 0xde, 0xb8, 0xd9, 0xd4, 0x4d, 0xad, 0xbe, 0x65, 0xd6, 0xb5, 0x9a, 0x8e, 0x4e, 0xe0, 0x3c, 0x64, -- 0xb9, 0xa8, 0x51, 0xaf, 0xde, 0x44, 0x0a, 0x9e, 0x85, 0xa4, 0x56, 0xad, 0xa2, 0x84, 0x7a, 0x09, -- 0x32, 0x21, 0x21, 0x78, 0x1e, 0x72, 0xed, 0x7a, 0xab, 0xa9, 0x97, 0x2b, 0xdb, 0x15, 0x7d, 0x0b, -- 0x9d, 0xc0, 0x19, 0x48, 0x35, 0xaa, 0x46, 0x13, 0x29, 0xa2, 0xa4, 0x35, 0x51, 0x82, 0xb5, 0xdc, -- 0xda, 0xd4, 0x50, 0x52, 0x0d, 0x60, 0x71, 0x1a, 0x2e, 0x9c, 0x83, 0xd9, 0x2d, 0x7d, 0x5b, 0x6b, -- 0x57, 0x0d, 0x74, 0x02, 0x17, 0x61, 0x9e, 0xe8, 0x4d, 0x5d, 0x33, 0xb4, 0xcd, 0xaa, 0x6e, 0x12, -- 0x5d, 0xdb, 0x42, 0x0a, 0xc6, 0x50, 0x60, 0x25, 0xb3, 0xdc, 0xa8, 0xd5, 0x2a, 0x86, 0xa1, 0x6f, -- 0xa1, 0x04, 0x5e, 0x04, 0xc4, 0x65, 0xed, 0xfa, 0x58, 0x9a, 0xc4, 0x08, 0xe6, 0x5a, 0x3a, 0xa9, -- 0x68, 0xd5, 0xca, 0xdb, 0xac, 0x03, 0x94, 0x7a, 0x33, 0x95, 0x51, 0x50, 0x42, 0xfd, 0x20, 0x01, -- 0x69, 0x8e, 0x95, 0x65, 0xc8, 0x58, 0xde, 0xe3, 0xe5, 0x28, 0x5b, 0x24, 0x1e, 0x90, 0x2d, 0x78, -- 0x92, 0x95, 0x79, 0x4b, 0x54, 0xf0, 0x19, 0xc8, 0xba, 0x5e, 0xcf, 0x14, 0x1a, 0x91, 0x71, 0x33, -- 0xae, 0xd7, 0xe3, 0xa9, 0x99, 0x65, 0x3b, 0x96, 0xa8, 0x77, 0x2c, 0x9f, 0xf2, 0x08, 0xcc, 0x92, -- 0xa8, 0x8e, 0x4f, 0x03, 0xb3, 0x33, 0xf9, 0x3c, 0x66, 0xb8, 0x6e, 0xd6, 0xf5, 0x7a, 0x75, 0x36, -- 0x95, 0xe7, 0x20, 0xdf, 0x71, 0x9d, 0x51, 0x7f, 0x60, 0x3a, 0x74, 0xd0, 0x0b, 0x76, 0x4b, 0xb3, -- 0x2b, 0xca, 0x6a, 0x9e, 0xcc, 0x09, 0x61, 0x95, 0xcb, 0x70, 0x09, 0x66, 0x3b, 0xbb, 0x96, 0xe7, -- 0x53, 0x11, 0x75, 0x79, 0x12, 0x56, 0xf9, 0xa8, 0xb4, 0x63, 0xf7, 0x2d, 0xc7, 0xe7, 0x11, 0x96, -- 0x27, 0x51, 0x9d, 0x81, 0xb8, 0xe5, 0x58, 0x3d, 0x9f, 0x47, 0x46, 0x9e, 0x88, 0x8a, 0xfa, 0x9f, -- 0x90, 0x24, 0xee, 0x3e, 0xeb, 0x52, 0x0c, 0xe8, 0x97, 0x94, 0x95, 0xe4, 0x2a, 0x26, 0x61, 0x95, -- 0x2d, 0x08, 0x32, 0x27, 0x8a, 0x54, 0x19, 0x66, 0xc1, 0x77, 0x60, 0x8e, 0x50, 0x7f, 0xe4, 0x04, -- 0xfa, 0xdd, 0xc0, 0xb3, 0x7c, 0xbc, 0x01, 0xb9, 0x78, 0x16, 0x50, 0xee, 0x97, 0x05, 0x80, 0x8e, -- 0x3f, 0xff, 0x12, 0xcc, 0xde, 0xf2, 0xa8, 0xbf, 0x4b, 0x3d, 0x99, 0x65, 0xc2, 0x2a, 0xcb, 0xb1, -- 0x39, 0x1e, 0xb6, 0x62, 0x0c, 0x96, 0x99, 0x65, 0x7e, 0x50, 0x26, 0x32, 0x33, 0x77, 0x2a, 0x91, -- 0x3a, 0xc6, 0x1e, 0xfb, 0xe4, 0x4d, 0xeb, 0xd6, 0x2d, 0xda, 0x09, 0xa8, 0x58, 0x80, 0x52, 0x64, -- 0x8e, 0x09, 0x35, 0x29, 0x63, 0x6e, 0xb3, 0x07, 0x3e, 0xf5, 0x02, 0xd3, 0xee, 0x72, 0x87, 0xa6, -- 0x48, 0x46, 0x08, 0x2a, 0x5d, 0xfc, 0x0c, 0xa4, 0x78, 0xd2, 0x48, 0xf1, 0x51, 0x40, 0x8e, 0x42, -- 0xdc, 0x7d, 0xc2, 0xe5, 0xf8, 0x25, 0x98, 0xa1, 0x1c, 0x2f, 0x77, 0xea, 0x38, 0xcd, 0xc6, 0xa9, -- 0x20, 0xd2, 0x44, 0xfd, 0x49, 0x12, 0x72, 0xad, 0xc0, 0xa3, 0x56, 0x9f, 0xe3, 0xc7, 0xff, 0x0d, -- 0xe0, 0x07, 0x56, 0x40, 0xfb, 0x74, 0x10, 0x84, 0x40, 0x9e, 0x92, 0x1d, 0xc4, 0xec, 0xd6, 0x5b, -- 0xa1, 0x11, 0x89, 0xd9, 0x1f, 0x26, 0x38, 0xf1, 0x08, 0x04, 0x2f, 0x7f, 0x94, 0x80, 0x6c, 0xd4, -- 0x1b, 0xd6, 0x20, 0xd3, 0xb1, 0x02, 0xda, 0x73, 0xbd, 0x03, 0xb9, 0x32, 0x9e, 0x7d, 0xd0, 0xe8, -- 0xeb, 0x65, 0x69, 0x4c, 0xa2, 0x66, 0xf8, 0x69, 0x10, 0xdb, 0x0d, 0x11, 0xbc, 0x62, 0x7d, 0xcf, -- 0x72, 0x09, 0x0f, 0xdf, 0x57, 0x01, 0x0f, 0x3d, 0xbb, 0x6f, 0x79, 0x07, 0xe6, 0x1e, 0x3d, 0x08, -- 0x53, 0x7a, 0x72, 0x8a, 0xcb, 0x90, 0xb4, 0xbb, 0x4a, 0x0f, 0x64, 0x12, 0xba, 0x34, 0xd9, 0x56, -- 0x06, 0xdd, 0x51, 0x47, 0xc4, 0x5a, 0xf2, 0x75, 0xd9, 0x0f, 0x57, 0xe0, 0x34, 0x8f, 0x4f, 0x56, -- 0x54, 0x5f, 0x84, 0x4c, 0x38, 0x79, 0x9c, 0x85, 0xb4, 0xee, 0x79, 0xae, 0x87, 0x4e, 0xf0, 0x5c, -- 0x54, 0xab, 0x8a, 0x74, 0xb6, 0xb5, 0xc5, 0xd2, 0xd9, 0xcf, 0x13, 0xd1, 0x32, 0x48, 0xe8, 0xed, -- 0x11, 0xf5, 0x03, 0xfc, 0xbf, 0x50, 0xa4, 0x3c, 0x56, 0xec, 0x3b, 0xd4, 0xec, 0xf0, 0x3d, 0x13, -- 0x8b, 0x14, 0x11, 0xd0, 0xf3, 0xeb, 0x62, 0x8b, 0x17, 0xee, 0xa5, 0xc8, 0x42, 0x64, 0x2b, 0x45, -- 0x5d, 0xac, 0x43, 0xd1, 0xee, 0xf7, 0x69, 0xd7, 0xb6, 0x82, 0x78, 0x07, 0xc2, 0x61, 0x4b, 0xe1, -- 0x96, 0x62, 0x62, 0x4b, 0x46, 0x16, 0xa2, 0x16, 0x51, 0x37, 0x67, 0x61, 0x26, 0xe0, 0xdb, 0x47, -- 0xb9, 0xa2, 0xe6, 0xc3, 0xbc, 0xc4, 0x85, 0x44, 0x2a, 0xf1, 0x8b, 0x20, 0x36, 0xa3, 0x3c, 0x03, -- 0x8d, 0x03, 0x62, 0xbc, 0xc7, 0x20, 0x42, 0x8f, 0xcf, 0x42, 0x61, 0x62, 0x29, 0xea, 0x72, 0xc2, -- 0x92, 0x24, 0x1f, 0x5f, 0x57, 0xba, 0xf8, 0xdf, 0x61, 0xd6, 0x15, 0xcb, 0x10, 0xcf, 0x4d, 0xe3, -- 0x19, 0x4f, 0xae, 0x51, 0x24, 0xb4, 0x52, 0xff, 0x07, 0xe6, 0x23, 0x06, 0xfd, 0xa1, 0x3b, 0xf0, -- 0x29, 0x5e, 0x83, 0x19, 0x8f, 0x7f, 0x10, 0x92, 0x35, 0x2c, 0xbb, 0x88, 0x7d, 0xd1, 0x44, 0x5a, -- 0xa8, 0x5d, 0x98, 0x17, 0x92, 0x1b, 0x76, 0xb0, 0xcb, 0x1d, 0x85, 0xcf, 0x42, 0x9a, 0xb2, 0xc2, -- 0x21, 0xce, 0x49, 0xb3, 0xcc, 0xf5, 0x44, 0x68, 0x63, 0xa3, 0x24, 0x1e, 0x3a, 0xca, 0x9f, 0x13, -- 0x50, 0x94, 0xb3, 0xdc, 0xb4, 0x82, 0xce, 0xee, 0x31, 0x75, 0xf6, 0x4b, 0x30, 0xcb, 0xe4, 0x76, -- 0xf4, 0x61, 0x4c, 0x71, 0x77, 0x68, 0xc1, 0x1c, 0x6e, 0xf9, 0x66, 0xcc, 0xbb, 0x72, 0x2b, 0x94, -- 0xb7, 0xfc, 0xd8, 0x42, 0x3c, 0x25, 0x2e, 0x66, 0x1e, 0x12, 0x17, 0xb3, 0x8f, 0x14, 0x17, 0x5b, -- 0xb0, 0x38, 0xc9, 0xb8, 0x0c, 0x8e, 0x97, 0x61, 0x56, 0x38, 0x25, 0x4c, 0x81, 0xd3, 0xfc, 0x16, -- 0x9a, 0xa8, 0x3f, 0x4e, 0xc0, 0xa2, 0xcc, 0x4e, 0x9f, 0x8e, 0xcf, 0x34, 0xc6, 0x73, 0xfa, 0x91, -- 0x78, 0x2e, 0xc3, 0xd2, 0x21, 0x82, 0x1e, 0xe3, 0x2b, 0xfc, 0x58, 0x81, 0xb9, 0x4d, 0xda, 0xb3, -- 0x07, 0xc7, 0x94, 0xde, 0x18, 0x6b, 0xa9, 0x47, 0x62, 0xed, 0x22, 0xe4, 0x25, 0x5e, 0xc9, 0xd6, -- 0xd1, 0xcf, 0x40, 0x99, 0xf2, 0x19, 0xa8, 0x7f, 0x50, 0x20, 0x5f, 0x76, 0xfb, 0x7d, 0x3b, 0x38, -- 0xa6, 0x4c, 0x1d, 0xc5, 0x99, 0x9a, 0x86, 0x13, 0x41, 0x21, 0x84, 0x29, 0x08, 0x52, 0xff, 0xa8, -- 0xc0, 0x3c, 0x71, 0x1d, 0x67, 0xc7, 0xea, 0xec, 0x3d, 0xd9, 0xd8, 0x31, 0xa0, 0x31, 0x50, 0x89, -- 0xfe, 0xaf, 0x0a, 0x14, 0x9a, 0x1e, 0x65, 0xff, 0x5f, 0x9f, 0x68, 0xf0, 0xec, 0x0f, 0x52, 0x37, -- 0x90, 0x9b, 0x83, 0x2c, 0xe1, 0x65, 0x75, 0x01, 0xe6, 0x23, 0xec, 0x92, 0x8f, 0xdf, 0x28, 0xb0, -- 0x24, 0x02, 0x44, 0x6a, 0xba, 0xc7, 0x94, 0x96, 0x10, 0x6f, 0x2a, 0x86, 0xb7, 0x04, 0x27, 0x0f, -- 0x63, 0x93, 0xb0, 0xdf, 0x4d, 0xc0, 0xa9, 0x30, 0x36, 0x8e, 0x39, 0xf0, 0x7f, 0x20, 0x1e, 0x96, -- 0xa1, 0x74, 0x94, 0x04, 0xc9, 0xd0, 0xfb, 0x09, 0x28, 0x95, 0x3d, 0x6a, 0x05, 0x34, 0xb6, 0xc9, -- 0x78, 0x72, 0x62, 0x03, 0xbf, 0x02, 0x73, 0x43, 0xcb, 0x0b, 0xec, 0x8e, 0x3d, 0xb4, 0xd8, 0xdf, -- 0xb8, 0x34, 0xdf, 0xc3, 0x1c, 0xea, 0x60, 0xc2, 0x44, 0x3d, 0x03, 0xa7, 0xa7, 0x30, 0x22, 0xf9, -- 0xfa, 0x9b, 0x02, 0xb8, 0x15, 0x58, 0x5e, 0xf0, 0x29, 0x58, 0x55, 0xa6, 0x06, 0xd3, 0x12, 0x14, -- 0x27, 0xf0, 0xc7, 0x79, 0xa1, 0xc1, 0xa7, 0x62, 0xc5, 0xb9, 0x2f, 0x2f, 0x71, 0xfc, 0x92, 0x97, -- 0xdf, 0x29, 0xb0, 0x5c, 0x76, 0xc5, 0xf9, 0xdd, 0x13, 0xf9, 0x85, 0xa9, 0x4f, 0xc3, 0x99, 0xa9, -- 0x00, 0x25, 0x01, 0xbf, 0x55, 0xe0, 0x24, 0xa1, 0x56, 0xf7, 0xc9, 0x04, 0x7f, 0x0d, 0x4e, 0x1d, -- 0x01, 0x27, 0x77, 0xa8, 0x17, 0x21, 0xd3, 0xa7, 0x81, 0xd5, 0xb5, 0x02, 0x4b, 0x42, 0x5a, 0x0e, -- 0xfb, 0x1d, 0x5b, 0xd7, 0xa4, 0x05, 0x89, 0x6c, 0xd5, 0x8f, 0x12, 0x50, 0xe4, 0x7b, 0xdd, 0xcf, -- 0xfe, 0x41, 0x4d, 0xff, 0x2f, 0xf0, 0xbe, 0x02, 0x8b, 0x93, 0x04, 0x45, 0xff, 0x09, 0xfe, 0xd9, -- 0x07, 0x11, 0x53, 0x12, 0x42, 0x72, 0xda, 0x16, 0xf4, 0x97, 0x09, 0x28, 0xc5, 0xa7, 0xf4, 0xd9, -- 0xa1, 0xc5, 0xe4, 0xa1, 0xc5, 0x27, 0x3e, 0xa5, 0xfa, 0x40, 0x81, 0xd3, 0x53, 0x08, 0xfd, 0x64, -- 0x8e, 0x8e, 0x1d, 0x5d, 0x24, 0x1e, 0x7a, 0x74, 0xf1, 0xa8, 0xae, 0xfe, 0xb5, 0x02, 0x8b, 0x35, -- 0xea, 0xfb, 0x56, 0x8f, 0x8a, 0xff, 0xf1, 0xc7, 0x37, 0x9b, 0xf1, 0x43, 0xe1, 0xd4, 0xf8, 0x66, -- 0x45, 0x2d, 0xc3, 0xd2, 0x21, 0x68, 0x8f, 0x71, 0x36, 0xf1, 0x17, 0x05, 0x16, 0x64, 0x2f, 0xda, -- 0xb1, 0xdd, 0x08, 0x4c, 0x61, 0x07, 0x3f, 0x03, 0x49, 0xbb, 0x1b, 0xee, 0x20, 0x27, 0xef, 0x9a, -- 0x99, 0x42, 0xbd, 0x0c, 0x38, 0x8e, 0xfb, 0x31, 0xa8, 0xfb, 0x55, 0x12, 0x16, 0x5a, 0x43, 0xc7, -- 0x0e, 0xa4, 0xf2, 0xc9, 0x4e, 0xfc, 0xff, 0x02, 0x73, 0x3e, 0x03, 0x6b, 0x8a, 0xdb, 0x32, 0x4e, -- 0x6c, 0x96, 0xe4, 0xb8, 0xac, 0xcc, 0x45, 0xf8, 0x59, 0xc8, 0x85, 0x26, 0xa3, 0x41, 0x20, 0x4f, -- 0x3a, 0x41, 0x5a, 0x8c, 0x06, 0x01, 0xbe, 0x00, 0xa7, 0x06, 0xa3, 0x3e, 0xbf, 0x39, 0x36, 0x87, -- 0xd4, 0x0b, 0xef, 0x55, 0x2d, 0x2f, 0xbc, 0xe1, 0x2d, 0x0e, 0x46, 0x7d, 0xe2, 0xee, 0xfb, 0x4d, -- 0xea, 0x89, 0x7b, 0x55, 0xcb, 0x0b, 0xf0, 0x65, 0xc8, 0x5a, 0x4e, 0xcf, 0xf5, 0xec, 0x60, 0xb7, -- 0x2f, 0xaf, 0x76, 0xd5, 0xf0, 0x6a, 0xe5, 0x30, 0xfd, 0xeb, 0x5a, 0x68, 0x49, 0xc6, 0x8d, 0xd4, -- 0x97, 0x21, 0x1b, 0xc9, 0x31, 0x82, 0x39, 0xfd, 0x5a, 0x5b, 0xab, 0x9a, 0xad, 0x66, 0xb5, 0x62, -- 0xb4, 0xc4, 0x75, 0xec, 0x76, 0xbb, 0x5a, 0x35, 0x5b, 0x65, 0xad, 0x8e, 0x14, 0x95, 0x00, 0xf0, -- 0x2e, 0x79, 0xe7, 0x63, 0x82, 0x94, 0x87, 0x10, 0x74, 0x06, 0xb2, 0x9e, 0xbb, 0x2f, 0xb1, 0x27, -- 0x38, 0x9c, 0x8c, 0xe7, 0xee, 0x73, 0xe4, 0xaa, 0x06, 0x38, 0x3e, 0x57, 0x19, 0x6d, 0xb1, 0xe4, -- 0xad, 0x4c, 0x24, 0xef, 0xf1, 0xf8, 0x51, 0xf2, 0x16, 0x5b, 0x79, 0xf6, 0x9d, 0xbf, 0x41, 0x2d, -- 0x27, 0x08, 0xd7, 0x2b, 0xf5, 0xa7, 0x09, 0xc8, 0x13, 0x26, 0xb1, 0xfb, 0xb4, 0x15, 0x58, 0x81, -- 0xcf, 0x3c, 0xb5, 0xcb, 0x4d, 0xcc, 0x71, 0xda, 0xcd, 0x92, 0x9c, 0x90, 0x89, 0x4b, 0x80, 0x0d, -- 0x58, 0xf2, 0x69, 0xc7, 0x1d, 0x74, 0x7d, 0x73, 0x87, 0xee, 0xda, 0x83, 0xae, 0xd9, 0xb7, 0xfc, -- 0x40, 0xde, 0x14, 0xe6, 0x49, 0x51, 0x2a, 0x37, 0xb9, 0xae, 0xc6, 0x55, 0xf8, 0x1c, 0x2c, 0xee, -- 0xd8, 0x03, 0xc7, 0xed, 0x99, 0x43, 0xc7, 0x3a, 0xa0, 0x9e, 0x2f, 0xa1, 0xb2, 0xf0, 0x4a, 0x13, -- 0x2c, 0x74, 0x4d, 0xa1, 0x12, 0xee, 0x7e, 0x1b, 0xd6, 0xa6, 0x8e, 0x62, 0xde, 0xb2, 0x9d, 0x80, -- 0x7a, 0xb4, 0x6b, 0x7a, 0x74, 0xe8, 0xd8, 0x1d, 0x71, 0x69, 0x2f, 0xf6, 0xee, 0x2f, 0x4c, 0x19, -- 0x7a, 0x5b, 0x9a, 0x93, 0xb1, 0x35, 0x63, 0xbb, 0x33, 0x1c, 0x99, 0x23, 0xf6, 0x01, 0xf3, 0x55, -- 0x4c, 0x21, 0x99, 0xce, 0x70, 0xd4, 0x66, 0x75, 0x8c, 0x20, 0x79, 0x7b, 0x28, 0x16, 0x2f, 0x85, -- 0xb0, 0xa2, 0xfa, 0xb1, 0x02, 0x05, 0xad, 0xd7, 0xf3, 0x68, 0xcf, 0x0a, 0x24, 0x4d, 0xe7, 0x60, -- 0x51, 0x50, 0x72, 0x60, 0xca, 0xd7, 0x40, 0x02, 0x8f, 0x22, 0xf0, 0x48, 0x9d, 0x78, 0x0b, 0x14, -- 0x86, 0xef, 0xc9, 0xd1, 0x60, 0x6a, 0x9b, 0x04, 0x6f, 0xb3, 0x18, 0x69, 0xe3, 0xad, 0xfe, 0x0b, -- 0x4e, 0x4f, 0x67, 0xa1, 0x6f, 0x8b, 0xf7, 0x1c, 0x79, 0x72, 0x72, 0x0a, 0xe8, 0x9a, 0x3d, 0x78, -- 0x40, 0x53, 0xeb, 0x2e, 0xe7, 0xeb, 0x3e, 0x4d, 0xad, 0xbb, 0xea, 0xef, 0xa3, 0xa3, 0xfd, 0x30, -- 0x5c, 0xa2, 0xd5, 0x38, 0xcc, 0x0b, 0xca, 0x83, 0xf2, 0x42, 0x09, 0x66, 0x7d, 0xea, 0xdd, 0xb1, -- 0x07, 0xbd, 0xf0, 0xf6, 0x58, 0x56, 0x71, 0x0b, 0x5e, 0x90, 0xd8, 0xe9, 0xdd, 0x80, 0x7a, 0x03, -- 0xcb, 0x71, 0x0e, 0x4c, 0x71, 0x50, 0x31, 0x08, 0x68, 0xd7, 0x1c, 0xbf, 0x5d, 0x12, 0x2b, 0xf2, -- 0x73, 0xc2, 0x5a, 0x8f, 0x8c, 0x49, 0x64, 0x6b, 0x44, 0xaf, 0x9a, 0x5e, 0x83, 0x82, 0x27, 0x83, -- 0xd8, 0xf4, 0x99, 0x7b, 0x64, 0x3e, 0x5a, 0x8c, 0xae, 0x80, 0x63, 0x11, 0x4e, 0xf2, 0xde, 0x44, -- 0xc0, 0xbf, 0x0e, 0xf3, 0x56, 0xe8, 0x5b, 0xd9, 0x7a, 0x72, 0xdf, 0x32, 0xe9, 0x79, 0x52, 0xb0, -- 0x26, 0x23, 0xe1, 0x12, 0xcc, 0x49, 0x44, 0x96, 0x63, 0x5b, 0xe3, 0x8d, 0xed, 0xa1, 0x07, 0x61, -- 0x1a, 0x53, 0x12, 0xf9, 0x74, 0x8c, 0x57, 0xd8, 0xff, 0xe8, 0x62, 0x7b, 0xd8, 0xe5, 0x3d, 0x1d, -- 0xe3, 0xdd, 0x45, 0xfc, 0xf5, 0x58, 0x6a, 0xf2, 0xf5, 0xd8, 0xe4, 0x6b, 0xb4, 0xf4, 0xa1, 0xd7, -- 0x68, 0xea, 0x65, 0x58, 0x9c, 0xc4, 0x2f, 0xa3, 0x6c, 0x15, 0xd2, 0xfc, 0xa6, 0xfc, 0xd0, 0x32, -- 0x1a, 0xbb, 0x0a, 0x27, 0xc2, 0x40, 0xfd, 0x99, 0x02, 0xc5, 0x29, 0x7f, 0xb1, 0xa2, 0xff, 0x6f, -- 0x4a, 0xec, 0x78, 0xe8, 0xdf, 0x20, 0xcd, 0xef, 0xec, 0xe5, 0x63, 0x92, 0x53, 0x47, 0xff, 0xa1, -- 0xf1, 0xfb, 0x75, 0x22, 0xac, 0x58, 0x22, 0xe4, 0x01, 0xd5, 0xe1, 0xe7, 0x43, 0xe1, 0x0e, 0x31, -- 0xc7, 0x64, 0xe2, 0xc8, 0xe8, 0xe8, 0x81, 0x53, 0xea, 0xa1, 0x07, 0x4e, 0x6b, 0xdf, 0x4a, 0x42, -- 0xb6, 0x76, 0xd0, 0xba, 0xed, 0x6c, 0x3b, 0x56, 0x8f, 0x5f, 0x80, 0xd7, 0x9a, 0xc6, 0x4d, 0x74, -- 0x02, 0x2f, 0x40, 0xbe, 0xde, 0x30, 0xcc, 0x3a, 0x5b, 0x4a, 0xb6, 0xab, 0xda, 0x15, 0xa4, 0xb0, -- 0xb5, 0xa6, 0x49, 0x2a, 0xe6, 0x55, 0xfd, 0xa6, 0x90, 0x24, 0x70, 0x11, 0xe6, 0xdb, 0xf5, 0xca, -- 0xb5, 0xb6, 0x3e, 0x16, 0xa6, 0xf0, 0x12, 0x2c, 0xd4, 0xda, 0x55, 0xa3, 0xd2, 0xac, 0xc6, 0xc4, -- 0x19, 0xb6, 0x2e, 0x6d, 0x56, 0x1b, 0x9b, 0xa2, 0x8a, 0x58, 0xff, 0xed, 0x7a, 0xab, 0x72, 0xa5, -- 0xae, 0x6f, 0x09, 0xd1, 0x0a, 0x13, 0xbd, 0xad, 0x93, 0xc6, 0x76, 0x25, 0x1c, 0xf2, 0x32, 0x46, -- 0x90, 0xdb, 0xac, 0xd4, 0x35, 0x22, 0x7b, 0xb9, 0xa7, 0xe0, 0x02, 0x64, 0xf5, 0x7a, 0xbb, 0x26, -- 0xeb, 0x09, 0x5c, 0x82, 0xa2, 0xd6, 0x36, 0x1a, 0x66, 0xa5, 0x5e, 0x26, 0x7a, 0x4d, 0xaf, 0x1b, -- 0x52, 0x93, 0xc2, 0x45, 0x28, 0x18, 0x95, 0x9a, 0xde, 0x32, 0xb4, 0x5a, 0x53, 0x0a, 0xd9, 0x2c, -- 0x32, 0x2d, 0x3d, 0xb4, 0x41, 0x78, 0x19, 0x96, 0xea, 0x0d, 0x53, 0x3e, 0x2a, 0x32, 0xaf, 0x6b, -- 0xd5, 0xb6, 0x2e, 0x75, 0x2b, 0xf8, 0x14, 0xe0, 0x46, 0xdd, 0x6c, 0x37, 0xb7, 0x34, 0x43, 0x37, -- 0xeb, 0x8d, 0x1b, 0x52, 0x71, 0x19, 0x17, 0x20, 0x33, 0x9e, 0xc1, 0x3d, 0xc6, 0x42, 0xbe, 0xa9, -- 0x11, 0x63, 0x0c, 0xf6, 0xde, 0x3d, 0x46, 0x16, 0x5c, 0x21, 0x8d, 0x76, 0x73, 0x6c, 0xb6, 0x00, -- 0x39, 0x49, 0x96, 0x14, 0xa5, 0x98, 0x68, 0xb3, 0x52, 0x2f, 0x47, 0xf3, 0xbb, 0x97, 0x59, 0x4e, -- 0x20, 0x65, 0x6d, 0x0f, 0x52, 0xdc, 0x1d, 0x19, 0x48, 0xd5, 0x1b, 0x75, 0x1d, 0x9d, 0xc0, 0xf3, -- 0x00, 0x95, 0x56, 0xa5, 0x6e, 0xe8, 0x57, 0x88, 0x56, 0x65, 0xb0, 0xb9, 0x20, 0x24, 0x90, 0xa1, -- 0x9d, 0x83, 0xd9, 0x4a, 0x6b, 0xbb, 0xda, 0xd0, 0x0c, 0x09, 0xb3, 0xd2, 0xba, 0xd6, 0x6e, 0x18, -- 0x4c, 0x89, 0x70, 0x0e, 0x66, 0x2a, 0x2d, 0x43, 0x7f, 0xcb, 0x60, 0xb8, 0xb8, 0x4e, 0xb0, 0x8a, -- 0xee, 0x5d, 0x5e, 0xfb, 0x30, 0x09, 0x29, 0xfe, 0x22, 0x34, 0x0f, 0x59, 0xee, 0x6d, 0xe3, 0x66, -- 0x93, 0x0d, 0x99, 0x85, 0x54, 0xa5, 0x6e, 0x5c, 0x42, 0xff, 0x97, 0xc0, 0x00, 0xe9, 0x36, 0x2f, -- 0xff, 0xff, 0x0c, 0x2b, 0x57, 0xea, 0xc6, 0x2b, 0x17, 0xd1, 0xbb, 0x09, 0xd6, 0x6d, 0x5b, 0x54, -- 0x3e, 0x17, 0x2a, 0x36, 0x2e, 0xa0, 0xf7, 0x22, 0xc5, 0xc6, 0x05, 0xf4, 0xf9, 0x50, 0x71, 0x7e, -- 0x03, 0x7d, 0x21, 0x52, 0x9c, 0xdf, 0x40, 0x5f, 0x0c, 0x15, 0x17, 0x2f, 0xa0, 0x2f, 0x45, 0x8a, -- 0x8b, 0x17, 0xd0, 0x97, 0x67, 0x18, 0x16, 0x8e, 0xe4, 0xfc, 0x06, 0xfa, 0x4a, 0x26, 0xaa, 0x5d, -- 0xbc, 0x80, 0xbe, 0x9a, 0x61, 0xfe, 0x8f, 0xbc, 0x8a, 0xbe, 0x86, 0xd8, 0x34, 0x99, 0x83, 0xd0, -- 0xd7, 0x79, 0x91, 0xa9, 0xd0, 0x37, 0x10, 0xc3, 0xc8, 0xa4, 0xbc, 0xfa, 0x3e, 0xd7, 0xdc, 0xd4, -- 0x35, 0x82, 0xbe, 0x39, 0x23, 0xde, 0x90, 0x95, 0x2b, 0x35, 0xad, 0x8a, 0x30, 0x6f, 0xc1, 0x58, -- 0xf9, 0xf6, 0x39, 0x56, 0x64, 0xe1, 0x89, 0xbe, 0xd3, 0x64, 0x03, 0x5e, 0xd7, 0x48, 0xf9, 0x0d, -- 0x8d, 0xa0, 0xef, 0x9e, 0x63, 0x03, 0x5e, 0xd7, 0x88, 0xe4, 0xeb, 0x7b, 0x4d, 0x66, 0xc8, 0x55, -- 0x1f, 0x9c, 0x63, 0x93, 0x96, 0xf2, 0xef, 0x37, 0x71, 0x06, 0x92, 0x9b, 0x15, 0x03, 0x7d, 0xc8, -- 0x47, 0x63, 0x21, 0x8a, 0x7e, 0x80, 0x98, 0xb0, 0xa5, 0x1b, 0xe8, 0x87, 0x4c, 0x98, 0x36, 0xda, -- 0xcd, 0xaa, 0x8e, 0x9e, 0x62, 0x93, 0xbb, 0xa2, 0x37, 0x6a, 0xba, 0x41, 0x6e, 0xa2, 0x1f, 0x71, -- 0xf3, 0x37, 0x5b, 0x8d, 0x3a, 0xfa, 0x08, 0xe1, 0x02, 0x80, 0xfe, 0x56, 0x93, 0xe8, 0xad, 0x56, -- 0xa5, 0x51, 0x47, 0xcf, 0xae, 0x6d, 0x03, 0x3a, 0x9c, 0x0e, 0x18, 0x80, 0x76, 0xfd, 0x6a, 0xbd, -- 0x71, 0xa3, 0x8e, 0x4e, 0xb0, 0x4a, 0x93, 0xe8, 0x4d, 0x8d, 0xe8, 0x48, 0xc1, 0x00, 0x33, 0xe2, -- 0x85, 0x1b, 0x4a, 0xe0, 0x39, 0xc8, 0x90, 0x46, 0xb5, 0xba, 0xa9, 0x95, 0xaf, 0xa2, 0xe4, 0xe6, -- 0x02, 0xcc, 0xdb, 0xee, 0xfa, 0x1d, 0x3b, 0xa0, 0xbe, 0x2f, 0xde, 0x1c, 0xef, 0xcc, 0xf0, 0x9f, -- 0xf3, 0x7f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xde, 0xe3, 0xd2, 0x1e, 0xad, 0x2c, 0x00, 0x00, --} -+*/ diff --git a/patches/sqlparser.patch b/patches/sqlparser.patch deleted file mode 100644 index 9cdc14e..0000000 --- a/patches/sqlparser.patch +++ /dev/null @@ -1,316 +0,0 @@ -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: .git -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: .gitignore -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: .travis.yml -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: CONTRIBUTORS.md -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: LICENSE.md -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: README.md -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/analyzer.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//analyzer.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/analyzer.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//analyzer.go 2018-06-06 07:45:09.000000000 -0700 -@@ -19,15 +19,13 @@ - // analyzer.go contains utility analysis functions. - - import ( -+ "errors" - "fmt" - "strconv" - "strings" - "unicode" - -- "vitess.io/vitess/go/sqltypes" -- "vitess.io/vitess/go/vt/vterrors" -- -- vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - // These constants are used to identify the SQL statement type. -@@ -219,7 +217,7 @@ - case IntVal: - n, err := sqltypes.NewIntegral(string(node.Val)) - if err != nil { -- return sqltypes.PlanValue{}, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "%v", err) -+ return sqltypes.PlanValue{}, fmt.Errorf("%v", err) - } - return sqltypes.PlanValue{Value: n}, nil - case StrVal: -@@ -227,7 +225,7 @@ - case HexVal: - v, err := node.HexDecode() - if err != nil { -- return sqltypes.PlanValue{}, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "%v", err) -+ return sqltypes.PlanValue{}, fmt.Errorf("%v", err) - } - return sqltypes.PlanValue{Value: sqltypes.MakeTrusted(sqltypes.VarBinary, v)}, nil - } -@@ -243,7 +241,7 @@ - return sqltypes.PlanValue{}, err - } - if innerpv.ListKey != "" || innerpv.Values != nil { -- return sqltypes.PlanValue{}, vterrors.New(vtrpcpb.Code_UNIMPLEMENTED, "unsupported: nested lists") -+ return sqltypes.PlanValue{}, errors.New("unsupported: nested lists") - } - pv.Values = append(pv.Values, innerpv) - } -@@ -251,7 +249,7 @@ - case *NullVal: - return sqltypes.PlanValue{}, nil - } -- return sqltypes.PlanValue{}, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "expression is too complex '%v'", String(node)) -+ return sqltypes.PlanValue{}, fmt.Errorf("expression is too complex '%v'", String(node)) - } - - // StringIn is a convenience function that returns -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/analyzer_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//analyzer_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/analyzer_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//analyzer_test.go 2018-06-06 07:45:09.000000000 -0700 -@@ -21,7 +21,7 @@ - "strings" - "testing" - -- "vitess.io/vitess/go/sqltypes" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - func TestPreview(t *testing.T) { -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/ast.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//ast.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/ast.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//ast.go 2018-06-06 07:45:09.000000000 -0700 -@@ -22,14 +22,11 @@ - "encoding/json" - "fmt" - "io" -+ "log" - "strings" - -- "vitess.io/vitess/go/sqltypes" -- "vitess.io/vitess/go/vt/log" -- "vitess.io/vitess/go/vt/vterrors" -- -- querypb "vitess.io/vitess/go/vt/proto/query" -- vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" -+ "github.com/xwb1989/sqlparser/dependency/querypb" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - // Instructions for creating new types: If a type -@@ -52,11 +49,11 @@ - tokenizer := NewStringTokenizer(sql) - if yyParse(tokenizer) != 0 { - if tokenizer.partialDDL != nil { -- log.Warningf("ignoring error parsing DDL '%s': %v", sql, tokenizer.LastError) -+ log.Printf("ignoring error parsing DDL '%s': %v", sql, tokenizer.LastError) - tokenizer.ParseTree = tokenizer.partialDDL - return tokenizer.ParseTree, nil - } -- return nil, vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, tokenizer.LastError.Error()) -+ return nil, tokenizer.LastError - } - return tokenizer.ParseTree, nil - } -@@ -2249,7 +2246,7 @@ - return NewStrVal(value.ToBytes()), nil - default: - // We cannot support sqltypes.Expression, or any other invalid type. -- return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "cannot convert value %v to AST", value) -+ return nil, fmt.Errorf("cannot convert value %v to AST", value) - } - } - -@@ -3394,6 +3391,20 @@ - return nil - } - -+// Backtick produces a backticked literal given an input string. -+func Backtick(in string) string { -+ var buf bytes.Buffer -+ buf.WriteByte('`') -+ for _, c := range in { -+ buf.WriteRune(c) -+ if c == '`' { -+ buf.WriteByte('`') -+ } -+ } -+ buf.WriteByte('`') -+ return buf.String() -+} -+ - func formatID(buf *TrackedBuffer, original, lowered string) { - isDbSystemVariable := false - if len(original) > 1 && original[:2] == "@@" { -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/ast_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//ast_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/ast_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//ast_test.go 2018-06-05 07:41:09.000000000 -0700 -@@ -24,7 +24,7 @@ - "testing" - "unsafe" - -- "vitess.io/vitess/go/sqltypes" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - func TestAppend(t *testing.T) { -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/comments.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//comments.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/comments.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//comments.go 2018-06-06 07:45:09.000000000 -0700 -@@ -145,7 +145,7 @@ - // Single line comment - index := strings.Index(sql, "\n") - if index == -1 { -- return "" -+ return sql - } - sql = sql[index+1:] - } -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/comments_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//comments_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/comments_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//comments_test.go 2018-06-06 07:45:08.000000000 -0700 -@@ -187,7 +187,7 @@ - outSQL: "bar", - }, { - input: "-- /* foo */ bar", -- outSQL: "", -+ outSQL: "-- /* foo */ bar", - }, { - input: "foo -- bar */", - outSQL: "foo -- bar */", -@@ -201,7 +201,7 @@ - outSQL: "a", - }, { - input: `-- foo bar`, -- outSQL: "", -+ outSQL: "-- foo bar", - }} - for _, testCase := range testCases { - gotSQL := StripLeadingComments(testCase.input) -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: dependency -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/encodable.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//encodable.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/encodable.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//encodable.go 2017-10-18 18:06:33.000000000 -0700 -@@ -19,7 +19,7 @@ - import ( - "bytes" - -- "vitess.io/vitess/go/sqltypes" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - // This file contains types that are 'Encodable'. -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/encodable_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//encodable_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/encodable_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//encodable_test.go 2017-10-18 18:06:33.000000000 -0700 -@@ -20,7 +20,7 @@ - "bytes" - "testing" - -- "vitess.io/vitess/go/sqltypes" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - func TestEncodable(t *testing.T) { -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: github_test.go -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/normalizer.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//normalizer.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/normalizer.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//normalizer.go 2017-10-18 18:06:33.000000000 -0700 -@@ -19,9 +19,9 @@ - import ( - "fmt" - -- "vitess.io/vitess/go/sqltypes" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - // Normalize changes the statement to use bind values, and -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/normalizer_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//normalizer_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/normalizer_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//normalizer_test.go 2017-11-27 22:10:51.000000000 -0800 -@@ -21,8 +21,8 @@ - "reflect" - "testing" - -- "vitess.io/vitess/go/sqltypes" -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - func TestNormalize(t *testing.T) { -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/parsed_query.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//parsed_query.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/parsed_query.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//parsed_query.go 2017-10-22 13:30:37.000000000 -0700 -@@ -18,12 +18,10 @@ - - import ( - "bytes" -- "encoding/json" - "fmt" - -- "vitess.io/vitess/go/sqltypes" -- -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - // ParsedQuery represents a parsed query where -@@ -71,12 +69,6 @@ - return buf.Bytes(), nil - } - --// MarshalJSON is a custom JSON marshaler for ParsedQuery. --// Note that any queries longer that 512 bytes will be truncated. --func (pq *ParsedQuery) MarshalJSON() ([]byte, error) { -- return json.Marshal(TruncateForUI(pq.Query)) --} -- - // EncodeValue encodes one bind variable value into the query. - func EncodeValue(buf *bytes.Buffer, value *querypb.BindVariable) { - if value.Type != querypb.Type_TUPLE { -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/parsed_query_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//parsed_query_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/parsed_query_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//parsed_query_test.go 2017-10-18 18:06:33.000000000 -0700 -@@ -20,9 +20,9 @@ - "reflect" - "testing" - -- "vitess.io/vitess/go/sqltypes" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - func TestNewParsedQuery(t *testing.T) { -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: patches -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: quick -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/redact_query.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//redact_query.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/redact_query.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//redact_query.go 2018-06-06 07:42:56.000000000 -0700 -@@ -1,6 +1,6 @@ - package sqlparser - --import querypb "vitess.io/vitess/go/vt/proto/query" -+import querypb "github.com/xwb1989/sqlparser/dependency/querypb" - - // RedactSQLQuery returns a sql string with the params stripped out for display - func RedactSQLQuery(sql string) (string, error) { -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: tests -diff -u /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/token.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//token.go ---- /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/token.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//token.go 2018-06-06 07:45:09.000000000 -0700 -@@ -22,8 +22,8 @@ - "fmt" - "io" - -- "vitess.io/vitess/go/bytes2" -- "vitess.io/vitess/go/sqltypes" -+ "github.com/xwb1989/sqlparser/dependency/bytes2" -+ "github.com/xwb1989/sqlparser/dependency/sqltypes" - ) - - const ( -Only in /Users/bramp/go/src/vitess.io/vitess/go//vt/sqlparser/: truncate_query.go -Only in /Users/bramp/go/src/github.com/xwb1989/sqlparser//: y.output diff --git a/patches/sqltypes.patch b/patches/sqltypes.patch deleted file mode 100644 index 215ba9d..0000000 --- a/patches/sqltypes.patch +++ /dev/null @@ -1,290 +0,0 @@ -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: arithmetic.go -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: arithmetic_test.go -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/bind_variables.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/bind_variables.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/bind_variables.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/bind_variables.go 2018-06-04 08:05:24.000000000 -0700 -@@ -19,11 +19,10 @@ - import ( - "errors" - "fmt" -+ "reflect" - "strconv" - -- "github.com/golang/protobuf/proto" -- -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - // NullBindVariable is a bindvar with NULL value. -@@ -253,9 +252,8 @@ - } - - // BindVariablesEqual compares two maps of bind variables. --// For protobuf messages we have to use "proto.Equal". - func BindVariablesEqual(x, y map[string]*querypb.BindVariable) bool { -- return proto.Equal(&querypb.BoundQuery{BindVariables: x}, &querypb.BoundQuery{BindVariables: y}) -+ return reflect.DeepEqual(&querypb.BoundQuery{BindVariables: x}, &querypb.BoundQuery{BindVariables: y}) - } - - // CopyBindVariables returns a shallow-copy of the given bindVariables map. -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/bind_variables_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/bind_variables_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/bind_variables_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/bind_variables_test.go 2018-06-04 08:05:24.000000000 -0700 -@@ -21,16 +21,14 @@ - "strings" - "testing" - -- "github.com/golang/protobuf/proto" -- -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - func TestProtoConversions(t *testing.T) { - v := TestValue(Int64, "1") - got := ValueToProto(v) - want := &querypb.Value{Type: Int64, Value: []byte("1")} -- if !proto.Equal(got, want) { -+ if !reflect.DeepEqual(got, want) { - t.Errorf("ValueToProto: %v, want %v", got, want) - } - gotback := ProtoToValue(got) -@@ -240,7 +238,7 @@ - t.Errorf("ToBindVar(%T(%v)) error: nil, want %s", tcase.in, tcase.in, tcase.err) - continue - } -- if !proto.Equal(bv, tcase.out) { -+ if !reflect.DeepEqual(bv, tcase.out) { - t.Errorf("ToBindVar(%T(%v)): %v, want %s", tcase.in, tcase.in, bv, tcase.out) - } - } -@@ -523,7 +521,7 @@ - v, err = BindVariableToValue(&querypb.BindVariable{Type: querypb.Type_TUPLE}) - wantErr := "cannot convert a TUPLE bind var into a value" - if err == nil || err.Error() != wantErr { -- t.Errorf(" BindVarToValue(TUPLE): (%v, %v), want %s", v, err, wantErr) -+ t.Errorf(" BindVarToValue(TUPLE): %v, want %s", err, wantErr) - } - } - -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: event_token.go -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: event_token_test.go -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/plan_value.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/plan_value.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/plan_value.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/plan_value.go 2018-06-04 08:05:24.000000000 -0700 -@@ -18,10 +18,10 @@ - - import ( - "encoding/json" -+ "errors" -+ "fmt" - -- querypb "vitess.io/vitess/go/vt/proto/query" -- vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" -- "vitess.io/vitess/go/vt/vterrors" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - // PlanValue represents a value or a list of values for -@@ -87,7 +87,7 @@ - case pv.ListKey != "" || pv.Values != nil: - // This code is unreachable because the parser does not allow - // multi-value constructs where a single value is expected. -- return NULL, vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "a list was supplied where a single value was expected") -+ return NULL, errors.New("a list was supplied where a single value was expected") - } - return NULL, nil - } -@@ -95,10 +95,10 @@ - func (pv PlanValue) lookupValue(bindVars map[string]*querypb.BindVariable) (*querypb.BindVariable, error) { - bv, ok := bindVars[pv.Key] - if !ok { -- return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "missing bind var %s", pv.Key) -+ return nil, fmt.Errorf("missing bind var %s", pv.Key) - } - if bv.Type == querypb.Type_TUPLE { -- return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "TUPLE was supplied for single value bind var %s", pv.ListKey) -+ return nil, fmt.Errorf("TUPLE was supplied for single value bind var %s", pv.ListKey) - } - return bv, nil - } -@@ -129,16 +129,16 @@ - } - // This code is unreachable because the parser does not allow - // single value constructs where multiple values are expected. -- return nil, vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "a single value was supplied where a list was expected") -+ return nil, errors.New("a single value was supplied where a list was expected") - } - - func (pv PlanValue) lookupList(bindVars map[string]*querypb.BindVariable) (*querypb.BindVariable, error) { - bv, ok := bindVars[pv.ListKey] - if !ok { -- return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "missing bind var %s", pv.ListKey) -+ return nil, fmt.Errorf("missing bind var %s", pv.ListKey) - } - if bv.Type != querypb.Type_TUPLE { -- return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "single value was supplied for TUPLE bind var %s", pv.ListKey) -+ return nil, fmt.Errorf("single value was supplied for TUPLE bind var %s", pv.ListKey) - } - return bv, nil - } -@@ -171,7 +171,7 @@ - case l: - return nil - default: -- return vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "mismatch in number of column values") -+ return errors.New("mismatch in number of column values") - } - } - -@@ -221,7 +221,7 @@ - rows[i] = make([]Value, len(pvs)) - } - -- // Using j because we're resolving by columns. -+ // Using j becasue we're resolving by columns. - for j, pv := range pvs { - switch { - case pv.Key != "": -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/plan_value_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/plan_value_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/plan_value_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/plan_value_test.go 2018-06-04 08:05:24.000000000 -0700 -@@ -21,7 +21,7 @@ - "strings" - "testing" - -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - func TestPlanValueIsNull(t *testing.T) { -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: proto3.go -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: proto3_test.go -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: query_response.go -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: result.go -Only in /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/: result_test.go -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/testing.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/testing.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/testing.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/testing.go 2018-06-04 08:06:27.000000000 -0700 -@@ -17,17 +17,14 @@ - package sqltypes - - import ( -- "bytes" -- "fmt" -- "strings" -- -- querypb "vitess.io/vitess/go/vt/proto/query" -+ querypb "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - // Functions in this file should only be used for testing. - // This is an experiment to see if test code bloat can be - // reduced and readability improved. - -+/* - // MakeTestFields builds a []*querypb.Field for testing. - // fields := sqltypes.MakeTestFields( - // "a|b", -@@ -110,6 +107,7 @@ - } - return results - } -+*/ - - // TestBindVariable makes a *querypb.BindVariable from - // an interface{}.It panics on invalid input. -@@ -131,6 +129,7 @@ - return MakeTrusted(typ, []byte(val)) - } - -+/* - // PrintResults prints []*Results into a string. - // This function should only be used for testing. - func PrintResults(results []*Result) string { -@@ -152,3 +151,4 @@ - } - return splits - } -+*/ -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/type.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/type.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/type.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/type.go 2018-06-04 08:05:24.000000000 -0700 -@@ -19,7 +19,7 @@ - import ( - "fmt" - -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - // This file provides wrappers and support -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/type_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/type_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/type_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/type_test.go 2018-06-04 08:05:24.000000000 -0700 -@@ -19,7 +19,7 @@ - import ( - "testing" - -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - func TestTypeValues(t *testing.T) { -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/value.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/value.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/value.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/value.go 2018-06-04 08:05:24.000000000 -0700 -@@ -23,10 +23,10 @@ - "fmt" - "strconv" - -- "vitess.io/vitess/go/bytes2" -- "vitess.io/vitess/go/hack" -+ "github.com/xwb1989/sqlparser/dependency/bytes2" -+ "github.com/xwb1989/sqlparser/dependency/hack" - -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - var ( -@@ -48,7 +48,7 @@ - } - - // Value can store any SQL value. If the value represents --// an integral type, the bytes are always stored as a canonical -+// an integral type, the bytes are always stored as a cannonical - // representation that matches how MySQL returns such values. - type Value struct { - typ querypb.Type -@@ -126,7 +126,7 @@ - return MakeTrusted(VarBinary, []byte(v)) - } - --// NewIntegral builds an integral type from a string representation. -+// NewIntegral builds an integral type from a string representaion. - // The type will be Int64 or Uint64. Int64 will be preferred where possible. - func NewIntegral(val string) (n Value, err error) { - signed, err := strconv.ParseInt(val, 0, 64) -@@ -169,7 +169,7 @@ - return v.typ - } - --// Raw returns the internal representation of the value. For newer types, -+// Raw returns the internal represenation of the value. For newer types, - // this may not match MySQL's representation. - func (v Value) Raw() []byte { - return v.val -diff -u /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/value_test.go /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/value_test.go ---- /Users/bramp/go/src/vitess.io/vitess/go//sqltypes/value_test.go 2018-06-05 08:45:47.000000000 -0700 -+++ /Users/bramp/go/src/github.com/xwb1989/sqlparser//dependency/sqltypes/value_test.go 2018-06-04 08:05:24.000000000 -0700 -@@ -22,7 +22,7 @@ - "strings" - "testing" - -- querypb "vitess.io/vitess/go/vt/proto/query" -+ "github.com/xwb1989/sqlparser/dependency/querypb" - ) - - const ( diff --git a/redact_query.go b/redact_query.go index a50b9bc..6f5d431 100644 --- a/redact_query.go +++ b/redact_query.go @@ -1,6 +1,6 @@ package sqlparser -import querypb "github.com/xwb1989/sqlparser/dependency/querypb" +import querypb "github.com/CovenantSQL/sqlparser/dependency/querypb" // RedactSQLQuery returns a sql string with the params stripped out for display func RedactSQLQuery(sql string) (string, error) { diff --git a/sql.go b/sql.go index 4c8f265..663f85a 100644 --- a/sql.go +++ b/sql.go @@ -1,9 +1,12 @@ -//line sql.y:18 +// Code generated by goyacc -o sql.go sql.y. DO NOT EDIT. + +//line sql.y:19 package sqlparser import __yyfmt__ "fmt" -//line sql.y:18 +//line sql.y:19 + func setParseTree(yylex interface{}, stmt Statement) { yylex.(*Tokenizer).ParseTree = stmt } @@ -35,7 +38,7 @@ func forceEOF(yylex interface{}) { yylex.(*Tokenizer).ForceEOF = true } -//line sql.y:53 +//line sql.y:54 type yySymType struct { yys int empty struct{} @@ -51,14 +54,11 @@ type yySymType struct { selectExprs SelectExprs selectExpr SelectExpr columns Columns - partitions Partitions colName *ColName tableExprs TableExprs tableExpr TableExpr joinCondition JoinCondition tableName TableName - tableNames TableNames - indexHints *IndexHints expr Expr exprs Exprs boolVal BoolVal @@ -87,247 +87,146 @@ type yySymType struct { columnDefinition *ColumnDefinition indexDefinition *IndexDefinition indexInfo *IndexInfo - indexOption *IndexOption - indexOptions []*IndexOption indexColumn *IndexColumn indexColumns []*IndexColumn - partDefs []*PartitionDefinition - partDef *PartitionDefinition - partSpec *PartitionSpec - vindexParam VindexParam - vindexParams []VindexParam - showFilter *ShowFilter } const LEX_ERROR = 57346 const UNION = 57347 const SELECT = 57348 -const STREAM = 57349 -const INSERT = 57350 -const UPDATE = 57351 -const DELETE = 57352 -const FROM = 57353 -const WHERE = 57354 -const GROUP = 57355 -const HAVING = 57356 -const ORDER = 57357 -const BY = 57358 -const LIMIT = 57359 -const OFFSET = 57360 -const FOR = 57361 -const ALL = 57362 -const DISTINCT = 57363 -const AS = 57364 -const EXISTS = 57365 -const ASC = 57366 -const DESC = 57367 -const INTO = 57368 -const DUPLICATE = 57369 -const KEY = 57370 -const DEFAULT = 57371 -const SET = 57372 -const LOCK = 57373 -const KEYS = 57374 -const VALUES = 57375 -const LAST_INSERT_ID = 57376 -const NEXT = 57377 -const VALUE = 57378 -const SHARE = 57379 -const MODE = 57380 -const SQL_NO_CACHE = 57381 -const SQL_CACHE = 57382 -const JOIN = 57383 -const STRAIGHT_JOIN = 57384 -const LEFT = 57385 -const RIGHT = 57386 -const INNER = 57387 -const OUTER = 57388 -const CROSS = 57389 -const NATURAL = 57390 -const USE = 57391 -const FORCE = 57392 -const ON = 57393 -const USING = 57394 -const ID = 57395 -const HEX = 57396 -const STRING = 57397 -const INTEGRAL = 57398 -const FLOAT = 57399 -const HEXNUM = 57400 -const VALUE_ARG = 57401 -const LIST_ARG = 57402 -const COMMENT = 57403 -const COMMENT_KEYWORD = 57404 -const BIT_LITERAL = 57405 -const NULL = 57406 -const TRUE = 57407 -const FALSE = 57408 -const OR = 57409 -const AND = 57410 -const NOT = 57411 -const BETWEEN = 57412 -const CASE = 57413 -const WHEN = 57414 -const THEN = 57415 -const ELSE = 57416 -const END = 57417 -const LE = 57418 -const GE = 57419 -const NE = 57420 -const NULL_SAFE_EQUAL = 57421 -const IS = 57422 -const LIKE = 57423 -const REGEXP = 57424 -const IN = 57425 -const SHIFT_LEFT = 57426 -const SHIFT_RIGHT = 57427 -const DIV = 57428 -const MOD = 57429 -const UNARY = 57430 -const COLLATE = 57431 -const BINARY = 57432 -const UNDERSCORE_BINARY = 57433 -const INTERVAL = 57434 -const JSON_EXTRACT_OP = 57435 -const JSON_UNQUOTE_EXTRACT_OP = 57436 -const CREATE = 57437 -const ALTER = 57438 -const DROP = 57439 -const RENAME = 57440 -const ANALYZE = 57441 -const ADD = 57442 -const SCHEMA = 57443 -const TABLE = 57444 -const INDEX = 57445 -const VIEW = 57446 -const TO = 57447 -const IGNORE = 57448 -const IF = 57449 -const UNIQUE = 57450 -const PRIMARY = 57451 -const COLUMN = 57452 -const CONSTRAINT = 57453 -const SPATIAL = 57454 -const FULLTEXT = 57455 -const FOREIGN = 57456 -const KEY_BLOCK_SIZE = 57457 -const SHOW = 57458 -const DESCRIBE = 57459 -const EXPLAIN = 57460 -const DATE = 57461 -const ESCAPE = 57462 -const REPAIR = 57463 -const OPTIMIZE = 57464 -const TRUNCATE = 57465 -const MAXVALUE = 57466 -const PARTITION = 57467 -const REORGANIZE = 57468 -const LESS = 57469 -const THAN = 57470 -const PROCEDURE = 57471 -const TRIGGER = 57472 -const VINDEX = 57473 -const VINDEXES = 57474 -const STATUS = 57475 -const VARIABLES = 57476 -const BEGIN = 57477 -const START = 57478 -const TRANSACTION = 57479 -const COMMIT = 57480 -const ROLLBACK = 57481 -const BIT = 57482 -const TINYINT = 57483 -const SMALLINT = 57484 -const MEDIUMINT = 57485 -const INT = 57486 -const INTEGER = 57487 -const BIGINT = 57488 -const INTNUM = 57489 -const REAL = 57490 -const DOUBLE = 57491 -const FLOAT_TYPE = 57492 -const DECIMAL = 57493 -const NUMERIC = 57494 -const TIME = 57495 -const TIMESTAMP = 57496 -const DATETIME = 57497 -const YEAR = 57498 -const CHAR = 57499 -const VARCHAR = 57500 -const BOOL = 57501 -const CHARACTER = 57502 -const VARBINARY = 57503 -const NCHAR = 57504 -const TEXT = 57505 -const TINYTEXT = 57506 -const MEDIUMTEXT = 57507 -const LONGTEXT = 57508 -const BLOB = 57509 -const TINYBLOB = 57510 -const MEDIUMBLOB = 57511 -const LONGBLOB = 57512 -const JSON = 57513 -const ENUM = 57514 -const GEOMETRY = 57515 -const POINT = 57516 -const LINESTRING = 57517 -const POLYGON = 57518 -const GEOMETRYCOLLECTION = 57519 -const MULTIPOINT = 57520 -const MULTILINESTRING = 57521 -const MULTIPOLYGON = 57522 -const NULLX = 57523 -const AUTO_INCREMENT = 57524 -const APPROXNUM = 57525 -const SIGNED = 57526 -const UNSIGNED = 57527 -const ZEROFILL = 57528 -const DATABASES = 57529 -const TABLES = 57530 -const VITESS_KEYSPACES = 57531 -const VITESS_SHARDS = 57532 -const VITESS_TABLETS = 57533 -const VSCHEMA_TABLES = 57534 -const EXTENDED = 57535 -const FULL = 57536 -const PROCESSLIST = 57537 -const NAMES = 57538 -const CHARSET = 57539 -const GLOBAL = 57540 -const SESSION = 57541 -const ISOLATION = 57542 -const LEVEL = 57543 -const READ = 57544 -const WRITE = 57545 -const ONLY = 57546 -const REPEATABLE = 57547 -const COMMITTED = 57548 -const UNCOMMITTED = 57549 -const SERIALIZABLE = 57550 -const CURRENT_TIMESTAMP = 57551 -const DATABASE = 57552 -const CURRENT_DATE = 57553 -const CURRENT_TIME = 57554 -const LOCALTIME = 57555 -const LOCALTIMESTAMP = 57556 -const UTC_DATE = 57557 -const UTC_TIME = 57558 -const UTC_TIMESTAMP = 57559 -const REPLACE = 57560 -const CONVERT = 57561 -const CAST = 57562 -const SUBSTR = 57563 -const SUBSTRING = 57564 -const GROUP_CONCAT = 57565 -const SEPARATOR = 57566 -const MATCH = 57567 -const AGAINST = 57568 -const BOOLEAN = 57569 -const LANGUAGE = 57570 -const WITH = 57571 -const QUERY = 57572 -const EXPANSION = 57573 -const UNUSED = 57574 +const INSERT = 57349 +const UPDATE = 57350 +const DELETE = 57351 +const FROM = 57352 +const WHERE = 57353 +const GROUP = 57354 +const HAVING = 57355 +const ORDER = 57356 +const BY = 57357 +const LIMIT = 57358 +const OFFSET = 57359 +const ALL = 57360 +const DISTINCT = 57361 +const AS = 57362 +const EXISTS = 57363 +const ASC = 57364 +const DESC = 57365 +const INTO = 57366 +const KEY = 57367 +const DEFAULT = 57368 +const SET = 57369 +const VALUES = 57370 +const LAST_INSERT_ID = 57371 +const JOIN = 57372 +const LEFT = 57373 +const RIGHT = 57374 +const INNER = 57375 +const OUTER = 57376 +const CROSS = 57377 +const NATURAL = 57378 +const ON = 57379 +const USING = 57380 +const ID = 57381 +const HEX = 57382 +const STRING = 57383 +const INTEGRAL = 57384 +const FLOAT = 57385 +const HEXNUM = 57386 +const VALUE_ARG = 57387 +const POS_ARG = 57388 +const LIST_ARG = 57389 +const COMMENT = 57390 +const NULL = 57391 +const TRUE = 57392 +const FALSE = 57393 +const FULL = 57394 +const COLUMNS = 57395 +const OR = 57396 +const AND = 57397 +const NOT = 57398 +const BETWEEN = 57399 +const CASE = 57400 +const WHEN = 57401 +const THEN = 57402 +const ELSE = 57403 +const END = 57404 +const LE = 57405 +const GE = 57406 +const NE = 57407 +const IS = 57408 +const LIKE = 57409 +const REGEXP = 57410 +const MATCH = 57411 +const IN = 57412 +const NULL_SAFE_NOTEQUAL = 57413 +const SHIFT_LEFT = 57414 +const SHIFT_RIGHT = 57415 +const DIV = 57416 +const MOD = 57417 +const UNARY = 57418 +const INTERVAL = 57419 +const CREATE = 57420 +const ALTER = 57421 +const DROP = 57422 +const RENAME = 57423 +const ADD = 57424 +const TABLE = 57425 +const VIRTUAL = 57426 +const INDEX = 57427 +const TO = 57428 +const IGNORE = 57429 +const IF = 57430 +const UNIQUE = 57431 +const PRIMARY = 57432 +const COLUMN = 57433 +const CONSTRAINT = 57434 +const FOREIGN = 57435 +const SHOW = 57436 +const DESCRIBE = 57437 +const DATE = 57438 +const ESCAPE = 57439 +const EXPLAIN = 57440 +const TINYINT = 57441 +const SMALLINT = 57442 +const MEDIUMINT = 57443 +const INT = 57444 +const INTEGER = 57445 +const BIGINT = 57446 +const INTNUM = 57447 +const REAL = 57448 +const DOUBLE = 57449 +const FLOAT_TYPE = 57450 +const DECIMAL = 57451 +const NUMERIC = 57452 +const TIME = 57453 +const TIMESTAMP = 57454 +const DATETIME = 57455 +const YEAR = 57456 +const CHAR = 57457 +const VARCHAR = 57458 +const BOOL = 57459 +const NCHAR = 57460 +const TEXT = 57461 +const TINYTEXT = 57462 +const MEDIUMTEXT = 57463 +const LONGTEXT = 57464 +const BLOB = 57465 +const TINYBLOB = 57466 +const MEDIUMBLOB = 57467 +const LONGBLOB = 57468 +const AUTO_INCREMENT = 57469 +const SIGNED = 57470 +const UNSIGNED = 57471 +const ZEROFILL = 57472 +const TABLES = 57473 +const CURRENT_TIMESTAMP = 57474 +const CURRENT_DATE = 57475 +const CURRENT_TIME = 57476 +const REPLACE = 57477 +const CAST = 57478 +const GROUP_CONCAT = 57479 +const SEPARATOR = 57480 +const UNUSED = 57481 var yyToknames = [...]string{ "$end", @@ -336,7 +235,6 @@ var yyToknames = [...]string{ "LEX_ERROR", "UNION", "SELECT", - "STREAM", "INSERT", "UPDATE", "DELETE", @@ -348,7 +246,6 @@ var yyToknames = [...]string{ "BY", "LIMIT", "OFFSET", - "FOR", "ALL", "DISTINCT", "AS", @@ -356,30 +253,18 @@ var yyToknames = [...]string{ "ASC", "DESC", "INTO", - "DUPLICATE", "KEY", "DEFAULT", "SET", - "LOCK", - "KEYS", "VALUES", "LAST_INSERT_ID", - "NEXT", - "VALUE", - "SHARE", - "MODE", - "SQL_NO_CACHE", - "SQL_CACHE", "JOIN", - "STRAIGHT_JOIN", "LEFT", "RIGHT", "INNER", "OUTER", "CROSS", "NATURAL", - "USE", - "FORCE", "ON", "USING", "'('", @@ -392,13 +277,14 @@ var yyToknames = [...]string{ "FLOAT", "HEXNUM", "VALUE_ARG", + "POS_ARG", "LIST_ARG", "COMMENT", - "COMMENT_KEYWORD", - "BIT_LITERAL", "NULL", "TRUE", "FALSE", + "FULL", + "COLUMNS", "OR", "AND", "NOT", @@ -415,11 +301,12 @@ var yyToknames = [...]string{ "LE", "GE", "NE", - "NULL_SAFE_EQUAL", "IS", "LIKE", "REGEXP", + "MATCH", "IN", + "NULL_SAFE_NOTEQUAL", "'|'", "'&'", "SHIFT_LEFT", @@ -434,23 +321,16 @@ var yyToknames = [...]string{ "'^'", "'~'", "UNARY", - "COLLATE", - "BINARY", - "UNDERSCORE_BINARY", "INTERVAL", "'.'", - "JSON_EXTRACT_OP", - "JSON_UNQUOTE_EXTRACT_OP", "CREATE", "ALTER", "DROP", "RENAME", - "ANALYZE", "ADD", - "SCHEMA", "TABLE", + "VIRTUAL", "INDEX", - "VIEW", "TO", "IGNORE", "IF", @@ -458,35 +338,12 @@ var yyToknames = [...]string{ "PRIMARY", "COLUMN", "CONSTRAINT", - "SPATIAL", - "FULLTEXT", "FOREIGN", - "KEY_BLOCK_SIZE", "SHOW", "DESCRIBE", - "EXPLAIN", "DATE", "ESCAPE", - "REPAIR", - "OPTIMIZE", - "TRUNCATE", - "MAXVALUE", - "PARTITION", - "REORGANIZE", - "LESS", - "THAN", - "PROCEDURE", - "TRIGGER", - "VINDEX", - "VINDEXES", - "STATUS", - "VARIABLES", - "BEGIN", - "START", - "TRANSACTION", - "COMMIT", - "ROLLBACK", - "BIT", + "EXPLAIN", "TINYINT", "SMALLINT", "MEDIUMINT", @@ -506,8 +363,6 @@ var yyToknames = [...]string{ "CHAR", "VARCHAR", "BOOL", - "CHARACTER", - "VARBINARY", "NCHAR", "TEXT", "TINYTEXT", @@ -517,67 +372,18 @@ var yyToknames = [...]string{ "TINYBLOB", "MEDIUMBLOB", "LONGBLOB", - "JSON", - "ENUM", - "GEOMETRY", - "POINT", - "LINESTRING", - "POLYGON", - "GEOMETRYCOLLECTION", - "MULTIPOINT", - "MULTILINESTRING", - "MULTIPOLYGON", - "NULLX", "AUTO_INCREMENT", - "APPROXNUM", "SIGNED", "UNSIGNED", "ZEROFILL", - "DATABASES", "TABLES", - "VITESS_KEYSPACES", - "VITESS_SHARDS", - "VITESS_TABLETS", - "VSCHEMA_TABLES", - "EXTENDED", - "FULL", - "PROCESSLIST", - "NAMES", - "CHARSET", - "GLOBAL", - "SESSION", - "ISOLATION", - "LEVEL", - "READ", - "WRITE", - "ONLY", - "REPEATABLE", - "COMMITTED", - "UNCOMMITTED", - "SERIALIZABLE", "CURRENT_TIMESTAMP", - "DATABASE", "CURRENT_DATE", "CURRENT_TIME", - "LOCALTIME", - "LOCALTIMESTAMP", - "UTC_DATE", - "UTC_TIME", - "UTC_TIMESTAMP", "REPLACE", - "CONVERT", "CAST", - "SUBSTR", - "SUBSTRING", "GROUP_CONCAT", "SEPARATOR", - "MATCH", - "AGAINST", - "BOOLEAN", - "LANGUAGE", - "WITH", - "QUERY", - "EXPANSION", "UNUSED", "';'", } @@ -593,1461 +399,680 @@ var yyExca = [...]int{ 1, -1, -2, 0, -1, 3, - 5, 27, + 5, 17, -2, 4, - -1, 36, - 150, 263, - 151, 263, - -2, 253, - -1, 238, - 109, 587, - -2, 583, - -1, 239, - 109, 588, - -2, 584, - -1, 308, - 80, 746, - -2, 58, - -1, 309, - 80, 707, - -2, 59, - -1, 314, - 80, 691, - -2, 549, - -1, 316, - 80, 728, - -2, 551, - -1, 575, - 52, 41, - 54, 41, - -2, 43, - -1, 708, - 109, 590, - -2, 586, - -1, 912, - 5, 28, - -2, 395, - -1, 937, - 5, 27, - -2, 524, - -1, 1161, - 5, 28, - -2, 525, - -1, 1205, - 5, 27, - -2, 527, - -1, 1267, - 5, 28, - -2, 528, + -1, 119, + 1, 158, + 5, 158, + 11, 158, + 12, 158, + 13, 158, + 14, 158, + 16, 158, + 27, 158, + 30, 158, + 31, 158, + 33, 158, + 35, 158, + 36, 158, + 37, 158, + 38, 158, + 40, 158, + 41, 158, + 157, 158, + -2, 171, + -1, 190, + 94, 359, + -2, 355, + -1, 191, + 94, 360, + -2, 356, + -1, 409, + 5, 17, + -2, 328, + -1, 417, + 94, 177, + -2, 151, + -1, 527, + 94, 362, + -2, 358, + -1, 559, + 5, 18, + -2, 229, + -1, 617, + 5, 18, + -2, 329, + -1, 681, + 5, 17, + -2, 331, + -1, 742, + 5, 18, + -2, 332, } const yyPrivate = 57344 -const yyLast = 10949 +const yyLast = 4330 var yyAct = [...]int{ - 269, 47, 770, 854, 1258, 522, 646, 1069, 1216, 1097, - 810, 1070, 268, 521, 3, 243, 1167, 834, 998, 788, - 806, 217, 569, 1066, 809, 53, 848, 771, 956, 1043, - 743, 567, 313, 904, 989, 945, 211, 410, 585, 710, - 455, 940, 733, 1001, 820, 740, 461, 584, 47, 844, - 307, 556, 571, 767, 294, 759, 222, 467, 475, 886, - 241, 216, 299, 226, 52, 304, 1287, 1277, 1285, 1265, - 302, 1283, 855, 442, 1276, 1061, 1155, 414, 435, 1225, - 212, 213, 214, 215, 295, 871, 1103, 1104, 1105, 1091, - 230, 1092, 1093, 293, 1108, 1106, 586, 1264, 587, 870, - 181, 177, 178, 179, 57, 536, 1240, 488, 487, 497, - 498, 490, 491, 492, 493, 494, 495, 496, 489, 964, - 801, 499, 963, 802, 803, 965, 875, 245, 450, 59, - 60, 61, 62, 63, 980, 869, 827, 310, 675, 1179, - 423, 437, 1194, 439, 835, 676, 1144, 1142, 210, 1284, - 232, 446, 447, 1282, 1259, 1022, 768, 424, 417, 1217, - 1044, 1223, 174, 175, 175, 822, 654, 239, 436, 438, - 420, 645, 1219, 822, 789, 791, 955, 954, 953, 412, - 189, 176, 1245, 866, 863, 864, 1164, 862, 1030, 298, - 1046, 511, 512, 974, 441, 441, 441, 441, 76, 441, - 920, 1019, 186, 898, 682, 186, 441, 1021, 479, 180, - 430, 1112, 873, 876, 489, 807, 822, 499, 499, 881, - 679, 1026, 1048, 47, 1052, 742, 1047, 472, 1045, 186, - 186, 76, 1009, 1050, 474, 186, 464, 76, 508, 1218, - 1250, 510, 1049, 474, 411, 1122, 463, 868, 790, 434, - 473, 472, 943, 588, 1107, 1051, 1053, 821, 1224, 1222, - 1007, 1113, 1241, 835, 828, 821, 1063, 474, 520, 867, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 760, - 535, 537, 537, 537, 537, 537, 537, 537, 537, 545, - 546, 547, 548, 1263, 760, 649, 927, 1025, 882, 1020, - 568, 1018, 685, 686, 1253, 978, 872, 469, 821, 416, - 1009, 717, 236, 819, 817, 1269, 1185, 818, 1184, 874, - 426, 427, 428, 453, 1008, 715, 716, 714, 465, 1013, - 1010, 1003, 1004, 1011, 1006, 1005, 993, 50, 1007, 992, - 824, 916, 186, 915, 186, 825, 1012, 713, 473, 472, - 186, 981, 1015, 700, 702, 703, 917, 186, 701, 473, - 472, 76, 76, 76, 76, 474, 76, 173, 509, 458, - 462, 582, 576, 76, 1270, 1251, 474, 473, 472, 310, - 1201, 418, 419, 734, 1065, 735, 480, 538, 539, 540, - 541, 542, 543, 544, 474, 895, 896, 897, 1182, 1130, - 76, 990, 1008, 1248, 473, 472, 1100, 1013, 1010, 1003, - 1004, 1011, 1006, 1005, 441, 1273, 454, 1209, 1256, 454, - 523, 474, 441, 1099, 1012, 1209, 454, 298, 292, 534, - 1002, 1209, 1210, 441, 441, 441, 441, 441, 441, 441, - 441, 1176, 1175, 1088, 454, 1163, 454, 441, 441, 487, - 497, 498, 490, 491, 492, 493, 494, 495, 496, 489, - 186, 1229, 499, 663, 1119, 1118, 267, 186, 186, 186, - 1115, 1116, 1228, 76, 1115, 1114, 1151, 454, 1109, 76, - 910, 454, 50, 975, 966, 687, 857, 553, 454, 941, - 661, 745, 454, 21, 736, 711, 660, 74, 497, 498, - 490, 491, 492, 493, 494, 495, 496, 489, 659, 650, - 499, 47, 708, 488, 487, 497, 498, 490, 491, 492, - 493, 494, 495, 496, 489, 524, 648, 499, 643, 689, - 312, 595, 594, 942, 432, 704, 415, 425, 747, 706, - 411, 1067, 579, 681, 941, 752, 755, 54, 745, 221, - 23, 761, 1159, 707, 299, 299, 299, 299, 299, 513, - 514, 515, 516, 517, 518, 519, 23, 553, 772, 568, - 1121, 792, 737, 738, 935, 553, 942, 936, 299, 680, - 1117, 76, 747, 580, 967, 578, 910, 186, 186, 76, - 757, 186, 764, 1204, 186, 473, 472, 50, 186, 23, - 76, 76, 76, 76, 76, 76, 76, 76, 773, 796, - 712, 776, 474, 50, 76, 76, 785, 552, 941, 186, - 795, 1033, 578, 697, 698, 793, 836, 837, 838, 794, - 922, 799, 798, 814, 76, 800, 910, 919, 186, 774, - 775, 553, 777, 581, 76, 683, 50, 1189, 829, 441, - 849, 441, 1082, 223, 970, 310, 946, 947, 647, 441, - 312, 312, 312, 312, 910, 312, 845, 840, 811, 850, - 839, 65, 312, 921, 852, 523, 1102, 952, 750, 751, - 918, 298, 298, 298, 298, 298, 1067, 76, 994, 846, - 847, 558, 561, 562, 563, 559, 298, 560, 564, 477, - 50, 946, 947, 949, 657, 298, 451, 695, 899, 492, - 493, 494, 495, 496, 489, 708, 951, 499, 186, 779, - 778, 186, 186, 186, 186, 186, 782, 711, 888, 780, - 887, 783, 883, 186, 781, 784, 186, 562, 563, 805, - 186, 227, 228, 1281, 1275, 186, 186, 1029, 1280, 76, - 468, 748, 749, 893, 900, 892, 707, 756, 456, 1157, - 985, 593, 76, 433, 466, 977, 1255, 1190, 938, 939, - 457, 763, 312, 765, 766, 1254, 1202, 971, 590, 859, - 656, 937, 258, 257, 260, 261, 262, 263, 688, 566, - 468, 259, 264, 218, 709, 1234, 299, 718, 719, 720, - 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, - 731, 732, 950, 186, 926, 219, 76, 54, 76, 1233, - 968, 891, 186, 224, 225, 186, 76, 959, 1192, 890, - 942, 884, 885, 470, 462, 1242, 958, 1180, 960, 961, - 678, 56, 712, 58, 577, 744, 746, 51, 982, 983, - 1, 856, 997, 865, 441, 984, 1257, 986, 987, 988, - 1215, 762, 1096, 972, 973, 816, 808, 409, 830, 831, - 832, 833, 64, 1249, 815, 991, 1221, 1178, 823, 441, - 312, 979, 826, 811, 841, 842, 843, 1101, 312, 1252, - 976, 787, 600, 598, 599, 597, 911, 602, 1000, 312, - 312, 312, 312, 312, 312, 312, 312, 1014, 601, 596, - 197, 928, 305, 312, 312, 558, 561, 562, 563, 559, - 894, 560, 564, 298, 565, 589, 851, 471, 66, 999, - 1017, 1016, 861, 691, 1024, 1037, 674, 1072, 1068, 47, - 880, 1042, 449, 477, 199, 1036, 312, 1055, 507, 1071, - 1062, 772, 1073, 708, 1084, 1085, 1086, 772, 889, 1054, - 76, 962, 311, 186, 1074, 684, 1077, 909, 1076, 1078, - 460, 1232, 1035, 1191, 925, 533, 758, 76, 244, 699, - 1095, 256, 253, 924, 1089, 255, 739, 254, 690, 934, - 481, 242, 1094, 234, 1058, 297, 753, 753, 549, 557, - 555, 1090, 753, 1110, 1111, 490, 491, 492, 493, 494, - 495, 496, 489, 554, 948, 499, 944, 296, 1032, 753, - 76, 76, 1154, 76, 1239, 694, 25, 55, 901, 902, - 903, 229, 19, 18, 299, 17, 20, 16, 1123, 15, - 14, 811, 29, 811, 13, 12, 76, 11, 312, 186, - 186, 1125, 10, 9, 1128, 8, 7, 186, 6, 5, - 907, 312, 1153, 4, 908, 1133, 76, 220, 22, 2, - 0, 912, 913, 914, 1132, 1140, 0, 0, 1064, 0, - 923, 0, 0, 0, 0, 929, 0, 930, 931, 932, - 933, 0, 1158, 1079, 1080, 0, 0, 1081, 0, 1166, - 1083, 1169, 1170, 1171, 1035, 968, 76, 76, 0, 0, - 1172, 1174, 0, 0, 0, 312, 0, 312, 0, 0, - 0, 441, 0, 0, 0, 312, 0, 0, 0, 0, - 0, 0, 1181, 1188, 1183, 76, 0, 76, 76, 0, - 1187, 0, 0, 0, 0, 0, 0, 0, 0, 312, - 0, 0, 0, 0, 0, 0, 1193, 0, 0, 0, - 1072, 298, 186, 1206, 0, 0, 0, 0, 811, 0, - 76, 1203, 1071, 0, 0, 0, 1205, 1131, 0, 0, - 0, 0, 0, 76, 186, 0, 1220, 0, 0, 0, - 76, 1231, 1214, 0, 0, 999, 811, 0, 76, 0, - 0, 186, 1226, 0, 1227, 1072, 1230, 47, 0, 0, - 0, 0, 1243, 0, 0, 0, 1156, 1071, 1039, 1040, - 1244, 0, 0, 523, 1247, 0, 0, 0, 0, 0, - 0, 1056, 1057, 1041, 1059, 1060, 0, 0, 0, 459, - 1261, 0, 0, 0, 0, 1266, 0, 440, 0, 0, - 76, 0, 76, 76, 76, 186, 76, 0, 772, 957, - 0, 0, 76, 1271, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 184, 1278, 312, 209, 1279, 0, - 1087, 0, 0, 0, 0, 1286, 0, 0, 76, 76, - 76, 0, 0, 300, 0, 0, 0, 0, 0, 233, - 0, 184, 184, 0, 0, 0, 0, 184, 0, 1137, - 1138, 0, 1139, 0, 0, 1141, 0, 1143, 0, 995, - 312, 0, 312, 0, 0, 0, 0, 0, 183, 0, - 0, 76, 76, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 76, 312, 0, 0, 0, 0, - 0, 1135, 0, 0, 0, 0, 303, 76, 0, 0, - 1134, 413, 0, 1177, 0, 312, 0, 1136, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 76, 1145, 1146, - 1147, 0, 0, 1150, 1260, 523, 0, 312, 0, 0, - 0, 0, 0, 0, 0, 0, 1160, 1161, 1162, 195, - 1165, 0, 753, 0, 0, 1075, 957, 0, 753, 0, - 0, 0, 0, 76, 184, 0, 184, 0, 0, 0, - 0, 0, 184, 205, 0, 0, 0, 76, 0, 184, - 0, 0, 0, 0, 312, 0, 312, 1098, 0, 0, - 0, 0, 443, 444, 445, 0, 448, 0, 0, 0, - 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, - 0, 1195, 1196, 0, 1197, 1198, 1199, 0, 421, 1124, - 422, 0, 0, 190, 0, 0, 429, 0, 1200, 192, - 0, 0, 1126, 431, 0, 0, 198, 194, 0, 1129, - 0, 0, 0, 1211, 1212, 1213, 0, 312, 0, 0, - 488, 487, 497, 498, 490, 491, 492, 493, 494, 495, - 496, 489, 0, 196, 499, 0, 200, 0, 0, 1235, - 1236, 1237, 1238, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 184, 0, 0, 0, 0, 0, 0, 184, - 573, 184, 0, 0, 191, 0, 905, 0, 0, 1168, - 0, 1168, 1168, 1168, 0, 1173, 0, 0, 0, 0, - 0, 312, 0, 1262, 454, 0, 0, 0, 1267, 0, - 0, 193, 1152, 201, 202, 203, 204, 208, 1148, 454, - 0, 1272, 207, 206, 0, 0, 551, 312, 312, 312, - 0, 0, 0, 0, 0, 575, 0, 0, 0, 1288, - 488, 487, 497, 498, 490, 491, 492, 493, 494, 495, - 496, 489, 1290, 1291, 499, 488, 487, 497, 498, 490, - 491, 492, 493, 494, 495, 496, 489, 0, 0, 499, - 1207, 1208, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1098, 488, 487, 497, 498, 490, 491, - 492, 493, 494, 495, 496, 489, 1168, 0, 499, 184, - 184, 644, 0, 184, 0, 0, 184, 0, 0, 653, - 662, 0, 0, 0, 0, 0, 1246, 1038, 0, 0, - 664, 665, 666, 667, 668, 669, 670, 671, 0, 0, - 0, 184, 0, 0, 672, 673, 0, 488, 487, 497, - 498, 490, 491, 492, 493, 494, 495, 496, 489, 753, - 184, 499, 1268, 651, 652, 0, 0, 655, 0, 662, - 658, 0, 0, 0, 0, 0, 1274, 0, 0, 23, - 24, 48, 26, 27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 677, 0, 1149, 42, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, - 233, 0, 0, 0, 696, 233, 233, 0, 0, 754, - 754, 233, 37, 0, 0, 754, 50, 0, 0, 0, - 0, 0, 0, 0, 0, 233, 233, 233, 233, 0, - 184, 0, 754, 184, 184, 184, 184, 184, 0, 0, - 0, 0, 0, 0, 0, 786, 0, 0, 184, 0, - 0, 0, 573, 0, 0, 0, 0, 184, 184, 488, - 487, 497, 498, 490, 491, 492, 493, 494, 495, 496, - 489, 0, 0, 499, 0, 30, 31, 33, 32, 35, - 0, 0, 0, 0, 769, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 36, 43, 44, 0, - 0, 45, 46, 34, 0, 0, 0, 0, 0, 0, - 0, 0, 797, 0, 0, 38, 39, 0, 40, 41, - 0, 0, 0, 0, 0, 184, 617, 0, 0, 0, - 0, 483, 0, 486, 184, 0, 858, 184, 860, 500, - 501, 502, 503, 504, 505, 506, 879, 484, 485, 482, - 488, 487, 497, 498, 490, 491, 492, 493, 494, 495, - 496, 489, 662, 0, 499, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 233, 0, 0, 0, 0, 853, - 0, 0, 0, 906, 0, 0, 0, 0, 877, 0, - 0, 878, 0, 0, 0, 0, 0, 0, 49, 0, - 0, 0, 605, 488, 487, 497, 498, 490, 491, 492, - 493, 494, 495, 496, 489, 0, 0, 499, 0, 0, - 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 618, 0, 0, 0, 0, 233, 488, 487, - 497, 498, 490, 491, 492, 493, 494, 495, 496, 489, - 0, 0, 499, 631, 632, 633, 634, 635, 636, 637, - 0, 638, 639, 640, 641, 642, 619, 620, 621, 622, - 603, 604, 0, 0, 606, 184, 607, 608, 609, 610, - 611, 612, 613, 614, 615, 616, 623, 624, 625, 626, - 627, 628, 629, 630, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 996, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1027, 1028, 0, 0, 0, 1023, 0, 0, 184, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 754, 0, 0, 0, 0, - 0, 754, 0, 1031, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1120, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1127, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1186, 0, - 0, 398, 388, 0, 360, 400, 338, 352, 408, 353, - 354, 381, 324, 368, 125, 350, 0, 341, 319, 347, - 320, 339, 362, 93, 365, 337, 390, 371, 107, 406, - 109, 376, 0, 142, 118, 0, 0, 364, 392, 366, - 386, 359, 382, 329, 375, 401, 351, 379, 402, 0, - 0, 0, 75, 0, 812, 813, 0, 0, 0, 0, - 0, 86, 0, 378, 397, 349, 380, 318, 377, 0, - 322, 325, 407, 395, 344, 345, 969, 0, 0, 0, - 0, 0, 0, 363, 367, 383, 357, 0, 0, 0, - 0, 0, 0, 0, 0, 342, 0, 374, 0, 0, - 0, 326, 323, 0, 361, 0, 0, 0, 328, 0, - 343, 384, 754, 317, 387, 393, 358, 187, 396, 356, - 355, 399, 131, 0, 0, 145, 98, 97, 106, 391, - 340, 348, 89, 346, 137, 127, 157, 373, 128, 136, - 110, 149, 132, 156, 188, 164, 147, 163, 78, 146, - 155, 87, 139, 80, 153, 144, 116, 102, 103, 79, - 0, 135, 92, 96, 91, 124, 150, 151, 90, 171, - 83, 162, 82, 84, 161, 123, 148, 154, 117, 114, - 81, 152, 115, 113, 105, 94, 99, 129, 112, 130, - 100, 120, 119, 121, 0, 321, 0, 143, 159, 172, - 336, 394, 165, 166, 167, 168, 0, 0, 0, 122, - 85, 101, 140, 104, 111, 134, 170, 126, 138, 88, - 158, 141, 332, 335, 330, 331, 369, 370, 403, 404, - 405, 385, 327, 0, 333, 334, 0, 389, 372, 77, - 0, 108, 169, 133, 95, 160, 398, 388, 0, 360, - 400, 338, 352, 408, 353, 354, 381, 324, 368, 125, - 350, 0, 341, 319, 347, 320, 339, 362, 93, 365, - 337, 390, 371, 107, 406, 109, 376, 0, 142, 118, - 0, 0, 364, 392, 366, 386, 359, 382, 329, 375, - 401, 351, 379, 402, 0, 0, 0, 75, 0, 812, - 813, 0, 0, 0, 0, 0, 86, 0, 378, 397, - 349, 380, 318, 377, 0, 322, 325, 407, 395, 344, - 345, 0, 0, 0, 0, 0, 0, 0, 363, 367, - 383, 357, 0, 0, 0, 0, 0, 0, 0, 0, - 342, 0, 374, 0, 0, 0, 326, 323, 0, 361, - 0, 0, 0, 328, 0, 343, 384, 0, 317, 387, - 393, 358, 187, 396, 356, 355, 399, 131, 0, 0, - 145, 98, 97, 106, 391, 340, 348, 89, 346, 137, - 127, 157, 373, 128, 136, 110, 149, 132, 156, 188, - 164, 147, 163, 78, 146, 155, 87, 139, 80, 153, - 144, 116, 102, 103, 79, 0, 135, 92, 96, 91, - 124, 150, 151, 90, 171, 83, 162, 82, 84, 161, - 123, 148, 154, 117, 114, 81, 152, 115, 113, 105, - 94, 99, 129, 112, 130, 100, 120, 119, 121, 0, - 321, 0, 143, 159, 172, 336, 394, 165, 166, 167, - 168, 0, 0, 0, 122, 85, 101, 140, 104, 111, - 134, 170, 126, 138, 88, 158, 141, 332, 335, 330, - 331, 369, 370, 403, 404, 405, 385, 327, 0, 333, - 334, 0, 389, 372, 77, 0, 108, 169, 133, 95, - 160, 398, 388, 0, 360, 400, 338, 352, 408, 353, - 354, 381, 324, 368, 125, 350, 0, 341, 319, 347, - 320, 339, 362, 93, 365, 337, 390, 371, 107, 406, - 109, 376, 0, 142, 118, 0, 0, 364, 392, 366, - 386, 359, 382, 329, 375, 401, 351, 379, 402, 50, - 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, - 0, 86, 0, 378, 397, 349, 380, 318, 377, 0, - 322, 325, 407, 395, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 363, 367, 383, 357, 0, 0, 0, - 0, 0, 0, 0, 0, 342, 0, 374, 0, 0, - 0, 326, 323, 0, 361, 0, 0, 0, 328, 0, - 343, 384, 0, 317, 387, 393, 358, 187, 396, 356, - 355, 399, 131, 0, 0, 145, 98, 97, 106, 391, - 340, 348, 89, 346, 137, 127, 157, 373, 128, 136, - 110, 149, 132, 156, 188, 164, 147, 163, 78, 146, - 155, 87, 139, 80, 153, 144, 116, 102, 103, 79, - 0, 135, 92, 96, 91, 124, 150, 151, 90, 171, - 83, 162, 82, 84, 161, 123, 148, 154, 117, 114, - 81, 152, 115, 113, 105, 94, 99, 129, 112, 130, - 100, 120, 119, 121, 0, 321, 0, 143, 159, 172, - 336, 394, 165, 166, 167, 168, 0, 0, 0, 122, - 85, 101, 140, 104, 111, 134, 170, 126, 138, 88, - 158, 141, 332, 335, 330, 331, 369, 370, 403, 404, - 405, 385, 327, 0, 333, 334, 0, 389, 372, 77, - 0, 108, 169, 133, 95, 160, 398, 388, 0, 360, - 400, 338, 352, 408, 353, 354, 381, 324, 368, 125, - 350, 0, 341, 319, 347, 320, 339, 362, 93, 365, - 337, 390, 371, 107, 406, 109, 376, 0, 142, 118, - 0, 0, 364, 392, 366, 386, 359, 382, 329, 375, - 401, 351, 379, 402, 0, 0, 0, 75, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 0, 378, 397, - 349, 380, 318, 377, 0, 322, 325, 407, 395, 344, - 345, 0, 0, 0, 0, 0, 0, 0, 363, 367, - 383, 357, 0, 0, 0, 0, 0, 0, 1034, 0, - 342, 0, 374, 0, 0, 0, 326, 323, 0, 361, - 0, 0, 0, 328, 0, 343, 384, 0, 317, 387, - 393, 358, 187, 396, 356, 355, 399, 131, 0, 0, - 145, 98, 97, 106, 391, 340, 348, 89, 346, 137, - 127, 157, 373, 128, 136, 110, 149, 132, 156, 188, - 164, 147, 163, 78, 146, 155, 87, 139, 80, 153, - 144, 116, 102, 103, 79, 0, 135, 92, 96, 91, - 124, 150, 151, 90, 171, 83, 162, 82, 84, 161, - 123, 148, 154, 117, 114, 81, 152, 115, 113, 105, - 94, 99, 129, 112, 130, 100, 120, 119, 121, 0, - 321, 0, 143, 159, 172, 336, 394, 165, 166, 167, - 168, 0, 0, 0, 122, 85, 101, 140, 104, 111, - 134, 170, 126, 138, 88, 158, 141, 332, 335, 330, - 331, 369, 370, 403, 404, 405, 385, 327, 0, 333, - 334, 0, 389, 372, 77, 0, 108, 169, 133, 95, - 160, 398, 388, 0, 360, 400, 338, 352, 408, 353, - 354, 381, 324, 368, 125, 350, 0, 341, 319, 347, - 320, 339, 362, 93, 365, 337, 390, 371, 107, 406, - 109, 376, 0, 142, 118, 0, 0, 364, 392, 366, - 386, 359, 382, 329, 375, 401, 351, 379, 402, 0, - 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, - 0, 86, 0, 378, 397, 349, 380, 318, 377, 0, - 322, 325, 407, 395, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 363, 367, 383, 357, 0, 0, 0, - 0, 0, 0, 705, 0, 342, 0, 374, 0, 0, - 0, 326, 323, 0, 361, 0, 0, 0, 328, 0, - 343, 384, 0, 317, 387, 393, 358, 187, 396, 356, - 355, 399, 131, 0, 0, 145, 98, 97, 106, 391, - 340, 348, 89, 346, 137, 127, 157, 373, 128, 136, - 110, 149, 132, 156, 188, 164, 147, 163, 78, 146, - 155, 87, 139, 80, 153, 144, 116, 102, 103, 79, - 0, 135, 92, 96, 91, 124, 150, 151, 90, 171, - 83, 162, 82, 84, 161, 123, 148, 154, 117, 114, - 81, 152, 115, 113, 105, 94, 99, 129, 112, 130, - 100, 120, 119, 121, 0, 321, 0, 143, 159, 172, - 336, 394, 165, 166, 167, 168, 0, 0, 0, 122, - 85, 101, 140, 104, 111, 134, 170, 126, 138, 88, - 158, 141, 332, 335, 330, 331, 369, 370, 403, 404, - 405, 385, 327, 0, 333, 334, 0, 389, 372, 77, - 0, 108, 169, 133, 95, 160, 398, 388, 0, 360, - 400, 338, 352, 408, 353, 354, 381, 324, 368, 125, - 350, 0, 341, 319, 347, 320, 339, 362, 93, 365, - 337, 390, 371, 107, 406, 109, 376, 0, 142, 118, - 0, 0, 364, 392, 366, 386, 359, 382, 329, 375, - 401, 351, 379, 402, 0, 0, 0, 75, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 0, 378, 397, - 349, 380, 318, 377, 0, 322, 325, 407, 395, 344, - 345, 0, 0, 0, 0, 0, 0, 0, 363, 367, - 383, 357, 0, 0, 0, 0, 0, 0, 0, 0, - 342, 0, 374, 0, 0, 0, 326, 323, 0, 361, - 0, 0, 0, 328, 0, 343, 384, 0, 317, 387, - 393, 358, 187, 396, 356, 355, 399, 131, 0, 0, - 145, 98, 97, 106, 391, 340, 348, 89, 346, 137, - 127, 157, 373, 128, 136, 110, 149, 132, 156, 188, - 164, 147, 163, 78, 146, 155, 87, 139, 80, 153, - 144, 116, 102, 103, 79, 0, 135, 92, 96, 91, - 124, 150, 151, 90, 171, 83, 162, 82, 84, 161, - 123, 148, 154, 117, 114, 81, 152, 115, 113, 105, - 94, 99, 129, 112, 130, 100, 120, 119, 121, 0, - 321, 0, 143, 159, 172, 336, 394, 165, 166, 167, - 168, 0, 0, 0, 122, 85, 101, 140, 104, 111, - 134, 170, 126, 138, 88, 158, 141, 332, 335, 330, - 331, 369, 370, 403, 404, 405, 385, 327, 0, 333, - 334, 0, 389, 372, 77, 0, 108, 169, 133, 95, - 160, 398, 388, 0, 360, 400, 338, 352, 408, 353, - 354, 381, 324, 368, 125, 350, 0, 341, 319, 347, - 320, 339, 362, 93, 365, 337, 390, 371, 107, 406, - 109, 376, 0, 142, 118, 0, 0, 364, 392, 366, - 386, 359, 382, 329, 375, 401, 351, 379, 402, 0, - 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, - 0, 86, 0, 378, 397, 349, 380, 318, 377, 0, - 322, 325, 407, 395, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 363, 367, 383, 357, 0, 0, 0, - 0, 0, 0, 0, 0, 342, 0, 374, 0, 0, - 0, 326, 323, 0, 361, 0, 0, 0, 328, 0, - 343, 384, 0, 317, 387, 393, 358, 187, 396, 356, - 355, 399, 131, 0, 0, 145, 98, 97, 106, 391, - 340, 348, 89, 346, 137, 127, 157, 373, 128, 136, - 110, 149, 132, 156, 188, 164, 147, 163, 78, 146, - 155, 87, 139, 80, 153, 144, 116, 102, 103, 79, - 0, 135, 92, 96, 91, 124, 150, 151, 90, 171, - 83, 162, 82, 84, 161, 123, 148, 154, 117, 114, - 81, 152, 115, 113, 105, 94, 99, 129, 112, 130, - 100, 120, 119, 121, 0, 321, 0, 143, 159, 172, - 336, 394, 165, 166, 167, 168, 0, 0, 0, 122, - 85, 101, 140, 104, 111, 134, 170, 126, 138, 88, - 158, 141, 332, 335, 330, 331, 369, 370, 403, 404, - 405, 385, 327, 0, 333, 334, 0, 389, 372, 77, - 0, 108, 169, 133, 95, 160, 398, 388, 0, 360, - 400, 338, 352, 408, 353, 354, 381, 324, 368, 125, - 350, 0, 341, 319, 347, 320, 339, 362, 93, 365, - 337, 390, 371, 107, 406, 109, 376, 0, 142, 118, - 0, 0, 364, 392, 366, 386, 359, 382, 329, 375, - 401, 351, 379, 402, 0, 0, 0, 75, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 0, 378, 397, - 349, 380, 318, 377, 0, 322, 325, 407, 395, 344, - 345, 0, 0, 0, 0, 0, 0, 0, 363, 367, - 383, 357, 0, 0, 0, 0, 0, 0, 0, 0, - 342, 0, 374, 0, 0, 0, 326, 323, 0, 361, - 0, 0, 0, 328, 0, 343, 384, 0, 317, 387, - 393, 358, 187, 396, 356, 355, 399, 131, 0, 0, - 145, 98, 97, 106, 391, 340, 348, 89, 346, 137, - 127, 157, 373, 128, 136, 110, 149, 132, 156, 188, - 164, 147, 163, 78, 146, 155, 87, 139, 80, 153, - 144, 116, 102, 103, 79, 0, 135, 92, 96, 91, - 124, 150, 151, 90, 171, 83, 162, 82, 315, 161, - 123, 148, 154, 117, 114, 81, 152, 115, 113, 105, - 94, 99, 129, 112, 130, 100, 120, 119, 121, 0, - 321, 0, 143, 159, 172, 336, 394, 165, 166, 167, - 168, 0, 0, 0, 316, 314, 101, 140, 104, 111, - 134, 170, 126, 138, 88, 158, 141, 332, 335, 330, - 331, 369, 370, 403, 404, 405, 385, 327, 0, 333, - 334, 0, 389, 372, 77, 0, 108, 169, 133, 95, - 160, 398, 388, 0, 360, 400, 338, 352, 408, 353, - 354, 381, 324, 368, 125, 350, 0, 341, 319, 347, - 320, 339, 362, 93, 365, 337, 390, 371, 107, 406, - 109, 376, 0, 142, 118, 0, 0, 364, 392, 366, - 386, 359, 382, 329, 375, 401, 351, 379, 402, 0, - 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, - 0, 86, 0, 378, 397, 349, 380, 318, 377, 0, - 322, 325, 407, 395, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 363, 367, 383, 357, 0, 0, 0, - 0, 0, 0, 0, 0, 342, 0, 374, 0, 0, - 0, 326, 323, 0, 361, 0, 0, 0, 328, 0, - 343, 384, 0, 317, 387, 393, 358, 187, 396, 356, - 355, 399, 131, 0, 0, 145, 98, 97, 106, 391, - 340, 348, 89, 346, 137, 127, 157, 373, 128, 136, - 110, 149, 132, 156, 188, 164, 147, 163, 78, 146, - 155, 87, 139, 80, 153, 144, 116, 102, 103, 79, - 0, 135, 92, 96, 91, 124, 150, 151, 90, 171, - 83, 162, 82, 84, 161, 123, 148, 154, 117, 114, - 81, 152, 115, 113, 105, 94, 99, 129, 112, 130, - 100, 120, 119, 121, 0, 321, 0, 143, 159, 172, - 336, 394, 165, 166, 167, 168, 0, 0, 0, 122, - 85, 101, 140, 104, 111, 134, 170, 126, 138, 88, - 158, 141, 332, 335, 330, 331, 369, 370, 403, 404, - 405, 385, 327, 0, 333, 334, 0, 389, 372, 77, - 0, 108, 169, 133, 95, 160, 398, 388, 0, 360, - 400, 338, 352, 408, 353, 354, 381, 324, 368, 125, - 350, 0, 341, 319, 347, 320, 339, 362, 93, 365, - 337, 390, 371, 107, 406, 109, 376, 0, 142, 118, - 0, 0, 364, 392, 366, 386, 359, 382, 329, 375, - 401, 351, 379, 402, 0, 0, 0, 75, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 0, 378, 397, - 349, 380, 318, 377, 0, 322, 325, 407, 395, 344, - 345, 0, 0, 0, 0, 0, 0, 0, 363, 367, - 383, 357, 0, 0, 0, 0, 0, 0, 0, 0, - 342, 0, 374, 0, 0, 0, 326, 323, 0, 361, - 0, 0, 0, 328, 0, 343, 384, 0, 317, 387, - 393, 358, 187, 396, 356, 355, 399, 131, 0, 0, - 145, 98, 97, 106, 391, 340, 348, 89, 346, 137, - 127, 157, 373, 128, 136, 110, 149, 132, 156, 188, - 164, 147, 163, 78, 146, 583, 87, 139, 80, 153, - 144, 116, 102, 103, 79, 0, 135, 92, 96, 91, - 124, 150, 151, 90, 171, 83, 162, 82, 315, 161, - 123, 148, 154, 117, 114, 81, 152, 115, 113, 105, - 94, 99, 129, 112, 130, 100, 120, 119, 121, 0, - 321, 0, 143, 159, 172, 336, 394, 165, 166, 167, - 168, 0, 0, 0, 316, 314, 101, 140, 104, 111, - 134, 170, 126, 138, 88, 158, 141, 332, 335, 330, - 331, 369, 370, 403, 404, 405, 385, 327, 0, 333, - 334, 0, 389, 372, 77, 0, 108, 169, 133, 95, - 160, 398, 388, 0, 360, 400, 338, 352, 408, 353, - 354, 381, 324, 368, 125, 350, 0, 341, 319, 347, - 320, 339, 362, 93, 365, 337, 390, 371, 107, 406, - 109, 376, 0, 142, 118, 0, 0, 364, 392, 366, - 386, 359, 382, 329, 375, 401, 351, 379, 402, 0, - 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, - 0, 86, 0, 378, 397, 349, 380, 318, 377, 0, - 322, 325, 407, 395, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 363, 367, 383, 357, 0, 0, 0, - 0, 0, 0, 0, 0, 342, 0, 374, 0, 0, - 0, 326, 323, 0, 361, 0, 0, 0, 328, 0, - 343, 384, 0, 317, 387, 393, 358, 187, 396, 356, - 355, 399, 131, 0, 0, 145, 98, 97, 106, 391, - 340, 348, 89, 346, 137, 127, 157, 373, 128, 136, - 110, 149, 132, 156, 188, 164, 147, 163, 78, 146, - 306, 87, 139, 80, 153, 144, 116, 102, 103, 79, - 0, 135, 92, 96, 91, 124, 150, 151, 90, 171, - 83, 162, 82, 315, 161, 123, 148, 154, 117, 114, - 81, 152, 115, 113, 105, 94, 99, 129, 112, 130, - 100, 120, 119, 121, 0, 321, 0, 143, 159, 172, - 336, 394, 165, 166, 167, 168, 0, 0, 0, 316, - 314, 309, 308, 104, 111, 134, 170, 126, 138, 88, - 158, 141, 332, 335, 330, 331, 369, 370, 403, 404, - 405, 385, 327, 0, 333, 334, 0, 389, 372, 77, - 0, 108, 169, 133, 95, 160, 125, 0, 0, 741, - 0, 240, 0, 0, 0, 93, 0, 237, 0, 0, - 107, 279, 109, 0, 0, 142, 118, 0, 0, 0, - 0, 270, 271, 0, 0, 0, 0, 0, 0, 0, - 0, 50, 0, 0, 238, 258, 257, 260, 261, 262, - 263, 0, 0, 86, 259, 264, 265, 266, 0, 0, - 235, 251, 0, 278, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 248, 249, 231, 0, 0, 0, 290, - 0, 250, 0, 0, 246, 247, 252, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, - 0, 0, 288, 0, 131, 0, 0, 145, 98, 97, - 106, 0, 0, 0, 89, 0, 137, 127, 157, 0, - 128, 136, 110, 149, 132, 156, 188, 164, 147, 163, - 78, 146, 155, 87, 139, 80, 153, 144, 116, 102, - 103, 79, 0, 135, 92, 96, 91, 124, 150, 151, - 90, 171, 83, 162, 82, 84, 161, 123, 148, 154, - 117, 114, 81, 152, 115, 113, 105, 94, 99, 129, - 112, 130, 100, 120, 119, 121, 0, 0, 0, 143, - 159, 172, 0, 0, 165, 166, 167, 168, 0, 0, - 0, 122, 85, 101, 140, 104, 111, 134, 170, 126, - 138, 88, 158, 141, 280, 289, 286, 287, 284, 285, - 283, 282, 281, 291, 272, 273, 274, 275, 277, 0, - 276, 77, 0, 108, 169, 133, 95, 160, 125, 0, - 0, 0, 0, 240, 0, 0, 0, 93, 0, 237, - 0, 0, 107, 279, 109, 0, 0, 142, 118, 0, - 0, 0, 0, 270, 271, 0, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 454, 238, 258, 257, 260, - 261, 262, 263, 0, 0, 86, 259, 264, 265, 266, - 0, 0, 235, 251, 0, 278, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 248, 249, 0, 0, 0, - 0, 290, 0, 250, 0, 0, 246, 247, 252, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 187, 0, 0, 288, 0, 131, 0, 0, 145, - 98, 97, 106, 0, 0, 0, 89, 0, 137, 127, - 157, 0, 128, 136, 110, 149, 132, 156, 188, 164, - 147, 163, 78, 146, 155, 87, 139, 80, 153, 144, - 116, 102, 103, 79, 0, 135, 92, 96, 91, 124, - 150, 151, 90, 171, 83, 162, 82, 84, 161, 123, - 148, 154, 117, 114, 81, 152, 115, 113, 105, 94, - 99, 129, 112, 130, 100, 120, 119, 121, 0, 0, - 0, 143, 159, 172, 0, 0, 165, 166, 167, 168, - 0, 0, 0, 122, 85, 101, 140, 104, 111, 134, - 170, 126, 138, 88, 158, 141, 280, 289, 286, 287, - 284, 285, 283, 282, 281, 291, 272, 273, 274, 275, - 277, 0, 276, 77, 0, 108, 169, 133, 95, 160, - 125, 0, 0, 0, 0, 240, 0, 0, 0, 93, - 0, 237, 0, 0, 107, 279, 109, 0, 0, 142, - 118, 0, 0, 0, 0, 270, 271, 0, 0, 0, - 0, 0, 0, 0, 0, 50, 0, 0, 238, 258, - 257, 260, 261, 262, 263, 0, 0, 86, 259, 264, - 265, 266, 0, 0, 235, 251, 0, 278, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 248, 249, 231, - 0, 0, 0, 290, 0, 250, 0, 0, 246, 247, - 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 187, 0, 0, 288, 0, 131, 0, - 0, 145, 98, 97, 106, 0, 0, 0, 89, 0, - 137, 127, 157, 0, 128, 136, 110, 149, 132, 156, - 188, 164, 147, 163, 78, 146, 155, 87, 139, 80, - 153, 144, 116, 102, 103, 79, 0, 135, 92, 96, - 91, 124, 150, 151, 90, 171, 83, 162, 82, 84, - 161, 123, 148, 154, 117, 114, 81, 152, 115, 113, - 105, 94, 99, 129, 112, 130, 100, 120, 119, 121, - 0, 0, 0, 143, 159, 172, 0, 0, 165, 166, - 167, 168, 0, 0, 0, 122, 85, 101, 140, 104, - 111, 134, 170, 126, 138, 88, 158, 141, 280, 289, - 286, 287, 284, 285, 283, 282, 281, 291, 272, 273, - 274, 275, 277, 0, 276, 77, 0, 108, 169, 133, - 95, 160, 125, 0, 0, 0, 0, 240, 0, 0, - 0, 93, 0, 237, 0, 0, 107, 279, 109, 0, - 0, 142, 118, 0, 0, 0, 0, 270, 271, 0, - 0, 0, 0, 0, 0, 804, 0, 50, 0, 0, - 238, 258, 257, 260, 261, 262, 263, 0, 0, 86, - 259, 264, 265, 266, 0, 0, 235, 251, 0, 278, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, - 249, 0, 0, 0, 0, 290, 0, 250, 0, 0, - 246, 247, 252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 187, 0, 0, 288, 0, - 131, 0, 0, 145, 98, 97, 106, 0, 0, 0, - 89, 0, 137, 127, 157, 0, 128, 136, 110, 149, - 132, 156, 188, 164, 147, 163, 78, 146, 155, 87, - 139, 80, 153, 144, 116, 102, 103, 79, 0, 135, - 92, 96, 91, 124, 150, 151, 90, 171, 83, 162, - 82, 84, 161, 123, 148, 154, 117, 114, 81, 152, - 115, 113, 105, 94, 99, 129, 112, 130, 100, 120, - 119, 121, 0, 0, 0, 143, 159, 172, 0, 0, - 165, 166, 167, 168, 0, 0, 0, 122, 85, 101, - 140, 104, 111, 134, 170, 126, 138, 88, 158, 141, - 280, 289, 286, 287, 284, 285, 283, 282, 281, 291, - 272, 273, 274, 275, 277, 23, 276, 77, 0, 108, - 169, 133, 95, 160, 0, 0, 0, 125, 0, 0, - 0, 0, 240, 0, 0, 0, 93, 0, 237, 0, - 0, 107, 279, 109, 0, 0, 142, 118, 0, 0, - 0, 0, 270, 271, 0, 0, 0, 0, 0, 0, - 0, 0, 50, 0, 0, 238, 258, 257, 260, 261, - 262, 263, 0, 0, 86, 259, 264, 265, 266, 0, - 0, 235, 251, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 248, 249, 0, 0, 0, 0, - 290, 0, 250, 0, 0, 246, 247, 252, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 187, 0, 0, 288, 0, 131, 0, 0, 145, 98, - 97, 106, 0, 0, 0, 89, 0, 137, 127, 157, - 0, 128, 136, 110, 149, 132, 156, 188, 164, 147, - 163, 78, 146, 155, 87, 139, 80, 153, 144, 116, - 102, 103, 79, 0, 135, 92, 96, 91, 124, 150, - 151, 90, 171, 83, 162, 82, 84, 161, 123, 148, - 154, 117, 114, 81, 152, 115, 113, 105, 94, 99, - 129, 112, 130, 100, 120, 119, 121, 0, 0, 0, - 143, 159, 172, 0, 0, 165, 166, 167, 168, 0, - 0, 0, 122, 85, 101, 140, 104, 111, 134, 170, - 126, 138, 88, 158, 141, 280, 289, 286, 287, 284, - 285, 283, 282, 281, 291, 272, 273, 274, 275, 277, - 0, 276, 77, 0, 108, 169, 133, 95, 160, 125, - 0, 0, 0, 0, 240, 0, 0, 0, 93, 0, - 237, 0, 0, 107, 279, 109, 0, 0, 142, 118, - 0, 0, 0, 0, 270, 271, 0, 0, 0, 0, - 0, 0, 0, 0, 50, 0, 0, 238, 258, 257, - 260, 261, 262, 263, 0, 0, 86, 259, 264, 265, - 266, 0, 0, 235, 251, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 248, 249, 0, 0, - 0, 0, 290, 0, 250, 0, 0, 246, 247, 252, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 187, 0, 0, 288, 0, 131, 0, 0, - 145, 98, 97, 106, 0, 0, 0, 89, 0, 137, - 127, 157, 0, 128, 136, 110, 149, 132, 156, 188, - 164, 147, 163, 78, 146, 155, 87, 139, 80, 153, - 144, 116, 102, 103, 79, 0, 135, 92, 96, 91, - 124, 150, 151, 90, 171, 83, 162, 82, 84, 161, - 123, 148, 154, 117, 114, 81, 152, 115, 113, 105, - 94, 99, 129, 112, 130, 100, 120, 119, 121, 0, - 0, 0, 143, 159, 172, 0, 0, 165, 166, 167, - 168, 0, 0, 0, 122, 85, 101, 140, 104, 111, - 134, 170, 126, 138, 88, 158, 141, 280, 289, 286, - 287, 284, 285, 283, 282, 281, 291, 272, 273, 274, - 275, 277, 125, 276, 77, 0, 108, 169, 133, 95, - 160, 93, 0, 0, 0, 0, 107, 279, 109, 0, - 0, 142, 118, 0, 0, 0, 0, 270, 271, 0, - 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, - 238, 258, 257, 260, 261, 262, 263, 0, 0, 86, - 259, 264, 265, 266, 0, 0, 0, 251, 0, 278, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, - 249, 0, 0, 0, 0, 290, 0, 250, 0, 0, - 246, 247, 252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 187, 0, 0, 288, 0, - 131, 0, 0, 145, 98, 97, 106, 0, 0, 0, - 89, 0, 137, 127, 157, 1289, 128, 136, 110, 149, - 132, 156, 188, 164, 147, 163, 78, 146, 155, 87, - 139, 80, 153, 144, 116, 102, 103, 79, 0, 135, - 92, 96, 91, 124, 150, 151, 90, 171, 83, 162, - 82, 84, 161, 123, 148, 154, 117, 114, 81, 152, - 115, 113, 105, 94, 99, 129, 112, 130, 100, 120, - 119, 121, 0, 0, 0, 143, 159, 172, 0, 0, - 165, 166, 167, 168, 0, 0, 0, 122, 85, 101, - 140, 104, 111, 134, 170, 126, 138, 88, 158, 141, - 280, 289, 286, 287, 284, 285, 283, 282, 281, 291, - 272, 273, 274, 275, 277, 125, 276, 77, 0, 108, - 169, 133, 95, 160, 93, 0, 0, 0, 0, 107, - 279, 109, 0, 0, 142, 118, 0, 0, 0, 0, - 270, 271, 0, 0, 0, 0, 0, 0, 0, 0, - 50, 0, 0, 238, 258, 257, 260, 261, 262, 263, - 0, 0, 86, 259, 264, 265, 266, 0, 0, 0, - 251, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 248, 249, 0, 0, 0, 0, 290, 0, - 250, 0, 0, 246, 247, 252, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, - 0, 288, 0, 131, 0, 0, 145, 98, 97, 106, - 0, 0, 0, 89, 0, 137, 127, 157, 0, 128, - 136, 110, 149, 132, 156, 188, 164, 147, 163, 78, - 146, 155, 87, 139, 80, 153, 144, 116, 102, 103, - 79, 0, 135, 92, 96, 91, 124, 150, 151, 90, - 171, 83, 162, 82, 84, 161, 123, 148, 154, 117, - 114, 81, 152, 115, 113, 105, 94, 99, 129, 112, - 130, 100, 120, 119, 121, 0, 0, 0, 143, 159, - 172, 0, 0, 165, 166, 167, 168, 0, 0, 0, - 122, 85, 101, 140, 104, 111, 134, 170, 126, 138, - 88, 158, 141, 280, 289, 286, 287, 284, 285, 283, - 282, 281, 291, 272, 273, 274, 275, 277, 125, 276, - 77, 0, 108, 169, 133, 95, 160, 93, 0, 0, - 0, 0, 107, 0, 109, 0, 0, 142, 118, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, - 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 488, 487, 497, 498, 490, 491, 492, 493, 494, - 495, 496, 489, 0, 0, 499, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 187, 0, 0, 0, 0, 131, 0, 0, 145, - 98, 97, 106, 0, 0, 0, 89, 0, 137, 127, - 157, 0, 128, 136, 110, 149, 132, 156, 188, 164, - 147, 163, 78, 146, 155, 87, 139, 80, 153, 144, - 116, 102, 103, 79, 0, 135, 92, 96, 91, 124, - 150, 151, 90, 171, 83, 162, 82, 84, 161, 123, - 148, 154, 117, 114, 81, 152, 115, 113, 105, 94, - 99, 129, 112, 130, 100, 120, 119, 121, 0, 0, - 0, 143, 159, 172, 0, 0, 165, 166, 167, 168, - 0, 0, 0, 122, 85, 101, 140, 104, 111, 134, - 170, 126, 138, 88, 158, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 77, 0, 108, 169, 133, 95, 160, - 125, 0, 0, 0, 476, 0, 0, 0, 0, 93, - 0, 0, 0, 0, 107, 0, 109, 0, 0, 142, - 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, - 478, 0, 0, 0, 0, 0, 0, 86, 0, 0, - 0, 0, 473, 472, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 187, 0, 0, 0, 0, 131, 0, - 0, 145, 98, 97, 106, 0, 0, 0, 89, 0, - 137, 127, 157, 0, 128, 136, 110, 149, 132, 156, - 188, 164, 147, 163, 78, 146, 155, 87, 139, 80, - 153, 144, 116, 102, 103, 79, 0, 135, 92, 96, - 91, 124, 150, 151, 90, 171, 83, 162, 82, 84, - 161, 123, 148, 154, 117, 114, 81, 152, 115, 113, - 105, 94, 99, 129, 112, 130, 100, 120, 119, 121, - 0, 0, 0, 143, 159, 172, 0, 0, 165, 166, - 167, 168, 0, 0, 0, 122, 85, 101, 140, 104, - 111, 134, 170, 126, 138, 88, 158, 141, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 125, 0, 77, 0, 108, 169, 133, - 95, 160, 93, 0, 0, 0, 0, 107, 0, 109, - 0, 0, 142, 118, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 0, 0, 0, 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 71, 72, 0, 67, 0, 0, 0, - 73, 131, 0, 0, 145, 98, 97, 106, 0, 0, - 0, 89, 0, 137, 127, 157, 0, 128, 136, 110, - 149, 132, 156, 69, 164, 147, 163, 78, 146, 155, - 87, 139, 80, 153, 144, 116, 102, 103, 79, 0, - 135, 92, 96, 91, 124, 150, 151, 90, 171, 83, - 162, 82, 84, 161, 123, 148, 154, 117, 114, 81, - 152, 115, 113, 105, 94, 99, 129, 112, 130, 100, - 120, 119, 121, 0, 0, 0, 143, 159, 172, 0, - 0, 165, 166, 167, 168, 0, 0, 0, 122, 85, - 101, 140, 104, 111, 134, 170, 126, 138, 88, 158, - 141, 0, 70, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, - 108, 169, 133, 95, 160, 125, 0, 0, 0, 572, - 0, 0, 0, 0, 93, 0, 0, 0, 0, 107, - 0, 109, 0, 0, 142, 118, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 185, 0, 574, 0, 0, 0, 0, - 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, - 0, 0, 0, 131, 0, 0, 145, 98, 97, 106, - 0, 0, 0, 89, 0, 137, 127, 157, 0, 128, - 136, 110, 149, 132, 156, 188, 164, 147, 163, 78, - 146, 155, 87, 139, 80, 153, 144, 116, 102, 103, - 79, 0, 135, 92, 96, 91, 124, 150, 151, 90, - 171, 83, 162, 82, 84, 161, 123, 148, 154, 117, - 114, 81, 152, 115, 113, 105, 94, 99, 129, 112, - 130, 100, 120, 119, 121, 0, 0, 0, 143, 159, - 172, 0, 0, 165, 166, 167, 168, 0, 0, 0, - 122, 85, 101, 140, 104, 111, 134, 170, 126, 138, - 88, 158, 141, 0, 0, 0, 23, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, - 77, 0, 108, 169, 133, 95, 160, 93, 0, 0, - 0, 0, 107, 0, 109, 0, 0, 142, 118, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 0, 75, 0, 0, 0, - 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 187, 0, 0, 0, 0, 131, 0, 0, 145, - 98, 97, 106, 0, 0, 0, 89, 0, 137, 127, - 157, 0, 128, 136, 110, 149, 132, 156, 188, 164, - 147, 163, 78, 146, 155, 87, 139, 80, 153, 144, - 116, 102, 103, 79, 0, 135, 92, 96, 91, 124, - 150, 151, 90, 171, 83, 162, 82, 84, 161, 123, - 148, 154, 117, 114, 81, 152, 115, 113, 105, 94, - 99, 129, 112, 130, 100, 120, 119, 121, 0, 0, - 0, 143, 159, 172, 0, 0, 165, 166, 167, 168, - 0, 0, 0, 122, 85, 101, 140, 104, 111, 134, - 170, 126, 138, 88, 158, 141, 0, 0, 0, 23, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 125, 0, 77, 0, 108, 169, 133, 95, 160, - 93, 0, 0, 0, 0, 107, 0, 109, 0, 0, - 142, 118, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 50, 0, 0, 185, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 187, 0, 0, 0, 0, 131, - 0, 0, 145, 98, 97, 106, 0, 0, 0, 89, - 0, 137, 127, 157, 0, 128, 136, 110, 149, 132, - 156, 188, 164, 147, 163, 78, 146, 155, 87, 139, - 80, 153, 144, 116, 102, 103, 79, 0, 135, 92, - 96, 91, 124, 150, 151, 90, 171, 83, 162, 82, - 84, 161, 123, 148, 154, 117, 114, 81, 152, 115, - 113, 105, 94, 99, 129, 112, 130, 100, 120, 119, - 121, 0, 0, 0, 143, 159, 172, 0, 0, 165, - 166, 167, 168, 0, 0, 0, 122, 85, 101, 140, - 104, 111, 134, 170, 126, 138, 88, 158, 141, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 125, 0, 77, 0, 108, 169, - 133, 95, 160, 93, 0, 0, 0, 0, 107, 0, - 109, 0, 0, 142, 118, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 75, 0, 0, 692, 0, 0, 693, 0, - 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, - 0, 0, 131, 0, 0, 145, 98, 97, 106, 0, - 0, 0, 89, 0, 137, 127, 157, 0, 128, 136, - 110, 149, 132, 156, 188, 164, 147, 163, 78, 146, - 155, 87, 139, 80, 153, 144, 116, 102, 103, 79, - 0, 135, 92, 96, 91, 124, 150, 151, 90, 171, - 83, 162, 82, 84, 161, 123, 148, 154, 117, 114, - 81, 152, 115, 113, 105, 94, 99, 129, 112, 130, - 100, 120, 119, 121, 0, 0, 0, 143, 159, 172, - 0, 0, 165, 166, 167, 168, 0, 0, 0, 122, - 85, 101, 140, 104, 111, 134, 170, 126, 138, 88, - 158, 141, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 125, 0, 77, - 0, 108, 169, 133, 95, 160, 93, 0, 592, 0, - 0, 107, 0, 109, 0, 0, 142, 118, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 75, 0, 591, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 187, 0, 0, 0, 0, 131, 0, 0, 145, 98, - 97, 106, 0, 0, 0, 89, 0, 137, 127, 157, - 0, 128, 136, 110, 149, 132, 156, 188, 164, 147, - 163, 78, 146, 155, 87, 139, 80, 153, 144, 116, - 102, 103, 79, 0, 135, 92, 96, 91, 124, 150, - 151, 90, 171, 83, 162, 82, 84, 161, 123, 148, - 154, 117, 114, 81, 152, 115, 113, 105, 94, 99, - 129, 112, 130, 100, 120, 119, 121, 0, 0, 0, - 143, 159, 172, 0, 0, 165, 166, 167, 168, 0, - 0, 0, 122, 85, 101, 140, 104, 111, 134, 170, - 126, 138, 88, 158, 141, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 77, 0, 108, 169, 133, 95, 160, 125, - 0, 0, 0, 572, 0, 0, 0, 0, 93, 0, - 0, 0, 0, 107, 0, 109, 0, 0, 142, 118, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 185, 0, 574, - 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 187, 0, 0, 0, 0, 131, 0, 0, - 145, 98, 97, 106, 0, 0, 0, 89, 0, 137, - 127, 157, 0, 570, 136, 110, 149, 132, 156, 188, - 164, 147, 163, 78, 146, 155, 87, 139, 80, 153, - 144, 116, 102, 103, 79, 0, 135, 92, 96, 91, - 124, 150, 151, 90, 171, 83, 162, 82, 84, 161, - 123, 148, 154, 117, 114, 81, 152, 115, 113, 105, - 94, 99, 129, 112, 130, 100, 120, 119, 121, 0, - 0, 0, 143, 159, 172, 0, 0, 165, 166, 167, - 168, 0, 0, 0, 122, 85, 101, 140, 104, 111, - 134, 170, 126, 138, 88, 158, 141, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 125, 0, 77, 0, 108, 169, 133, 95, - 160, 93, 0, 0, 0, 0, 107, 0, 109, 0, - 0, 142, 118, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, - 185, 0, 0, 0, 0, 0, 0, 0, 0, 86, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, - 131, 0, 0, 145, 98, 97, 106, 0, 0, 0, - 89, 0, 137, 127, 157, 0, 128, 136, 110, 149, - 132, 156, 188, 164, 147, 163, 78, 146, 155, 87, - 139, 80, 153, 144, 116, 102, 103, 79, 0, 135, - 92, 96, 91, 124, 150, 151, 90, 171, 83, 162, - 82, 84, 161, 123, 148, 154, 117, 114, 81, 152, - 115, 113, 105, 94, 99, 129, 112, 130, 100, 120, - 119, 121, 0, 0, 0, 143, 159, 172, 0, 0, - 165, 166, 167, 168, 0, 0, 0, 122, 85, 101, - 140, 104, 111, 134, 170, 126, 138, 88, 158, 141, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 125, 0, 77, 0, 108, - 169, 133, 95, 160, 93, 0, 0, 0, 0, 107, - 0, 109, 0, 0, 142, 118, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 185, 0, 574, 0, 0, 0, 0, - 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, - 0, 0, 0, 131, 0, 0, 145, 98, 97, 106, - 0, 0, 0, 89, 0, 137, 127, 157, 0, 128, - 136, 110, 149, 132, 156, 188, 164, 147, 163, 78, - 146, 155, 87, 139, 80, 153, 144, 116, 102, 103, - 79, 0, 135, 92, 96, 91, 124, 150, 151, 90, - 171, 83, 162, 82, 84, 161, 123, 148, 154, 117, - 114, 81, 152, 115, 113, 105, 94, 99, 129, 112, - 130, 100, 120, 119, 121, 0, 0, 0, 143, 159, - 172, 0, 0, 165, 166, 167, 168, 0, 0, 0, - 122, 85, 101, 140, 104, 111, 134, 170, 126, 138, - 88, 158, 141, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, - 77, 0, 108, 169, 133, 95, 160, 93, 0, 0, - 0, 0, 107, 0, 109, 0, 0, 142, 118, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 75, 0, 478, 0, - 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 187, 0, 0, 0, 0, 131, 0, 0, 145, - 98, 97, 106, 0, 0, 0, 89, 0, 137, 127, - 157, 0, 128, 136, 110, 149, 132, 156, 188, 164, - 147, 163, 78, 146, 155, 87, 139, 80, 153, 144, - 116, 102, 103, 79, 0, 135, 92, 96, 91, 124, - 150, 151, 90, 171, 83, 162, 82, 84, 161, 123, - 148, 154, 117, 114, 81, 152, 115, 113, 105, 94, - 99, 129, 112, 130, 100, 120, 119, 121, 0, 0, - 0, 143, 159, 172, 0, 0, 165, 166, 167, 168, - 0, 0, 0, 122, 85, 101, 140, 104, 111, 134, - 170, 126, 138, 88, 158, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 125, 77, 0, 108, 169, 133, 95, 160, - 550, 93, 0, 0, 0, 0, 107, 0, 109, 0, - 0, 142, 118, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 185, 0, 0, 0, 0, 0, 0, 0, 0, 86, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, - 131, 0, 0, 145, 98, 97, 106, 0, 0, 0, - 89, 0, 137, 127, 157, 0, 128, 136, 110, 149, - 132, 156, 188, 164, 147, 163, 78, 146, 155, 87, - 139, 80, 153, 144, 116, 102, 103, 79, 0, 135, - 92, 96, 91, 124, 150, 151, 90, 171, 83, 162, - 82, 84, 161, 123, 148, 154, 117, 114, 81, 152, - 115, 113, 105, 94, 99, 129, 112, 130, 100, 120, - 119, 121, 0, 0, 0, 143, 159, 172, 0, 0, - 165, 166, 167, 168, 0, 0, 0, 122, 85, 101, - 140, 104, 111, 134, 170, 126, 138, 88, 158, 141, - 0, 0, 0, 0, 0, 0, 0, 0, 301, 0, - 0, 0, 0, 0, 0, 125, 0, 77, 0, 108, - 169, 133, 95, 160, 93, 0, 0, 0, 0, 107, - 0, 109, 0, 0, 142, 118, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 191, 389, 541, 467, 632, 437, 176, 414, 542, 699, + 522, 32, 415, 597, 436, 533, 413, 213, 448, 48, + 496, 344, 178, 98, 98, 46, 433, 554, 104, 473, + 524, 193, 442, 267, 463, 116, 94, 144, 412, 98, + 124, 31, 48, 725, 115, 146, 214, 3, 126, 204, + 574, 140, 455, 636, 125, 142, 114, 130, 438, 717, + 715, 474, 131, 346, 695, 475, 637, 638, 639, 134, + 474, 92, 450, 102, 640, 25, 27, 15, 16, 112, + 648, 86, 129, 87, 265, 136, 98, 260, 259, 568, + 128, 98, 22, 362, 361, 371, 372, 364, 365, 366, + 367, 368, 369, 370, 363, 85, 729, 687, 29, 651, + 133, 88, 98, 620, 603, 552, 90, 485, 89, 195, + 388, 98, 98, 98, 141, 363, 350, 551, 598, 348, + 676, 98, 349, 348, 98, 534, 98, 98, 456, 678, + 179, 26, 98, 139, 350, 696, 694, 504, 350, 449, + 366, 367, 368, 369, 370, 363, 196, 605, 217, 258, + 501, 502, 503, 500, 18, 19, 20, 26, 121, 147, + 194, 641, 103, 343, 269, 109, 572, 349, 348, 120, + 21, 23, 402, 403, 24, 29, 255, 256, 534, 200, + 609, 93, 99, 350, 349, 348, 499, 698, 135, 98, + 489, 491, 492, 98, 98, 98, 98, 490, 126, 697, + 350, 577, 98, 353, 576, 575, 98, 349, 348, 98, + 452, 28, 48, 48, 404, 741, 634, 453, 441, 126, + 589, 590, 591, 350, 405, 125, 731, 732, 416, 419, + 569, 421, 352, 390, 409, 145, 395, 418, 737, 420, + 26, 429, 430, 736, 132, 432, 98, 98, 469, 138, + 427, 215, 431, 443, 642, 351, 98, 98, 362, 361, + 371, 372, 364, 365, 366, 367, 368, 369, 370, 363, + 199, 528, 349, 348, 691, 690, 465, 466, 480, 145, + 476, 220, 381, 645, 644, 619, 145, 33, 350, 257, + 528, 145, 261, 434, 263, 264, 361, 371, 372, 364, + 365, 366, 367, 368, 369, 370, 363, 387, 202, 145, + 391, 392, 393, 480, 396, 222, 221, 201, 397, 398, + 399, 615, 550, 202, 643, 550, 481, 156, 410, 25, + 202, 25, 480, 120, 120, 120, 120, 48, 562, 25, + 400, 29, 457, 126, 468, 627, 215, 206, 209, 483, + 207, 680, 208, 210, 555, 556, 480, 411, 458, 459, + 407, 408, 29, 565, 29, 464, 119, 41, 497, 460, + 461, 462, 29, 206, 209, 578, 207, 48, 208, 210, + 558, 555, 556, 521, 579, 441, 424, 426, 209, 423, + 425, 12, 422, 126, 535, 571, 735, 734, 566, 472, + 262, 48, 486, 487, 126, 493, 494, 548, 212, 143, + 110, 527, 526, 547, 470, 471, 105, 529, 536, 537, + 538, 543, 539, 416, 477, 478, 108, 48, 431, 549, + 706, 106, 563, 441, 416, 560, 540, 525, 557, 531, + 33, 36, 705, 266, 650, 390, 530, 545, 119, 434, + 137, 122, 35, 37, 194, 100, 567, 38, 39, 559, + 30, 1, 91, 631, 48, 445, 98, 101, 435, 123, + 126, 40, 98, 126, 582, 48, 125, 444, 693, 380, + 635, 126, 441, 451, 573, 454, 570, 586, 561, 585, + 225, 226, 584, 224, 228, 227, 583, 223, 659, 211, + 216, 482, 43, 416, 580, 111, 150, 688, 527, 588, + 546, 592, 26, 497, 364, 365, 366, 367, 368, 369, + 370, 363, 391, 401, 192, 704, 649, 607, 394, 532, + 119, 119, 119, 119, 525, 154, 155, 488, 608, 544, + 165, 26, 162, 119, 601, 164, 163, 126, 152, 441, + 600, 621, 606, 48, 406, 48, 48, 622, 354, 441, + 630, 441, 633, 611, 612, 613, 614, 629, 177, 98, + 98, 153, 616, 617, 618, 527, 625, 416, 148, 628, + 118, 197, 604, 205, 203, 553, 117, 479, 610, 724, + 14, 95, 95, 34, 48, 113, 11, 652, 390, 10, + 441, 624, 17, 657, 9, 623, 8, 95, 675, 626, + 48, 48, 120, 7, 679, 6, 684, 685, 48, 5, + 48, 4, 683, 107, 126, 563, 441, 13, 543, 656, + 689, 2, 0, 0, 581, 0, 0, 48, 48, 0, + 686, 0, 48, 441, 441, 126, 703, 702, 441, 0, + 0, 0, 658, 0, 95, 681, 602, 713, 0, 95, + 0, 0, 0, 677, 382, 383, 384, 385, 386, 0, + 0, 0, 0, 727, 0, 416, 0, 0, 48, 0, + 95, 0, 48, 498, 441, 709, 733, 710, 633, 95, + 219, 95, 0, 543, 0, 701, 701, 0, 739, 95, + 658, 0, 95, 0, 95, 95, 0, 0, 0, 0, + 268, 347, 0, 0, 0, 0, 0, 0, 0, 728, + 48, 0, 48, 0, 0, 0, 743, 0, 126, 0, + 0, 0, 726, 0, 744, 0, 730, 646, 647, 0, + 0, 0, 0, 0, 0, 0, 544, 0, 0, 682, + 0, 0, 740, 0, 0, 0, 742, 0, 0, 738, + 390, 0, 692, 0, 0, 0, 0, 95, 0, 0, + 219, 95, 95, 95, 95, 0, 0, 700, 700, 0, + 428, 0, 0, 0, 95, 0, 0, 219, 0, 711, + 0, 712, 0, 714, 0, 716, 0, 718, 719, 720, + 721, 722, 723, 0, 0, 0, 0, 0, 0, 119, + 0, 544, 0, 26, 0, 69, 0, 523, 0, 151, + 0, 0, 0, 0, 95, 95, 183, 61, 498, 0, + 0, 0, 0, 0, 95, 95, 0, 29, 0, 0, + 190, 167, 166, 168, 169, 170, 171, 172, 0, 0, + 173, 174, 175, 0, 0, 0, 0, 149, 160, 0, + 182, 495, 0, 0, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 0, 157, 158, 345, 0, 0, 0, 188, 0, 159, + 0, 161, 371, 372, 364, 365, 366, 367, 368, 369, + 370, 363, 0, 187, 0, 70, 0, 0, 58, 0, + 0, 53, 0, 0, 78, 73, 65, 59, 60, 49, + 0, 71, 56, 57, 55, 68, 75, 76, 54, 83, + 52, 82, 51, 67, 74, 79, 66, 63, 50, 77, + 64, 62, 0, 72, 80, 84, 674, 184, 185, 186, + 189, 180, 181, 0, 81, 0, 347, 268, 0, 0, + 0, 0, 0, 0, 0, 219, 347, 347, 347, 0, + 0, 0, 0, 0, 239, 0, 219, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 240, + 241, 242, 243, 229, 230, 0, 0, 231, 232, 233, + 234, 235, 236, 237, 238, 0, 0, 0, 593, 594, + 595, 596, 0, 0, 0, 661, 0, 0, 670, 671, + 672, 669, 0, 673, 0, 0, 0, 0, 663, 0, + 666, 668, 662, 0, 660, 0, 0, 664, 0, 0, + 0, 0, 0, 0, 95, 219, 0, 665, 667, 347, + 95, 356, 0, 360, 268, 0, 0, 0, 0, 373, + 374, 375, 376, 377, 378, 0, 357, 358, 359, 355, + 379, 362, 361, 371, 372, 364, 365, 366, 367, 368, + 369, 370, 363, 0, 0, 0, 653, 0, 0, 0, + 0, 0, 347, 0, 0, 0, 0, 0, 0, 0, + 347, 599, 0, 0, 0, 654, 655, 362, 361, 371, + 372, 364, 365, 366, 367, 368, 369, 370, 363, 219, + 0, 268, 362, 361, 371, 372, 364, 365, 366, 367, + 368, 369, 370, 363, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 95, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 347, 334, 325, 303, 336, 284, 295, 341, 296, + 297, 319, 276, 311, 69, 0, 287, 272, 293, 273, + 285, 305, 308, 283, 327, 338, 61, 307, 309, 324, + 302, 320, 279, 314, 317, 337, 0, 0, 0, 47, + 0, 439, 440, 0, 0, 0, 0, 219, 0, 316, + 333, 294, 0, 0, 318, 271, 315, 0, 275, 277, + 340, 331, 290, 291, 564, 0, 0, 0, 0, 0, + 306, 310, 321, 312, 300, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 288, 0, 313, 0, 0, 0, + 304, 0, 278, 0, 289, 322, 270, 329, 339, 301, + 332, 299, 298, 335, 70, 0, 0, 58, 328, 286, + 53, 292, 342, 78, 73, 65, 59, 60, 49, 0, + 71, 56, 57, 55, 68, 75, 76, 54, 83, 52, + 82, 51, 67, 74, 79, 66, 63, 50, 77, 64, + 62, 274, 72, 80, 84, 330, 282, 280, 281, 323, + 0, 0, 326, 81, 334, 325, 303, 336, 284, 295, + 341, 296, 297, 319, 276, 311, 69, 0, 287, 272, + 293, 273, 285, 305, 308, 283, 327, 338, 61, 307, + 309, 324, 302, 320, 279, 314, 317, 337, 0, 0, + 0, 47, 0, 439, 440, 0, 0, 0, 0, 0, + 0, 316, 333, 294, 0, 0, 318, 271, 315, 0, + 275, 277, 340, 331, 290, 291, 0, 0, 0, 0, + 0, 0, 306, 310, 321, 312, 300, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 288, 0, 313, 0, + 0, 0, 304, 0, 278, 0, 289, 322, 270, 329, + 339, 301, 332, 299, 298, 335, 70, 0, 0, 58, + 328, 286, 53, 292, 342, 78, 73, 65, 59, 60, + 49, 0, 71, 56, 57, 55, 68, 75, 76, 54, + 83, 52, 82, 51, 67, 74, 79, 66, 63, 50, + 77, 64, 62, 274, 72, 80, 84, 330, 282, 280, + 281, 323, 0, 0, 326, 81, 334, 325, 303, 336, + 284, 295, 341, 296, 297, 319, 276, 311, 69, 0, + 287, 272, 293, 273, 285, 305, 308, 283, 327, 338, + 61, 307, 309, 324, 302, 320, 279, 314, 317, 337, + 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 316, 333, 294, 0, 0, 318, 271, + 315, 0, 275, 277, 340, 331, 290, 291, 0, 0, + 0, 0, 0, 0, 306, 310, 321, 312, 300, 0, + 0, 0, 0, 0, 0, 0, 707, 0, 288, 0, + 313, 0, 0, 0, 304, 0, 278, 0, 289, 322, + 270, 329, 339, 301, 332, 299, 298, 335, 70, 0, + 0, 58, 328, 286, 53, 292, 342, 78, 73, 65, + 59, 60, 49, 0, 71, 56, 57, 55, 68, 75, + 76, 54, 83, 52, 82, 51, 67, 74, 79, 66, + 63, 50, 77, 64, 62, 274, 72, 80, 84, 330, + 282, 280, 281, 323, 0, 0, 326, 81, 334, 325, + 303, 336, 284, 295, 341, 296, 297, 319, 276, 311, + 69, 0, 287, 272, 293, 273, 285, 305, 308, 283, + 327, 338, 61, 307, 309, 324, 302, 320, 279, 314, + 317, 337, 29, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 316, 333, 294, 0, 0, + 318, 271, 315, 0, 275, 277, 340, 331, 290, 291, + 0, 0, 0, 0, 0, 0, 306, 310, 321, 312, + 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 288, 0, 313, 0, 0, 0, 304, 0, 278, 0, + 289, 322, 270, 329, 339, 301, 332, 299, 298, 335, + 70, 0, 0, 58, 328, 286, 53, 292, 342, 78, + 73, 65, 59, 60, 49, 0, 71, 56, 57, 55, + 68, 75, 76, 54, 83, 52, 82, 51, 67, 74, + 79, 66, 63, 50, 77, 64, 62, 274, 72, 80, + 84, 330, 282, 280, 281, 323, 0, 0, 326, 81, + 334, 325, 303, 336, 284, 295, 341, 296, 297, 319, + 276, 311, 69, 0, 287, 272, 293, 273, 285, 305, + 308, 283, 327, 338, 61, 307, 309, 324, 302, 320, + 279, 314, 317, 337, 0, 0, 0, 190, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 316, 333, 294, + 0, 0, 318, 271, 315, 0, 275, 277, 340, 331, + 290, 291, 0, 0, 0, 0, 0, 0, 306, 310, + 321, 312, 300, 0, 0, 0, 0, 0, 0, 0, + 587, 0, 288, 0, 313, 0, 0, 0, 304, 0, + 278, 0, 289, 322, 270, 329, 339, 301, 332, 299, + 298, 335, 70, 0, 0, 58, 328, 286, 53, 292, + 342, 78, 73, 65, 59, 60, 49, 0, 71, 56, + 57, 55, 68, 75, 76, 54, 83, 52, 82, 51, + 67, 74, 79, 66, 63, 50, 77, 64, 62, 274, + 72, 80, 84, 330, 282, 280, 281, 323, 0, 0, + 326, 81, 334, 325, 303, 336, 284, 295, 341, 296, + 297, 319, 276, 311, 69, 0, 287, 272, 293, 273, + 285, 305, 308, 283, 327, 338, 61, 307, 309, 324, + 302, 320, 279, 314, 317, 337, 0, 0, 0, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 316, + 333, 294, 0, 0, 318, 271, 315, 0, 275, 277, + 340, 331, 290, 291, 0, 0, 0, 0, 0, 0, + 306, 310, 321, 312, 300, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 288, 0, 313, 0, 0, 0, + 304, 0, 278, 0, 289, 322, 270, 329, 339, 301, + 332, 299, 298, 335, 70, 0, 0, 58, 328, 286, + 53, 292, 342, 78, 73, 65, 59, 60, 49, 0, + 71, 56, 57, 55, 68, 75, 76, 54, 83, 52, + 82, 51, 67, 74, 79, 66, 63, 50, 77, 64, + 62, 274, 72, 80, 84, 330, 282, 280, 281, 323, + 0, 0, 326, 81, 334, 325, 303, 336, 284, 295, + 341, 296, 297, 319, 276, 311, 69, 0, 287, 272, + 293, 273, 285, 305, 308, 283, 327, 338, 61, 307, + 309, 324, 302, 320, 279, 314, 317, 337, 0, 0, + 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 316, 333, 294, 0, 0, 318, 271, 315, 0, + 275, 277, 340, 331, 290, 291, 0, 0, 0, 0, + 0, 0, 306, 310, 321, 312, 300, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 288, 0, 313, 0, + 0, 0, 304, 0, 278, 0, 289, 322, 270, 329, + 339, 301, 332, 299, 298, 335, 70, 0, 0, 58, + 328, 286, 53, 292, 342, 78, 73, 65, 59, 60, + 49, 0, 71, 56, 57, 55, 68, 75, 76, 54, + 83, 52, 82, 51, 67, 74, 79, 66, 63, 50, + 77, 64, 62, 274, 72, 80, 84, 330, 282, 280, + 281, 323, 0, 0, 326, 81, 334, 325, 303, 336, + 284, 295, 341, 296, 297, 319, 276, 311, 69, 0, + 287, 272, 293, 273, 285, 305, 308, 283, 327, 338, + 61, 307, 309, 324, 302, 320, 279, 314, 317, 337, + 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 316, 333, 294, 0, 0, 318, 271, + 315, 0, 275, 277, 340, 331, 290, 291, 0, 0, + 0, 0, 0, 0, 306, 310, 321, 312, 300, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, + 313, 0, 0, 0, 304, 0, 278, 0, 289, 322, + 270, 329, 339, 301, 332, 299, 298, 335, 70, 0, + 0, 58, 328, 286, 53, 292, 342, 78, 73, 65, + 59, 60, 49, 0, 71, 56, 57, 55, 68, 75, + 76, 54, 83, 52, 82, 51, 67, 74, 79, 66, + 63, 50, 77, 64, 62, 274, 72, 80, 84, 330, + 282, 280, 281, 323, 69, 0, 326, 81, 151, 0, + 0, 0, 0, 0, 0, 183, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 190, + 167, 166, 168, 169, 170, 171, 172, 0, 0, 173, + 174, 175, 0, 0, 0, 0, 149, 160, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 158, 345, 0, 0, 0, 188, 0, 159, 0, + 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 187, 0, 70, 0, 0, 58, 0, 0, + 53, 0, 0, 78, 73, 65, 59, 60, 49, 0, + 71, 56, 57, 55, 68, 75, 76, 54, 83, 52, + 82, 51, 67, 74, 79, 66, 63, 50, 77, 64, + 62, 0, 72, 80, 84, 0, 184, 185, 186, 189, + 180, 181, 69, 81, 0, 0, 151, 0, 0, 0, + 0, 0, 0, 183, 61, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 145, 190, 167, 166, + 168, 169, 170, 171, 172, 0, 0, 173, 174, 175, + 0, 0, 0, 0, 149, 160, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 157, 158, + 0, 0, 0, 0, 188, 0, 159, 0, 161, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 187, 0, 70, 0, 0, 58, 0, 0, 53, 0, + 0, 78, 73, 65, 59, 60, 49, 0, 71, 56, + 57, 55, 68, 75, 76, 54, 83, 52, 82, 51, + 67, 74, 79, 66, 63, 50, 77, 64, 62, 25, + 72, 80, 84, 0, 184, 185, 186, 189, 180, 181, + 69, 81, 0, 0, 151, 0, 0, 0, 0, 0, + 0, 183, 61, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 190, 167, 166, 168, 169, + 170, 171, 172, 0, 0, 173, 174, 175, 0, 0, + 0, 0, 149, 160, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 157, 158, 0, 0, + 0, 0, 188, 0, 159, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, - 0, 0, 0, 131, 0, 0, 145, 98, 97, 106, - 0, 0, 0, 89, 0, 137, 127, 157, 0, 128, - 136, 110, 149, 132, 156, 188, 164, 147, 163, 78, - 146, 155, 87, 139, 80, 153, 144, 116, 102, 103, - 79, 0, 135, 92, 96, 91, 124, 150, 151, 90, - 171, 83, 162, 82, 84, 161, 123, 148, 154, 117, - 114, 81, 152, 115, 113, 105, 94, 99, 129, 112, - 130, 100, 120, 119, 121, 0, 0, 0, 143, 159, - 172, 0, 0, 165, 166, 167, 168, 0, 0, 0, - 122, 85, 101, 140, 104, 111, 134, 170, 126, 138, - 88, 158, 141, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, - 77, 0, 108, 169, 133, 95, 160, 93, 0, 0, - 0, 0, 107, 0, 109, 0, 0, 142, 118, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, - 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, - 0, 187, 0, 0, 0, 0, 131, 0, 0, 145, - 98, 97, 106, 0, 0, 0, 89, 0, 137, 127, - 157, 0, 128, 136, 110, 149, 132, 156, 188, 164, - 147, 163, 78, 146, 155, 87, 139, 80, 153, 144, - 116, 102, 103, 79, 0, 135, 92, 96, 91, 124, - 150, 151, 90, 171, 83, 162, 82, 84, 161, 123, - 148, 154, 117, 114, 81, 152, 115, 113, 105, 94, - 99, 129, 112, 130, 100, 120, 119, 121, 0, 0, - 0, 143, 159, 172, 0, 0, 165, 166, 167, 168, - 0, 0, 0, 122, 85, 101, 140, 104, 111, 134, - 170, 126, 138, 88, 158, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 125, 0, 77, 0, 108, 169, 133, 95, 160, - 93, 0, 0, 0, 0, 107, 0, 109, 0, 0, - 142, 118, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 187, 0, 0, 0, 0, 131, - 0, 0, 145, 98, 97, 106, 0, 0, 0, 89, - 0, 137, 127, 157, 0, 128, 136, 110, 149, 132, - 156, 188, 164, 147, 163, 78, 146, 155, 87, 139, - 80, 153, 144, 116, 102, 103, 79, 0, 135, 92, - 96, 91, 124, 150, 151, 90, 171, 83, 162, 82, - 84, 161, 123, 148, 154, 117, 114, 81, 152, 115, - 113, 105, 94, 99, 129, 112, 130, 100, 120, 119, - 121, 0, 0, 0, 143, 159, 172, 0, 0, 165, - 166, 167, 168, 0, 0, 0, 122, 85, 101, 140, - 104, 111, 134, 170, 126, 138, 88, 158, 141, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 125, 0, 77, 0, 108, 169, - 133, 95, 160, 93, 0, 0, 0, 0, 107, 0, - 109, 0, 0, 142, 118, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, - 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, - 0, 0, 131, 0, 0, 145, 98, 97, 106, 0, - 0, 0, 89, 0, 137, 127, 157, 0, 128, 136, - 110, 149, 132, 156, 188, 164, 147, 163, 78, 146, - 155, 87, 139, 80, 153, 144, 116, 102, 103, 79, - 0, 135, 92, 96, 91, 124, 150, 151, 90, 171, - 83, 162, 82, 84, 161, 123, 148, 154, 117, 114, - 81, 152, 115, 113, 105, 94, 99, 129, 112, 130, - 100, 120, 119, 121, 0, 0, 0, 143, 159, 172, - 0, 0, 165, 166, 167, 168, 0, 0, 0, 122, - 85, 101, 140, 104, 111, 134, 170, 126, 138, 88, - 158, 141, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 125, 0, 77, - 0, 108, 169, 133, 95, 160, 93, 0, 0, 0, - 0, 107, 0, 109, 0, 0, 142, 118, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 187, 0, 0, 0, 0, 131, 0, 0, 145, 98, - 97, 106, 0, 0, 0, 89, 0, 137, 127, 157, - 0, 128, 136, 110, 149, 132, 156, 188, 164, 147, - 163, 78, 146, 155, 87, 139, 80, 153, 144, 116, - 102, 103, 79, 0, 135, 92, 96, 91, 124, 150, - 151, 90, 171, 83, 162, 82, 84, 161, 123, 148, - 154, 117, 114, 81, 152, 115, 113, 105, 94, 99, - 129, 112, 130, 100, 120, 119, 121, 0, 0, 0, - 143, 159, 172, 0, 0, 165, 166, 167, 168, 0, - 0, 0, 122, 85, 101, 140, 104, 111, 134, 170, - 126, 138, 88, 158, 141, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 77, 0, 108, 169, 133, 95, 160, + 70, 0, 0, 58, 0, 0, 53, 0, 0, 78, + 73, 65, 59, 60, 49, 0, 71, 56, 57, 55, + 68, 75, 76, 54, 83, 52, 82, 51, 67, 74, + 79, 66, 63, 50, 77, 64, 62, 0, 72, 80, + 84, 0, 184, 185, 186, 189, 180, 181, 69, 81, + 0, 0, 151, 0, 0, 0, 0, 0, 0, 183, + 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 190, 167, 166, 168, 169, 170, 171, + 172, 0, 0, 173, 174, 175, 0, 0, 0, 0, + 149, 160, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 157, 158, 0, 0, 0, 0, + 188, 0, 159, 0, 161, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 187, 0, 70, 0, + 0, 58, 0, 0, 53, 0, 0, 78, 73, 65, + 59, 60, 49, 0, 71, 56, 57, 55, 68, 75, + 76, 54, 83, 52, 82, 51, 67, 74, 79, 66, + 63, 50, 77, 64, 62, 0, 72, 80, 84, 69, + 184, 185, 186, 189, 180, 181, 0, 81, 0, 0, + 183, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 190, 167, 166, 168, 169, 170, + 171, 172, 0, 0, 173, 174, 175, 0, 0, 0, + 0, 0, 160, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 157, 158, 0, 0, 0, + 0, 188, 0, 159, 0, 161, 0, 0, 0, 69, + 0, 0, 0, 0, 0, 0, 0, 187, 0, 70, + 0, 61, 58, 0, 0, 53, 0, 0, 78, 73, + 65, 59, 60, 49, 47, 71, 56, 57, 55, 68, + 75, 76, 54, 83, 52, 82, 51, 67, 74, 79, + 66, 63, 50, 77, 64, 62, 0, 72, 80, 84, + 0, 184, 185, 186, 189, 180, 181, 0, 81, 0, + 0, 362, 361, 371, 372, 364, 365, 366, 367, 368, + 369, 370, 363, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, + 0, 0, 58, 0, 0, 53, 0, 0, 78, 73, + 65, 59, 60, 49, 0, 71, 56, 57, 55, 68, + 75, 76, 54, 83, 52, 82, 51, 67, 74, 79, + 66, 63, 50, 77, 64, 62, 0, 72, 80, 84, + 69, 0, 0, 484, 0, 0, 0, 0, 81, 0, + 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 47, 0, 127, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 349, 348, 69, 0, 0, 0, 0, 0, 0, 0, + 450, 0, 0, 0, 61, 0, 350, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 0, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 70, 0, 0, 58, 0, 0, 53, 0, 0, 78, + 73, 65, 59, 60, 49, 0, 71, 56, 57, 55, + 68, 75, 76, 54, 83, 52, 82, 51, 67, 74, + 79, 66, 63, 50, 77, 64, 62, 449, 72, 80, + 84, 447, 446, 0, 0, 58, 0, 0, 53, 81, + 0, 78, 73, 65, 59, 60, 49, 0, 71, 56, + 57, 55, 68, 75, 76, 54, 83, 52, 82, 51, + 67, 74, 79, 66, 63, 50, 77, 64, 62, 25, + 72, 80, 84, 0, 0, 0, 0, 0, 0, 0, + 69, 81, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 47, 0, 127, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 97, 0, 96, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 70, 0, 0, 58, 0, 0, 53, 0, 0, 78, + 73, 65, 59, 60, 49, 0, 71, 56, 57, 55, + 68, 75, 76, 54, 83, 52, 82, 51, 67, 74, + 79, 66, 63, 50, 77, 64, 62, 0, 72, 80, + 84, 70, 0, 0, 58, 0, 0, 53, 0, 81, + 78, 73, 65, 59, 60, 49, 0, 71, 56, 57, + 55, 68, 75, 76, 54, 83, 52, 82, 51, 67, + 74, 79, 66, 63, 50, 77, 64, 62, 0, 72, + 80, 84, 69, 0, 0, 0, 0, 0, 0, 0, + 81, 0, 0, 0, 61, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 97, 0, + 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 44, 42, 0, 0, 0, + 0, 45, 70, 0, 0, 58, 0, 0, 53, 0, + 0, 78, 73, 65, 59, 60, 49, 0, 71, 56, + 57, 55, 68, 75, 76, 54, 83, 52, 82, 51, + 67, 74, 79, 66, 63, 50, 77, 64, 62, 0, + 72, 80, 84, 70, 0, 0, 58, 0, 0, 53, + 0, 81, 78, 73, 65, 59, 60, 49, 0, 71, + 56, 57, 55, 68, 75, 76, 54, 83, 52, 82, + 51, 67, 74, 79, 66, 63, 50, 77, 64, 62, + 0, 72, 80, 84, 69, 0, 0, 218, 0, 0, + 0, 0, 81, 0, 0, 0, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, + 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, + 0, 0, 198, 0, 0, 0, 0, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 97, 0, 96, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 70, 0, 0, 58, 0, 0, + 53, 0, 0, 78, 73, 65, 59, 60, 49, 0, + 71, 56, 57, 55, 68, 75, 76, 54, 83, 52, + 82, 51, 67, 74, 79, 66, 63, 50, 77, 64, + 62, 0, 72, 80, 84, 70, 0, 0, 58, 0, + 0, 53, 0, 81, 78, 73, 65, 59, 60, 49, + 0, 71, 56, 57, 55, 68, 75, 76, 54, 83, + 52, 82, 51, 67, 74, 79, 66, 63, 50, 77, + 64, 62, 0, 72, 80, 84, 69, 0, 0, 0, + 0, 0, 0, 0, 81, 0, 0, 0, 61, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 47, 0, 127, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 190, 0, 417, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 70, 0, 0, 58, + 0, 0, 53, 0, 0, 78, 73, 65, 59, 60, + 49, 0, 71, 56, 57, 55, 68, 75, 76, 54, + 83, 52, 82, 51, 67, 74, 79, 66, 63, 50, + 77, 64, 62, 0, 72, 80, 84, 70, 0, 0, + 58, 0, 0, 53, 0, 81, 78, 73, 65, 59, + 60, 49, 0, 71, 56, 57, 55, 68, 75, 76, + 54, 83, 52, 82, 51, 67, 74, 79, 66, 63, + 50, 77, 64, 62, 0, 72, 80, 84, 69, 0, + 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 96, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, + 0, 58, 0, 0, 53, 0, 0, 78, 73, 65, + 59, 60, 49, 0, 71, 56, 57, 55, 68, 75, + 76, 54, 83, 52, 82, 51, 67, 74, 79, 66, + 63, 50, 77, 64, 62, 0, 72, 80, 84, 70, + 0, 0, 58, 0, 0, 53, 0, 81, 78, 73, + 65, 59, 60, 49, 0, 71, 56, 57, 55, 68, + 75, 76, 54, 83, 52, 82, 51, 67, 74, 79, + 66, 63, 50, 77, 64, 62, 0, 72, 80, 84, + 69, 0, 0, 0, 0, 0, 0, 0, 81, 0, + 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 70, 0, 0, 58, 0, 0, 53, 0, 0, 78, + 73, 65, 59, 60, 49, 0, 71, 56, 57, 55, + 68, 75, 76, 54, 83, 52, 82, 51, 67, 74, + 79, 66, 63, 50, 77, 64, 62, 0, 72, 80, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 81, } var yyPact = [...]int{ - 1723, -1000, -186, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 802, 836, -1000, -1000, -1000, -1000, -1000, -1000, 618, - 7335, 41, 62, -18, 10030, 61, 1367, 10699, -1000, -6, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 593, -1000, -1000, - -1000, -1000, -1000, 776, 799, 647, 803, 702, -1000, 5512, - 40, 8914, 9807, 4816, -1000, 484, 59, 10699, -158, 10253, - 34, 34, 34, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 69, -1000, -116, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 436, 457, -1000, -1000, -1000, 338, 3485, 5, + -19, 16, 4001, 4001, -1000, -1000, 335, 115, -1000, -1000, + -1000, -1000, 410, 426, 335, 402, -25, -1000, 3526, 451, + -1000, 3829, -10, -20, -43, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 4001, -36, -36, -15, 450, + 4001, -5, -1000, -1000, -1000, 30, -1000, -1000, -1000, -1000, + -1000, 400, 204, -107, -1000, 2791, 2791, 436, -1000, 335, + -1000, 3698, -1000, 138, 300, 353, -1000, -1000, -1000, 398, + 3354, 3657, 4001, 285, -1000, 871, -1000, -1000, -43, -43, + 4001, 100, -11, 4001, 389, 4001, 4001, -16, -1000, -1000, + 443, 2241, 2377, -1000, -1000, -1000, -1000, 225, -1000, 2791, + 1002, 312, -1000, -1000, -1000, -1000, -1000, 2922, 2922, 2922, + 2922, 2922, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 312, 26, -1000, 2653, + 312, 312, 2791, 312, -1000, -1000, -1000, 312, 312, 312, + -1000, -1000, 310, -1000, 160, 410, 204, 343, 4001, -1000, + -1000, 3870, 3526, 3526, 3526, 3526, -1000, 372, 369, 366, + 367, 4173, -1000, 278, 204, 3354, -1000, -1000, 4001, -1000, + 448, 1329, 3175, 168, -94, -1000, -1000, 313, -1000, 313, + 313, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 313, 313, 313, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 336, 336, 336, 315, 315, 4001, 4001, -1000, 388, -47, + -38, -1000, -1000, -1000, -1000, 4001, 4001, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 51, 10699, -1000, 10699, 33, 481, 33, - 33, 33, 10699, -1000, 101, -1000, -1000, -1000, -1000, 10699, - 478, 733, 22, 2856, 2856, 2856, 2856, 1, 2856, -83, - 655, -1000, -1000, -1000, -1000, 2856, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 364, 739, 6211, 6211, - 802, -1000, 593, -1000, -1000, -1000, 729, -1000, -1000, 243, - 822, -1000, 7112, 99, -1000, 6211, 1819, 429, -1000, -1000, - 429, -1000, -1000, 81, -1000, -1000, 6657, 6657, 6657, 6657, - 6657, 6657, 6657, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 429, -1000, 5979, - 429, 429, 429, 429, 429, 429, 429, 429, 6211, 429, - 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 9584, 587, 874, -1000, -1000, -1000, 767, 8013, - 8691, 10699, 531, -1000, 589, 4571, -121, -1000, -1000, -1000, - 173, 8459, -1000, -1000, -1000, 731, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 326, -1000, -1000, 3133, 23, 2791, 2791, + 148, 2791, 2791, 53, 2922, 146, 86, 2922, 2922, 2922, + 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922, + 2922, 2922, 2922, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 335, -1000, -1000, -1000, -1000, 3002, 808, 2089, 260, + 120, 2653, 2791, 400, 72, 120, 3870, 2377, 2377, 2377, + 2791, -1000, -1000, -1000, -1000, -1000, -1000, 3870, 312, -1000, + 3313, -1000, 292, -1000, 60, -1000, 21, -1000, 353, 354, + 327, -1000, -1000, -1000, -1000, 360, -1000, -1000, -1000, -1000, + -1000, 204, -1000, 436, 2791, 308, 1177, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 334, 383, 47, 198, -1000, + -1000, 379, -1000, 124, -97, -1000, -1000, 170, -1000, -1000, + -1000, -1000, -1000, -1000, 169, -1000, -1000, -1000, 166, -1000, + 347, 357, -1000, 3829, -1000, 4001, 3870, -1000, -1000, 448, + 2377, 3526, -1000, -1000, 3829, 1785, 53, 71, -1000, -1000, + 178, -1000, -1000, 120, 120, 189, -1000, -1000, -1000, -1000, + 146, 2922, 2922, 2922, 2922, 14, 189, 189, 1053, 821, + 226, -1000, 65, 65, 35, 35, 35, 35, 35, 441, + 441, -1000, 204, 2377, 302, 312, 20, -1000, 2791, -1000, + 137, 2377, 125, -1000, 2791, 204, 248, 248, 248, -1000, + 295, 291, -1000, -1000, 2515, 204, 255, -1000, 19, 436, + 3870, 2791, 2089, -1000, -1000, 2791, 316, -1000, -1000, -1000, + 410, 120, 1329, -1000, 1329, 4042, -1000, 184, -1000, -1000, + -91, 22, -1000, -1000, -1000, 223, 294, 253, 4001, 4001, + -1000, -1000, -23, 442, -1000, 293, -1000, -1000, 15, -1000, + -1000, -1000, -1000, 14, 189, 189, 1038, -1000, 2922, 2922, + -1000, 248, 2377, 1937, 120, 912, 283, 64, -1000, 2791, + 75, -1000, -1000, -1000, -1000, 312, -1000, -1000, 333, 3829, + 4042, 410, -1000, 120, -1000, 13, 120, 3829, -1000, 1177, + -1000, 244, -1000, 313, -1000, 39, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 164, -1000, 152, 1633, 1633, 3870, 439, + 425, 1481, -1000, 2922, 189, 189, -1000, 204, -1000, 204, + 313, -1000, 313, 315, 313, -60, 313, -61, 313, 313, + 313, 313, 313, 313, -1000, -112, -1000, 120, 2791, -1000, + 312, -1000, 335, -1000, 12, -1000, -1000, 1937, 196, -1000, + -1000, 4042, -1000, -1000, 382, -1000, 381, 212, 207, -1000, + -1000, -1000, -1000, -1000, -1000, 2791, 2791, -1000, 189, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 477, - -1000, 1856, 472, 2856, 50, 606, 470, 223, 453, 10699, - 10699, 2856, 44, 10699, 757, 653, 10699, 452, 440, -1000, - 4326, -1000, 2856, 2856, 2856, 2856, 2856, 2856, 2856, 2856, - -1000, -1000, -1000, -1000, -1000, -1000, 2856, 2856, -1000, -67, - -1000, 10699, -1000, -1000, -1000, -1000, 831, 130, 525, 95, - 591, -1000, 278, 776, 364, 702, 8236, 665, -1000, -1000, - 10699, -1000, 6211, 6211, 286, -1000, 9360, -1000, -1000, 3346, - 147, 6657, 284, 237, 6657, 6657, 6657, 6657, 6657, 6657, - 6657, 6657, 6657, 6657, 6657, 6657, 6657, 6657, 6657, 327, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 438, -1000, - 593, 725, 725, 113, 113, 113, 113, 113, 113, 6880, - 5048, 364, 437, 180, 5979, 5512, 5512, 6211, 6211, 10476, - 10476, 5512, 769, 203, 180, 10476, -1000, 364, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 5512, 5512, 5512, 5512, 14, - 10699, -1000, 10476, 8914, 8914, 8914, 8914, 8914, -1000, 679, - 678, -1000, 688, 685, 694, 10699, -1000, 433, 8013, 125, - 429, -1000, 9137, -1000, -1000, 14, 568, 8914, 10699, -1000, - -1000, 4081, 589, -121, 581, -1000, -98, -97, 5744, 110, - -1000, -1000, -1000, -1000, 2611, 188, 273, -66, -1000, -1000, - -1000, 595, -1000, 595, 595, 595, 595, -33, -33, -33, - -33, -1000, -1000, -1000, -1000, -1000, 617, 614, -1000, 595, - 595, 595, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 613, 613, - 613, 597, 597, 622, -1000, 10699, -174, 430, 2856, 756, - 2856, -1000, 70, -1000, 10699, -1000, -1000, 10699, 2856, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 208, -1000, -1000, -1000, -1000, 695, - 6211, 6211, 3836, 6211, -1000, -1000, -1000, 739, -1000, 769, - 810, -1000, 722, 720, 5512, -1000, -1000, 147, 156, -1000, - -1000, 328, -1000, -1000, -1000, -1000, 94, 429, -1000, 1907, - -1000, -1000, -1000, -1000, 284, 6657, 6657, 6657, 1409, 1907, - 1872, 405, 357, 113, 612, 612, 112, 112, 112, 112, - 112, 910, 910, -1000, -1000, -1000, 364, -1000, -1000, -1000, - 364, 5512, 582, -1000, -1000, 6211, -1000, 364, 426, 426, - 289, 334, 626, -1000, 91, 619, 426, 5512, 218, -1000, - 6211, 364, -1000, 426, 364, 426, 426, 544, 429, -1000, - 564, -1000, 172, 874, 605, 652, 650, -1000, -1000, -1000, - -1000, 675, -1000, 636, -1000, -1000, -1000, -1000, -1000, 58, - 57, 56, 10253, -1000, 818, 8914, 521, -1000, -1000, 581, - -121, -100, -1000, -1000, -1000, 180, -1000, 428, 530, 2366, - -1000, -1000, -1000, -1000, -1000, -1000, 601, 749, 145, 137, - 427, -1000, -1000, 736, -1000, 238, -69, -1000, -1000, 292, - -33, -33, -1000, -1000, 110, 730, 110, 110, 110, 343, - 343, -1000, -1000, -1000, -1000, 280, -1000, -1000, -1000, 277, - -1000, 637, 10253, 2856, -1000, 3591, -1000, -1000, -1000, -1000, - -1000, -1000, 282, 204, 179, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 13, -1000, 2856, -1000, - 209, 10699, 10699, 709, 180, 180, 79, -1000, -1000, 10699, - -1000, -1000, -1000, -1000, 610, -1000, -1000, -1000, 3101, 5512, - -1000, 1409, 1907, 1606, -1000, 6657, 6657, -1000, -1000, 426, - 5512, 180, -1000, -1000, -1000, 54, 327, 54, 6657, 6657, - 3836, 6657, 6657, -168, 532, 187, -1000, 6211, 307, -1000, - -1000, -1000, -1000, -1000, 635, 10476, 429, -1000, 7790, 10253, - 802, 10476, 6211, 6211, -1000, -1000, 6211, 599, -1000, 6211, - -1000, -1000, -1000, 429, 429, 429, 389, -1000, 802, 521, - -1000, -1000, -1000, -130, -132, -1000, -1000, 2611, -1000, 2611, - 10253, -1000, 367, 350, -1000, -1000, 625, 28, -1000, -1000, - -1000, 423, 110, 110, -1000, 155, -1000, -1000, -1000, 420, - -1000, 416, 526, 410, 10699, -1000, -1000, 516, -1000, 165, - -1000, -1000, 10253, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 10253, 10699, -1000, -1000, -1000, - -1000, -1000, 10253, -1000, -1000, 341, 6211, -1000, -1000, -1000, - 3591, -1000, 818, 8914, -1000, -1000, 364, -1000, 6657, 1907, - 1907, -1000, -1000, 364, 595, 595, -1000, 595, 597, -1000, - 595, -15, 595, -16, 364, 364, 1524, 1728, -1000, 422, - 1553, 429, -165, -1000, 180, 6211, -1000, 732, 490, 498, - -1000, -1000, 5280, 364, 391, 77, 389, 776, -1000, 180, - 180, 180, 10253, 180, 10253, 10253, 10253, 7567, 10253, 776, - -1000, -1000, -1000, -1000, 2366, -1000, 387, -1000, 595, -1000, - -1000, -60, 828, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -33, 340, -33, 259, -1000, 257, - 2856, 3591, 2611, -1000, 594, -1000, -1000, -1000, -1000, 741, - -1000, 180, 815, 513, -1000, 1907, -1000, -1000, 86, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 6657, 6657, - -1000, 6657, 6657, 6657, 364, 322, 180, 748, -1000, 429, - -1000, -1000, 560, 10253, 10253, -1000, -1000, 377, -1000, 371, - 371, 371, 125, -1000, -1000, 107, 10253, -1000, 133, -1000, - -147, 110, -1000, 110, 417, 406, -1000, -1000, -1000, 10253, - 429, 805, 779, -1000, -1000, 1509, 1509, 1509, 1509, 16, - -1000, -1000, 826, -1000, 429, -1000, 593, 73, -1000, 10253, - -1000, -1000, -1000, -1000, -1000, 107, -1000, 347, 160, 317, - -1000, 239, 747, -1000, 738, -1000, -1000, -1000, -1000, -1000, - 363, 12, -1000, 6211, 6211, -1000, -1000, -1000, -1000, 364, - 49, -178, 10476, 498, 364, 10253, -1000, -1000, -1000, 256, - -1000, -1000, -1000, 316, -1000, -1000, 606, 361, -1000, 10253, - 180, 494, -1000, 706, -171, -181, 435, -1000, -1000, -1000, - -1000, -174, -1000, 12, 715, -1000, 705, -1000, -1000, -1000, - 9, -175, 4, -179, 429, -182, 6434, -1000, 1509, 364, - -1000, -1000, + -1000, -1000, -1000, -1000, 204, 181, 120, 291, 204, 4042, + -1000, 3829, -1000, -1000, -1000, -1000, -1000, -1000, 120, 241, + -1000, -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1069, 13, 493, 1068, 1067, 1063, 1059, 1058, 1056, - 1055, 1053, 1052, 1047, 1045, 1044, 1042, 1040, 1039, 1037, - 1036, 1035, 1033, 1032, 104, 1031, 1027, 1026, 57, 1025, - 63, 1024, 1022, 33, 225, 45, 30, 150, 1018, 31, - 54, 84, 1017, 35, 1016, 1014, 70, 1013, 51, 1000, - 999, 1293, 998, 995, 19, 41, 993, 991, 990, 989, - 60, 312, 988, 987, 985, 982, 981, 979, 39, 5, - 7, 12, 11, 978, 127, 15, 976, 55, 975, 974, - 973, 971, 25, 970, 46, 965, 21, 40, 964, 16, - 53, 28, 23, 2, 65, 47, 962, 27, 50, 38, - 961, 958, 367, 948, 944, 942, 940, 936, 934, 140, - 309, 932, 931, 930, 928, 32, 167, 466, 73, 58, - 927, 926, 925, 1239, 59, 52, 22, 924, 36, 1247, - 42, 912, 910, 29, 909, 908, 897, 895, 894, 893, - 892, 264, 890, 889, 887, 17, 20, 882, 881, 49, - 26, 878, 877, 876, 34, 37, 874, 44, 873, 872, - 867, 866, 24, 10, 865, 9, 862, 8, 860, 856, - 4, 853, 18, 852, 3, 851, 6, 43, 850, 847, - 0, 323, 844, 843, 105, + 0, 641, 46, 401, 637, 633, 631, 629, 625, 623, + 616, 614, 612, 609, 606, 451, 605, 603, 600, 55, + 599, 13, 30, 10, 21, 63, 597, 17, 44, 35, + 596, 27, 595, 594, 49, 593, 168, 591, 590, 26, + 588, 581, 568, 564, 558, 516, 556, 555, 552, 550, + 547, 20, 1, 2, 22, 8, 546, 337, 7, 545, + 539, 15, 538, 537, 536, 535, 11, 534, 31, 533, + 28, 520, 517, 38, 16, 515, 110, 57, 512, 32, + 0, 6, 58, 12, 511, 578, 33, 36, 510, 509, + 9, 508, 507, 505, 504, 503, 501, 500, 138, 496, + 495, 494, 34, 3, 493, 490, 488, 40, 487, 18, + 481, 479, 478, 14, 5, 475, 4, 473, 29, 472, + 471, 470, 140, 37, 465, 463, } var yyR1 = [...]int{ - 0, 178, 179, 179, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 6, 3, 4, 4, 5, - 5, 7, 7, 27, 27, 8, 9, 9, 9, 182, - 182, 46, 46, 90, 90, 10, 10, 10, 10, 95, - 95, 99, 99, 99, 100, 100, 100, 100, 131, 131, - 11, 11, 11, 11, 11, 11, 11, 176, 176, 175, - 174, 174, 173, 173, 172, 16, 159, 160, 160, 160, - 155, 134, 134, 134, 134, 137, 137, 135, 135, 135, - 135, 135, 135, 135, 136, 136, 136, 136, 136, 138, - 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 140, - 140, 140, 140, 140, 140, 140, 140, 154, 154, 141, - 141, 149, 149, 150, 150, 150, 147, 147, 148, 148, - 151, 151, 151, 142, 142, 142, 142, 142, 142, 142, - 144, 144, 152, 152, 145, 145, 145, 146, 146, 153, - 153, 153, 153, 153, 143, 143, 156, 156, 168, 168, - 167, 167, 167, 158, 158, 164, 164, 164, 164, 164, - 157, 157, 166, 166, 165, 161, 161, 161, 162, 162, - 162, 163, 163, 163, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 171, 169, 169, 170, 170, 13, - 14, 14, 14, 14, 14, 15, 15, 17, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 107, 107, 104, 104, 105, 105, 106, 106, 106, - 108, 108, 108, 132, 132, 132, 19, 19, 21, 21, - 22, 23, 20, 20, 20, 20, 20, 183, 24, 25, - 25, 26, 26, 26, 30, 30, 30, 28, 28, 29, - 29, 35, 35, 34, 34, 36, 36, 36, 36, 120, - 120, 120, 119, 119, 38, 38, 39, 39, 40, 40, - 41, 41, 41, 53, 53, 89, 89, 91, 91, 42, - 42, 42, 42, 43, 43, 44, 44, 45, 45, 127, - 127, 126, 126, 126, 125, 125, 47, 47, 47, 49, - 48, 48, 48, 48, 50, 50, 52, 52, 51, 51, - 54, 54, 54, 54, 55, 55, 37, 37, 37, 37, - 37, 37, 37, 103, 103, 57, 57, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 67, 67, 67, - 67, 67, 67, 58, 58, 58, 58, 58, 58, 58, - 33, 33, 68, 68, 68, 74, 69, 69, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 65, - 65, 65, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, - 64, 64, 64, 64, 64, 184, 184, 66, 66, 66, - 66, 31, 31, 31, 31, 31, 130, 130, 133, 133, - 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, - 133, 78, 78, 32, 32, 76, 76, 77, 79, 79, - 75, 75, 75, 60, 60, 60, 60, 60, 60, 60, - 60, 62, 62, 62, 80, 80, 81, 81, 82, 82, - 83, 83, 84, 85, 85, 85, 86, 86, 86, 86, - 87, 87, 87, 59, 59, 59, 59, 59, 59, 88, - 88, 88, 88, 92, 92, 70, 70, 72, 72, 71, - 73, 93, 93, 97, 94, 94, 98, 98, 98, 96, - 96, 96, 122, 122, 122, 101, 101, 109, 109, 110, - 110, 102, 102, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 111, 112, 112, 112, 113, 113, 114, 114, - 114, 121, 121, 117, 117, 118, 118, 123, 123, 124, - 124, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 180, 181, 128, 129, 129, 129, + 0, 120, 121, 121, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, + 5, 6, 6, 18, 18, 18, 7, 8, 9, 9, + 9, 12, 110, 111, 111, 111, 107, 92, 92, 92, + 95, 95, 93, 93, 93, 93, 93, 93, 94, 94, + 94, 94, 94, 96, 96, 96, 96, 96, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 98, 98, + 102, 102, 103, 103, 103, 100, 100, 101, 101, 104, + 104, 104, 99, 99, 99, 99, 99, 99, 105, 105, + 106, 106, 106, 106, 106, 108, 115, 115, 115, 115, + 109, 109, 117, 117, 116, 112, 112, 112, 113, 113, + 113, 114, 114, 114, 10, 10, 10, 118, 118, 11, + 11, 13, 13, 13, 13, 13, 119, 119, 14, 14, + 14, 125, 15, 16, 16, 17, 17, 19, 19, 23, + 23, 22, 22, 24, 24, 24, 24, 84, 84, 84, + 83, 83, 26, 27, 27, 28, 28, 29, 29, 29, + 29, 38, 72, 72, 30, 30, 30, 31, 31, 32, + 32, 89, 89, 88, 88, 88, 87, 87, 33, 33, + 33, 34, 34, 35, 35, 37, 37, 36, 36, 39, + 39, 25, 25, 25, 25, 25, 25, 41, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 50, 50, 50, 50, 50, 50, 42, 42, 42, + 42, 42, 42, 42, 21, 21, 51, 51, 51, 57, + 52, 52, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 48, 48, + 48, 46, 46, 46, 46, 47, 47, 47, 49, 49, + 49, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 62, 62, + 20, 20, 60, 60, 61, 63, 63, 58, 58, 58, + 59, 59, 59, 44, 44, 44, 44, 44, 44, 44, + 44, 64, 64, 65, 65, 66, 66, 67, 67, 68, + 69, 69, 69, 70, 70, 70, 70, 43, 43, 43, + 43, 43, 43, 71, 71, 71, 71, 53, 53, 55, + 55, 54, 56, 73, 73, 74, 76, 76, 77, 77, + 75, 75, 78, 78, 78, 81, 81, 82, 82, 85, + 85, 86, 86, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 122, 123, 124, 90, 90, 90, } var yyR2 = [...]int{ 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 4, 6, 7, 5, 10, 1, 3, 1, - 3, 7, 8, 1, 1, 8, 8, 7, 6, 1, - 1, 1, 3, 0, 4, 3, 4, 5, 4, 1, - 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, - 2, 8, 4, 6, 5, 5, 5, 0, 2, 1, - 0, 2, 1, 3, 3, 4, 4, 1, 3, 3, - 8, 3, 1, 1, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, - 2, 2, 2, 1, 4, 4, 2, 2, 3, 3, - 3, 3, 1, 1, 1, 1, 1, 6, 6, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 0, - 3, 0, 5, 0, 3, 5, 0, 1, 0, 1, - 0, 1, 2, 0, 2, 2, 2, 2, 2, 2, - 0, 3, 0, 1, 0, 3, 3, 0, 2, 0, - 2, 1, 2, 1, 0, 2, 5, 4, 1, 2, - 2, 3, 2, 0, 1, 2, 3, 3, 2, 2, + 1, 1, 1, 3, 5, 8, 4, 1, 3, 1, + 3, 5, 6, 1, 1, 3, 8, 7, 2, 8, + 8, 4, 4, 1, 3, 3, 6, 3, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, + 0, 5, 0, 3, 5, 0, 1, 0, 1, 0, + 1, 2, 0, 2, 2, 2, 2, 2, 0, 1, + 0, 2, 1, 2, 1, 4, 2, 3, 2, 2, 1, 1, 1, 3, 2, 0, 1, 3, 1, 2, - 3, 1, 1, 1, 6, 7, 7, 12, 7, 7, - 7, 4, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 7, 1, 3, 8, 8, 5, - 4, 6, 5, 4, 4, 3, 2, 3, 4, 4, - 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, - 4, 3, 6, 4, 2, 4, 2, 2, 2, 2, - 3, 1, 1, 0, 1, 0, 1, 0, 2, 2, - 0, 2, 2, 0, 1, 1, 2, 1, 1, 2, - 1, 1, 2, 2, 2, 2, 2, 0, 2, 0, - 2, 1, 2, 2, 0, 1, 1, 0, 1, 0, - 1, 0, 1, 1, 3, 1, 2, 3, 5, 0, - 1, 2, 1, 1, 0, 2, 1, 3, 1, 1, - 1, 3, 3, 3, 7, 1, 3, 1, 3, 4, - 4, 4, 3, 2, 4, 0, 1, 0, 2, 0, - 1, 0, 1, 2, 1, 1, 1, 2, 2, 1, - 2, 3, 2, 3, 2, 2, 2, 1, 1, 3, - 0, 5, 5, 5, 0, 2, 1, 3, 3, 2, - 3, 1, 2, 0, 3, 1, 1, 3, 3, 4, - 4, 5, 3, 4, 5, 6, 2, 1, 2, 1, - 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 1, 1, 1, 3, 1, 3, 1, 1, - 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, - 2, 2, 2, 2, 3, 1, 1, 1, 1, 4, - 5, 6, 4, 4, 6, 6, 6, 6, 8, 8, - 6, 8, 8, 9, 7, 5, 4, 2, 2, 2, - 2, 2, 2, 2, 2, 0, 2, 4, 4, 4, - 4, 0, 3, 4, 7, 3, 1, 1, 2, 3, - 3, 1, 2, 2, 1, 2, 1, 2, 2, 1, - 2, 0, 1, 0, 2, 1, 2, 4, 0, 2, + 3, 1, 1, 1, 6, 6, 8, 0, 1, 4, + 4, 4, 5, 3, 3, 5, 0, 1, 2, 2, + 2, 0, 2, 0, 2, 1, 2, 0, 1, 0, + 1, 1, 3, 1, 2, 3, 5, 0, 1, 2, + 1, 1, 2, 1, 3, 1, 1, 1, 1, 3, + 3, 2, 1, 3, 4, 4, 3, 2, 4, 0, + 1, 0, 1, 0, 1, 2, 1, 1, 1, 2, + 2, 2, 3, 2, 2, 2, 1, 1, 3, 0, + 2, 1, 3, 3, 2, 3, 1, 1, 1, 3, + 3, 4, 4, 5, 3, 4, 3, 4, 5, 6, + 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 0, 2, 1, 1, 1, 3, + 1, 3, 1, 1, 1, 1, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 2, 2, 2, 3, 1, 1, 1, 1, 4, 5, + 6, 6, 7, 5, 4, 1, 1, 1, 4, 4, + 4, 2, 1, 2, 2, 2, 1, 2, 2, 1, + 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, + 0, 2, 1, 2, 4, 0, 2, 1, 3, 5, 1, 3, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 0, 3, 0, 2, 0, 3, - 1, 3, 2, 0, 1, 1, 0, 2, 4, 4, - 0, 2, 4, 2, 1, 3, 5, 4, 6, 1, - 3, 3, 5, 0, 5, 1, 3, 1, 2, 3, - 1, 1, 3, 3, 1, 3, 3, 3, 3, 1, - 2, 1, 1, 1, 1, 1, 1, 0, 2, 0, - 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, - 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 3, 0, 2, 0, 3, 1, 3, 2, + 0, 1, 1, 0, 2, 4, 4, 2, 1, 3, + 5, 4, 6, 1, 3, 3, 5, 1, 3, 1, + 2, 3, 1, 1, 3, 3, 0, 2, 0, 3, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2059,317 +1084,196 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, } var yyChk = [...]int{ - -1000, -178, -1, -2, -6, -7, -8, -9, -10, -11, - -12, -13, -14, -15, -17, -18, -19, -21, -22, -23, - -20, -3, -4, 6, 7, -27, 9, 10, 30, -16, - 112, 113, 115, 114, 140, 116, 133, 49, 152, 153, - 155, 156, 25, 134, 135, 138, 139, -180, 8, 235, - 53, -179, 250, -82, 15, -26, 5, -24, -183, -24, - -24, -24, -24, -24, -159, 53, -114, 121, 70, 148, - 227, 118, 119, 125, -117, 56, -116, 243, 152, 163, - 157, 184, 176, 174, 177, 214, 65, 155, 223, 136, - 172, 168, 166, 27, 189, 248, 167, 131, 130, 190, - 194, 215, 161, 162, 217, 188, 132, 32, 245, 34, - 144, 218, 192, 187, 183, 186, 160, 182, 38, 196, - 195, 197, 213, 179, 169, 18, 221, 139, 142, 191, - 193, 126, 146, 247, 219, 165, 143, 138, 222, 156, - 216, 225, 37, 201, 159, 129, 153, 150, 180, 145, - 170, 171, 185, 158, 181, 154, 147, 140, 224, 202, - 249, 178, 175, 151, 149, 206, 207, 208, 209, 246, - 220, 173, 203, -102, 121, 123, 119, 119, 120, 121, - 227, 118, 119, -51, -123, 56, -116, 121, 148, 119, - 106, 177, 112, 204, 120, 32, 146, -132, 119, -104, - 149, 206, 207, 208, 209, 56, 216, 215, 210, -123, - 154, -128, -128, -128, -128, -128, -2, -86, 17, 16, - -5, -3, -180, 6, 20, 21, -30, 39, 40, -25, - -36, 97, -37, -123, -56, 72, -61, 29, 56, -116, - 23, -60, -57, -75, -73, -74, 106, 107, 95, 96, - 103, 73, 108, -65, -63, -64, -66, 58, 57, 66, - 59, 60, 61, 62, 67, 68, 69, -117, -71, -180, - 43, 44, 236, 237, 238, 239, 242, 240, 75, 33, - 226, 234, 233, 232, 230, 231, 228, 229, 124, 227, - 101, 235, -102, -39, -40, -41, -42, -53, -74, -180, - -51, 11, -46, -51, -94, -131, 154, -98, 216, 215, - -118, -96, -117, -115, 214, 177, 213, 117, 71, 22, - 24, 199, 74, 106, 16, 75, 105, 236, 112, 47, - 228, 229, 226, 238, 239, 227, 204, 29, 10, 25, - 134, 21, 99, 114, 78, 79, 137, 23, 135, 69, - 19, 50, 11, 13, 14, 124, 123, 90, 120, 45, - 8, 108, 26, 87, 41, 28, 43, 88, 17, 230, - 231, 31, 242, 141, 101, 48, 35, 72, 67, 51, - 70, 15, 46, 89, 115, 235, 44, 118, 6, 241, - 30, 133, 42, 119, 205, 77, 122, 68, 5, 125, - 9, 49, 52, 232, 233, 234, 33, 76, 12, -160, - -155, 56, 120, -51, 235, -117, -110, 124, -110, -110, - 119, -51, -51, -109, 124, 56, -109, -109, -109, -51, - 109, -51, 56, 30, 227, 56, 146, 119, 147, 121, - -129, -180, -118, -129, -129, -129, 150, 151, -129, -105, - 211, 51, -129, -181, 55, -87, 19, 31, -37, -123, - -83, -84, -37, -82, -2, -24, 35, -28, 21, 64, - 11, -120, 71, 70, 87, -119, 22, -117, 58, 109, - -37, -58, 90, 72, 88, 89, 74, 92, 91, 102, - 95, 96, 97, 98, 99, 100, 101, 93, 94, 105, - 80, 81, 82, 83, 84, 85, 86, -103, -180, -74, - -180, 110, 111, -61, -61, -61, -61, -61, -61, -61, - -180, -2, -69, -37, -180, -180, -180, -180, -180, -180, - -180, -180, -180, -78, -37, -180, -184, -180, -184, -184, - -184, -184, -184, -184, -184, -180, -180, -180, -180, -52, - 26, -51, 30, 54, -47, -49, -48, -50, 41, 45, - 47, 42, 43, 44, 48, -127, 22, -39, -180, -126, - 142, -125, 22, -123, 58, -51, -46, -182, 54, 11, - 52, 54, -94, 154, -95, -99, 217, 219, 80, -122, - -117, 58, 29, 30, 55, 54, -134, -137, -139, -138, - -140, -135, -136, 174, 175, 106, 178, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 30, 136, 170, - 171, 172, 173, 190, 191, 192, 193, 194, 195, 196, - 197, 157, 158, 159, 160, 161, 162, 163, 165, 166, - 167, 168, 169, 56, -129, 121, -176, 52, 56, 72, - 56, -51, -51, -129, 122, -51, 23, 51, -51, 56, - 56, -124, -123, -115, -129, -129, -129, -129, -129, -129, - -129, -129, -129, -129, -107, 205, 212, -51, 9, 90, - 54, 18, 109, 54, -85, 24, 25, -86, -181, -30, - -62, -117, 59, 62, -29, 42, -51, -37, -37, -67, - 67, 72, 68, 69, -119, 97, -124, -118, -115, -61, - -68, -71, -74, 63, 90, 88, 89, 74, -61, -61, - -61, -61, -61, -61, -61, -61, -61, -61, -61, -61, - -61, -61, -61, -130, 56, 58, 56, -60, -60, -117, - -35, 21, -34, -36, -181, 54, -181, -2, -34, -34, - -37, -37, -75, -117, -123, -75, -34, -28, -76, -77, - 76, -75, -181, -34, -35, -34, -34, -90, 142, -51, - -93, -97, -75, -40, -41, -41, -40, -41, 41, 41, - 41, 46, 41, 46, 41, -48, -123, -181, -54, 49, - 123, 50, -180, -125, -90, 52, -39, -51, -98, -95, - 54, 218, 220, 221, 51, -37, -146, 105, -161, -162, - -163, -118, 58, 59, -155, -156, -164, 126, 129, 125, - -157, 120, 28, -151, 67, 72, -147, 202, -141, 53, - -141, -141, -141, -141, -145, 177, -145, -145, -145, 53, - 53, -141, -141, -141, -149, 53, -149, -149, -150, 53, - -150, -121, 52, -51, -174, 246, -175, 56, -129, 23, - -129, -111, 117, 114, 115, -171, 113, 199, 177, 65, - 29, 15, 236, 142, 249, 56, 143, -51, -51, -129, - -106, 11, 90, 37, -37, -37, -124, -84, -87, -101, - 19, 11, 33, 33, -34, 67, 68, 69, 109, -180, - -68, -61, -61, -61, -33, 137, 71, -181, -181, -34, - 54, -37, -181, -181, -181, 54, 52, 22, 54, 11, - 109, 54, 11, -181, -34, -79, -77, 78, -37, -181, - -181, -181, -181, -181, -59, 30, 33, -2, -180, -180, - -55, 54, 12, 80, -44, -43, 51, 52, -45, 51, - -43, 41, 41, 120, 120, 120, -91, -117, -55, -39, - -55, -99, -100, 222, 219, 225, 56, 54, -163, 80, - 53, 28, -157, -157, 56, 56, -142, 29, 67, -148, - 203, 59, -145, -145, -146, 30, -146, -146, -146, -154, - 58, -154, 59, 59, 51, -117, -129, -173, -172, -118, - -128, -177, 148, 127, 128, 131, 130, 56, 120, 28, - 126, 129, 142, 125, -177, 148, -112, -113, 122, 22, - 120, 28, 142, -129, -108, 88, 12, -123, -123, 38, - 109, -51, -38, 11, 97, -118, -35, -33, 71, -61, - -61, -181, -36, -133, 106, 174, 136, 172, 168, 188, - 179, 201, 170, 202, -130, -133, -61, -61, -118, -61, - -61, 243, -82, 79, -37, 77, -92, 51, -93, -70, - -72, -71, -180, -2, -88, -117, -91, -82, -97, -37, - -37, -37, 53, -37, -180, -180, -180, -181, 54, -82, - -55, 219, 223, 224, -162, -163, -166, -165, -117, 56, - 56, -144, 51, 58, 59, 60, 67, 226, 66, 55, - -146, -146, 56, 106, 55, 54, 55, 54, 55, 54, - -51, 54, 80, -128, -117, -128, -117, -51, -128, -117, - 58, -37, -55, -39, -181, -61, -181, -141, -141, -141, - -150, -141, 162, -141, 162, -181, -181, -181, 54, 19, - -181, 54, 19, -180, -32, 241, -37, 27, -92, 54, - -181, -181, -181, 54, 109, -181, -86, -89, -117, -89, - -89, -89, -126, -117, -86, 55, 54, -141, -152, 199, - 9, -145, 58, -145, 59, 59, -129, -172, -163, 53, - 26, -80, 13, -145, 56, -61, -61, -61, -61, -61, - -181, 58, 28, -72, 33, -2, -180, -117, -117, 54, - 55, -181, -181, -181, -54, -168, -167, 52, 132, 65, - -165, -153, 126, 28, 125, 226, -146, -146, 55, 55, - -89, -180, -81, 14, 16, -181, -181, -181, -181, -31, - 90, 246, 9, -70, -2, 109, -117, -167, 56, -158, - 80, 58, -143, 65, 28, 28, 55, -169, -170, 142, - -37, -69, -181, 244, 48, 247, -93, -181, -117, 59, - 58, -176, -181, 54, -117, 38, 245, 248, -174, -170, - 33, 38, 144, 246, 145, 247, -180, 248, -61, 141, - -181, -181, + -1000, -120, -1, -2, -6, -7, -8, -9, -10, -11, + -13, -14, -3, -4, -18, 8, 9, -12, 95, 96, + 97, 111, 23, 112, 115, 6, -122, 7, 152, 39, + -121, 157, -66, 14, -17, 5, -15, -125, -15, -15, + -110, 39, 101, -78, 100, 106, -81, 42, -80, 121, + 140, 134, 132, 113, 130, 126, 124, 125, 110, 119, + 120, 29, 143, 139, 142, 118, 138, 135, 127, 17, + 107, 123, 145, 117, 136, 128, 129, 141, 116, 137, + 146, 156, 133, 131, 147, 100, 100, 102, 95, 102, + 100, -119, 55, -36, -87, -85, 44, 42, -80, -36, + -124, -15, -2, 57, -70, 16, 15, -5, -3, -122, + 18, -75, 104, -16, -27, -28, -29, -30, -38, -57, + -122, -36, 10, -111, -107, -83, -81, 44, 100, 102, + -77, 105, -36, -76, 105, -76, 100, 10, -36, 148, + 56, 94, -19, 19, -123, 41, 152, -25, -40, 59, + -45, 21, -44, -41, -59, -56, -57, 83, 84, 91, + 60, 93, -48, -46, -47, -49, 44, 43, 45, 46, + 47, 48, 49, 52, 53, 54, -81, -85, -54, -122, + 153, 154, 62, 28, 149, 150, 151, 105, 89, 152, + 42, -80, -67, -68, -25, -66, -2, -37, 24, -36, + 51, 27, 40, -33, -34, -35, 30, 33, 35, 31, + 36, -89, 20, -27, -2, -122, -88, -87, 20, -85, + -36, 41, 40, -92, -95, -97, -96, -93, -94, 132, + 133, 136, 137, 138, 139, 140, 141, 142, 143, 113, + 128, 129, 130, 131, 116, 117, 118, 119, 120, 121, + 123, 124, 125, 126, 127, -77, -77, -36, 59, 99, + 98, -36, 21, -36, -36, 100, 10, -86, -85, -79, + 99, 58, 20, 22, 144, 61, 15, 62, 95, 35, + 150, 151, 149, 26, 9, 23, 112, 19, 87, 97, + 65, 66, 114, 21, 54, 10, 12, 13, 105, 104, + 77, 102, 33, 7, 93, 24, 73, 30, 25, 31, + 74, 16, 76, 89, 36, 59, 52, 37, 57, 14, + 34, 75, 98, 152, 32, 6, 155, 27, 111, 100, + 148, 64, 103, 53, 5, 106, 8, 38, 28, 101, + 63, 11, 115, -22, -24, 85, -25, -85, 58, 57, + 73, 40, 17, -25, -42, 77, 59, 74, 75, 76, + 61, 80, 79, 90, 83, 84, 85, 86, 87, 88, + 89, 81, 82, 67, 68, 69, 70, 71, 72, 78, + -57, -122, -45, -45, -45, -45, -45, -122, 94, -52, + -25, -122, -122, -122, -62, -25, -122, -122, -122, -122, + 40, -69, 22, 23, -70, -123, -43, 27, 28, -2, + -122, -36, -73, -74, -58, -83, -87, 44, -28, -29, + -28, -29, 30, 30, 30, 34, 30, -34, -85, -123, + -123, -2, -87, -39, 11, -112, -113, -114, -82, 44, + 45, -81, -79, -107, -108, -115, 107, 106, -109, 102, + 25, -104, 52, 59, -100, 146, -98, 39, -98, -98, + -98, -98, -98, -102, 39, -102, -102, -103, 39, -103, + -36, -36, 21, -118, 108, 103, -118, -36, -36, -26, + 40, 10, -84, -83, 20, 94, -25, -25, -50, 52, + 59, 53, 54, -25, -25, -45, -51, -54, -57, 50, + 77, 74, 75, 76, 61, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -81, -23, 19, -22, -82, -86, -79, 40, -123, + -25, -19, -60, -61, 63, -58, -22, -22, -22, -68, + -73, -53, -55, -54, -122, -2, -71, -83, -81, -39, + 40, 67, 94, -32, -31, 37, 38, -31, 30, -123, + -66, -25, 40, -114, 67, 39, 25, -109, 42, 42, + -99, 26, 52, -101, 147, 45, 45, 45, 38, 37, + -107, -36, -58, -39, -24, -27, -83, 85, -86, 52, + 53, 54, -51, -45, -45, -45, -45, -21, 114, 58, + -123, -22, -122, 94, -25, 20, -22, -63, -61, 65, + -25, -123, -123, -123, -123, 40, -123, -123, -123, 40, + 94, -66, -74, -25, -82, -86, -25, 39, -70, -113, + -114, -117, -116, -81, 42, -105, 144, 44, 45, 46, + 52, 149, 41, 40, 41, 40, -36, -36, 103, -64, + 12, 94, -21, 58, -45, -45, -123, -23, -82, -91, + 132, 113, 130, 126, 135, 145, 128, 146, 129, 119, + 116, 117, 118, 121, 44, -66, 66, -25, 64, -55, + 28, -2, -122, -83, -81, -81, -70, 94, -72, -83, + 41, 40, -98, -106, 107, 25, 106, 45, 45, -90, + -122, -82, -90, -58, -65, 13, 15, 85, -45, -123, + -123, -98, -98, -103, -98, 120, -98, 120, -98, -98, + -98, -98, -98, -98, -20, 155, -25, -53, -2, 94, + -82, 40, 41, -116, 25, 25, 41, 41, -25, -52, + -123, 44, -123, -81, -83, } var yyDef = [...]int{ 0, -2, 2, -2, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 508, 0, 277, 277, 277, 277, 277, 277, 0, - 578, 561, 0, 0, 0, 0, -2, 267, 268, 0, - 270, 271, 783, 783, 783, 783, 783, 0, 33, 34, - 781, 1, 3, 516, 0, 0, 281, 284, 279, 0, - 561, 0, 0, 0, 60, 0, 0, 770, 0, 771, - 559, 559, 559, 579, 580, 583, 584, 683, 684, 685, - 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, - 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, - 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, - 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, - 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, - 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, - 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, - 766, 767, 768, 769, 772, 773, 774, 775, 776, 777, - 778, 779, 780, 0, 0, 562, 0, 557, 0, 557, - 557, 557, 0, 226, 348, 587, 588, 770, 771, 0, - 0, 0, 0, 784, 784, 784, 784, 0, 784, 255, - 244, 246, 247, 248, 249, 784, 264, 265, 254, 266, - 269, 272, 273, 274, 275, 276, 27, 520, 0, 0, - 508, 29, 0, 277, 282, 283, 287, 285, 286, 278, - 0, 295, 299, 0, 356, 0, 361, 363, -2, -2, - 0, 398, 399, 400, 401, 402, 0, 0, 0, 0, - 0, 0, 0, 425, 426, 427, 428, 493, 494, 495, - 496, 497, 498, 499, 500, 365, 366, 490, 540, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 481, 0, - 455, 455, 455, 455, 455, 455, 455, 455, 0, 0, - 0, 0, 0, 0, 306, 308, 309, 310, 329, 0, - 331, 0, 0, 41, 45, 0, 761, 544, -2, -2, - 0, 0, 585, 586, -2, 690, -2, 591, 592, 593, - 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, - 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, - 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, - 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 675, 676, 677, 678, 679, 680, 681, 682, 0, - 77, 0, 0, 784, 0, 67, 0, 0, 0, 0, - 0, 784, 0, 0, 0, 0, 0, 0, 0, 225, - 0, 227, 784, 784, 784, 784, 784, 784, 784, 784, - 236, 785, 786, 237, 238, 239, 784, 784, 241, 0, - 256, 0, 250, 28, 782, 22, 0, 0, 517, 0, - 509, 510, 513, 516, 27, 284, 0, 289, 288, 280, - 0, 296, 0, 0, 0, 300, 0, 302, 303, 0, - 359, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 383, 384, 385, 386, 387, 388, 389, 362, 0, 376, - 0, 0, 0, 418, 419, 420, 421, 422, 423, 0, - 291, 27, 0, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 287, 0, 482, 0, 447, 0, 448, 449, - 450, 451, 452, 453, 454, 0, 291, 0, 0, 43, - 0, 347, 0, 0, 0, 0, 0, 0, 336, 0, - 0, 339, 0, 0, 0, 0, 330, 0, 0, 350, - 734, 332, 0, 334, 335, -2, 0, 0, 0, 39, - 40, 0, 46, 761, 48, 49, 0, 0, 0, 157, - 552, 553, 554, 550, 185, 0, 140, 136, 82, 83, - 84, 129, 86, 129, 129, 129, 129, 154, 154, 154, - 154, 112, 113, 114, 115, 116, 0, 0, 99, 129, - 129, 129, 103, 119, 120, 121, 122, 123, 124, 125, - 126, 87, 88, 89, 90, 91, 92, 93, 131, 131, - 131, 133, 133, 581, 62, 0, 70, 0, 784, 0, - 784, 75, 0, 201, 0, 220, 558, 0, 784, 223, - 224, 349, 589, 590, 228, 229, 230, 231, 232, 233, - 234, 235, 240, 243, 257, 251, 252, 245, 521, 0, - 0, 0, 0, 0, 512, 514, 515, 520, 30, 287, - 0, 501, 0, 0, 0, 290, 25, 357, 358, 360, - 377, 0, 379, 381, 301, 297, 0, 491, -2, 367, - 368, 392, 393, 394, 0, 0, 0, 0, 390, 372, - 0, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 417, 466, 467, 0, 415, 416, 424, - 0, 0, 292, 293, 395, 0, 539, 27, 0, 0, - 0, 0, 0, 490, 0, 0, 0, 0, 488, 485, - 0, 0, 456, 0, 0, 0, 0, 0, 0, 346, - 354, 541, 0, 307, 325, 327, 0, 322, 337, 338, - 340, 0, 342, 0, 344, 345, 311, 312, 313, 0, - 0, 0, 0, 333, 354, 0, 354, 42, 545, 47, - 0, 0, 52, 53, 546, 547, 548, 0, 76, 186, - 188, 191, 192, 193, 78, 79, 0, 0, 0, 0, - 0, 180, 181, 143, 141, 0, 138, 137, 85, 0, - 154, 154, 106, 107, 157, 0, 157, 157, 157, 0, - 0, 100, 101, 102, 94, 0, 95, 96, 97, 0, - 98, 0, 0, 784, 64, 0, 68, 69, 65, 560, - 66, 783, 0, 0, 573, 202, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 0, 219, 784, 222, - 260, 0, 0, 0, 518, 519, 0, 511, 23, 0, - 555, 556, 502, 503, 304, 378, 380, 382, 0, 291, - 369, 390, 373, 0, 370, 0, 0, 364, 429, 0, - 0, 397, -2, 432, 433, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 508, 0, 486, 0, 0, 446, - 457, 458, 459, 460, 533, 0, 0, -2, 0, 0, - 508, 0, 0, 0, 319, 326, 0, 0, 320, 0, - 321, 341, 343, 0, 0, 0, 0, 317, 508, 354, - 38, 50, 51, 0, 0, 57, 158, 0, 189, 0, - 0, 175, 0, 0, 178, 179, 150, 0, 142, 81, - 139, 0, 157, 157, 108, 0, 109, 110, 111, 0, - 127, 0, 0, 0, 0, 582, 63, 71, 72, 0, - 194, 783, 0, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 783, 0, 0, 783, 574, 575, - 576, 577, 0, 221, 242, 0, 0, 258, 259, 522, - 0, 24, 354, 0, 298, 492, 0, 371, 0, 391, - 374, 430, 294, 0, 129, 129, 471, 129, 133, 474, - 129, 476, 129, 479, 0, 0, 0, 0, 491, 0, - 0, 0, 483, 445, 489, 0, 31, 0, 533, 523, - 535, 537, 0, 27, 0, 529, 0, 516, 542, 355, - 543, 323, 0, 328, 0, 0, 0, 331, 0, 516, - 37, 54, 55, 56, 187, 190, 0, 182, 129, 176, - 177, 152, 0, 144, 145, 146, 147, 148, 149, 130, - 104, 105, 155, 156, 154, 0, 154, 0, 134, 0, - 784, 0, 0, 195, 0, 196, 198, 199, 200, 0, - 261, 262, 504, 305, 431, 375, 434, 468, 154, 472, - 473, 475, 477, 478, 480, 436, 435, 437, 0, 0, - 440, 0, 0, 0, 0, 0, 487, 0, 32, 0, - 538, -2, 0, 0, 0, 44, 35, 0, 315, 0, - 0, 0, 350, 318, 36, 167, 0, 184, 159, 153, - 0, 157, 128, 157, 0, 0, 61, 73, 74, 0, - 0, 506, 0, 469, 470, 0, 0, 0, 0, 461, - 444, 484, 0, 536, 0, -2, 0, 531, 530, 0, - 324, 351, 352, 353, 314, 166, 168, 0, 173, 0, - 183, 164, 0, 161, 163, 151, 117, 118, 132, 135, - 0, 0, 26, 0, 0, 438, 439, 441, 442, 0, - 0, 0, 0, 526, 27, 0, 316, 169, 170, 0, - 174, 172, 80, 0, 160, 162, 67, 0, 215, 0, - 507, 505, 443, 0, 0, 0, 534, -2, 532, 171, - 165, 70, 214, 0, 0, 462, 0, 465, 197, 216, - 0, 463, 0, 0, 0, 0, 0, 464, 0, 0, - 217, 218, + 11, 12, 315, 0, 131, 131, 131, 0, 352, 0, + 0, 126, 0, 0, 474, 131, 0, 23, 24, 472, + 1, 3, 323, 0, 0, 135, 350, 133, 0, 0, + 28, 0, 0, 0, 348, 353, 354, 355, 356, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 0, 346, 346, 0, 0, + 0, 0, 127, 128, 187, 176, 177, 359, 360, 129, + 130, 137, 17, 0, 13, 0, 0, 315, 19, 0, + 136, 0, 351, 132, 0, 153, 155, 156, 157, -2, + 0, 173, 0, 0, 33, 0, 150, 151, 348, 348, + 0, 0, 0, 0, 0, 0, 0, 0, 123, 124, + 0, 0, 0, 138, 18, 473, 25, 324, 191, 0, + 196, 0, 232, 233, 234, 235, 236, 0, 0, 0, + 0, 0, 254, 255, 256, 257, 303, 304, 305, 306, + 307, 308, 309, 310, 197, 198, 300, 0, 342, 0, + 0, 0, 288, 0, 265, 266, 267, 0, 0, 0, + -2, -2, 316, 317, 320, 323, 17, 0, 0, 186, + 134, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 172, 0, 17, 0, 161, 174, 0, 176, + 189, 105, 0, 79, 75, 38, 39, 68, 41, 68, + 68, 60, 61, 62, 63, 64, 65, 66, 67, 53, + 68, 68, 68, 57, 42, 43, 44, 45, 46, 47, + 70, 70, 70, 72, 72, 0, 0, 31, 0, 117, + 117, 119, 347, 120, 121, 0, 0, 188, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 16, 141, 143, 147, 0, 0, 0, + 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 217, 218, 219, 220, 221, 222, 223, + 210, 0, 249, 250, 251, 252, 0, 139, 0, 0, + 230, 0, 0, 137, 0, 289, 0, 0, 0, 0, + 0, 319, 321, 322, 14, 20, 21, 0, 0, -2, + 0, 185, 189, 343, 0, 297, 0, -2, 154, 169, + 0, 166, 179, 180, 181, 0, 183, 184, 159, 160, + 229, 17, 175, 315, 0, 32, 106, 108, 111, 112, + 113, 357, 358, 34, 35, 0, 457, 0, 0, 100, + 101, 82, 80, 0, 77, 76, 40, 0, 58, 59, + 54, 55, 56, 48, 0, 49, 50, 51, 0, 52, + 0, 0, 349, 0, 118, 0, 0, 122, 125, 189, + 0, 0, 144, 148, 0, 0, 192, 193, 195, 211, + 0, 213, 215, 325, 326, 199, 200, 226, 227, 228, + 0, 0, 0, 0, 0, 224, 204, 206, 0, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 253, 0, 0, 140, 301, 0, -2, 0, 341, + 0, 0, 295, 292, 0, 0, 0, 0, 0, 318, + 22, 327, 337, 339, 0, 17, 0, 333, 150, 315, + 0, 0, 0, 164, 170, 0, 0, 165, 182, -2, + 323, 190, 0, 109, 0, 0, 96, 0, 98, 99, + 88, 0, 81, 37, 78, 0, 0, 0, 0, 0, + 114, 115, 0, 311, 142, 152, 149, 145, 0, 212, + 214, 216, 201, 224, 205, 207, 0, 202, 0, 0, + 258, 0, 139, 0, 231, 0, 315, 0, 293, 0, + 0, 264, 268, 269, 270, 0, 340, -2, 0, 0, + 0, 323, 344, 345, 298, 0, 167, 0, 27, 107, + 110, 0, 102, 68, 97, 90, 89, 83, 84, 85, + 86, 87, 69, 0, 73, 0, 475, 475, 0, 313, + 0, 0, 203, 0, 225, 208, 259, 0, 302, 0, + 68, 272, 68, 72, 68, 276, 68, 279, 68, 68, + 68, 68, 68, 68, 287, 290, 263, 296, 0, 338, + 0, -2, 0, 335, 150, 334, 26, 0, 0, 162, + 95, 0, 104, 36, 0, 92, 94, 0, 0, 29, + 476, 477, 30, 116, 15, 0, 0, 146, 209, 260, + 261, 271, 273, 274, 275, 277, 278, 280, 281, 282, + 283, 284, 285, 286, 0, 0, 294, 330, 17, 0, + 299, 0, 168, 103, 91, 93, 71, 74, 314, 312, + 262, 291, -2, 336, 163, } var yyTok1 = [...]int{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 73, 3, 3, 3, 100, 92, 3, - 53, 55, 97, 95, 54, 96, 109, 98, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 250, - 81, 80, 82, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 60, 3, 3, 3, 88, 80, 3, + 39, 41, 85, 83, 40, 84, 94, 86, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 157, + 68, 67, 69, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 102, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 90, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 91, 3, 103, + 3, 3, 3, 3, 79, 3, 91, } var yyTok2 = [...]int{ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, - 76, 77, 78, 79, 83, 84, 85, 86, 87, 88, - 89, 90, 93, 94, 99, 101, 104, 105, 106, 107, - 108, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 32, 33, 34, 35, 36, 37, 38, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, + 66, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 81, 82, 87, 89, 92, 93, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, + 149, 150, 151, 152, 153, 154, 155, 156, } var yyTok3 = [...]int{ 0, @@ -2714,2402 +1618,1458 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:302 +//line sql.y:243 { setParseTree(yylex, yyDollar[1].statement) } case 2: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:307 +//line sql.y:248 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:308 +//line sql.y:249 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:312 +//line sql.y:253 { yyVAL.statement = yyDollar[1].selStmt } - case 22: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:335 + case 13: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:267 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy sel.Limit = yyDollar[3].limit - sel.Lock = yyDollar[4].str yyVAL.selStmt = sel } - case 23: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:343 - { - yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} - } - case 24: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:347 + case 14: + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:274 { - yyVAL.selStmt = &Select{Comments: Comments(yyDollar[2].bytes2), Cache: yyDollar[3].str, SelectExprs: SelectExprs{Nextval{Expr: yyDollar[5].expr}}, From: TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}} + yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit} } - case 25: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:353 + case 15: + yyDollar = yyS[yypt-8 : yypt+1] +//line sql.y:281 { - yyVAL.statement = &Stream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName} + yyVAL.selStmt = &Select{Comments: Comments(yyDollar[2].bytes2), Distinct: yyDollar[3].str, SelectExprs: yyDollar[4].selectExprs, From: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr), GroupBy: GroupBy(yyDollar[7].exprs), Having: NewWhere(HavingStr, yyDollar[8].expr)} } - case 26: - yyDollar = yyS[yypt-10 : yypt+1] - //line sql.y:360 + case 16: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:285 { - yyVAL.selStmt = &Select{Comments: Comments(yyDollar[2].bytes2), Cache: yyDollar[3].str, Distinct: yyDollar[4].str, Hints: yyDollar[5].str, SelectExprs: yyDollar[6].selectExprs, From: yyDollar[7].tableExprs, Where: NewWhere(WhereStr, yyDollar[8].expr), GroupBy: GroupBy(yyDollar[9].exprs), Having: NewWhere(HavingStr, yyDollar[10].expr)} + yyVAL.selStmt = &Select{Comments: Comments(yyDollar[2].bytes2), Distinct: yyDollar[3].str, SelectExprs: yyDollar[4].selectExprs} } - case 27: + case 17: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:366 +//line sql.y:291 { yyVAL.selStmt = yyDollar[1].selStmt } - case 28: + case 18: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:370 +//line sql.y:295 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } - case 29: + case 19: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:376 +//line sql.y:301 { yyVAL.selStmt = yyDollar[1].selStmt } - case 30: + case 20: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:380 +//line sql.y:305 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } - case 31: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:387 + case 21: + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:312 { // insert_data returns a *Insert pre-filled with Columns & Values - ins := yyDollar[6].ins + ins := yyDollar[5].ins ins.Action = yyDollar[1].str ins.Comments = yyDollar[2].bytes2 ins.Ignore = yyDollar[3].str ins.Table = yyDollar[4].tableName - ins.Partitions = yyDollar[5].partitions - ins.OnDup = OnDup(yyDollar[7].updateExprs) yyVAL.statement = ins } - case 32: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:399 + case 22: + yyDollar = yyS[yypt-6 : yypt+1] +//line sql.y:322 { - cols := make(Columns, 0, len(yyDollar[7].updateExprs)) - vals := make(ValTuple, 0, len(yyDollar[8].updateExprs)) - for _, updateList := range yyDollar[7].updateExprs { + cols := make(Columns, 0, len(yyDollar[6].updateExprs)) + vals := make(ValTuple, 0, len(yyDollar[6].updateExprs)) + for _, updateList := range yyDollar[6].updateExprs { cols = append(cols, updateList.Name.Name) vals = append(vals, updateList.Expr) } - yyVAL.statement = &Insert{Action: yyDollar[1].str, Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, Table: yyDollar[4].tableName, Partitions: yyDollar[5].partitions, Columns: cols, Rows: Values{vals}, OnDup: OnDup(yyDollar[8].updateExprs)} + yyVAL.statement = &Insert{Action: yyDollar[1].str, Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, Table: yyDollar[4].tableName, Columns: cols, Rows: Values{vals}} } - case 33: + case 23: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:411 +//line sql.y:334 { yyVAL.str = InsertStr } - case 34: + case 24: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:415 +//line sql.y:338 { yyVAL.str = ReplaceStr } - case 35: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:421 + case 25: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:342 { - yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), TableExprs: yyDollar[3].tableExprs, Exprs: yyDollar[5].updateExprs, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit} + yyVAL.str = ReplaceStr } - case 36: + case 26: yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:427 +//line sql.y:348 { - yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[4].tableName}}, Partitions: yyDollar[5].partitions, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit} + yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), TableExprs: yyDollar[3].tableExprs, Exprs: yyDollar[5].updateExprs, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit} } - case 37: + case 27: yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:431 +//line sql.y:354 { - yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[4].tableNames, TableExprs: yyDollar[6].tableExprs, Where: NewWhere(WhereStr, yyDollar[7].expr)} + yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[4].tableName}}, Where: NewWhere(WhereStr, yyDollar[5].expr), OrderBy: yyDollar[6].orderBy, Limit: yyDollar[7].limit} } - case 38: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:435 + case 28: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:360 { - yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} + yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec + yyVAL.statement = yyDollar[1].ddl } - case 39: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:440 + case 29: + yyDollar = yyS[yypt-8 : yypt+1] +//line sql.y:365 { + yyVAL.statement = &DDL{Action: CreateVirtualTableStr, Table: yyDollar[5].tableName, NewName: yyDollar[7].tableName} } - case 40: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:441 + case 30: + yyDollar = yyS[yypt-8 : yypt+1] +//line sql.y:369 { + // Change this to an alter statement + yyVAL.statement = &DDL{Action: CreateIndexStr, Table: yyDollar[7].tableName, NewName: yyDollar[7].tableName} } - case 41: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:445 + case 31: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:376 { - yyVAL.tableNames = TableNames{yyDollar[1].tableName} + yyVAL.ddl = &DDL{Action: CreateStr, NewName: yyDollar[4].tableName} + setDDL(yylex, yyVAL.ddl) } - case 42: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:449 + case 32: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:383 { - yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) + yyVAL.TableSpec = yyDollar[2].TableSpec + yyVAL.TableSpec.Options = yyDollar[4].str } - case 43: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:454 + case 33: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:390 { - yyVAL.partitions = nil + yyVAL.TableSpec = &TableSpec{} + yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) } - case 44: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:458 + case 34: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:395 { - yyVAL.partitions = yyDollar[3].partitions + yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) } - case 45: + case 35: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:464 +//line sql.y:399 { - yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].setExprs} + yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) } - case 46: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:468 + case 36: + yyDollar = yyS[yypt-6 : yypt+1] +//line sql.y:405 { - yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Scope: yyDollar[3].str, Exprs: yyDollar[4].setExprs} + yyDollar[2].columnType.NotNull = yyDollar[3].boolVal + yyDollar[2].columnType.Default = yyDollar[4].optVal + yyDollar[2].columnType.Autoincrement = yyDollar[5].boolVal + yyDollar[2].columnType.KeyOpt = yyDollar[6].colKeyOpt + yyVAL.columnDefinition = &ColumnDefinition{Name: yyDollar[1].colIdent, Type: yyDollar[2].columnType} } - case 47: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:472 + case 37: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:414 { - yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Scope: yyDollar[3].str, Exprs: yyDollar[5].setExprs} + yyVAL.columnType = yyDollar[1].columnType + yyVAL.columnType.Unsigned = yyDollar[2].boolVal + yyVAL.columnType.Zerofill = yyDollar[3].boolVal } - case 48: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:476 + case 40: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:424 { - yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[4].setExprs} + yyVAL.columnType = yyDollar[1].columnType + yyVAL.columnType.Length = yyDollar[2].optVal } - case 49: + case 41: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:429 + { + yyVAL.columnType = yyDollar[1].columnType + } + case 42: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:435 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 43: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:439 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 44: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:443 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 45: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:447 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 46: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:482 +//line sql.y:451 { - yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 47: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:455 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 48: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:461 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale + } + case 49: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:467 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 50: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:486 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:473 { - yyVAL.setExprs = append(yyVAL.setExprs, yyDollar[3].setExpr) + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 51: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:492 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:479 { - yyVAL.setExpr = yyDollar[3].setExpr + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 52: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:496 +//line sql.y:485 { - yyVAL.setExpr = &SetExpr{Name: NewColIdent("tx_read_only"), Expr: NewIntVal([]byte("0"))} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 53: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:500 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:493 { - yyVAL.setExpr = &SetExpr{Name: NewColIdent("tx_read_only"), Expr: NewIntVal([]byte("1"))} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 54: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:506 +//line sql.y:497 { - yyVAL.setExpr = &SetExpr{Name: NewColIdent("tx_isolation"), Expr: NewStrVal([]byte("repeatable read"))} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } case 55: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:510 +//line sql.y:501 { - yyVAL.setExpr = &SetExpr{Name: NewColIdent("tx_isolation"), Expr: NewStrVal([]byte("read committed"))} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } case 56: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:514 +//line sql.y:505 { - yyVAL.setExpr = &SetExpr{Name: NewColIdent("tx_isolation"), Expr: NewStrVal([]byte("read uncommitted"))} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } case 57: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:518 +//line sql.y:509 { - yyVAL.setExpr = &SetExpr{Name: NewColIdent("tx_isolation"), Expr: NewStrVal([]byte("serializable"))} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 58: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:524 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:515 { - yyVAL.str = SessionStr + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } case 59: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:528 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:519 { - yyVAL.str = GlobalStr + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } case 60: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:534 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:523 { - yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec - yyVAL.statement = yyDollar[1].ddl + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 61: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:539 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:527 { - // Change this to an alter statement - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[7].tableName, NewName: yyDollar[7].tableName} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 62: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:544 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:531 { - yyVAL.statement = &DDL{Action: CreateStr, NewName: yyDollar[3].tableName.ToViewName()} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 63: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:548 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:535 { - yyVAL.statement = &DDL{Action: CreateStr, NewName: yyDollar[5].tableName.ToViewName()} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 64: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:552 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:539 { - yyVAL.statement = &DDL{Action: CreateVindexStr, VindexSpec: &VindexSpec{ - Name: yyDollar[3].colIdent, - Type: yyDollar[4].colIdent, - Params: yyDollar[5].vindexParams, - }} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 65: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:560 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:543 { - yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].bytes)} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 66: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:564 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:547 { - yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].bytes)} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 67: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:569 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:551 { - yyVAL.colIdent = NewColIdent("") + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 68: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:573 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:556 { - yyVAL.colIdent = yyDollar[2].colIdent + yyVAL.optVal = nil } case 69: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:579 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:560 { - yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) + yyVAL.optVal = NewIntVal(yyDollar[2].bytes) } case 70: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:584 +//line sql.y:565 { - var v []VindexParam - yyVAL.vindexParams = v + yyVAL.LengthScaleOption = LengthScaleOption{} } case 71: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:589 + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:569 { - yyVAL.vindexParams = yyDollar[2].vindexParams + yyVAL.LengthScaleOption = LengthScaleOption{ + Length: NewIntVal(yyDollar[2].bytes), + Scale: NewIntVal(yyDollar[4].bytes), + } } case 72: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:595 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:577 { - yyVAL.vindexParams = make([]VindexParam, 0, 4) - yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[1].vindexParam) + yyVAL.LengthScaleOption = LengthScaleOption{} } case 73: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:600 +//line sql.y:581 { - yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[3].vindexParam) + yyVAL.LengthScaleOption = LengthScaleOption{ + Length: NewIntVal(yyDollar[2].bytes), + } } case 74: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:606 + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:587 { - yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} + yyVAL.LengthScaleOption = LengthScaleOption{ + Length: NewIntVal(yyDollar[2].bytes), + Scale: NewIntVal(yyDollar[4].bytes), + } } case 75: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:612 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:595 { - yyVAL.ddl = &DDL{Action: CreateStr, NewName: yyDollar[4].tableName} - setDDL(yylex, yyVAL.ddl) + yyVAL.boolVal = BoolVal(false) } case 76: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:619 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:599 { - yyVAL.TableSpec = yyDollar[2].TableSpec - yyVAL.TableSpec.Options = yyDollar[4].str + yyVAL.boolVal = BoolVal(true) } case 77: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:626 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:604 { - yyVAL.TableSpec = &TableSpec{} - yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) + yyVAL.boolVal = BoolVal(false) } case 78: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:631 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:608 { - yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) + yyVAL.boolVal = BoolVal(true) } case 79: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:635 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:614 { - yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) + yyVAL.boolVal = BoolVal(false) } case 80: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:641 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:618 { - yyDollar[2].columnType.NotNull = yyDollar[3].boolVal - yyDollar[2].columnType.Default = yyDollar[4].optVal - yyDollar[2].columnType.OnUpdate = yyDollar[5].optVal - yyDollar[2].columnType.Autoincrement = yyDollar[6].boolVal - yyDollar[2].columnType.KeyOpt = yyDollar[7].colKeyOpt - yyDollar[2].columnType.Comment = yyDollar[8].optVal - yyVAL.columnDefinition = &ColumnDefinition{Name: NewColIdent(string(yyDollar[1].bytes)), Type: yyDollar[2].columnType} + yyVAL.boolVal = BoolVal(false) } case 81: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:652 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:622 { - yyVAL.columnType = yyDollar[1].columnType - yyVAL.columnType.Unsigned = yyDollar[2].boolVal - yyVAL.columnType.Zerofill = yyDollar[3].boolVal + yyVAL.boolVal = BoolVal(true) + } + case 82: + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:627 + { + yyVAL.optVal = nil + } + case 83: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:631 + { + yyVAL.optVal = NewStrVal(yyDollar[2].bytes) + } + case 84: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:635 + { + yyVAL.optVal = NewIntVal(yyDollar[2].bytes) } case 85: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:663 +//line sql.y:639 { - yyVAL.columnType = yyDollar[1].columnType - yyVAL.columnType.Length = yyDollar[2].optVal + yyVAL.optVal = NewFloatVal(yyDollar[2].bytes) } case 86: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:668 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:643 { - yyVAL.columnType = yyDollar[1].columnType + yyVAL.optVal = NewValArg(yyDollar[2].bytes) } case 87: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:674 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:647 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.optVal = NewValArg(yyDollar[2].bytes) } case 88: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:678 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:652 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.boolVal = BoolVal(false) } case 89: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:682 +//line sql.y:656 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.boolVal = BoolVal(true) } case 90: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:686 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:661 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.colKeyOpt = colKeyNone } case 91: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:690 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:665 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.colKeyOpt = colKeyPrimary } case 92: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:694 +//line sql.y:669 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.colKeyOpt = colKey } case 93: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:698 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:673 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.colKeyOpt = colKeyUniqueKey } case 94: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:704 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:677 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale + yyVAL.colKeyOpt = colKeyUnique } case 95: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:710 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:683 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale + yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} } case 96: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:716 +//line sql.y:689 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale + yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } case 97: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:722 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:693 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale + yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(string(yyDollar[3].bytes)), Unique: true} } case 98: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:728 +//line sql.y:697 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale + yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes), Name: NewColIdent(string(yyDollar[2].bytes)), Unique: true} } case 99: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:736 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:701 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(string(yyDollar[2].bytes)), Unique: false} } case 100: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:740 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:707 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} + yyVAL.str = string(yyDollar[1].bytes) } case 101: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:744 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:711 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} + yyVAL.str = string(yyDollar[1].bytes) } case 102: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:748 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} - } - case 103: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:752 +//line sql.y:717 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} } - case 104: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:758 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} - } - case 105: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:762 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} - } - case 106: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:766 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} - } - case 107: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:770 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} - } - case 108: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:774 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} - } - case 109: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:778 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} - } - case 110: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:782 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} - } - case 111: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:786 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} - } - case 112: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:790 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 113: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:794 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 114: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:798 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 115: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:802 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 116: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:806 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 117: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:810 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} - } - case 118: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:815 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} - } - case 119: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:821 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 120: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:825 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 121: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:829 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 122: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:833 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 123: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:837 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 124: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:841 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 125: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:845 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 126: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:849 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } - case 127: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:855 - { - yyVAL.strs = make([]string, 0, 4) - yyVAL.strs = append(yyVAL.strs, "'"+string(yyDollar[1].bytes)+"'") - } - case 128: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:860 - { - yyVAL.strs = append(yyDollar[1].strs, "'"+string(yyDollar[3].bytes)+"'") - } - case 129: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:865 - { - yyVAL.optVal = nil - } - case 130: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:869 - { - yyVAL.optVal = NewIntVal(yyDollar[2].bytes) - } - case 131: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:874 - { - yyVAL.LengthScaleOption = LengthScaleOption{} - } - case 132: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:878 - { - yyVAL.LengthScaleOption = LengthScaleOption{ - Length: NewIntVal(yyDollar[2].bytes), - Scale: NewIntVal(yyDollar[4].bytes), - } - } - case 133: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:886 - { - yyVAL.LengthScaleOption = LengthScaleOption{} - } - case 134: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:890 - { - yyVAL.LengthScaleOption = LengthScaleOption{ - Length: NewIntVal(yyDollar[2].bytes), - } - } - case 135: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:896 - { - yyVAL.LengthScaleOption = LengthScaleOption{ - Length: NewIntVal(yyDollar[2].bytes), - Scale: NewIntVal(yyDollar[4].bytes), - } - } - case 136: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:904 - { - yyVAL.boolVal = BoolVal(false) - } - case 137: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:908 - { - yyVAL.boolVal = BoolVal(true) - } - case 138: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:913 - { - yyVAL.boolVal = BoolVal(false) - } - case 139: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:917 - { - yyVAL.boolVal = BoolVal(true) - } - case 140: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:923 - { - yyVAL.boolVal = BoolVal(false) - } - case 141: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:927 - { - yyVAL.boolVal = BoolVal(false) - } - case 142: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:931 - { - yyVAL.boolVal = BoolVal(true) - } - case 143: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:936 - { - yyVAL.optVal = nil - } - case 144: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:940 - { - yyVAL.optVal = NewStrVal(yyDollar[2].bytes) - } - case 145: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:944 - { - yyVAL.optVal = NewIntVal(yyDollar[2].bytes) - } - case 146: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:948 - { - yyVAL.optVal = NewFloatVal(yyDollar[2].bytes) - } - case 147: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:952 - { - yyVAL.optVal = NewValArg(yyDollar[2].bytes) - } - case 148: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:956 - { - yyVAL.optVal = NewValArg(yyDollar[2].bytes) - } - case 149: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:960 - { - yyVAL.optVal = NewBitVal(yyDollar[2].bytes) - } - case 150: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:965 - { - yyVAL.optVal = nil - } - case 151: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:969 - { - yyVAL.optVal = NewValArg(yyDollar[3].bytes) - } - case 152: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:974 - { - yyVAL.boolVal = BoolVal(false) - } - case 153: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:978 - { - yyVAL.boolVal = BoolVal(true) - } - case 154: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:983 - { - yyVAL.str = "" - } - case 155: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:987 - { - yyVAL.str = string(yyDollar[3].bytes) - } - case 156: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:991 - { - yyVAL.str = string(yyDollar[3].bytes) - } - case 157: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:996 - { - yyVAL.str = "" - } - case 158: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1000 - { - yyVAL.str = string(yyDollar[2].bytes) - } - case 159: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1005 - { - yyVAL.colKeyOpt = colKeyNone - } - case 160: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1009 - { - yyVAL.colKeyOpt = colKeyPrimary - } - case 161: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1013 - { - yyVAL.colKeyOpt = colKey - } - case 162: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1017 - { - yyVAL.colKeyOpt = colKeyUniqueKey - } - case 163: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1021 - { - yyVAL.colKeyOpt = colKeyUnique - } - case 164: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1026 - { - yyVAL.optVal = nil - } - case 165: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1030 - { - yyVAL.optVal = NewStrVal(yyDollar[2].bytes) - } - case 166: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1036 - { - yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns, Options: yyDollar[5].indexOptions} - } - case 167: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1040 - { - yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} - } - case 168: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1046 - { - yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} - } - case 169: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1050 - { - yyVAL.indexOptions = append(yyVAL.indexOptions, yyDollar[2].indexOption) - } - case 170: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1056 - { - yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Using: string(yyDollar[2].bytes)} - } - case 171: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1060 - { - // should not be string - yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewIntVal(yyDollar[3].bytes)} - } - case 172: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1065 - { - yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewStrVal(yyDollar[2].bytes)} - } - case 173: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1071 - { - yyVAL.str = "" - } - case 174: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1075 - { - yyVAL.str = string(yyDollar[1].bytes) - } - case 175: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1081 - { - yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} - } - case 176: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1085 - { - yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(string(yyDollar[3].bytes)), Spatial: true, Unique: false} - } - case 177: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1089 - { - yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(string(yyDollar[3].bytes)), Unique: true} - } - case 178: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1093 - { - yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes), Name: NewColIdent(string(yyDollar[2].bytes)), Unique: true} - } - case 179: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1097 - { - yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(string(yyDollar[2].bytes)), Unique: false} - } - case 180: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1103 - { - yyVAL.str = string(yyDollar[1].bytes) - } - case 181: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1107 - { - yyVAL.str = string(yyDollar[1].bytes) - } - case 182: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1113 - { - yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} - } - case 183: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1117 - { - yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) - } - case 184: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1123 - { - yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].optVal} - } - case 185: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1128 - { - yyVAL.str = "" - } - case 186: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1132 - { - yyVAL.str = " " + string(yyDollar[1].str) - } - case 187: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1136 - { - yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) - } - case 188: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1144 - { - yyVAL.str = yyDollar[1].str - } - case 189: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1148 - { - yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str - } - case 190: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1152 - { - yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str - } - case 191: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1158 - { - yyVAL.str = yyDollar[1].colIdent.String() - } - case 192: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1162 - { - yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" - } - case 193: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1166 - { - yyVAL.str = string(yyDollar[1].bytes) - } - case 194: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:1172 - { - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, NewName: yyDollar[4].tableName} - } - case 195: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:1176 - { - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, NewName: yyDollar[4].tableName} - } - case 196: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:1180 - { - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, NewName: yyDollar[4].tableName} - } - case 197: - yyDollar = yyS[yypt-12 : yypt+1] - //line sql.y:1184 - { - yyVAL.statement = &DDL{ - Action: AddColVindexStr, - Table: yyDollar[4].tableName, - VindexSpec: &VindexSpec{ - Name: yyDollar[7].colIdent, - Type: yyDollar[11].colIdent, - Params: yyDollar[12].vindexParams, - }, - VindexCols: yyDollar[9].columns, - } - } - case 198: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:1197 - { - yyVAL.statement = &DDL{ - Action: DropColVindexStr, - Table: yyDollar[4].tableName, - VindexSpec: &VindexSpec{ - Name: yyDollar[7].colIdent, - }, - } - } - case 199: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:1207 - { - // Change this to a rename statement - yyVAL.statement = &DDL{Action: RenameStr, Table: yyDollar[4].tableName, NewName: yyDollar[7].tableName} - } - case 200: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:1212 - { - // Rename an index can just be an alter - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, NewName: yyDollar[4].tableName} - } - case 201: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1217 - { - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName.ToViewName(), NewName: yyDollar[3].tableName.ToViewName()} - } - case 202: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1221 - { - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, PartitionSpec: yyDollar[5].partSpec} - } - case 214: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:1240 - { - yyVAL.partSpec = &PartitionSpec{Action: ReorganizeStr, Name: yyDollar[3].colIdent, Definitions: yyDollar[6].partDefs} - } - case 215: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1246 - { - yyVAL.partDefs = []*PartitionDefinition{yyDollar[1].partDef} - } - case 216: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1250 - { - yyVAL.partDefs = append(yyDollar[1].partDefs, yyDollar[3].partDef) - } - case 217: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:1256 - { - yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Limit: yyDollar[7].expr} - } - case 218: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:1260 - { - yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Maxvalue: true} - } - case 219: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1266 - { - yyVAL.statement = &DDL{Action: RenameStr, Table: yyDollar[3].tableName, NewName: yyDollar[5].tableName} - } - case 220: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1272 - { - var exists bool - if yyDollar[3].byt != 0 { - exists = true - } - yyVAL.statement = &DDL{Action: DropStr, Table: yyDollar[4].tableName, IfExists: exists} - } - case 221: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:1280 - { - // Change this to an alter statement - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[5].tableName, NewName: yyDollar[5].tableName} - } - case 222: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1285 - { - var exists bool - if yyDollar[3].byt != 0 { - exists = true - } - yyVAL.statement = &DDL{Action: DropStr, Table: yyDollar[4].tableName.ToViewName(), IfExists: exists} - } - case 223: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1293 - { - yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].bytes)} - } - case 224: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1297 - { - yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].bytes)} - } - case 225: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1303 - { - yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[3].tableName} - } - case 226: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1307 - { - yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[2].tableName} - } - case 227: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1312 - { - yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName, NewName: yyDollar[3].tableName} - } - case 228: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1318 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} - } - case 229: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1322 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} - } - case 230: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1326 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} - } - case 231: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1331 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} - } - case 232: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1335 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} - } - case 233: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1339 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} - } - case 234: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1343 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} - } - case 235: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1347 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} - } - case 236: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1351 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 237: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1355 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 238: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1359 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 239: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1363 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 240: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1367 - { - yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} - } - case 241: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1371 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 242: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:1375 - { - // this is ugly, but I couldn't find a better way for now - if yyDollar[4].str == "processlist" { - yyVAL.statement = &Show{Type: yyDollar[4].str} - } else { - showTablesOpt := &ShowTablesOpt{Extended: yyDollar[2].str, Full: yyDollar[3].str, DbName: yyDollar[5].str, Filter: yyDollar[6].showFilter} - yyVAL.statement = &Show{Type: yyDollar[4].str, ShowTablesOpt: showTablesOpt} - } - } - case 243: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1385 - { - yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} - } - case 244: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1389 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 245: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1393 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), OnTable: yyDollar[4].tableName} - } - case 246: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1397 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 247: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1401 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 248: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1405 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 249: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1409 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 250: + case 103: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1419 - { - yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} - } - case 251: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1425 +//line sql.y:721 { - yyVAL.str = string(yyDollar[1].bytes) + yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) } - case 252: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1429 + case 104: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:727 { - yyVAL.str = string(yyDollar[1].bytes) + yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].optVal} } - case 253: + case 105: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1435 +//line sql.y:732 { yyVAL.str = "" } - case 254: + case 106: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1439 +//line sql.y:736 { - yyVAL.str = "extended " + yyVAL.str = " " + string(yyDollar[1].str) } - case 255: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1445 + case 107: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:740 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) } - case 256: + case 108: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1449 +//line sql.y:748 { - yyVAL.str = "full " + yyVAL.str = yyDollar[1].str } - case 257: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1455 + case 109: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:752 { - yyVAL.str = "" + yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str } - case 258: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1459 + case 110: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:756 { - yyVAL.str = yyDollar[2].tableIdent.v + yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str } - case 259: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1463 + case 111: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:762 { - yyVAL.str = yyDollar[2].tableIdent.v + yyVAL.str = yyDollar[1].colIdent.String() } - case 260: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1469 + case 112: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:766 { - yyVAL.showFilter = nil + yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } - case 261: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1473 + case 113: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:770 { - yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} + yyVAL.str = string(yyDollar[1].bytes) } - case 262: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1477 + case 114: + yyDollar = yyS[yypt-6 : yypt+1] +//line sql.y:776 { - yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} + yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName, NewName: yyDollar[3].tableName} } - case 263: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1483 + case 115: + yyDollar = yyS[yypt-6 : yypt+1] +//line sql.y:780 { - yyVAL.str = "" + // Change this to a rename statement + yyVAL.statement = &DDL{Action: RenameStr, Table: yyDollar[3].tableName, NewName: yyDollar[6].tableName} } - case 264: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1487 + case 116: + yyDollar = yyS[yypt-8 : yypt+1] +//line sql.y:785 { - yyVAL.str = SessionStr + // Rename an index can just be an alter + yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName, NewName: yyDollar[3].tableName} } - case 265: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1491 + case 117: + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:791 { - yyVAL.str = GlobalStr } - case 266: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1497 + case 119: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:795 { - yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} + var exists bool + if yyDollar[3].byt != 0 { + exists = true + } + yyVAL.statement = &DDL{Action: DropStr, Table: yyDollar[4].tableName, IfExists: exists} } - case 267: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1501 + case 120: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:803 { - yyVAL.statement = &Use{DBName: TableIdent{v: ""}} + var exists bool + if yyDollar[3].byt != 0 { + exists = true + } + yyVAL.statement = &DDL{Action: DropIndexStr, Table: yyDollar[4].tableName, IfExists: exists} } - case 268: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1507 + case 121: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:813 { - yyVAL.statement = &Begin{} + yyVAL.statement = &Show{Type: string(yyDollar[3].bytes), ShowCreate: true, OnTable: yyDollar[4].tableName} } - case 269: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1511 + case 122: + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:817 { - yyVAL.statement = &Begin{} + yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), OnTable: yyDollar[5].tableName} } - case 270: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1517 + case 123: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:821 { - yyVAL.statement = &Commit{} + yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), OnTable: yyDollar[3].tableName} } - case 271: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1523 + case 124: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:825 { - yyVAL.statement = &Rollback{} + yyVAL.statement = &Show{Type: string(yyDollar[3].bytes)} } - case 272: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1529 + case 125: + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:829 { - yyVAL.statement = &OtherRead{} + yyVAL.statement = &Show{Type: "table", OnTable: yyDollar[5].tableName} } - case 273: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1533 + case 126: + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:834 { - yyVAL.statement = &OtherRead{} + yyVAL.bytes = nil } - case 274: + case 127: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:838 + { + yyVAL.bytes = nil + } + case 128: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1537 +//line sql.y:844 { - yyVAL.statement = &OtherRead{} + yyVAL.statement = &Show{Type: "table", OnTable: yyDollar[2].tableName} } - case 275: + case 129: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1541 +//line sql.y:848 { - yyVAL.statement = &OtherAdmin{} + yyVAL.statement = &Show{Type: "table", OnTable: yyDollar[2].tableName} } - case 276: + case 130: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1545 +//line sql.y:852 { - yyVAL.statement = &OtherAdmin{} + yyVAL.statement = &Explain{} } - case 277: + case 131: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1550 +//line sql.y:857 { setAllowComments(yylex, true) } - case 278: + case 132: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1554 +//line sql.y:861 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } - case 279: + case 133: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1560 +//line sql.y:867 { yyVAL.bytes2 = nil } - case 280: + case 134: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1564 +//line sql.y:871 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } - case 281: + case 135: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1570 +//line sql.y:877 { yyVAL.str = UnionStr } - case 282: + case 136: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1574 +//line sql.y:881 { yyVAL.str = UnionAllStr } - case 283: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1578 - { - yyVAL.str = UnionDistinctStr - } - case 284: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1583 - { - yyVAL.str = "" - } - case 285: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1587 - { - yyVAL.str = SQLNoCacheStr - } - case 286: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1591 - { - yyVAL.str = SQLCacheStr - } - case 287: + case 137: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1596 +//line sql.y:886 { yyVAL.str = "" } - case 288: + case 138: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1600 +//line sql.y:890 { yyVAL.str = DistinctStr } - case 289: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1605 - { - yyVAL.str = "" - } - case 290: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1609 - { - yyVAL.str = StraightJoinHint - } - case 291: + case 139: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1614 +//line sql.y:895 { yyVAL.selectExprs = nil } - case 292: + case 140: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1618 +//line sql.y:899 { yyVAL.selectExprs = yyDollar[1].selectExprs } - case 293: + case 141: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1624 +//line sql.y:905 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } - case 294: + case 142: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1628 +//line sql.y:909 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } - case 295: + case 143: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1634 +//line sql.y:915 { yyVAL.selectExpr = &StarExpr{} } - case 296: + case 144: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1638 +//line sql.y:919 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } - case 297: + case 145: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1642 +//line sql.y:923 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } - case 298: + case 146: yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1646 +//line sql.y:927 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } - case 299: + case 147: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1651 +//line sql.y:932 { yyVAL.colIdent = ColIdent{} } - case 300: + case 148: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1655 +//line sql.y:936 { yyVAL.colIdent = yyDollar[1].colIdent } - case 301: + case 149: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1659 +//line sql.y:940 { yyVAL.colIdent = yyDollar[2].colIdent } - case 303: + case 151: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1666 +//line sql.y:947 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 304: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1671 - { - yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} - } - case 305: + case 152: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1675 +//line sql.y:953 { yyVAL.tableExprs = yyDollar[2].tableExprs } - case 306: + case 153: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1681 +//line sql.y:959 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } - case 307: + case 154: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1685 +//line sql.y:963 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } - case 310: + case 157: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1695 +//line sql.y:973 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } - case 311: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1699 + case 158: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:977 { - yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} + yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery} } - case 312: + case 159: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1703 +//line sql.y:981 { - yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} + yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } - case 313: + case 160: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1709 +//line sql.y:985 { - yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} + yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } - case 314: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:1713 + case 161: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:991 { - yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitions, As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHints} + yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent} } - case 315: + case 162: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1719 +//line sql.y:997 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 316: + case 163: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1723 +//line sql.y:1001 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 317: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1729 - { - yyVAL.partitions = Partitions{yyDollar[1].colIdent} - } - case 318: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1733 - { - yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) - } - case 319: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1746 - { - yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} - } - case 320: + case 164: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1750 +//line sql.y:1007 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 321: + case 165: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1754 +//line sql.y:1011 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 322: + case 166: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1758 +//line sql.y:1015 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr} } - case 323: + case 167: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1764 +//line sql.y:1021 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } - case 324: + case 168: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1766 +//line sql.y:1023 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } - case 325: + case 169: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1770 +//line sql.y:1027 { yyVAL.joinCondition = JoinCondition{} } - case 326: + case 170: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1772 +//line sql.y:1029 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 327: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1776 - { - yyVAL.joinCondition = JoinCondition{} - } - case 328: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1778 - { - yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} - } - case 329: + case 171: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1781 +//line sql.y:1032 { yyVAL.empty = struct{}{} } - case 330: + case 172: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1783 +//line sql.y:1034 { yyVAL.empty = struct{}{} } - case 331: + case 173: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1786 +//line sql.y:1037 { yyVAL.tableIdent = NewTableIdent("") } - case 332: + case 174: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1790 +//line sql.y:1041 { yyVAL.tableIdent = yyDollar[1].tableIdent } - case 333: + case 175: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1794 +//line sql.y:1045 { yyVAL.tableIdent = yyDollar[2].tableIdent } - case 335: + case 177: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1801 +//line sql.y:1052 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 336: + case 178: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1807 +//line sql.y:1058 { yyVAL.str = JoinStr } - case 337: + case 179: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1811 +//line sql.y:1062 { - yyVAL.str = JoinStr + yyVAL.str = InnerJoinStr } - case 338: + case 180: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1815 - { - yyVAL.str = JoinStr - } - case 339: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1821 +//line sql.y:1066 { - yyVAL.str = StraightJoinStr + yyVAL.str = CrossJoinStr } - case 340: + case 181: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1827 +//line sql.y:1072 { yyVAL.str = LeftJoinStr } - case 341: + case 182: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1831 +//line sql.y:1076 { yyVAL.str = LeftJoinStr } - case 342: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1835 - { - yyVAL.str = RightJoinStr - } - case 343: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1839 - { - yyVAL.str = RightJoinStr - } - case 344: + case 183: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1845 +//line sql.y:1082 { yyVAL.str = NaturalJoinStr } - case 345: + case 184: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1849 +//line sql.y:1086 { - if yyDollar[2].str == LeftJoinStr { - yyVAL.str = NaturalLeftJoinStr - } else { - yyVAL.str = NaturalRightJoinStr - } + yyVAL.str = NaturalLeftJoinStr } - case 346: + case 185: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1859 +//line sql.y:1092 { yyVAL.tableName = yyDollar[2].tableName } - case 347: + case 186: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1863 +//line sql.y:1096 { yyVAL.tableName = yyDollar[1].tableName } - case 348: + case 187: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1869 +//line sql.y:1102 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 349: + case 188: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1873 +//line sql.y:1106 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } - case 350: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1878 - { - yyVAL.indexHints = nil - } - case 351: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1882 - { - yyVAL.indexHints = &IndexHints{Type: UseStr, Indexes: yyDollar[4].columns} - } - case 352: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1886 - { - yyVAL.indexHints = &IndexHints{Type: IgnoreStr, Indexes: yyDollar[4].columns} - } - case 353: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1890 - { - yyVAL.indexHints = &IndexHints{Type: ForceStr, Indexes: yyDollar[4].columns} - } - case 354: + case 189: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1895 +//line sql.y:1111 { yyVAL.expr = nil } - case 355: + case 190: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1899 +//line sql.y:1115 { yyVAL.expr = yyDollar[2].expr } - case 356: + case 191: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1905 +//line sql.y:1121 { yyVAL.expr = yyDollar[1].expr } - case 357: + case 192: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1909 +//line sql.y:1125 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 358: + case 193: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1913 +//line sql.y:1129 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 359: + case 194: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1917 +//line sql.y:1133 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } - case 360: + case 195: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1921 +//line sql.y:1137 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].str, Expr: yyDollar[1].expr} } - case 361: + case 196: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1925 +//line sql.y:1141 { yyVAL.expr = yyDollar[1].expr } - case 362: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1929 - { - yyVAL.expr = &Default{ColName: yyDollar[2].str} - } - case 363: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:1935 - { - yyVAL.str = "" - } - case 364: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1939 - { - yyVAL.str = string(yyDollar[2].bytes) - } - case 365: + case 197: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1945 +//line sql.y:1147 { yyVAL.boolVal = BoolVal(true) } - case 366: + case 198: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1949 +//line sql.y:1151 { yyVAL.boolVal = BoolVal(false) } - case 367: + case 199: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1955 +//line sql.y:1157 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].expr} } - case 368: + case 200: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1959 +//line sql.y:1161 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InStr, Right: yyDollar[3].colTuple} } - case 369: + case 201: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1963 +//line sql.y:1165 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInStr, Right: yyDollar[4].colTuple} } - case 370: + case 202: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1967 +//line sql.y:1169 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeStr, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } - case 371: + case 203: yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1971 +//line sql.y:1173 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeStr, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } - case 372: + case 204: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:1975 +//line sql.y:1177 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpStr, Right: yyDollar[3].expr} } - case 373: + case 205: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:1979 +//line sql.y:1181 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpStr, Right: yyDollar[4].expr} } - case 374: + case 206: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:1185 + { + yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: MatchStr, Right: yyDollar[3].expr} + } + case 207: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:1189 + { + yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotMatchStr, Right: yyDollar[4].expr} + } + case 208: yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:1983 +//line sql.y:1193 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenStr, From: yyDollar[3].expr, To: yyDollar[5].expr} } - case 375: + case 209: yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:1987 +//line sql.y:1197 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenStr, From: yyDollar[4].expr, To: yyDollar[6].expr} } - case 376: + case 210: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:1991 +//line sql.y:1201 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } - case 377: + case 211: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:1997 +//line sql.y:1207 { yyVAL.str = IsNullStr } - case 378: + case 212: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2001 +//line sql.y:1211 { yyVAL.str = IsNotNullStr } - case 379: + case 213: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2005 +//line sql.y:1215 { yyVAL.str = IsTrueStr } - case 380: + case 214: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2009 +//line sql.y:1219 { yyVAL.str = IsNotTrueStr } - case 381: + case 215: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2013 +//line sql.y:1223 { yyVAL.str = IsFalseStr } - case 382: + case 216: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2017 +//line sql.y:1227 { yyVAL.str = IsNotFalseStr } - case 383: + case 217: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2023 +//line sql.y:1233 { yyVAL.str = EqualStr } - case 384: + case 218: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2027 +//line sql.y:1237 { yyVAL.str = LessThanStr } - case 385: + case 219: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2031 +//line sql.y:1241 { yyVAL.str = GreaterThanStr } - case 386: + case 220: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2035 +//line sql.y:1245 { yyVAL.str = LessEqualStr } - case 387: + case 221: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2039 +//line sql.y:1249 { yyVAL.str = GreaterEqualStr } - case 388: + case 222: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2043 +//line sql.y:1253 { yyVAL.str = NotEqualStr } - case 389: + case 223: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2047 +//line sql.y:1257 { - yyVAL.str = NullSafeEqualStr + yyVAL.str = NullSafeNotEqualStr } - case 390: + case 224: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2052 +//line sql.y:1262 { yyVAL.expr = nil } - case 391: + case 225: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2056 +//line sql.y:1266 { yyVAL.expr = yyDollar[2].expr } - case 392: + case 226: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2062 +//line sql.y:1272 { yyVAL.colTuple = yyDollar[1].valTuple } - case 393: + case 227: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2066 +//line sql.y:1276 { yyVAL.colTuple = yyDollar[1].subquery } - case 394: + case 228: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2070 +//line sql.y:1280 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } - case 395: + case 229: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2076 +//line sql.y:1286 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } - case 396: + case 230: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2082 +//line sql.y:1292 { yyVAL.exprs = Exprs{yyDollar[1].expr} } - case 397: + case 231: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2086 +//line sql.y:1296 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } - case 398: + case 232: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2092 +//line sql.y:1302 { yyVAL.expr = yyDollar[1].expr } - case 399: + case 233: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2096 +//line sql.y:1306 { yyVAL.expr = yyDollar[1].boolVal } - case 400: + case 234: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2100 +//line sql.y:1310 { yyVAL.expr = yyDollar[1].colName } - case 401: + case 235: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2104 +//line sql.y:1314 { yyVAL.expr = yyDollar[1].expr } - case 402: + case 236: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2108 +//line sql.y:1318 { yyVAL.expr = yyDollar[1].subquery } - case 403: + case 237: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2112 +//line sql.y:1322 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndStr, Right: yyDollar[3].expr} } - case 404: + case 238: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2116 +//line sql.y:1326 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrStr, Right: yyDollar[3].expr} } - case 405: + case 239: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2120 +//line sql.y:1330 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorStr, Right: yyDollar[3].expr} } - case 406: + case 240: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2124 +//line sql.y:1334 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusStr, Right: yyDollar[3].expr} } - case 407: + case 241: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2128 +//line sql.y:1338 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusStr, Right: yyDollar[3].expr} } - case 408: + case 242: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2132 +//line sql.y:1342 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultStr, Right: yyDollar[3].expr} } - case 409: + case 243: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2136 +//line sql.y:1346 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivStr, Right: yyDollar[3].expr} } - case 410: + case 244: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2140 +//line sql.y:1350 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivStr, Right: yyDollar[3].expr} } - case 411: + case 245: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2144 +//line sql.y:1354 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } - case 412: + case 246: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2148 +//line sql.y:1358 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } - case 413: + case 247: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2152 +//line sql.y:1362 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftStr, Right: yyDollar[3].expr} } - case 414: + case 248: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2156 +//line sql.y:1366 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightStr, Right: yyDollar[3].expr} } - case 415: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2160 - { - yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} - } - case 416: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2164 - { - yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} - } - case 417: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2168 - { - yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} - } - case 418: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2172 - { - yyVAL.expr = &UnaryExpr{Operator: BinaryStr, Expr: yyDollar[2].expr} - } - case 419: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2176 - { - yyVAL.expr = &UnaryExpr{Operator: UBinaryStr, Expr: yyDollar[2].expr} - } - case 420: + case 249: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2180 +//line sql.y:1370 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { yyVAL.expr = num @@ -5117,9 +3077,9 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UPlusStr, Expr: yyDollar[2].expr} } } - case 421: + case 250: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2188 +//line sql.y:1378 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { // Handle double negative @@ -5133,21 +3093,21 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UMinusStr, Expr: yyDollar[2].expr} } } - case 422: + case 251: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2202 +//line sql.y:1392 { yyVAL.expr = &UnaryExpr{Operator: TildaStr, Expr: yyDollar[2].expr} } - case 423: + case 252: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2206 +//line sql.y:1396 { yyVAL.expr = &UnaryExpr{Operator: BangStr, Expr: yyDollar[2].expr} } - case 424: + case 253: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2210 +//line sql.y:1400 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -5155,672 +3115,517 @@ yydefault: // will be non-trivial because of grammar conflicts. yyVAL.expr = &IntervalExpr{Expr: yyDollar[2].expr, Unit: yyDollar[3].colIdent.String()} } - case 429: + case 258: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2228 +//line sql.y:1418 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } - case 430: + case 259: yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:2232 +//line sql.y:1422 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 431: + case 260: yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:2236 +//line sql.y:1426 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } - case 432: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2246 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} - } - case 433: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2250 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} - } - case 434: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:2254 - { - yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} - } - case 435: + case 261: yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:2258 +//line sql.y:1436 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 436: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:2262 - { - yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} - } - case 437: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:2266 - { - yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: nil} - } - case 438: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:2270 - { - yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} - } - case 439: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:2274 - { - yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} - } - case 440: - yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:2278 - { - yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: nil} - } - case 441: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:2282 - { - yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} - } - case 442: - yyDollar = yyS[yypt-8 : yypt+1] - //line sql.y:2286 - { - yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} - } - case 443: - yyDollar = yyS[yypt-9 : yypt+1] - //line sql.y:2290 - { - yyVAL.expr = &MatchExpr{Columns: yyDollar[3].selectExprs, Expr: yyDollar[7].expr, Option: yyDollar[8].str} - } - case 444: + case 262: yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:2294 +//line sql.y:1440 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].str, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str} } - case 445: + case 263: yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:2298 +//line sql.y:1444 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } - case 446: + case 264: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2302 +//line sql.y:1448 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } - case 447: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2312 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} - } - case 448: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2316 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} - } - case 449: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2320 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} - } - case 450: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2324 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} - } - case 451: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2329 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} - } - case 452: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2334 + case 265: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1458 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} + yyVAL.expr = &TimeExpr{Expr: NewColIdent("current_timestamp")} } - case 453: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2339 + case 266: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1463 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} + yyVAL.expr = &TimeExpr{Expr: NewColIdent("current_date")} } - case 454: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2344 + case 267: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1468 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} + yyVAL.expr = &TimeExpr{Expr: NewColIdent("current_time")} } - case 457: + case 268: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2358 +//line sql.y:1478 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } - case 458: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2362 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} - } - case 459: + case 269: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2366 +//line sql.y:1482 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } - case 460: + case 270: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2370 +//line sql.y:1486 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } - case 461: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2376 - { - yyVAL.str = "" - } - case 462: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2380 - { - yyVAL.str = BooleanModeStr - } - case 463: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2384 - { - yyVAL.str = NaturalLanguageModeStr - } - case 464: - yyDollar = yyS[yypt-7 : yypt+1] - //line sql.y:2388 - { - yyVAL.str = NaturalLanguageModeWithQueryExpansionStr - } - case 465: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2392 + case 271: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1492 { - yyVAL.str = QueryExpansionStr + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 466: + case 272: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2398 +//line sql.y:1496 { - yyVAL.str = string(yyDollar[1].bytes) + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 467: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2402 + case 273: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1500 { - yyVAL.str = string(yyDollar[1].bytes) + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 468: + case 274: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2408 +//line sql.y:1504 { - yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} + yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.convertType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 469: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2412 + case 275: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1510 { - yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal, Charset: yyDollar[3].str, Operator: CharacterSetStr} + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 470: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2416 + case 276: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1514 { - yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal, Charset: string(yyDollar[3].bytes)} + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 471: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2420 + case 277: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1518 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 472: + case 278: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2424 +//line sql.y:1522 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 473: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2428 + case 279: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1526 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} - yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.convertType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 474: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2434 + case 280: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1530 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 475: + case 281: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2438 +//line sql.y:1534 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 476: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2442 + case 282: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1538 { - yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 477: + case 283: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2446 +//line sql.y:1542 { - yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 478: + case 284: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2450 +//line sql.y:1546 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 479: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2454 + case 285: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1550 { - yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} } - case 480: + case 286: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2458 +//line sql.y:1554 + { + yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].optVal} + } + case 287: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1558 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 481: + case 288: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2463 +//line sql.y:1563 { yyVAL.expr = nil } - case 482: + case 289: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2467 +//line sql.y:1567 { yyVAL.expr = yyDollar[1].expr } - case 483: + case 290: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2472 +//line sql.y:1572 { yyVAL.str = string("") } - case 484: + case 291: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2476 +//line sql.y:1576 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } - case 485: + case 292: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2482 +//line sql.y:1582 { yyVAL.whens = []*When{yyDollar[1].when} } - case 486: + case 293: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2486 +//line sql.y:1586 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } - case 487: + case 294: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2492 +//line sql.y:1592 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } - case 488: + case 295: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2497 +//line sql.y:1597 { yyVAL.expr = nil } - case 489: + case 296: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2501 +//line sql.y:1601 { yyVAL.expr = yyDollar[2].expr } - case 490: + case 297: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2507 +//line sql.y:1607 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } - case 491: + case 298: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2511 +//line sql.y:1611 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } - case 492: + case 299: yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:2515 +//line sql.y:1615 { yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } - case 493: + case 300: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2521 +//line sql.y:1621 { - yyVAL.expr = NewStrVal(yyDollar[1].bytes) + yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} + } + case 301: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:1625 + { + yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } - case 494: + case 302: + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:1629 + { + yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} + } + case 303: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2525 +//line sql.y:1635 { - yyVAL.expr = NewHexVal(yyDollar[1].bytes) + yyVAL.expr = NewStrVal(yyDollar[1].bytes) } - case 495: + case 304: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2529 +//line sql.y:1639 { - yyVAL.expr = NewBitVal(yyDollar[1].bytes) + yyVAL.expr = NewHexVal(yyDollar[1].bytes) } - case 496: + case 305: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2533 +//line sql.y:1643 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } - case 497: + case 306: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2537 +//line sql.y:1647 { yyVAL.expr = NewFloatVal(yyDollar[1].bytes) } - case 498: + case 307: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2541 +//line sql.y:1651 { yyVAL.expr = NewHexNum(yyDollar[1].bytes) } - case 499: + case 308: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2545 +//line sql.y:1655 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } - case 500: + case 309: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2549 +//line sql.y:1659 { - yyVAL.expr = &NullVal{} + yyVAL.expr = NewPosArg(yyDollar[1].bytes) } - case 501: + case 310: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2555 - { - // TODO(sougou): Deprecate this construct. - if yyDollar[1].colIdent.Lowered() != "value" { - yylex.Error("expecting value after next") - return 1 - } - yyVAL.expr = NewIntVal([]byte("1")) - } - case 502: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2564 - { - yyVAL.expr = NewIntVal(yyDollar[1].bytes) - } - case 503: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2568 +//line sql.y:1663 { - yyVAL.expr = NewValArg(yyDollar[1].bytes) + yyVAL.expr = &NullVal{} } - case 504: + case 311: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2573 +//line sql.y:1668 { yyVAL.exprs = nil } - case 505: + case 312: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2577 +//line sql.y:1672 { yyVAL.exprs = yyDollar[3].exprs } - case 506: + case 313: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2582 +//line sql.y:1677 { yyVAL.expr = nil } - case 507: + case 314: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2586 +//line sql.y:1681 { yyVAL.expr = yyDollar[2].expr } - case 508: + case 315: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2591 +//line sql.y:1686 { yyVAL.orderBy = nil } - case 509: + case 316: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2595 +//line sql.y:1690 { yyVAL.orderBy = yyDollar[3].orderBy } - case 510: + case 317: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2601 +//line sql.y:1696 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } - case 511: + case 318: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2605 +//line sql.y:1700 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } - case 512: + case 319: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2611 +//line sql.y:1706 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].str} } - case 513: + case 320: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2616 +//line sql.y:1711 { yyVAL.str = AscScr } - case 514: + case 321: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2620 +//line sql.y:1715 { yyVAL.str = AscScr } - case 515: + case 322: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2624 +//line sql.y:1719 { yyVAL.str = DescScr } - case 516: + case 323: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2629 +//line sql.y:1724 { yyVAL.limit = nil } - case 517: + case 324: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2633 +//line sql.y:1728 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } - case 518: + case 325: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2637 +//line sql.y:1732 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } - case 519: + case 326: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2641 +//line sql.y:1736 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } - case 520: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2646 - { - yyVAL.str = "" - } - case 521: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2650 - { - yyVAL.str = ForUpdateStr - } - case 522: - yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2654 - { - yyVAL.str = ShareModeStr - } - case 523: + case 327: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2667 +//line sql.y:1749 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } - case 524: + case 328: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2671 +//line sql.y:1753 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } - case 525: + case 329: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2675 +//line sql.y:1757 { // Drop the redundant parenthesis. yyVAL.ins = &Insert{Rows: yyDollar[2].selStmt} } - case 526: + case 330: yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:2680 +//line sql.y:1762 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } - case 527: + case 331: yyDollar = yyS[yypt-4 : yypt+1] - //line sql.y:2684 +//line sql.y:1766 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } - case 528: + case 332: yyDollar = yyS[yypt-6 : yypt+1] - //line sql.y:2688 +//line sql.y:1770 { // Drop the redundant parenthesis. yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].selStmt} } - case 529: + case 333: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2695 +//line sql.y:1777 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 530: + case 334: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2699 +//line sql.y:1781 { yyVAL.columns = Columns{yyDollar[3].colIdent} } - case 531: + case 335: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2703 +//line sql.y:1785 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 532: + case 336: yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:2707 +//line sql.y:1789 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } - case 533: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2712 - { - yyVAL.updateExprs = nil - } - case 534: - yyDollar = yyS[yypt-5 : yypt+1] - //line sql.y:2716 - { - yyVAL.updateExprs = yyDollar[5].updateExprs - } - case 535: + case 337: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2722 +//line sql.y:1795 { yyVAL.values = Values{yyDollar[1].valTuple} } - case 536: + case 338: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2726 +//line sql.y:1799 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } - case 537: + case 339: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2732 +//line sql.y:1805 { yyVAL.valTuple = yyDollar[1].valTuple } - case 538: + case 340: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2736 +//line sql.y:1809 { yyVAL.valTuple = ValTuple{} } - case 539: + case 341: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2742 +//line sql.y:1815 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } - case 540: + case 342: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2748 +//line sql.y:1821 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = &ParenExpr{yyDollar[1].valTuple[0]} @@ -5828,306 +3633,150 @@ yydefault: yyVAL.expr = yyDollar[1].valTuple } } - case 541: + case 343: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2758 +//line sql.y:1831 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } - case 542: + case 344: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2762 +//line sql.y:1835 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } - case 543: + case 345: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2768 +//line sql.y:1841 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } - case 544: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2774 - { - yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} - } - case 545: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2778 - { - yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) - } - case 546: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2784 - { - yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("on"))} - } - case 547: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2788 - { - yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: yyDollar[3].expr} - } - case 548: - yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2792 - { - yyVAL.setExpr = &SetExpr{Name: NewColIdent(string(yyDollar[1].bytes)), Expr: yyDollar[2].expr} - } - case 550: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2799 - { - yyVAL.bytes = []byte("charset") - } - case 552: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2806 - { - yyVAL.expr = NewStrVal([]byte(yyDollar[1].colIdent.String())) - } - case 553: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2810 - { - yyVAL.expr = NewStrVal(yyDollar[1].bytes) - } - case 554: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2814 - { - yyVAL.expr = &Default{} - } - case 557: + case 346: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2823 +//line sql.y:1846 { yyVAL.byt = 0 } - case 558: + case 347: yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2825 +//line sql.y:1848 { yyVAL.byt = 1 } - case 559: + case 348: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2828 +//line sql.y:1851 { yyVAL.empty = struct{}{} } - case 560: + case 349: yyDollar = yyS[yypt-3 : yypt+1] - //line sql.y:2830 +//line sql.y:1853 { yyVAL.empty = struct{}{} } - case 561: + case 350: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2833 +//line sql.y:1856 { yyVAL.str = "" } - case 562: + case 351: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2835 +//line sql.y:1858 { yyVAL.str = IgnoreStr } - case 563: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2839 - { - yyVAL.empty = struct{}{} - } - case 564: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2841 - { - yyVAL.empty = struct{}{} - } - case 565: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2843 - { - yyVAL.empty = struct{}{} - } - case 566: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2845 - { - yyVAL.empty = struct{}{} - } - case 567: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2847 - { - yyVAL.empty = struct{}{} - } - case 568: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2849 - { - yyVAL.empty = struct{}{} - } - case 569: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2851 - { - yyVAL.empty = struct{}{} - } - case 570: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2853 - { - yyVAL.empty = struct{}{} - } - case 571: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2855 - { - yyVAL.empty = struct{}{} - } - case 572: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2857 - { - yyVAL.empty = struct{}{} - } - case 573: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2860 - { - yyVAL.empty = struct{}{} - } - case 574: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2862 - { - yyVAL.empty = struct{}{} - } - case 575: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2864 - { - yyVAL.empty = struct{}{} - } - case 576: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2868 - { - yyVAL.empty = struct{}{} - } - case 577: - yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2870 - { - yyVAL.empty = struct{}{} - } - case 578: + case 352: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2873 +//line sql.y:1861 { yyVAL.empty = struct{}{} } - case 579: + case 353: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2875 +//line sql.y:1863 { yyVAL.empty = struct{}{} } - case 580: + case 354: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2877 +//line sql.y:1865 { yyVAL.empty = struct{}{} } - case 581: - yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:2880 - { - yyVAL.colIdent = ColIdent{} - } - case 582: - yyDollar = yyS[yypt-2 : yypt+1] - //line sql.y:2882 - { - yyVAL.colIdent = yyDollar[2].colIdent - } - case 583: + case 355: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2886 +//line sql.y:1869 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 584: + case 356: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2890 +//line sql.y:1873 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 586: + case 358: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2897 +//line sql.y:1880 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 587: + case 359: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2903 +//line sql.y:1886 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 588: + case 360: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2907 +//line sql.y:1890 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 590: + case 362: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:2914 +//line sql.y:1897 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 781: + case 472: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:3130 +//line sql.y:2032 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 782: + case 473: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:3139 +//line sql.y:2041 { decNesting(yylex) } - case 783: + case 474: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:3144 +//line sql.y:2046 { forceEOF(yylex) } - case 784: + case 475: yyDollar = yyS[yypt-0 : yypt+1] - //line sql.y:3149 +//line sql.y:2051 { forceEOF(yylex) } - case 785: + case 476: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:3153 +//line sql.y:2055 { forceEOF(yylex) } - case 786: + case 477: yyDollar = yyS[yypt-1 : yypt+1] - //line sql.y:3157 +//line sql.y:2059 { forceEOF(yylex) } diff --git a/sql.y b/sql.y index efbb794..9e07285 100644 --- a/sql.y +++ b/sql.y @@ -1,5 +1,6 @@ /* Copyright 2017 Google Inc. +Copyright 2018 The CovenantSQL Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -64,14 +65,11 @@ func forceEOF(yylex interface{}) { selectExprs SelectExprs selectExpr SelectExpr columns Columns - partitions Partitions colName *ColName tableExprs TableExprs tableExpr TableExpr joinCondition JoinCondition tableName TableName - tableNames TableNames - indexHints *IndexHints expr Expr exprs Exprs boolVal BoolVal @@ -100,30 +98,21 @@ func forceEOF(yylex interface{}) { columnDefinition *ColumnDefinition indexDefinition *IndexDefinition indexInfo *IndexInfo - indexOption *IndexOption - indexOptions []*IndexOption indexColumn *IndexColumn indexColumns []*IndexColumn - partDefs []*PartitionDefinition - partDef *PartitionDefinition - partSpec *PartitionSpec - vindexParam VindexParam - vindexParams []VindexParam - showFilter *ShowFilter } %token LEX_ERROR %left UNION -%token SELECT STREAM INSERT UPDATE DELETE FROM WHERE GROUP HAVING ORDER BY LIMIT OFFSET FOR -%token ALL DISTINCT AS EXISTS ASC DESC INTO DUPLICATE KEY DEFAULT SET LOCK KEYS +%token SELECT INSERT UPDATE DELETE FROM WHERE GROUP HAVING ORDER BY LIMIT OFFSET +%token ALL DISTINCT AS EXISTS ASC DESC INTO KEY DEFAULT SET %token VALUES LAST_INSERT_ID -%token NEXT VALUE SHARE MODE -%token SQL_NO_CACHE SQL_CACHE -%left JOIN STRAIGHT_JOIN LEFT RIGHT INNER OUTER CROSS NATURAL USE FORCE +%left JOIN LEFT RIGHT INNER OUTER CROSS NATURAL %left ON USING %token '(' ',' ')' -%token ID HEX STRING INTEGRAL FLOAT HEXNUM VALUE_ARG LIST_ARG COMMENT COMMENT_KEYWORD BIT_LITERAL +%token ID HEX STRING INTEGRAL FLOAT HEXNUM VALUE_ARG POS_ARG LIST_ARG COMMENT %token NULL TRUE FALSE +%token FULL COLUMNS // Precedence dictated by mysql. But the vitess grammar is simplified. // Some of these operators don't conflict in our situation. Nevertheless, @@ -133,7 +122,7 @@ func forceEOF(yylex interface{}) { %left AND %right NOT '!' %left BETWEEN CASE WHEN THEN ELSE END -%left '=' '<' '>' LE GE NE NULL_SAFE_EQUAL IS LIKE REGEXP IN +%left '=' '<' '>' LE GE NE IS LIKE REGEXP MATCH IN NULL_SAFE_NOTEQUAL %left '|' %left '&' %left SHIFT_LEFT SHIFT_RIGHT @@ -141,88 +130,62 @@ func forceEOF(yylex interface{}) { %left '*' '/' DIV '%' MOD %left '^' %right '~' UNARY -%left COLLATE -%right BINARY UNDERSCORE_BINARY %right INTERVAL %nonassoc '.' -// There is no need to define precedence for the JSON -// operators because the syntax is restricted enough that -// they don't cause conflicts. -%token JSON_EXTRACT_OP JSON_UNQUOTE_EXTRACT_OP - // DDL Tokens -%token CREATE ALTER DROP RENAME ANALYZE ADD -%token SCHEMA TABLE INDEX VIEW TO IGNORE IF UNIQUE PRIMARY COLUMN CONSTRAINT SPATIAL FULLTEXT FOREIGN KEY_BLOCK_SIZE -%token SHOW DESCRIBE EXPLAIN DATE ESCAPE REPAIR OPTIMIZE TRUNCATE -%token MAXVALUE PARTITION REORGANIZE LESS THAN PROCEDURE TRIGGER -%token VINDEX VINDEXES -%token STATUS VARIABLES - -// Transaction Tokens -%token BEGIN START TRANSACTION COMMIT ROLLBACK +%token CREATE ALTER DROP RENAME ADD +%token TABLE VIRTUAL INDEX TO IGNORE IF UNIQUE PRIMARY COLUMN CONSTRAINT FOREIGN +%token SHOW DESCRIBE DATE ESCAPE EXPLAIN // Type Tokens -%token BIT TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINT INTNUM +%token TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINT INTNUM %token REAL DOUBLE FLOAT_TYPE DECIMAL NUMERIC %token TIME TIMESTAMP DATETIME YEAR -%token CHAR VARCHAR BOOL CHARACTER VARBINARY NCHAR +%token CHAR VARCHAR BOOL NCHAR %token TEXT TINYTEXT MEDIUMTEXT LONGTEXT -%token BLOB TINYBLOB MEDIUMBLOB LONGBLOB JSON ENUM -%token GEOMETRY POINT LINESTRING POLYGON GEOMETRYCOLLECTION MULTIPOINT MULTILINESTRING MULTIPOLYGON +%token BLOB TINYBLOB MEDIUMBLOB LONGBLOB // Type Modifiers -%token NULLX AUTO_INCREMENT APPROXNUM SIGNED UNSIGNED ZEROFILL +%token AUTO_INCREMENT SIGNED UNSIGNED ZEROFILL // Supported SHOW tokens -%token DATABASES TABLES VITESS_KEYSPACES VITESS_SHARDS VITESS_TABLETS VSCHEMA_TABLES EXTENDED FULL PROCESSLIST - -// SET tokens -%token NAMES CHARSET GLOBAL SESSION ISOLATION LEVEL READ WRITE ONLY REPEATABLE COMMITTED UNCOMMITTED SERIALIZABLE +%token TABLES // Functions -%token CURRENT_TIMESTAMP DATABASE CURRENT_DATE -%token CURRENT_TIME LOCALTIME LOCALTIMESTAMP -%token UTC_DATE UTC_TIME UTC_TIMESTAMP +%token CURRENT_TIMESTAMP CURRENT_DATE CURRENT_TIME %token REPLACE -%token CONVERT CAST -%token SUBSTR SUBSTRING +%token CAST %token GROUP_CONCAT SEPARATOR -// Match -%token MATCH AGAINST BOOLEAN LANGUAGE WITH QUERY EXPANSION - // MySQL reserved words that are unused by this grammar will map to this token. %token UNUSED %type command %type select_statement base_select union_lhs union_rhs -%type stream_statement insert_statement update_statement delete_statement set_statement -%type create_statement alter_statement rename_statement drop_statement truncate_statement +%type insert_statement update_statement delete_statement +%type create_statement alter_statement drop_statement %type create_table_prefix -%type analyze_statement show_statement use_statement other_statement -%type begin_statement commit_statement rollback_statement +%type show_statement other_statement %type comment_opt comment_list %type union_op insert_or_replace -%type distinct_opt straight_join_opt cache_opt match_option separator_opt +%type distinct_opt separator_opt %type like_escape_opt %type select_expression_list select_expression_list_opt %type select_expression %type expression %type from_opt table_references %type table_reference table_factor join_table -%type join_condition join_condition_opt on_expression_opt -%type table_name_list -%type inner_join outer_join straight_join natural_join +%type join_condition join_condition_opt +%type inner_join outer_join natural_join %type table_name into_table_name %type aliased_table_name -%type index_hint_list %type where_expression_opt %type condition %type boolean_value %type compare %type insert_data -%type value value_expression num_val +%type value value_expression %type function_call_keyword function_call_nonkeyword function_call_generic function_call_conflict %type is_suffix %type col_tuple @@ -231,7 +194,7 @@ func forceEOF(yylex interface{}) { %type row_tuple tuple_or_empty %type tuple_expression %type subquery -%type column_name +%type column_name column_name_not_string %type when_expression_list %type when_expression %type expression_opt else_expression_opt @@ -241,57 +204,35 @@ func forceEOF(yylex interface{}) { %type order %type asc_desc_opt %type limit_opt -%type lock_opt %type ins_column_list column_list -%type opt_partition_clause partition_list -%type on_dup_opt %type update_list -%type set_list transaction_chars -%type charset_or_character_set %type update_expression -%type set_expression transaction_char isolation_level -%type for_from -%type ignore_opt default_opt -%type extended_opt full_opt from_database_opt tables_or_processlist -%type like_or_where_opt +%type ignore_opt %type exists_opt -%type not_exists_opt non_add_drop_or_rename_operation to_opt index_opt constraint_opt +%type not_exists_opt constraint_opt %type reserved_keyword non_reserved_keyword -%type sql_id reserved_sql_id col_alias as_ci_opt using_opt -%type charset_value +%type sql_id reserved_sql_id col_alias as_ci_opt %type table_id reserved_table_id table_alias as_opt_id %type as_opt -%type force_eof ddl_force_eof -%type charset -%type set_session_or_global show_session_or_global +%type ddl_force_eof %type convert_type %type column_type -%type int_type decimal_type numeric_type time_type char_type spatial_type -%type length_opt column_default_opt column_comment_opt on_update_opt -%type charset_opt collate_opt +%type int_type decimal_type numeric_type time_type char_type +%type length_opt column_default_opt %type unsigned_opt zero_fill_opt %type float_length_opt decimal_length_opt %type null_opt auto_increment_opt %type column_key_opt -%type enum_values %type column_definition %type index_definition %type index_or_key -%type equal_opt %type table_spec table_column_list %type table_option_list table_option table_opt_value %type index_info %type index_column %type index_column_list -%type index_option -%type index_option_list -%type partition_definitions -%type partition_definition -%type partition_operation -%type vindex_param -%type vindex_param_list vindex_params_opt -%type vindex_type vindex_type_opt %type alter_object_type +%type full_opt %start any_command @@ -312,53 +253,37 @@ command: { $$ = $1 } -| stream_statement | insert_statement | update_statement | delete_statement -| set_statement | create_statement | alter_statement -| rename_statement | drop_statement -| truncate_statement -| analyze_statement | show_statement -| use_statement -| begin_statement -| commit_statement -| rollback_statement | other_statement select_statement: - base_select order_by_opt limit_opt lock_opt + base_select order_by_opt limit_opt { sel := $1.(*Select) sel.OrderBy = $2 sel.Limit = $3 - sel.Lock = $4 $$ = sel } -| union_lhs union_op union_rhs order_by_opt limit_opt lock_opt - { - $$ = &Union{Type: $2, Left: $1, Right: $3, OrderBy: $4, Limit: $5, Lock: $6} - } -| SELECT comment_opt cache_opt NEXT num_val for_from table_name +| union_lhs union_op union_rhs order_by_opt limit_opt { - $$ = &Select{Comments: Comments($2), Cache: $3, SelectExprs: SelectExprs{Nextval{Expr: $5}}, From: TableExprs{&AliasedTableExpr{Expr: $7}}} - } - -stream_statement: - STREAM comment_opt select_expression FROM table_name - { - $$ = &Stream{Comments: Comments($2), SelectExpr: $3, Table: $5} + $$ = &Union{Type: $2, Left: $1, Right: $3, OrderBy: $4, Limit: $5} } // base_select is an unparenthesized SELECT with no order by clause or beyond. base_select: - SELECT comment_opt cache_opt distinct_opt straight_join_opt select_expression_list from_opt where_expression_opt group_by_opt having_opt + SELECT comment_opt distinct_opt select_expression_list from_opt where_expression_opt group_by_opt having_opt { - $$ = &Select{Comments: Comments($2), Cache: $3, Distinct: $4, Hints: $5, SelectExprs: $6, From: $7, Where: NewWhere(WhereStr, $8), GroupBy: GroupBy($9), Having: NewWhere(HavingStr, $10)} + $$ = &Select{Comments: Comments($2), Distinct: $3, SelectExprs: $4, From: $5, Where: NewWhere(WhereStr, $6), GroupBy: GroupBy($7), Having: NewWhere(HavingStr, $8)} + } +| SELECT comment_opt distinct_opt select_expression_list + { + $$ = &Select{Comments: Comments($2), Distinct: $3, SelectExprs: $4} } union_lhs: @@ -383,27 +308,25 @@ union_rhs: insert_statement: - insert_or_replace comment_opt ignore_opt into_table_name opt_partition_clause insert_data on_dup_opt + insert_or_replace comment_opt ignore_opt into_table_name insert_data { // insert_data returns a *Insert pre-filled with Columns & Values - ins := $6 + ins := $5 ins.Action = $1 ins.Comments = $2 ins.Ignore = $3 ins.Table = $4 - ins.Partitions = $5 - ins.OnDup = OnDup($7) $$ = ins } -| insert_or_replace comment_opt ignore_opt into_table_name opt_partition_clause SET update_list on_dup_opt +| insert_or_replace comment_opt ignore_opt into_table_name SET update_list { - cols := make(Columns, 0, len($7)) - vals := make(ValTuple, 0, len($8)) - for _, updateList := range $7 { + cols := make(Columns, 0, len($6)) + vals := make(ValTuple, 0, len($6)) + for _, updateList := range $6 { cols = append(cols, updateList.Name.Name) vals = append(vals, updateList.Expr) } - $$ = &Insert{Action: $1, Comments: Comments($2), Ignore: $3, Table: $4, Partitions: $5, Columns: cols, Rows: Values{vals}, OnDup: OnDup($8)} + $$ = &Insert{Action: $1, Comments: Comments($2), Ignore: $3, Table: $4, Columns: cols, Rows: Values{vals}} } insert_or_replace: @@ -415,6 +338,10 @@ insert_or_replace: { $$ = ReplaceStr } +| INSERT OR REPLACE + { + $$ = ReplaceStr + } update_statement: UPDATE comment_opt table_references SET update_list where_expression_opt order_by_opt limit_opt @@ -423,110 +350,9 @@ update_statement: } delete_statement: - DELETE comment_opt FROM table_name opt_partition_clause where_expression_opt order_by_opt limit_opt - { - $$ = &Delete{Comments: Comments($2), TableExprs: TableExprs{&AliasedTableExpr{Expr:$4}}, Partitions: $5, Where: NewWhere(WhereStr, $6), OrderBy: $7, Limit: $8} - } -| DELETE comment_opt FROM table_name_list USING table_references where_expression_opt - { - $$ = &Delete{Comments: Comments($2), Targets: $4, TableExprs: $6, Where: NewWhere(WhereStr, $7)} - } -| DELETE comment_opt table_name_list from_or_using table_references where_expression_opt - { - $$ = &Delete{Comments: Comments($2), Targets: $3, TableExprs: $5, Where: NewWhere(WhereStr, $6)} - } - -from_or_using: - FROM {} -| USING {} - -table_name_list: - table_name - { - $$ = TableNames{$1} - } -| table_name_list ',' table_name + DELETE comment_opt FROM table_name where_expression_opt order_by_opt limit_opt { - $$ = append($$, $3) - } - -opt_partition_clause: - { - $$ = nil - } -| PARTITION openb partition_list closeb - { - $$ = $3 - } - -set_statement: - SET comment_opt set_list - { - $$ = &Set{Comments: Comments($2), Exprs: $3} - } -| SET comment_opt set_session_or_global set_list - { - $$ = &Set{Comments: Comments($2), Scope: $3, Exprs: $4} - } -| SET comment_opt set_session_or_global TRANSACTION transaction_chars - { - $$ = &Set{Comments: Comments($2), Scope: $3, Exprs: $5} - } -| SET comment_opt TRANSACTION transaction_chars - { - $$ = &Set{Comments: Comments($2), Exprs: $4} - } - -transaction_chars: - transaction_char - { - $$ = SetExprs{$1} - } -| transaction_chars ',' transaction_char - { - $$ = append($$, $3) - } - -transaction_char: - ISOLATION LEVEL isolation_level - { - $$ = $3 - } -| READ WRITE - { - $$ = &SetExpr{Name: NewColIdent("tx_read_only"), Expr: NewIntVal([]byte("0"))} - } -| READ ONLY - { - $$ = &SetExpr{Name: NewColIdent("tx_read_only"), Expr: NewIntVal([]byte("1"))} - } - -isolation_level: - REPEATABLE READ - { - $$ = &SetExpr{Name: NewColIdent("tx_isolation"), Expr: NewStrVal([]byte("repeatable read"))} - } -| READ COMMITTED - { - $$ = &SetExpr{Name: NewColIdent("tx_isolation"), Expr: NewStrVal([]byte("read committed"))} - } -| READ UNCOMMITTED - { - $$ = &SetExpr{Name: NewColIdent("tx_isolation"), Expr: NewStrVal([]byte("read uncommitted"))} - } -| SERIALIZABLE - { - $$ = &SetExpr{Name: NewColIdent("tx_isolation"), Expr: NewStrVal([]byte("serializable"))} - } - -set_session_or_global: - SESSION - { - $$ = SessionStr - } -| GLOBAL - { - $$ = GlobalStr + $$ = &Delete{Comments: Comments($2), TableExprs: TableExprs{&AliasedTableExpr{Expr:$4}}, Where: NewWhere(WhereStr, $5), OrderBy: $6, Limit: $7} } create_statement: @@ -535,76 +361,14 @@ create_statement: $1.TableSpec = $2 $$ = $1 } -| CREATE constraint_opt INDEX ID using_opt ON table_name ddl_force_eof - { - // Change this to an alter statement - $$ = &DDL{Action: AlterStr, Table: $7, NewName:$7} - } -| CREATE VIEW table_name ddl_force_eof - { - $$ = &DDL{Action: CreateStr, NewName: $3.ToViewName()} - } -| CREATE OR REPLACE VIEW table_name ddl_force_eof - { - $$ = &DDL{Action: CreateStr, NewName: $5.ToViewName()} - } -| CREATE VINDEX sql_id vindex_type_opt vindex_params_opt - { - $$ = &DDL{Action: CreateVindexStr, VindexSpec: &VindexSpec{ - Name: $3, - Type: $4, - Params: $5, - }} - } -| CREATE DATABASE not_exists_opt ID ddl_force_eof - { - $$ = &DBDDL{Action: CreateStr, DBName: string($4)} - } -| CREATE SCHEMA not_exists_opt ID ddl_force_eof - { - $$ = &DBDDL{Action: CreateStr, DBName: string($4)} - } - -vindex_type_opt: - { - $$ = NewColIdent("") - } -| USING vindex_type - { - $$ = $2 - } - -vindex_type: - ID - { - $$ = NewColIdent(string($1)) - } - -vindex_params_opt: - { - var v []VindexParam - $$ = v - } -| WITH vindex_param_list +| CREATE VIRTUAL TABLE not_exists_opt table_name USING table_name ddl_force_eof { - $$ = $2 - } - -vindex_param_list: - vindex_param - { - $$ = make([]VindexParam, 0, 4) - $$ = append($$, $1) - } -| vindex_param_list ',' vindex_param - { - $$ = append($$, $3) + $$ = &DDL{Action: CreateVirtualTableStr, Table: $5, NewName: $7} } - -vindex_param: - reserved_sql_id '=' table_opt_value +| CREATE constraint_opt INDEX not_exists_opt table_name ON table_name ddl_force_eof { - $$ = VindexParam{Key: $1, Val: $3} + // Change this to an alter statement + $$ = &DDL{Action: CreateIndexStr, Table: $7, NewName:$7} } create_table_prefix: @@ -637,15 +401,13 @@ table_column_list: } column_definition: - ID column_type null_opt column_default_opt on_update_opt auto_increment_opt column_key_opt column_comment_opt + col_alias column_type null_opt column_default_opt auto_increment_opt column_key_opt { $2.NotNull = $3 $2.Default = $4 - $2.OnUpdate = $5 - $2.Autoincrement = $6 - $2.KeyOpt = $7 - $2.Comment = $8 - $$ = &ColumnDefinition{Name: NewColIdent(string($1)), Type: $2} + $2.Autoincrement = $5 + $2.KeyOpt = $6 + $$ = &ColumnDefinition{Name: $1, Type: $2} } column_type: numeric_type unsigned_opt zero_fill_opt @@ -656,7 +418,6 @@ column_type: } | char_type | time_type -| spatial_type numeric_type: int_type length_opt @@ -670,11 +431,7 @@ numeric_type: } int_type: - BIT - { - $$ = ColumnType{Type: string($1)} - } -| TINYINT + TINYINT { $$ = ColumnType{Type: string($1)} } @@ -754,113 +511,47 @@ time_type: } char_type: - CHAR length_opt charset_opt collate_opt - { - $$ = ColumnType{Type: string($1), Length: $2, Charset: $3, Collate: $4} - } -| VARCHAR length_opt charset_opt collate_opt - { - $$ = ColumnType{Type: string($1), Length: $2, Charset: $3, Collate: $4} - } -| BINARY length_opt + CHAR length_opt { $$ = ColumnType{Type: string($1), Length: $2} } -| VARBINARY length_opt +| VARCHAR length_opt { $$ = ColumnType{Type: string($1), Length: $2} } -| TEXT charset_opt collate_opt - { - $$ = ColumnType{Type: string($1), Charset: $2, Collate: $3} - } -| TINYTEXT charset_opt collate_opt - { - $$ = ColumnType{Type: string($1), Charset: $2, Collate: $3} - } -| MEDIUMTEXT charset_opt collate_opt - { - $$ = ColumnType{Type: string($1), Charset: $2, Collate: $3} - } -| LONGTEXT charset_opt collate_opt - { - $$ = ColumnType{Type: string($1), Charset: $2, Collate: $3} - } -| BLOB - { - $$ = ColumnType{Type: string($1)} - } -| TINYBLOB - { - $$ = ColumnType{Type: string($1)} - } -| MEDIUMBLOB - { - $$ = ColumnType{Type: string($1)} - } -| LONGBLOB - { - $$ = ColumnType{Type: string($1)} - } -| JSON - { - $$ = ColumnType{Type: string($1)} - } -| ENUM '(' enum_values ')' charset_opt collate_opt - { - $$ = ColumnType{Type: string($1), EnumValues: $3, Charset: $5, Collate: $6} - } -// need set_values / SetValues ? -| SET '(' enum_values ')' charset_opt collate_opt - { - $$ = ColumnType{Type: string($1), EnumValues: $3, Charset: $5, Collate: $6} - } - -spatial_type: - GEOMETRY +| TEXT { $$ = ColumnType{Type: string($1)} } -| POINT +| TINYTEXT { $$ = ColumnType{Type: string($1)} } -| LINESTRING +| MEDIUMTEXT { $$ = ColumnType{Type: string($1)} } -| POLYGON +| LONGTEXT { $$ = ColumnType{Type: string($1)} } -| GEOMETRYCOLLECTION +| BLOB { $$ = ColumnType{Type: string($1)} } -| MULTIPOINT +| TINYBLOB { $$ = ColumnType{Type: string($1)} } -| MULTILINESTRING +| MEDIUMBLOB { $$ = ColumnType{Type: string($1)} } -| MULTIPOLYGON +| LONGBLOB { $$ = ColumnType{Type: string($1)} } -enum_values: - STRING - { - $$ = make([]string, 0, 4) - $$ = append($$, "'" + string($1) + "'") - } -| enum_values ',' STRING - { - $$ = append($1, "'" + string($3) + "'") - } - length_opt: { $$ = nil @@ -956,19 +647,6 @@ column_default_opt: { $$ = NewValArg($2) } -| DEFAULT BIT_LITERAL - { - $$ = NewBitVal($2) - } - -on_update_opt: - { - $$ = nil - } -| ON UPDATE CURRENT_TIMESTAMP -{ - $$ = NewValArg($3) -} auto_increment_opt: { @@ -979,28 +657,6 @@ auto_increment_opt: $$ = BoolVal(true) } -charset_opt: - { - $$ = "" - } -| CHARACTER SET ID - { - $$ = string($3) - } -| CHARACTER SET BINARY - { - $$ = string($3) - } - -collate_opt: - { - $$ = "" - } -| COLLATE ID - { - $$ = string($2) - } - column_key_opt: { $$ = colKeyNone @@ -1022,69 +678,17 @@ column_key_opt: $$ = colKeyUnique } -column_comment_opt: - { - $$ = nil - } -| COMMENT_KEYWORD STRING - { - $$ = NewStrVal($2) - } - index_definition: - index_info '(' index_column_list ')' index_option_list - { - $$ = &IndexDefinition{Info: $1, Columns: $3, Options: $5} - } -| index_info '(' index_column_list ')' + index_info '(' index_column_list ')' { $$ = &IndexDefinition{Info: $1, Columns: $3} } -index_option_list: - index_option - { - $$ = []*IndexOption{$1} - } -| index_option_list index_option - { - $$ = append($$, $2) - } - -index_option: - USING ID - { - $$ = &IndexOption{Name: string($1), Using: string($2)} - } -| KEY_BLOCK_SIZE equal_opt INTEGRAL - { - // should not be string - $$ = &IndexOption{Name: string($1), Value: NewIntVal($3)} - } -| COMMENT_KEYWORD STRING - { - $$ = &IndexOption{Name: string($1), Value: NewStrVal($2)} - } - -equal_opt: - /* empty */ - { - $$ = "" - } -| '=' - { - $$ = string($1) - } - index_info: PRIMARY KEY { $$ = &IndexInfo{Type: string($1) + " " + string($2), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } -| SPATIAL index_or_key ID - { - $$ = &IndexInfo{Type: string($1) + " " + string($2), Name: NewColIdent(string($3)), Spatial: true, Unique: false} - } | UNIQUE index_or_key ID { $$ = &IndexInfo{Type: string($1) + " " + string($2), Name: NewColIdent(string($3)), Unique: true} @@ -1168,104 +772,23 @@ table_opt_value: } alter_statement: - ALTER ignore_opt TABLE table_name non_add_drop_or_rename_operation force_eof - { - $$ = &DDL{Action: AlterStr, Table: $4, NewName: $4} - } -| ALTER ignore_opt TABLE table_name ADD alter_object_type force_eof - { - $$ = &DDL{Action: AlterStr, Table: $4, NewName: $4} - } -| ALTER ignore_opt TABLE table_name DROP alter_object_type force_eof - { - $$ = &DDL{Action: AlterStr, Table: $4, NewName: $4} - } -| ALTER ignore_opt TABLE table_name ADD VINDEX sql_id '(' column_list ')' vindex_type_opt vindex_params_opt - { - $$ = &DDL{ - Action: AddColVindexStr, - Table: $4, - VindexSpec: &VindexSpec{ - Name: $7, - Type: $11, - Params: $12, - }, - VindexCols: $9, - } - } -| ALTER ignore_opt TABLE table_name DROP VINDEX sql_id + ALTER TABLE table_name ADD alter_object_type column_definition { - $$ = &DDL{ - Action: DropColVindexStr, - Table: $4, - VindexSpec: &VindexSpec{ - Name: $7, - }, - } + $$ = &DDL{Action: AlterStr, Table: $3, NewName: $3} } -| ALTER ignore_opt TABLE table_name RENAME to_opt table_name +| ALTER TABLE table_name RENAME TO table_name { // Change this to a rename statement - $$ = &DDL{Action: RenameStr, Table: $4, NewName: $7} + $$ = &DDL{Action: RenameStr, Table: $3, NewName: $6} } -| ALTER ignore_opt TABLE table_name RENAME index_opt force_eof +| ALTER TABLE table_name RENAME alter_object_type column_name TO column_name { // Rename an index can just be an alter - $$ = &DDL{Action: AlterStr, Table: $4, NewName: $4} - } -| ALTER VIEW table_name ddl_force_eof - { - $$ = &DDL{Action: AlterStr, Table: $3.ToViewName(), NewName: $3.ToViewName()} - } -| ALTER ignore_opt TABLE table_name partition_operation - { - $$ = &DDL{Action: AlterStr, Table: $4, PartitionSpec: $5} + $$ = &DDL{Action: AlterStr, Table: $3, NewName: $3} } alter_object_type: - COLUMN -| CONSTRAINT -| FOREIGN -| FULLTEXT -| ID -| INDEX -| KEY -| PRIMARY -| SPATIAL -| PARTITION -| UNIQUE - -partition_operation: - REORGANIZE PARTITION sql_id INTO openb partition_definitions closeb - { - $$ = &PartitionSpec{Action: ReorganizeStr, Name: $3, Definitions: $6} - } - -partition_definitions: - partition_definition - { - $$ = []*PartitionDefinition{$1} - } -| partition_definitions ',' partition_definition - { - $$ = append($1, $3) - } - -partition_definition: - PARTITION sql_id VALUES LESS THAN openb value_expression closeb - { - $$ = &PartitionDefinition{Name: $2, Limit: $7} - } -| PARTITION sql_id VALUES LESS THAN openb MAXVALUE closeb - { - $$ = &PartitionDefinition{Name: $2, Maxvalue: true} - } - -rename_statement: - RENAME TABLE table_name TO table_name - { - $$ = &DDL{Action: RenameStr, Table: $3, NewName: $5} - } + {} | COLUMN drop_statement: DROP TABLE exists_opt table_name @@ -1276,274 +799,58 @@ drop_statement: } $$ = &DDL{Action: DropStr, Table: $4, IfExists: exists} } -| DROP INDEX ID ON table_name ddl_force_eof - { - // Change this to an alter statement - $$ = &DDL{Action: AlterStr, Table: $5, NewName: $5} - } -| DROP VIEW exists_opt table_name ddl_force_eof +| DROP INDEX exists_opt table_name { var exists bool - if $3 != 0 { - exists = true - } - $$ = &DDL{Action: DropStr, Table: $4.ToViewName(), IfExists: exists} - } -| DROP DATABASE exists_opt ID - { - $$ = &DBDDL{Action: DropStr, DBName: string($4)} - } -| DROP SCHEMA exists_opt ID - { - $$ = &DBDDL{Action: DropStr, DBName: string($4)} - } - -truncate_statement: - TRUNCATE TABLE table_name - { - $$ = &DDL{Action: TruncateStr, Table: $3} - } -| TRUNCATE table_name - { - $$ = &DDL{Action: TruncateStr, Table: $2} - } -analyze_statement: - ANALYZE TABLE table_name - { - $$ = &DDL{Action: AlterStr, Table: $3, NewName: $3} + if $3 != 0 { + exists = true + } + $$ = &DDL{Action: DropIndexStr, Table: $4, IfExists: exists} } show_statement: - SHOW BINARY ID ddl_force_eof /* SHOW BINARY LOGS */ - { - $$ = &Show{Type: string($2) + " " + string($3)} - } -| SHOW CHARACTER SET ddl_force_eof - { - $$ = &Show{Type: string($2) + " " + string($3)} - } -| SHOW CREATE DATABASE ddl_force_eof - { - $$ = &Show{Type: string($2) + " " + string($3)} - } -/* Rule to handle SHOW CREATE EVENT, SHOW CREATE FUNCTION, etc. */ -| SHOW CREATE ID ddl_force_eof - { - $$ = &Show{Type: string($2) + " " + string($3)} - } -| SHOW CREATE PROCEDURE ddl_force_eof - { - $$ = &Show{Type: string($2) + " " + string($3)} - } -| SHOW CREATE TABLE ddl_force_eof - { - $$ = &Show{Type: string($2) + " " + string($3)} - } -| SHOW CREATE TRIGGER ddl_force_eof - { - $$ = &Show{Type: string($2) + " " + string($3)} - } -| SHOW CREATE VIEW ddl_force_eof - { - $$ = &Show{Type: string($2) + " " + string($3)} - } -| SHOW DATABASES ddl_force_eof - { - $$ = &Show{Type: string($2)} - } -| SHOW INDEX ddl_force_eof - { - $$ = &Show{Type: string($2)} - } -| SHOW KEYS ddl_force_eof +SHOW CREATE TABLE table_name { - $$ = &Show{Type: string($2)} + $$ = &Show{Type: string($3), ShowCreate: true, OnTable: $4} } -| SHOW PROCEDURE ddl_force_eof +| SHOW INDEX FROM TABLE table_name { - $$ = &Show{Type: string($2)} + $$ = &Show{Type: string($2), OnTable: $5} } -| SHOW show_session_or_global STATUS ddl_force_eof +| SHOW TABLE table_name { - $$ = &Show{Scope: $2, Type: string($3)} + $$ = &Show{Type: string($2), OnTable: $3} } -| SHOW TABLE ddl_force_eof +| SHOW full_opt TABLES { - $$ = &Show{Type: string($2)} + $$ = &Show{Type: string($3)} } -| SHOW extended_opt full_opt tables_or_processlist from_database_opt like_or_where_opt +| SHOW full_opt COLUMNS FROM table_name { - // this is ugly, but I couldn't find a better way for now - if $4 == "processlist" { - $$ = &Show{Type: $4} - } else { - showTablesOpt := &ShowTablesOpt{Extended: $2, Full:$3, DbName:$5, Filter:$6} - $$ = &Show{Type: $4, ShowTablesOpt: showTablesOpt} - } - } -| SHOW show_session_or_global VARIABLES ddl_force_eof - { - $$ = &Show{Scope: $2, Type: string($3)} - } -| SHOW VINDEXES - { - $$ = &Show{Type: string($2)} - } -| SHOW VINDEXES ON table_name - { - $$ = &Show{Type: string($2), OnTable: $4} - } -| SHOW VITESS_KEYSPACES - { - $$ = &Show{Type: string($2)} - } -| SHOW VITESS_SHARDS - { - $$ = &Show{Type: string($2)} - } -| SHOW VITESS_TABLETS - { - $$ = &Show{Type: string($2)} - } -| SHOW VSCHEMA_TABLES - { - $$ = &Show{Type: string($2)} - } -/* - * Catch-all for show statements without vitess keywords: - * - * SHOW BINARY LOGS - * SHOW INVALID - */ -| SHOW ID ddl_force_eof - { - $$ = &Show{Type: string($2)} - } - -tables_or_processlist: - TABLES - { - $$ = string($1) - } -| PROCESSLIST - { - $$ = string($1) - } - -extended_opt: - /* empty */ - { - $$ = "" - } -| EXTENDED - { - $$ = "extended " + $$ = &Show{Type: "table", OnTable: $5} } full_opt: - /* empty */ { - $$ = "" + $$ = nil } | FULL - { - $$ = "full " - } - -from_database_opt: - /* empty */ - { - $$ = "" - } -| FROM table_id - { - $$ = $2.v - } -| IN table_id - { - $$ = $2.v - } - -like_or_where_opt: - /* empty */ { $$ = nil } -| LIKE STRING - { - $$ = &ShowFilter{Like:string($2)} - } -| WHERE expression - { - $$ = &ShowFilter{Filter:$2} - } - -show_session_or_global: - /* empty */ - { - $$ = "" - } -| SESSION - { - $$ = SessionStr - } -| GLOBAL - { - $$ = GlobalStr - } - -use_statement: - USE table_id - { - $$ = &Use{DBName: $2} - } -| USE - { - $$ = &Use{DBName:TableIdent{v:""}} - } - -begin_statement: - BEGIN - { - $$ = &Begin{} - } -| START TRANSACTION - { - $$ = &Begin{} - } - -commit_statement: - COMMIT - { - $$ = &Commit{} - } - -rollback_statement: - ROLLBACK - { - $$ = &Rollback{} - } other_statement: - DESC force_eof + DESC table_name { - $$ = &OtherRead{} + $$ = &Show{Type: "table", OnTable: $2} } -| DESCRIBE force_eof +| DESCRIBE table_name { - $$ = &OtherRead{} + $$ = &Show{Type: "table", OnTable: $2} } | EXPLAIN force_eof { - $$ = &OtherRead{} - } -| REPAIR force_eof - { - $$ = &OtherAdmin{} - } -| OPTIMIZE force_eof - { - $$ = &OtherAdmin{} + $$ = &Explain{} } comment_opt: @@ -1574,23 +881,6 @@ union_op: { $$ = UnionAllStr } -| UNION DISTINCT - { - $$ = UnionDistinctStr - } - -cache_opt: -{ - $$ = "" -} -| SQL_NO_CACHE -{ - $$ = SQLNoCacheStr -} -| SQL_CACHE -{ - $$ = SQLCacheStr -} distinct_opt: { @@ -1601,15 +891,6 @@ distinct_opt: $$ = DistinctStr } -straight_join_opt: - { - $$ = "" - } -| STRAIGHT_JOIN - { - $$ = StraightJoinHint - } - select_expression_list_opt: { $$ = nil @@ -1668,10 +949,7 @@ col_alias: } from_opt: - { - $$ = TableExprs{&AliasedTableExpr{Expr:TableName{Name: NewTableIdent("dual")}}} - } -| FROM table_references + FROM table_references { $$ = $2 } @@ -1695,6 +973,10 @@ table_factor: { $$ = $1 } +| subquery + { + $$ = &AliasedTableExpr{Expr:$1} + } | subquery as_opt table_id { $$ = &AliasedTableExpr{Expr:$1, As: $3} @@ -1705,51 +987,26 @@ table_factor: } aliased_table_name: -table_name as_opt_id index_hint_list +table_name as_opt_id { - $$ = &AliasedTableExpr{Expr:$1, As: $2, Hints: $3} - } -| table_name PARTITION openb partition_list closeb as_opt_id index_hint_list - { - $$ = &AliasedTableExpr{Expr:$1, Partitions: $4, As: $6, Hints: $7} + $$ = &AliasedTableExpr{Expr:$1, As: $2} } column_list: - sql_id + col_alias { $$ = Columns{$1} } -| column_list ',' sql_id - { - $$ = append($$, $3) - } - -partition_list: - sql_id - { - $$ = Partitions{$1} - } -| partition_list ',' sql_id +| column_list ',' col_alias { $$ = append($$, $3) } -// There is a grammar conflict here: -// 1: INSERT INTO a SELECT * FROM b JOIN c ON b.i = c.i -// 2: INSERT INTO a SELECT * FROM b JOIN c ON DUPLICATE KEY UPDATE a.i = 1 -// When yacc encounters the ON clause, it cannot determine which way to -// resolve. The %prec override below makes the parser choose the -// first construct, which automatically makes the second construct a -// syntax error. This is the same behavior as MySQL. join_table: table_reference inner_join table_factor join_condition_opt { $$ = &JoinTableExpr{LeftExpr: $1, Join: $2, RightExpr: $3, Condition: $4} } -| table_reference straight_join table_factor on_expression_opt - { - $$ = &JoinTableExpr{LeftExpr: $1, Join: $2, RightExpr: $3, Condition: $4} - } | table_reference outer_join table_reference join_condition { $$ = &JoinTableExpr{LeftExpr: $1, Join: $2, RightExpr: $3, Condition: $4} @@ -1771,12 +1028,6 @@ join_condition_opt: | join_condition { $$ = $1 } -on_expression_opt: -%prec JOIN - { $$ = JoinCondition{} } -| ON expression - { $$ = JoinCondition{On: $2} } - as_opt: { $$ = struct{}{} } | AS @@ -1809,17 +1060,11 @@ inner_join: } | INNER JOIN { - $$ = JoinStr + $$ = InnerJoinStr } | CROSS JOIN { - $$ = JoinStr - } - -straight_join: - STRAIGHT_JOIN - { - $$ = StraightJoinStr + $$ = CrossJoinStr } outer_join: @@ -1831,14 +1076,6 @@ outer_join: { $$ = LeftJoinStr } -| RIGHT JOIN - { - $$ = RightJoinStr - } -| RIGHT OUTER JOIN - { - $$ = RightJoinStr - } natural_join: NATURAL JOIN @@ -1847,11 +1084,7 @@ natural_join: } | NATURAL outer_join { - if $2 == LeftJoinStr { - $$ = NaturalLeftJoinStr - } else { - $$ = NaturalRightJoinStr - } + $$ = NaturalLeftJoinStr } into_table_name: @@ -1865,7 +1098,7 @@ into_table_name: } table_name: - table_id + table_alias { $$ = TableName{Name: $1} } @@ -1874,23 +1107,6 @@ table_name: $$ = TableName{Qualifier: $1, Name: $3} } -index_hint_list: - { - $$ = nil - } -| USE INDEX openb column_list closeb - { - $$ = &IndexHints{Type: UseStr, Indexes: $4} - } -| IGNORE INDEX openb column_list closeb - { - $$ = &IndexHints{Type: IgnoreStr, Indexes: $4} - } -| FORCE INDEX openb column_list closeb - { - $$ = &IndexHints{Type: ForceStr, Indexes: $4} - } - where_expression_opt: { $$ = nil @@ -1925,20 +1141,6 @@ expression: { $$ = $1 } -| DEFAULT default_opt - { - $$ = &Default{ColName: $2} - } - -default_opt: - /* empty */ - { - $$ = "" - } -| openb ID closeb - { - $$ = string($2) - } boolean_value: TRUE @@ -1979,6 +1181,14 @@ condition: { $$ = &ComparisonExpr{Left: $1, Operator: NotRegexpStr, Right: $4} } +| value_expression MATCH value_expression + { + $$ = &ComparisonExpr{Left: $1, Operator: MatchStr, Right: $3} + } +| value_expression NOT MATCH value_expression + { + $$ = &ComparisonExpr{Left: $1, Operator: NotMatchStr, Right: $4} + } | value_expression BETWEEN value_expression AND value_expression { $$ = &RangeCond{Left: $1, Operator: BetweenStr, From: $3, To: $5} @@ -2043,10 +1253,10 @@ compare: { $$ = NotEqualStr } -| NULL_SAFE_EQUAL - { - $$ = NullSafeEqualStr - } +| NULL_SAFE_NOTEQUAL + { + $$ = NullSafeNotEqualStr + } like_escape_opt: { @@ -2096,7 +1306,7 @@ value_expression: { $$ = $1 } -| column_name +| column_name_not_string { $$ = $1 } @@ -2156,26 +1366,6 @@ value_expression: { $$ = &BinaryExpr{Left: $1, Operator: ShiftRightStr, Right: $3} } -| column_name JSON_EXTRACT_OP value - { - $$ = &BinaryExpr{Left: $1, Operator: JSONExtractOp, Right: $3} - } -| column_name JSON_UNQUOTE_EXTRACT_OP value - { - $$ = &BinaryExpr{Left: $1, Operator: JSONUnquoteExtractOp, Right: $3} - } -| value_expression COLLATE charset - { - $$ = &CollateExpr{Expr: $1, Charset: $3} - } -| BINARY value_expression %prec UNARY - { - $$ = &UnaryExpr{Operator: BinaryStr, Expr: $2} - } -| UNDERSCORE_BINARY value_expression %prec UNARY - { - $$ = &UnaryExpr{Operator: UBinaryStr, Expr: $2} - } | '+' value_expression %prec UNARY { if num, ok := $2.(*SQLVal); ok && num.Type == IntVal { @@ -2242,54 +1432,10 @@ function_call_generic: as a result */ function_call_keyword: - LEFT openb select_expression_list closeb - { - $$ = &FuncExpr{Name: NewColIdent("left"), Exprs: $3} - } -| RIGHT openb select_expression_list closeb - { - $$ = &FuncExpr{Name: NewColIdent("right"), Exprs: $3} - } -| CONVERT openb expression ',' convert_type closeb - { - $$ = &ConvertExpr{Expr: $3, Type: $5} - } -| CAST openb expression AS convert_type closeb + CAST openb expression AS convert_type closeb { $$ = &ConvertExpr{Expr: $3, Type: $5} } -| CONVERT openb expression USING charset closeb - { - $$ = &ConvertUsingExpr{Expr: $3, Type: $5} - } -| SUBSTR openb column_name ',' value_expression closeb - { - $$ = &SubstrExpr{Name: $3, From: $5, To: nil} - } -| SUBSTR openb column_name ',' value_expression ',' value_expression closeb - { - $$ = &SubstrExpr{Name: $3, From: $5, To: $7} - } -| SUBSTR openb column_name FROM value_expression FOR value_expression closeb - { - $$ = &SubstrExpr{Name: $3, From: $5, To: $7} - } -| SUBSTRING openb column_name ',' value_expression closeb - { - $$ = &SubstrExpr{Name: $3, From: $5, To: nil} - } -| SUBSTRING openb column_name ',' value_expression ',' value_expression closeb - { - $$ = &SubstrExpr{Name: $3, From: $5, To: $7} - } -| SUBSTRING openb column_name FROM value_expression FOR value_expression closeb - { - $$ = &SubstrExpr{Name: $3, From: $5, To: $7} - } -| MATCH openb select_expression_list closeb AGAINST openb value_expression match_option closeb - { - $$ = &MatchExpr{Columns: $3, Expr: $7, Option: $8} - } | GROUP_CONCAT openb distinct_opt select_expression_list order_by_opt separator_opt closeb { $$ = &GroupConcatExpr{Distinct: $3, Exprs: $4, OrderBy: $5, Separator: $6} @@ -2308,47 +1454,21 @@ function_call_keyword: Dedicated grammar rules are needed because of the special syntax */ function_call_nonkeyword: - CURRENT_TIMESTAMP func_datetime_precision_opt - { - $$ = &FuncExpr{Name:NewColIdent("current_timestamp")} - } -| UTC_TIMESTAMP func_datetime_precision_opt - { - $$ = &FuncExpr{Name:NewColIdent("utc_timestamp")} - } -| UTC_TIME func_datetime_precision_opt - { - $$ = &FuncExpr{Name:NewColIdent("utc_time")} - } -| UTC_DATE func_datetime_precision_opt - { - $$ = &FuncExpr{Name:NewColIdent("utc_date")} - } - // now -| LOCALTIME func_datetime_precision_opt + CURRENT_TIMESTAMP { - $$ = &FuncExpr{Name:NewColIdent("localtime")} - } - // now -| LOCALTIMESTAMP func_datetime_precision_opt - { - $$ = &FuncExpr{Name:NewColIdent("localtimestamp")} + $$ = &TimeExpr{Expr: NewColIdent("current_timestamp")} } // curdate -| CURRENT_DATE func_datetime_precision_opt +| CURRENT_DATE { - $$ = &FuncExpr{Name:NewColIdent("current_date")} + $$ = &TimeExpr{Expr: NewColIdent("current_date")} } // curtime -| CURRENT_TIME func_datetime_precision_opt +| CURRENT_TIME { - $$ = &FuncExpr{Name:NewColIdent("current_time")} + $$ = &TimeExpr{Expr: NewColIdent("current_time")} } -func_datetime_precision_opt: - /* empty */ -| openb closeb - /* Function calls using non reserved keywords with *normal* syntax forms. Because the names are non-reserved, they need a dedicated rule so as not to conflict @@ -2358,10 +1478,6 @@ function_call_conflict: { $$ = &FuncExpr{Name: NewColIdent("if"), Exprs: $3} } -| DATABASE openb select_expression_list_opt closeb - { - $$ = &FuncExpr{Name: NewColIdent("database"), Exprs: $3} - } | MOD openb select_expression_list closeb { $$ = &FuncExpr{Name: NewColIdent("mod"), Exprs: $3} @@ -2371,51 +1487,11 @@ function_call_conflict: $$ = &FuncExpr{Name: NewColIdent("replace"), Exprs: $3} } -match_option: -/*empty*/ - { - $$ = "" - } -| IN BOOLEAN MODE - { - $$ = BooleanModeStr - } -| IN NATURAL LANGUAGE MODE - { - $$ = NaturalLanguageModeStr - } -| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION - { - $$ = NaturalLanguageModeWithQueryExpansionStr - } -| WITH QUERY EXPANSION - { - $$ = QueryExpansionStr - } - -charset: - ID -{ - $$ = string($1) -} -| STRING -{ - $$ = string($1) -} - convert_type: - BINARY length_opt + CHAR length_opt { $$ = &ConvertType{Type: string($1), Length: $2} } -| CHAR length_opt charset_opt - { - $$ = &ConvertType{Type: string($1), Length: $2, Charset: $3, Operator: CharacterSetStr} - } -| CHAR length_opt ID - { - $$ = &ConvertType{Type: string($1), Length: $2, Charset: string($3)} - } | DATE { $$ = &ConvertType{Type: string($1)} @@ -2430,10 +1506,6 @@ convert_type: $$.Length = $2.Length $$.Scale = $2.Scale } -| JSON - { - $$ = &ConvertType{Type: string($1)} - } | NCHAR length_opt { $$ = &ConvertType{Type: string($1), Length: $2} @@ -2458,6 +1530,34 @@ convert_type: { $$ = &ConvertType{Type: string($1)} } +| TIMESTAMP length_opt + { + $$ = &ConvertType{Type: string($1), Length: $2} + } +| INT length_opt + { + $$ = &ConvertType{Type: string($1), Length: $2} + } +| TINYINT length_opt + { + $$ = &ConvertType{Type: string($1), Length: $2} + } +| SMALLINT length_opt + { + $$ = &ConvertType{Type: string($1), Length: $2} + } +| MEDIUMINT length_opt + { + $$ = &ConvertType{Type: string($1), Length: $2} + } +| BIGINT length_opt + { + $$ = &ConvertType{Type: string($1), Length: $2} + } +| STRING + { + $$ = &ConvertType{Type: string($1)} + } expression_opt: { @@ -2503,6 +1603,20 @@ else_expression_opt: } column_name: + col_alias + { + $$ = &ColName{Name: $1} + } +| table_alias '.' reserved_sql_id + { + $$ = &ColName{Qualifier: TableName{Name: $1}, Name: $3} + } +| table_alias '.' reserved_table_id '.' reserved_sql_id + { + $$ = &ColName{Qualifier: TableName{Qualifier: $1, Name: $3}, Name: $5} + } + +column_name_not_string: sql_id { $$ = &ColName{Name: $1} @@ -2525,10 +1639,6 @@ value: { $$ = NewHexVal($1) } -| BIT_LITERAL - { - $$ = NewBitVal($1) - } | INTEGRAL { $$ = NewIntVal($1) @@ -2545,28 +1655,13 @@ value: { $$ = NewValArg($1) } -| NULL - { - $$ = &NullVal{} - } - -num_val: - sql_id - { - // TODO(sougou): Deprecate this construct. - if $1.Lowered() != "value" { - yylex.Error("expecting value after next") - return 1 - } - $$ = NewIntVal([]byte("1")) - } -| INTEGRAL VALUES +| POS_ARG { - $$ = NewIntVal($1) + $$ = NewPosArg($1) } -| VALUE_ARG VALUES +| NULL { - $$ = NewValArg($1) + $$ = &NullVal{} } group_by_opt: @@ -2642,19 +1737,6 @@ limit_opt: $$ = &Limit{Offset: $4, Rowcount: $2} } -lock_opt: - { - $$ = "" - } -| FOR UPDATE - { - $$ = ForUpdateStr - } -| LOCK IN SHARE MODE - { - $$ = ShareModeStr - } - // insert_data expands all combinations into a single rule. // This avoids a shift/reduce conflict while encountering the // following two possible constructs: @@ -2691,7 +1773,7 @@ insert_data: } ins_column_list: - sql_id + col_alias { $$ = Columns{$1} } @@ -2699,7 +1781,7 @@ ins_column_list: { $$ = Columns{$3} } -| ins_column_list ',' sql_id +| ins_column_list ',' col_alias { $$ = append($$, $3) } @@ -2708,15 +1790,6 @@ ins_column_list: $$ = append($$, $5) } -on_dup_opt: - { - $$ = nil - } -| ON DUPLICATE KEY UPDATE update_list - { - $$ = $5 - } - tuple_list: tuple_or_empty { @@ -2769,56 +1842,6 @@ update_expression: $$ = &UpdateExpr{Name: $1, Expr: $3} } -set_list: - set_expression - { - $$ = SetExprs{$1} - } -| set_list ',' set_expression - { - $$ = append($1, $3) - } - -set_expression: - reserved_sql_id '=' ON - { - $$ = &SetExpr{Name: $1, Expr: NewStrVal([]byte("on"))} - } -| reserved_sql_id '=' expression - { - $$ = &SetExpr{Name: $1, Expr: $3} - } -| charset_or_character_set charset_value collate_opt - { - $$ = &SetExpr{Name: NewColIdent(string($1)), Expr: $2} - } - -charset_or_character_set: - CHARSET -| CHARACTER SET - { - $$ = []byte("charset") - } -| NAMES - -charset_value: - sql_id - { - $$ = NewStrVal([]byte($1.String())) - } -| STRING - { - $$ = NewStrVal($1) - } -| DEFAULT - { - $$ = &Default{} - } - -for_from: - FOR -| FROM - exists_opt: { $$ = 0 } | IF EXISTS @@ -2834,41 +1857,6 @@ ignore_opt: | IGNORE { $$ = IgnoreStr } -non_add_drop_or_rename_operation: - ALTER - { $$ = struct{}{} } -| AUTO_INCREMENT - { $$ = struct{}{} } -| CHARACTER - { $$ = struct{}{} } -| COMMENT_KEYWORD - { $$ = struct{}{} } -| DEFAULT - { $$ = struct{}{} } -| ORDER - { $$ = struct{}{} } -| CONVERT - { $$ = struct{}{} } -| PARTITION - { $$ = struct{}{} } -| UNUSED - { $$ = struct{}{} } -| ID - { $$ = struct{}{} } - -to_opt: - { $$ = struct{}{} } -| TO - { $$ = struct{}{} } -| AS - { $$ = struct{}{} } - -index_opt: - INDEX - { $$ = struct{}{} } -| KEY - { $$ = struct{}{} } - constraint_opt: { $$ = struct{}{} } | UNIQUE @@ -2876,11 +1864,6 @@ constraint_opt: | sql_id { $$ = struct{}{} } -using_opt: - { $$ = ColIdent{} } -| USING sql_id - { $$ = $2 } - sql_id: ID { @@ -2931,20 +1914,13 @@ reserved_keyword: | ASC | AUTO_INCREMENT | BETWEEN -| BINARY | BY | CASE -| COLLATE -| CONVERT | CREATE | CROSS | CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP -| SUBSTR -| SUBSTRING -| DATABASE -| DATABASES | DEFAULT | DELETE | DESC @@ -2956,10 +1932,7 @@ reserved_keyword: | END | ESCAPE | EXISTS -| EXPLAIN | FALSE -| FOR -| FORCE | FROM | GROUP | HAVING @@ -2977,14 +1950,9 @@ reserved_keyword: | LEFT | LIKE | LIMIT -| LOCALTIME -| LOCALTIMESTAMP -| LOCK | MATCH -| MAXVALUE | MOD | NATURAL -| NEXT // next should be doable as non-reserved, but is not due to the special `select next num_val` query that vitess supports | NOT | NULL | ON @@ -2995,12 +1963,10 @@ reserved_keyword: | RENAME | REPLACE | RIGHT -| SCHEMA | SELECT | SEPARATOR | SET | SHOW -| STRAIGHT_JOIN | TABLE | TABLES | THEN @@ -3009,14 +1975,12 @@ reserved_keyword: | UNION | UNIQUE | UPDATE -| USE | USING -| UTC_DATE -| UTC_TIME -| UTC_TIMESTAMP | VALUES +| VIRTUAL | WHEN | WHERE +| EXPLAIN /* These are non-reserved Vitess, because they don't cause conflicts in the grammar. @@ -3026,102 +1990,40 @@ reserved_keyword: Sorted alphabetically */ non_reserved_keyword: - AGAINST -| BEGIN -| BIGINT -| BIT + BIGINT | BLOB | BOOL | CHAR -| CHARACTER -| CHARSET -| COMMENT_KEYWORD -| COMMIT -| COMMITTED | DATE | DATETIME | DECIMAL | DOUBLE -| DUPLICATE -| ENUM -| EXPANSION | FLOAT_TYPE | FOREIGN -| FULLTEXT -| GEOMETRY -| GEOMETRYCOLLECTION -| GLOBAL | INT | INTEGER -| ISOLATION -| JSON -| KEY_BLOCK_SIZE -| KEYS -| LANGUAGE | LAST_INSERT_ID -| LESS -| LEVEL -| LINESTRING | LONGBLOB | LONGTEXT | MEDIUMBLOB | MEDIUMINT | MEDIUMTEXT -| MODE -| MULTILINESTRING -| MULTIPOINT -| MULTIPOLYGON -| NAMES | NCHAR | NUMERIC | OFFSET -| ONLY -| OPTIMIZE -| PARTITION -| POINT -| POLYGON | PRIMARY -| PROCEDURE -| QUERY -| READ | REAL -| REORGANIZE -| REPAIR -| REPEATABLE -| ROLLBACK -| SESSION -| SERIALIZABLE -| SHARE | SIGNED | SMALLINT -| SPATIAL -| START -| STATUS | TEXT -| THAN | TIME | TIMESTAMP | TINYBLOB | TINYINT | TINYTEXT -| TRANSACTION -| TRIGGER -| TRUNCATE -| UNCOMMITTED | UNSIGNED | UNUSED -| VARBINARY | VARCHAR -| VARIABLES -| VIEW -| VINDEX -| VINDEXES -| VITESS_KEYSPACES -| VITESS_SHARDS -| VITESS_TABLETS -| VSCHEMA_TABLES -| WITH -| WRITE | YEAR | ZEROFILL @@ -3141,9 +2043,9 @@ closeb: } force_eof: -{ - forceEOF(yylex) -} + { + forceEOF(yylex) + } ddl_force_eof: { diff --git a/token.go b/token.go index 23efa77..da947d2 100644 --- a/token.go +++ b/token.go @@ -22,8 +22,8 @@ import ( "fmt" "io" - "github.com/xwb1989/sqlparser/dependency/bytes2" - "github.com/xwb1989/sqlparser/dependency/sqltypes" + "github.com/CovenantSQL/sqlparser/dependency/bytes2" + "github.com/CovenantSQL/sqlparser/dependency/sqltypes" ) const ( @@ -34,19 +34,21 @@ const ( // Tokenizer is the struct used to generate SQL // tokens for the parser. type Tokenizer struct { - InStream io.Reader - AllowComments bool - ForceEOF bool - lastChar uint16 - Position int - lastToken []byte - LastError error - posVarIndex int - ParseTree Statement - partialDDL *DDL - nesting int - multi bool - specialComment *Tokenizer + InStream io.Reader + AllowComments bool + AllowBackSlashEscape bool + SeparatePositionalArgs bool + ForceEOF bool + lastChar uint16 + Position int + lastToken []byte + LastError error + posVarIndex int + ParseTree Statement + partialDDL *DDL + nesting int + multi bool + specialComment *Tokenizer buf []byte bufPos int @@ -85,25 +87,18 @@ func NewTokenizer(r io.Reader) *Tokenizer { var keywords = map[string]int{ "accessible": UNUSED, "add": ADD, - "against": AGAINST, "all": ALL, "alter": ALTER, - "analyze": ANALYZE, "and": AND, "as": AS, "asc": ASC, "asensitive": UNUSED, "auto_increment": AUTO_INCREMENT, "before": UNUSED, - "begin": BEGIN, "between": BETWEEN, "bigint": BIGINT, - "binary": BINARY, - "_binary": UNDERSCORE_BINARY, - "bit": BIT, "blob": BLOB, "bool": BOOL, - "boolean": BOOLEAN, "both": UNUSED, "by": BY, "call": UNUSED, @@ -112,20 +107,12 @@ var keywords = map[string]int{ "cast": CAST, "change": UNUSED, "char": CHAR, - "character": CHARACTER, - "charset": CHARSET, "check": UNUSED, - "collate": COLLATE, "column": COLUMN, - "comment": COMMENT_KEYWORD, - "committed": COMMITTED, - "commit": COMMIT, + "columns": COLUMNS, "condition": UNUSED, "constraint": CONSTRAINT, "continue": UNUSED, - "convert": CONVERT, - "substr": SUBSTR, - "substring": SUBSTRING, "create": CREATE, "cross": CROSS, "current_date": CURRENT_DATE, @@ -133,8 +120,6 @@ var keywords = map[string]int{ "current_timestamp": CURRENT_TIMESTAMP, "current_user": UNUSED, "cursor": UNUSED, - "database": DATABASE, - "databases": DATABASES, "day_hour": UNUSED, "day_microsecond": UNUSED, "day_minute": UNUSED, @@ -155,36 +140,25 @@ var keywords = map[string]int{ "div": DIV, "double": DOUBLE, "drop": DROP, - "duplicate": DUPLICATE, "each": UNUSED, "else": ELSE, "elseif": UNUSED, "enclosed": UNUSED, "end": END, - "enum": ENUM, "escape": ESCAPE, "escaped": UNUSED, "exists": EXISTS, "exit": UNUSED, - "explain": EXPLAIN, - "expansion": EXPANSION, - "extended": EXTENDED, "false": FALSE, "fetch": UNUSED, "float": FLOAT_TYPE, "float4": UNUSED, "float8": UNUSED, - "for": FOR, - "force": FORCE, "foreign": FOREIGN, "from": FROM, "full": FULL, - "fulltext": FULLTEXT, "generated": UNUSED, - "geometry": GEOMETRY, - "geometrycollection": GEOMETRYCOLLECTION, "get": UNUSED, - "global": GLOBAL, "grant": UNUSED, "group": GROUP, "group_concat": GROUP_CONCAT, @@ -213,30 +187,19 @@ var keywords = map[string]int{ "into": INTO, "io_after_gtids": UNUSED, "is": IS, - "isolation": ISOLATION, "iterate": UNUSED, "join": JOIN, - "json": JSON, "key": KEY, - "keys": KEYS, - "key_block_size": KEY_BLOCK_SIZE, "kill": UNUSED, - "language": LANGUAGE, "last_insert_id": LAST_INSERT_ID, "leading": UNUSED, "leave": UNUSED, "left": LEFT, - "less": LESS, - "level": LEVEL, "like": LIKE, "limit": LIMIT, "linear": UNUSED, "lines": UNUSED, - "linestring": LINESTRING, "load": UNUSED, - "localtime": LOCALTIME, - "localtimestamp": LOCALTIMESTAMP, - "lock": LOCK, "long": UNUSED, "longblob": LONGBLOB, "longtext": LONGTEXT, @@ -244,7 +207,6 @@ var keywords = map[string]int{ "low_priority": UNUSED, "master_bind": UNUSED, "match": MATCH, - "maxvalue": MAXVALUE, "mediumblob": MEDIUMBLOB, "mediumint": MEDIUMINT, "mediumtext": MEDIUMTEXT, @@ -252,23 +214,15 @@ var keywords = map[string]int{ "minute_microsecond": UNUSED, "minute_second": UNUSED, "mod": MOD, - "mode": MODE, "modifies": UNUSED, - "multilinestring": MULTILINESTRING, - "multipoint": MULTIPOINT, - "multipolygon": MULTIPOLYGON, - "names": NAMES, "natural": NATURAL, "nchar": NCHAR, - "next": NEXT, "not": NOT, "no_write_to_binlog": UNUSED, "null": NULL, "numeric": NUMERIC, "offset": OFFSET, "on": ON, - "only": ONLY, - "optimize": OPTIMIZE, "optimizer_costs": UNUSED, "option": UNUSED, "optionally": UNUSED, @@ -277,16 +231,9 @@ var keywords = map[string]int{ "out": UNUSED, "outer": OUTER, "outfile": UNUSED, - "partition": PARTITION, - "point": POINT, - "polygon": POLYGON, "precision": UNUSED, "primary": PRIMARY, - "processlist": PROCESSLIST, - "procedure": PROCEDURE, - "query": QUERY, "range": UNUSED, - "read": READ, "reads": UNUSED, "read_write": UNUSED, "real": REAL, @@ -294,10 +241,7 @@ var keywords = map[string]int{ "regexp": REGEXP, "release": UNUSED, "rename": RENAME, - "reorganize": REORGANIZE, - "repair": REPAIR, "repeat": UNUSED, - "repeatable": REPEATABLE, "replace": REPLACE, "require": UNUSED, "resignal": UNUSED, @@ -306,44 +250,32 @@ var keywords = map[string]int{ "revoke": UNUSED, "right": RIGHT, "rlike": REGEXP, - "rollback": ROLLBACK, - "schema": SCHEMA, "schemas": UNUSED, "second_microsecond": UNUSED, "select": SELECT, "sensitive": UNUSED, "separator": SEPARATOR, - "serializable": SERIALIZABLE, - "session": SESSION, "set": SET, - "share": SHARE, "show": SHOW, "signal": UNUSED, "signed": SIGNED, "smallint": SMALLINT, - "spatial": SPATIAL, "specific": UNUSED, "sql": UNUSED, "sqlexception": UNUSED, "sqlstate": UNUSED, "sqlwarning": UNUSED, "sql_big_result": UNUSED, - "sql_cache": SQL_CACHE, "sql_calc_found_rows": UNUSED, - "sql_no_cache": SQL_NO_CACHE, "sql_small_result": UNUSED, "ssl": UNUSED, - "start": START, "starting": UNUSED, - "status": STATUS, "stored": UNUSED, - "straight_join": STRAIGHT_JOIN, - "stream": STREAM, + "string": STRING, "table": TABLE, "tables": TABLES, "terminated": UNUSED, "text": TEXT, - "than": THAN, "then": THEN, "time": TIME, "timestamp": TIMESTAMP, @@ -352,11 +284,7 @@ var keywords = map[string]int{ "tinytext": TINYTEXT, "to": TO, "trailing": UNUSED, - "transaction": TRANSACTION, - "trigger": TRIGGER, "true": TRUE, - "truncate": TRUNCATE, - "uncommitted": UNCOMMITTED, "undo": UNUSED, "union": UNION, "unique": UNIQUE, @@ -364,34 +292,20 @@ var keywords = map[string]int{ "unsigned": UNSIGNED, "update": UPDATE, "usage": UNUSED, - "use": USE, "using": USING, - "utc_date": UTC_DATE, - "utc_time": UTC_TIME, - "utc_timestamp": UTC_TIMESTAMP, "values": VALUES, - "variables": VARIABLES, - "varbinary": VARBINARY, "varchar": VARCHAR, "varcharacter": UNUSED, "varying": UNUSED, - "virtual": UNUSED, - "vindex": VINDEX, - "vindexes": VINDEXES, - "view": VIEW, - "vitess_keyspaces": VITESS_KEYSPACES, - "vitess_shards": VITESS_SHARDS, - "vitess_tablets": VITESS_TABLETS, - "vschema_tables": VSCHEMA_TABLES, + "virtual": VIRTUAL, "when": WHEN, "where": WHERE, "while": UNUSED, - "with": WITH, - "write": WRITE, "xor": UNUSED, "year": YEAR, "year_month": UNUSED, "zerofill": ZEROFILL, + "explain": EXPLAIN, } // keywordStrings contains the reverse mapping of token to keyword strings @@ -480,12 +394,6 @@ func (tkn *Tokenizer) Scan() (int, []byte) { return tkn.scanHex() } } - if ch == 'B' || ch == 'b' { - if tkn.lastChar == '\'' { - tkn.next() - return tkn.scanBitLiteral() - } - } isDbSystemVariable := false if ch == '@' && tkn.lastChar == '@' { isDbSystemVariable = true @@ -520,6 +428,9 @@ func (tkn *Tokenizer) Scan() (int, []byte) { tkn.posVarIndex++ buf := new(bytes2.Buffer) fmt.Fprintf(buf, ":v%d", tkn.posVarIndex) + if tkn.SeparatePositionalArgs { + return POS_ARG, buf.Bytes() + } return VALUE_ARG, buf.Bytes() case '.': if isDigit(tkn.lastChar) { @@ -549,32 +460,19 @@ func (tkn *Tokenizer) Scan() (int, []byte) { case '-': tkn.next() return tkn.scanCommentType1("--") - case '>': - tkn.next() - if tkn.lastChar == '>' { - tkn.next() - return JSON_UNQUOTE_EXTRACT_OP, nil - } - return JSON_EXTRACT_OP, nil } return int(ch), nil case '<': switch tkn.lastChar { case '>': tkn.next() - return NE, nil + return NULL_SAFE_NOTEQUAL, nil case '<': tkn.next() return SHIFT_LEFT, nil case '=': tkn.next() - switch tkn.lastChar { - case '>': - tkn.next() - return NULL_SAFE_EQUAL, nil - default: - return LE, nil - } + return LE, nil default: return int(ch), nil } @@ -654,16 +552,6 @@ func (tkn *Tokenizer) scanHex() (int, []byte) { return HEX, buffer.Bytes() } -func (tkn *Tokenizer) scanBitLiteral() (int, []byte) { - buffer := &bytes2.Buffer{} - tkn.scanMantissa(2, buffer) - if tkn.lastChar != '\'' { - return LEX_ERROR, buffer.Bytes() - } - tkn.next() - return BIT_LITERAL, buffer.Bytes() -} - func (tkn *Tokenizer) scanLiteralIdentifier() (int, []byte) { buffer := &bytes2.Buffer{} backTickSeen := false @@ -778,14 +666,14 @@ func (tkn *Tokenizer) scanString(delim uint16, typ int) (int, []byte) { return LEX_ERROR, buffer.Bytes() } - if ch != delim && ch != '\\' { + if ch != delim && (!tkn.AllowBackSlashEscape || ch != '\\') { buffer.WriteByte(byte(ch)) // Scan ahead to the next interesting character. start := tkn.bufPos for ; tkn.bufPos < tkn.bufSize; tkn.bufPos++ { ch = uint16(tkn.buf[tkn.bufPos]) - if ch == delim || ch == '\\' { + if ch == delim || (tkn.AllowBackSlashEscape && ch == '\\') { break } } @@ -805,7 +693,7 @@ func (tkn *Tokenizer) scanString(delim uint16, typ int) (int, []byte) { } tkn.next() // Read one past the delim or escape character. - if ch == '\\' { + if tkn.AllowBackSlashEscape && ch == '\\' { if tkn.lastChar == eofChar { // String terminates mid escape character. return LEX_ERROR, buffer.Bytes() diff --git a/token_test.go b/token_test.go index 9354354..75346a8 100644 --- a/token_test.go +++ b/token_test.go @@ -94,11 +94,11 @@ func TestString(t *testing.T) { }, { in: "'\\n'", id: STRING, - want: "\n", + want: "\\n", }, { in: "'\\nhello\\n'", id: STRING, - want: "\nhello\n", + want: "\\nhello\\n", }, { in: "'a''b'", id: STRING, @@ -106,19 +106,19 @@ func TestString(t *testing.T) { }, { in: "'a\\'b'", id: STRING, - want: "a'b", + want: "a\\", }, { in: "'\\'", - id: LEX_ERROR, - want: "'", + id: STRING, + want: "\\", }, { in: "'", id: LEX_ERROR, want: "", }, { in: "'hello\\'", - id: LEX_ERROR, - want: "hello'", + id: STRING, + want: "hello\\", }, { in: "'hello", id: LEX_ERROR, @@ -126,7 +126,7 @@ func TestString(t *testing.T) { }, { in: "'hello\\", id: LEX_ERROR, - want: "hello", + want: "hello\\", }} for _, tcase := range testcases {