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:

+ + +

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=",