diff --git a/data/test/tabletserver/exec_cases.txt b/data/test/tabletserver/exec_cases.txt
index 92965cce76d..dd24969d803 100644
--- a/data/test/tabletserver/exec_cases.txt
+++ b/data/test/tabletserver/exec_cases.txt
@@ -4,7 +4,16 @@
"PlanID": "PASS_SELECT",
"TableName": "",
"FieldQuery": "select * from a where 1 != 1 union select * from b where 1 != 1",
- "FullQuery": "select * from a union select * from b"
+ "FullQuery": "select * from a union select * from b limit :#maxLimit"
+}
+
+# union with limit
+"select * from a union select * from b limit 10"
+{
+ "PlanID": "PASS_SELECT",
+ "TableName": "",
+ "FieldQuery": "select * from a where 1 != 1 union select * from b where 1 != 1",
+ "FullQuery": "select * from a union select * from b limit 10"
}
# distinct
diff --git a/doc/ServerConfiguration.md b/doc/ServerConfiguration.md
index ac0f4a9dcfe..a055d87560f 100644
--- a/doc/ServerConfiguration.md
+++ b/doc/ServerConfiguration.md
@@ -147,7 +147,9 @@ Vitess servers are written in Go. There are a few Vitess-specific knobs that app
### Go version
-Go, being a young language, tends to add major improvements over each version. So, the latest Go version is almost always recommended. The current version to use Go 1.6.
+Go, being a young language, tends to add major improvements over each version.
+So, the latest Go version is almost always recommended.
+Note that the latest Go version may be higher than the minimum version we require for compiling the binaries (see ["Prerequisites" section in the Getting Started guide](/getting-started/#prerequisites)).
### GOMAXPROCS
diff --git a/docs/user-guide/row-based-replication.html b/docs/user-guide/row-based-replication.html
index dd3fd279133..7bc09f16c90 100644
--- a/docs/user-guide/row-based-replication.html
+++ b/docs/user-guide/row-based-replication.html
@@ -318,27 +318,31 @@
MySQL Row Based Replication
The
binlog-row-image option can
be used to control which rows are used to identify the columns for the Update
-and Delete Rows events. The default setting for that option is to log all columns.
+and Delete Rows events. The default setting for that option is to log all
+columns.
-Vitess Use of Replication Stream
+Vitess Use of MySQL Replication Stream
Vitess uses the Replication Stream in a number of places. This part explains how
-we can use RBR for these.
+we use RBR for these.
vttablet Replication Stream Watcher
-This is enabled by the watch_replication_stream option, and is used by Update
-Stream. It only cares about the GTIDs for the events, so it is unaffected by the use of RBR.
+This is enabled by the watch_replication_stream option, and is used
+by Update Stream. It only cares about the
+GTIDs for the events, so it is unaffected by the use of RBR.
Note: the current vttablet also reloads the schema when it sees a DDL in the
-stream. See below for more information on this.
+stream. See below for more information on this. DDLs are however not represented
+in RBR, so this is an orthogonal issue.
Update Stream
The current implementation uses comments in the original SQL (in SQR) to provide
the primary key of the column that is being changed.
-We are changing this to also parse the RBR events, and extract the primary key value.
+We are changing this to also parse the RBR events, and extract the primary key
+value.
Note: this means we need accurate schema information. See below.
@@ -405,6 +409,28 @@ Applying Schema Changes
can be parsed correctly in all cases.
+Unsupported Features
+
+This part describes the features that are not supported for RBR in Vitess as of
+March 2017:
+
+
+Fractional timestamps for MariaDB: not supported. This affects the objects
+of type TIMESTAMP, TIME and DATETIME. The way that feature is
+implemented in MariaDB, the binary logs do not contain enough information to
+be parsed, but instead MariaDB relies on the schema knowledge. This is very
+fragile. MySQL 5.6+ added new data types, and these are supported.
+JSON type in MySQL 5.7+: the representation of these in the binlogs is a
+blob containing indexed binary data. Re-building the SQL version of the data,
+so it can be re-inserted during resharding, is not supported yet. It wouldn't
+however be a lot of work, with other libraries also supporting this, and the
+C++ MySQL code being well written and easy to read. See for instance
+https://github.com/shyiko/mysql-binlog-connector-java/pull/119
+Timezones support: the binary logs store timestamps in UTC. When converting
+these to SQL, we print the UTC value. If the server is not in UTC, that will
+result in data corruption. Note: we are working on a fix for that one.
+
+
Update Stream Extensions
Update Stream can be changed to contain both
@@ -427,8 +453,8 @@
Vttablet Simplifications
modified rows, to rewrite the queries in an efficient way and tag each statement
with the Primary Key. None of this may be necessary with RBR.
-We plan to eventually add a rbr_mode flag to vttablet to disable all the things it can
-skip if RBR is used.
+We plan to eventually add a rbr_mode flag to vttablet to disable all the
+things it can skip if RBR is used.
diff --git a/docs/user-guide/server-configuration.html b/docs/user-guide/server-configuration.html
index d1b95ee5ea3..c57531eff2a 100644
--- a/docs/user-guide/server-configuration.html
+++ b/docs/user-guide/server-configuration.html
@@ -443,7 +443,9 @@ Vitess servers
Go version
-Go, being a young language, tends to add major improvements over each version. So, the latest Go version is almost always recommended. The current version to use Go 1.6.
+Go, being a young language, tends to add major improvements over each version.
+So, the latest Go version is almost always recommended.
+Note that the latest Go version may be higher than the minimum version we require for compiling the binaries (see "Prerequisites" section in the Getting Started guide).
GOMAXPROCS
diff --git a/go/bufio2/bufio.go b/go/bufio2/bufio.go
deleted file mode 100644
index 7717435fc2f..00000000000
--- a/go/bufio2/bufio.go
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package bufio2 implements buffered I/O.
-//
-// It wraps an io.Reader or io.Writer object, creating another object
-// (Reader or AsyncWriter) that also implements the interface but provides
-// buffering and some help for textual I/O.
-package bufio2
-
-import (
- "io"
- "unicode/utf8"
-)
-
-const (
- defaultBufSize = 4096
- defaultBufCount = 4
-)
-
-// buffered output
-
-// AsyncWriter implements buffering for an io.Writer object.
-// If an error occurs writing to a AsyncWriter, no more data will be
-// accepted and all subsequent writes will return the error.
-type AsyncWriter struct {
- // these are only touched by the input side
- err error
- buf []byte
- n int
- size int
- countSent int
- countRcvd int
-
- // these are only touched by the output side
- wr io.Writer
-
- // and this is synchronization
- dataChan chan []byte
- resultChan chan error
-}
-
-// NewAsyncWriterSize returns a new AsyncWriter whose buffer has at least the specified
-// size. If the argument io.Writer is already a AsyncWriter with large enough
-// size, it returns the underlying AsyncWriter.
-func NewAsyncWriterSize(wr io.Writer, size int, count int) *AsyncWriter {
- // Is it already a AsyncWriter?
- b, ok := wr.(*AsyncWriter)
- if ok && len(b.buf) >= size {
- return b
- }
- if size <= 0 {
- size = defaultBufSize
- }
- b = new(AsyncWriter)
- b.size = size
- b.buf = make([]byte, size)
- b.wr = wr
- if count <= 0 {
- count = defaultBufCount
- }
- b.dataChan = make(chan []byte, count)
- b.resultChan = make(chan error, count+1) // may have the one we're processing and count more waiting
- go func() {
- b.writeThread()
- }()
- return b
-}
-
-// NewAsyncWriter returns a new AsyncWriter whose buffer has the default size.
-func NewAsyncWriter(wr io.Writer) *AsyncWriter {
- return NewAsyncWriterSize(wr, defaultBufSize, defaultBufCount)
-}
-
-func (b *AsyncWriter) writeThread() {
- var err error
- for buf := range b.dataChan {
- // we only write if we're not in error state
- if err == nil {
- var n int
- n, err = b.wr.Write(buf)
- if n < len(buf) && err == nil {
- // short writes are considered error for now
- err = io.ErrShortWrite
- }
- }
-
- // and write the result
- b.resultChan <- err
- }
-}
-
-// Takes whatever data we have in the buffer and sends it
-// on the channel.
-func (b *AsyncWriter) sendData() error {
- // flush the result channel to collect eventual errors
- haveResults := true
- for haveResults {
- select {
- case err := <-b.resultChan:
- b.countRcvd++
- if err != nil && b.err == nil {
- b.err = err
- }
- default:
- haveResults = false
- }
- }
- if b.err != nil {
- return b.err
- }
-
- // send the buffer if we have anything to send
- if b.n != 0 {
- b.countSent++
- b.dataChan <- b.buf[0:b.n]
- b.buf = make([]byte, b.size)
- b.n = 0
- }
- return nil
-}
-
-func (b *AsyncWriter) Flush() error {
- if err := b.sendData(); err != nil {
- return err
- }
- return b.WaitForWrites()
-}
-
-func (b *AsyncWriter) WaitForWrites() error {
- for b.countRcvd < b.countSent {
- err := <-b.resultChan
- b.countRcvd++
- if err != nil && b.err == nil {
- b.err = err
- }
- }
- return b.err
-}
-
-// Available returns how many bytes are unused in the buffer.
-func (b *AsyncWriter) Available() int { return len(b.buf) - b.n }
-
-// Buffered returns the number of bytes that have been written into the current buffer.
-func (b *AsyncWriter) Buffered() int { return b.n }
-
-// Write writes the contents of p into the buffer.
-// It returns the number of bytes written.
-// If nn < len(p), it also returns an error explaining
-// why the write is short.
-func (b *AsyncWriter) Write(p []byte) (nn int, err error) {
- for len(p) > b.Available() && b.err == nil {
- n := copy(b.buf[b.n:], p)
- b.n += n
- b.sendData()
- nn += n
- p = p[n:]
- }
- if b.err != nil {
- return nn, b.err
- }
- n := copy(b.buf[b.n:], p)
- b.n += n
- nn += n
- return nn, nil
-}
-
-// WriteByte writes a single byte.
-func (b *AsyncWriter) WriteByte(c byte) error {
- if b.err != nil {
- return b.err
- }
- if b.Available() <= 0 && b.sendData() != nil {
- return b.err
- }
- b.buf[b.n] = c
- b.n++
- return nil
-}
-
-// WriteRune writes a single Unicode code point, returning
-// the number of bytes written and any error.
-func (b *AsyncWriter) WriteRune(r rune) (size int, err error) {
- if r < utf8.RuneSelf {
- err = b.WriteByte(byte(r))
- if err != nil {
- return 0, err
- }
- return 1, nil
- }
- if b.err != nil {
- return 0, b.err
- }
- n := b.Available()
- if n < utf8.UTFMax {
- if b.sendData(); b.err != nil {
- return 0, b.err
- }
- n = b.Available()
- if n < utf8.UTFMax {
- // Can only happen if buffer is silly small.
- return b.WriteString(string(r))
- }
- }
- size = utf8.EncodeRune(b.buf[b.n:], r)
- b.n += size
- return size, nil
-}
-
-// WriteString writes a string.
-// It returns the number of bytes written.
-// If the count is less than len(s), it also returns an error explaining
-// why the write is short.
-func (b *AsyncWriter) WriteString(s string) (int, error) {
- nn := 0
- for len(s) > b.Available() && b.err == nil {
- n := copy(b.buf[b.n:], s)
- b.n += n
- nn += n
- s = s[n:]
- b.sendData()
- }
- if b.err != nil {
- return nn, b.err
- }
- n := copy(b.buf[b.n:], s)
- b.n += n
- nn += n
- return nn, nil
-}
-
-// ReadFrom implements io.ReaderFrom.
-func (b *AsyncWriter) ReadFrom(r io.Reader) (n int64, err error) {
- if b.Buffered() == 0 {
- if w, ok := b.wr.(io.ReaderFrom); ok {
- return w.ReadFrom(r)
- }
- }
- var m int
- for {
- m, err = r.Read(b.buf[b.n:])
- if m == 0 {
- break
- }
- b.n += m
- n += int64(m)
- if b.Available() == 0 {
- if err1 := b.sendData(); err1 != nil {
- return n, err1
- }
- }
- if err != nil {
- break
- }
- }
- if err == io.EOF {
- err = nil
- }
- return n, err
-}
diff --git a/go/bufio2/bufio_test.go b/go/bufio2/bufio_test.go
deleted file mode 100644
index ad89e23f4e0..00000000000
--- a/go/bufio2/bufio_test.go
+++ /dev/null
@@ -1,1047 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bufio2
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "io"
- "io/ioutil"
- "strings"
- "testing"
- "testing/iotest"
- "unicode/utf8"
-)
-
-const minReadBufferSize = 16
-
-// Reads from a reader and rot13s the result.
-type rot13Reader struct {
- r io.Reader
-}
-
-func newRot13Reader(r io.Reader) *rot13Reader {
- r13 := new(rot13Reader)
- r13.r = r
- return r13
-}
-
-func (r13 *rot13Reader) Read(p []byte) (int, error) {
- n, err := r13.r.Read(p)
- if err != nil {
- return n, err
- }
- for i := 0; i < n; i++ {
- c := p[i] | 0x20 // lowercase byte
- if 'a' <= c && c <= 'm' {
- p[i] += 13
- } else if 'n' <= c && c <= 'z' {
- p[i] -= 13
- }
- }
- return n, nil
-}
-
-// Call ReadByte to accumulate the text of a file
-func readBytes(buf *bufio.Reader) string {
- var b [1000]byte
- nb := 0
- for {
- c, err := buf.ReadByte()
- if err == io.EOF {
- break
- }
- if err == nil {
- b[nb] = c
- nb++
- } else if err != iotest.ErrTimeout {
- panic("Data: " + err.Error())
- }
- }
- return string(b[0:nb])
-}
-
-func TestReaderSimple(t *testing.T) {
- data := "hello world"
- b := bufio.NewReader(bytes.NewBufferString(data))
- if s := readBytes(b); s != "hello world" {
- t.Errorf("simple hello world test failed: got %q", s)
- }
-
- b = bufio.NewReader(newRot13Reader(bytes.NewBufferString(data)))
- if s := readBytes(b); s != "uryyb jbeyq" {
- t.Errorf("rot13 hello world test failed: got %q", s)
- }
-}
-
-type readMaker struct {
- name string
- fn func(io.Reader) io.Reader
-}
-
-var readMakers = []readMaker{
- {"full", func(r io.Reader) io.Reader { return r }},
- {"byte", iotest.OneByteReader},
- {"half", iotest.HalfReader},
- {"data+err", iotest.DataErrReader},
- {"timeout", iotest.TimeoutReader},
-}
-
-// Call ReadString (which ends up calling everything else)
-// to accumulate the text of a file.
-func readLines(b *bufio.Reader) string {
- s := ""
- for {
- s1, err := b.ReadString('\n')
- if err == io.EOF {
- break
- }
- if err != nil && err != iotest.ErrTimeout {
- panic("GetLines: " + err.Error())
- }
- s += s1
- }
- return s
-}
-
-// Call Read to accumulate the text of a file
-func reads(buf *bufio.Reader, m int) string {
- var b [1000]byte
- nb := 0
- for {
- n, err := buf.Read(b[nb : nb+m])
- nb += n
- if err == io.EOF {
- break
- }
- }
- return string(b[0:nb])
-}
-
-type bufReader struct {
- name string
- fn func(*bufio.Reader) string
-}
-
-var bufreaders = []bufReader{
- {"1", func(b *bufio.Reader) string { return reads(b, 1) }},
- {"2", func(b *bufio.Reader) string { return reads(b, 2) }},
- {"3", func(b *bufio.Reader) string { return reads(b, 3) }},
- {"4", func(b *bufio.Reader) string { return reads(b, 4) }},
- {"5", func(b *bufio.Reader) string { return reads(b, 5) }},
- {"7", func(b *bufio.Reader) string { return reads(b, 7) }},
- {"bytes", readBytes},
- {"lines", readLines},
-}
-
-var bufsizes = []int{
- minReadBufferSize, 23, 32, 46, 64, 93, 128, 1024, 4096,
-}
-
-func TestReader(t *testing.T) {
- var texts [31]string
- str := ""
- all := ""
- for i := 0; i < len(texts)-1; i++ {
- texts[i] = str + "\n"
- all += texts[i]
- str += string(i%26 + 'a')
- }
- texts[len(texts)-1] = all
-
- for h := 0; h < len(texts); h++ {
- text := texts[h]
- for i := 0; i < len(readMakers); i++ {
- for j := 0; j < len(bufreaders); j++ {
- for k := 0; k < len(bufsizes); k++ {
- readmaker := readMakers[i]
- bufreader := bufreaders[j]
- bufsize := bufsizes[k]
- read := readmaker.fn(bytes.NewBufferString(text))
- buf := bufio.NewReaderSize(read, bufsize)
- s := bufreader.fn(buf)
- if s != text {
- t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q",
- readmaker.name, bufreader.name, bufsize, text, s)
- }
- }
- }
- }
- }
-}
-
-// A StringReader delivers its data one string segment at a time via Read.
-type StringReader struct {
- data []string
- step int
-}
-
-func (r *StringReader) Read(p []byte) (n int, err error) {
- if r.step < len(r.data) {
- s := r.data[r.step]
- n = copy(p, s)
- r.step++
- } else {
- err = io.EOF
- }
- return
-}
-
-func readRuneSegments(t *testing.T, segments []string) {
- got := ""
- want := strings.Join(segments, "")
- r := bufio.NewReader(&StringReader{data: segments})
- for {
- r, _, err := r.ReadRune()
- if err != nil {
- if err != io.EOF {
- return
- }
- break
- }
- got += string(r)
- }
- if got != want {
- t.Errorf("segments=%v got=%s want=%s", segments, got, want)
- }
-}
-
-var segmentList = [][]string{
- {},
- {""},
- {"日", "本語"},
- {"\u65e5", "\u672c", "\u8a9e"},
- {"\U000065e5", "\U0000672c", "\U00008a9e"},
- {"\xe6", "\x97\xa5\xe6", "\x9c\xac\xe8\xaa\x9e"},
- {"Hello", ", ", "World", "!"},
- {"Hello", ", ", "", "World", "!"},
-}
-
-func TestReadRune(t *testing.T) {
- for _, s := range segmentList {
- readRuneSegments(t, s)
- }
-}
-
-func TestUnreadRune(t *testing.T) {
- got := ""
- segments := []string{"Hello, world:", "日本語"}
- data := strings.Join(segments, "")
- r := bufio.NewReader(&StringReader{data: segments})
- // Normal execution.
- for {
- r1, _, err := r.ReadRune()
- if err != nil {
- if err != io.EOF {
- t.Error("unexpected EOF")
- }
- break
- }
- got += string(r1)
- // Put it back and read it again
- if err = r.UnreadRune(); err != nil {
- t.Error("unexpected error on UnreadRune:", err)
- }
- r2, _, err := r.ReadRune()
- if err != nil {
- t.Error("unexpected error reading after unreading:", err)
- }
- if r1 != r2 {
- t.Errorf("incorrect rune after unread: got %c wanted %c", r1, r2)
- }
- }
- if got != data {
- t.Errorf("want=%q got=%q", data, got)
- }
-}
-
-// Test that UnreadRune fails if the preceding operation was not a ReadRune.
-func TestUnreadRuneError(t *testing.T) {
- buf := make([]byte, 3) // All runes in this test are 3 bytes long
- r := bufio.NewReader(&StringReader{data: []string{"日本語日本語日本語"}})
- if r.UnreadRune() == nil {
- t.Error("expected error on UnreadRune from fresh buffer")
- }
- _, _, err := r.ReadRune()
- if err != nil {
- t.Error("unexpected error on ReadRune (1):", err)
- }
- if err = r.UnreadRune(); err != nil {
- t.Error("unexpected error on UnreadRune (1):", err)
- }
- if r.UnreadRune() == nil {
- t.Error("expected error after UnreadRune (1)")
- }
- // Test error after Read.
- _, _, err = r.ReadRune() // reset state
- if err != nil {
- t.Error("unexpected error on ReadRune (2):", err)
- }
- _, err = r.Read(buf)
- if err != nil {
- t.Error("unexpected error on Read (2):", err)
- }
- if r.UnreadRune() == nil {
- t.Error("expected error after Read (2)")
- }
- // Test error after ReadByte.
- _, _, err = r.ReadRune() // reset state
- if err != nil {
- t.Error("unexpected error on ReadRune (2):", err)
- }
- for range buf {
- _, err = r.ReadByte()
- if err != nil {
- t.Error("unexpected error on ReadByte (2):", err)
- }
- }
- if r.UnreadRune() == nil {
- t.Error("expected error after ReadByte")
- }
- // Test error after UnreadByte.
- _, _, err = r.ReadRune() // reset state
- if err != nil {
- t.Error("unexpected error on ReadRune (3):", err)
- }
- _, err = r.ReadByte()
- if err != nil {
- t.Error("unexpected error on ReadByte (3):", err)
- }
- err = r.UnreadByte()
- if err != nil {
- t.Error("unexpected error on UnreadByte (3):", err)
- }
- if r.UnreadRune() == nil {
- t.Error("expected error after UnreadByte (3)")
- }
-}
-
-func TestUnreadRuneAtEOF(t *testing.T) {
- // UnreadRune/ReadRune should error at EOF (was a bug; used to panic)
- r := bufio.NewReader(strings.NewReader("x"))
- r.ReadRune()
- r.ReadRune()
- r.UnreadRune()
- _, _, err := r.ReadRune()
- if err == nil {
- t.Error("expected error at EOF")
- } else if err != io.EOF {
- t.Error("expected EOF; got", err)
- }
-}
-
-func TestReadWriteRune(t *testing.T) {
- const NRune = 1000
- byteBuf := new(bytes.Buffer)
- w := NewAsyncWriter(byteBuf)
- // Write the runes out using WriteRune
- buf := make([]byte, utf8.UTFMax)
- for r := rune(0); r < NRune; r++ {
- size := utf8.EncodeRune(buf, r)
- nbytes, err := w.WriteRune(r)
- if err != nil {
- t.Fatalf("WriteRune(0x%x) error: %s", r, err)
- }
- if nbytes != size {
- t.Fatalf("WriteRune(0x%x) expected %d, got %d", r, size, nbytes)
- }
- }
- w.Flush()
-
- r := bufio.NewReader(byteBuf)
- // Read them back with ReadRune
- for r1 := rune(0); r1 < NRune; r1++ {
- size := utf8.EncodeRune(buf, r1)
- nr, nbytes, err := r.ReadRune()
- if nr != r1 || nbytes != size || err != nil {
- t.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r1, nr, nbytes, r1, size, err)
- }
- }
-}
-
-func TestWriter(t *testing.T) {
- var data [8192]byte
-
- for i := 0; i < len(data); i++ {
- data[i] = byte(' ' + i%('~'-' '))
- }
- w := new(bytes.Buffer)
- for i := 0; i < len(bufsizes); i++ {
- for j := 0; j < len(bufsizes); j++ {
- nwrite := bufsizes[i]
- bs := bufsizes[j]
-
- // Write nwrite bytes using buffer size bs.
- // Check that the right amount makes it out
- // and that the data is correct.
-
- w.Reset()
- buf := NewAsyncWriterSize(w, bs, defaultBufCount)
- context := fmt.Sprintf("nwrite=%d bufsize=%d", nwrite, bs)
- n, e1 := buf.Write(data[0:nwrite])
- if e1 != nil || n != nwrite {
- t.Errorf("%s: buf.Write %d = %d, %v", context, nwrite, n, e1)
- continue
- }
- if e := buf.Flush(); e != nil {
- t.Errorf("%s: buf.Flush = %v", context, e)
- }
-
- written := w.Bytes()
- if len(written) != nwrite {
- t.Errorf("%s: %d bytes written", context, len(written))
- }
- for l := 0; l < len(written); l++ {
- if written[i] != data[i] {
- t.Errorf("wrong bytes written")
- t.Errorf("want=%q", data[0:len(written)])
- t.Errorf("have=%q", written)
- }
- }
- }
- }
-}
-
-// Check that write errors are returned properly.
-
-type errorWriterTest struct {
- n, m int
- err error
- expect error
-}
-
-func (w errorWriterTest) Write(p []byte) (int, error) {
- return len(p) * w.n / w.m, w.err
-}
-
-var errorWriterTests = []errorWriterTest{
- {0, 1, nil, io.ErrShortWrite},
- {1, 2, nil, io.ErrShortWrite},
- {1, 1, nil, nil},
- {0, 1, io.ErrClosedPipe, io.ErrClosedPipe},
- {1, 2, io.ErrClosedPipe, io.ErrClosedPipe},
- {1, 1, io.ErrClosedPipe, io.ErrClosedPipe},
-}
-
-func TestWriteErrors(t *testing.T) {
- for _, w := range errorWriterTests {
- buf := NewAsyncWriter(w)
- _, e := buf.Write([]byte("hello world"))
- if e != nil {
- t.Errorf("Write hello to %v: %v", w, e)
- continue
- }
- e = buf.Flush()
- if e != w.expect {
- t.Errorf("Flush %v: got %v, wanted %v", w, e, w.expect)
- }
- }
-}
-
-func TestNewReaderSizeIdempotent(t *testing.T) {
- const BufSize = 1000
- b := bufio.NewReaderSize(bytes.NewBufferString("hello world"), BufSize)
- // Does it recognize itself?
- b1 := bufio.NewReaderSize(b, BufSize)
- if b1 != b {
- t.Error("bufio.NewReaderSize did not detect underlying Reader")
- }
- // Does it wrap if existing buffer is too small?
- b2 := bufio.NewReaderSize(b, 2*BufSize)
- if b2 == b {
- t.Error("bufio.NewReaderSize did not enlarge buffer")
- }
-}
-
-func TestNewWriterSizeIdempotent(t *testing.T) {
- const BufSize = 1000
- b := NewAsyncWriterSize(new(bytes.Buffer), BufSize, defaultBufCount)
- // Does it recognize itself?
- b1 := NewAsyncWriterSize(b, BufSize, defaultBufCount)
- if b1 != b {
- t.Error("NewAsyncWriterSize did not detect underlying Writer")
- }
- // Does it wrap if existing buffer is too small?
- b2 := NewAsyncWriterSize(b, 2*BufSize, defaultBufCount)
- if b2 == b {
- t.Error("NewAsyncWriterSize did not enlarge buffer")
- }
-}
-
-func TestWriteString(t *testing.T) {
- const BufSize = 8
- buf := new(bytes.Buffer)
- b := NewAsyncWriterSize(buf, BufSize, defaultBufCount)
- b.WriteString("0") // easy
- b.WriteString("123456") // still easy
- b.WriteString("7890") // easy after flush
- b.WriteString("abcdefghijklmnopqrstuvwxy") // hard
- b.WriteString("z")
- if err := b.Flush(); err != nil {
- t.Error("WriteString", err)
- }
- s := "01234567890abcdefghijklmnopqrstuvwxyz"
- if string(buf.Bytes()) != s {
- t.Errorf("WriteString wants %q gets %q", s, string(buf.Bytes()))
- }
-}
-
-func TestBufferFull(t *testing.T) {
- const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party"
- buf := bufio.NewReaderSize(strings.NewReader(longString), minReadBufferSize)
- line, err := buf.ReadSlice('!')
- if string(line) != "And now, hello, " || err != bufio.ErrBufferFull {
- t.Errorf("first ReadSlice(,) = %q, %v", line, err)
- }
- line, err = buf.ReadSlice('!')
- if string(line) != "world!" || err != nil {
- t.Errorf("second ReadSlice(,) = %q, %v", line, err)
- }
-}
-
-func TestPeek(t *testing.T) {
- p := make([]byte, 10)
- // string is 16 (minReadBufferSize) long.
- buf := bufio.NewReaderSize(strings.NewReader("abcdefghijklmnop"), minReadBufferSize)
- if s, err := buf.Peek(1); string(s) != "a" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "a", string(s), err)
- }
- if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "abcd", string(s), err)
- }
- if _, err := buf.Peek(32); err != bufio.ErrBufferFull {
- t.Fatalf("want ErrBufFull got %v", err)
- }
- if _, err := buf.Read(p[0:3]); string(p[0:3]) != "abc" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "abc", string(p[0:3]), err)
- }
- if s, err := buf.Peek(1); string(s) != "d" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "d", string(s), err)
- }
- if s, err := buf.Peek(2); string(s) != "de" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "de", string(s), err)
- }
- if _, err := buf.Read(p[0:3]); string(p[0:3]) != "def" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "def", string(p[0:3]), err)
- }
- if s, err := buf.Peek(4); string(s) != "ghij" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "ghij", string(s), err)
- }
- if _, err := buf.Read(p[0:]); string(p[0:]) != "ghijklmnop" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "ghijklmnop", string(p[0:minReadBufferSize]), err)
- }
- if s, err := buf.Peek(0); string(s) != "" || err != nil {
- t.Fatalf("want %q got %q, err=%v", "", string(s), err)
- }
- if _, err := buf.Peek(1); err != io.EOF {
- t.Fatalf("want EOF got %v", err)
- }
-
- // Test for issue 3022, not exposing a reader's error on a successful Peek.
- buf = bufio.NewReaderSize(dataAndEOFReader("abcd"), 32)
- if s, err := buf.Peek(2); string(s) != "ab" || err != nil {
- t.Errorf(`Peek(2) on "abcd", EOF = %q, %v; want "ab", nil`, string(s), err)
- }
- if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
- t.Errorf(`Peek(4) on "abcd", EOF = %q, %v; want "abcd", nil`, string(s), err)
- }
- if n, err := buf.Read(p[0:5]); string(p[0:n]) != "abcd" || err != nil {
- t.Fatalf("Read after peek = %q, %v; want abcd, EOF", p[0:n], err)
- }
- if n, err := buf.Read(p[0:1]); string(p[0:n]) != "" || err != io.EOF {
- t.Fatalf(`second Read after peek = %q, %v; want "", EOF`, p[0:n], err)
- }
-}
-
-type dataAndEOFReader string
-
-func (r dataAndEOFReader) Read(p []byte) (int, error) {
- return copy(p, r), io.EOF
-}
-
-func TestPeekThenUnreadRune(t *testing.T) {
- // This sequence used to cause a crash.
- r := bufio.NewReader(strings.NewReader("x"))
- r.ReadRune()
- r.Peek(1)
- r.UnreadRune()
- r.ReadRune() // Used to panic here
-}
-
-var testOutput = []byte("0123456789abcdefghijklmnopqrstuvwxy")
-var testInput = []byte("012\n345\n678\n9ab\ncde\nfgh\nijk\nlmn\nopq\nrst\nuvw\nxy")
-var testInputrn = []byte("012\r\n345\r\n678\r\n9ab\r\ncde\r\nfgh\r\nijk\r\nlmn\r\nopq\r\nrst\r\nuvw\r\nxy\r\n\n\r\n")
-
-// TestReader wraps a []byte and returns reads of a specific length.
-type testReader struct {
- data []byte
- stride int
-}
-
-func (t *testReader) Read(buf []byte) (n int, err error) {
- n = t.stride
- if n > len(t.data) {
- n = len(t.data)
- }
- if n > len(buf) {
- n = len(buf)
- }
- copy(buf, t.data)
- t.data = t.data[n:]
- if len(t.data) == 0 {
- err = io.EOF
- }
- return
-}
-
-func testReadLine(t *testing.T, input []byte) {
- //for stride := 1; stride < len(input); stride++ {
- for stride := 1; stride < 2; stride++ {
- done := 0
- reader := testReader{input, stride}
- l := bufio.NewReaderSize(&reader, len(input)+1)
- for {
- line, isPrefix, err := l.ReadLine()
- if len(line) > 0 && err != nil {
- t.Errorf("ReadLine returned both data and error: %s", err)
- }
- if isPrefix {
- t.Errorf("ReadLine returned prefix")
- }
- if err != nil {
- if err != io.EOF {
- t.Fatalf("Got unknown error: %s", err)
- }
- break
- }
- if want := testOutput[done : done+len(line)]; !bytes.Equal(want, line) {
- t.Errorf("Bad line at stride %d: want: %x got: %x", stride, want, line)
- }
- done += len(line)
- }
- if done != len(testOutput) {
- t.Errorf("ReadLine didn't return everything: got: %d, want: %d (stride: %d)", done, len(testOutput), stride)
- }
- }
-}
-
-func TestReadLine(t *testing.T) {
- testReadLine(t, testInput)
- testReadLine(t, testInputrn)
-}
-
-func TestLineTooLong(t *testing.T) {
- data := make([]byte, 0)
- for i := 0; i < minReadBufferSize*5/2; i++ {
- data = append(data, '0'+byte(i%10))
- }
- buf := bytes.NewBuffer(data)
- l := bufio.NewReaderSize(buf, minReadBufferSize)
- line, isPrefix, err := l.ReadLine()
- if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
- t.Errorf("bad result for first line: got %q want %q %v", line, data[:minReadBufferSize], err)
- }
- data = data[len(line):]
- line, isPrefix, err = l.ReadLine()
- if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
- t.Errorf("bad result for second line: got %q want %q %v", line, data[:minReadBufferSize], err)
- }
- data = data[len(line):]
- line, isPrefix, err = l.ReadLine()
- if isPrefix || !bytes.Equal(line, data[:minReadBufferSize/2]) || err != nil {
- t.Errorf("bad result for third line: got %q want %q %v", line, data[:minReadBufferSize/2], err)
- }
- line, isPrefix, err = l.ReadLine()
- if isPrefix || err == nil {
- t.Errorf("expected no more lines: %x %s", line, err)
- }
-}
-
-func TestReadAfterLines(t *testing.T) {
- line1 := "this is line1"
- restData := "this is line2\nthis is line 3\n"
- inbuf := bytes.NewBuffer([]byte(line1 + "\n" + restData))
- outbuf := new(bytes.Buffer)
- maxLineLength := len(line1) + len(restData)/2
- l := bufio.NewReaderSize(inbuf, maxLineLength)
- line, isPrefix, err := l.ReadLine()
- if isPrefix || err != nil || string(line) != line1 {
- t.Errorf("bad result for first line: isPrefix=%v err=%v line=%q", isPrefix, err, string(line))
- }
- n, err := io.Copy(outbuf, l)
- if int(n) != len(restData) || err != nil {
- t.Errorf("bad result for Read: n=%d err=%v", n, err)
- }
- if outbuf.String() != restData {
- t.Errorf("bad result for Read: got %q; expected %q", outbuf.String(), restData)
- }
-}
-
-func TestReadEmptyBuffer(t *testing.T) {
- l := bufio.NewReaderSize(new(bytes.Buffer), minReadBufferSize)
- line, isPrefix, err := l.ReadLine()
- if err != io.EOF {
- t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
- }
-}
-
-func TestLinesAfterRead(t *testing.T) {
- l := bufio.NewReaderSize(bytes.NewBuffer([]byte("foo")), minReadBufferSize)
- _, err := ioutil.ReadAll(l)
- if err != nil {
- t.Error(err)
- return
- }
-
- line, isPrefix, err := l.ReadLine()
- if err != io.EOF {
- t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
- }
-}
-
-func TestReadLineNonNilLineOrError(t *testing.T) {
- r := bufio.NewReader(strings.NewReader("line 1\n"))
- for i := 0; i < 2; i++ {
- l, _, err := r.ReadLine()
- if l != nil && err != nil {
- t.Fatalf("on line %d/2; ReadLine=%#v, %v; want non-nil line or Error, but not both",
- i+1, l, err)
- }
- }
-}
-
-type readLineResult struct {
- line []byte
- isPrefix bool
- err error
-}
-
-var readLineNewlinesTests = []struct {
- input string
- expect []readLineResult
-}{
- {"012345678901234\r\n012345678901234\r\n", []readLineResult{
- {[]byte("012345678901234"), true, nil},
- {nil, false, nil},
- {[]byte("012345678901234"), true, nil},
- {nil, false, nil},
- {nil, false, io.EOF},
- }},
- {"0123456789012345\r012345678901234\r", []readLineResult{
- {[]byte("0123456789012345"), true, nil},
- {[]byte("\r012345678901234"), true, nil},
- {[]byte("\r"), false, nil},
- {nil, false, io.EOF},
- }},
-}
-
-func TestReadLineNewlines(t *testing.T) {
- for _, e := range readLineNewlinesTests {
- testReadLineNewlines(t, e.input, e.expect)
- }
-}
-
-func testReadLineNewlines(t *testing.T, input string, expect []readLineResult) {
- b := bufio.NewReaderSize(strings.NewReader(input), minReadBufferSize)
- for i, e := range expect {
- line, isPrefix, err := b.ReadLine()
- if !bytes.Equal(line, e.line) {
- t.Errorf("%q call %d, line == %q, want %q", input, i, line, e.line)
- return
- }
- if isPrefix != e.isPrefix {
- t.Errorf("%q call %d, isPrefix == %v, want %v", input, i, isPrefix, e.isPrefix)
- return
- }
- if err != e.err {
- t.Errorf("%q call %d, err == %v, want %v", input, i, err, e.err)
- return
- }
- }
-}
-
-func createTestInput(n int) []byte {
- input := make([]byte, n)
- for i := range input {
- // 101 and 251 are arbitrary prime numbers.
- // The idea is to create an input sequence
- // which doesn't repeat too frequently.
- input[i] = byte(i % 251)
- if i%101 == 0 {
- input[i] ^= byte(i / 101)
- }
- }
- return input
-}
-
-func TestReaderWriteTo(t *testing.T) {
- input := createTestInput(8192)
- r := bufio.NewReader(onlyReader{bytes.NewBuffer(input)})
- w := new(bytes.Buffer)
- if n, err := r.WriteTo(w); err != nil || n != int64(len(input)) {
- t.Fatalf("r.WriteTo(w) = %d, %v, want %d, nil", n, err, len(input))
- }
-
- for i, val := range w.Bytes() {
- if val != input[i] {
- t.Errorf("after write: out[%d] = %#x, want %#x", i, val, input[i])
- }
- }
-}
-
-type errorWriterToTest struct {
- rn, wn int
- rerr, werr error
- expected error
-}
-
-func (r errorWriterToTest) Read(p []byte) (int, error) {
- return len(p) * r.rn, r.rerr
-}
-
-func (w errorWriterToTest) Write(p []byte) (int, error) {
- return len(p) * w.wn, w.werr
-}
-
-var errorWriterToTests = []errorWriterToTest{
- {1, 0, nil, io.ErrClosedPipe, io.ErrClosedPipe},
- {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
- {0, 0, io.ErrUnexpectedEOF, io.ErrClosedPipe, io.ErrClosedPipe},
- {0, 1, io.EOF, nil, nil},
-}
-
-func TestReaderWriteToErrors(t *testing.T) {
- for i, rw := range errorWriterToTests {
- r := bufio.NewReader(rw)
- if _, err := r.WriteTo(rw); err != rw.expected {
- t.Errorf("r.WriteTo(errorWriterToTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
- }
- }
-}
-
-func TestWriterReadFrom(t *testing.T) {
- ws := []func(io.Writer) io.Writer{
- func(w io.Writer) io.Writer { return onlyWriter{w} },
- func(w io.Writer) io.Writer { return w },
- }
-
- rs := []func(io.Reader) io.Reader{
- iotest.DataErrReader,
- func(r io.Reader) io.Reader { return r },
- }
-
- for ri, rfunc := range rs {
- for wi, wfunc := range ws {
- input := createTestInput(8192)
- b := new(bytes.Buffer)
- w := NewAsyncWriter(wfunc(b))
- r := rfunc(bytes.NewBuffer(input))
- if n, err := w.ReadFrom(r); err != nil || n != int64(len(input)) {
- t.Errorf("ws[%d],rs[%d]: w.ReadFrom(r) = %d, %v, want %d, nil", wi, ri, n, err, len(input))
- continue
- }
- w.WaitForWrites()
- if got, want := b.String(), string(input); got != want {
- t.Errorf("ws[%d], rs[%d]:\ngot %q\nwant %q\n", wi, ri, got, want)
- }
- }
- }
-}
-
-type errorReaderFromTest struct {
- rn, wn int
- rerr, werr error
- expected error
-}
-
-func (r errorReaderFromTest) Read(p []byte) (int, error) {
- return len(p) * r.rn, r.rerr
-}
-
-func (w errorReaderFromTest) Write(p []byte) (int, error) {
- return len(p) * w.wn, w.werr
-}
-
-var errorReaderFromTests = []errorReaderFromTest{
- {0, 1, io.EOF, nil, nil},
- {1, 1, io.EOF, nil, nil},
- {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
- {0, 0, io.ErrClosedPipe, io.ErrShortWrite, io.ErrClosedPipe},
- {1, 0, nil, io.ErrShortWrite, io.ErrShortWrite},
-}
-
-func TestWriterReadFromErrors(t *testing.T) {
- for i, rw := range errorReaderFromTests {
- w := NewAsyncWriter(rw)
- if _, err := w.ReadFrom(rw); err != rw.expected {
- t.Errorf("w.ReadFrom(errorReaderFromTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
- }
- }
-}
-
-// TestWriterReadFromCounts tests that using io.Copy to copy into a
-// bufio.Writer does not prematurely flush the buffer. For example, when
-// buffering writes to a network socket, excessive network writes should be
-// avoided.
-func TestWriterReadFromCounts(t *testing.T) {
- var w0 writeCountingDiscard
- b0 := NewAsyncWriterSize(&w0, 1234, defaultBufCount)
- b0.WriteString(strings.Repeat("x", 1000))
- if w0 != 0 {
- t.Fatalf("write 1000 'x's: got %d writes, want 0", w0)
- }
- b0.WriteString(strings.Repeat("x", 200))
- if w0 != 0 {
- t.Fatalf("write 1200 'x's: got %d writes, want 0", w0)
- }
- io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 30))})
- if w0 != 0 {
- t.Fatalf("write 1230 'x's: got %d writes, want 0", w0)
- }
- io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 9))})
- b0.WaitForWrites()
- if w0 != 1 {
- t.Fatalf("write 1239 'x's: got %d writes, want 1", w0)
- }
-
- var w1 writeCountingDiscard
- b1 := NewAsyncWriterSize(&w1, 1234, defaultBufCount)
- b1.WriteString(strings.Repeat("x", 1200))
- b1.Flush()
- if w1 != 1 {
- t.Fatalf("flush 1200 'x's: got %d writes, want 1", w1)
- }
- b1.WriteString(strings.Repeat("x", 89))
- if w1 != 1 {
- t.Fatalf("write 1200 + 89 'x's: got %d writes, want 1", w1)
- }
- io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 700))})
- if w1 != 1 {
- t.Fatalf("write 1200 + 789 'x's: got %d writes, want 1", w1)
- }
- io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 600))})
- b1.WaitForWrites()
- if w1 != 2 {
- t.Fatalf("write 1200 + 1389 'x's: got %d writes, want 2", w1)
- }
- b1.Flush()
- if w1 != 3 {
- t.Fatalf("flush 1200 + 1389 'x's: got %d writes, want 3", w1)
- }
-}
-
-// A writeCountingDiscard is like ioutil.Discard and counts the number of times
-// Write is called on it.
-type writeCountingDiscard int
-
-func (w *writeCountingDiscard) Write(p []byte) (int, error) {
- *w++
- return len(p), nil
-}
-
-type negativeReader int
-
-func (r *negativeReader) Read([]byte) (int, error) { return -1, nil }
-
-func TestNegativeRead(t *testing.T) {
- // should panic with a description pointing at the reader, not at itself.
- // (should NOT panic with slice index error, for example.)
- b := bufio.NewReader(new(negativeReader))
- defer func() {
- switch err := recover().(type) {
- case nil:
- t.Fatal("read did not panic")
- case error:
- if !strings.Contains(err.Error(), "reader returned negative count from Read") {
- t.Fatalf("wrong panic: %v", err)
- }
- default:
- t.Fatalf("unexpected panic value: %T(%v)", err, err)
- }
- }()
- b.Read(make([]byte, 100))
-}
-
-// An onlyReader only implements io.Reader, no matter what other methods the underlying implementation may have.
-type onlyReader struct {
- r io.Reader
-}
-
-func (r onlyReader) Read(b []byte) (int, error) {
- return r.r.Read(b)
-}
-
-// An onlyWriter only implements io.Writer, no matter what other methods the underlying implementation may have.
-type onlyWriter struct {
- w io.Writer
-}
-
-func (w onlyWriter) Write(b []byte) (int, error) {
- return w.w.Write(b)
-}
-
-func BenchmarkReaderCopyOptimal(b *testing.B) {
- // Optimal case is where the underlying reader implements io.WriterTo
- for i := 0; i < b.N; i++ {
- b.StopTimer()
- src := bufio.NewReader(bytes.NewBuffer(make([]byte, 8192)))
- dst := onlyWriter{new(bytes.Buffer)}
- b.StartTimer()
- io.Copy(dst, src)
- }
-}
-
-func BenchmarkReaderCopyUnoptimal(b *testing.B) {
- // Unoptimal case is where the underlying reader doesn't implement io.WriterTo
- for i := 0; i < b.N; i++ {
- b.StopTimer()
- src := bufio.NewReader(onlyReader{bytes.NewBuffer(make([]byte, 8192))})
- dst := onlyWriter{new(bytes.Buffer)}
- b.StartTimer()
- io.Copy(dst, src)
- }
-}
-
-func BenchmarkReaderCopyNoWriteTo(b *testing.B) {
- for i := 0; i < b.N; i++ {
- b.StopTimer()
- src := onlyReader{bufio.NewReader(bytes.NewBuffer(make([]byte, 8192)))}
- dst := onlyWriter{new(bytes.Buffer)}
- b.StartTimer()
- io.Copy(dst, src)
- }
-}
-
-func BenchmarkWriterCopyOptimal(b *testing.B) {
- // Optimal case is where the underlying writer implements io.ReaderFrom
- for i := 0; i < b.N; i++ {
- b.StopTimer()
- src := onlyReader{bytes.NewBuffer(make([]byte, 8192))}
- dst := NewAsyncWriter(new(bytes.Buffer))
- b.StartTimer()
- io.Copy(dst, src)
- }
-}
-
-func BenchmarkWriterCopyUnoptimal(b *testing.B) {
- for i := 0; i < b.N; i++ {
- b.StopTimer()
- src := onlyReader{bytes.NewBuffer(make([]byte, 8192))}
- dst := NewAsyncWriter(onlyWriter{new(bytes.Buffer)})
- b.StartTimer()
- io.Copy(dst, src)
- }
-}
-
-func BenchmarkWriterCopyNoReadFrom(b *testing.B) {
- for i := 0; i < b.N; i++ {
- b.StopTimer()
- src := onlyReader{bytes.NewBuffer(make([]byte, 8192))}
- dst := onlyWriter{NewAsyncWriter(new(bytes.Buffer))}
- b.StartTimer()
- io.Copy(dst, src)
- }
-}
diff --git a/go/bytes2/chunked_writer.go b/go/bytes2/chunked_writer.go
deleted file mode 100644
index 014c35fcee4..00000000000
--- a/go/bytes2/chunked_writer.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2012, Google Inc. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package bytes2 provides alternate implementations of functionality similar
-// to go's bytes package.
-package bytes2
-
-import (
- "fmt"
- "io"
- "unicode/utf8"
-
- "github.com/youtube/vitess/go/hack"
-)
-
-// ChunkedWriter has the same interface as bytes.Buffer's write functions.
-// It additionally provides a Reserve function that returns a []byte that
-// the caller can directly change.
-type ChunkedWriter struct {
- bufs [][]byte
-}
-
-func NewChunkedWriter(chunkSize int) *ChunkedWriter {
- cw := &ChunkedWriter{make([][]byte, 1)}
- cw.bufs[0] = make([]byte, 0, chunkSize)
- return cw
-}
-
-// Bytes This function can get expensive for large buffers.
-func (cw *ChunkedWriter) Bytes() (b []byte) {
- if len(cw.bufs) == 1 {
- return cw.bufs[0]
- }
- b = make([]byte, 0, cw.Len())
- for _, buf := range cw.bufs {
- b = append(b, buf...)
- }
- return b
-}
-
-func (cw *ChunkedWriter) Len() int {
- l := 0
- for _, buf := range cw.bufs {
- l += len(buf)
- }
- return l
-}
-
-func (cw *ChunkedWriter) Reset() {
- b := cw.bufs[0][:0]
- cw.bufs = make([][]byte, 1)
- cw.bufs[0] = b
-}
-
-func (cw *ChunkedWriter) Truncate(n int) {
- for i, buf := range cw.bufs {
- if n > len(buf) {
- n -= len(buf)
- continue
- }
- cw.bufs[i] = buf[:n]
- cw.bufs = cw.bufs[:i+1]
- return
- }
- panic("bytes.ChunkedBuffer: truncation out of range")
-}
-
-func (cw *ChunkedWriter) Write(p []byte) (n int, err error) {
- return cw.WriteString(hack.String(p))
-}
-
-func (cw *ChunkedWriter) WriteString(p string) (n int, err error) {
- n = len(p)
- lastbuf := cw.bufs[len(cw.bufs)-1]
- for {
- available := cap(lastbuf) - len(lastbuf)
- required := len(p)
- if available >= required {
- cw.bufs[len(cw.bufs)-1] = append(lastbuf, p...)
- return
- }
- cw.bufs[len(cw.bufs)-1] = append(lastbuf, p[:available]...)
- p = p[available:]
- lastbuf = make([]byte, 0, cap(cw.bufs[0]))
- cw.bufs = append(cw.bufs, lastbuf)
- }
-}
-
-func (cw *ChunkedWriter) Reserve(n int) (b []byte) {
- if n > cap(cw.bufs[0]) {
- panic(fmt.Sprintf("bytes.ChunkedBuffer: Reserve request too high: %d > %d", n, cap(cw.bufs[0])))
- }
- lastbuf := cw.bufs[len(cw.bufs)-1]
- if n > cap(lastbuf)-len(lastbuf) {
- b = make([]byte, n, cap(cw.bufs[0]))
- cw.bufs = append(cw.bufs, b)
- return b
- }
- l := len(lastbuf)
- b = lastbuf[l : n+l]
- cw.bufs[len(cw.bufs)-1] = lastbuf[:n+l]
- return b
-}
-
-func (cw *ChunkedWriter) WriteByte(c byte) error {
- cw.Reserve(1)[0] = c
- return nil
-}
-
-func (cw *ChunkedWriter) WriteRune(r rune) (n int, err error) {
- n = utf8.EncodeRune(cw.Reserve(utf8.RuneLen(r)), r)
- return n, nil
-}
-
-func (cw *ChunkedWriter) WriteTo(w io.Writer) (n int64, err error) {
- for _, buf := range cw.bufs {
- m, err := w.Write(buf)
- n += int64(m)
- if err != nil {
- return n, err
- }
- if m != len(buf) {
- return n, io.ErrShortWrite
- }
- }
- cw.Reset()
- return n, nil
-}
diff --git a/go/bytes2/cw_test.go b/go/bytes2/cw_test.go
deleted file mode 100644
index 0a7ec347b01..00000000000
--- a/go/bytes2/cw_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2012, Google Inc. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package bytes2 gives you alternate implementations of functionality
-// similar to go's bytes package
-
-package bytes2
-
-import (
- "testing"
-)
-
-func TestWrite(t *testing.T) {
- cw := NewChunkedWriter(5)
- cw.Write([]byte("1234"))
- if string(cw.Bytes()) != "1234" {
- t.Errorf("Expecting 1234, received %s", cw.Bytes())
- }
- cw.WriteString("56")
- if string(cw.Bytes()) != "123456" {
- t.Errorf("Expecting 123456, received %s", cw.Bytes())
- }
- if cw.Len() != 6 {
- t.Errorf("Expecting 6, received %d", cw.Len())
- }
-}
-
-func TestTruncate(t *testing.T) {
- cw := NewChunkedWriter(3)
- cw.WriteString("123456789")
- cw.Truncate(8)
- if string(cw.Bytes()) != "12345678" {
- t.Errorf("Expecting 12345678, received %s", cw.Bytes())
- }
- cw.Truncate(5)
- if string(cw.Bytes()) != "12345" {
- t.Errorf("Expecting 12345, received %s", cw.Bytes())
- }
- cw.Truncate(2)
- if string(cw.Bytes()) != "12" {
- t.Errorf("Expecting 12345, received %s", cw.Bytes())
- }
- cw.Reset()
- if cw.Len() != 0 {
- t.Errorf("Expecting 0, received %d", cw.Len())
- }
-}
-
-func TestReserve(t *testing.T) {
- cw := NewChunkedWriter(4)
- b := cw.Reserve(2)
- b[0] = '1'
- b[1] = '2'
- cw.WriteByte('3')
- b = cw.Reserve(2)
- b[0] = '4'
- b[1] = '5'
- if string(cw.Bytes()) != "12345" {
- t.Errorf("Expecting 12345, received %s", cw.Bytes())
- }
-}
-
-func TestWriteTo(t *testing.T) {
- cw1 := NewChunkedWriter(4)
- cw1.WriteString("123456789")
- cw2 := NewChunkedWriter(5)
- cw1.WriteTo(cw2)
- if string(cw2.Bytes()) != "123456789" {
- t.Errorf("Expecting 123456789, received %s", cw2.Bytes())
- }
-}
diff --git a/go/mysqlconn/server.go b/go/mysqlconn/server.go
index 824427cef10..805a3510d85 100644
--- a/go/mysqlconn/server.go
+++ b/go/mysqlconn/server.go
@@ -258,7 +258,6 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32) {
switch data[0] {
case ComQuit:
- log.Infof("Client %v wants to disconnect, closing connection.", c.ConnectionID)
return
case ComInitDB:
db := c.parseComInitDB(data)
@@ -269,7 +268,6 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32) {
}
case ComQuery:
query := c.parseComQuery(data)
- log.Infof("Received command from client %v: %v", c.ConnectionID, query)
result, err := l.handler.ComQuery(c, query)
if err != nil {
if werr := c.writeErrorPacketFromError(err); werr != nil {
diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go
index ce1952f0354..41adbaa5b02 100644
--- a/go/vt/sqlparser/ast.go
+++ b/go/vt/sqlparser/ast.go
@@ -111,6 +111,11 @@ func (*DDL) iStatement() {}
func (*Show) iStatement() {}
func (*Other) iStatement() {}
+// ParenSelect can actually not be a top level statement,
+// but we have to allow it because it's a requirement
+// of SelectStatement.
+func (*ParenSelect) iStatement() {}
+
// SelectStatement any SELECT statement.
type SelectStatement interface {
iSelectStatement()
@@ -119,8 +124,9 @@ type SelectStatement interface {
SQLNode
}
-func (*Select) iSelectStatement() {}
-func (*Union) iSelectStatement() {}
+func (*Select) iSelectStatement() {}
+func (*Union) iSelectStatement() {}
+func (*ParenSelect) iSelectStatement() {}
// Select represents a SELECT statement.
type Select struct {
@@ -229,10 +235,34 @@ func (node *Select) AddHaving(expr Expr) {
return
}
+// ParenSelect is a parenthesized SELECT statement.
+type ParenSelect struct {
+ Select SelectStatement
+}
+
+// Format formats the node.
+func (node *ParenSelect) Format(buf *TrackedBuffer) {
+ buf.Myprintf("(%v)", node.Select)
+}
+
+// WalkSubtree walks the nodes of the subtree.
+func (node *ParenSelect) WalkSubtree(visit Visit) error {
+ if node == nil {
+ return nil
+ }
+ return Walk(
+ visit,
+ node.Select,
+ )
+}
+
// Union represents a UNION statement.
type Union struct {
Type string
Left, Right SelectStatement
+ OrderBy OrderBy
+ Limit *Limit
+ Lock string
}
// Union.Type
@@ -244,7 +274,8 @@ const (
// Format formats the node.
func (node *Union) Format(buf *TrackedBuffer) {
- buf.Myprintf("%v %s %v", node.Left, node.Type, node.Right)
+ buf.Myprintf("%v %s %v%v%v%s", node.Left, node.Type, node.Right,
+ node.OrderBy, node.Limit, node.Lock)
}
// WalkSubtree walks the nodes of the subtree.
@@ -297,9 +328,10 @@ type InsertRows interface {
SQLNode
}
-func (*Select) iInsertRows() {}
-func (*Union) iInsertRows() {}
-func (Values) iInsertRows() {}
+func (*Select) iInsertRows() {}
+func (*Union) iInsertRows() {}
+func (Values) iInsertRows() {}
+func (*ParenSelect) iInsertRows() {}
// Update represents an UPDATE statement.
type Update struct {
@@ -441,6 +473,7 @@ type Show struct {
Type string
}
+// The frollowing constants represent SHOW statements.
const (
ShowDatabasesStr = "show databases"
ShowKeyspacesStr = "show vitess_keyspaces"
diff --git a/go/vt/sqlparser/impossible_query.go b/go/vt/sqlparser/impossible_query.go
index 76a33cd66d4..8daf53aa4d0 100644
--- a/go/vt/sqlparser/impossible_query.go
+++ b/go/vt/sqlparser/impossible_query.go
@@ -15,6 +15,8 @@ func FormatImpossibleQuery(buf *TrackedBuffer, node SQLNode) {
if node.GroupBy != nil {
node.GroupBy.Format(buf)
}
+ case *Union:
+ buf.Myprintf("%v %s %v", node.Left, node.Type, node.Right)
default:
node.Format(buf)
}
diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go
index 435e9ccb448..47360257aab 100644
--- a/go/vt/sqlparser/parse_test.go
+++ b/go/vt/sqlparser/parse_test.go
@@ -80,6 +80,17 @@ func TestValid(t *testing.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",
+ }, {
+ input: "select /* union parenthesized select 2 */ 1 from t union (select 1 from t)",
+ }, {
+ 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 /* distinct */ distinct 1 from t",
}, {
@@ -510,6 +521,14 @@ func TestValid(t *testing.T) {
output: "insert /* qualified columns */ into t(a, b) values (1, 2)",
}, {
input: "insert /* select */ into a select b, c from d",
+ }, {
+ input: "insert /* no cols & paren select */ into a(select * from t)",
+ output: "insert /* no cols & paren select */ into a select * from t",
+ }, {
+ input: "insert /* cols & paren select */ into a(a,b,c) (select * from t)",
+ 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",
}, {
@@ -607,6 +626,15 @@ func TestValid(t *testing.T) {
}, {
input: "alter table a rename to b",
output: "rename table a b",
+ }, {
+ input: "alter table a rename as b",
+ output: "rename table a 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: "create table a",
}, {
@@ -632,6 +660,9 @@ func TestValid(t *testing.T) {
}, {
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",
@@ -680,6 +711,9 @@ func TestValid(t *testing.T) {
}, {
input: "explain foobar",
output: "other",
+ }, {
+ input: "truncate foo",
+ output: "other",
}, {
input: "select /* EQ true */ 1 from t where a = true",
}, {
@@ -778,6 +812,9 @@ func TestCaseSensitivity(t *testing.T) {
}, {
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",
@@ -1151,6 +1188,13 @@ func TestErrors(t *testing.T) {
}, {
input: "select /* vitess-reserved keyword as unqualified column */ * from t where escape = 'test'",
output: "syntax error at position 81 near 'escape'",
+ }, {
+ input: "(select /* parenthesized select */ * from t)",
+ output: "syntax error at position 46",
+ }, {
+ // Can't use order by in select of a union without parenthesis.
+ input: "select /* union parenthesized select */ 1 from t order by a union select 1 from t",
+ output: "syntax error at position 66 near 'union'",
}}
for _, tcase := range invalidSQL {
if tcase.output == "" {
diff --git a/go/vt/sqlparser/parsed_query.go b/go/vt/sqlparser/parsed_query.go
index 90f3e7c46aa..93846301104 100644
--- a/go/vt/sqlparser/parsed_query.go
+++ b/go/vt/sqlparser/parsed_query.go
@@ -11,6 +11,7 @@ import (
"fmt"
"github.com/youtube/vitess/go/sqltypes"
+ "github.com/youtube/vitess/go/vt/utils"
querypb "github.com/youtube/vitess/go/vt/proto/query"
)
@@ -51,8 +52,9 @@ func (pq *ParsedQuery) GenerateQuery(bindVariables map[string]interface{}) ([]by
}
// 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(pq.Query)
+ return json.Marshal(utils.TruncateQuery(pq.Query))
}
// EncodeValue encodes one bind variable value into the query.
diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go
index 22e5483e446..ea681c39684 100644
--- a/go/vt/sqlparser/sql.go
+++ b/go/vt/sqlparser/sql.go
@@ -34,6 +34,7 @@ type yySymType struct {
empty struct{}
statement Statement
selStmt SelectStatement
+ ins *Insert
byt byte
bytes []byte
bytes2 [][]byte
@@ -58,7 +59,6 @@ type yySymType struct {
orderBy OrderBy
order *Order
limit *Limit
- insRows InsertRows
updateExprs UpdateExprs
updateExpr *UpdateExpr
colIdent ColIdent
@@ -171,35 +171,38 @@ const DESCRIBE = 57445
const EXPLAIN = 57446
const DATE = 57447
const ESCAPE = 57448
-const DATABASES = 57449
-const TABLES = 57450
-const VITESS_KEYSPACES = 57451
-const VITESS_SHARDS = 57452
-const VSCHEMA_TABLES = 57453
-const INTEGER = 57454
-const CHARACTER = 57455
-const CURRENT_TIMESTAMP = 57456
-const DATABASE = 57457
-const CURRENT_DATE = 57458
-const CURRENT_TIME = 57459
-const LOCALTIME = 57460
-const LOCALTIMESTAMP = 57461
-const UTC_DATE = 57462
-const UTC_TIME = 57463
-const UTC_TIMESTAMP = 57464
-const REPLACE = 57465
-const CONVERT = 57466
-const CAST = 57467
-const GROUP_CONCAT = 57468
-const SEPARATOR = 57469
-const MATCH = 57470
-const AGAINST = 57471
-const BOOLEAN = 57472
-const LANGUAGE = 57473
-const WITH = 57474
-const QUERY = 57475
-const EXPANSION = 57476
-const UNUSED = 57477
+const REPAIR = 57449
+const OPTIMIZE = 57450
+const TRUNCATE = 57451
+const DATABASES = 57452
+const TABLES = 57453
+const VITESS_KEYSPACES = 57454
+const VITESS_SHARDS = 57455
+const VSCHEMA_TABLES = 57456
+const INTEGER = 57457
+const CHARACTER = 57458
+const CURRENT_TIMESTAMP = 57459
+const DATABASE = 57460
+const CURRENT_DATE = 57461
+const CURRENT_TIME = 57462
+const LOCALTIME = 57463
+const LOCALTIMESTAMP = 57464
+const UTC_DATE = 57465
+const UTC_TIME = 57466
+const UTC_TIMESTAMP = 57467
+const REPLACE = 57468
+const CONVERT = 57469
+const CAST = 57470
+const GROUP_CONCAT = 57471
+const SEPARATOR = 57472
+const MATCH = 57473
+const AGAINST = 57474
+const BOOLEAN = 57475
+const LANGUAGE = 57476
+const WITH = 57477
+const QUERY = 57478
+const EXPANSION = 57479
+const UNUSED = 57480
var yyToknames = [...]string{
"$end",
@@ -325,6 +328,9 @@ var yyToknames = [...]string{
"EXPLAIN",
"DATE",
"ESCAPE",
+ "REPAIR",
+ "OPTIMIZE",
+ "TRUNCATE",
"DATABASES",
"TABLES",
"VITESS_KEYSPACES",
@@ -367,378 +373,432 @@ var yyExca = [...]int{
-1, 1,
1, -1,
-2, 0,
- -1, 180,
- 103, 311,
- -2, 307,
- -1, 181,
- 103, 312,
- -2, 308,
- -1, 306,
- 103, 314,
- -2, 310,
+ -1, 15,
+ 5, 22,
+ -2, 260,
+ -1, 206,
+ 103, 327,
+ -2, 323,
+ -1, 207,
+ 103, 328,
+ -2, 324,
+ -1, 424,
+ 103, 330,
+ -2, 326,
+ -1, 569,
+ 5, 23,
+ -2, 159,
+ -1, 594,
+ 5, 23,
+ -2, 279,
+ -1, 711,
+ 5, 23,
+ -2, 282,
}
-const yyNprod = 423
+const yyNprod = 442
const yyPrivate = 57344
var yyTokenNames []string
var yyStates []string
-const yyLast = 3400
+const yyLast = 3817
var yyAct = [...]int{
- 435, 443, 388, 342, 607, 281, 258, 175, 536, 606,
- 486, 218, 574, 501, 516, 545, 282, 431, 260, 325,
- 254, 248, 323, 514, 515, 216, 455, 305, 257, 159,
- 176, 422, 530, 29, 195, 428, 221, 488, 387, 3,
- 255, 171, 204, 179, 177, 698, 171, 691, 697, 316,
- 684, 696, 690, 683, 610, 651, 310, 160, 190, 399,
- 241, 243, 67, 314, 171, 479, 171, 480, 183, 161,
- 171, 673, 356, 355, 365, 366, 358, 359, 360, 361,
- 362, 363, 364, 357, 59, 417, 367, 219, 318, 224,
- 479, 479, 480, 480, 554, 194, 356, 355, 365, 366,
- 358, 359, 360, 361, 362, 363, 364, 357, 346, 345,
- 367, 186, 58, 481, 59, 61, 62, 63, 341, 211,
- 340, 339, 589, 184, 170, 347, 64, 60, 242, 377,
- 378, 586, 438, 546, 482, 674, 426, 412, 481, 481,
- 367, 686, 313, 315, 312, 358, 359, 360, 361, 362,
- 363, 364, 357, 386, 682, 367, 212, 208, 347, 482,
- 482, 555, 613, 462, 502, 185, 643, 646, 679, 357,
- 345, 502, 367, 562, 171, 214, 206, 460, 461, 459,
- 171, 219, 189, 187, 198, 188, 347, 317, 171, 193,
- 680, 458, 171, 661, 665, 171, 670, 437, 171, 360,
- 361, 362, 363, 364, 357, 215, 171, 367, 179, 177,
- 239, 206, 191, 223, 246, 437, 179, 177, 246, 420,
- 598, 599, 210, 595, 304, 572, 437, 449, 451, 452,
- 171, 251, 450, 171, 491, 326, 245, 219, 429, 307,
- 210, 250, 179, 177, 335, 247, 192, 556, 244, 306,
- 656, 346, 345, 596, 321, 419, 437, 594, 615, 280,
- 419, 338, 346, 345, 346, 345, 31, 322, 347, 344,
- 572, 346, 345, 348, 334, 375, 538, 539, 540, 347,
- 42, 347, 379, 380, 381, 382, 383, 384, 347, 591,
- 437, 346, 345, 201, 558, 437, 249, 178, 419, 209,
- 491, 437, 343, 389, 436, 437, 525, 213, 347, 429,
- 397, 222, 413, 437, 225, 227, 236, 228, 274, 273,
- 275, 276, 277, 278, 230, 238, 279, 695, 576, 579,
- 580, 581, 577, 171, 578, 582, 210, 219, 657, 419,
- 627, 415, 439, 625, 629, 628, 580, 581, 626, 319,
- 432, 659, 320, 401, 402, 403, 404, 405, 406, 407,
- 658, 624, 623, 165, 166, 446, 447, 456, 694, 457,
- 454, 434, 478, 463, 464, 465, 466, 467, 468, 469,
- 470, 471, 472, 473, 474, 475, 476, 477, 490, 492,
- 453, 326, 246, 689, 692, 197, 326, 326, 489, 518,
- 331, 504, 57, 330, 587, 687, 483, 484, 196, 676,
- 662, 15, 495, 496, 326, 326, 326, 326, 202, 171,
- 506, 677, 171, 306, 509, 326, 171, 524, 493, 494,
- 499, 283, 246, 308, 526, 169, 333, 168, 489, 519,
- 512, 529, 513, 226, 584, 220, 505, 220, 507, 508,
- 162, 163, 427, 389, 523, 521, 232, 197, 329, 444,
- 618, 445, 178, 306, 534, 537, 328, 343, 617, 571,
- 178, 249, 220, 220, 532, 533, 456, 174, 457, 685,
- 634, 542, 543, 544, 33, 15, 541, 548, 220, 31,
- 28, 1, 65, 326, 552, 553, 178, 337, 557, 583,
- 203, 421, 309, 39, 564, 326, 565, 566, 567, 568,
- 32, 551, 416, 311, 561, 182, 327, 576, 579, 580,
- 581, 577, 563, 578, 582, 549, 171, 34, 35, 36,
- 37, 590, 235, 592, 593, 336, 569, 559, 510, 519,
- 497, 511, 432, 588, 585, 675, 597, 535, 616, 570,
- 604, 560, 396, 500, 259, 430, 326, 448, 600, 270,
- 267, 605, 269, 612, 268, 608, 609, 602, 603, 231,
- 414, 332, 349, 252, 240, 199, 575, 573, 171, 171,
- 171, 171, 614, 517, 418, 424, 632, 650, 620, 631,
- 622, 519, 519, 519, 519, 630, 672, 619, 509, 621,
- 164, 229, 30, 167, 14, 639, 641, 642, 13, 647,
- 648, 12, 645, 11, 637, 638, 537, 217, 10, 217,
- 653, 655, 640, 9, 8, 7, 6, 5, 4, 2,
- 0, 237, 0, 0, 0, 652, 0, 654, 389, 0,
- 179, 177, 660, 0, 485, 217, 220, 0, 0, 0,
- 0, 664, 0, 0, 498, 666, 0, 0, 503, 0,
- 217, 0, 669, 0, 0, 0, 0, 671, 0, 0,
- 663, 0, 220, 681, 678, 0, 667, 668, 0, 0,
- 0, 688, 0, 424, 0, 0, 220, 0, 376, 0,
- 0, 0, 693, 0, 0, 0, 527, 0, 528, 0,
- 531, 531, 531, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 385, 0, 0, 0, 390, 391, 392, 393,
- 394, 395, 181, 398, 400, 400, 400, 400, 400, 400,
- 400, 400, 408, 409, 410, 411, 0, 0, 52, 0,
- 0, 0, 0, 44, 0, 0, 0, 47, 68, 0,
- 0, 0, 0, 0, 0, 0, 54, 51, 173, 0,
- 0, 0, 0, 173, 0, 433, 0, 0, 601, 0,
- 220, 440, 441, 442, 43, 0, 0, 233, 0, 0,
- 234, 173, 0, 173, 0, 0, 0, 173, 356, 355,
- 365, 366, 358, 359, 360, 361, 362, 363, 364, 357,
- 0, 0, 367, 0, 0, 0, 52, 0, 0, 0,
- 0, 0, 0, 0, 0, 47, 0, 0, 611, 0,
- 0, 0, 0, 0, 54, 51, 0, 0, 0, 0,
- 0, 0, 0, 0, 158, 0, 0, 0, 0, 0,
- 0, 0, 43, 46, 0, 0, 220, 0, 0, 635,
- 49, 636, 520, 0, 356, 355, 365, 366, 358, 359,
- 360, 361, 362, 363, 364, 357, 0, 45, 367, 50,
- 56, 53, 48, 55, 0, 356, 355, 365, 366, 358,
- 359, 360, 361, 362, 363, 364, 357, 0, 0, 367,
- 0, 173, 0, 173, 178, 0, 0, 173, 0, 0,
- 0, 0, 158, 0, 0, 173, 0, 0, 44, 173,
- 44, 46, 173, 0, 0, 173, 0, 0, 49, 44,
- 0, 550, 0, 173, 0, 0, 0, 0, 173, 0,
- 0, 173, 0, 0, 0, 45, 44, 50, 56, 53,
- 48, 55, 217, 0, 52, 0, 0, 173, 0, 256,
- 173, 44, 520, 47, 0, 0, 0, 433, 291, 0,
- 44, 0, 54, 51, 0, 0, 0, 0, 284, 285,
- 0, 0, 0, 0, 0, 0, 0, 219, 0, 0,
- 180, 274, 273, 275, 276, 277, 278, 0, 0, 279,
- 271, 272, 0, 0, 253, 265, 0, 290, 0, 0,
- 0, 0, 0, 0, 520, 520, 520, 520, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 262, 263, 324,
- 0, 0, 0, 302, 0, 264, 0, 0, 261, 266,
- 0, 0, 0, 44, 0, 0, 0, 0, 0, 644,
- 158, 0, 649, 300, 0, 0, 0, 0, 44, 46,
- 173, 0, 0, 0, 0, 0, 49, 0, 292, 301,
- 298, 299, 296, 297, 295, 294, 293, 303, 286, 287,
- 289, 0, 288, 45, 0, 50, 56, 53, 48, 55,
- 15, 365, 366, 358, 359, 360, 361, 362, 363, 364,
- 357, 52, 0, 367, 0, 0, 0, 0, 0, 0,
- 47, 0, 0, 0, 0, 0, 0, 44, 0, 54,
- 51, 0, 0, 0, 0, 0, 0, 44, 0, 0,
- 0, 44, 0, 0, 219, 0, 0, 172, 0, 0,
- 0, 0, 0, 52, 0, 44, 173, 0, 256, 173,
- 0, 0, 47, 173, 0, 0, 44, 291, 0, 0,
- 0, 54, 51, 0, 0, 0, 0, 284, 285, 44,
- 0, 44, 0, 44, 44, 44, 219, 0, 437, 180,
- 274, 273, 275, 276, 277, 278, 0, 0, 279, 271,
- 272, 0, 0, 253, 265, 0, 290, 158, 15, 16,
- 17, 18, 0, 0, 0, 0, 46, 0, 0, 0,
- 0, 0, 0, 49, 0, 0, 262, 263, 0, 0,
- 0, 19, 302, 0, 264, 0, 0, 261, 266, 0,
- 45, 0, 50, 56, 53, 48, 55, 0, 0, 158,
- 0, 0, 300, 44, 0, 0, 0, 0, 46, 0,
- 0, 0, 0, 173, 0, 49, 0, 292, 301, 298,
- 299, 296, 297, 295, 294, 293, 303, 286, 287, 289,
- 0, 288, 45, 0, 50, 56, 53, 48, 55, 0,
- 355, 365, 366, 358, 359, 360, 361, 362, 363, 364,
- 357, 44, 0, 367, 0, 0, 0, 0, 20, 21,
- 23, 22, 24, 0, 0, 173, 173, 173, 173, 0,
- 0, 25, 26, 27, 0, 0, 173, 0, 0, 44,
- 0, 0, 44, 0, 44, 147, 134, 108, 149, 86,
- 100, 157, 101, 102, 128, 74, 116, 52, 98, 0,
- 89, 70, 95, 71, 87, 110, 47, 113, 85, 136,
- 119, 155, 0, 123, 0, 54, 51, 0, 0, 112,
- 141, 114, 133, 107, 129, 79, 122, 150, 99, 126,
- 0, 0, 0, 43, 0, 0, 0, 0, 0, 0,
- 0, 0, 125, 146, 97, 127, 69, 124, 0, 72,
- 75, 156, 144, 92, 93, 0, 0, 0, 0, 0,
- 0, 0, 111, 115, 130, 105, 0, 0, 0, 0,
- 0, 0, 633, 0, 90, 0, 121, 0, 0, 0,
- 76, 73, 109, 0, 0, 0, 78, 0, 91, 131,
- 0, 142, 106, 158, 145, 104, 103, 148, 151, 140,
- 88, 96, 46, 94, 84, 143, 137, 138, 139, 49,
- 0, 82, 83, 80, 81, 117, 118, 152, 153, 154,
- 132, 77, 0, 0, 135, 120, 45, 0, 50, 56,
- 53, 48, 55, 147, 134, 108, 149, 86, 100, 157,
- 101, 102, 128, 74, 116, 52, 98, 0, 89, 70,
- 95, 71, 87, 110, 47, 113, 85, 136, 119, 155,
- 0, 123, 0, 54, 51, 0, 0, 112, 141, 114,
- 133, 107, 129, 79, 122, 150, 99, 126, 219, 0,
- 0, 43, 0, 0, 0, 0, 0, 0, 0, 0,
- 125, 146, 97, 127, 69, 124, 0, 72, 75, 156,
- 144, 92, 93, 0, 0, 0, 0, 0, 0, 0,
- 111, 115, 130, 105, 0, 0, 0, 0, 0, 0,
- 0, 0, 90, 0, 121, 0, 0, 0, 76, 73,
- 109, 0, 0, 0, 78, 0, 91, 131, 0, 142,
- 106, 158, 145, 104, 103, 148, 151, 140, 88, 96,
- 46, 94, 84, 143, 137, 138, 139, 49, 0, 82,
- 83, 80, 81, 117, 118, 152, 153, 154, 132, 77,
- 0, 0, 135, 120, 45, 0, 50, 56, 53, 48,
- 55, 147, 134, 108, 149, 86, 100, 157, 101, 102,
- 128, 74, 116, 52, 98, 0, 89, 70, 95, 71,
- 87, 110, 47, 113, 85, 136, 119, 155, 0, 123,
- 0, 54, 51, 0, 0, 112, 141, 114, 133, 107,
- 129, 79, 122, 150, 99, 126, 0, 0, 0, 180,
- 0, 0, 0, 0, 0, 0, 0, 0, 125, 146,
- 97, 127, 69, 124, 0, 72, 75, 156, 144, 92,
- 93, 0, 0, 0, 0, 0, 0, 0, 111, 115,
- 130, 105, 0, 0, 0, 0, 0, 0, 522, 0,
- 90, 0, 121, 0, 0, 0, 76, 73, 109, 0,
- 0, 0, 78, 0, 91, 131, 0, 142, 106, 158,
- 145, 104, 103, 148, 151, 140, 88, 96, 46, 94,
- 84, 143, 137, 138, 139, 49, 0, 82, 83, 80,
- 81, 117, 118, 152, 153, 154, 132, 77, 0, 0,
- 135, 120, 45, 0, 50, 56, 53, 48, 55, 147,
- 134, 108, 149, 86, 100, 157, 101, 102, 128, 74,
- 116, 52, 98, 0, 89, 70, 95, 71, 87, 110,
- 47, 113, 85, 136, 119, 155, 0, 123, 0, 54,
- 51, 0, 0, 112, 141, 114, 133, 107, 129, 79,
- 122, 150, 99, 126, 0, 0, 0, 43, 0, 0,
- 0, 0, 0, 0, 0, 0, 125, 146, 97, 127,
- 69, 124, 0, 72, 75, 156, 144, 92, 93, 0,
- 0, 0, 0, 0, 0, 0, 111, 115, 130, 105,
- 0, 0, 0, 0, 0, 0, 0, 0, 90, 0,
- 121, 0, 0, 0, 76, 73, 109, 0, 0, 0,
- 78, 0, 91, 131, 0, 142, 106, 158, 145, 104,
- 103, 148, 151, 140, 88, 96, 46, 94, 84, 143,
- 137, 138, 139, 49, 0, 82, 83, 80, 81, 117,
- 118, 152, 153, 154, 132, 77, 0, 0, 135, 120,
- 45, 0, 50, 56, 53, 48, 55, 147, 134, 108,
- 149, 86, 100, 157, 101, 102, 128, 74, 116, 52,
- 98, 0, 89, 70, 95, 71, 87, 110, 47, 113,
- 85, 136, 119, 155, 0, 123, 0, 54, 51, 0,
- 0, 112, 141, 114, 133, 107, 129, 79, 122, 150,
- 99, 126, 0, 0, 0, 180, 0, 0, 0, 0,
- 0, 0, 0, 0, 125, 146, 97, 127, 69, 124,
- 0, 72, 75, 156, 144, 92, 93, 0, 0, 0,
- 0, 0, 0, 0, 111, 115, 130, 105, 0, 0,
- 0, 0, 0, 0, 0, 0, 90, 0, 121, 0,
- 0, 0, 76, 73, 109, 0, 0, 0, 78, 0,
- 91, 131, 0, 142, 106, 158, 145, 104, 103, 148,
- 151, 140, 88, 96, 46, 94, 84, 143, 137, 138,
- 139, 49, 0, 82, 83, 80, 81, 117, 118, 152,
- 153, 154, 132, 77, 0, 0, 135, 120, 45, 0,
- 50, 56, 53, 48, 55, 147, 134, 108, 149, 86,
- 100, 157, 101, 102, 128, 74, 116, 52, 98, 0,
- 89, 70, 95, 71, 87, 110, 47, 113, 85, 136,
- 119, 155, 0, 123, 0, 54, 51, 0, 0, 112,
- 141, 114, 133, 107, 129, 79, 122, 150, 99, 126,
- 0, 0, 0, 172, 0, 0, 0, 0, 0, 0,
- 0, 0, 125, 146, 97, 127, 69, 124, 0, 72,
- 75, 156, 144, 92, 93, 0, 0, 0, 0, 0,
- 0, 0, 111, 115, 130, 105, 0, 0, 0, 0,
- 0, 0, 0, 0, 90, 0, 121, 0, 0, 0,
- 76, 73, 109, 0, 0, 0, 78, 0, 91, 131,
- 0, 142, 106, 158, 145, 104, 103, 148, 151, 140,
- 88, 96, 46, 94, 84, 143, 137, 138, 139, 49,
- 0, 82, 83, 80, 81, 117, 118, 152, 153, 154,
- 132, 77, 0, 0, 135, 120, 45, 0, 50, 56,
- 53, 48, 55, 147, 134, 108, 149, 86, 100, 157,
- 101, 102, 128, 74, 116, 52, 98, 0, 89, 70,
- 95, 71, 87, 110, 47, 113, 85, 136, 119, 155,
- 0, 123, 0, 54, 51, 0, 0, 112, 141, 114,
- 133, 107, 129, 79, 122, 150, 99, 126, 0, 0,
- 0, 66, 0, 0, 0, 0, 0, 0, 0, 0,
- 125, 146, 97, 127, 69, 124, 0, 72, 75, 156,
- 144, 92, 93, 0, 0, 0, 0, 0, 0, 0,
- 111, 115, 130, 105, 0, 0, 0, 0, 0, 0,
- 0, 0, 90, 0, 121, 0, 0, 0, 76, 73,
- 109, 0, 0, 0, 78, 0, 91, 131, 0, 142,
- 106, 158, 145, 104, 103, 148, 151, 140, 88, 96,
- 46, 94, 84, 143, 137, 138, 139, 49, 0, 82,
- 83, 80, 81, 117, 118, 152, 153, 154, 132, 77,
- 0, 0, 135, 120, 45, 0, 50, 56, 53, 48,
- 55, 52, 0, 0, 487, 0, 256, 0, 0, 0,
- 47, 0, 0, 0, 0, 291, 0, 0, 0, 54,
- 51, 0, 0, 0, 0, 284, 285, 0, 0, 0,
- 0, 0, 0, 0, 219, 547, 0, 180, 274, 273,
- 275, 276, 277, 278, 0, 0, 279, 271, 272, 0,
- 0, 253, 265, 0, 290, 356, 355, 365, 366, 358,
- 359, 360, 361, 362, 363, 364, 357, 0, 0, 367,
- 0, 0, 0, 0, 262, 263, 324, 0, 0, 0,
- 302, 0, 264, 0, 0, 261, 266, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 158, 0, 0,
- 300, 0, 0, 0, 0, 0, 46, 0, 0, 0,
- 0, 0, 0, 49, 0, 292, 301, 298, 299, 296,
- 297, 295, 294, 293, 303, 286, 287, 289, 15, 288,
- 45, 0, 50, 56, 53, 48, 55, 0, 0, 52,
- 0, 0, 0, 0, 256, 0, 0, 0, 47, 0,
- 0, 0, 0, 291, 0, 0, 0, 54, 51, 0,
- 0, 0, 0, 284, 285, 0, 0, 0, 0, 0,
- 0, 0, 219, 0, 0, 180, 274, 273, 275, 276,
- 277, 278, 0, 0, 279, 271, 272, 0, 0, 253,
- 265, 0, 290, 0, 0, 0, 0, 0, 0, 0,
+ 223, 367, 629, 523, 618, 207, 235, 309, 666, 490,
+ 643, 307, 617, 201, 677, 259, 524, 485, 38, 562,
+ 181, 505, 311, 488, 555, 520, 418, 423, 56, 454,
+ 282, 232, 287, 83, 630, 40, 234, 196, 174, 202,
+ 295, 33, 237, 43, 190, 225, 37, 366, 3, 15,
+ 82, 744, 199, 739, 487, 203, 743, 199, 732, 742,
+ 738, 184, 45, 46, 47, 48, 731, 621, 175, 176,
+ 177, 178, 660, 212, 478, 35, 479, 428, 478, 199,
+ 479, 199, 180, 185, 217, 199, 478, 209, 479, 211,
+ 74, 186, 718, 335, 334, 344, 345, 337, 338, 339,
+ 340, 341, 342, 343, 336, 315, 572, 346, 73, 312,
+ 74, 214, 544, 215, 533, 435, 532, 220, 546, 221,
+ 323, 322, 480, 531, 379, 210, 480, 411, 413, 433,
+ 76, 77, 78, 213, 480, 79, 346, 324, 75, 356,
+ 357, 682, 649, 481, 597, 566, 536, 481, 365, 303,
+ 299, 321, 322, 64, 438, 481, 324, 652, 655, 719,
+ 336, 624, 59, 346, 302, 216, 727, 506, 324, 580,
+ 730, 68, 63, 573, 335, 334, 344, 345, 337, 338,
+ 339, 340, 341, 342, 343, 336, 506, 305, 346, 55,
+ 323, 322, 228, 283, 35, 412, 289, 626, 323, 322,
+ 199, 52, 199, 545, 457, 543, 199, 324, 432, 434,
+ 431, 556, 728, 688, 199, 324, 692, 56, 306, 199,
+ 56, 222, 199, 218, 494, 199, 314, 461, 224, 186,
+ 284, 285, 292, 301, 446, 448, 449, 35, 300, 447,
+ 327, 459, 460, 458, 219, 436, 304, 49, 592, 51,
+ 326, 313, 722, 53, 316, 664, 437, 319, 58, 574,
+ 67, 65, 69, 548, 549, 550, 715, 224, 61, 39,
+ 368, 664, 224, 684, 224, 17, 354, 377, 339, 340,
+ 341, 342, 343, 336, 325, 57, 346, 62, 71, 66,
+ 60, 70, 56, 560, 224, 596, 224, 199, 323, 322,
+ 203, 560, 199, 323, 322, 199, 560, 409, 203, 419,
+ 56, 422, 421, 576, 224, 324, 425, 17, 199, 35,
+ 324, 199, 417, 392, 199, 56, 424, 415, 537, 408,
+ 396, 441, 443, 444, 17, 450, 451, 414, 406, 494,
+ 224, 420, 637, 187, 521, 455, 301, 402, 589, 301,
+ 429, 477, 521, 439, 318, 725, 440, 404, 632, 405,
+ 452, 35, 17, 18, 19, 20, 72, 493, 495, 56,
+ 704, 702, 456, 492, 724, 705, 703, 741, 35, 368,
+ 56, 508, 499, 500, 56, 21, 701, 35, 424, 560,
+ 700, 191, 192, 482, 483, 381, 382, 383, 384, 385,
+ 386, 387, 283, 737, 547, 195, 35, 510, 503, 442,
+ 41, 203, 194, 56, 288, 518, 517, 496, 522, 735,
+ 226, 525, 689, 513, 293, 497, 498, 286, 706, 535,
+ 672, 673, 227, 635, 56, 56, 530, 534, 590, 426,
+ 317, 539, 676, 509, 179, 511, 512, 337, 338, 339,
+ 340, 341, 342, 343, 336, 527, 519, 346, 188, 189,
+ 288, 182, 22, 23, 25, 24, 26, 695, 183, 540,
+ 516, 39, 231, 663, 455, 27, 28, 29, 515, 694,
+ 30, 31, 32, 260, 34, 42, 558, 419, 551, 200,
+ 679, 394, 395, 320, 39, 42, 56, 569, 570, 571,
+ 44, 456, 575, 36, 568, 1, 80, 675, 582, 294,
+ 583, 584, 585, 586, 561, 427, 581, 50, 34, 542,
+ 199, 541, 430, 208, 514, 34, 579, 593, 594, 595,
+ 528, 501, 393, 323, 322, 281, 368, 693, 662, 578,
+ 376, 559, 56, 199, 603, 504, 236, 199, 591, 598,
+ 324, 445, 587, 247, 244, 602, 246, 245, 577, 397,
+ 611, 403, 251, 250, 252, 253, 254, 255, 328, 56,
+ 256, 229, 410, 290, 492, 604, 667, 607, 257, 605,
+ 665, 606, 56, 613, 612, 616, 619, 620, 631, 424,
+ 625, 588, 659, 717, 615, 199, 623, 401, 193, 14,
+ 13, 54, 56, 56, 628, 56, 56, 56, 525, 636,
+ 56, 645, 646, 12, 11, 627, 647, 650, 651, 642,
+ 656, 657, 10, 654, 9, 8, 7, 204, 6, 5,
+ 4, 16, 633, 2, 0, 0, 661, 0, 0, 0,
+ 199, 680, 0, 638, 683, 0, 685, 686, 0, 0,
+ 0, 0, 0, 525, 258, 56, 0, 603, 0, 0,
+ 691, 0, 0, 34, 0, 0, 0, 696, 0, 698,
+ 199, 199, 199, 199, 0, 0, 0, 633, 709, 0,
+ 0, 199, 711, 707, 199, 0, 203, 681, 56, 714,
+ 56, 0, 0, 710, 716, 308, 0, 721, 308, 0,
+ 697, 197, 699, 205, 720, 368, 197, 633, 633, 633,
+ 633, 358, 359, 360, 361, 362, 363, 355, 729, 726,
+ 0, 633, 0, 0, 0, 0, 496, 0, 197, 736,
+ 197, 0, 733, 734, 197, 0, 0, 0, 0, 0,
+ 740, 364, 0, 0, 369, 370, 371, 372, 373, 374,
+ 375, 0, 378, 380, 380, 380, 380, 380, 380, 380,
+ 380, 388, 389, 390, 391, 668, 671, 672, 673, 669,
+ 0, 670, 674, 0, 407, 335, 334, 344, 345, 337,
+ 338, 339, 340, 341, 342, 343, 336, 0, 308, 346,
+ 310, 0, 0, 310, 0, 0, 0, 0, 0, 608,
+ 0, 453, 0, 308, 462, 463, 464, 465, 466, 467,
+ 468, 469, 470, 471, 472, 473, 474, 475, 476, 335,
+ 334, 344, 345, 337, 338, 339, 340, 341, 342, 343,
+ 336, 0, 0, 346, 668, 671, 672, 673, 669, 34,
+ 670, 674, 0, 0, 723, 0, 0, 0, 0, 197,
+ 0, 297, 0, 369, 0, 197, 0, 0, 0, 0,
+ 0, 0, 0, 197, 0, 398, 0, 0, 197, 0,
+ 0, 197, 204, 0, 197, 0, 0, 0, 0, 0,
+ 204, 557, 310, 310, 0, 0, 0, 0, 0, 526,
+ 0, 34, 0, 0, 0, 0, 0, 0, 310, 0,
+ 0, 335, 334, 344, 345, 337, 338, 339, 340, 341,
+ 342, 343, 336, 308, 0, 346, 334, 344, 345, 337,
+ 338, 339, 340, 341, 342, 343, 336, 0, 0, 346,
+ 0, 0, 552, 553, 554, 0, 0, 0, 0, 0,
+ 0, 0, 484, 0, 310, 0, 197, 0, 205, 0,
+ 0, 297, 0, 502, 416, 0, 205, 507, 416, 64,
+ 0, 0, 0, 0, 0, 0, 0, 197, 59, 0,
+ 197, 0, 0, 197, 0, 64, 567, 68, 63, 563,
+ 0, 0, 0, 204, 59, 0, 529, 0, 0, 0,
+ 0, 0, 0, 68, 63, 55, 0, 0, 399, 0,
+ 0, 400, 0, 0, 0, 0, 0, 538, 310, 0,
+ 0, 55, 0, 565, 0, 599, 600, 601, 0, 491,
+ 416, 0, 0, 323, 322, 491, 491, 0, 0, 609,
+ 610, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 324, 0, 0, 491, 491, 491, 491, 0, 0, 0,
+ 0, 0, 0, 0, 0, 173, 491, 0, 0, 205,
+ 0, 0, 0, 0, 58, 0, 67, 65, 69, 564,
+ 0, 173, 0, 634, 61, 0, 526, 0, 0, 639,
+ 58, 648, 67, 65, 69, 0, 0, 0, 308, 0,
+ 61, 57, 0, 62, 71, 66, 60, 70, 0, 0,
+ 0, 0, 653, 0, 0, 658, 0, 57, 0, 62,
+ 71, 66, 60, 70, 0, 310, 0, 0, 678, 0,
+ 0, 526, 0, 34, 0, 0, 0, 0, 0, 0,
+ 0, 690, 0, 0, 64, 0, 0, 0, 0, 0,
+ 0, 491, 564, 59, 0, 310, 0, 0, 634, 634,
+ 634, 634, 68, 63, 0, 622, 0, 0, 491, 0,
+ 0, 0, 678, 0, 0, 0, 0, 0, 0, 197,
+ 55, 0, 0, 0, 0, 640, 641, 0, 644, 644,
+ 644, 0, 0, 310, 0, 0, 0, 0, 0, 0,
+ 0, 0, 197, 0, 0, 0, 197, 0, 0, 0,
+ 0, 0, 0, 335, 334, 344, 345, 337, 338, 339,
+ 340, 341, 342, 343, 336, 491, 0, 346, 0, 0,
+ 0, 416, 491, 0, 0, 0, 0, 0, 310, 0,
+ 173, 0, 0, 0, 0, 0, 0, 0, 0, 58,
+ 0, 67, 65, 69, 197, 0, 0, 0, 0, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 204, 0,
+ 0, 712, 0, 713, 0, 0, 57, 0, 62, 71,
+ 66, 60, 70, 0, 330, 0, 333, 0, 0, 0,
+ 0, 0, 347, 348, 349, 350, 351, 352, 353, 197,
+ 331, 332, 329, 335, 334, 344, 345, 337, 338, 339,
+ 340, 341, 342, 343, 336, 0, 0, 346, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 197,
+ 197, 197, 197, 0, 0, 0, 0, 0, 0, 0,
+ 708, 0, 0, 197, 205, 162, 149, 123, 164, 101,
+ 115, 172, 116, 117, 143, 89, 131, 64, 113, 0,
+ 104, 85, 110, 86, 102, 125, 59, 128, 100, 151,
+ 134, 170, 0, 138, 0, 68, 63, 0, 0, 127,
+ 156, 129, 148, 122, 144, 94, 137, 165, 114, 141,
+ 0, 0, 0, 55, 0, 0, 0, 0, 0, 0,
+ 0, 0, 140, 161, 112, 142, 84, 139, 0, 87,
+ 90, 171, 159, 107, 108, 0, 0, 0, 0, 0,
+ 0, 0, 126, 130, 145, 120, 0, 0, 0, 0,
+ 0, 0, 687, 0, 105, 0, 136, 0, 0, 0,
+ 91, 88, 124, 0, 0, 0, 93, 0, 106, 146,
+ 0, 157, 121, 173, 160, 119, 118, 163, 166, 155,
+ 103, 111, 58, 109, 67, 65, 69, 99, 158, 152,
+ 153, 154, 61, 0, 97, 98, 95, 96, 132, 133,
+ 167, 168, 169, 147, 92, 0, 0, 150, 135, 57,
+ 0, 62, 71, 66, 60, 70, 162, 149, 123, 164,
+ 101, 115, 172, 116, 117, 143, 89, 131, 64, 113,
+ 0, 104, 85, 110, 86, 102, 125, 59, 128, 100,
+ 151, 134, 170, 0, 138, 0, 68, 63, 0, 0,
+ 127, 156, 129, 148, 122, 144, 94, 137, 165, 114,
+ 141, 35, 0, 0, 55, 0, 0, 0, 0, 0,
+ 0, 0, 0, 140, 161, 112, 142, 84, 139, 0,
+ 87, 90, 171, 159, 107, 108, 0, 0, 0, 0,
+ 0, 0, 0, 126, 130, 145, 120, 0, 0, 0,
+ 0, 0, 0, 0, 0, 105, 0, 136, 0, 0,
+ 0, 91, 88, 124, 0, 0, 0, 93, 0, 106,
+ 146, 0, 157, 121, 173, 160, 119, 118, 163, 166,
+ 155, 103, 111, 58, 109, 67, 65, 69, 99, 158,
+ 152, 153, 154, 61, 0, 97, 98, 95, 96, 132,
+ 133, 167, 168, 169, 147, 92, 0, 0, 150, 135,
+ 57, 0, 62, 71, 66, 60, 70, 162, 149, 123,
+ 164, 101, 115, 172, 116, 117, 143, 89, 131, 64,
+ 113, 0, 104, 85, 110, 86, 102, 125, 59, 128,
+ 100, 151, 134, 170, 0, 138, 0, 68, 63, 0,
+ 0, 127, 156, 129, 148, 122, 144, 94, 137, 165,
+ 114, 141, 0, 0, 0, 206, 0, 0, 0, 0,
+ 0, 0, 0, 0, 140, 161, 112, 142, 84, 139,
+ 0, 87, 90, 171, 159, 107, 108, 0, 0, 0,
+ 0, 0, 0, 0, 126, 130, 145, 120, 0, 0,
+ 0, 0, 0, 0, 614, 0, 105, 0, 136, 0,
+ 0, 0, 91, 88, 124, 0, 0, 0, 93, 0,
+ 106, 146, 0, 157, 121, 173, 160, 119, 118, 163,
+ 166, 155, 103, 111, 58, 109, 67, 65, 69, 99,
+ 158, 152, 153, 154, 61, 0, 97, 98, 95, 96,
+ 132, 133, 167, 168, 169, 147, 92, 0, 0, 150,
+ 135, 57, 0, 62, 71, 66, 60, 70, 162, 149,
+ 123, 164, 101, 115, 172, 116, 117, 143, 89, 131,
+ 64, 113, 0, 104, 85, 110, 86, 102, 125, 59,
+ 128, 100, 151, 134, 170, 0, 138, 0, 68, 63,
+ 0, 0, 127, 156, 129, 148, 122, 144, 94, 137,
+ 165, 114, 141, 0, 0, 0, 55, 0, 0, 0,
+ 0, 0, 0, 0, 0, 140, 161, 112, 142, 84,
+ 139, 0, 87, 90, 171, 159, 107, 108, 0, 0,
+ 0, 0, 0, 0, 0, 126, 130, 145, 120, 0,
+ 0, 0, 0, 0, 0, 0, 0, 105, 0, 136,
+ 0, 0, 0, 91, 88, 124, 0, 0, 0, 93,
+ 0, 106, 146, 0, 157, 121, 173, 160, 119, 118,
+ 163, 166, 155, 103, 111, 58, 109, 67, 65, 69,
+ 99, 158, 152, 153, 154, 61, 0, 97, 98, 95,
+ 96, 132, 133, 167, 168, 169, 147, 92, 0, 0,
+ 150, 135, 57, 0, 62, 71, 66, 60, 70, 162,
+ 149, 123, 164, 101, 115, 172, 116, 117, 143, 89,
+ 131, 64, 113, 0, 104, 85, 110, 86, 102, 125,
+ 59, 128, 100, 151, 134, 170, 0, 138, 0, 68,
+ 63, 0, 0, 127, 156, 129, 148, 122, 144, 94,
+ 137, 165, 114, 141, 0, 0, 0, 206, 0, 0,
+ 0, 0, 0, 0, 0, 0, 140, 161, 112, 142,
+ 84, 139, 0, 87, 90, 171, 159, 107, 108, 0,
+ 0, 0, 0, 0, 0, 0, 126, 130, 145, 120,
+ 0, 0, 0, 0, 0, 0, 0, 0, 105, 0,
+ 136, 0, 0, 0, 91, 88, 124, 0, 0, 0,
+ 93, 0, 106, 146, 0, 157, 121, 173, 160, 119,
+ 118, 163, 166, 155, 103, 111, 58, 109, 67, 65,
+ 69, 99, 158, 152, 153, 154, 61, 0, 97, 98,
+ 95, 96, 132, 133, 167, 168, 169, 147, 92, 0,
+ 0, 150, 135, 57, 0, 62, 71, 66, 60, 70,
+ 162, 149, 123, 164, 101, 115, 172, 116, 117, 143,
+ 89, 131, 64, 113, 0, 104, 85, 110, 86, 102,
+ 125, 59, 128, 100, 151, 134, 170, 0, 138, 0,
+ 68, 63, 0, 0, 127, 156, 129, 148, 122, 144,
+ 94, 137, 165, 114, 141, 0, 0, 0, 198, 0,
+ 0, 0, 0, 0, 0, 0, 0, 140, 161, 112,
+ 142, 84, 139, 0, 87, 90, 171, 159, 107, 108,
+ 0, 0, 0, 0, 0, 0, 0, 126, 130, 145,
+ 120, 0, 0, 0, 0, 0, 0, 0, 0, 105,
+ 0, 136, 0, 0, 0, 91, 88, 124, 0, 0,
+ 0, 93, 0, 106, 146, 0, 157, 121, 173, 160,
+ 119, 118, 163, 166, 155, 103, 111, 58, 109, 67,
+ 65, 69, 99, 158, 152, 153, 154, 61, 0, 97,
+ 98, 95, 96, 132, 133, 167, 168, 169, 147, 92,
+ 0, 0, 150, 135, 57, 0, 62, 71, 66, 60,
+ 70, 162, 149, 123, 164, 101, 115, 172, 116, 117,
+ 143, 89, 131, 64, 113, 0, 104, 85, 110, 86,
+ 102, 125, 59, 128, 100, 151, 134, 170, 0, 138,
+ 0, 68, 63, 0, 0, 127, 156, 129, 148, 122,
+ 144, 94, 137, 165, 114, 141, 0, 0, 0, 81,
+ 0, 0, 0, 0, 0, 0, 0, 0, 140, 161,
+ 112, 142, 84, 139, 0, 87, 90, 171, 159, 107,
+ 108, 0, 0, 0, 0, 0, 0, 0, 126, 130,
+ 145, 120, 0, 0, 0, 0, 0, 0, 0, 0,
+ 105, 0, 136, 0, 0, 0, 91, 88, 124, 0,
+ 0, 0, 93, 0, 106, 146, 0, 157, 121, 173,
+ 160, 119, 118, 163, 166, 155, 103, 111, 58, 109,
+ 67, 65, 69, 99, 158, 152, 153, 154, 61, 0,
+ 97, 98, 95, 96, 132, 133, 167, 168, 169, 147,
+ 92, 0, 0, 150, 135, 57, 0, 62, 71, 66,
+ 60, 70, 64, 0, 0, 486, 0, 233, 0, 0,
+ 0, 59, 0, 0, 0, 0, 268, 0, 0, 0,
+ 68, 63, 0, 0, 0, 0, 261, 262, 0, 0,
+ 0, 0, 0, 0, 0, 35, 0, 0, 206, 251,
+ 250, 252, 253, 254, 255, 0, 0, 256, 248, 249,
+ 0, 0, 230, 242, 0, 267, 344, 345, 337, 338,
+ 339, 340, 341, 342, 343, 336, 0, 0, 346, 0,
+ 0, 0, 0, 0, 0, 239, 240, 489, 0, 0,
+ 0, 279, 0, 241, 0, 0, 238, 243, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 173, 0,
+ 0, 277, 0, 0, 0, 0, 0, 58, 0, 67,
+ 65, 69, 0, 0, 0, 0, 0, 61, 0, 269,
+ 278, 275, 276, 273, 274, 272, 271, 270, 280, 263,
+ 264, 266, 0, 265, 57, 0, 62, 71, 66, 60,
+ 70, 64, 0, 0, 0, 0, 233, 0, 0, 0,
+ 59, 0, 0, 0, 0, 268, 0, 0, 0, 68,
+ 63, 0, 0, 0, 0, 261, 262, 0, 0, 0,
+ 0, 0, 0, 0, 35, 0, 0, 206, 251, 250,
+ 252, 253, 254, 255, 0, 0, 256, 248, 249, 0,
+ 0, 230, 242, 0, 267, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 262, 263, 0, 0, 0, 0, 302, 0,
- 264, 0, 0, 261, 266, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 158, 0, 0, 300, 0,
- 0, 0, 0, 0, 46, 0, 0, 0, 0, 0,
- 0, 49, 0, 292, 301, 298, 299, 296, 297, 295,
- 294, 293, 303, 286, 287, 289, 0, 288, 45, 0,
- 50, 56, 53, 48, 55, 52, 0, 0, 0, 0,
- 256, 0, 0, 0, 47, 0, 0, 0, 0, 291,
- 0, 0, 0, 54, 51, 0, 0, 0, 0, 284,
- 285, 0, 0, 0, 0, 0, 0, 0, 219, 0,
- 0, 180, 274, 273, 275, 276, 277, 278, 0, 0,
- 279, 271, 272, 0, 0, 253, 265, 0, 290, 0,
+ 0, 0, 0, 0, 239, 240, 489, 0, 0, 0,
+ 279, 0, 241, 0, 0, 238, 243, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 173, 0, 0,
+ 277, 0, 0, 0, 0, 0, 58, 0, 67, 65,
+ 69, 0, 0, 0, 0, 0, 61, 0, 269, 278,
+ 275, 276, 273, 274, 272, 271, 270, 280, 263, 264,
+ 266, 0, 265, 57, 0, 62, 71, 66, 60, 70,
+ 64, 0, 0, 0, 0, 233, 0, 0, 0, 59,
+ 0, 0, 0, 0, 268, 0, 0, 0, 68, 63,
+ 0, 0, 0, 0, 261, 262, 0, 0, 0, 0,
+ 0, 0, 0, 35, 0, 224, 206, 251, 250, 252,
+ 253, 254, 255, 0, 0, 256, 248, 249, 0, 0,
+ 230, 242, 0, 267, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 262, 263,
- 0, 0, 0, 0, 302, 0, 264, 0, 0, 261,
- 266, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 158, 0, 0, 300, 0, 0, 0, 0, 0,
- 46, 0, 0, 0, 0, 0, 0, 49, 0, 292,
- 301, 298, 299, 296, 297, 295, 294, 293, 303, 286,
- 287, 289, 52, 288, 45, 0, 50, 56, 53, 48,
- 55, 47, 0, 0, 0, 0, 291, 0, 0, 0,
- 54, 51, 0, 0, 0, 0, 284, 285, 0, 0,
- 0, 0, 0, 0, 0, 219, 0, 0, 180, 274,
- 273, 275, 276, 277, 278, 0, 0, 279, 271, 272,
- 0, 0, 0, 265, 0, 290, 0, 0, 0, 0,
+ 0, 0, 0, 239, 240, 0, 0, 0, 0, 279,
+ 0, 241, 0, 0, 238, 243, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 173, 0, 0, 277,
+ 0, 0, 0, 0, 0, 58, 0, 67, 65, 69,
+ 0, 0, 0, 0, 0, 61, 0, 269, 278, 275,
+ 276, 273, 274, 272, 271, 270, 280, 263, 264, 266,
+ 17, 265, 57, 0, 62, 71, 66, 60, 70, 0,
+ 0, 64, 0, 0, 0, 0, 233, 0, 0, 0,
+ 59, 0, 0, 0, 0, 268, 0, 0, 0, 68,
+ 63, 0, 0, 0, 0, 261, 262, 0, 0, 0,
+ 0, 0, 0, 0, 35, 0, 0, 206, 251, 250,
+ 252, 253, 254, 255, 0, 0, 256, 248, 249, 0,
+ 0, 230, 242, 0, 267, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 262, 263, 0, 0, 0,
- 0, 302, 0, 264, 0, 0, 261, 266, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 158, 0,
- 0, 300, 0, 0, 0, 0, 0, 46, 0, 0,
- 0, 0, 0, 0, 49, 0, 292, 301, 298, 299,
- 296, 297, 295, 294, 293, 303, 286, 287, 289, 52,
- 288, 45, 0, 50, 56, 53, 48, 55, 47, 0,
- 0, 0, 0, 291, 0, 0, 0, 54, 51, 0,
- 0, 0, 0, 284, 285, 0, 0, 0, 0, 0,
- 0, 0, 219, 0, 0, 180, 274, 273, 275, 276,
- 277, 278, 0, 0, 279, 0, 0, 0, 0, 0,
- 265, 0, 290, 0, 0, 0, 52, 0, 0, 0,
- 205, 0, 0, 0, 0, 47, 0, 0, 0, 0,
- 52, 0, 262, 263, 54, 51, 0, 0, 302, 47,
- 264, 0, 0, 261, 266, 0, 0, 0, 54, 51,
- 0, 0, 172, 0, 207, 158, 0, 0, 300, 0,
- 0, 0, 0, 0, 46, 0, 43, 0, 0, 0,
- 0, 49, 0, 292, 301, 298, 299, 296, 297, 295,
- 294, 293, 303, 286, 287, 289, 0, 288, 45, 0,
- 50, 56, 53, 48, 55, 52, 0, 0, 0, 423,
- 0, 0, 0, 0, 47, 0, 0, 0, 0, 0,
- 0, 0, 158, 54, 51, 0, 0, 0, 0, 0,
- 52, 46, 0, 0, 38, 0, 40, 0, 49, 47,
- 41, 43, 0, 425, 0, 46, 0, 0, 54, 51,
- 0, 0, 49, 346, 345, 45, 0, 50, 56, 53,
- 48, 55, 0, 219, 0, 0, 172, 0, 0, 45,
- 347, 50, 56, 53, 48, 55, 52, 0, 0, 0,
- 0, 0, 0, 0, 52, 47, 0, 0, 0, 0,
- 0, 0, 0, 47, 54, 51, 0, 0, 0, 0,
- 0, 158, 54, 51, 0, 0, 0, 0, 0, 0,
- 46, 0, 43, 0, 425, 0, 0, 49, 0, 0,
- 172, 0, 207, 0, 0, 0, 158, 0, 0, 0,
- 0, 0, 0, 0, 45, 46, 50, 56, 53, 48,
- 55, 0, 49, 0, 0, 0, 0, 0, 52, 0,
- 0, 0, 0, 0, 0, 0, 200, 47, 0, 45,
- 0, 50, 56, 53, 48, 55, 54, 51, 0, 0,
- 0, 0, 158, 0, 0, 0, 0, 0, 0, 0,
- 158, 46, 0, 0, 172, 0, 0, 0, 49, 46,
- 0, 0, 0, 0, 0, 0, 49, 0, 0, 0,
- 0, 0, 0, 52, 0, 45, 0, 50, 56, 53,
- 48, 55, 47, 45, 52, 50, 56, 53, 48, 55,
- 0, 54, 51, 47, 0, 0, 0, 0, 52, 0,
- 0, 0, 54, 51, 0, 0, 0, 47, 0, 180,
- 0, 0, 0, 0, 158, 0, 54, 51, 0, 0,
- 43, 0, 0, 46, 0, 0, 0, 0, 0, 0,
- 49, 0, 0, 0, 172, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 45, 0, 50,
- 56, 53, 48, 55, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 158,
- 0, 0, 0, 0, 0, 0, 0, 0, 46, 0,
- 158, 0, 0, 0, 0, 49, 0, 0, 0, 46,
- 0, 0, 0, 0, 158, 0, 49, 0, 0, 0,
- 0, 0, 45, 46, 50, 56, 53, 48, 55, 0,
- 49, 0, 0, 45, 0, 50, 56, 53, 48, 55,
- 0, 0, 0, 0, 0, 0, 351, 45, 354, 50,
- 56, 53, 48, 55, 368, 369, 370, 371, 372, 373,
- 374, 0, 352, 353, 350, 356, 355, 365, 366, 358,
- 359, 360, 361, 362, 363, 364, 357, 0, 0, 367,
+ 0, 0, 0, 0, 239, 240, 0, 0, 0, 0,
+ 279, 0, 241, 0, 0, 238, 243, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 173, 0, 0,
+ 277, 0, 0, 0, 0, 0, 58, 0, 67, 65,
+ 69, 0, 0, 0, 0, 0, 61, 0, 269, 278,
+ 275, 276, 273, 274, 272, 271, 270, 280, 263, 264,
+ 266, 0, 265, 57, 0, 62, 71, 66, 60, 70,
+ 64, 0, 0, 0, 0, 233, 0, 0, 0, 59,
+ 0, 0, 0, 0, 268, 0, 0, 0, 68, 63,
+ 0, 0, 0, 0, 261, 262, 0, 0, 0, 0,
+ 0, 0, 0, 35, 0, 0, 206, 251, 250, 252,
+ 253, 254, 255, 0, 0, 256, 248, 249, 0, 0,
+ 230, 242, 0, 267, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 239, 240, 0, 0, 0, 0, 279,
+ 0, 241, 0, 0, 238, 243, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 173, 0, 0, 277,
+ 0, 0, 0, 0, 0, 58, 0, 67, 65, 69,
+ 0, 0, 0, 0, 0, 61, 0, 269, 278, 275,
+ 276, 273, 274, 272, 271, 270, 280, 263, 264, 266,
+ 64, 265, 57, 0, 62, 71, 66, 60, 70, 59,
+ 0, 0, 0, 0, 268, 0, 0, 0, 68, 63,
+ 0, 0, 0, 0, 261, 262, 0, 0, 0, 0,
+ 0, 0, 0, 35, 0, 0, 206, 251, 250, 252,
+ 253, 254, 255, 0, 0, 256, 248, 249, 0, 0,
+ 0, 242, 0, 267, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 239, 240, 0, 0, 0, 0, 279,
+ 0, 241, 0, 0, 238, 243, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 173, 0, 0, 277,
+ 0, 0, 0, 0, 0, 58, 0, 67, 65, 69,
+ 0, 0, 0, 0, 0, 61, 0, 269, 278, 275,
+ 276, 273, 274, 272, 271, 270, 280, 263, 264, 266,
+ 64, 265, 57, 0, 62, 71, 66, 60, 70, 59,
+ 0, 0, 0, 0, 268, 0, 0, 0, 68, 63,
+ 0, 0, 0, 0, 261, 262, 0, 0, 0, 0,
+ 0, 0, 0, 35, 0, 0, 206, 251, 250, 252,
+ 253, 254, 255, 0, 0, 256, 17, 0, 0, 0,
+ 0, 242, 0, 267, 0, 0, 0, 64, 0, 0,
+ 0, 0, 0, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 0, 239, 240, 68, 63, 0, 0, 279,
+ 0, 241, 0, 0, 238, 243, 0, 0, 0, 0,
+ 35, 0, 0, 198, 0, 0, 173, 0, 0, 277,
+ 0, 0, 0, 0, 0, 58, 0, 67, 65, 69,
+ 0, 0, 0, 0, 0, 61, 0, 269, 278, 275,
+ 276, 273, 274, 272, 271, 270, 280, 263, 264, 266,
+ 17, 265, 57, 0, 62, 71, 66, 60, 70, 0,
+ 0, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 59, 0, 0, 173, 0, 0, 0, 0, 0, 68,
+ 63, 0, 58, 0, 67, 65, 69, 0, 0, 0,
+ 0, 0, 61, 0, 35, 0, 0, 55, 64, 0,
+ 0, 0, 296, 0, 0, 0, 0, 59, 0, 57,
+ 0, 62, 71, 66, 60, 70, 68, 63, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 198, 0, 298, 0, 0, 0,
+ 0, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 59, 0, 0, 0, 0, 0, 0, 173, 0, 68,
+ 63, 0, 0, 0, 0, 0, 58, 0, 67, 65,
+ 69, 0, 0, 0, 35, 0, 61, 198, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 64, 0, 57, 173, 62, 71, 66, 60, 70,
+ 59, 0, 0, 58, 0, 67, 65, 69, 0, 68,
+ 63, 0, 0, 61, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 55, 0, 565,
+ 57, 0, 62, 71, 66, 60, 70, 173, 0, 0,
+ 0, 0, 0, 0, 64, 0, 58, 0, 67, 65,
+ 69, 0, 0, 59, 0, 0, 61, 0, 0, 0,
+ 0, 0, 68, 63, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 57, 0, 62, 71, 66, 60, 70,
+ 198, 0, 298, 0, 0, 0, 0, 173, 0, 0,
+ 0, 0, 0, 0, 64, 0, 58, 0, 67, 65,
+ 69, 0, 291, 59, 0, 0, 61, 0, 0, 0,
+ 0, 0, 68, 63, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 57, 0, 62, 71, 66, 60, 70,
+ 198, 0, 0, 0, 0, 0, 0, 64, 0, 0,
+ 173, 0, 0, 0, 0, 0, 59, 0, 0, 58,
+ 0, 67, 65, 69, 0, 68, 63, 0, 0, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 55, 64, 0, 57, 0, 62, 71,
+ 66, 60, 70, 59, 0, 0, 0, 0, 64, 0,
+ 173, 0, 68, 63, 0, 0, 0, 59, 0, 58,
+ 0, 67, 65, 69, 0, 0, 68, 63, 0, 61,
+ 206, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 198, 0, 57, 0, 62, 71,
+ 66, 60, 70, 173, 0, 0, 0, 0, 0, 0,
+ 0, 0, 58, 0, 67, 65, 69, 0, 0, 0,
+ 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,
+ 173, 62, 71, 66, 60, 70, 0, 0, 0, 58,
+ 0, 67, 65, 69, 173, 0, 0, 0, 0, 61,
+ 0, 0, 0, 58, 0, 67, 65, 69, 0, 0,
+ 0, 0, 0, 61, 0, 0, 57, 0, 62, 71,
+ 66, 60, 70, 0, 0, 0, 0, 0, 0, 0,
+ 57, 0, 62, 71, 66, 60, 70,
}
var yyPact = [...]int{
- 1182, -1000, -120, 484, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- 2933, -1, 16, 4, 15, 2198, -1000, -1000, -1000, -1000,
- 479, 431, 326, -1000, -31, 3221, 467, 3196, -48, 11,
- 3221, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, -1000, -1000, -1000, -1000, -1000, -1000, 0, 3221, -1000,
- 3221, -58, 159, -58, 3221, -1000, -1000, -1000, -1000, -1000,
+ 356, -1000, -110, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
+ -1000, -1000, -1000, -1000, -1000, 457, 480, -1000, -1000, -1000,
+ -1000, -1000, 136, -5, 27, 19, 24, 2236, -1000, -1000,
+ -1000, -1000, -1000, 490, 269, -1000, -1000, -1000, 445, 453,
+ 445, 337, 439, 354, -1000, -25, 3661, 479, 3647, -29,
+ 13, 3661, -70, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
+ -1000, -1000, 22, 3661, -1000, 3661, -32, 170, -32, 3661,
-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,
@@ -747,127 +807,136 @@ var yyPact = [...]int{
-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, 375, -1000, -1000, 123, 3141, 389,
- 2919, 54, -1000, -1000, 3221, 171, -1000, 44, -1000, 53,
- -1000, -1000, 3221, 108, 152, 1458, 3221, 1458, -25, 3221,
- 421, 266, 3221, -1000, -1000, 284, 721, -1000, -1000, 287,
- 3221, -1000, 3196, 13, -1000, 3077, -1000, -1000, 2050, 460,
- 3196, 2608, 1902, 1458, 411, -62, -1000, -1000, -1000, -1000,
- -1000, -1000, 35, -1000, 3221, -1000, -1000, 3221, 1458, 927,
- -1000, 448, -1000, 372, 369, 405, 3196, 3207, -1000, 285,
- -1000, 9, 8, 6, -1000, -1000, -1000, -1000, 453, 2608,
- -1000, 199, -1000, 2608, 3299, -1000, 187, -1000, 25, -1000,
- -1000, 2862, 2862, 2862, 2862, 2862, 2862, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- 187, 50, -1000, 2472, 187, 187, 187, 187, 187, 187,
- 2608, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, -1000, 34, -1000, -1000, -1000, 263,
- 3207, -1000, -29, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, -1000, 209, -1000, -1000, 2998, 33, 3221, -1000, -1000,
- -1000, -1000, 260, 187, 484, 189, 253, 29, 453, 187,
- 187, 187, 443, 446, 199, 2608, 2608, 165, 76, 2735,
- 131, 94, 2862, 2862, 2862, 2862, 2862, 2862, 2862, 2862,
- 2862, 2862, 2862, 2862, 2862, 2862, 2862, 12, -1000, -1000,
- -1000, -1000, -1000, -1000, -1000, -1000, 479, 264, 264, 40,
- 40, 40, 40, 40, 789, 2334, 1902, 261, 249, 199,
- 927, 927, 2608, 2608, 3207, 437, 93, 199, 3207, -1000,
- 163, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 927, 927,
- 927, 927, 1754, 3221, -1000, -1000, 3221, -1000, 460, 927,
- 3023, -1000, -1000, 3069, -1000, -1000, 1606, -1000, -1000, 401,
- 255, -1000, -1000, 1116, -1000, -1000, 3207, -1000, 3207, 443,
- 3207, 3207, 3207, -1000, 2608, 2608, 76, 104, -1000, -1000,
- 214, -1000, -1000, -1000, 768, -1000, -1000, -1000, -1000, 131,
- 2862, 2862, 2862, 10, 768, 2319, 993, 1183, 40, 107,
- 107, 72, 72, 72, 72, 72, 55, 55, -1000, -1000,
- -1000, -1000, -1000, -1000, -1000, -1000, 163, 927, 247, 187,
- -1000, 2608, -1000, 204, 204, 43, 226, 243, -1000, 927,
- 100, -1000, 2608, 163, -1000, 204, 163, 204, 204, -1000,
- 1458, -1000, 457, -1000, 219, 478, -1000, -1000, -1000, 423,
- 1074, -1000, -1000, 28, 377, 187, -1000, 19, -1000, -1000,
- 238, -1000, 238, 238, 206, 202, -1000, 197, -1000, -1000,
- -1000, -1000, 10, 768, 702, -1000, 2862, 2862, -1000, 204,
- 927, 199, -1000, -1000, 12, 12, 12, -92, 3207, 288,
- 88, -1000, 2608, 186, -1000, -1000, -1000, -1000, -1000, -1000,
- 455, 445, 3023, 3023, 3023, 3023, -1000, 323, 322, -1000,
- 304, 301, 305, 3221, -1000, 174, 1310, 472, -1000, 3207,
- -1000, 3207, -1000, -1000, 2608, 2608, 2608, -1000, -1000, -1000,
- -1000, 2862, 768, 768, -1000, 163, 163, 37, 163, 163,
- 187, -1000, -89, -1000, 199, 2608, 453, 2608, 2608, 478,
- 201, 289, -1000, -1000, -1000, -1000, 321, -1000, 312, -1000,
- -1000, -1000, -1000, -1000, 3196, -1000, -1000, 199, 199, -1000,
- 768, -1000, -1000, -1000, 137, -1000, 381, -1000, -1000, 2862,
- 163, 139, 199, 443, 199, 183, 2608, 2608, -1000, -1000,
- 171, 145, 12, -14, -1000, -1000, 391, 199, 199, 38,
- 134, -1000, 163, 7, -100, -1000, 471, 56, -1000, 376,
- 163, -1000, 357, -96, -104, -1000, 359, 12, -1000, -1000,
- 332, -1000, 291, -1000, -98, -1000, -102, -106, -1000,
+ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 337,
+ 176, 402, 2933, 2933, 402, -1000, -1000, -1000, -1000, -1000,
+ 394, -1000, -1000, 135, 3567, 395, 3371, 47, -1000, -1000,
+ 3661, 182, -1000, 89, -1000, 46, -1000, -1000, 3661, 120,
+ 165, 1481, -4, 3661, 1481, -9, 3661, 418, 305, 3661,
+ -1000, -1000, -1000, -1000, -1000, -1000, 485, 66, 233, -1000,
+ 2933, 1207, -1000, 187, -1000, 35, -1000, -1000, 3193, 3193,
+ 3193, 3193, 3193, 3193, -1000, -1000, -1000, -1000, -1000, -1000,
+ -1000, -1000, -1000, -1000, -1000, -1000, -1000, 187, 45, -1000,
+ 2794, 187, 187, 187, 187, 187, 187, 2933, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 272, -1000, 468, -1000, 354, 942, 307, -1000, -1000,
+ 328, 3661, -1000, 3647, 80, -1000, 3517, -1000, -1000, 2085,
+ 476, 3647, 2933, 1934, 1481, 417, -41, -1000, -1000, -1000,
+ -1000, -1000, 3661, 101, -1000, 3661, -1000, -1000, 3661, 1481,
+ -1000, 374, 2933, 2933, 172, 2933, 2933, 74, 3063, 144,
+ 158, 3193, 3193, 3193, 3193, 3193, 3193, 3193, 3193, 3193,
+ 3193, 3193, 3193, 3193, 3193, 3193, 21, -1000, -1000, -1000,
+ -1000, -1000, -1000, -1000, -1000, 269, 508, 508, 36, 36,
+ 36, 36, 36, 1117, 2375, 1934, 176, 288, 133, 2794,
+ 2514, 2514, 2933, 2933, 3610, 440, 115, 133, 3610, -1000,
+ 176, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2514, 2514,
+ 2514, 2514, 2933, -1000, -1000, -1000, 440, 460, -1000, 385,
+ 384, 2514, -1000, 303, 3647, 187, -1000, 3334, -1000, 298,
+ -1000, 11, 4, 2, -1000, -1000, -1000, -1000, 457, 2933,
+ -1000, 133, -1000, 43, -1000, -1000, -1000, 279, 3610, 1481,
+ -1000, 91, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
+ -1000, -1000, 368, 74, 86, -1000, -1000, 201, -1000, -1000,
+ 133, 133, -1000, 689, -1000, -1000, -1000, -1000, 144, 3193,
+ 3193, 3193, 88, 689, 815, 2358, 829, 36, 186, 186,
+ 63, 63, 63, 63, 63, 357, 357, -1000, -1000, -1000,
+ -1000, -1000, -1000, -1000, -1000, 176, 2514, 250, -1000, -1000,
+ 958, 42, 187, -1000, 2933, -1000, 176, 242, 242, 55,
+ 238, 262, -1000, 2514, 96, -1000, 2933, 176, -1000, 242,
+ 176, 242, 242, -1000, 3661, -1000, -1000, -1000, -1000, 338,
+ -1000, 412, 295, 197, -1000, -1000, 2653, 176, 244, 41,
+ 457, 187, 187, 187, 445, 133, 1783, 3661, -1000, -1000,
+ -1000, 3661, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
+ -1000, -1000, 88, 689, 733, -1000, 3193, 3193, -1000, 242,
+ 2514, -1000, -1000, 3464, -1000, -1000, 1632, 2514, 133, -1000,
+ -1000, -1000, 21, 21, 21, -82, 3610, 255, 87, -1000,
+ 2933, 125, -1000, -1000, -1000, -1000, -1000, -1000, 476, 3414,
+ 406, -1000, 187, -1000, -1000, 311, 3610, 3610, 445, 3610,
+ 3610, 3610, -1000, -1000, 1481, -1000, -1000, -1000, 3193, 689,
+ 689, -1000, -1000, -1000, -1000, 39, 176, 176, 25, 176,
+ 176, 187, -1000, -75, -1000, 133, 2933, 461, 204, 726,
+ -1000, -1000, -1000, 421, 3250, 482, -1000, 187, -1000, 269,
+ 38, -1000, -1000, 222, -1000, 222, 222, -1000, 689, 1330,
+ -1000, -1000, -1000, 157, -1000, 393, -1000, -1000, 3193, 176,
+ 161, 133, 466, 452, 3414, 3414, 3414, 3414, -1000, 351,
+ 347, -1000, 332, 331, 389, 3661, -1000, 220, 3250, 3647,
+ 197, 176, 3610, -1000, 3610, -1000, -1000, -1000, 215, 21,
+ 7, -1000, -1000, -1000, 2933, 2933, 726, 203, 795, -1000,
+ -1000, -1000, -1000, 335, -1000, 316, -1000, -1000, -1000, -1000,
+ 182, -1000, -1000, -1000, 33, 156, -1000, 176, 20, -95,
+ 133, 173, 2933, 2933, -1000, -1000, -1000, 390, 176, -1000,
+ 367, -91, -101, 133, 133, 21, -1000, -1000, 341, -1000,
+ -1000, -93, -97, -103, -1000,
}
var yyPgo = [...]int{
- 0, 629, 38, 628, 627, 626, 625, 624, 623, 618,
- 613, 611, 608, 604, 510, 603, 602, 34, 601, 600,
- 596, 587, 15, 37, 10, 22, 19, 584, 23, 24,
- 14, 583, 577, 12, 576, 124, 575, 399, 574, 32,
- 21, 573, 40, 572, 571, 28, 20, 569, 564, 562,
- 560, 559, 557, 26, 2, 555, 16, 17, 554, 18,
- 6, 553, 13, 552, 551, 549, 548, 3, 547, 8,
- 546, 1, 545, 540, 535, 532, 35, 7, 30, 516,
- 402, 182, 515, 513, 512, 503, 502, 36, 722, 259,
- 11, 31, 501, 5, 27, 42, 500, 499, 29, 25,
- 4, 9, 492, 491, 490, 484, 431, 0, 59,
+ 0, 633, 47, 49, 631, 41, 630, 629, 628, 626,
+ 625, 624, 622, 614, 613, 600, 599, 43, 598, 410,
+ 32, 597, 44, 593, 592, 24, 54, 17, 23, 9,
+ 591, 14, 2, 34, 588, 580, 8, 576, 37, 573,
+ 358, 572, 10, 26, 571, 31, 568, 561, 36, 472,
+ 559, 557, 556, 554, 553, 551, 29, 1, 3, 15,
+ 16, 546, 42, 6, 545, 21, 540, 539, 538, 537,
+ 18, 535, 30, 532, 20, 45, 531, 530, 25, 13,
+ 39, 524, 366, 165, 523, 522, 521, 519, 517, 515,
+ 22, 5, 578, 7, 19, 514, 654, 27, 40, 509,
+ 507, 38, 11, 4, 12, 506, 505, 503, 483, 0,
+ 500, 124,
}
var yyR1 = [...]int{
- 0, 103, 104, 104, 1, 1, 1, 1, 1, 1,
+ 0, 106, 107, 107, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 2, 2, 3,
- 3, 4, 5, 6, 7, 7, 7, 8, 8, 8,
- 9, 10, 10, 10, 11, 102, 102, 102, 12, 13,
- 13, 105, 14, 15, 15, 16, 16, 16, 19, 19,
- 19, 17, 17, 18, 18, 24, 24, 23, 23, 25,
- 25, 25, 25, 92, 92, 92, 91, 91, 27, 27,
- 28, 28, 29, 29, 30, 30, 30, 37, 31, 31,
- 31, 31, 97, 97, 96, 96, 96, 95, 95, 32,
- 32, 32, 32, 33, 33, 33, 33, 34, 34, 36,
- 36, 35, 35, 38, 38, 38, 38, 39, 39, 40,
- 40, 26, 26, 26, 26, 26, 26, 42, 42, 41,
- 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
- 41, 52, 52, 52, 52, 52, 52, 43, 43, 43,
- 43, 43, 43, 43, 22, 22, 53, 53, 53, 59,
- 54, 54, 100, 100, 100, 100, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 50, 50, 50, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 49, 49, 49,
- 49, 49, 49, 49, 49, 108, 108, 51, 51, 51,
- 51, 20, 20, 20, 20, 20, 101, 101, 101, 101,
- 101, 101, 101, 101, 63, 63, 21, 21, 61, 61,
- 62, 64, 64, 60, 60, 60, 45, 45, 45, 45,
- 45, 45, 45, 47, 47, 47, 65, 65, 66, 66,
- 67, 67, 68, 68, 69, 70, 70, 70, 71, 71,
- 71, 71, 72, 72, 72, 73, 73, 75, 75, 74,
- 74, 74, 74, 76, 76, 44, 44, 55, 55, 57,
- 57, 56, 58, 77, 77, 78, 79, 79, 81, 81,
- 82, 82, 80, 80, 83, 83, 83, 83, 83, 83,
- 84, 84, 85, 85, 85, 86, 86, 89, 89, 90,
- 90, 93, 93, 94, 94, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 106, 107, 98,
- 99, 99, 99,
+ 4, 4, 5, 5, 6, 6, 7, 8, 9, 10,
+ 10, 10, 10, 11, 11, 11, 11, 12, 13, 13,
+ 13, 14, 105, 105, 105, 15, 16, 16, 16, 16,
+ 16, 110, 17, 18, 18, 19, 19, 19, 22, 22,
+ 22, 20, 20, 21, 21, 27, 27, 26, 26, 28,
+ 28, 28, 28, 95, 95, 95, 94, 94, 30, 30,
+ 31, 31, 32, 32, 33, 33, 33, 40, 34, 34,
+ 34, 34, 100, 100, 99, 99, 99, 98, 98, 35,
+ 35, 35, 35, 36, 36, 36, 36, 37, 37, 39,
+ 39, 38, 38, 41, 41, 41, 41, 42, 42, 43,
+ 43, 29, 29, 29, 29, 29, 29, 45, 45, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 55, 55, 55, 55, 55, 55, 46, 46, 46,
+ 46, 46, 46, 46, 25, 25, 56, 56, 56, 62,
+ 57, 57, 103, 103, 103, 103, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 53, 53, 53, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 52, 52, 52,
+ 52, 52, 52, 52, 52, 111, 111, 54, 54, 54,
+ 54, 23, 23, 23, 23, 23, 104, 104, 104, 104,
+ 104, 104, 104, 104, 66, 66, 24, 24, 64, 64,
+ 65, 67, 67, 63, 63, 63, 48, 48, 48, 48,
+ 48, 48, 48, 50, 50, 50, 68, 68, 69, 69,
+ 70, 70, 71, 71, 72, 73, 73, 73, 74, 74,
+ 74, 74, 75, 75, 75, 76, 76, 47, 47, 47,
+ 47, 47, 47, 77, 77, 77, 77, 78, 78, 58,
+ 58, 60, 60, 59, 61, 79, 79, 80, 81, 81,
+ 83, 83, 84, 84, 82, 82, 85, 85, 85, 85,
+ 85, 85, 85, 86, 86, 86, 87, 87, 88, 88,
+ 88, 89, 89, 92, 92, 93, 93, 96, 96, 97,
+ 97, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 108, 109, 101, 102,
+ 102, 102,
}
var yyR2 = [...]int{
0, 2, 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 13, 7, 3, 7,
- 7, 8, 7, 3, 5, 8, 4, 6, 7, 4,
- 5, 4, 5, 5, 3, 1, 1, 1, 3, 2,
+ 1, 1, 1, 1, 1, 1, 4, 4, 7, 10,
+ 3, 3, 1, 3, 6, 7, 8, 7, 3, 5,
+ 8, 4, 6, 6, 7, 7, 4, 5, 4, 5,
+ 5, 3, 1, 1, 1, 3, 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,
@@ -890,11 +959,12 @@ var yyR2 = [...]int{
4, 0, 2, 1, 3, 5, 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, 1, 3, 0, 3, 1,
- 3, 3, 5, 0, 5, 2, 1, 1, 3, 1,
- 2, 3, 1, 1, 3, 3, 1, 1, 0, 2,
- 0, 3, 0, 1, 1, 1, 1, 1, 1, 1,
- 0, 1, 0, 1, 1, 0, 2, 1, 1, 1,
+ 4, 4, 0, 2, 4, 1, 3, 2, 1, 3,
+ 5, 4, 6, 1, 3, 3, 5, 0, 5, 1,
+ 3, 1, 2, 3, 1, 1, 3, 3, 1, 1,
+ 0, 2, 0, 3, 0, 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,
@@ -905,154 +975,164 @@ 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, 0,
- 0, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+ 1, 1,
}
var yyChk = [...]int{
- -1000, -103, -1, -2, -3, -4, -5, -6, -7, -8,
- -9, -10, -11, -12, -13, 6, 7, 8, 9, 29,
- 106, 107, 109, 108, 110, 119, 120, 121, -104, 153,
- -16, 5, -14, -105, -14, -14, -14, -14, 111, -85,
- 113, 117, -89, 53, -88, 146, 122, 26, 151, 129,
- 148, 36, 17, 150, 35, 152, 149, -80, 113, 115,
- 111, 111, 112, 113, 111, -102, 53, -87, -88, 66,
- 21, 23, 69, 101, 15, 70, 100, 141, 106, 45,
- 133, 134, 131, 132, 124, 28, 9, 24, 120, 20,
- 94, 108, 73, 74, 123, 22, 121, 64, 18, 48,
- 10, 12, 13, 116, 115, 85, 112, 43, 7, 102,
- 25, 82, 39, 27, 41, 83, 16, 135, 136, 30,
- 145, 96, 46, 33, 67, 62, 49, 65, 14, 44,
- 84, 109, 140, 42, 6, 144, 29, 126, 127, 128,
- 119, 40, 111, 125, 72, 114, 63, 5, 117, 8,
- 47, 118, 137, 138, 139, 31, 71, 11, 113, -98,
- -98, -2, 19, 20, -19, 37, 38, -15, -80, -37,
- -35, -93, 53, -88, 10, -77, -78, -60, -89, -93,
- 53, -88, -82, 116, 112, -35, 111, -35, -35, -81,
- 116, 53, -81, -35, -98, -17, 33, 20, 61, -36,
- 25, -35, 29, -96, -95, 21, -93, 55, 103, -35,
- 51, 75, 103, -35, 67, 53, -99, -106, -90, 50,
- -89, -87, -35, -99, 114, -35, 22, 49, -35, -18,
- 40, -47, -89, 56, 59, -75, 29, -106, -35, -77,
- -38, 47, 115, 48, -95, -94, -93, -87, -40, 11,
- -78, -26, -41, 67, -46, -42, 22, -45, -60, -58,
- -59, 101, 90, 91, 98, 68, 102, -50, -48, -49,
- -51, 63, 64, 55, 54, 56, 57, 58, 59, 62,
- -89, -93, -56, -106, 41, 42, 141, 142, 145, 143,
- 70, 31, 131, 139, 138, 137, 135, 136, 133, 134,
- 116, 132, 96, 140, -90, -94, -87, -99, 22, -86,
- 118, -83, 109, 107, 28, 108, 14, 152, 53, -35,
- -35, -99, -23, -25, 92, -26, -93, -79, 18, 10,
- 31, 31, -44, 31, -2, -77, -74, -89, -40, 112,
- 112, 112, -67, 14, -26, 66, 65, 82, -26, -43,
- 85, 67, 83, 84, 69, 87, 86, 97, 90, 91,
- 92, 93, 94, 95, 96, 88, 89, 100, 75, 76,
- 77, 78, 79, 80, 81, -59, -106, 104, 105, -46,
- -46, -46, -46, -46, -46, -106, 103, -2, -54, -26,
- -106, -106, -106, -106, -106, -106, -63, -26, -106, -108,
- -106, -108, -108, -108, -108, -108, -108, -108, -106, -106,
- -106, -106, 103, 49, -89, -98, -84, 114, -27, 51,
- 10, -92, -91, 21, -89, 55, 103, -35, -76, 49,
- -55, -57, -56, -106, -76, -107, 51, 52, 103, -67,
- -106, -106, -106, -71, 16, 15, -26, -26, -52, 62,
- 67, 63, 64, -42, -46, -53, -56, -59, 60, 85,
- 83, 84, 69, -46, -46, -46, -46, -46, -46, -46,
- -46, -46, -46, -46, -46, -46, -46, -46, -100, 53,
- 55, 101, 122, -45, -45, -89, -24, 20, -23, -90,
- -107, 51, -107, -23, -23, -26, -26, -73, -89, -17,
- -61, -62, 71, -89, -107, -23, -24, -23, -23, -90,
- -35, -35, -40, -25, -28, -29, -30, -31, -37, -59,
- -106, -91, 92, -94, 26, 51, -107, -89, -89, -71,
- -39, -89, -39, -39, -26, -68, -69, -26, 62, 63,
- 64, -53, -46, -46, -46, -22, 123, 66, -107, -23,
- -106, -26, -107, -107, 51, 118, 21, -107, 51, -23,
- -64, -62, 73, -26, -107, -107, -107, -107, -107, -99,
- -65, 12, 51, -32, -33, -34, 39, 43, 45, 40,
- 41, 42, 46, -97, 21, -28, 103, 27, -57, 103,
- -107, 51, -107, -107, 51, 17, 51, -70, 23, 24,
- -22, 66, -46, -46, -107, -24, -101, -100, -101, -101,
- 146, -89, -67, 74, -26, 72, -66, 13, 15, -29,
- -30, -29, -30, 39, 39, 39, 44, 39, 44, 39,
- -33, -93, -107, 92, 8, -89, -89, -26, -26, -69,
- -46, -107, -107, 129, -106, -100, 130, -107, -107, -106,
- -21, 144, -26, -67, -26, -54, 49, 49, 39, 39,
- -77, 56, 29, -46, -107, 55, -71, -26, -26, -107,
- 51, -100, -20, 85, 149, -72, 18, 30, -100, 130,
- 56, -107, 147, 46, 150, 8, 85, 29, -107, 36,
- 148, 151, 35, -100, 36, 36, 149, 150, 151,
+ -1000, -106, -1, -2, -6, -7, -8, -9, -10, -11,
+ -12, -13, -14, -15, -16, -3, -4, 6, 7, 8,
+ 9, 29, 106, 107, 109, 108, 110, 119, 120, 121,
+ 124, 125, 126, -5, -108, 50, -107, 156, -70, 14,
+ -70, -19, 5, -17, -110, -17, -17, -17, -17, 111,
+ -88, 113, 65, 117, -92, 53, -91, 149, 122, 26,
+ 154, 132, 151, 36, 17, 125, 153, 124, 35, 126,
+ 155, 152, -82, 113, 115, 111, 111, 112, 113, 111,
+ -105, 53, -90, -91, 66, 21, 23, 69, 101, 15,
+ 70, 100, 144, 106, 45, 136, 137, 134, 135, 127,
+ 28, 9, 24, 120, 20, 94, 108, 73, 74, 123,
+ 22, 121, 64, 18, 48, 10, 12, 13, 116, 115,
+ 85, 112, 43, 7, 102, 25, 82, 39, 27, 41,
+ 83, 16, 138, 139, 30, 148, 96, 46, 33, 67,
+ 62, 49, 65, 14, 44, 84, 109, 143, 42, 6,
+ 147, 29, 129, 130, 131, 119, 40, 111, 128, 72,
+ 114, 63, 5, 117, 8, 47, 118, 140, 141, 142,
+ 31, 71, 11, 113, -101, -101, -101, -101, -101, -19,
+ -2, -74, 16, 15, -74, -5, -3, 6, 19, 20,
+ -22, 37, 38, -18, -82, -40, -38, -96, 53, -91,
+ 10, -79, -80, -63, -92, -96, 53, -91, -84, 116,
+ 112, -38, 143, 111, -38, -38, -83, 116, 53, -83,
+ -38, -101, -5, -109, 52, -75, 18, 30, -29, -44,
+ 67, -49, -45, 22, -48, -63, -61, -62, 101, 90,
+ 91, 98, 68, 102, -53, -51, -52, -54, 63, 64,
+ 55, 54, 56, 57, 58, 59, 62, -92, -96, -59,
+ -108, 41, 42, 144, 145, 148, 146, 70, 31, 134,
+ 142, 141, 140, 138, 139, 136, 137, 116, 135, 96,
+ 143, -71, -72, -29, -75, -17, 33, -20, 20, 61,
+ -39, 25, -38, 29, -99, -98, 21, -96, 55, 103,
+ -38, 51, 75, 103, -38, 67, 53, -102, -108, -93,
+ -92, -90, 113, -38, -102, 114, -38, 22, 49, -38,
+ 8, 85, 66, 65, 82, 51, 17, -29, -46, 85,
+ 67, 83, 84, 69, 87, 86, 97, 90, 91, 92,
+ 93, 94, 95, 96, 88, 89, 100, 75, 76, 77,
+ 78, 79, 80, 81, -62, -108, 104, 105, -49, -49,
+ -49, -49, -49, -49, -108, 103, -2, -57, -29, -108,
+ -108, -108, -108, -108, -108, -108, -66, -29, -108, -111,
+ -108, -111, -111, -111, -111, -111, -111, -111, -108, -108,
+ -108, -108, 51, -73, 23, 24, -22, -50, -92, 56,
+ 59, -21, 40, -47, 29, 31, -2, -108, -38, -79,
+ -41, 47, 115, 48, -98, -97, -96, -90, -43, 11,
+ -80, -29, -93, -97, -90, -102, 22, -89, 118, -38,
+ -85, 109, 107, 28, 108, 14, 144, 155, 53, -38,
+ -38, -102, 35, -29, -29, -55, 62, 67, 63, 64,
+ -29, -29, -45, -49, -56, -59, -62, 60, 85, 83,
+ 84, 69, -49, -49, -49, -49, -49, -49, -49, -49,
+ -49, -49, -49, -49, -49, -49, -49, -103, 53, 55,
+ 101, 122, -48, -48, -92, -27, 20, -26, -28, 92,
+ -29, -96, -93, -109, 51, -109, -2, -26, -26, -29,
+ -29, -76, -92, -20, -64, -65, 71, -92, -109, -26,
+ -27, -26, -26, -72, -81, 18, 10, 31, 31, -26,
+ -78, 49, -79, -58, -60, -59, -108, -2, -77, -92,
+ -43, 112, 112, 112, -70, -29, 103, 49, -92, -102,
+ -101, -86, -87, 114, 21, 112, 27, 36, 62, 63,
+ 64, -56, -49, -49, -49, -25, 123, 66, -109, -26,
+ 51, -95, -94, 21, -92, 55, 103, -108, -29, -109,
+ -109, -109, 51, 118, 21, -109, 51, -26, -67, -65,
+ 73, -29, -109, -109, -109, -109, -109, -38, -30, 10,
+ 26, -78, 51, -109, -109, -109, 51, 103, -70, -108,
+ -108, -108, -74, -93, -38, -38, -101, -25, 66, -49,
+ -49, -109, -28, -94, 92, -97, -27, -104, -103, -104,
+ -104, 149, -92, -70, 74, -29, 72, -43, -31, -32,
+ -33, -34, -40, -62, -108, 27, -60, 31, -2, -108,
+ -92, -92, -74, -42, -92, -42, -42, -102, -49, 103,
+ -109, -109, 132, -108, -103, 133, -109, -109, -108, -24,
+ 147, -29, -68, 12, 51, -35, -36, -37, 39, 43,
+ 45, 40, 41, 42, 46, -100, 21, -31, -108, 8,
+ -58, -2, 103, -109, 51, -109, -109, 92, 56, 29,
+ -49, -109, 55, -69, 13, 15, -32, -33, -32, -33,
+ 39, 39, 39, 44, 39, 44, 39, -36, -96, -109,
+ -79, -109, -92, -92, -109, 51, -103, -23, 85, 152,
+ -29, -57, 49, 49, 39, 39, -103, 133, 56, -109,
+ 150, 46, 153, -29, -29, 29, -109, 36, 151, 154,
+ -103, 36, 152, 153, 154,
}
var yyDef = [...]int{
0, -2, 2, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 15, 41, 41, 41, 41, 41,
- 302, 292, 0, 0, 0, 0, 419, 419, 1, 3,
- 0, 45, 48, 43, 292, 0, 0, 0, 290, 0,
- 415, 303, 304, 307, 308, 404, 405, 406, 407, 408,
- 409, 410, 411, 412, 413, 414, 416, 0, 0, 293,
- 0, 288, 0, 288, 0, 419, 35, 36, 37, 315,
- 316, 317, 318, 319, 320, 321, 322, 323, 324, 325,
- 326, 327, 328, 329, 330, 331, 332, 333, 334, 335,
- 336, 337, 338, 339, 340, 341, 342, 343, 344, 345,
- 346, 347, 348, 349, 350, 351, 352, 353, 354, 355,
- 356, 357, 358, 359, 360, 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, 415, 39,
- 40, 18, 46, 47, 51, 49, 50, 42, 0, 0,
- 84, 101, 311, 312, 0, 23, 283, 0, 233, 0,
- -2, -2, 0, 0, 0, 420, 0, 420, 0, 0,
- 0, 0, 0, 34, 38, 53, 0, 52, 44, 267,
- 0, 100, 0, 103, 85, 0, 87, 88, 0, 109,
- 0, 0, 0, 420, 0, 305, 26, 421, 422, 417,
- 309, 310, 0, 29, 0, 31, 289, 0, 420, 0,
- 54, 0, 243, 0, 0, 0, 0, 0, 99, 109,
- 77, 0, 0, 0, 86, 102, 313, 314, 250, 0,
- 284, 285, 111, 0, 116, 119, 0, 156, 157, 158,
- 159, 0, 0, 0, 0, 0, 0, 181, 182, 183,
- 184, 117, 118, 236, 237, 238, 239, 240, 241, 242,
- 233, 0, 282, 0, 0, 0, 0, 0, 0, 0,
- 224, 0, 205, 205, 205, 205, 205, 205, 205, 205,
- 0, 0, 0, 0, 234, 0, -2, 24, 291, 0,
- 0, 419, 300, 294, 295, 296, 297, 298, 299, 30,
- 32, 33, 68, 57, 59, 63, 0, 0, 286, 287,
- 244, 245, 273, 0, 276, 273, 0, 269, 250, 0,
- 0, 0, 258, 0, 110, 0, 0, 0, 114, 0,
+ 11, 12, 13, 14, 15, -2, 260, 51, 51, 51,
+ 51, 51, 318, 304, 0, 0, 0, 0, 438, 438,
+ 438, 438, 438, 0, 0, 436, 1, 3, 268, 0,
+ 268, 0, 55, 58, 53, 304, 0, 0, 0, 302,
+ 0, 434, 0, 319, 320, 323, 324, 420, 421, 422,
+ 423, 424, 425, 426, 427, 428, 429, 430, 431, 432,
+ 433, 435, 0, 0, 305, 0, 300, 0, 300, 0,
+ 438, 42, 43, 44, 331, 332, 333, 334, 335, 336,
+ 337, 338, 339, 340, 341, 342, 343, 344, 345, 346,
+ 347, 348, 349, 350, 351, 352, 353, 354, 355, 356,
+ 357, 358, 359, 360, 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, 434, 46, 47, 48, 49, 50, 0,
+ 0, 272, 0, 0, 272, 21, 22, 51, 56, 57,
+ 61, 59, 60, 52, 0, 0, 94, 111, 327, 328,
+ 0, 28, 295, 0, 243, 0, -2, -2, 0, 0,
+ 0, 439, 0, 0, 439, 0, 0, 0, 0, 0,
+ 41, 45, 20, 23, 437, 16, 0, 0, 269, 121,
+ 0, 126, 129, 0, 166, 167, 168, 169, 0, 0,
+ 0, 0, 0, 0, 191, 192, 193, 194, 127, 128,
+ 246, 247, 248, 249, 250, 251, 252, 243, 0, 294,
+ 0, 0, 0, 0, 0, 0, 0, 234, 0, 215,
+ 215, 215, 215, 215, 215, 215, 215, 0, 0, 0,
+ 0, 261, 262, 265, 17, 58, 0, 63, 62, 54,
+ 0, 0, 110, 0, 113, 95, 0, 97, 98, 0,
+ 119, 0, 0, 0, 439, 0, 321, 31, 440, 441,
+ 325, 326, 0, 0, 36, 0, 38, 301, 0, 439,
+ 273, 0, 0, 0, 0, 0, 0, 124, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 137, 138,
- 139, 140, 141, 142, 143, 130, 0, 0, 0, 175,
- 176, 177, 178, 179, 0, 55, 0, 0, 0, 150,
- 0, 0, 0, 0, 0, 51, 0, 225, 0, 197,
- 0, 198, 199, 200, 201, 202, 203, 204, 0, 55,
- 0, 0, 0, 0, 306, 27, 0, 301, 109, 0,
- 0, 60, 64, 0, 66, 67, 0, 17, 19, 0,
- 275, 277, 279, 0, 20, 268, 0, 418, 0, 258,
- 0, 0, 0, 22, 0, 0, 112, 113, 115, 131,
- 0, 133, 135, 120, 121, 122, 146, 147, 148, 0,
- 0, 0, 0, 144, 126, 0, 160, 161, 162, 163,
- 164, 165, 166, 167, 168, 169, 170, 171, 174, 152,
- 153, 154, 155, 172, 173, 180, 0, 0, 56, 234,
- 149, 0, 281, 0, 0, 0, 0, 0, 265, 0,
- 231, 228, 0, 0, 206, 0, 0, 0, 0, 235,
- 420, 28, 246, 58, 69, 70, 72, 73, 74, 82,
- 0, 65, 61, 0, 0, 0, 280, 271, 270, 21,
- 0, 107, 0, 0, 259, 251, 252, 255, 132, 134,
- 136, 123, 144, 127, 0, 124, 0, 0, 185, 0,
- 55, 151, 188, 189, 0, 0, 0, 0, 0, 250,
- 0, 229, 0, 0, 196, 207, 208, 209, 210, 25,
- 248, 0, 0, 0, 0, 0, 89, 0, 0, 92,
- 0, 0, 0, 0, 83, 0, 0, 0, 278, 0,
- 104, 0, 105, 106, 0, 0, 0, 254, 256, 257,
- 125, 0, 145, 128, 186, 0, 0, 216, 0, 0,
- 0, 266, 226, 195, 232, 0, 250, 0, 0, 71,
- 78, 0, 81, 90, 91, 93, 0, 95, 0, 97,
- 98, 75, 76, 62, 0, 272, 108, 260, 261, 253,
- 129, 187, 190, 217, 0, 221, 0, 191, 192, 0,
- 0, 0, 230, 258, 249, 247, 0, 0, 94, 96,
- 274, 0, 0, 211, 194, 227, 262, 79, 80, 218,
- 0, 222, 0, 0, 0, 16, 0, 0, 219, 0,
- 0, 193, 0, 0, 0, 263, 0, 0, 223, 212,
- 0, 215, 0, 220, 213, 264, 0, 0, 214,
+ 0, 0, 0, 0, 0, 0, 0, 147, 148, 149,
+ 150, 151, 152, 153, 140, 0, 0, 0, 185, 186,
+ 187, 188, 189, 0, 65, 0, 0, 0, 160, 0,
+ 0, 0, 0, 0, 0, 61, 0, 235, 0, 207,
+ 0, 208, 209, 210, 211, 212, 213, 214, 0, 65,
+ 0, 0, 0, 264, 266, 267, 61, 0, 253, 0,
+ 0, 0, 64, 287, 0, 0, 278, 0, 109, 119,
+ 87, 0, 0, 0, 96, 112, 329, 330, 260, 0,
+ 296, 297, 244, 0, -2, 29, 303, 0, 0, 439,
+ 438, 313, 306, 307, 308, 309, 310, 311, 312, 37,
+ 39, 40, 0, 122, 123, 125, 141, 0, 143, 145,
+ 270, 271, 130, 131, 132, 156, 157, 158, 0, 0,
+ 0, 0, 154, 136, 0, 170, 171, 172, 173, 174,
+ 175, 176, 177, 178, 179, 180, 181, 184, 162, 163,
+ 164, 165, 182, 183, 190, 0, 0, 66, 67, 69,
+ 73, 0, 244, 159, 0, 293, 0, 0, 0, 0,
+ 0, 0, 275, 0, 241, 238, 0, 0, 216, 0,
+ 0, 0, 0, 263, 0, 298, 299, 254, 255, 78,
+ 24, 0, 287, 277, 289, 291, 0, 0, 0, 283,
+ 260, 0, 0, 0, 268, 120, 0, 0, 322, 32,
+ 33, 0, 438, 314, 315, 316, 317, 274, 142, 144,
+ 146, 133, 154, 137, 0, 134, 0, 0, 195, 0,
+ 0, 70, 74, 0, 76, 77, 0, 65, 161, -2,
+ 198, 199, 0, 0, 0, 0, 0, 260, 0, 239,
+ 0, 0, 206, 217, 218, 219, 220, 18, 119, 0,
+ 0, 25, 0, 292, -2, 0, 0, 0, 268, 0,
+ 0, 0, 27, 245, 439, 34, 35, 135, 0, 155,
+ 138, 196, 68, 75, 71, 0, 0, 0, 226, 0,
+ 0, 0, 276, 236, 205, 242, 0, 256, 79, 80,
+ 82, 83, 84, 92, 0, 0, 290, 0, 281, 0,
+ 285, 284, 26, 0, 117, 0, 0, 30, 139, 0,
+ 197, 200, 227, 0, 231, 0, 201, 202, 0, 0,
+ 0, 240, 258, 0, 0, 0, 0, 0, 99, 0,
+ 0, 102, 0, 0, 0, 0, 93, 0, 0, 0,
+ 280, 0, 0, 114, 0, 115, 116, 72, 0, 0,
+ 221, 204, 237, 19, 0, 0, 81, 88, 0, 91,
+ 100, 101, 103, 0, 105, 0, 107, 108, 85, 86,
+ 288, -2, 286, 118, 228, 0, 232, 0, 0, 0,
+ 259, 257, 0, 0, 104, 106, 229, 0, 0, 203,
+ 0, 0, 0, 89, 90, 0, 233, 222, 0, 225,
+ 230, 223, 0, 0, 224,
}
var yyTok1 = [...]int{
@@ -1061,7 +1141,7 @@ var yyTok1 = [...]int{
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 68, 3, 3, 3, 95, 87, 3,
50, 52, 92, 90, 51, 91, 103, 93, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 153,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 156,
76, 75, 77, 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,
@@ -1085,7 +1165,7 @@ var yyTok2 = [...]int{
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,
+ 149, 150, 151, 152, 153, 154, 155,
}
var yyTok3 = [...]int{
0,
@@ -1451,32 +1531,76 @@ yydefault:
yyVAL.statement = yyDollar[1].selStmt
}
case 16:
- yyDollar = yyS[yypt-13 : yypt+1]
+ yyDollar = yyS[yypt-4 : yypt+1]
//line ./go/vt/sqlparser/sql.y:229
{
- 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), OrderBy: yyDollar[11].orderBy, Limit: yyDollar[12].limit, Lock: yyDollar[13].str}
+ sel := yyDollar[1].selStmt.(*Select)
+ sel.OrderBy = yyDollar[2].orderBy
+ sel.Limit = yyDollar[3].limit
+ sel.Lock = yyDollar[4].str
+ yyVAL.selStmt = sel
}
case 17:
+ yyDollar = yyS[yypt-4 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:237
+ {
+ uni := yyDollar[1].selStmt.(*Union)
+ uni.OrderBy = yyDollar[2].orderBy
+ uni.Limit = yyDollar[3].limit
+ uni.Lock = yyDollar[4].str
+ yyVAL.selStmt = uni
+ }
+ case 18:
yyDollar = yyS[yypt-7 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:233
+ //line ./go/vt/sqlparser/sql.y:245
{
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}}}
}
- case 18:
+ case 19:
+ yyDollar = yyS[yypt-10 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:252
+ {
+ 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)}
+ }
+ case 20:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:237
+ //line ./go/vt/sqlparser/sql.y:258
{
yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt}
}
- case 19:
- yyDollar = yyS[yypt-7 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:243
+ case 21:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:262
{
- yyVAL.statement = &Insert{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, Table: yyDollar[4].tableName, Columns: yyDollar[5].columns, Rows: yyDollar[6].insRows, OnDup: OnDup(yyDollar[7].updateExprs)}
+ yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt}
}
- case 20:
+ case 22:
+ yyDollar = yyS[yypt-1 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:270
+ {
+ yyVAL.selStmt = yyDollar[1].selStmt
+ }
+ case 23:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:274
+ {
+ yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt}
+ }
+ case 24:
+ yyDollar = yyS[yypt-6 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:281
+ {
+ // insert_data returns a *Insert pre-filled with Columns & Values
+ ins := yyDollar[5].ins
+ ins.Comments = yyDollar[2].bytes2
+ ins.Ignore = yyDollar[3].str
+ ins.Table = yyDollar[4].tableName
+ ins.OnDup = OnDup(yyDollar[6].updateExprs)
+ yyVAL.statement = ins
+ }
+ case 25:
yyDollar = yyS[yypt-7 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:247
+ //line ./go/vt/sqlparser/sql.y:291
{
cols := make(Columns, 0, len(yyDollar[6].updateExprs))
vals := make(ValTuple, 0, len(yyDollar[7].updateExprs))
@@ -1486,71 +1610,84 @@ yydefault:
}
yyVAL.statement = &Insert{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, Table: yyDollar[4].tableName, Columns: cols, Rows: Values{vals}, OnDup: OnDup(yyDollar[7].updateExprs)}
}
- case 21:
+ case 26:
yyDollar = yyS[yypt-8 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:259
+ //line ./go/vt/sqlparser/sql.y:303
{
yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), Table: yyDollar[3].aliasedTableName, Exprs: yyDollar[5].updateExprs, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit}
}
- case 22:
+ case 27:
yyDollar = yyS[yypt-7 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:265
+ //line ./go/vt/sqlparser/sql.y:309
{
yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Table: yyDollar[4].tableName, Where: NewWhere(WhereStr, yyDollar[5].expr), OrderBy: yyDollar[6].orderBy, Limit: yyDollar[7].limit}
}
- case 23:
+ case 28:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:271
+ //line ./go/vt/sqlparser/sql.y:315
{
yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].updateExprs}
}
- case 24:
+ case 29:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:277
+ //line ./go/vt/sqlparser/sql.y:321
{
yyVAL.statement = &DDL{Action: CreateStr, NewName: yyDollar[4].tableName}
}
- case 25:
+ case 30:
yyDollar = yyS[yypt-8 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:281
+ //line ./go/vt/sqlparser/sql.y:325
{
// Change this to an alter statement
yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[7].tableName, NewName: yyDollar[7].tableName}
}
- case 26:
+ case 31:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:286
+ //line ./go/vt/sqlparser/sql.y:330
{
yyVAL.statement = &DDL{Action: CreateStr, NewName: yyDollar[3].tableName.ToViewName()}
}
- case 27:
+ case 32:
+ yyDollar = yyS[yypt-6 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:334
+ {
+ yyVAL.statement = &DDL{Action: CreateStr, NewName: yyDollar[5].tableName.ToViewName()}
+ }
+ case 33:
yyDollar = yyS[yypt-6 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:292
+ //line ./go/vt/sqlparser/sql.y:340
{
yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, NewName: yyDollar[4].tableName}
}
- case 28:
+ case 34:
yyDollar = yyS[yypt-7 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:296
+ //line ./go/vt/sqlparser/sql.y:344
{
// Change this to a rename statement
yyVAL.statement = &DDL{Action: RenameStr, Table: yyDollar[4].tableName, NewName: yyDollar[7].tableName}
}
- case 29:
+ case 35:
+ yyDollar = yyS[yypt-7 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:349
+ {
+ // Rename an index can just be an alter
+ yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, NewName: yyDollar[4].tableName}
+ }
+ case 36:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:301
+ //line ./go/vt/sqlparser/sql.y:354
{
yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName.ToViewName(), NewName: yyDollar[3].tableName.ToViewName()}
}
- case 30:
+ case 37:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:307
+ //line ./go/vt/sqlparser/sql.y:360
{
yyVAL.statement = &DDL{Action: RenameStr, Table: yyDollar[3].tableName, NewName: yyDollar[5].tableName}
}
- case 31:
+ case 38:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:313
+ //line ./go/vt/sqlparser/sql.y:366
{
var exists bool
if yyDollar[3].byt != 0 {
@@ -1558,16 +1695,16 @@ yydefault:
}
yyVAL.statement = &DDL{Action: DropStr, Table: yyDollar[4].tableName, IfExists: exists}
}
- case 32:
+ case 39:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:321
+ //line ./go/vt/sqlparser/sql.y:374
{
// Change this to an alter statement
yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[5].tableName, NewName: yyDollar[5].tableName}
}
- case 33:
+ case 40:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:326
+ //line ./go/vt/sqlparser/sql.y:379
{
var exists bool
if yyDollar[3].byt != 0 {
@@ -1575,21 +1712,21 @@ yydefault:
}
yyVAL.statement = &DDL{Action: DropStr, Table: yyDollar[4].tableName.ToViewName(), IfExists: exists}
}
- case 34:
+ case 41:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:336
+ //line ./go/vt/sqlparser/sql.y:389
{
yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName, NewName: yyDollar[3].tableName}
}
- case 35:
+ case 42:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:342
+ //line ./go/vt/sqlparser/sql.y:395
{
yyVAL.str = ShowUnsupportedStr
}
- case 36:
+ case 43:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:346
+ //line ./go/vt/sqlparser/sql.y:399
{
if string(yyDollar[1].bytes) == "databases" {
yyVAL.str = ShowDatabasesStr
@@ -1605,352 +1742,370 @@ yydefault:
yyVAL.str = ShowUnsupportedStr
}
}
- case 37:
+ case 44:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:362
+ //line ./go/vt/sqlparser/sql.y:415
{
yyVAL.str = ShowUnsupportedStr
}
- case 38:
+ case 45:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:368
+ //line ./go/vt/sqlparser/sql.y:421
{
yyVAL.statement = &Show{Type: yyDollar[2].str}
}
- case 39:
+ case 46:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:374
+ //line ./go/vt/sqlparser/sql.y:427
{
yyVAL.statement = &Other{}
}
- case 40:
+ case 47:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:378
+ //line ./go/vt/sqlparser/sql.y:431
{
yyVAL.statement = &Other{}
}
- case 41:
+ case 48:
+ yyDollar = yyS[yypt-2 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:435
+ {
+ yyVAL.statement = &Other{}
+ }
+ case 49:
+ yyDollar = yyS[yypt-2 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:439
+ {
+ yyVAL.statement = &Other{}
+ }
+ case 50:
+ yyDollar = yyS[yypt-2 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:443
+ {
+ yyVAL.statement = &Other{}
+ }
+ case 51:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:383
+ //line ./go/vt/sqlparser/sql.y:448
{
setAllowComments(yylex, true)
}
- case 42:
+ case 52:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:387
+ //line ./go/vt/sqlparser/sql.y:452
{
yyVAL.bytes2 = yyDollar[2].bytes2
setAllowComments(yylex, false)
}
- case 43:
+ case 53:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:393
+ //line ./go/vt/sqlparser/sql.y:458
{
yyVAL.bytes2 = nil
}
- case 44:
+ case 54:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:397
+ //line ./go/vt/sqlparser/sql.y:462
{
yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes)
}
- case 45:
+ case 55:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:403
+ //line ./go/vt/sqlparser/sql.y:468
{
yyVAL.str = UnionStr
}
- case 46:
+ case 56:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:407
+ //line ./go/vt/sqlparser/sql.y:472
{
yyVAL.str = UnionAllStr
}
- case 47:
+ case 57:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:411
+ //line ./go/vt/sqlparser/sql.y:476
{
yyVAL.str = UnionDistinctStr
}
- case 48:
+ case 58:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:416
+ //line ./go/vt/sqlparser/sql.y:481
{
yyVAL.str = ""
}
- case 49:
+ case 59:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:420
+ //line ./go/vt/sqlparser/sql.y:485
{
yyVAL.str = SQLNoCacheStr
}
- case 50:
+ case 60:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:424
+ //line ./go/vt/sqlparser/sql.y:489
{
yyVAL.str = SQLCacheStr
}
- case 51:
+ case 61:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:429
+ //line ./go/vt/sqlparser/sql.y:494
{
yyVAL.str = ""
}
- case 52:
+ case 62:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:433
+ //line ./go/vt/sqlparser/sql.y:498
{
yyVAL.str = DistinctStr
}
- case 53:
+ case 63:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:438
+ //line ./go/vt/sqlparser/sql.y:503
{
yyVAL.str = ""
}
- case 54:
+ case 64:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:442
+ //line ./go/vt/sqlparser/sql.y:507
{
yyVAL.str = StraightJoinHint
}
- case 55:
+ case 65:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:447
+ //line ./go/vt/sqlparser/sql.y:512
{
yyVAL.selectExprs = nil
}
- case 56:
+ case 66:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:451
+ //line ./go/vt/sqlparser/sql.y:516
{
yyVAL.selectExprs = yyDollar[1].selectExprs
}
- case 57:
+ case 67:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:457
+ //line ./go/vt/sqlparser/sql.y:522
{
yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr}
}
- case 58:
+ case 68:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:461
+ //line ./go/vt/sqlparser/sql.y:526
{
yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr)
}
- case 59:
+ case 69:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:467
+ //line ./go/vt/sqlparser/sql.y:532
{
yyVAL.selectExpr = &StarExpr{}
}
- case 60:
+ case 70:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:471
+ //line ./go/vt/sqlparser/sql.y:536
{
yyVAL.selectExpr = &NonStarExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent}
}
- case 61:
+ case 71:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:475
+ //line ./go/vt/sqlparser/sql.y:540
{
yyVAL.selectExpr = &StarExpr{TableName: &TableName{Name: yyDollar[1].tableIdent}}
}
- case 62:
+ case 72:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:479
+ //line ./go/vt/sqlparser/sql.y:544
{
yyVAL.selectExpr = &StarExpr{TableName: &TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}}
}
- case 63:
+ case 73:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:484
+ //line ./go/vt/sqlparser/sql.y:549
{
yyVAL.colIdent = ColIdent{}
}
- case 64:
+ case 74:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:488
+ //line ./go/vt/sqlparser/sql.y:553
{
yyVAL.colIdent = yyDollar[1].colIdent
}
- case 65:
+ case 75:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:492
+ //line ./go/vt/sqlparser/sql.y:557
{
yyVAL.colIdent = yyDollar[2].colIdent
}
- case 67:
+ case 77:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:499
+ //line ./go/vt/sqlparser/sql.y:564
{
yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes))
}
- case 68:
+ case 78:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:504
+ //line ./go/vt/sqlparser/sql.y:569
{
yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: &TableName{Name: NewTableIdent("dual")}}}
}
- case 69:
+ case 79:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:508
+ //line ./go/vt/sqlparser/sql.y:573
{
yyVAL.tableExprs = yyDollar[2].tableExprs
}
- case 70:
+ case 80:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:514
+ //line ./go/vt/sqlparser/sql.y:579
{
yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr}
}
- case 71:
+ case 81:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:518
+ //line ./go/vt/sqlparser/sql.y:583
{
yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr)
}
- case 74:
+ case 84:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:528
+ //line ./go/vt/sqlparser/sql.y:593
{
yyVAL.tableExpr = yyDollar[1].aliasedTableName
}
- case 75:
+ case 85:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:532
+ //line ./go/vt/sqlparser/sql.y:597
{
yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent}
}
- case 76:
+ case 86:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:536
+ //line ./go/vt/sqlparser/sql.y:601
{
yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs}
}
- case 77:
+ case 87:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:542
+ //line ./go/vt/sqlparser/sql.y:607
{
yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints}
}
- case 78:
+ case 88:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:555
+ //line ./go/vt/sqlparser/sql.y:620
{
yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr}
}
- case 79:
+ case 89:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:559
+ //line ./go/vt/sqlparser/sql.y:624
{
yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, On: yyDollar[5].expr}
}
- case 80:
+ case 90:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:563
+ //line ./go/vt/sqlparser/sql.y:628
{
yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, On: yyDollar[5].expr}
}
- case 81:
+ case 91:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:567
+ //line ./go/vt/sqlparser/sql.y:632
{
yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr}
}
- case 82:
+ case 92:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:572
+ //line ./go/vt/sqlparser/sql.y:637
{
yyVAL.empty = struct{}{}
}
- case 83:
+ case 93:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:574
+ //line ./go/vt/sqlparser/sql.y:639
{
yyVAL.empty = struct{}{}
}
- case 84:
+ case 94:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:577
+ //line ./go/vt/sqlparser/sql.y:642
{
yyVAL.tableIdent = NewTableIdent("")
}
- case 85:
+ case 95:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:581
+ //line ./go/vt/sqlparser/sql.y:646
{
yyVAL.tableIdent = yyDollar[1].tableIdent
}
- case 86:
+ case 96:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:585
+ //line ./go/vt/sqlparser/sql.y:650
{
yyVAL.tableIdent = yyDollar[2].tableIdent
}
- case 88:
+ case 98:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:592
+ //line ./go/vt/sqlparser/sql.y:657
{
yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes))
}
- case 89:
+ case 99:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:598
+ //line ./go/vt/sqlparser/sql.y:663
{
yyVAL.str = JoinStr
}
- case 90:
+ case 100:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:602
+ //line ./go/vt/sqlparser/sql.y:667
{
yyVAL.str = JoinStr
}
- case 91:
+ case 101:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:606
+ //line ./go/vt/sqlparser/sql.y:671
{
yyVAL.str = JoinStr
}
- case 92:
+ case 102:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:610
+ //line ./go/vt/sqlparser/sql.y:675
{
yyVAL.str = StraightJoinStr
}
- case 93:
+ case 103:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:616
+ //line ./go/vt/sqlparser/sql.y:681
{
yyVAL.str = LeftJoinStr
}
- case 94:
+ case 104:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:620
+ //line ./go/vt/sqlparser/sql.y:685
{
yyVAL.str = LeftJoinStr
}
- case 95:
+ case 105:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:624
+ //line ./go/vt/sqlparser/sql.y:689
{
yyVAL.str = RightJoinStr
}
- case 96:
+ case 106:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:628
+ //line ./go/vt/sqlparser/sql.y:693
{
yyVAL.str = RightJoinStr
}
- case 97:
+ case 107:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:634
+ //line ./go/vt/sqlparser/sql.y:699
{
yyVAL.str = NaturalJoinStr
}
- case 98:
+ case 108:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:638
+ //line ./go/vt/sqlparser/sql.y:703
{
if yyDollar[2].str == LeftJoinStr {
yyVAL.str = NaturalLeftJoinStr
@@ -1958,471 +2113,471 @@ yydefault:
yyVAL.str = NaturalRightJoinStr
}
}
- case 99:
+ case 109:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:648
+ //line ./go/vt/sqlparser/sql.y:713
{
yyVAL.tableName = yyDollar[2].tableName
}
- case 100:
+ case 110:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:652
+ //line ./go/vt/sqlparser/sql.y:717
{
yyVAL.tableName = yyDollar[1].tableName
}
- case 101:
+ case 111:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:658
+ //line ./go/vt/sqlparser/sql.y:723
{
yyVAL.tableName = &TableName{Name: yyDollar[1].tableIdent}
}
- case 102:
+ case 112:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:662
+ //line ./go/vt/sqlparser/sql.y:727
{
yyVAL.tableName = &TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}
}
- case 103:
+ case 113:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:667
+ //line ./go/vt/sqlparser/sql.y:732
{
yyVAL.indexHints = nil
}
- case 104:
+ case 114:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:671
+ //line ./go/vt/sqlparser/sql.y:736
{
yyVAL.indexHints = &IndexHints{Type: UseStr, Indexes: yyDollar[4].colIdents}
}
- case 105:
+ case 115:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:675
+ //line ./go/vt/sqlparser/sql.y:740
{
yyVAL.indexHints = &IndexHints{Type: IgnoreStr, Indexes: yyDollar[4].colIdents}
}
- case 106:
+ case 116:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:679
+ //line ./go/vt/sqlparser/sql.y:744
{
yyVAL.indexHints = &IndexHints{Type: ForceStr, Indexes: yyDollar[4].colIdents}
}
- case 107:
+ case 117:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:685
+ //line ./go/vt/sqlparser/sql.y:750
{
yyVAL.colIdents = []ColIdent{yyDollar[1].colIdent}
}
- case 108:
+ case 118:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:689
+ //line ./go/vt/sqlparser/sql.y:754
{
yyVAL.colIdents = append(yyDollar[1].colIdents, yyDollar[3].colIdent)
}
- case 109:
+ case 119:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:694
+ //line ./go/vt/sqlparser/sql.y:759
{
yyVAL.expr = nil
}
- case 110:
+ case 120:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:698
+ //line ./go/vt/sqlparser/sql.y:763
{
yyVAL.expr = yyDollar[2].expr
}
- case 111:
+ case 121:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:704
+ //line ./go/vt/sqlparser/sql.y:769
{
yyVAL.expr = yyDollar[1].expr
}
- case 112:
+ case 122:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:708
+ //line ./go/vt/sqlparser/sql.y:773
{
yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr}
}
- case 113:
+ case 123:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:712
+ //line ./go/vt/sqlparser/sql.y:777
{
yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr}
}
- case 114:
+ case 124:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:716
+ //line ./go/vt/sqlparser/sql.y:781
{
yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr}
}
- case 115:
+ case 125:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:720
+ //line ./go/vt/sqlparser/sql.y:785
{
yyVAL.expr = &IsExpr{Operator: yyDollar[3].str, Expr: yyDollar[1].expr}
}
- case 116:
+ case 126:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:724
+ //line ./go/vt/sqlparser/sql.y:789
{
yyVAL.expr = yyDollar[1].expr
}
- case 117:
+ case 127:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:730
+ //line ./go/vt/sqlparser/sql.y:795
{
yyVAL.boolVal = BoolVal(true)
}
- case 118:
+ case 128:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:734
+ //line ./go/vt/sqlparser/sql.y:799
{
yyVAL.boolVal = BoolVal(false)
}
- case 119:
+ case 129:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:740
+ //line ./go/vt/sqlparser/sql.y:805
{
yyVAL.expr = yyDollar[1].boolVal
}
- case 120:
+ case 130:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:744
+ //line ./go/vt/sqlparser/sql.y:809
{
yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].boolVal}
}
- case 121:
+ case 131:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:748
+ //line ./go/vt/sqlparser/sql.y:813
{
yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].expr}
}
- case 122:
+ case 132:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:752
+ //line ./go/vt/sqlparser/sql.y:817
{
yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InStr, Right: yyDollar[3].colTuple}
}
- case 123:
+ case 133:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:756
+ //line ./go/vt/sqlparser/sql.y:821
{
yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInStr, Right: yyDollar[4].colTuple}
}
- case 124:
+ case 134:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:760
+ //line ./go/vt/sqlparser/sql.y:825
{
yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeStr, Right: yyDollar[3].expr, Escape: yyDollar[4].expr}
}
- case 125:
+ case 135:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:764
+ //line ./go/vt/sqlparser/sql.y:829
{
yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeStr, Right: yyDollar[4].expr, Escape: yyDollar[5].expr}
}
- case 126:
+ case 136:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:768
+ //line ./go/vt/sqlparser/sql.y:833
{
yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpStr, Right: yyDollar[3].expr}
}
- case 127:
+ case 137:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:772
+ //line ./go/vt/sqlparser/sql.y:837
{
yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpStr, Right: yyDollar[4].expr}
}
- case 128:
+ case 138:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:776
+ //line ./go/vt/sqlparser/sql.y:841
{
yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenStr, From: yyDollar[3].expr, To: yyDollar[5].expr}
}
- case 129:
+ case 139:
yyDollar = yyS[yypt-6 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:780
+ //line ./go/vt/sqlparser/sql.y:845
{
yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenStr, From: yyDollar[4].expr, To: yyDollar[6].expr}
}
- case 130:
+ case 140:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:784
+ //line ./go/vt/sqlparser/sql.y:849
{
yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery}
}
- case 131:
+ case 141:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:790
+ //line ./go/vt/sqlparser/sql.y:855
{
yyVAL.str = IsNullStr
}
- case 132:
+ case 142:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:794
+ //line ./go/vt/sqlparser/sql.y:859
{
yyVAL.str = IsNotNullStr
}
- case 133:
+ case 143:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:798
+ //line ./go/vt/sqlparser/sql.y:863
{
yyVAL.str = IsTrueStr
}
- case 134:
+ case 144:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:802
+ //line ./go/vt/sqlparser/sql.y:867
{
yyVAL.str = IsNotTrueStr
}
- case 135:
+ case 145:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:806
+ //line ./go/vt/sqlparser/sql.y:871
{
yyVAL.str = IsFalseStr
}
- case 136:
+ case 146:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:810
+ //line ./go/vt/sqlparser/sql.y:875
{
yyVAL.str = IsNotFalseStr
}
- case 137:
+ case 147:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:816
+ //line ./go/vt/sqlparser/sql.y:881
{
yyVAL.str = EqualStr
}
- case 138:
+ case 148:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:820
+ //line ./go/vt/sqlparser/sql.y:885
{
yyVAL.str = LessThanStr
}
- case 139:
+ case 149:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:824
+ //line ./go/vt/sqlparser/sql.y:889
{
yyVAL.str = GreaterThanStr
}
- case 140:
+ case 150:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:828
+ //line ./go/vt/sqlparser/sql.y:893
{
yyVAL.str = LessEqualStr
}
- case 141:
+ case 151:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:832
+ //line ./go/vt/sqlparser/sql.y:897
{
yyVAL.str = GreaterEqualStr
}
- case 142:
+ case 152:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:836
+ //line ./go/vt/sqlparser/sql.y:901
{
yyVAL.str = NotEqualStr
}
- case 143:
+ case 153:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:840
+ //line ./go/vt/sqlparser/sql.y:905
{
yyVAL.str = NullSafeEqualStr
}
- case 144:
+ case 154:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:845
+ //line ./go/vt/sqlparser/sql.y:910
{
yyVAL.expr = nil
}
- case 145:
+ case 155:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:849
+ //line ./go/vt/sqlparser/sql.y:914
{
yyVAL.expr = yyDollar[2].expr
}
- case 146:
+ case 156:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:855
+ //line ./go/vt/sqlparser/sql.y:920
{
yyVAL.colTuple = yyDollar[1].valTuple
}
- case 147:
+ case 157:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:859
+ //line ./go/vt/sqlparser/sql.y:924
{
yyVAL.colTuple = yyDollar[1].subquery
}
- case 148:
+ case 158:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:863
+ //line ./go/vt/sqlparser/sql.y:928
{
yyVAL.colTuple = ListArg(yyDollar[1].bytes)
}
- case 149:
+ case 159:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:869
+ //line ./go/vt/sqlparser/sql.y:934
{
yyVAL.subquery = &Subquery{yyDollar[2].selStmt}
}
- case 150:
+ case 160:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:875
+ //line ./go/vt/sqlparser/sql.y:940
{
yyVAL.exprs = Exprs{yyDollar[1].expr}
}
- case 151:
+ case 161:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:879
+ //line ./go/vt/sqlparser/sql.y:944
{
yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
}
- case 152:
+ case 162:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:885
+ //line ./go/vt/sqlparser/sql.y:950
{
yyVAL.str = string(yyDollar[1].bytes)
}
- case 153:
+ case 163:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:889
+ //line ./go/vt/sqlparser/sql.y:954
{
yyVAL.str = string(yyDollar[1].bytes)
}
- case 154:
+ case 164:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:893
+ //line ./go/vt/sqlparser/sql.y:958
{
yyVAL.str = string(yyDollar[1].bytes)
}
- case 155:
+ case 165:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:897
+ //line ./go/vt/sqlparser/sql.y:962
{
yyVAL.str = string(yyDollar[1].bytes)
}
- case 156:
+ case 166:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:903
+ //line ./go/vt/sqlparser/sql.y:968
{
yyVAL.expr = yyDollar[1].expr
}
- case 157:
+ case 167:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:907
+ //line ./go/vt/sqlparser/sql.y:972
{
yyVAL.expr = yyDollar[1].colName
}
- case 158:
+ case 168:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:911
+ //line ./go/vt/sqlparser/sql.y:976
{
yyVAL.expr = yyDollar[1].expr
}
- case 159:
+ case 169:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:915
+ //line ./go/vt/sqlparser/sql.y:980
{
yyVAL.expr = yyDollar[1].subquery
}
- case 160:
+ case 170:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:919
+ //line ./go/vt/sqlparser/sql.y:984
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndStr, Right: yyDollar[3].expr}
}
- case 161:
+ case 171:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:923
+ //line ./go/vt/sqlparser/sql.y:988
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrStr, Right: yyDollar[3].expr}
}
- case 162:
+ case 172:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:927
+ //line ./go/vt/sqlparser/sql.y:992
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorStr, Right: yyDollar[3].expr}
}
- case 163:
+ case 173:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:931
+ //line ./go/vt/sqlparser/sql.y:996
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusStr, Right: yyDollar[3].expr}
}
- case 164:
+ case 174:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:935
+ //line ./go/vt/sqlparser/sql.y:1000
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusStr, Right: yyDollar[3].expr}
}
- case 165:
+ case 175:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:939
+ //line ./go/vt/sqlparser/sql.y:1004
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultStr, Right: yyDollar[3].expr}
}
- case 166:
+ case 176:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:943
+ //line ./go/vt/sqlparser/sql.y:1008
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivStr, Right: yyDollar[3].expr}
}
- case 167:
+ case 177:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:947
+ //line ./go/vt/sqlparser/sql.y:1012
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivStr, Right: yyDollar[3].expr}
}
- case 168:
+ case 178:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:951
+ //line ./go/vt/sqlparser/sql.y:1016
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr}
}
- case 169:
+ case 179:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:955
+ //line ./go/vt/sqlparser/sql.y:1020
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr}
}
- case 170:
+ case 180:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:959
+ //line ./go/vt/sqlparser/sql.y:1024
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftStr, Right: yyDollar[3].expr}
}
- case 171:
+ case 181:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:963
+ //line ./go/vt/sqlparser/sql.y:1028
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightStr, Right: yyDollar[3].expr}
}
- case 172:
+ case 182:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:967
+ //line ./go/vt/sqlparser/sql.y:1032
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr}
}
- case 173:
+ case 183:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:971
+ //line ./go/vt/sqlparser/sql.y:1036
{
yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr}
}
- case 174:
+ case 184:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:975
+ //line ./go/vt/sqlparser/sql.y:1040
{
yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str}
}
- case 175:
+ case 185:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:979
+ //line ./go/vt/sqlparser/sql.y:1044
{
yyVAL.expr = &UnaryExpr{Operator: BinaryStr, Expr: yyDollar[2].expr}
}
- case 176:
+ case 186:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:983
+ //line ./go/vt/sqlparser/sql.y:1048
{
if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal {
yyVAL.expr = num
@@ -2430,9 +2585,9 @@ yydefault:
yyVAL.expr = &UnaryExpr{Operator: UPlusStr, Expr: yyDollar[2].expr}
}
}
- case 177:
+ case 187:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:991
+ //line ./go/vt/sqlparser/sql.y:1056
{
if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal {
// Handle double negative
@@ -2446,21 +2601,21 @@ yydefault:
yyVAL.expr = &UnaryExpr{Operator: UMinusStr, Expr: yyDollar[2].expr}
}
}
- case 178:
+ case 188:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1005
+ //line ./go/vt/sqlparser/sql.y:1070
{
yyVAL.expr = &UnaryExpr{Operator: TildaStr, Expr: yyDollar[2].expr}
}
- case 179:
+ case 189:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1009
+ //line ./go/vt/sqlparser/sql.y:1074
{
yyVAL.expr = &UnaryExpr{Operator: BangStr, Expr: yyDollar[2].expr}
}
- case 180:
+ case 190:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1013
+ //line ./go/vt/sqlparser/sql.y:1078
{
// This rule prevents the usage of INTERVAL
// as a function. If support is needed for that,
@@ -2468,345 +2623,345 @@ yydefault:
// will be non-trivial because of grammar conflicts.
yyVAL.expr = &IntervalExpr{Expr: yyDollar[2].expr, Unit: yyDollar[3].colIdent}
}
- case 185:
+ case 195:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1031
+ //line ./go/vt/sqlparser/sql.y:1096
{
yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs}
}
- case 186:
+ case 196:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1035
+ //line ./go/vt/sqlparser/sql.y:1100
{
yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs}
}
- case 187:
+ case 197:
yyDollar = yyS[yypt-6 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1039
+ //line ./go/vt/sqlparser/sql.y:1104
{
yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs}
}
- case 188:
+ case 198:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1049
+ //line ./go/vt/sqlparser/sql.y:1114
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs}
}
- case 189:
+ case 199:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1053
+ //line ./go/vt/sqlparser/sql.y:1118
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs}
}
- case 190:
+ case 200:
yyDollar = yyS[yypt-6 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1057
+ //line ./go/vt/sqlparser/sql.y:1122
{
yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType}
}
- case 191:
+ case 201:
yyDollar = yyS[yypt-6 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1061
+ //line ./go/vt/sqlparser/sql.y:1126
{
yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType}
}
- case 192:
+ case 202:
yyDollar = yyS[yypt-6 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1065
+ //line ./go/vt/sqlparser/sql.y:1130
{
yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType}
}
- case 193:
+ case 203:
yyDollar = yyS[yypt-9 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1069
+ //line ./go/vt/sqlparser/sql.y:1134
{
yyVAL.expr = &MatchExpr{Columns: yyDollar[3].columns, Expr: yyDollar[7].expr, Option: yyDollar[8].str}
}
- case 194:
+ case 204:
yyDollar = yyS[yypt-7 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1073
+ //line ./go/vt/sqlparser/sql.y:1138
{
yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].str, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str}
}
- case 195:
+ case 205:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1077
+ //line ./go/vt/sqlparser/sql.y:1142
{
yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr}
}
- case 196:
+ case 206:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1081
+ //line ./go/vt/sqlparser/sql.y:1146
{
yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colIdent}
}
- case 197:
+ case 207:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1091
+ //line ./go/vt/sqlparser/sql.y:1156
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")}
}
- case 198:
+ case 208:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1095
+ //line ./go/vt/sqlparser/sql.y:1160
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")}
}
- case 199:
+ case 209:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1099
+ //line ./go/vt/sqlparser/sql.y:1164
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")}
}
- case 200:
+ case 210:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1103
+ //line ./go/vt/sqlparser/sql.y:1168
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")}
}
- case 201:
+ case 211:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1108
+ //line ./go/vt/sqlparser/sql.y:1173
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")}
}
- case 202:
+ case 212:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1113
+ //line ./go/vt/sqlparser/sql.y:1178
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")}
}
- case 203:
+ case 213:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1118
+ //line ./go/vt/sqlparser/sql.y:1183
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")}
}
- case 204:
+ case 214:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1123
+ //line ./go/vt/sqlparser/sql.y:1188
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")}
}
- case 207:
+ case 217:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1137
+ //line ./go/vt/sqlparser/sql.y:1202
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs}
}
- case 208:
+ case 218:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1141
+ //line ./go/vt/sqlparser/sql.y:1206
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs}
}
- case 209:
+ case 219:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1145
+ //line ./go/vt/sqlparser/sql.y:1210
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs}
}
- case 210:
+ case 220:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1149
+ //line ./go/vt/sqlparser/sql.y:1214
{
yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs}
}
- case 211:
+ case 221:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1155
+ //line ./go/vt/sqlparser/sql.y:1220
{
yyVAL.str = ""
}
- case 212:
+ case 222:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1159
+ //line ./go/vt/sqlparser/sql.y:1224
{
yyVAL.str = BooleanModeStr
}
- case 213:
+ case 223:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1163
+ //line ./go/vt/sqlparser/sql.y:1228
{
yyVAL.str = NaturalLanguageModeStr
}
- case 214:
+ case 224:
yyDollar = yyS[yypt-7 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1167
+ //line ./go/vt/sqlparser/sql.y:1232
{
yyVAL.str = NaturalLanguageModeWithQueryExpansionStr
}
- case 215:
+ case 225:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1171
+ //line ./go/vt/sqlparser/sql.y:1236
{
yyVAL.str = QueryExpansionStr
}
- case 216:
+ case 226:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1178
+ //line ./go/vt/sqlparser/sql.y:1243
{
yyVAL.convertType = &ConvertType{Type: yyDollar[1].str}
}
- case 217:
+ case 227:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1182
+ //line ./go/vt/sqlparser/sql.y:1247
{
yyVAL.convertType = &ConvertType{Type: yyDollar[1].str}
}
- case 218:
+ case 228:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1186
+ //line ./go/vt/sqlparser/sql.y:1251
{
yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Length: NewIntVal(yyDollar[3].bytes)}
}
- case 219:
+ case 229:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1190
+ //line ./go/vt/sqlparser/sql.y:1255
{
yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Length: NewIntVal(yyDollar[3].bytes), Charset: yyDollar[5].str}
}
- case 220:
+ case 230:
yyDollar = yyS[yypt-7 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1194
+ //line ./go/vt/sqlparser/sql.y:1259
{
yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Length: NewIntVal(yyDollar[3].bytes), Charset: yyDollar[7].str, Operator: CharacterSetStr}
}
- case 221:
+ case 231:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1198
+ //line ./go/vt/sqlparser/sql.y:1263
{
yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Charset: yyDollar[2].str}
}
- case 222:
+ case 232:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1202
+ //line ./go/vt/sqlparser/sql.y:1267
{
yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Charset: yyDollar[4].str, Operator: CharacterSetStr}
}
- case 223:
+ case 233:
yyDollar = yyS[yypt-6 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1206
+ //line ./go/vt/sqlparser/sql.y:1271
{
yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Length: NewIntVal(yyDollar[3].bytes), Scale: NewIntVal(yyDollar[5].bytes)}
}
- case 224:
+ case 234:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1211
+ //line ./go/vt/sqlparser/sql.y:1276
{
yyVAL.expr = nil
}
- case 225:
+ case 235:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1215
+ //line ./go/vt/sqlparser/sql.y:1280
{
yyVAL.expr = yyDollar[1].expr
}
- case 226:
+ case 236:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1220
+ //line ./go/vt/sqlparser/sql.y:1285
{
yyVAL.str = string("")
}
- case 227:
+ case 237:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1224
+ //line ./go/vt/sqlparser/sql.y:1289
{
yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'"
}
- case 228:
+ case 238:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1230
+ //line ./go/vt/sqlparser/sql.y:1295
{
yyVAL.whens = []*When{yyDollar[1].when}
}
- case 229:
+ case 239:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1234
+ //line ./go/vt/sqlparser/sql.y:1299
{
yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when)
}
- case 230:
+ case 240:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1240
+ //line ./go/vt/sqlparser/sql.y:1305
{
yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr}
}
- case 231:
+ case 241:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1245
+ //line ./go/vt/sqlparser/sql.y:1310
{
yyVAL.expr = nil
}
- case 232:
+ case 242:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1249
+ //line ./go/vt/sqlparser/sql.y:1314
{
yyVAL.expr = yyDollar[2].expr
}
- case 233:
+ case 243:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1255
+ //line ./go/vt/sqlparser/sql.y:1320
{
yyVAL.colName = &ColName{Name: yyDollar[1].colIdent}
}
- case 234:
+ case 244:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1259
+ //line ./go/vt/sqlparser/sql.y:1324
{
yyVAL.colName = &ColName{Qualifier: &TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent}
}
- case 235:
+ case 245:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1263
+ //line ./go/vt/sqlparser/sql.y:1328
{
yyVAL.colName = &ColName{Qualifier: &TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent}
}
- case 236:
+ case 246:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1269
+ //line ./go/vt/sqlparser/sql.y:1334
{
yyVAL.expr = NewStrVal(yyDollar[1].bytes)
}
- case 237:
+ case 247:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1273
+ //line ./go/vt/sqlparser/sql.y:1338
{
yyVAL.expr = NewHexVal(yyDollar[1].bytes)
}
- case 238:
+ case 248:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1277
+ //line ./go/vt/sqlparser/sql.y:1342
{
yyVAL.expr = NewIntVal(yyDollar[1].bytes)
}
- case 239:
+ case 249:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1281
+ //line ./go/vt/sqlparser/sql.y:1346
{
yyVAL.expr = NewFloatVal(yyDollar[1].bytes)
}
- case 240:
+ case 250:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1285
+ //line ./go/vt/sqlparser/sql.y:1350
{
yyVAL.expr = NewHexNum(yyDollar[1].bytes)
}
- case 241:
+ case 251:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1289
+ //line ./go/vt/sqlparser/sql.y:1354
{
yyVAL.expr = NewValArg(yyDollar[1].bytes)
}
- case 242:
+ case 252:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1293
+ //line ./go/vt/sqlparser/sql.y:1358
{
yyVAL.expr = &NullVal{}
}
- case 243:
+ case 253:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1299
+ //line ./go/vt/sqlparser/sql.y:1364
{
// TODO(sougou): Deprecate this construct.
if yyDollar[1].colIdent.Lowered() != "value" {
@@ -2815,237 +2970,251 @@ yydefault:
}
yyVAL.expr = NewIntVal([]byte("1"))
}
- case 244:
+ case 254:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1308
+ //line ./go/vt/sqlparser/sql.y:1373
{
yyVAL.expr = NewIntVal(yyDollar[1].bytes)
}
- case 245:
+ case 255:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1312
+ //line ./go/vt/sqlparser/sql.y:1377
{
yyVAL.expr = NewValArg(yyDollar[1].bytes)
}
- case 246:
+ case 256:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1317
+ //line ./go/vt/sqlparser/sql.y:1382
{
yyVAL.exprs = nil
}
- case 247:
+ case 257:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1321
+ //line ./go/vt/sqlparser/sql.y:1386
{
yyVAL.exprs = yyDollar[3].exprs
}
- case 248:
+ case 258:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1326
+ //line ./go/vt/sqlparser/sql.y:1391
{
yyVAL.expr = nil
}
- case 249:
+ case 259:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1330
+ //line ./go/vt/sqlparser/sql.y:1395
{
yyVAL.expr = yyDollar[2].expr
}
- case 250:
+ case 260:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1335
+ //line ./go/vt/sqlparser/sql.y:1400
{
yyVAL.orderBy = nil
}
- case 251:
+ case 261:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1339
+ //line ./go/vt/sqlparser/sql.y:1404
{
yyVAL.orderBy = yyDollar[3].orderBy
}
- case 252:
+ case 262:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1345
+ //line ./go/vt/sqlparser/sql.y:1410
{
yyVAL.orderBy = OrderBy{yyDollar[1].order}
}
- case 253:
+ case 263:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1349
+ //line ./go/vt/sqlparser/sql.y:1414
{
yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order)
}
- case 254:
+ case 264:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1355
+ //line ./go/vt/sqlparser/sql.y:1420
{
yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].str}
}
- case 255:
+ case 265:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1360
+ //line ./go/vt/sqlparser/sql.y:1425
{
yyVAL.str = AscScr
}
- case 256:
+ case 266:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1364
+ //line ./go/vt/sqlparser/sql.y:1429
{
yyVAL.str = AscScr
}
- case 257:
+ case 267:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1368
+ //line ./go/vt/sqlparser/sql.y:1433
{
yyVAL.str = DescScr
}
- case 258:
+ case 268:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1373
+ //line ./go/vt/sqlparser/sql.y:1438
{
yyVAL.limit = nil
}
- case 259:
+ case 269:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1377
+ //line ./go/vt/sqlparser/sql.y:1442
{
yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr}
}
- case 260:
+ case 270:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1381
+ //line ./go/vt/sqlparser/sql.y:1446
{
yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr}
}
- case 261:
+ case 271:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1385
+ //line ./go/vt/sqlparser/sql.y:1450
{
yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr}
}
- case 262:
+ case 272:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1390
+ //line ./go/vt/sqlparser/sql.y:1455
{
yyVAL.str = ""
}
- case 263:
+ case 273:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1394
+ //line ./go/vt/sqlparser/sql.y:1459
{
yyVAL.str = ForUpdateStr
}
- case 264:
+ case 274:
yyDollar = yyS[yypt-4 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1398
+ //line ./go/vt/sqlparser/sql.y:1463
{
yyVAL.str = ShareModeStr
}
- case 265:
+ case 275:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1404
+ //line ./go/vt/sqlparser/sql.y:1469
{
yyVAL.columns = Columns{yyDollar[1].colIdent}
}
- case 266:
+ case 276:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1408
+ //line ./go/vt/sqlparser/sql.y:1473
{
yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent)
}
- case 267:
- yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1413
+ case 277:
+ yyDollar = yyS[yypt-2 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1486
{
- yyVAL.columns = nil
+ yyVAL.ins = &Insert{Rows: yyDollar[2].values}
}
- case 268:
+ case 278:
+ yyDollar = yyS[yypt-1 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1490
+ {
+ yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt}
+ }
+ case 279:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1417
+ //line ./go/vt/sqlparser/sql.y:1494
{
- yyVAL.columns = yyDollar[2].columns
+ // Drop the redundant parenthesis.
+ yyVAL.ins = &Insert{Rows: yyDollar[2].selStmt}
}
- case 269:
+ case 280:
+ yyDollar = yyS[yypt-5 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1499
+ {
+ yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values}
+ }
+ case 281:
+ yyDollar = yyS[yypt-4 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1503
+ {
+ yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt}
+ }
+ case 282:
+ yyDollar = yyS[yypt-6 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1507
+ {
+ // Drop the redundant parenthesis.
+ yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].selStmt}
+ }
+ case 283:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1423
+ //line ./go/vt/sqlparser/sql.y:1514
{
yyVAL.columns = Columns{yyDollar[1].colIdent}
}
- case 270:
+ case 284:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1427
+ //line ./go/vt/sqlparser/sql.y:1518
{
yyVAL.columns = Columns{yyDollar[3].colIdent}
}
- case 271:
+ case 285:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1431
+ //line ./go/vt/sqlparser/sql.y:1522
{
yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent)
}
- case 272:
+ case 286:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1435
+ //line ./go/vt/sqlparser/sql.y:1526
{
yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent)
}
- case 273:
+ case 287:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1440
+ //line ./go/vt/sqlparser/sql.y:1531
{
yyVAL.updateExprs = nil
}
- case 274:
+ case 288:
yyDollar = yyS[yypt-5 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1444
+ //line ./go/vt/sqlparser/sql.y:1535
{
yyVAL.updateExprs = yyDollar[5].updateExprs
}
- case 275:
- yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1450
- {
- yyVAL.insRows = yyDollar[2].values
- }
- case 276:
- yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1454
- {
- yyVAL.insRows = yyDollar[1].selStmt
- }
- case 277:
+ case 289:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1460
+ //line ./go/vt/sqlparser/sql.y:1541
{
yyVAL.values = Values{yyDollar[1].valTuple}
}
- case 278:
+ case 290:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1464
+ //line ./go/vt/sqlparser/sql.y:1545
{
yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple)
}
- case 279:
+ case 291:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1470
+ //line ./go/vt/sqlparser/sql.y:1551
{
yyVAL.valTuple = yyDollar[1].valTuple
}
- case 280:
+ case 292:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1474
+ //line ./go/vt/sqlparser/sql.y:1555
{
yyVAL.valTuple = ValTuple{}
}
- case 281:
+ case 293:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1480
+ //line ./go/vt/sqlparser/sql.y:1561
{
yyVAL.valTuple = ValTuple(yyDollar[2].exprs)
}
- case 282:
+ case 294:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1486
+ //line ./go/vt/sqlparser/sql.y:1567
{
if len(yyDollar[1].valTuple) == 1 {
yyVAL.expr = &ParenExpr{yyDollar[1].valTuple[0]}
@@ -3053,210 +3222,234 @@ yydefault:
yyVAL.expr = yyDollar[1].valTuple
}
}
- case 283:
+ case 295:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1496
+ //line ./go/vt/sqlparser/sql.y:1577
{
yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr}
}
- case 284:
+ case 296:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1500
+ //line ./go/vt/sqlparser/sql.y:1581
{
yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr)
}
- case 285:
+ case 297:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1506
+ //line ./go/vt/sqlparser/sql.y:1587
{
yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr}
}
- case 288:
+ case 300:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1515
+ //line ./go/vt/sqlparser/sql.y:1596
{
yyVAL.byt = 0
}
- case 289:
+ case 301:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1517
+ //line ./go/vt/sqlparser/sql.y:1598
{
yyVAL.byt = 1
}
- case 290:
+ case 302:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1520
+ //line ./go/vt/sqlparser/sql.y:1601
{
yyVAL.empty = struct{}{}
}
- case 291:
+ case 303:
yyDollar = yyS[yypt-3 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1522
+ //line ./go/vt/sqlparser/sql.y:1603
{
yyVAL.empty = struct{}{}
}
- case 292:
+ case 304:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1525
+ //line ./go/vt/sqlparser/sql.y:1606
{
yyVAL.str = ""
}
- case 293:
+ case 305:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1527
+ //line ./go/vt/sqlparser/sql.y:1608
{
yyVAL.str = IgnoreStr
}
- case 294:
+ case 306:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1531
+ //line ./go/vt/sqlparser/sql.y:1612
{
yyVAL.empty = struct{}{}
}
- case 295:
+ case 307:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1533
+ //line ./go/vt/sqlparser/sql.y:1614
{
yyVAL.empty = struct{}{}
}
- case 296:
+ case 308:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1535
+ //line ./go/vt/sqlparser/sql.y:1616
{
yyVAL.empty = struct{}{}
}
- case 297:
+ case 309:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1537
+ //line ./go/vt/sqlparser/sql.y:1618
{
yyVAL.empty = struct{}{}
}
- case 298:
+ case 310:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1539
+ //line ./go/vt/sqlparser/sql.y:1620
{
yyVAL.empty = struct{}{}
}
- case 299:
+ case 311:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1541
+ //line ./go/vt/sqlparser/sql.y:1622
{
yyVAL.empty = struct{}{}
}
- case 300:
+ case 312:
+ yyDollar = yyS[yypt-1 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1624
+ {
+ yyVAL.empty = struct{}{}
+ }
+ case 313:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1544
+ //line ./go/vt/sqlparser/sql.y:1627
{
yyVAL.empty = struct{}{}
}
- case 301:
+ case 314:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1546
+ //line ./go/vt/sqlparser/sql.y:1629
{
yyVAL.empty = struct{}{}
}
- case 302:
+ case 315:
+ yyDollar = yyS[yypt-1 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1631
+ {
+ yyVAL.empty = struct{}{}
+ }
+ case 316:
+ yyDollar = yyS[yypt-1 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1635
+ {
+ yyVAL.empty = struct{}{}
+ }
+ case 317:
+ yyDollar = yyS[yypt-1 : yypt+1]
+ //line ./go/vt/sqlparser/sql.y:1637
+ {
+ yyVAL.empty = struct{}{}
+ }
+ case 318:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1549
+ //line ./go/vt/sqlparser/sql.y:1640
{
yyVAL.empty = struct{}{}
}
- case 303:
+ case 319:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1551
+ //line ./go/vt/sqlparser/sql.y:1642
{
yyVAL.empty = struct{}{}
}
- case 304:
+ case 320:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1553
+ //line ./go/vt/sqlparser/sql.y:1644
{
yyVAL.empty = struct{}{}
}
- case 305:
+ case 321:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1556
+ //line ./go/vt/sqlparser/sql.y:1647
{
yyVAL.empty = struct{}{}
}
- case 306:
+ case 322:
yyDollar = yyS[yypt-2 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1558
+ //line ./go/vt/sqlparser/sql.y:1649
{
yyVAL.empty = struct{}{}
}
- case 307:
+ case 323:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1562
+ //line ./go/vt/sqlparser/sql.y:1653
{
yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes))
}
- case 308:
+ case 324:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1566
+ //line ./go/vt/sqlparser/sql.y:1657
{
yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes))
}
- case 310:
+ case 326:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1573
+ //line ./go/vt/sqlparser/sql.y:1664
{
yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes))
}
- case 311:
+ case 327:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1579
+ //line ./go/vt/sqlparser/sql.y:1670
{
yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes))
}
- case 312:
+ case 328:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1583
+ //line ./go/vt/sqlparser/sql.y:1674
{
yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes))
}
- case 314:
+ case 330:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1590
+ //line ./go/vt/sqlparser/sql.y:1681
{
yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes))
}
- case 417:
+ case 436:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1717
+ //line ./go/vt/sqlparser/sql.y:1811
{
if incNesting(yylex) {
yylex.Error("max nesting level reached")
return 1
}
}
- case 418:
+ case 437:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1726
+ //line ./go/vt/sqlparser/sql.y:1820
{
decNesting(yylex)
}
- case 419:
+ case 438:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1731
+ //line ./go/vt/sqlparser/sql.y:1825
{
forceEOF(yylex)
}
- case 420:
+ case 439:
yyDollar = yyS[yypt-0 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1736
+ //line ./go/vt/sqlparser/sql.y:1830
{
forceEOF(yylex)
}
- case 421:
+ case 440:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1740
+ //line ./go/vt/sqlparser/sql.y:1834
{
forceEOF(yylex)
}
- case 422:
+ case 441:
yyDollar = yyS[yypt-1 : yypt+1]
- //line ./go/vt/sqlparser/sql.y:1744
+ //line ./go/vt/sqlparser/sql.y:1838
{
forceEOF(yylex)
}
diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y
index 8b9e36ecd6b..16c2b0c852a 100644
--- a/go/vt/sqlparser/sql.y
+++ b/go/vt/sqlparser/sql.y
@@ -35,6 +35,7 @@ func forceEOF(yylex interface{}) {
empty struct{}
statement Statement
selStmt SelectStatement
+ ins *Insert
byt byte
bytes []byte
bytes2 [][]byte
@@ -59,7 +60,6 @@ func forceEOF(yylex interface{}) {
orderBy OrderBy
order *Order
limit *Limit
- insRows InsertRows
updateExprs UpdateExprs
updateExpr *UpdateExpr
colIdent ColIdent
@@ -111,7 +111,7 @@ func forceEOF(yylex interface{}) {
// DDL Tokens
%token CREATE ALTER DROP RENAME ANALYZE
%token TABLE INDEX VIEW TO IGNORE IF UNIQUE USING
-%token SHOW DESCRIBE EXPLAIN DATE ESCAPE
+%token SHOW DESCRIBE EXPLAIN DATE ESCAPE REPAIR OPTIMIZE TRUNCATE
// Supported SHOW tokens
%token DATABASES TABLES VITESS_KEYSPACES VITESS_SHARDS VSCHEMA_TABLES
@@ -134,7 +134,7 @@ func forceEOF(yylex interface{}) {
%token UNUSED
%type command
-%type select_statement
+%type select_statement base_select union union_select
%type insert_statement update_statement delete_statement set_statement
%type create_statement alter_statement rename_statement drop_statement
%type analyze_statement show_statement other_statement
@@ -156,7 +156,7 @@ func forceEOF(yylex interface{}) {
%type condition
%type boolean_value
%type compare
-%type row_list
+%type insert_data
%type value value_expression num_val
%type function_call_keyword function_call_nonkeyword function_call_generic function_call_conflict
%type is_suffix
@@ -177,14 +177,14 @@ func forceEOF(yylex interface{}) {
%type asc_desc_opt
%type limit_opt
%type lock_opt
-%type column_list ins_column_list ins_column_list_opt
+%type column_list ins_column_list
%type on_dup_opt
%type update_list
%type update_expression
%type for_from
%type ignore_opt
%type exists_opt
-%type not_exists_opt non_rename_operation to_opt constraint_opt using_opt
+%type not_exists_opt non_rename_operation to_opt index_opt constraint_opt using_opt
%type reserved_keyword non_reserved_keyword
%type sql_id reserved_sql_id col_alias as_ci_opt
%type table_id reserved_table_id table_alias as_opt_id
@@ -225,23 +225,67 @@ command:
| other_statement
select_statement:
- SELECT comment_opt cache_opt distinct_opt straight_join_opt select_expression_list from_opt where_expression_opt group_by_opt having_opt order_by_opt limit_opt lock_opt
+ base_select order_by_opt limit_opt lock_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), OrderBy: $11, Limit: $12, Lock: $13}
+ sel := $1.(*Select)
+ sel.OrderBy = $2
+ sel.Limit = $3
+ sel.Lock = $4
+ $$ = sel
+ }
+| union order_by_opt limit_opt lock_opt
+ {
+ uni := $1.(*Union)
+ uni.OrderBy = $2
+ uni.Limit = $3
+ uni.Lock = $4
+ $$ = uni
}
| SELECT comment_opt cache_opt NEXT num_val for_from table_name
{
$$ = &Select{Comments: Comments($2), Cache: $3, SelectExprs: SelectExprs{Nextval{Expr: $5}}, From: TableExprs{&AliasedTableExpr{Expr: $7}}}
}
-| select_statement union_op select_statement %prec UNION
+
+// 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{Comments: Comments($2), Cache: $3, Distinct: $4, Hints: $5, SelectExprs: $6, From: $7, Where: NewWhere(WhereStr, $8), GroupBy: GroupBy($9), Having: NewWhere(HavingStr, $10)}
+ }
+
+union:
+ union_select union_op union_select
{
$$ = &Union{Type: $2, Left: $1, Right: $3}
}
+| union union_op union_select
+ {
+ $$ = &Union{Type: $2, Left: $1, Right: $3}
+ }
+
+// union_select is a select that's part of a union. If unparenthesized,
+// it cannot have an order by clause or beyond.
+union_select:
+ base_select
+ {
+ $$ = $1
+ }
+| openb select_statement closeb
+ {
+ $$ = &ParenSelect{Select: $2}
+ }
+
insert_statement:
- INSERT comment_opt ignore_opt into_table_name ins_column_list_opt row_list on_dup_opt
+ INSERT comment_opt ignore_opt into_table_name insert_data on_dup_opt
{
- $$ = &Insert{Comments: Comments($2), Ignore: $3, Table: $4, Columns: $5, Rows: $6, OnDup: OnDup($7)}
+ // insert_data returns a *Insert pre-filled with Columns & Values
+ ins := $5
+ ins.Comments = $2
+ ins.Ignore = $3
+ ins.Table = $4
+ ins.OnDup = OnDup($6)
+ $$ = ins
}
| INSERT comment_opt ignore_opt into_table_name SET update_list on_dup_opt
{
@@ -286,6 +330,10 @@ create_statement:
{
$$ = &DDL{Action: CreateStr, NewName: $3.ToViewName()}
}
+| CREATE OR REPLACE VIEW table_name ddl_force_eof
+ {
+ $$ = &DDL{Action: CreateStr, NewName: $5.ToViewName()}
+ }
alter_statement:
ALTER ignore_opt TABLE table_name non_rename_operation force_eof
@@ -297,6 +345,11 @@ alter_statement:
// Change this to a rename statement
$$ = &DDL{Action: RenameStr, Table: $4, NewName: $7}
}
+| ALTER ignore_opt TABLE table_name RENAME index_opt force_eof
+ {
+ // 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()}
@@ -378,6 +431,18 @@ other_statement:
{
$$ = &Other{}
}
+| REPAIR force_eof
+ {
+ $$ = &Other{}
+ }
+| OPTIMIZE force_eof
+ {
+ $$ = &Other{}
+ }
+| TRUNCATE force_eof
+ {
+ $$ = &Other{}
+ }
comment_opt:
{
@@ -1409,13 +1474,39 @@ column_list:
$$ = append($$, $3)
}
-ins_column_list_opt:
+// insert_data expands all combinations into a single rule.
+// This avoids a shift/reduce conflict while encountering the
+// following two possible constructs:
+// insert into t1(a, b) (select * from t2)
+// insert into t1(select * from t2)
+// Because the rules are together, the parser can keep shifting
+// the tokens until it disambiguates a as sql_id and select as keyword.
+insert_data:
+ VALUES tuple_list
{
- $$ = nil
+ $$ = &Insert{Rows: $2}
}
-| openb ins_column_list closeb
+| select_statement
{
- $$ = $2
+ $$ = &Insert{Rows: $1}
+ }
+| openb select_statement closeb
+ {
+ // Drop the redundant parenthesis.
+ $$ = &Insert{Rows: $2}
+ }
+| openb ins_column_list closeb VALUES tuple_list
+ {
+ $$ = &Insert{Columns: $2, Rows: $5}
+ }
+| openb ins_column_list closeb select_statement
+ {
+ $$ = &Insert{Columns: $2, Rows: $4}
+ }
+| openb ins_column_list closeb openb select_statement closeb
+ {
+ // Drop the redundant parenthesis.
+ $$ = &Insert{Columns: $2, Rows: $5}
}
ins_column_list:
@@ -1445,16 +1536,6 @@ on_dup_opt:
$$ = $5
}
-row_list:
- VALUES tuple_list
- {
- $$ = $2
- }
-| select_statement
- {
- $$ = $1
- }
-
tuple_list:
tuple_or_empty
{
@@ -1535,6 +1616,8 @@ non_rename_operation:
{ $$ = struct{}{} }
| ORDER
{ $$ = struct{}{} }
+| CONVERT
+ { $$ = struct{}{} }
| UNUSED
{ $$ = struct{}{} }
| ID
@@ -1544,6 +1627,14 @@ to_opt:
{ $$ = struct{}{} }
| TO
{ $$ = struct{}{} }
+| AS
+ { $$ = struct{}{} }
+
+index_opt:
+ INDEX
+ { $$ = struct{}{} }
+| KEY
+ { $$ = struct{}{} }
constraint_opt:
{ $$ = struct{}{} }
@@ -1706,8 +1797,11 @@ non_reserved_keyword:
| LANGUAGE
| MODE
| OFFSET
+| OPTIMIZE
| QUERY
+| REPAIR
| SHARE
+| TRUNCATE
| UNUSED
| VIEW
| WITH
diff --git a/go/vt/sqlparser/token.go b/go/vt/sqlparser/token.go
index f5310cfc09f..df4295aedba 100644
--- a/go/vt/sqlparser/token.go
+++ b/go/vt/sqlparser/token.go
@@ -199,7 +199,7 @@ var keywords = map[string]int{
"numeric": UNUSED,
"offset": OFFSET,
"on": ON,
- "optimize": UNUSED,
+ "optimize": OPTIMIZE,
"optimizer_costs": UNUSED,
"option": UNUSED,
"optionally": UNUSED,
@@ -222,6 +222,7 @@ var keywords = map[string]int{
"regexp": REGEXP,
"release": UNUSED,
"rename": RENAME,
+ "repair": REPAIR,
"repeat": UNUSED,
"replace": REPLACE,
"require": UNUSED,
@@ -268,6 +269,7 @@ var keywords = map[string]int{
"trailing": UNUSED,
"trigger": UNUSED,
"true": TRUE,
+ "truncate": TRUNCATE,
"undo": UNUSED,
"union": UNION,
"unique": UNIQUE,
diff --git a/go/vt/utils/utils.go b/go/vt/utils/utils.go
index f686015e7e6..67ff3a70268 100644
--- a/go/vt/utils/utils.go
+++ b/go/vt/utils/utils.go
@@ -10,3 +10,12 @@ func CloneBindVariables(bindVariables map[string]interface{}) map[string]interfa
}
return result
}
+
+// Truncate all long query strings to a maximum length of 512 to keep logs
+// and debug UI output to be a sane length.
+func TruncateQuery(query string) string {
+ if (len(query) <= 512){
+ return query;
+ }
+ return query[:500] + " [TRUNCATED]";
+}
diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go
index bc493ff04f9..1f120d725a6 100644
--- a/go/vt/vtgate/vtgate.go
+++ b/go/vt/vtgate/vtgate.go
@@ -291,7 +291,7 @@ func (vtg *VTGate) Execute(ctx context.Context, sql string, bindVariables map[st
// the call. If so, the caller (Execute) should just return without proceeding further.
func (vtg *VTGate) intercept(ctx context.Context, sql string, session *vtgatepb.Session) (*vtgatepb.Session, bool, error) {
switch {
- case sqlparser.IsStatement(sql, "begin"):
+ case sqlparser.IsStatement(sql, "begin"), sqlparser.IsStatement(sql, "start transaction"):
if session.InTransaction {
// If we're in a transaction, commit and start a new one.
if err := vtg.Commit(ctx, vtg.transactionMode == TxTwoPC, session); err != nil {
diff --git a/go/vt/vttablet/endtoend/queries_test.go b/go/vt/vttablet/endtoend/queries_test.go
index 3f5746f4d23..3c0241499a8 100644
--- a/go/vt/vttablet/endtoend/queries_test.go
+++ b/go/vt/vttablet/endtoend/queries_test.go
@@ -16,7 +16,7 @@ Result mismatch:
'[[2 1] [1 2]]'
RowsAffected mismatch: 2, want 1
Rewritten mismatch:
-'[select eid, id from vitess_a where 1 != 1 union select eid, id from vitess_b where 1 != 1 select /* fail */ eid, id from vitess_a union select eid, id from vitess_b]' does not match
+'[select eid, id from vitess_a where 1 != 1 union select eid, id from vitess_b where 1 != 1 select /* fail */ eid, id from vitess_a union select eid, id from vitess_b limit 10001]' does not match
'[select eid id from vitess_a where 1 != 1 union select eid, id from vitess_b where 1 != 1 select /* fail */ eid, id from vitess_a union select eid, id from vitess_b]'
Plan mismatch: PASS_SELECT, want aa`
@@ -57,7 +57,7 @@ func TestNocacheCases(t *testing.T) {
},
Rewritten: []string{
"select eid, id from vitess_a where 1 != 1 union select eid, id from vitess_b where 1 != 1",
- "select /* union */ eid, id from vitess_a union select eid, id from vitess_b",
+ "select /* union */ eid, id from vitess_a union select eid, id from vitess_b limit 10001",
},
RowsAffected: 2,
},
@@ -70,7 +70,7 @@ func TestNocacheCases(t *testing.T) {
},
Rewritten: []string{
"select eid, id from vitess_a where 1 != 1 union select eid, id from vitess_b where 1 != 1 union select eid, id from vitess_d where 1 != 1",
- "select /* double union */ eid, id from vitess_a union select eid, id from vitess_b union select eid, id from vitess_d",
+ "select /* double union */ eid, id from vitess_a union select eid, id from vitess_b union select eid, id from vitess_d limit 10001",
},
RowsAffected: 2,
},
diff --git a/go/vt/vttablet/tabletserver/planbuilder/dml.go b/go/vt/vttablet/tabletserver/planbuilder/dml.go
index 05fbdcb3b52..ab12f133245 100644
--- a/go/vt/vttablet/tabletserver/planbuilder/dml.go
+++ b/go/vt/vttablet/tabletserver/planbuilder/dml.go
@@ -134,7 +134,7 @@ func analyzeSelect(sel *sqlparser.Select, tables map[string]*schema.Table) (plan
plan = &Plan{
PlanID: PlanPassSelect,
FieldQuery: GenerateFieldQuery(sel),
- FullQuery: GenerateSelectLimitQuery(sel),
+ FullQuery: GenerateLimitQuery(sel),
}
if sel.Lock != "" {
plan.PlanID = PlanSelectLock
@@ -290,7 +290,7 @@ func analyzeInsertNoType(ins *sqlparser.Insert, plan *Plan, table *schema.Table)
}
plan.PlanID = PlanInsertSubquery
plan.OuterQuery = GenerateInsertOuterQuery(ins)
- plan.Subquery = GenerateSelectLimitQuery(sel)
+ plan.Subquery = GenerateLimitQuery(sel)
if len(ins.Columns) != 0 {
for _, col := range ins.Columns {
colIndex := table.FindColumn(col)
diff --git a/go/vt/vttablet/tabletserver/planbuilder/plan.go b/go/vt/vttablet/tabletserver/planbuilder/plan.go
index b5bfc980e12..7fe0e09c0b2 100644
--- a/go/vt/vttablet/tabletserver/planbuilder/plan.go
+++ b/go/vt/vttablet/tabletserver/planbuilder/plan.go
@@ -249,7 +249,7 @@ func Build(sql string, tables map[string]*schema.Table) (plan *Plan, err error)
return &Plan{
PlanID: PlanPassSelect,
FieldQuery: GenerateFieldQuery(stmt),
- FullQuery: GenerateFullQuery(stmt),
+ FullQuery: GenerateLimitQuery(stmt),
}, nil
case *sqlparser.Select:
return analyzeSelect(stmt, tables)
diff --git a/go/vt/vttablet/tabletserver/planbuilder/query_gen.go b/go/vt/vttablet/tabletserver/planbuilder/query_gen.go
index cf3d1d8a039..4c96a864f2d 100644
--- a/go/vt/vttablet/tabletserver/planbuilder/query_gen.go
+++ b/go/vt/vttablet/tabletserver/planbuilder/query_gen.go
@@ -28,11 +28,20 @@ func GenerateFieldQuery(statement sqlparser.Statement) *sqlparser.ParsedQuery {
return buf.ParsedQuery()
}
-// GenerateSelectLimitQuery generates a select query with a limit clause.
-func GenerateSelectLimitQuery(selStmt sqlparser.SelectStatement) *sqlparser.ParsedQuery {
+// GenerateLimitQuery generates a select query with a limit clause.
+func GenerateLimitQuery(selStmt sqlparser.SelectStatement) *sqlparser.ParsedQuery {
buf := sqlparser.NewTrackedBuffer(nil)
- sel, ok := selStmt.(*sqlparser.Select)
- if ok {
+ switch sel := selStmt.(type) {
+ case *sqlparser.Select:
+ limit := sel.Limit
+ if limit == nil {
+ sel.Limit = execLimit
+ defer func() {
+ sel.Limit = nil
+ }()
+ }
+ case *sqlparser.Union:
+ // Code is identical to *Select, but this one is a *Union.
limit := sel.Limit
if limit == nil {
sel.Limit = execLimit
diff --git a/go/vt/vttablet/tabletserver/query_engine.go b/go/vt/vttablet/tabletserver/query_engine.go
index 827f4f9f148..80a0ddb2708 100644
--- a/go/vt/vttablet/tabletserver/query_engine.go
+++ b/go/vt/vttablet/tabletserver/query_engine.go
@@ -34,6 +34,7 @@ import (
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/schema"
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/tabletenv"
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/txserializer"
+ "github.com/youtube/vitess/go/vt/utils"
querypb "github.com/youtube/vitess/go/vt/proto/query"
vtrpcpb "github.com/youtube/vitess/go/vt/proto/vtrpc"
@@ -472,7 +473,7 @@ func (qe *QueryEngine) handleHTTPQueryPlans(response http.ResponseWriter, reques
response.Header().Set("Content-Type", "text/plain")
response.Write([]byte(fmt.Sprintf("Length: %d\n", len(keys))))
for _, v := range keys {
- response.Write([]byte(fmt.Sprintf("%#v\n", v)))
+ response.Write([]byte(fmt.Sprintf("%#v\n", utils.TruncateQuery(v))))
if plan := qe.peekQuery(v); plan != nil {
if b, err := json.MarshalIndent(plan.Plan, "", " "); err != nil {
response.Write([]byte(err.Error()))
@@ -491,7 +492,7 @@ func (qe *QueryEngine) handleHTTPQueryStats(response http.ResponseWriter, reques
for _, v := range keys {
if plan := qe.peekQuery(v); plan != nil {
var pqstats perQueryStats
- pqstats.Query = unicoded(v)
+ pqstats.Query = unicoded(utils.TruncateQuery(v))
pqstats.Table = plan.TableName().String()
pqstats.Plan = plan.PlanID
pqstats.QueryCount, pqstats.Time, pqstats.MysqlTime, pqstats.RowCount, pqstats.ErrorCount = plan.Stats()
diff --git a/go/vt/vttablet/tabletserver/querylogz.go b/go/vt/vttablet/tabletserver/querylogz.go
index 4197a226888..5ecc571cf1f 100644
--- a/go/vt/vttablet/tabletserver/querylogz.go
+++ b/go/vt/vttablet/tabletserver/querylogz.go
@@ -17,6 +17,7 @@ import (
"github.com/youtube/vitess/go/acl"
"github.com/youtube/vitess/go/vt/logz"
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/tabletenv"
+ "github.com/youtube/vitess/go/vt/utils"
)
var (
@@ -46,6 +47,7 @@ var (
querylogzFuncMap = template.FuncMap{
"stampMicro": func(t time.Time) string { return t.Format(time.StampMicro) },
"cssWrappable": logz.Wrappable,
+ "truncateQuery": utils.TruncateQuery,
"unquote": func(s string) string { return strings.Trim(s, "\"") },
}
querylogzTmpl = template.Must(template.New("example").Funcs(querylogzFuncMap).Parse(`
@@ -60,7 +62,7 @@ var (
{{.MysqlResponseTime.Seconds}} |
{{.WaitingForConnection.Seconds}} |
{{.PlanType}} |
- {{.OriginalSQL | unquote | cssWrappable}} |
+ {{.OriginalSQL | truncateQuery | unquote | cssWrappable}} |
{{.NumberOfQueries}} |
{{.FmtQuerySources}} |
{{.RowsAffected}} |
diff --git a/go/vt/vttablet/tabletserver/queryz.go b/go/vt/vttablet/tabletserver/queryz.go
index 20cf7d7be02..2df736d000f 100644
--- a/go/vt/vttablet/tabletserver/queryz.go
+++ b/go/vt/vttablet/tabletserver/queryz.go
@@ -15,6 +15,7 @@ import (
"github.com/youtube/vitess/go/acl"
"github.com/youtube/vitess/go/vt/logz"
"github.com/youtube/vitess/go/vt/vttablet/tabletserver/planbuilder"
+ "github.com/youtube/vitess/go/vt/utils"
)
var (
@@ -137,7 +138,7 @@ func queryzHandler(qe *QueryEngine, w http.ResponseWriter, r *http.Request) {
continue
}
Value := &queryzRow{
- Query: logz.Wrappable(v),
+ Query: logz.Wrappable(utils.TruncateQuery(v)),
Table: plan.TableName().String(),
Plan: plan.PlanID,
Reason: plan.Reason,
diff --git a/go/vt/vttablet/tabletserver/queryz_test.go b/go/vt/vttablet/tabletserver/queryz_test.go
index 874bf1ff965..558754d5ef7 100644
--- a/go/vt/vttablet/tabletserver/queryz_test.go
+++ b/go/vt/vttablet/tabletserver/queryz_test.go
@@ -5,6 +5,7 @@
package tabletserver
import (
+ "fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
@@ -54,6 +55,21 @@ func TestQueryzHandler(t *testing.T) {
qe.queries.Set("show tables", plan3)
qe.queries.Set("", (*TabletPlan)(nil))
+ plan4 := &TabletPlan{
+ Plan: &planbuilder.Plan{
+ Table: &schema.Table{Name: sqlparser.NewTableIdent("")},
+ PlanID: planbuilder.PlanOther,
+ Reason: planbuilder.ReasonDefault,
+ },
+ }
+ plan4.AddStats(1, 1*time.Millisecond, 1*time.Millisecond, 1, 0)
+ hugeInsert := "insert into test_table values 0";
+ for i := 1; i < 1000; i++ {
+ hugeInsert = hugeInsert + fmt.Sprintf(", %d", i);
+ }
+ qe.queries.Set(hugeInsert, plan4)
+ qe.queries.Set("", (*TabletPlan)(nil))
+
queryzHandler(qe, resp, req)
body, _ := ioutil.ReadAll(resp.Body)
planPattern1 := []string{
@@ -107,11 +123,28 @@ func TestQueryzHandler(t *testing.T) {
`0.000000 | `,
}
checkQueryzHasPlan(t, planPattern3, plan3, body)
+ planPattern4 := []string{
+ ``,
+ `| insert into test_table values .* \[TRUNCATED\][^<]* | `,
+ ` | `,
+ `OTHER | `,
+ `DEFAULT | `,
+ `1 | `,
+ `0.001000 | `,
+ `0.001000 | `,
+ `1 | `,
+ `0 | `,
+ `0.001000 | `,
+ `0.001000 | `,
+ `1.000000 | `,
+ `0.000000 | `,
+ }
+ checkQueryzHasPlan(t, planPattern4, plan4, body)
}
func checkQueryzHasPlan(t *testing.T, planPattern []string, plan *TabletPlan, page []byte) {
matcher := regexp.MustCompile(strings.Join(planPattern, `\s*`))
if !matcher.Match(page) {
- t.Fatalf("queryz page does not contain plan: %v, page: %s", plan, string(page))
+ t.Fatalf("queryz page does not contain\nplan:\n%v\npattern:\n%v\npage:\n%s", plan, strings.Join(planPattern, `\s*`), string(page))
}
}
diff --git a/go/vt/workflow/resharding/parallel_runner.go b/go/vt/workflow/resharding/parallel_runner.go
index 2adc0786355..5185ba55198 100644
--- a/go/vt/workflow/resharding/parallel_runner.go
+++ b/go/vt/workflow/resharding/parallel_runner.go
@@ -1,7 +1,6 @@
package resharding
import (
- "errors"
"fmt"
"path"
"strings"
@@ -63,13 +62,13 @@ type ParallelRunner struct {
// NewParallelRunner returns a new ParallelRunner.
func NewParallelRunner(ctx context.Context, rootUINode *workflow.Node, cp *CheckpointWriter, tasks []*workflowpb.Task, executeFunc func(context.Context, *workflowpb.Task) error, concurrencyLevel level, enableApprovals bool) *ParallelRunner {
if len(tasks) < 1 {
- log.Fatal(errors.New("BUG: No tasks passed into ParallelRunner"))
+ log.Fatal("BUG: No tasks passed into ParallelRunner")
}
phaseID := path.Dir(tasks[0].Id)
phaseUINode, err := rootUINode.GetChildByPath(phaseID)
if err != nil {
- panic(fmt.Errorf("BUG: nodepath %v not found", phaseID))
+ log.Fatalf("BUG: nodepath %v not found", phaseID)
}
p := &ParallelRunner{
@@ -102,7 +101,7 @@ func (p *ParallelRunner) Run() error {
case Parallel:
parallelNum = len(p.tasks)
default:
- panic(fmt.Sprintf("BUG: Invalid concurrency level: %v", p.concurrencyLevel))
+ log.Fatalf("BUG: Invalid concurrency level: %v", p.concurrencyLevel)
}
// sem is a channel used to control the level of concurrency.
sem := make(chan bool, parallelNum)
@@ -113,15 +112,14 @@ func (p *ParallelRunner) Run() error {
}
sem <- true
- wg.Add(1)
if p.enableApprovals && !isTaskRunning(task) {
p.waitForApproval(i)
}
-
+ wg.Add(1)
go func(t *workflowpb.Task) {
+ defer wg.Done()
p.setUIMessage(fmt.Sprintf("Launch task: %v.", t.Id))
defer func() { <-sem }()
- defer wg.Done()
p.executeTask(t)
}(task)
}
@@ -225,10 +223,10 @@ func (p *ParallelRunner) triggerRetry(taskID string) error {
// Disable the retry action and synchronize for retrying the job.
node, err := p.rootUINode.GetChildByPath(taskID)
if err != nil {
- panic(fmt.Sprintf("BUG: node on child path %v not found", taskID))
+ log.Fatalf("BUG: node on child path %v not found", taskID)
}
if len(node.Actions) == 0 {
- panic(fmt.Sprintf("BUG: node actions should not be empty"))
+ log.Fatal("BUG: node actions should not be empty")
}
node.Actions = []*workflow.Action{}
node.BroadcastChanges(false /* updateChildren */)
@@ -239,7 +237,7 @@ func (p *ParallelRunner) triggerRetry(taskID string) error {
func (p *ParallelRunner) addRetryAction(taskID string) chan struct{} {
node, err := p.rootUINode.GetChildByPath(taskID)
if err != nil {
- panic(fmt.Sprintf("BUG: node on child path %v not found", taskID))
+ log.Fatalf("BUG: node on child path %v not found", taskID)
}
p.mu.Lock()
@@ -247,7 +245,7 @@ func (p *ParallelRunner) addRetryAction(taskID string) chan struct{} {
// Register the channel for synchronizing retrying job.
if _, ok := p.retryActionRegistry[taskID]; ok {
- panic(fmt.Sprintf("BUG: duplicate retry action for node: %v", taskID))
+ log.Fatalf("BUG: duplicate retry action for node: %v", taskID)
}
retryChannel := make(chan struct{})
p.retryActionRegistry[taskID] = retryChannel
@@ -383,7 +381,7 @@ func (p *ParallelRunner) clearPhaseActions() {
func (p *ParallelRunner) setFinishUIMessage(taskID string) {
taskNode, err := p.rootUINode.GetChildByPath(taskID)
if err != nil {
- panic(fmt.Errorf("BUG: nodepath %v not found", taskID))
+ log.Fatalf("BUG: nodepath %v not found", taskID)
}
p.mu.Lock()
diff --git a/go/vt/workflow/resharding/tasks.go b/go/vt/workflow/resharding/tasks.go
index 7c624dfe70c..da7ca7bcb8f 100644
--- a/go/vt/workflow/resharding/tasks.go
+++ b/go/vt/workflow/resharding/tasks.go
@@ -2,6 +2,7 @@ package resharding
import (
"fmt"
+ "log"
"strings"
"golang.org/x/net/context"
@@ -28,7 +29,7 @@ func (hw *HorizontalReshardingWorkflow) GetTasks(phase PhaseType) []*workflowpb.
case phaseClone, phaseMigrateRdonly, phaseMigrateReplica, phaseMigrateMaster:
shards = strings.Split(hw.checkpoint.Settings["source_shards"], ",")
default:
- panic(fmt.Sprintf("BUG: unknown phase type: %v", phase))
+ log.Fatalf("BUG: unknown phase type: %v", phase)
}
var tasks []*workflowpb.Task
diff --git a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/DBProperties.java b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/DBProperties.java
index 69b4acbd7d9..77da8fb5dd6 100644
--- a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/DBProperties.java
+++ b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/DBProperties.java
@@ -4,18 +4,22 @@
* Created by ashudeep.sharma on 10/03/16.
*/
public class DBProperties {
- private String productversion;
- private String majorVersion;
- private String minorVersion;
- private int isolationLevel;
+ private final String productversion;
+ private final String majorVersion;
+ private final String minorVersion;
+ private final int isolationLevel;
+ private final boolean caseInsensitiveComparison;
+ private final boolean storesLowerCaseTableName;
public DBProperties(String productversion, String majorVersion, String minorVersion,
- int isolationLevel) {
+ int isolationLevel, String lowerCaseTableNames) {
this.productversion = productversion;
this.majorVersion = majorVersion;
this.minorVersion = minorVersion;
this.isolationLevel = isolationLevel;
+ this.caseInsensitiveComparison = "1".equalsIgnoreCase(lowerCaseTableNames) || "2".equalsIgnoreCase(lowerCaseTableNames);
+ this.storesLowerCaseTableName = "1".equalsIgnoreCase(lowerCaseTableNames);
}
public String getProductversion() {
@@ -33,4 +37,12 @@ public String getMinorVersion() {
public int getIsolationLevel() {
return this.isolationLevel;
}
+
+ public boolean getUseCaseInsensitiveComparisons() {
+ return caseInsensitiveComparison;
+ }
+
+ public boolean getStoresLowerCaseTableName() {
+ return storesLowerCaseTableName;
+ }
}
diff --git a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessConnection.java b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessConnection.java
index f00c08ceb21..ade3afa8109 100644
--- a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessConnection.java
+++ b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessConnection.java
@@ -795,12 +795,13 @@ private String initializeDBProperties() throws SQLException {
VitessStatement vitessStatement = new VitessStatement(this);
try {
resultSet = vitessStatement.executeQuery(
- "SHOW VARIABLES WHERE VARIABLE_NAME IN (\'tx_isolation\',\'INNODB_VERSION\')");
+ "SHOW VARIABLES WHERE VARIABLE_NAME IN (\'tx_isolation\',\'INNODB_VERSION\', \'lower_case_table_names\')");
while (resultSet.next()) {
dbVariables.put(resultSet.getString(1), resultSet.getString(2));
}
versionValue = dbVariables.get("innodb_version");
String transactionIsolation = dbVariables.get("tx_isolation");
+ String lowerCaseTables = dbVariables.get("lower_case_table_names");
String productVersion = "";
String majorVersion = "";
String minorVersion = "";
@@ -826,7 +827,7 @@ private String initializeDBProperties() throws SQLException {
minorVersion = dbVersions[1];
}
this.dbProperties =
- new DBProperties(productVersion, majorVersion, minorVersion, isolationLevel);
+ new DBProperties(productVersion, majorVersion, minorVersion, isolationLevel, lowerCaseTables);
} finally {
if (null != resultSet) {
resultSet.close();
diff --git a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessDatabaseMetaData.java b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessDatabaseMetaData.java
index 7918f92f0b0..564f8cfbc42 100644
--- a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessDatabaseMetaData.java
+++ b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessDatabaseMetaData.java
@@ -1,13 +1,13 @@
package com.flipkart.vitess.jdbc;
-import com.flipkart.vitess.util.Constants;
-
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
+import com.flipkart.vitess.util.Constants;
+
/**
* Created by harshit.gangal on 25/01/16.
*/
@@ -85,7 +85,7 @@ public boolean usesLocalFilePerTable() throws SQLException {
}
public boolean supportsMixedCaseIdentifiers() throws SQLException {
- return false;
+ return !connection.getDbProperties().getUseCaseInsensitiveComparisons();
}
public boolean storesUpperCaseIdentifiers() throws SQLException {
@@ -93,15 +93,15 @@ public boolean storesUpperCaseIdentifiers() throws SQLException {
}
public boolean storesLowerCaseIdentifiers() throws SQLException {
- return false;
+ return connection.getDbProperties().getStoresLowerCaseTableName();
}
public boolean storesMixedCaseIdentifiers() throws SQLException {
- return false;
+ return !connection.getDbProperties().getStoresLowerCaseTableName();
}
public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
- return false;
+ return !connection.getDbProperties().getUseCaseInsensitiveComparisons();
}
public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
@@ -109,11 +109,11 @@ public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
}
public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
- return false;
+ return connection.getDbProperties().getStoresLowerCaseTableName();
}
public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
- return false;
+ return !connection.getDbProperties().getStoresLowerCaseTableName();
}
public String getNumericFunctions() throws SQLException {
diff --git a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessMariaDBDatabaseMetadata.java b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessMariaDBDatabaseMetadata.java
index fda293436e7..e647182bc10 100644
--- a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessMariaDBDatabaseMetadata.java
+++ b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessMariaDBDatabaseMetadata.java
@@ -1,11 +1,16 @@
package com.flipkart.vitess.jdbc;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.RowIdLifetime;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.logging.Logger;
+
import com.flipkart.vitess.util.Constants;
import com.youtube.vitess.proto.Query;
-import java.sql.*;
-import java.util.logging.Logger;
-
/**
* Created by ashudeep.sharma on 15/02/16.
*/
@@ -14,10 +19,9 @@ public class VitessMariaDBDatabaseMetadata extends VitessDatabaseMetaData
private static final String DRIVER_NAME = "Vitess MariaDB JDBC Driver";
private static Logger logger = Logger.getLogger(VitessMariaDBDatabaseMetadata.class.getName());
- private final VitessConnection connection;
- public VitessMariaDBDatabaseMetadata(VitessConnection connection) {
- this.connection = connection;
+ public VitessMariaDBDatabaseMetadata(VitessConnection connection) throws SQLException {
+ this.setConnection(connection);
}
public boolean nullsAreSortedAtStart() throws SQLException {
@@ -37,30 +41,6 @@ public String getDriverName() throws SQLException {
return DRIVER_NAME;
}
- public boolean storesLowerCaseIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean storesMixedCaseIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
- return false;
- }
-
public String getSQLKeywords() throws SQLException {
return "ACCESSIBLE," + "ANALYZE," + "ASENSITIVE," + "BEFORE," + "BIGINT," + "BINARY,"
+ "BLOB," + "CALL," +
diff --git a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessMySQLDatabaseMetadata.java b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessMySQLDatabaseMetadata.java
index 6f149154fad..ee7cc12c7f8 100644
--- a/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessMySQLDatabaseMetadata.java
+++ b/java/jdbc/src/main/java/com/flipkart/vitess/jdbc/VitessMySQLDatabaseMetadata.java
@@ -1,13 +1,28 @@
package com.flipkart.vitess.jdbc;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.RowIdLifetime;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.logging.Logger;
+
+import org.apache.commons.lang.StringUtils;
+
import com.flipkart.vitess.util.Constants;
import com.flipkart.vitess.util.MysqlDefs;
import com.youtube.vitess.proto.Query;
-import org.apache.commons.lang.StringUtils;
-
-import java.sql.*;
-import java.util.*;
-import java.util.logging.Logger;
/**
* Created by ashudeep.sharma on 15/02/16.
@@ -133,30 +148,6 @@ public String getDriverName() throws SQLException {
return DRIVER_NAME;
}
- public boolean storesLowerCaseIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean storesMixedCaseIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
- return false;
- }
-
- public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
- return false;
- }
-
public String getSQLKeywords() throws SQLException {
return mysqlKeywordsThatArentSQL92;
}
diff --git a/java/jdbc/src/test/java/com/flipkart/vitess/jdbc/VitessDatabaseMetadataTest.java b/java/jdbc/src/test/java/com/flipkart/vitess/jdbc/VitessDatabaseMetadataTest.java
index c228305ca0f..709838320e0 100644
--- a/java/jdbc/src/test/java/com/flipkart/vitess/jdbc/VitessDatabaseMetadataTest.java
+++ b/java/jdbc/src/test/java/com/flipkart/vitess/jdbc/VitessDatabaseMetadataTest.java
@@ -1,10 +1,12 @@
package com.flipkart.vitess.jdbc;
-import com.flipkart.vitess.util.Constants;
-import com.google.protobuf.ByteString;
-import com.youtube.vitess.client.cursor.Cursor;
-import com.youtube.vitess.client.cursor.SimpleCursor;
-import com.youtube.vitess.proto.Query;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Properties;
import org.junit.Assert;
import org.junit.Test;
@@ -13,18 +15,16 @@
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Properties;
+import com.flipkart.vitess.util.Constants;
+import com.google.protobuf.ByteString;
+import com.youtube.vitess.client.cursor.Cursor;
+import com.youtube.vitess.client.cursor.SimpleCursor;
+import com.youtube.vitess.proto.Query;
/**
* Created by ashudeep.sharma on 08/03/16.
*/
-@RunWith(PowerMockRunner.class) @PrepareForTest(VitessMySQLDatabaseMetadata.class) public class VitessDatabaseMetadataTest extends BaseTest {
+@RunWith(PowerMockRunner.class) @PrepareForTest({VitessMySQLDatabaseMetadata.class, VitessConnection.class}) public class VitessDatabaseMetadataTest extends BaseTest {
private ResultSet resultSet;
@@ -1330,4 +1330,78 @@ private void assertResultSetEquals(ResultSet actualResultSet, ResultSet expected
}
}
+ @Test public void testCaseSensitivityIdentifierFuncsMySql() throws Exception {
+ assertCaseSensitivityForDatabaseType(false);
+ }
+
+ @Test public void testCaseSensitivityIdentifierFuncsMariaDb() throws Exception {
+ assertCaseSensitivityForDatabaseType(true);
+ }
+
+ private void assertCaseSensitivityForDatabaseType(boolean useMariaDb) throws Exception {
+ VitessConnection connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null);
+ mockStatementForLowercaseTablesValue("0", useMariaDb);
+ Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseQuotedIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers());
+ connection.close();
+
+ connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null);
+ mockStatementForLowercaseTablesValue("1", useMariaDb);
+ Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseQuotedIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().storesLowerCaseIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().storesMixedCaseIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().storesLowerCaseQuotedIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().storesMixedCaseQuotedIdentifiers());
+ connection.close();
+
+ connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null);
+ mockStatementForLowercaseTablesValue("2", useMariaDb);
+ Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseQuotedIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers());
+ connection.close();
+
+ connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null);
+ mockStatementForLowercaseTablesValue("something random", useMariaDb);
+ Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseQuotedIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers());
+ Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers());
+ Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers());
+ connection.close();
+ }
+
+ private void mockStatementForLowercaseTablesValue(String lcTablesValue, boolean useMariaDb) throws Exception {
+ String sql = "SHOW VARIABLES WHERE VARIABLE_NAME IN (\'tx_isolation\',\'INNODB_VERSION\', \'lower_case_table_names\')";
+ String versionName = "innodb_version";
+ String versionValue = "5.7.16-10";
+ if (useMariaDb) {
+ versionValue = versionValue + "-mariadb";
+ }
+ String txIsoName = "tx_isolation";
+ String txIsoValue = "REPEATABLE-READ";
+ String lcTablesName = "lower_case_table_names";
+
+ Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder()
+ .addFields(Query.Field.newBuilder().setName("Variable_name").setType(Query.Type.VARCHAR).build())
+ .addFields(Query.Field.newBuilder().setName("Value").setType(Query.Type.VARCHAR).build())
+ .addRows(Query.Row.newBuilder().addLengths(versionName.length()).addLengths(versionValue.length()).setValues(ByteString.copyFromUtf8(versionName + versionValue)))
+ .addRows(Query.Row.newBuilder().addLengths(txIsoName.length()).addLengths(txIsoValue.length()).setValues(ByteString.copyFromUtf8(txIsoName + txIsoValue)))
+ .addRows(Query.Row.newBuilder().addLengths(lcTablesName.length()).addLengths(lcTablesValue.length()).setValues(ByteString.copyFromUtf8(lcTablesName + lcTablesValue)))
+ .build());
+
+ VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class);
+ PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement);
+ PowerMockito.when(vitessStatement.executeQuery(sql))
+ .thenReturn(new VitessResultSet(mockedCursor));
+ }
}
diff --git a/travis/download_mariadb.sh b/travis/download_mariadb.sh
index 3e714bc7269..8acdff1c911 100755
--- a/travis/download_mariadb.sh
+++ b/travis/download_mariadb.sh
@@ -5,15 +5,15 @@ set -e
# As of 07/2015, this mirror is the fastest for the Travis CI workers.
DEB_PACKAGES="
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mysql-common_10.0.29+maria-1~precise_all.deb
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-common_10.0.29+maria-1~precise_all.deb
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/libmysqlclient18_10.0.29+maria-1~precise_amd64.deb
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/libmariadbclient18_10.0.29+maria-1~precise_amd64.deb
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/libmariadbclient-dev_10.0.29+maria-1~precise_amd64.deb
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-client-core-10.0_10.0.29+maria-1~precise_amd64.deb
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-client-10.0_10.0.29+maria-1~precise_amd64.deb
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-server-core-10.0_10.0.29+maria-1~precise_amd64.deb
-http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-server-10.0_10.0.29+maria-1~precise_amd64.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mysql-common_10.0.30+maria-1~precise_all.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-common_10.0.30+maria-1~precise_all.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/libmysqlclient18_10.0.30+maria-1~precise_amd64.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/libmariadbclient18_10.0.30+maria-1~precise_amd64.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/libmariadbclient-dev_10.0.30+maria-1~precise_amd64.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-client-core-10.0_10.0.30+maria-1~precise_amd64.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-client-10.0_10.0.30+maria-1~precise_amd64.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-server-core-10.0_10.0.30+maria-1~precise_amd64.deb
+http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu/pool/main/m/mariadb-10.0/mariadb-server-10.0_10.0.30+maria-1~precise_amd64.deb
"
mkdir -p $MYSQL_ROOT
diff --git a/vendor/vendor.json b/vendor/vendor.json
index 90b6ee03194..129b4421b27 100644
--- a/vendor/vendor.json
+++ b/vendor/vendor.json
@@ -777,88 +777,70 @@
"revisionTime": "2016-07-30T22:43:56Z"
},
{
- "checksumSHA1": "BEcyB7xMS4byueMu4LhnUl6jj/A=",
+ "checksumSHA1": "5AKasas4CO8g/Wiizgd34EGLoMQ=",
"path": "golang.org/x/text/collate",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
- "checksumSHA1": "p295Maz8FV8cRQwuO1nORFtfS0M=",
+ "checksumSHA1": "gRurdsue4RAi2xYzy89YDzO2c2I=",
"path": "golang.org/x/text/collate/build",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
- "checksumSHA1": "Ny6DIwANQghBAuvZx94MiMv2ppU=",
- "path": "golang.org/x/text/collate/colltab",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
- },
- {
- "checksumSHA1": "zhxOlitUyY3m9FimOyPmyX9/gwI=",
+ "checksumSHA1": "fM/n4f1c26uIh3wB9g+1flJkSAo=",
"path": "golang.org/x/text/internal/colltab",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
- "checksumSHA1": "3JkLagg7UP4890bHn0Uld6GmO6M=",
+ "checksumSHA1": "ZQdHbB9VYCXwQ+9/CmZPhJv0+SM=",
"path": "golang.org/x/text/internal/gen",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
"checksumSHA1": "hyNCcTwMQnV6/MK8uUW9E5H0J0M=",
"path": "golang.org/x/text/internal/tag",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
- },
- {
- "checksumSHA1": "j++juaCPEzyx7mz2X5f8yTjWkWQ=",
- "path": "golang.org/x/text/internal/testtext",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
"checksumSHA1": "47nwiUyVBY2RKoEGXmCSvusY4Js=",
"path": "golang.org/x/text/internal/triegen",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
- "checksumSHA1": "LyT5byg0Dq4x3OcGt6EwIDgPUpc=",
+ "checksumSHA1": "Yd5wMObzagIfCiKLpZbtBIrOUA4=",
"path": "golang.org/x/text/internal/ucd",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
- "checksumSHA1": "vbYsvMa+yYFTrmD0bIVhA36DpgQ=",
+ "checksumSHA1": "Dhc7bHUc+d1uuYO/byxQf7AfW+o=",
"path": "golang.org/x/text/language",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
- "checksumSHA1": "TZDHZj3zWDc5LKqpoLamOKt6Nmo=",
+ "checksumSHA1": "ziMb9+ANGRJSSIuxYdRbA+cDRBQ=",
"path": "golang.org/x/text/transform",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
- "checksumSHA1": "n94g6qdzv0fgQFGelH4/HXOthl0=",
+ "checksumSHA1": "ZbYsJjfj1rPbHN+0baD1rg09PXQ=",
"path": "golang.org/x/text/unicode/cldr",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
- "checksumSHA1": "pDDMc5yLVQ2xeR9CajcgIJODPcw=",
+ "checksumSHA1": "gYoNrZgxCQAHutg2rGHcFoKJtpA=",
"path": "golang.org/x/text/unicode/norm",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
- },
- {
- "checksumSHA1": "2c0iiKbdCsffuJeXG8Eh0LDdULU=",
- "path": "golang.org/x/text/unicode/rangetable",
- "revision": "d5d7737684e596dbabf914ecf946d2783f35bdc2",
- "revisionTime": "2016-07-10T05:19:30Z"
+ "revision": "fc7fa097411d30e6708badff276c4c164425590c",
+ "revisionTime": "2017-03-23T10:04:54Z"
},
{
"checksumSHA1": "eFQDEix/mGnhwnFu/Hq63zMfrX8=",