diff --git a/.travis.yml b/.travis.yml index 5d6a0a81457..5a26c8019d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ sudo: false language: go go: - - 1.7 + - 1.8 addons: apt: sources: diff --git a/bootstrap.sh b/bootstrap.sh index 38212a4eb16..c9bb78ef3f0 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -129,12 +129,14 @@ fi # # DO NOT ADD LIBRARY DEPENDENCIES HERE. Instead use govendor as described below. # +# Note: We explicitly do not vendor the tools below because a) we want to stay +# their latest version and b) it's easier to "go install" them this way. gotools=" \ github.com/golang/lint/golint \ github.com/golang/mock/mockgen \ github.com/kardianos/govendor \ golang.org/x/tools/cmd/goimports \ - honnef.co/go/unused/cmd/unused \ + honnef.co/go/tools/cmd/unused \ " # The cover tool needs to be installed into the Go toolchain, so it will fail diff --git a/doc/GettingStarted.md b/doc/GettingStarted.md index b570f96cfcb..9244fa69fc0 100644 --- a/doc/GettingStarted.md +++ b/doc/GettingStarted.md @@ -73,7 +73,7 @@ OS X 10.11 (El Capitan) should work as well, the installation instructions are b In addition, Vitess requires the software and libraries listed below. -1. [Install Go 1.7+](http://golang.org/doc/install). +1. [Install Go 1.8+](http://golang.org/doc/install). 2. Install [MariaDB 10.0](https://downloads.mariadb.org/) or [MySQL 5.6](http://dev.mysql.com/downloads/mysql). You can use any diff --git a/doc/GettingStartedKubernetes.md b/doc/GettingStartedKubernetes.md index fbb37b01181..68fba76a781 100644 --- a/doc/GettingStartedKubernetes.md +++ b/doc/GettingStartedKubernetes.md @@ -9,13 +9,13 @@ The `kubectl` steps will apply to any Kubernetes cluster. ## Prerequisites -To complete the exercise in this guide, you must locally install Go 1.7+, +To complete the exercise in this guide, you must locally install Go 1.8+, Vitess' `vtctlclient` tool, and Google Cloud SDK. The following sections explain how to set these up in your environment. -### Install Go 1.7+ +### Install Go 1.8+ -You need to install [Go 1.7+](http://golang.org/doc/install) to build the +You need to install [Go 1.8+](http://golang.org/doc/install) to build the `vtctlclient` tool, which issues commands to Vitess. After installing Go, make sure your `GOPATH` environment diff --git a/doc/HorizontalReshardingWorkflowGuide.md b/doc/HorizontalReshardingWorkflowGuide.md new file mode 100644 index 00000000000..89328911511 --- /dev/null +++ b/doc/HorizontalReshardingWorkflowGuide.md @@ -0,0 +1,252 @@ + +This guide shows you an example about how to apply range-based sharding +process in an existing unsharded Vitess [keyspace](http://vitess.io/overview/concepts.html#keyspace) +using the horizontal resharding workflow. In this example, we will reshard +from 1 shard "0" into 2 shards "-80" and "80-". + +## Overview +The horizontal resharding process mainly contains the following steps +(each step is a phase in the workflow): + +1. Copy schema from original shards to destination shards. + (**Phase: CopySchemaShard**) +1. Copy the data with a batch process called *vtworker* + (**Phase: SplitClone**). + [more details](horizontal-sharding-workflow.html#details-in-splitclone-phase) +1. Check filtered replication (**Phase: WaitForFilteredReplication**). + [more details](horizontal-sharding-workflow.html#details-in-waitforfilteredreplication-phase) +1. Check copied data integrity using *vtworker* batch process in the mode + to compare the source and destination data. (**Phase: SplitDiff**) +1. Migrate all the serving rdonly tablets in the original shards. + (**Phase: MigrateServedTypeRdonly**) +1. Migrate all the serving replica tablets in the original shards. + (**Phase: MigrateServedTypeReplica**) +1. Migrate all the serving master tablets in the original shards. + (**Phase: MigrateServedTypeMaster**) + [more details](horizontal-sharding-workflow.html#details-in-migrateservedtypemaste-phase) + +## Prerequisites + +You should complete the [Getting Started](http://vitess.io/getting-started/local-instance.html) guide +(please finish all the steps before Try Vitess resharding) and have left +the cluster running. Then, please follow these steps before running +the resharding process: + +1. Configure sharding information. By running the command below, we tell + Vitess to shard the data using the page column through the provided VSchema. + + ``` sh + vitess/examples/local$ ./lvtctl.sh ApplyVSchema -vschema "$(cat vschema.json)" test_keyspace + ``` + +1. Bring up tablets for 2 additional shards: *test_keyspace/-80* and + *test_keyspace/80-* (you can learn more about sharding key range + [here](http://vitess.io/user-guide/sharding.html#key-ranges-and-partitions)): + + ``` sh + vitess/examples/local$ ./sharded-vttablet-up.sh + ``` + + Initialize replication by electing the first master for each of the new shards: + + ``` sh + vitess/examples/local$ ./lvtctl.sh InitShardMaster -force test_keyspace/-80 test-200 + vitess/examples/local$ ./lvtctl.sh InitShardMaster -force test_keyspace/80- test-300 + ``` + + After this set up, you should see the shards on Dashboard page of vtctld UI + (http://localhost:15000). There should be 1 serving shard named "0" and + 2 non-serving shards named "-80" and "80-". Click the shard node, you can + inspect all its tablets information. + +1. Bring up a vtworker process, which can be connected through port 15033. + (The number of *vtworker* should be the same of original shards, + we start one vtworker process here since we have only one original shard + in this example.) + + ``` sh + vitess/examples/local$ ./vtworker-up.sh + ``` + + You can verify this *vtworker* process set up through http://localhost:15032/Debugging. + It should be pinged successfully. After you ping the vtworker, please click + "Reset Job". Otherwise, the vtworker is not ready for executing other tasks. + +## Horizontal resharding workflow +### Create the workflow +1. Open the *Workflows* section on the left menu of vtctld UI (http://localhost:15000). + Click the "+" button in the top right corner to open the "Create + a new Workflow" dialog. +1. Fill in the "Create a new Workflow" dialogue following the instructions + below (you can checkout our example [here](https://cloud.githubusercontent.com/assets/23492389/24314500/27f27988-109f-11e7-8e10-630bad14a286.png)): + * Select the "Skip Start" checkbox if you don't want to start the workflow + immediately after creation. If so, you need to click a "Start" button in + the workflow bar later to run the workflow. + * Open the "Factory Name" menu and select "Horizontal Resharding". This field + defines the type of workflow you want to create. + * Fill in *test_keyspace* in the "Keyspace" slot. + * Fill in *localhost:15033* in the "vtworker Addresses" slot. + * Unselect the "enable_approvals" checkbox if you don't want to manually + approve task executions for canarying. (We suggest you to keep the default + selected choice since this will enable the canary feature) +1. Click "Create" button at the bottom of the dialog. You will see a workflow + node created in the *Workflows* page if the creation succeeds. + The workflow has started running now if "Skip Start" is not selected. + +Another way to start the workflow is through the vtctlclient command, you can +also visualize the workflow on vtctld UI *Workflows* section after executing +the command: + +``` sh +vitess/examples/local$ ./lvtctl.sh WorkflowCreate -skip_start=false horizontal_resharding -keyspace=test_keyspace -vtworkers=localhost:15033 -enable_approvals=true +``` + +When creating the resharding workflow, the program automatically detect the +source shards and destination shards and create tasks for the resharding +process. After the creation, click the workflow node, you can see a list of +child nodes. Each child node represents a phase in the workflow (each phase +represents a step mentioned in [Overview](http://vitess.io/user-guide/horizontal-sharding-workflow.html#overview)). +Further click a phase node, you can inspect tasks in this phase. +For example, in the "CopySchemaShard" phase, it includes tasks to copy schema +to 2 destination shards, therefore you can see task node "Shard -80" and +"Shard 80-". You should see a page similar to +[this](https://cloud.githubusercontent.com/assets/23492389/24313539/71c9c8ae-109a-11e7-9e4a-0c3e8ee8ba85.png). + +### Approvals of Tasks Execution (Canary feature) +Once the workflow start to run (click the "Start" button if you selected +"Skip Start" and the workflow hasn't started yet.), you need to approve the +task execution for each phase if "enable_approvals" is selected. The approvals +include 2 stages. The first stage approves only the first task, which runs as +canarying. The second stage approves the remaining tasks. + +The resharding workflow runs through phases sequentially. Once the phase starts, +you can see the approval buttons for all the stages under the phase node (click +the phase node if you didn't see the approval buttons, you should see a page +like [this](https://cloud.githubusercontent.com/assets/23492389/24313613/c9508ef0-109a-11e7-8848-75a1ae18a6c5.png)). The +button is enabled when the corresponding task(s) are ready to run. Click the +enabled button to approve task execution, then you can see approved message +on the clicked button. The approval buttons are cleared after the phase has +finished. The next phase will only starts if its previous phase has finished +successfully. + +If the workflow is restored from a checkpoint, you will still see the the +approval button with approved message when there are running tasks under this +approval. But you don't need to approve the same tasks again for a restarted +workflow. + +### Retry +A "Retry" button will be enabled under the task node if the task failed (click +the task node if your job get stuck but don't see the Retry button). Click this +button if you have fixed the bugs and want to retry the failed task. You can +retry as many times as you want if the task continuelly failed. The workflow +can continue from your failure point once it is fixed. + +For example, you might forget to bring up a vtworker process. The task which +requires that vtworker process in SplitClone phase will fail. After you fix +this, click the retry button on the task node and the workflow will continue +to run. + +When a task failed, the execution of other tasks under this phase won't be +affected if this phase runs tasks in parallel (applied to phase +"CopySchemaShard", "SplitClone", "WaitForFilteredReplication"). For phases +that runs tasks sequentially, remaining unstarted tasks under this phase will +no long be executed. The phases afterwards will no longer be executed. + +### Checkpoint and Recovery +The resharding workflow tracks the status for every task and checkpoint these +status into topology server whenever there is a status update. When a workflow +is stopped and restarted by loading the checkpoint in the topology, it can +continue to run all the unfinished tasks. + + +## Verify Results and Clean up +After the resharding process, data in the original shard is identically copied +to new shards. Data updates will be visible on the new shards, but not on the +original shard. You should then see in the vtctld UI *Dashboard* page that shard +*0* becomes non-serving and shard *-80* and shard *80-* are serving shards. +Verify this for yourself: inspect the database content using following commands, +then add messages to the guestbook page (you can use script client.sh mentioned +[here](http://vitess.io/getting-started/local-instance.html#run-a-client-application)) +and inspect using same commands: + +``` sh +# See what's on shard test_keyspace/0 +# (no updates visible since we migrated away from it): +vitess/examples/local$ ./lvtctl.sh ExecuteFetchAsDba test-100 "SELECT * FROM messages" +# See what's on shard test_keyspace/-80: +vitess/examples/local$ ./lvtctl.sh ExecuteFetchAsDba test-200 "SELECT * FROM messages" +# See what's on shard test_keyspace/80-: +vitess/examples/local$ ./lvtctl.sh ExecuteFetchAsDba test-300 "SELECT * FROM messages" +``` + +You can also checkout the *Topology* browser on vtctl UI. It shows you the +information of the keyrange of shard and their serving status. Each shard +should look like this + +[shard 0](https://cloud.githubusercontent.com/assets/23492389/24313876/072f61e6-109c-11e7-938a-23b8398958aa.png) + +[shard -80](https://cloud.githubusercontent.com/assets/23492389/24313813/bd11c824-109b-11e7-83d4-cca3f6093360.png) + +[shard 80-](https://cloud.githubusercontent.com/assets/23492389/24313743/7f9ae1c4-109b-11e7-997a-774f4f16e473.png) + +After you verify the result, we can remove the +original shard since all traffic is being served from the new shards: + +``` sh +vitess/examples/local$ ./vttablet-down.sh +``` + +Then we can delete the now-empty shard: + +``` sh +vitess/examples/local$ ./lvtctl.sh DeleteShard -recursive test_keyspace/0 +``` + +You should then see in the vtctld UI *Dashboard* page that shard *0* is gone. + +## Tear down and clean up + +Since you already cleaned up the tablets from the original unsharded example by +running `./vttablet-down.sh`, that step has been replaced with +`./sharded-vttablet-down.sh` to clean up the new sharded tablets. + +``` sh +vitess/examples/local$ ./vtworker-down.sh +vitess/examples/local$ ./vtgate-down.sh +vitess/examples/local$ ./sharded-vttablet-down.sh +vitess/examples/local$ ./vtctld-down.sh +vitess/examples/local$ ./zk-down.sh +``` + +## Reference +You can checkout the old version tutorial [here](http://vitess.io/user-guide/horizontal-sharding.html). +It walks you through the resharding process by manually executing commands. + +### Details in SplitClone phase +*vtworker* copies data from a paused snapshot. It will pause replication on +one rdonly (offline processing) tablet to serve as a consistent snapshot of +the data. The app can continue without downtime, since live traffic is served +by replica and master tablets, which are unaffected. Other batch jobs will +also be unaffected, since they will be served only by the remaining, un-paused +rdonly tablets. + +During the data copying, *vtworker* streams the data from a single source to +multiple destinations, routing each row based on its *keyspace_id*. It can +automatically figure out which shards to use as the destinations based on the +key range that needs to be covered. In our example, shard 0 covers the entire +range, so it identifies -80 and 80- as the destination shards, since they +combine to cover the same range. + +### Details in WaitForFilteredReplication phase +Once the copying from a paused snapshot (phase SplitClone) has finished, +*vtworker* turns on [filtered replication](http://vitess.io/user-guide/sharding.html#filtered-replication), +which allows the destination shards to catch up on updates that have continued +to flow in from the app since the time of the snapshot. After the destination +shards are caught up, they will continue to replicate new updates. + +### Details in MigrateServedTypeMaster phase +During the *master* migration, the original shard masters will first stop +accepting updates. Then the process will wait for the new shard masters to +fully catch up on filtered replication before allowing them to begin serving. +After the master traffic is migrated, the filtered replication will be stopped. +Data updates will be visible on the new shards, but not on the original shards. diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 7ae96474002..128142be6f8 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM golang:1.7 +FROM golang:1.8 # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docs/getting-started/index.html b/docs/getting-started/index.html index 53e0206480f..afd7dcfbe3e 100644 --- a/docs/getting-started/index.html +++ b/docs/getting-started/index.html @@ -297,13 +297,13 @@

Contributing

Prerequisites

-

To complete the exercise in this guide, you must locally install Go 1.7+, +

To complete the exercise in this guide, you must locally install Go 1.8+, Vitess' vtctlclient tool, and Google Cloud SDK. The following sections explain how to set these up in your environment.

-

Install Go 1.7+

+

Install Go 1.8+

-

You need to install Go 1.7+ to build the +

You need to install Go 1.8+ to build the vtctlclient tool, which issues commands to Vitess.

After installing Go, make sure your GOPATH environment diff --git a/docs/getting-started/local-instance.html b/docs/getting-started/local-instance.html index f60e3306160..e26faaff3a3 100644 --- a/docs/getting-started/local-instance.html +++ b/docs/getting-started/local-instance.html @@ -353,7 +353,7 @@

Ubuntu and Debian

In addition, Vitess requires the software and libraries listed below.

    -
  1. Install Go 1.7+.

  2. +
  3. Install Go 1.8+.

  4. Install MariaDB 10.0 or MySQL 5.6. You can use any installation method (src/bin/rpm/deb), but be sure to include the client diff --git a/examples/local/vtworker-down.sh b/examples/local/vtworker-down.sh new file mode 100755 index 00000000000..e8136d31121 --- /dev/null +++ b/examples/local/vtworker-down.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -e + +script_root=`dirname "${BASH_SOURCE}"` +source $script_root/env.sh + +pid=`cat $VTDATAROOT/tmp/vtworker.pid` +echo "Stopping vtworker..." +kill $pid + diff --git a/examples/local/vtworker-up.sh b/examples/local/vtworker-up.sh new file mode 100755 index 00000000000..2c0992ae451 --- /dev/null +++ b/examples/local/vtworker-up.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# This is an example script that runs vtworker. + +set -e + +script_root=`dirname "${BASH_SOURCE}"` +source $script_root/env.sh + +echo "Starting vtworker..." +exec $VTROOT/bin/vtworker \ + $TOPOLOGY_FLAGS \ + -cell test \ + -log_dir $VTDATAROOT/tmp \ + -alsologtostderr \ + -service_map=grpc-vtworker \ + -grpc_port 15033 \ + -port 15032 \ + -pid_file $VTDATAROOT/tmp/vtworker.pid \ + -use_v3_resharding_mode & diff --git a/go/cmd/mysqlctld/mysqlctld.go b/go/cmd/mysqlctld/mysqlctld.go index 493d0671005..06c30924419 100644 --- a/go/cmd/mysqlctld/mysqlctld.go +++ b/go/cmd/mysqlctld/mysqlctld.go @@ -57,10 +57,10 @@ func main() { // Start or Init mysqld as needed. ctx, cancel := context.WithTimeout(context.Background(), *waitTime) - tabletDir := mysqlctl.TabletDir(uint32(*tabletUID)) - if _, statErr := os.Stat(tabletDir); os.IsNotExist(statErr) { + mycnfFile := mysqlctl.MycnfFile(uint32(*tabletUID)) + if _, statErr := os.Stat(mycnfFile); os.IsNotExist(statErr) { // Generate my.cnf from scratch and use it to find mysqld. - log.Infof("tablet dir (%s) doesn't exist, initializing", tabletDir) + log.Infof("mycnf file (%s) doesn't exist, initializing", mycnfFile) var err error mysqld, err = mysqlctl.CreateMysqld(uint32(*tabletUID), *mysqlSocket, int32(*mysqlPort), dbconfigFlags) @@ -76,7 +76,7 @@ func main() { } } else { // There ought to be an existing my.cnf, so use it to find mysqld. - log.Infof("tablet dir (%s) already exists, starting without init", tabletDir) + log.Infof("mycnf file (%s) already exists, starting without init", mycnfFile) var err error mysqld, err = mysqlctl.OpenMysqld(uint32(*tabletUID), dbconfigFlags) @@ -86,6 +86,12 @@ func main() { } mysqld.OnTerm(onTermFunc) + err = mysqld.RefreshConfig() + if err != nil { + log.Errorf("failed to refresh config: %v", err) + exit.Return(1) + } + if err := mysqld.Start(ctx); err != nil { log.Errorf("failed to start mysqld: %v", err) exit.Return(1) diff --git a/go/vt/mysqlctl/cmd.go b/go/vt/mysqlctl/cmd.go index 1cf295c5e65..abfc91fbf0d 100644 --- a/go/vt/mysqlctl/cmd.go +++ b/go/vt/mysqlctl/cmd.go @@ -47,7 +47,7 @@ func CreateMysqld(tabletUID uint32, mysqlSocket string, mysqlPort int32, dbconfi // installation that already exists. This will look for an existing my.cnf file // and use that to call NewMysqld(). func OpenMysqld(tabletUID uint32, dbconfigFlags dbconfigs.DBConfigFlag) (*Mysqld, error) { - mycnf, err := ReadMycnf(mycnfFile(tabletUID)) + mycnf, err := ReadMycnf(MycnfFile(tabletUID)) if err != nil { return nil, fmt.Errorf("couldn't read my.cnf file: %v", err) } diff --git a/go/vt/mysqlctl/mycnf.go b/go/vt/mysqlctl/mycnf.go index 8ead94bc403..b56ab996f26 100644 --- a/go/vt/mysqlctl/mycnf.go +++ b/go/vt/mysqlctl/mycnf.go @@ -182,6 +182,8 @@ func ReadMycnf(cnfFile string) (mycnf *Mycnf, err error) { mycnf.BinLogPath = mycnf.lookupAndCheck("log-bin") mycnf.MasterInfoFile = mycnf.lookupAndCheck("master-info-file") mycnf.PidFile = mycnf.lookupAndCheck("pid-file") + mycnf.TmpDir = mycnf.lookupAndCheck("tmpdir") + mycnf.SlaveLoadTmpDir = mycnf.lookupAndCheck("slave_load_tmpdir") return mycnf, nil } diff --git a/go/vt/mysqlctl/mycnf_flag.go b/go/vt/mysqlctl/mycnf_flag.go index 2d7738a2c88..6a5c76a0577 100644 --- a/go/vt/mysqlctl/mycnf_flag.go +++ b/go/vt/mysqlctl/mycnf_flag.go @@ -102,7 +102,7 @@ func NewMycnfFromFlags(uid uint32) (mycnf *Mycnf, err error) { // This is probably not going to be used by anybody, // but fill in a default value. (Note it's used by // mysqld.Start, in which case it is correct). - path: mycnfFile(uint32(*flagServerID)), + path: MycnfFile(uint32(*flagServerID)), }, nil } @@ -110,7 +110,7 @@ func NewMycnfFromFlags(uid uint32) (mycnf *Mycnf, err error) { if uid == 0 { log.Fatalf("No mycnf_server_id, no mycnf-file, and no backup server id to use") } - *flagMycnfFile = mycnfFile(uid) + *flagMycnfFile = MycnfFile(uid) log.Infof("No mycnf_server_id, no mycnf-file specified, using default config for server id %v: %v", uid, *flagMycnfFile) } else { log.Infof("No mycnf_server_id specified, using mycnf-file file %v", *flagMycnfFile) diff --git a/go/vt/mysqlctl/mycnf_gen.go b/go/vt/mysqlctl/mycnf_gen.go index d0a1af2da29..e030b11966d 100644 --- a/go/vt/mysqlctl/mycnf_gen.go +++ b/go/vt/mysqlctl/mycnf_gen.go @@ -15,6 +15,8 @@ import ( "path" "text/template" + "flag" + "github.com/youtube/vitess/go/vt/env" ) @@ -40,6 +42,10 @@ const ( innodbLogSubdir = "innodb/logs" ) +var ( + tabletDir = flag.String("tablet_dir", "", "The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid.") +) + // NewMycnf fills the Mycnf structure with vt root paths and derived values. // This is used to fill out the cnfTemplate values and generate my.cnf. // uid is a unique id for a particular tablet - it must be unique within the @@ -47,7 +53,7 @@ const ( // mysqldPort needs to be unique per instance per machine. func NewMycnf(tabletUID uint32, mysqlPort int32) *Mycnf { cnf := new(Mycnf) - cnf.path = mycnfFile(tabletUID) + cnf.path = MycnfFile(tabletUID) tabletDir := TabletDir(tabletUID) cnf.ServerID = tabletUID cnf.MysqlPort = mysqlPort @@ -73,11 +79,14 @@ func NewMycnf(tabletUID uint32, mysqlPort int32) *Mycnf { // TabletDir returns the default directory for a tablet func TabletDir(uid uint32) string { + if *tabletDir != "" { + return fmt.Sprintf("%s/%s", env.VtDataRoot(), *tabletDir) + } return fmt.Sprintf("%s/vt_%010d", env.VtDataRoot(), uid) } -// mycnfFile returns the default location of the my.cnf file. -func mycnfFile(uid uint32) string { +// MycnfFile returns the default location of the my.cnf file. +func MycnfFile(uid uint32) string { return path.Join(TabletDir(uid), "my.cnf") } diff --git a/go/vt/mysqlctl/mysqld.go b/go/vt/mysqlctl/mysqld.go index 214a31fdee3..512adf6832d 100644 --- a/go/vt/mysqlctl/mysqld.go +++ b/go/vt/mysqlctl/mysqld.go @@ -26,6 +26,8 @@ import ( "sync" "time" + "bytes" + log "github.com/golang/glog" "github.com/youtube/vitess/go/sqldb" "github.com/youtube/vitess/go/stats" @@ -465,7 +467,7 @@ func (mysqld *Mysqld) Init(ctx context.Context, initDBSQLFile string) error { } // Set up config files. - if err = mysqld.initConfig(root); err != nil { + if err = mysqld.initConfig(root, mysqld.config.path); err != nil { log.Errorf("failed creating %v: %v", mysqld.config.path, err) return err } @@ -556,7 +558,7 @@ func (mysqld *Mysqld) installDataDir() error { return nil } -func (mysqld *Mysqld) initConfig(root string) error { +func (mysqld *Mysqld) initConfig(root, outFile string) error { var err error var configData string @@ -573,7 +575,7 @@ func (mysqld *Mysqld) initConfig(root string) error { return err } - return ioutil.WriteFile(mysqld.config.path, []byte(configData), 0664) + return ioutil.WriteFile(outFile, []byte(configData), 0664) } func getMycnfTemplates(root string) []string { @@ -595,6 +597,54 @@ func getMycnfTemplates(root string) []string { return cnfTemplatePaths } +// RefreshConfig attempts to recreate the my.cnf from templates, and log and +// swap in to place if it's updated. It keeps a copy of the last version in case fallback is required. +// Should be called from a stable replica, server_id is not regenerated. +func (mysqld *Mysqld) RefreshConfig() error { + log.Info("Checking for updates to my.cnf") + root, err := vtenv.VtRoot() + if err != nil { + return err + } + f, err := ioutil.TempFile(path.Dir(mysqld.config.path), "my.cnf") + if err != nil { + return fmt.Errorf("Could not create temp file: %v", err) + } + + defer os.Remove(f.Name()) + err = mysqld.initConfig(root, f.Name()) + if err != nil { + return fmt.Errorf("Could not initConfig in %v: %v", f.Name(), err) + } + + existing, err := ioutil.ReadFile(mysqld.config.path) + if err != nil { + return fmt.Errorf("Could not read existing file %v: %v", mysqld.config.path, err) + } + updated, err := ioutil.ReadFile(f.Name()) + if err != nil { + return fmt.Errorf("Could not read updated file %v: %v", f.Name(), err) + } + + if bytes.Equal(existing, updated) { + log.Infof("No changes to my.cnf. Continuing.") + return nil + } + + backupPath := mysqld.config.path + ".previous" + err = os.Rename(mysqld.config.path, backupPath) + if err != nil { + return fmt.Errorf("Could not back up existing %v: %v", mysqld.config.path, err) + } + err = os.Rename(f.Name(), mysqld.config.path) + if err != nil { + return fmt.Errorf("Could not move %v to %v: %v", f.Name(), mysqld.config.path, err) + } + log.Infof("Updated my.cnf. Backup of previous version available in %v", backupPath) + + return nil +} + // ReinitConfig updates the config file as if Mysqld is initializing. At the // moment it only randomizes ServerID because it's not safe to restore a replica // from a backup and then give it the same ServerID as before, MySQL can then @@ -620,7 +670,7 @@ func (mysqld *Mysqld) ReinitConfig(ctx context.Context) error { if err != nil { return err } - return mysqld.initConfig(root) + return mysqld.initConfig(root, mysqld.config.path) } func (mysqld *Mysqld) createDirs() error { diff --git a/go/vt/sqlparser/Makefile b/go/vt/sqlparser/Makefile index f0f950379fa..41676d5d248 100644 --- a/go/vt/sqlparser/Makefile +++ b/go/vt/sqlparser/Makefile @@ -5,7 +5,7 @@ MAKEFLAGS = -s sql.go: sql.y - go tool yacc -o sql.go sql.y + goyacc -o sql.go sql.y gofmt -w sql.go clean: diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 47360257aab..a3e2772bb30 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -91,6 +91,8 @@ func TestValid(t *testing.T) { }, { input: "select /* union order by limit lock */ 1 from t union select 1 from t order by a limit 1 for update", output: "select /* union order by limit lock */ 1 from t union select 1 from t order by a asc limit 1 for update", + }, { + input: "select /* union with limit on lhs */ 1 from t limit 1 union select 1 from t", }, { input: "select /* distinct */ distinct 1 from t", }, { @@ -1191,10 +1193,6 @@ func TestErrors(t *testing.T) { }, { 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/sql.go b/go/vt/sqlparser/sql.go index ea681c39684..a1d493c3b33 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1,9 +1,9 @@ -//line ./go/vt/sqlparser/sql.y:6 +//line sql.y:6 package sqlparser import __yyfmt__ "fmt" -//line ./go/vt/sqlparser/sql.y:6 +//line sql.y:6 func setParseTree(yylex interface{}, stmt Statement) { yylex.(*Tokenizer).ParseTree = stmt } @@ -28,7 +28,7 @@ func forceEOF(yylex interface{}) { yylex.(*Tokenizer).ForceEOF = true } -//line ./go/vt/sqlparser/sql.y:34 +//line sql.y:34 type yySymType struct { yys int empty struct{} @@ -373,432 +373,424 @@ var yyExca = [...]int{ -1, 1, 1, -1, -2, 0, - -1, 15, - 5, 22, - -2, 260, - -1, 206, + -1, 3, + 5, 20, + -2, 4, + -1, 203, 103, 327, -2, 323, - -1, 207, + -1, 204, 103, 328, -2, 324, - -1, 424, + -1, 405, + 5, 20, + -2, 278, + -1, 423, 103, 330, -2, 326, -1, 569, - 5, 23, + 5, 21, -2, 159, -1, 594, - 5, 23, + 5, 21, -2, 279, + -1, 638, + 5, 20, + -2, 281, -1, 711, - 5, 23, + 5, 21, -2, 282, } -const yyNprod = 442 const yyPrivate = 57344 -var yyTokenNames []string -var yyStates []string - -const yyLast = 3817 +const yyLast = 3709 var yyAct = [...]int{ - 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, 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, 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, + 219, 364, 666, 523, 618, 204, 198, 231, 524, 489, + 643, 255, 562, 617, 37, 178, 484, 363, 3, 306, + 487, 555, 304, 453, 221, 520, 417, 504, 54, 278, + 422, 284, 630, 81, 677, 230, 629, 172, 199, 36, + 292, 41, 187, 228, 744, 739, 743, 732, 233, 742, + 196, 177, 738, 731, 200, 196, 621, 660, 254, 209, + 43, 44, 45, 46, 427, 214, 308, 173, 174, 175, + 176, 206, 486, 376, 71, 72, 72, 196, 312, 196, + 309, 533, 434, 196, 34, 532, 477, 477, 478, 478, + 410, 412, 572, 544, 80, 531, 432, 207, 210, 546, + 77, 73, 477, 194, 478, 202, 320, 319, 194, 74, + 75, 76, 353, 354, 682, 649, 218, 597, 566, 536, + 362, 437, 300, 321, 296, 333, 343, 318, 343, 321, + 194, 299, 194, 624, 479, 479, 194, 718, 332, 331, + 341, 342, 334, 335, 336, 337, 338, 339, 340, 333, + 479, 213, 343, 505, 460, 480, 480, 730, 411, 573, + 302, 320, 319, 319, 286, 728, 652, 655, 458, 459, + 457, 480, 505, 34, 580, 431, 433, 430, 321, 321, + 688, 692, 727, 456, 545, 303, 543, 215, 574, 224, + 279, 715, 220, 445, 447, 448, 280, 196, 446, 196, + 220, 281, 34, 196, 719, 336, 337, 338, 339, 340, + 333, 196, 435, 343, 54, 493, 196, 54, 38, 196, + 391, 392, 196, 436, 664, 220, 282, 298, 216, 684, + 220, 418, 320, 319, 311, 592, 324, 332, 331, 341, + 342, 334, 335, 336, 337, 338, 339, 340, 333, 321, + 194, 343, 294, 320, 319, 560, 194, 548, 549, 550, + 626, 664, 320, 319, 194, 560, 365, 560, 220, 194, + 321, 298, 194, 374, 556, 194, 596, 220, 351, 321, + 722, 389, 394, 247, 246, 248, 249, 250, 251, 54, + 589, 252, 576, 220, 196, 537, 393, 408, 200, 196, + 493, 220, 196, 521, 315, 405, 200, 54, 401, 420, + 668, 671, 672, 673, 669, 196, 670, 674, 196, 741, + 421, 196, 54, 725, 424, 395, 17, 414, 17, 442, + 443, 560, 449, 450, 413, 724, 701, 419, 454, 440, + 378, 379, 380, 381, 382, 383, 384, 194, 476, 202, + 700, 403, 294, 404, 521, 415, 298, 202, 17, 415, + 15, 184, 632, 416, 492, 494, 54, 423, 194, 451, + 34, 194, 34, 70, 194, 455, 365, 54, 507, 498, + 499, 54, 491, 637, 495, 188, 189, 737, 323, 481, + 482, 334, 335, 336, 337, 338, 339, 340, 333, 279, + 182, 343, 34, 509, 502, 34, 518, 192, 704, 702, + 522, 200, 54, 705, 703, 547, 525, 191, 513, 512, + 490, 415, 322, 441, 527, 285, 490, 490, 535, 423, + 517, 735, 534, 54, 54, 530, 320, 319, 283, 689, + 496, 497, 635, 290, 490, 490, 490, 490, 590, 425, + 314, 539, 706, 321, 672, 673, 222, 676, 508, 490, + 510, 511, 202, 185, 186, 285, 516, 540, 223, 454, + 179, 694, 695, 519, 515, 180, 668, 671, 672, 673, + 669, 551, 670, 674, 38, 558, 723, 663, 418, 197, + 256, 33, 679, 317, 40, 54, 569, 570, 571, 253, + 42, 575, 35, 568, 1, 78, 455, 582, 675, 583, + 584, 585, 586, 291, 561, 581, 426, 48, 542, 541, + 196, 429, 52, 205, 33, 514, 528, 593, 594, 595, + 183, 579, 500, 390, 277, 693, 365, 662, 578, 373, + 503, 232, 54, 196, 490, 598, 201, 196, 591, 444, + 602, 243, 240, 242, 241, 396, 603, 402, 559, 325, + 611, 490, 225, 409, 287, 667, 665, 631, 588, 54, + 659, 717, 400, 194, 607, 577, 613, 39, 190, 14, + 606, 612, 54, 13, 616, 12, 491, 619, 620, 11, + 625, 10, 623, 9, 8, 196, 194, 615, 7, 6, + 194, 636, 54, 54, 525, 54, 54, 54, 5, 227, + 54, 645, 646, 638, 642, 627, 4, 650, 651, 490, + 656, 657, 181, 654, 628, 415, 490, 647, 16, 2, + 0, 0, 0, 423, 0, 0, 661, 0, 633, 0, + 196, 680, 0, 0, 683, 0, 685, 686, 194, 525, + 0, 0, 0, 0, 0, 54, 0, 681, 0, 0, + 691, 0, 0, 0, 0, 0, 0, 0, 0, 603, + 196, 196, 196, 196, 33, 0, 0, 707, 709, 0, + 0, 196, 711, 633, 196, 0, 710, 200, 54, 714, + 54, 0, 0, 194, 716, 0, 495, 721, 697, 305, + 699, 696, 305, 698, 720, 365, 0, 0, 307, 0, + 0, 307, 0, 633, 633, 633, 633, 0, 729, 726, + 352, 0, 0, 194, 194, 194, 194, 633, 0, 736, + 0, 0, 733, 734, 708, 0, 0, 194, 202, 0, + 740, 0, 0, 0, 361, 0, 0, 366, 367, 368, + 369, 370, 371, 372, 0, 375, 377, 377, 377, 377, + 377, 377, 377, 377, 385, 386, 387, 388, 341, 342, + 334, 335, 336, 337, 338, 339, 340, 333, 406, 0, + 343, 0, 0, 397, 0, 0, 0, 0, 0, 0, + 201, 0, 305, 0, 0, 0, 0, 0, 201, 0, + 307, 307, 0, 0, 193, 0, 0, 305, 0, 327, + 0, 330, 0, 0, 0, 0, 307, 344, 345, 346, + 347, 348, 349, 350, 0, 328, 329, 326, 332, 331, + 341, 342, 334, 335, 336, 337, 338, 339, 340, 333, + 0, 0, 343, 33, 355, 356, 357, 358, 359, 360, + 0, 0, 0, 0, 208, 0, 0, 366, 0, 0, + 483, 0, 307, 0, 0, 0, 0, 0, 0, 0, + 0, 501, 0, 0, 0, 506, 211, 0, 212, 0, + 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 526, 62, 33, 0, 0, + 0, 0, 0, 201, 0, 57, 529, 0, 0, 0, + 0, 0, 0, 0, 66, 61, 0, 0, 0, 305, + 0, 0, 0, 0, 0, 0, 0, 538, 307, 0, + 0, 0, 53, 0, 0, 452, 0, 0, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 332, 331, 341, 342, 334, + 335, 336, 337, 338, 339, 340, 333, 0, 0, 343, + 0, 0, 567, 0, 0, 0, 0, 0, 0, 564, + 0, 0, 171, 0, 0, 0, 289, 0, 0, 0, + 0, 56, 297, 65, 63, 67, 0, 0, 0, 0, + 301, 59, 0, 0, 0, 310, 0, 608, 313, 0, + 0, 316, 599, 600, 601, 0, 0, 0, 55, 0, + 60, 69, 64, 58, 68, 0, 307, 332, 331, 341, + 342, 334, 335, 336, 337, 338, 339, 340, 333, 0, + 0, 343, 331, 341, 342, 334, 335, 336, 337, 338, + 339, 340, 333, 564, 0, 343, 307, 0, 552, 553, + 554, 0, 0, 0, 0, 0, 622, 0, 0, 0, + 634, 0, 0, 526, 0, 0, 639, 17, 18, 19, + 20, 0, 0, 407, 0, 305, 640, 641, 0, 644, + 644, 644, 0, 0, 307, 0, 0, 0, 0, 653, + 21, 0, 658, 0, 428, 62, 0, 438, 17, 563, + 439, 0, 0, 0, 57, 678, 0, 0, 526, 62, + 33, 34, 0, 66, 61, 0, 0, 0, 57, 0, + 0, 0, 0, 0, 0, 0, 0, 66, 61, 307, + 0, 53, 0, 565, 0, 634, 634, 634, 634, 0, + 0, 0, 34, 320, 319, 195, 609, 610, 0, 678, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, + 321, 0, 712, 0, 713, 0, 0, 22, 23, 25, + 24, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 28, 29, 0, 0, 30, 31, 32, 0, 0, + 0, 171, 0, 0, 0, 0, 0, 0, 648, 0, + 56, 0, 65, 63, 67, 171, 0, 0, 0, 0, + 59, 0, 0, 0, 56, 0, 65, 63, 67, 0, + 0, 0, 0, 0, 59, 0, 0, 55, 0, 60, + 69, 64, 58, 68, 0, 0, 0, 0, 0, 0, + 0, 55, 0, 60, 69, 64, 58, 68, 690, 0, + 160, 147, 121, 162, 99, 113, 170, 114, 115, 141, + 87, 129, 62, 111, 0, 102, 83, 108, 84, 100, + 123, 57, 126, 98, 149, 132, 168, 0, 136, 0, + 66, 61, 0, 0, 125, 154, 127, 146, 120, 142, + 92, 135, 163, 112, 139, 0, 0, 0, 53, 587, + 0, 0, 0, 0, 0, 0, 0, 138, 159, 110, + 140, 82, 137, 0, 85, 88, 169, 157, 105, 106, + 0, 0, 604, 0, 0, 0, 605, 124, 128, 143, + 118, 0, 0, 0, 0, 0, 0, 687, 0, 103, + 0, 134, 0, 0, 0, 89, 86, 122, 0, 0, + 0, 91, 0, 104, 144, 0, 155, 119, 171, 158, + 117, 116, 161, 164, 153, 101, 109, 56, 107, 65, + 63, 67, 97, 156, 150, 151, 152, 59, 0, 95, + 96, 93, 94, 130, 131, 165, 166, 167, 145, 90, + 0, 0, 148, 133, 55, 0, 60, 69, 64, 58, + 68, 160, 147, 121, 162, 99, 113, 170, 114, 115, + 141, 87, 129, 62, 111, 0, 102, 83, 108, 84, + 100, 123, 57, 126, 98, 149, 132, 168, 0, 136, + 0, 66, 61, 0, 0, 125, 154, 127, 146, 120, + 142, 92, 135, 163, 112, 139, 34, 0, 0, 53, + 0, 0, 0, 0, 0, 0, 0, 0, 138, 159, + 110, 140, 82, 137, 0, 85, 88, 169, 157, 105, + 106, 0, 0, 0, 0, 0, 0, 0, 124, 128, + 143, 118, 0, 0, 0, 0, 0, 0, 0, 0, + 103, 0, 134, 0, 0, 0, 89, 86, 122, 0, + 0, 0, 91, 0, 104, 144, 0, 155, 119, 171, + 158, 117, 116, 161, 164, 153, 101, 109, 56, 107, + 65, 63, 67, 97, 156, 150, 151, 152, 59, 0, + 95, 96, 93, 94, 130, 131, 165, 166, 167, 145, + 90, 0, 0, 148, 133, 55, 0, 60, 69, 64, + 58, 68, 160, 147, 121, 162, 99, 113, 170, 114, + 115, 141, 87, 129, 62, 111, 0, 102, 83, 108, + 84, 100, 123, 57, 126, 98, 149, 132, 168, 0, + 136, 0, 66, 61, 0, 0, 125, 154, 127, 146, + 120, 142, 92, 135, 163, 112, 139, 0, 0, 0, + 203, 0, 0, 0, 0, 0, 0, 0, 0, 138, + 159, 110, 140, 82, 137, 0, 85, 88, 169, 157, + 105, 106, 0, 0, 0, 0, 0, 0, 0, 124, + 128, 143, 118, 0, 0, 0, 0, 0, 0, 614, + 0, 103, 0, 134, 0, 0, 0, 89, 86, 122, + 0, 0, 0, 91, 0, 104, 144, 0, 155, 119, + 171, 158, 117, 116, 161, 164, 153, 101, 109, 56, + 107, 65, 63, 67, 97, 156, 150, 151, 152, 59, + 0, 95, 96, 93, 94, 130, 131, 165, 166, 167, + 145, 90, 0, 0, 148, 133, 55, 0, 60, 69, + 64, 58, 68, 160, 147, 121, 162, 99, 113, 170, + 114, 115, 141, 87, 129, 62, 111, 0, 102, 83, + 108, 84, 100, 123, 57, 126, 98, 149, 132, 168, + 0, 136, 0, 66, 61, 0, 0, 125, 154, 127, + 146, 120, 142, 92, 135, 163, 112, 139, 0, 0, + 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, + 138, 159, 110, 140, 82, 137, 0, 85, 88, 169, + 157, 105, 106, 0, 0, 0, 0, 0, 0, 0, + 124, 128, 143, 118, 0, 0, 0, 0, 0, 0, + 0, 0, 103, 0, 134, 0, 0, 0, 89, 86, + 122, 0, 0, 0, 91, 0, 104, 144, 0, 155, + 119, 171, 158, 117, 116, 161, 164, 153, 101, 109, + 56, 107, 65, 63, 67, 97, 156, 150, 151, 152, + 59, 0, 95, 96, 93, 94, 130, 131, 165, 166, + 167, 145, 90, 0, 0, 148, 133, 55, 0, 60, + 69, 64, 58, 68, 160, 147, 121, 162, 99, 113, + 170, 114, 115, 141, 87, 129, 62, 111, 0, 102, + 83, 108, 84, 100, 123, 57, 126, 98, 149, 132, + 168, 0, 136, 0, 66, 61, 0, 0, 125, 154, + 127, 146, 120, 142, 92, 135, 163, 112, 139, 0, + 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 159, 110, 140, 82, 137, 0, 85, 88, + 169, 157, 105, 106, 0, 0, 0, 0, 0, 0, + 0, 124, 128, 143, 118, 0, 0, 0, 0, 0, + 0, 0, 0, 103, 0, 134, 0, 0, 0, 89, + 86, 122, 0, 0, 0, 91, 0, 104, 144, 0, + 155, 119, 171, 158, 117, 116, 161, 164, 153, 101, + 109, 56, 107, 65, 63, 67, 97, 156, 150, 151, + 152, 59, 0, 95, 96, 93, 94, 130, 131, 165, + 166, 167, 145, 90, 0, 0, 148, 133, 55, 0, + 60, 69, 64, 58, 68, 160, 147, 121, 162, 99, + 113, 170, 114, 115, 141, 87, 129, 62, 111, 0, + 102, 83, 108, 84, 100, 123, 57, 126, 98, 149, + 132, 168, 0, 136, 0, 66, 61, 0, 0, 125, + 154, 127, 146, 120, 142, 92, 135, 163, 112, 139, + 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, + 0, 0, 138, 159, 110, 140, 82, 137, 0, 85, + 88, 169, 157, 105, 106, 0, 0, 0, 0, 0, + 0, 0, 124, 128, 143, 118, 0, 0, 0, 0, + 0, 0, 0, 0, 103, 0, 134, 0, 0, 0, + 89, 86, 122, 0, 0, 0, 91, 0, 104, 144, + 0, 155, 119, 171, 158, 117, 116, 161, 164, 153, + 101, 109, 56, 107, 65, 63, 67, 97, 156, 150, + 151, 152, 59, 0, 95, 96, 93, 94, 130, 131, + 165, 166, 167, 145, 90, 0, 0, 148, 133, 55, + 0, 60, 69, 64, 58, 68, 160, 147, 121, 162, + 99, 113, 170, 114, 115, 141, 87, 129, 62, 111, + 0, 102, 83, 108, 84, 100, 123, 57, 126, 98, + 149, 132, 168, 0, 136, 0, 66, 61, 0, 0, + 125, 154, 127, 146, 120, 142, 92, 135, 163, 112, + 139, 0, 0, 0, 79, 0, 0, 0, 0, 0, + 0, 0, 0, 138, 159, 110, 140, 82, 137, 0, + 85, 88, 169, 157, 105, 106, 0, 0, 0, 0, + 0, 0, 0, 124, 128, 143, 118, 0, 0, 0, + 0, 0, 0, 0, 0, 103, 0, 134, 0, 0, + 0, 89, 86, 122, 0, 0, 0, 91, 0, 104, + 144, 0, 155, 119, 171, 158, 117, 116, 161, 164, + 153, 101, 109, 56, 107, 65, 63, 67, 97, 156, + 150, 151, 152, 59, 0, 95, 96, 93, 94, 130, + 131, 165, 166, 167, 145, 90, 0, 0, 148, 133, + 55, 0, 60, 69, 64, 58, 68, 62, 0, 0, + 485, 0, 229, 0, 0, 0, 57, 0, 0, 0, + 0, 264, 0, 0, 0, 66, 61, 0, 0, 0, + 0, 257, 258, 0, 0, 0, 0, 0, 0, 0, + 34, 557, 0, 203, 247, 246, 248, 249, 250, 251, + 0, 0, 252, 244, 245, 0, 0, 226, 238, 0, + 263, 332, 331, 341, 342, 334, 335, 336, 337, 338, + 339, 340, 333, 0, 0, 343, 0, 0, 0, 0, + 235, 236, 488, 0, 0, 0, 275, 0, 237, 0, + 0, 234, 239, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 0, 0, 273, 0, 0, 0, + 0, 0, 56, 0, 65, 63, 67, 0, 0, 0, + 0, 0, 59, 0, 265, 274, 271, 272, 269, 270, + 268, 267, 266, 276, 259, 260, 262, 0, 261, 55, + 0, 60, 69, 64, 58, 68, 62, 0, 0, 0, + 0, 229, 0, 0, 0, 57, 0, 0, 0, 0, + 264, 0, 0, 0, 66, 61, 0, 0, 0, 0, + 257, 258, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 203, 247, 246, 248, 249, 250, 251, 0, + 0, 252, 244, 245, 0, 0, 226, 238, 0, 263, + 332, 331, 341, 342, 334, 335, 336, 337, 338, 339, + 340, 333, 0, 0, 343, 0, 0, 0, 0, 235, + 236, 488, 0, 0, 0, 275, 0, 237, 0, 0, + 234, 239, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 0, 0, 273, 0, 0, 0, 0, + 0, 56, 0, 65, 63, 67, 0, 0, 0, 0, + 0, 59, 0, 265, 274, 271, 272, 269, 270, 268, + 267, 266, 276, 259, 260, 262, 0, 261, 55, 0, + 60, 69, 64, 58, 68, 62, 0, 0, 0, 0, + 229, 0, 0, 0, 57, 0, 0, 0, 0, 264, + 0, 0, 0, 66, 61, 0, 0, 0, 0, 257, + 258, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 220, 203, 247, 246, 248, 249, 250, 251, 0, 0, + 252, 244, 245, 0, 0, 226, 238, 0, 263, 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, 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, 235, 236, + 0, 0, 0, 0, 275, 0, 237, 0, 0, 234, + 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 0, 0, 273, 0, 0, 0, 0, 0, + 56, 0, 65, 63, 67, 0, 0, 0, 0, 0, + 59, 0, 265, 274, 271, 272, 269, 270, 268, 267, + 266, 276, 259, 260, 262, 17, 261, 55, 0, 60, + 69, 64, 58, 68, 0, 0, 62, 0, 0, 0, + 0, 229, 0, 0, 0, 57, 0, 0, 0, 0, + 264, 0, 0, 0, 66, 61, 0, 0, 0, 0, + 257, 258, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 203, 247, 246, 248, 249, 250, 251, 0, + 0, 252, 244, 245, 0, 0, 226, 238, 0, 263, 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, 235, + 236, 0, 0, 0, 0, 275, 0, 237, 0, 0, + 234, 239, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 0, 0, 273, 0, 0, 0, 0, + 0, 56, 0, 65, 63, 67, 0, 0, 0, 0, + 0, 59, 0, 265, 274, 271, 272, 269, 270, 268, + 267, 266, 276, 259, 260, 262, 0, 261, 55, 0, + 60, 69, 64, 58, 68, 62, 0, 0, 0, 0, + 229, 0, 0, 0, 57, 0, 0, 0, 0, 264, + 0, 0, 0, 66, 61, 0, 0, 0, 0, 257, + 258, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 203, 247, 246, 248, 249, 250, 251, 0, 0, + 252, 244, 245, 0, 0, 226, 238, 0, 263, 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, 235, 236, + 0, 0, 0, 0, 275, 0, 237, 0, 0, 234, + 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 0, 0, 273, 0, 0, 0, 0, 0, + 56, 0, 65, 63, 67, 0, 0, 0, 0, 0, + 59, 0, 265, 274, 271, 272, 269, 270, 268, 267, + 266, 276, 259, 260, 262, 62, 261, 55, 0, 60, + 69, 64, 58, 68, 57, 0, 0, 0, 0, 264, + 0, 0, 0, 66, 61, 0, 0, 0, 0, 257, + 258, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 203, 247, 246, 248, 249, 250, 251, 0, 0, + 252, 244, 245, 0, 0, 0, 238, 0, 263, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, + 0, 0, 0, 0, 275, 0, 237, 0, 0, 234, + 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 0, 0, 273, 0, 0, 0, 0, 0, + 56, 0, 65, 63, 67, 0, 0, 0, 0, 0, + 59, 0, 265, 274, 271, 272, 269, 270, 268, 267, + 266, 276, 259, 260, 262, 62, 261, 55, 0, 60, + 69, 64, 58, 68, 57, 0, 0, 0, 0, 264, + 0, 0, 0, 66, 61, 0, 0, 0, 0, 257, + 258, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 203, 247, 246, 248, 249, 250, 251, 0, 0, + 252, 62, 0, 0, 0, 0, 238, 0, 263, 0, + 57, 0, 0, 0, 0, 0, 0, 0, 0, 66, + 61, 0, 0, 0, 0, 0, 0, 0, 235, 236, + 0, 0, 0, 0, 275, 0, 237, 53, 0, 234, + 239, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 171, 0, 0, 273, 0, 0, 0, 0, 0, + 56, 0, 65, 63, 67, 0, 0, 0, 0, 0, + 59, 0, 265, 274, 271, 272, 269, 270, 268, 267, + 266, 276, 259, 260, 262, 17, 261, 55, 0, 60, + 69, 64, 58, 68, 0, 47, 62, 49, 0, 0, + 0, 51, 0, 0, 0, 57, 56, 0, 65, 63, + 67, 0, 62, 0, 66, 61, 59, 0, 0, 0, + 0, 57, 0, 0, 0, 0, 0, 0, 0, 34, + 66, 61, 53, 55, 0, 60, 69, 64, 58, 68, + 0, 0, 0, 0, 0, 0, 62, 0, 53, 0, + 293, 398, 0, 0, 399, 57, 0, 0, 0, 0, + 62, 0, 0, 0, 66, 61, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 61, + 0, 0, 195, 0, 295, 0, 0, 0, 0, 0, + 0, 0, 171, 34, 0, 0, 195, 0, 0, 0, + 0, 56, 0, 65, 63, 67, 0, 62, 171, 0, + 0, 59, 0, 0, 0, 0, 57, 56, 0, 65, + 63, 67, 0, 0, 0, 66, 61, 59, 55, 0, + 60, 69, 64, 58, 68, 0, 0, 0, 0, 0, + 0, 0, 171, 53, 55, 565, 60, 69, 64, 58, + 68, 56, 0, 65, 63, 67, 171, 0, 0, 0, + 0, 59, 0, 0, 0, 56, 0, 65, 63, 67, + 62, 0, 0, 0, 0, 59, 0, 0, 55, 57, + 60, 69, 64, 58, 68, 0, 0, 0, 66, 61, + 0, 0, 55, 0, 60, 69, 64, 58, 68, 0, + 0, 0, 0, 171, 0, 0, 195, 0, 295, 0, + 0, 0, 56, 0, 65, 63, 67, 62, 0, 0, + 0, 0, 59, 0, 0, 288, 57, 0, 0, 0, + 0, 62, 0, 0, 0, 66, 61, 0, 0, 55, + 57, 60, 69, 64, 58, 68, 0, 0, 0, 66, + 61, 0, 0, 195, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 62, 171, 53, 0, 0, + 0, 0, 0, 0, 57, 56, 0, 65, 63, 67, + 62, 0, 0, 66, 61, 59, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 61, + 0, 203, 55, 0, 60, 69, 64, 58, 68, 0, + 0, 0, 0, 171, 0, 0, 195, 0, 0, 0, + 0, 0, 56, 0, 65, 63, 67, 171, 0, 0, + 0, 0, 59, 0, 0, 0, 56, 0, 65, 63, + 67, 0, 0, 0, 0, 0, 59, 0, 0, 55, + 0, 60, 69, 64, 58, 68, 0, 0, 0, 0, + 0, 171, 0, 55, 0, 60, 69, 64, 58, 68, + 56, 0, 65, 63, 67, 0, 171, 0, 0, 0, + 59, 0, 0, 0, 0, 56, 0, 65, 63, 67, + 0, 0, 0, 0, 0, 59, 0, 55, 0, 60, + 69, 64, 58, 68, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 60, 69, 64, 58, 68, } var yyPact = [...]int{ - 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, + 1081, -1000, -117, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 470, 489, -1000, -1000, -1000, + -1000, -1000, 3174, -39, -10, -2, -11, 2171, -1000, -1000, + -1000, -1000, -1000, 320, -1000, -1000, -1000, 454, 460, 355, + 444, 348, -1000, -40, 3553, 479, 3538, -45, -15, 3553, + -84, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -13, 3553, -1000, 3553, -51, 134, -51, 3553, -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, @@ -807,80 +799,79 @@ 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, -1000, -1000, -1000, 148, 438, 2868, + 2868, 470, -1000, 320, -1000, -1000, -1000, 405, -1000, -1000, + 103, 3490, 414, 3319, 21, -1000, -1000, 3553, 176, -1000, + 56, -1000, 19, -1000, -1000, 3553, 93, 132, 1416, -33, + 3553, 1416, -36, 3553, 428, 255, 3553, -1000, -1000, -1000, + -1000, -1000, 485, 42, 371, -1000, 2868, 742, -1000, 152, + -1000, 8, -1000, -1000, 3128, 3128, 3128, 3128, 3128, 3128, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -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, + -1000, -1000, -1000, 152, 17, -1000, 2729, 152, 152, 152, + 152, 152, 152, 2868, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 230, -1000, 197, + 454, 148, 348, 3285, 268, -1000, -1000, 322, 3553, -1000, + 3538, 43, -1000, 3443, -1000, -1000, 2020, 477, 3538, 2868, + 1869, 1416, 427, -54, -1000, -1000, -1000, -1000, -1000, 3553, + 68, -1000, 3553, -1000, -1000, 3553, 1416, -1000, 388, 2868, + 2868, 131, 2868, 2868, 47, 2998, 123, 85, 3128, 3128, + 3128, 3128, 3128, 3128, 3128, 3128, 3128, 3128, 3128, 3128, + 3128, 3128, 3128, 33, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 320, 229, 229, 26, 26, 26, 26, 26, + 879, 2310, 1869, 148, 249, 96, 2729, 2449, 2449, 2868, + 2868, 3504, 445, 82, 96, 3504, -1000, 148, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 2449, 2449, 2449, 2449, 2868, + -1000, -1000, -1000, 438, -1000, 445, 456, -1000, 399, 375, + 2449, -1000, 254, 3538, 152, -1000, 3269, -1000, 220, -1000, + -17, -27, -31, -1000, -1000, -1000, -1000, 470, 2868, -1000, + 96, -1000, 16, -1000, -1000, -1000, 246, 3504, 1416, -1000, + 72, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 379, 47, 97, -1000, -1000, 195, -1000, -1000, 96, + 96, -1000, 2434, -1000, -1000, -1000, -1000, 123, 3128, 3128, + 3128, 151, 2434, 2295, 680, 965, 26, 113, 113, 28, + 28, 28, 28, 28, 301, 301, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 148, 2449, 214, -1000, -1000, 1098, + 15, 152, -1000, 2868, -1000, 148, 216, 216, 41, 167, + 241, -1000, 2449, 101, -1000, 2868, 148, -1000, 216, 148, + 216, 216, -1000, -1000, 3553, -1000, -1000, -1000, -1000, 280, + -1000, 422, 305, 184, -1000, -1000, 2588, 148, 225, 14, + 470, 152, 152, 152, 454, 96, 1718, 3553, -1000, -1000, + -1000, 3553, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 151, 2434, 951, -1000, 3128, 3128, -1000, 216, + 2449, -1000, -1000, 3380, -1000, -1000, 1567, 2449, 96, -1000, + -1000, -1000, 33, 33, 33, -93, 3504, 204, 59, -1000, + 2868, 188, -1000, -1000, -1000, -1000, -1000, -1000, 477, 3333, + 415, -1000, 152, -1000, -1000, 352, 3504, 3504, 454, 3504, + 3504, 3504, -1000, -1000, 1416, -1000, -1000, -1000, 3128, 2434, + 2434, -1000, -1000, -1000, -1000, 12, 148, 148, 34, 148, + 148, 152, -1000, -90, -1000, 96, 2868, 475, 210, 271, + -1000, -1000, -1000, 436, 1112, 484, -1000, 152, -1000, 320, + 11, -1000, -1000, 178, -1000, 178, 178, -1000, 2434, 1265, + -1000, -1000, -1000, 124, -1000, 410, -1000, -1000, 3128, 148, + 126, 96, 458, 457, 3333, 3333, 3333, 3333, -1000, 311, + 297, -1000, 370, 369, 413, 3553, -1000, 173, 1112, 3538, + 184, 148, 3504, -1000, 3504, -1000, -1000, -1000, 140, 33, + 52, -1000, -1000, -1000, 2868, 2868, 271, 231, 437, -1000, + -1000, -1000, -1000, 296, -1000, 284, -1000, -1000, -1000, -1000, + 176, -1000, -1000, -1000, 49, 109, -1000, 148, 7, -106, + 96, 164, 2868, 2868, -1000, -1000, -1000, 402, 148, -1000, + 351, -99, -109, 96, 96, 33, -1000, -1000, 283, -1000, + -1000, -103, -107, -110, -1000, } var yyPgo = [...]int{ - 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, + 0, 629, 17, 360, 628, 622, 616, 608, 599, 598, + 594, 593, 591, 589, 585, 583, 579, 41, 578, 577, + 31, 572, 42, 571, 570, 21, 72, 16, 20, 9, + 568, 34, 36, 32, 567, 566, 2, 565, 804, 564, + 362, 563, 10, 26, 562, 43, 559, 557, 35, 609, + 555, 554, 553, 552, 551, 549, 23, 1, 3, 11, + 8, 541, 48, 7, 540, 27, 539, 538, 537, 535, + 14, 534, 29, 533, 15, 24, 532, 526, 25, 6, + 38, 525, 373, 151, 523, 521, 519, 518, 517, 516, + 66, 5, 499, 19, 12, 514, 58, 30, 40, 513, + 508, 37, 22, 4, 13, 505, 504, 502, 490, 0, + 500, 73, } var yyR1 = [...]int{ @@ -933,8 +924,8 @@ var yyR1 = [...]int{ var yyR2 = [...]int{ 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 4, 4, 7, 10, - 3, 3, 1, 3, 6, 7, 8, 7, 3, 5, + 1, 1, 1, 1, 1, 1, 4, 6, 7, 10, + 1, 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, @@ -983,55 +974,55 @@ var yyChk = [...]int{ -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, + 124, 125, 126, -108, 50, -107, 156, -70, 14, -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, -2, -74, 16, + 15, -5, -3, -108, 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, -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, + -70, -2, -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, -74, -109, -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, -75, -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, @@ -1058,59 +1049,59 @@ var yyChk = [...]int{ } var yyDef = [...]int{ - 0, -2, 2, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, -2, 260, 51, 51, 51, + 0, -2, 2, -2, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 260, 0, 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, + 438, 438, 438, 0, 436, 1, 3, 268, 0, 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, 20, 272, 0, + 0, 260, 22, 0, 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, 21, + 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, + 268, 20, 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, 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, + 0, 0, 0, 0, 147, 148, 149, 150, 151, 152, + 153, 140, 0, 0, 0, 185, 186, 187, 188, 189, + 0, 65, 0, 20, 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, 272, 23, 61, 0, 253, 0, 0, + 0, 64, 287, 0, 0, -2, 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, 20, 0, 0, 0, 0, + 0, 275, 0, 241, 238, 0, 0, 216, 0, 0, + 0, 0, 263, 17, 0, 298, 299, 254, 255, 78, + 24, 0, 287, 277, 289, 291, 0, 20, 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, @@ -1121,12 +1112,12 @@ var yyDef = [...]int{ 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, + 82, 83, 84, 92, 0, 0, 290, 0, -2, 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, + 280, 20, 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, @@ -1510,29 +1501,29 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:202 + //line sql.y:202 { setParseTree(yylex, yyDollar[1].statement) } case 2: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:207 + //line sql.y:207 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:208 + //line sql.y:208 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:212 + //line sql.y:212 { yyVAL.statement = yyDollar[1].selStmt } case 16: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:229 + //line sql.y:229 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -1541,54 +1532,50 @@ yydefault: yyVAL.selStmt = sel } case 17: - yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:237 + yyDollar = yyS[yypt-6 : yypt+1] + //line 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 + yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} } case 18: yyDollar = yyS[yypt-7 : yypt+1] - //line ./go/vt/sqlparser/sql.y:245 + //line sql.y:241 { 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 19: yyDollar = yyS[yypt-10 : yypt+1] - //line ./go/vt/sqlparser/sql.y:252 + //line sql.y:248 { 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:258 + yyDollar = yyS[yypt-1 : yypt+1] + //line sql.y:254 { - yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt} + yyVAL.selStmt = yyDollar[1].selStmt } case 21: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:262 + //line sql.y:258 { - yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt} + yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } case 22: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:270 + //line sql.y:264 { yyVAL.selStmt = yyDollar[1].selStmt } case 23: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:274 + //line sql.y:268 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } case 24: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:281 + //line sql.y:275 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[5].ins @@ -1600,7 +1587,7 @@ yydefault: } case 25: yyDollar = yyS[yypt-7 : yypt+1] - //line ./go/vt/sqlparser/sql.y:291 + //line sql.y:285 { cols := make(Columns, 0, len(yyDollar[6].updateExprs)) vals := make(ValTuple, 0, len(yyDollar[7].updateExprs)) @@ -1612,82 +1599,82 @@ yydefault: } case 26: yyDollar = yyS[yypt-8 : yypt+1] - //line ./go/vt/sqlparser/sql.y:303 + //line sql.y:297 { 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 27: yyDollar = yyS[yypt-7 : yypt+1] - //line ./go/vt/sqlparser/sql.y:309 + //line sql.y:303 { 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 28: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:315 + //line sql.y:309 { yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].updateExprs} } case 29: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:321 + //line sql.y:315 { yyVAL.statement = &DDL{Action: CreateStr, NewName: yyDollar[4].tableName} } case 30: yyDollar = yyS[yypt-8 : yypt+1] - //line ./go/vt/sqlparser/sql.y:325 + //line sql.y:319 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[7].tableName, NewName: yyDollar[7].tableName} } case 31: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:330 + //line sql.y:324 { yyVAL.statement = &DDL{Action: CreateStr, NewName: yyDollar[3].tableName.ToViewName()} } case 32: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:334 + //line sql.y:328 { yyVAL.statement = &DDL{Action: CreateStr, NewName: yyDollar[5].tableName.ToViewName()} } case 33: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:340 + //line sql.y:334 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, NewName: yyDollar[4].tableName} } case 34: yyDollar = yyS[yypt-7 : yypt+1] - //line ./go/vt/sqlparser/sql.y:344 + //line sql.y:338 { // Change this to a rename statement yyVAL.statement = &DDL{Action: RenameStr, Table: yyDollar[4].tableName, NewName: yyDollar[7].tableName} } case 35: yyDollar = yyS[yypt-7 : yypt+1] - //line ./go/vt/sqlparser/sql.y:349 + //line sql.y:343 { // 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:354 + //line sql.y:348 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName.ToViewName(), NewName: yyDollar[3].tableName.ToViewName()} } case 37: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:360 + //line sql.y:354 { yyVAL.statement = &DDL{Action: RenameStr, Table: yyDollar[3].tableName, NewName: yyDollar[5].tableName} } case 38: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:366 + //line sql.y:360 { var exists bool if yyDollar[3].byt != 0 { @@ -1697,14 +1684,14 @@ yydefault: } case 39: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:374 + //line sql.y:368 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[5].tableName, NewName: yyDollar[5].tableName} } case 40: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:379 + //line sql.y:373 { var exists bool if yyDollar[3].byt != 0 { @@ -1714,19 +1701,19 @@ yydefault: } case 41: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:389 + //line sql.y:383 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName, NewName: yyDollar[3].tableName} } case 42: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:395 + //line sql.y:389 { yyVAL.str = ShowUnsupportedStr } case 43: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:399 + //line sql.y:393 { if string(yyDollar[1].bytes) == "databases" { yyVAL.str = ShowDatabasesStr @@ -1744,368 +1731,368 @@ yydefault: } case 44: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:415 + //line sql.y:409 { yyVAL.str = ShowUnsupportedStr } case 45: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:421 + //line sql.y:415 { yyVAL.statement = &Show{Type: yyDollar[2].str} } case 46: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:427 + //line sql.y:421 { yyVAL.statement = &Other{} } case 47: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:431 + //line sql.y:425 { yyVAL.statement = &Other{} } case 48: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:435 + //line sql.y:429 { yyVAL.statement = &Other{} } case 49: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:439 + //line sql.y:433 { yyVAL.statement = &Other{} } case 50: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:443 + //line sql.y:437 { yyVAL.statement = &Other{} } case 51: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:448 + //line sql.y:442 { setAllowComments(yylex, true) } case 52: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:452 + //line sql.y:446 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } case 53: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:458 + //line sql.y:452 { yyVAL.bytes2 = nil } case 54: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:462 + //line sql.y:456 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } case 55: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:468 + //line sql.y:462 { yyVAL.str = UnionStr } case 56: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:472 + //line sql.y:466 { yyVAL.str = UnionAllStr } case 57: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:476 + //line sql.y:470 { yyVAL.str = UnionDistinctStr } case 58: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:481 + //line sql.y:475 { yyVAL.str = "" } case 59: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:485 + //line sql.y:479 { yyVAL.str = SQLNoCacheStr } case 60: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:489 + //line sql.y:483 { yyVAL.str = SQLCacheStr } case 61: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:494 + //line sql.y:488 { yyVAL.str = "" } case 62: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:498 + //line sql.y:492 { yyVAL.str = DistinctStr } case 63: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:503 + //line sql.y:497 { yyVAL.str = "" } case 64: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:507 + //line sql.y:501 { yyVAL.str = StraightJoinHint } case 65: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:512 + //line sql.y:506 { yyVAL.selectExprs = nil } case 66: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:516 + //line sql.y:510 { yyVAL.selectExprs = yyDollar[1].selectExprs } case 67: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:522 + //line sql.y:516 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } case 68: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:526 + //line sql.y:520 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } case 69: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:532 + //line sql.y:526 { yyVAL.selectExpr = &StarExpr{} } case 70: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:536 + //line sql.y:530 { yyVAL.selectExpr = &NonStarExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } case 71: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:540 + //line sql.y:534 { yyVAL.selectExpr = &StarExpr{TableName: &TableName{Name: yyDollar[1].tableIdent}} } case 72: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:544 + //line sql.y:538 { yyVAL.selectExpr = &StarExpr{TableName: &TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } case 73: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:549 + //line sql.y:543 { yyVAL.colIdent = ColIdent{} } case 74: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:553 + //line sql.y:547 { yyVAL.colIdent = yyDollar[1].colIdent } case 75: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:557 + //line sql.y:551 { yyVAL.colIdent = yyDollar[2].colIdent } case 77: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:564 + //line sql.y:558 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 78: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:569 + //line sql.y:563 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: &TableName{Name: NewTableIdent("dual")}}} } case 79: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:573 + //line sql.y:567 { yyVAL.tableExprs = yyDollar[2].tableExprs } case 80: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:579 + //line sql.y:573 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } case 81: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:583 + //line sql.y:577 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } case 84: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:593 + //line sql.y:587 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } case 85: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:597 + //line sql.y:591 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } case 86: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:601 + //line sql.y:595 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } case 87: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:607 + //line sql.y:601 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} } case 88: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:620 + //line sql.y:614 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr} } case 89: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:624 + //line sql.y:618 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, On: yyDollar[5].expr} } case 90: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:628 + //line sql.y:622 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, On: yyDollar[5].expr} } case 91: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:632 + //line sql.y:626 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr} } case 92: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:637 + //line sql.y:631 { yyVAL.empty = struct{}{} } case 93: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:639 + //line sql.y:633 { yyVAL.empty = struct{}{} } case 94: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:642 + //line sql.y:636 { yyVAL.tableIdent = NewTableIdent("") } case 95: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:646 + //line sql.y:640 { yyVAL.tableIdent = yyDollar[1].tableIdent } case 96: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:650 + //line sql.y:644 { yyVAL.tableIdent = yyDollar[2].tableIdent } case 98: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:657 + //line sql.y:651 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 99: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:663 + //line sql.y:657 { yyVAL.str = JoinStr } case 100: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:667 + //line sql.y:661 { yyVAL.str = JoinStr } case 101: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:671 + //line sql.y:665 { yyVAL.str = JoinStr } case 102: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:675 + //line sql.y:669 { yyVAL.str = StraightJoinStr } case 103: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:681 + //line sql.y:675 { yyVAL.str = LeftJoinStr } case 104: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:685 + //line sql.y:679 { yyVAL.str = LeftJoinStr } case 105: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:689 + //line sql.y:683 { yyVAL.str = RightJoinStr } case 106: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:693 + //line sql.y:687 { yyVAL.str = RightJoinStr } case 107: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:699 + //line sql.y:693 { yyVAL.str = NaturalJoinStr } case 108: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:703 + //line sql.y:697 { if yyDollar[2].str == LeftJoinStr { yyVAL.str = NaturalLeftJoinStr @@ -2115,469 +2102,469 @@ yydefault: } case 109: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:713 + //line sql.y:707 { yyVAL.tableName = yyDollar[2].tableName } case 110: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:717 + //line sql.y:711 { yyVAL.tableName = yyDollar[1].tableName } case 111: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:723 + //line sql.y:717 { yyVAL.tableName = &TableName{Name: yyDollar[1].tableIdent} } case 112: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:727 + //line sql.y:721 { yyVAL.tableName = &TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } case 113: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:732 + //line sql.y:726 { yyVAL.indexHints = nil } case 114: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:736 + //line sql.y:730 { yyVAL.indexHints = &IndexHints{Type: UseStr, Indexes: yyDollar[4].colIdents} } case 115: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:740 + //line sql.y:734 { yyVAL.indexHints = &IndexHints{Type: IgnoreStr, Indexes: yyDollar[4].colIdents} } case 116: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:744 + //line sql.y:738 { yyVAL.indexHints = &IndexHints{Type: ForceStr, Indexes: yyDollar[4].colIdents} } case 117: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:750 + //line sql.y:744 { yyVAL.colIdents = []ColIdent{yyDollar[1].colIdent} } case 118: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:754 + //line sql.y:748 { yyVAL.colIdents = append(yyDollar[1].colIdents, yyDollar[3].colIdent) } case 119: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:759 + //line sql.y:753 { yyVAL.expr = nil } case 120: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:763 + //line sql.y:757 { yyVAL.expr = yyDollar[2].expr } case 121: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:769 + //line sql.y:763 { yyVAL.expr = yyDollar[1].expr } case 122: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:773 + //line sql.y:767 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 123: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:777 + //line sql.y:771 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 124: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:781 + //line sql.y:775 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } case 125: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:785 + //line sql.y:779 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].str, Expr: yyDollar[1].expr} } case 126: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:789 + //line sql.y:783 { yyVAL.expr = yyDollar[1].expr } case 127: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:795 + //line sql.y:789 { yyVAL.boolVal = BoolVal(true) } case 128: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:799 + //line sql.y:793 { yyVAL.boolVal = BoolVal(false) } case 129: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:805 + //line sql.y:799 { yyVAL.expr = yyDollar[1].boolVal } case 130: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:809 + //line sql.y:803 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].boolVal} } case 131: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:813 + //line sql.y:807 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].expr} } case 132: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:817 + //line sql.y:811 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InStr, Right: yyDollar[3].colTuple} } case 133: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:821 + //line sql.y:815 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInStr, Right: yyDollar[4].colTuple} } case 134: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:825 + //line sql.y:819 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeStr, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } case 135: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:829 + //line sql.y:823 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeStr, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } case 136: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:833 + //line sql.y:827 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpStr, Right: yyDollar[3].expr} } case 137: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:837 + //line sql.y:831 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpStr, Right: yyDollar[4].expr} } case 138: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:841 + //line sql.y:835 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenStr, From: yyDollar[3].expr, To: yyDollar[5].expr} } case 139: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:845 + //line sql.y:839 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenStr, From: yyDollar[4].expr, To: yyDollar[6].expr} } case 140: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:849 + //line sql.y:843 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } case 141: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:855 + //line sql.y:849 { yyVAL.str = IsNullStr } case 142: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:859 + //line sql.y:853 { yyVAL.str = IsNotNullStr } case 143: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:863 + //line sql.y:857 { yyVAL.str = IsTrueStr } case 144: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:867 + //line sql.y:861 { yyVAL.str = IsNotTrueStr } case 145: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:871 + //line sql.y:865 { yyVAL.str = IsFalseStr } case 146: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:875 + //line sql.y:869 { yyVAL.str = IsNotFalseStr } case 147: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:881 + //line sql.y:875 { yyVAL.str = EqualStr } case 148: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:885 + //line sql.y:879 { yyVAL.str = LessThanStr } case 149: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:889 + //line sql.y:883 { yyVAL.str = GreaterThanStr } case 150: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:893 + //line sql.y:887 { yyVAL.str = LessEqualStr } case 151: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:897 + //line sql.y:891 { yyVAL.str = GreaterEqualStr } case 152: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:901 + //line sql.y:895 { yyVAL.str = NotEqualStr } case 153: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:905 + //line sql.y:899 { yyVAL.str = NullSafeEqualStr } case 154: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:910 + //line sql.y:904 { yyVAL.expr = nil } case 155: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:914 + //line sql.y:908 { yyVAL.expr = yyDollar[2].expr } case 156: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:920 + //line sql.y:914 { yyVAL.colTuple = yyDollar[1].valTuple } case 157: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:924 + //line sql.y:918 { yyVAL.colTuple = yyDollar[1].subquery } case 158: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:928 + //line sql.y:922 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } case 159: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:934 + //line sql.y:928 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 160: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:940 + //line sql.y:934 { yyVAL.exprs = Exprs{yyDollar[1].expr} } case 161: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:944 + //line sql.y:938 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } case 162: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:950 + //line sql.y:944 { yyVAL.str = string(yyDollar[1].bytes) } case 163: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:954 + //line sql.y:948 { yyVAL.str = string(yyDollar[1].bytes) } case 164: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:958 + //line sql.y:952 { yyVAL.str = string(yyDollar[1].bytes) } case 165: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:962 + //line sql.y:956 { yyVAL.str = string(yyDollar[1].bytes) } case 166: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:968 + //line sql.y:962 { yyVAL.expr = yyDollar[1].expr } case 167: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:972 + //line sql.y:966 { yyVAL.expr = yyDollar[1].colName } case 168: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:976 + //line sql.y:970 { yyVAL.expr = yyDollar[1].expr } case 169: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:980 + //line sql.y:974 { yyVAL.expr = yyDollar[1].subquery } case 170: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:984 + //line sql.y:978 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndStr, Right: yyDollar[3].expr} } case 171: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:988 + //line sql.y:982 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrStr, Right: yyDollar[3].expr} } case 172: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:992 + //line sql.y:986 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorStr, Right: yyDollar[3].expr} } case 173: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:996 + //line sql.y:990 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusStr, Right: yyDollar[3].expr} } case 174: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1000 + //line sql.y:994 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusStr, Right: yyDollar[3].expr} } case 175: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1004 + //line sql.y:998 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultStr, Right: yyDollar[3].expr} } case 176: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1008 + //line sql.y:1002 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivStr, Right: yyDollar[3].expr} } case 177: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1012 + //line sql.y:1006 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivStr, Right: yyDollar[3].expr} } case 178: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1016 + //line sql.y:1010 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } case 179: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1020 + //line sql.y:1014 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } case 180: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1024 + //line sql.y:1018 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftStr, Right: yyDollar[3].expr} } case 181: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1028 + //line sql.y:1022 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightStr, Right: yyDollar[3].expr} } case 182: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1032 + //line sql.y:1026 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } case 183: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1036 + //line sql.y:1030 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } case 184: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1040 + //line sql.y:1034 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } case 185: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1044 + //line sql.y:1038 { yyVAL.expr = &UnaryExpr{Operator: BinaryStr, Expr: yyDollar[2].expr} } case 186: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1048 + //line sql.y:1042 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { yyVAL.expr = num @@ -2587,7 +2574,7 @@ yydefault: } case 187: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1056 + //line sql.y:1050 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { // Handle double negative @@ -2603,19 +2590,19 @@ yydefault: } case 188: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1070 + //line sql.y:1064 { yyVAL.expr = &UnaryExpr{Operator: TildaStr, Expr: yyDollar[2].expr} } case 189: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1074 + //line sql.y:1068 { yyVAL.expr = &UnaryExpr{Operator: BangStr, Expr: yyDollar[2].expr} } case 190: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1078 + //line sql.y:1072 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -2625,343 +2612,343 @@ yydefault: } case 195: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1096 + //line sql.y:1090 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } case 196: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1100 + //line sql.y:1094 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 197: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1104 + //line sql.y:1098 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } case 198: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1114 + //line sql.y:1108 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } case 199: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1118 + //line sql.y:1112 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } case 200: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1122 + //line sql.y:1116 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 201: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1126 + //line sql.y:1120 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 202: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1130 + //line sql.y:1124 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 203: yyDollar = yyS[yypt-9 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1134 + //line sql.y:1128 { yyVAL.expr = &MatchExpr{Columns: yyDollar[3].columns, Expr: yyDollar[7].expr, Option: yyDollar[8].str} } case 204: yyDollar = yyS[yypt-7 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1138 + //line sql.y:1132 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].str, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str} } case 205: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1142 + //line sql.y:1136 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } case 206: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1146 + //line sql.y:1140 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colIdent} } case 207: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1156 + //line sql.y:1150 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } case 208: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1160 + //line sql.y:1154 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } case 209: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1164 + //line sql.y:1158 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } case 210: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1168 + //line sql.y:1162 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } case 211: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1173 + //line sql.y:1167 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } case 212: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1178 + //line sql.y:1172 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } case 213: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1183 + //line sql.y:1177 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } case 214: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1188 + //line sql.y:1182 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } case 217: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1202 + //line sql.y:1196 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } case 218: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1206 + //line sql.y:1200 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } case 219: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1210 + //line sql.y:1204 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } case 220: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1214 + //line sql.y:1208 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } case 221: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1220 + //line sql.y:1214 { yyVAL.str = "" } case 222: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1224 + //line sql.y:1218 { yyVAL.str = BooleanModeStr } case 223: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1228 + //line sql.y:1222 { yyVAL.str = NaturalLanguageModeStr } case 224: yyDollar = yyS[yypt-7 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1232 + //line sql.y:1226 { yyVAL.str = NaturalLanguageModeWithQueryExpansionStr } case 225: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1236 + //line sql.y:1230 { yyVAL.str = QueryExpansionStr } case 226: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1243 + //line sql.y:1237 { yyVAL.convertType = &ConvertType{Type: yyDollar[1].str} } case 227: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1247 + //line sql.y:1241 { yyVAL.convertType = &ConvertType{Type: yyDollar[1].str} } case 228: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1251 + //line sql.y:1245 { yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Length: NewIntVal(yyDollar[3].bytes)} } case 229: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1255 + //line sql.y:1249 { yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Length: NewIntVal(yyDollar[3].bytes), Charset: yyDollar[5].str} } case 230: yyDollar = yyS[yypt-7 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1259 + //line sql.y:1253 { yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Length: NewIntVal(yyDollar[3].bytes), Charset: yyDollar[7].str, Operator: CharacterSetStr} } case 231: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1263 + //line sql.y:1257 { yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Charset: yyDollar[2].str} } case 232: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1267 + //line sql.y:1261 { yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Charset: yyDollar[4].str, Operator: CharacterSetStr} } case 233: yyDollar = yyS[yypt-6 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1271 + //line sql.y:1265 { yyVAL.convertType = &ConvertType{Type: yyDollar[1].str, Length: NewIntVal(yyDollar[3].bytes), Scale: NewIntVal(yyDollar[5].bytes)} } case 234: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1276 + //line sql.y:1270 { yyVAL.expr = nil } case 235: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1280 + //line sql.y:1274 { yyVAL.expr = yyDollar[1].expr } case 236: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1285 + //line sql.y:1279 { yyVAL.str = string("") } case 237: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1289 + //line sql.y:1283 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } case 238: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1295 + //line sql.y:1289 { yyVAL.whens = []*When{yyDollar[1].when} } case 239: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1299 + //line sql.y:1293 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } case 240: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1305 + //line sql.y:1299 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } case 241: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1310 + //line sql.y:1304 { yyVAL.expr = nil } case 242: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1314 + //line sql.y:1308 { yyVAL.expr = yyDollar[2].expr } case 243: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1320 + //line sql.y:1314 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } case 244: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1324 + //line sql.y:1318 { yyVAL.colName = &ColName{Qualifier: &TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } case 245: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1328 + //line sql.y:1322 { yyVAL.colName = &ColName{Qualifier: &TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } case 246: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1334 + //line sql.y:1328 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } case 247: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1338 + //line sql.y:1332 { yyVAL.expr = NewHexVal(yyDollar[1].bytes) } case 248: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1342 + //line sql.y:1336 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } case 249: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1346 + //line sql.y:1340 { yyVAL.expr = NewFloatVal(yyDollar[1].bytes) } case 250: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1350 + //line sql.y:1344 { yyVAL.expr = NewHexNum(yyDollar[1].bytes) } case 251: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1354 + //line sql.y:1348 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } case 252: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1358 + //line sql.y:1352 { yyVAL.expr = &NullVal{} } case 253: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1364 + //line sql.y:1358 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -2972,249 +2959,249 @@ yydefault: } case 254: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1373 + //line sql.y:1367 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } case 255: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1377 + //line sql.y:1371 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } case 256: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1382 + //line sql.y:1376 { yyVAL.exprs = nil } case 257: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1386 + //line sql.y:1380 { yyVAL.exprs = yyDollar[3].exprs } case 258: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1391 + //line sql.y:1385 { yyVAL.expr = nil } case 259: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1395 + //line sql.y:1389 { yyVAL.expr = yyDollar[2].expr } case 260: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1400 + //line sql.y:1394 { yyVAL.orderBy = nil } case 261: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1404 + //line sql.y:1398 { yyVAL.orderBy = yyDollar[3].orderBy } case 262: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1410 + //line sql.y:1404 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } case 263: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1414 + //line sql.y:1408 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } case 264: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1420 + //line sql.y:1414 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].str} } case 265: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1425 + //line sql.y:1419 { yyVAL.str = AscScr } case 266: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1429 + //line sql.y:1423 { yyVAL.str = AscScr } case 267: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1433 + //line sql.y:1427 { yyVAL.str = DescScr } case 268: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1438 + //line sql.y:1432 { yyVAL.limit = nil } case 269: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1442 + //line sql.y:1436 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } case 270: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1446 + //line sql.y:1440 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } case 271: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1450 + //line sql.y:1444 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } case 272: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1455 + //line sql.y:1449 { yyVAL.str = "" } case 273: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1459 + //line sql.y:1453 { yyVAL.str = ForUpdateStr } case 274: yyDollar = yyS[yypt-4 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1463 + //line sql.y:1457 { yyVAL.str = ShareModeStr } case 275: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1469 + //line sql.y:1463 { yyVAL.columns = Columns{yyDollar[1].colIdent} } case 276: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1473 + //line sql.y:1467 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } case 277: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1486 + //line sql.y:1480 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } case 278: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1490 + //line sql.y:1484 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } case 279: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1494 + //line sql.y:1488 { // Drop the redundant parenthesis. yyVAL.ins = &Insert{Rows: yyDollar[2].selStmt} } case 280: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1499 + //line sql.y:1493 { 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 + //line sql.y:1497 { 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 + //line sql.y:1501 { // 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:1514 + //line sql.y:1508 { yyVAL.columns = Columns{yyDollar[1].colIdent} } case 284: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1518 + //line sql.y:1512 { yyVAL.columns = Columns{yyDollar[3].colIdent} } case 285: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1522 + //line sql.y:1516 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } case 286: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1526 + //line sql.y:1520 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } case 287: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1531 + //line sql.y:1525 { yyVAL.updateExprs = nil } case 288: yyDollar = yyS[yypt-5 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1535 + //line sql.y:1529 { yyVAL.updateExprs = yyDollar[5].updateExprs } case 289: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1541 + //line sql.y:1535 { yyVAL.values = Values{yyDollar[1].valTuple} } case 290: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1545 + //line sql.y:1539 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } case 291: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1551 + //line sql.y:1545 { yyVAL.valTuple = yyDollar[1].valTuple } case 292: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1555 + //line sql.y:1549 { yyVAL.valTuple = ValTuple{} } case 293: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1561 + //line sql.y:1555 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } case 294: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1567 + //line sql.y:1561 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = &ParenExpr{yyDollar[1].valTuple[0]} @@ -3224,199 +3211,199 @@ yydefault: } case 295: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1577 + //line sql.y:1571 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } case 296: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1581 + //line sql.y:1575 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } case 297: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1587 + //line sql.y:1581 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } case 300: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1596 + //line sql.y:1590 { yyVAL.byt = 0 } case 301: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1598 + //line sql.y:1592 { yyVAL.byt = 1 } case 302: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1601 + //line sql.y:1595 { yyVAL.empty = struct{}{} } case 303: yyDollar = yyS[yypt-3 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1603 + //line sql.y:1597 { yyVAL.empty = struct{}{} } case 304: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1606 + //line sql.y:1600 { yyVAL.str = "" } case 305: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1608 + //line sql.y:1602 { yyVAL.str = IgnoreStr } case 306: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1612 + //line sql.y:1606 { yyVAL.empty = struct{}{} } case 307: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1614 + //line sql.y:1608 { yyVAL.empty = struct{}{} } case 308: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1616 + //line sql.y:1610 { yyVAL.empty = struct{}{} } case 309: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1618 + //line sql.y:1612 { yyVAL.empty = struct{}{} } case 310: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1620 + //line sql.y:1614 { yyVAL.empty = struct{}{} } case 311: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1622 + //line sql.y:1616 { yyVAL.empty = struct{}{} } case 312: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1624 + //line sql.y:1618 { yyVAL.empty = struct{}{} } case 313: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1627 + //line sql.y:1621 { yyVAL.empty = struct{}{} } case 314: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1629 + //line sql.y:1623 { yyVAL.empty = struct{}{} } case 315: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1631 + //line sql.y:1625 { yyVAL.empty = struct{}{} } case 316: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1635 + //line sql.y:1629 { yyVAL.empty = struct{}{} } case 317: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1637 + //line sql.y:1631 { yyVAL.empty = struct{}{} } case 318: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1640 + //line sql.y:1634 { yyVAL.empty = struct{}{} } case 319: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1642 + //line sql.y:1636 { yyVAL.empty = struct{}{} } case 320: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1644 + //line sql.y:1638 { yyVAL.empty = struct{}{} } case 321: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1647 + //line sql.y:1641 { yyVAL.empty = struct{}{} } case 322: yyDollar = yyS[yypt-2 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1649 + //line sql.y:1643 { yyVAL.empty = struct{}{} } case 323: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1653 + //line sql.y:1647 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 324: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1657 + //line sql.y:1651 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 326: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1664 + //line sql.y:1658 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 327: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1670 + //line sql.y:1664 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 328: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1674 + //line sql.y:1668 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 330: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1681 + //line sql.y:1675 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 436: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1811 + //line sql.y:1805 { if incNesting(yylex) { yylex.Error("max nesting level reached") @@ -3425,31 +3412,31 @@ yydefault: } case 437: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1820 + //line sql.y:1814 { decNesting(yylex) } case 438: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1825 + //line sql.y:1819 { forceEOF(yylex) } case 439: yyDollar = yyS[yypt-0 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1830 + //line sql.y:1824 { forceEOF(yylex) } case 440: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1834 + //line sql.y:1828 { forceEOF(yylex) } case 441: yyDollar = yyS[yypt-1 : yypt+1] - //line ./go/vt/sqlparser/sql.y:1838 + //line sql.y:1832 { forceEOF(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 16c2b0c852a..433a8540a12 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -134,7 +134,7 @@ func forceEOF(yylex interface{}) { %token UNUSED %type command -%type select_statement base_select union union_select +%type select_statement base_select union_lhs union_rhs %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 @@ -233,13 +233,9 @@ select_statement: sel.Lock = $4 $$ = sel } -| union order_by_opt limit_opt lock_opt +| union_lhs union_op union_rhs order_by_opt limit_opt lock_opt { - uni := $1.(*Union) - uni.OrderBy = $2 - uni.Limit = $3 - uni.Lock = $4 - $$ = uni + $$ = &Union{Type: $2, Left: $1, Right: $3, OrderBy: $4, Limit: $5, Lock: $6} } | SELECT comment_opt cache_opt NEXT num_val for_from table_name { @@ -253,19 +249,17 @@ base_select: $$ = &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_lhs: + select_statement { - $$ = &Union{Type: $2, Left: $1, Right: $3} + $$ = $1 } -| union union_op union_select +| openb select_statement closeb { - $$ = &Union{Type: $2, Left: $1, Right: $3} + $$ = &ParenSelect{Select: $2} } -// union_select is a select that's part of a union. If unparenthesized, -// it cannot have an order by clause or beyond. -union_select: +union_rhs: base_select { $$ = $1 diff --git a/go/vt/topo/topoproto/shard.go b/go/vt/topo/topoproto/shard.go index 00d5115c23e..282b9ec02c3 100644 --- a/go/vt/topo/topoproto/shard.go +++ b/go/vt/topo/topoproto/shard.go @@ -30,17 +30,6 @@ func ParseKeyspaceShard(param string) (string, string, error) { return keySpaceShard[0], keySpaceShard[1], nil } -// ParseKeyspaceOptionalShard parses a "keyspace/shard" string -// and extracts the parts. If a shard is not specified, it's -// returned as empty string. -func ParseKeyspaceOptionalShard(keyspaceShard string) (string, string) { - last := strings.LastIndex(keyspaceShard, "/") - if last == -1 { - return keyspaceShard, "" - } - return keyspaceShard[:last], keyspaceShard[last+1:] -} - // SourceShardString returns a printable view of a SourceShard. func SourceShardString(source *topodatapb.Shard_SourceShard) string { return fmt.Sprintf("SourceShard(%v,%v/%v)", source.Uid, source.Keyspace, source.Shard) diff --git a/go/vt/topo/topoproto/shard_test.go b/go/vt/topo/topoproto/shard_test.go index 22bc0d73810..ea8eb3313f4 100644 --- a/go/vt/topo/topoproto/shard_test.go +++ b/go/vt/topo/topoproto/shard_test.go @@ -31,36 +31,6 @@ func TestParseKeyspaceShard(t *testing.T) { } } -func TestParseKeyspaceOptionalShard(t *testing.T) { - testcases := []struct { - keyspaceShard string - keyspace string - shard string - }{{ - keyspaceShard: "ks", - keyspace: "ks", - shard: "", - }, { - keyspaceShard: "/-80", - keyspace: "", - shard: "-80", - }, { - keyspaceShard: "ks/-80", - keyspace: "ks", - shard: "-80", - }, { - keyspaceShard: "ks/", - keyspace: "ks", - shard: "", - }} - - for _, tcase := range testcases { - if keyspace, shard := ParseKeyspaceOptionalShard(tcase.keyspaceShard); keyspace != tcase.keyspace || shard != tcase.shard { - t.Errorf("parseKeyspaceShard(%s): %s:%s, want %s:%s", tcase.keyspaceShard, keyspace, shard, tcase.keyspace, tcase.shard) - } - } -} - func TestSourceShardAsHTML(t *testing.T) { s := &topodatapb.Shard_SourceShard{ Uid: 123, diff --git a/go/vt/utils/utils.go b/go/vt/utils/utils.go index 67ff3a70268..f931491b691 100644 --- a/go/vt/utils/utils.go +++ b/go/vt/utils/utils.go @@ -2,7 +2,7 @@ package utils // utils.go contains general utility functions used in the splitquery package. -// cloneBindVariables returns a shallow-copy of the given bindVariables map. +// CloneBindVariables returns a shallow-copy of the given bindVariables map. func CloneBindVariables(bindVariables map[string]interface{}) map[string]interface{} { result := make(map[string]interface{}, len(bindVariables)) for key, value := range bindVariables { @@ -11,11 +11,11 @@ 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 +// TruncateQuery 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; + if len(query) <= 512 { + return query } - return query[:500] + " [TRUNCATED]"; + return query[:500] + " [TRUNCATED]" } diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go index 1f120d725a6..39bf624fd33 100644 --- a/go/vt/vtgate/vtgate.go +++ b/go/vt/vtgate/vtgate.go @@ -34,6 +34,8 @@ import ( "github.com/youtube/vitess/go/vt/vtgate/gateway" "github.com/youtube/vitess/go/vt/vtgate/vtgateservice" + "strings" + querypb "github.com/youtube/vitess/go/vt/proto/query" topodatapb "github.com/youtube/vitess/go/vt/proto/topodata" vtgatepb "github.com/youtube/vitess/go/vt/proto/vtgate" @@ -248,7 +250,7 @@ func (vtg *VTGate) Execute(ctx context.Context, sql string, bindVariables map[st vtg.localBegin(session) } - keyspace, shard := topoproto.ParseKeyspaceOptionalShard(keyspaceShard) + keyspace, shard := parseKeyspaceOptionalShard(keyspaceShard) if shard != "" { sql = sqlannotation.AnnotateIfDML(sql, nil) f := func(keyspace string) (string, []string, error) { @@ -578,7 +580,7 @@ func (vtg *VTGate) StreamExecute(ctx context.Context, sql string, bindVariables statsKey := []string{"StreamExecute", "Any", ltt} defer vtg.timings.Record(statsKey, startTime) - keyspace, shard := topoproto.ParseKeyspaceOptionalShard(keyspaceShard) + keyspace, shard := parseKeyspaceOptionalShard(keyspaceShard) var err error if shard != "" { err = vtg.resolver.streamExecute( @@ -1043,3 +1045,15 @@ func annotateBoundShardQueriesAsUnfriendly(queries []*vtgatepb.BoundShardQuery) queries[i].Query.Sql = sqlannotation.AnnotateIfDML(q.Query.Sql, nil) } } + +// parseKeyspaceOptionalShard parses a "keyspace/shard" or "keyspace:shard" string +// and extracts the parts. If a shard is not specified, it's +// returned as empty string. We need to support : and / in vtgate because some clients +// can't support our default of /. Everywhere else we only support /. +func parseKeyspaceOptionalShard(keyspaceShard string) (string, string) { + last := strings.LastIndexAny(keyspaceShard, "/:") + if last == -1 { + return keyspaceShard, "" + } + return keyspaceShard[:last], keyspaceShard[last+1:] +} diff --git a/go/vt/vtgate/vtgate_test.go b/go/vt/vtgate/vtgate_test.go index 0cdf336ca96..600c5e25fdc 100644 --- a/go/vt/vtgate/vtgate_test.go +++ b/go/vt/vtgate/vtgate_test.go @@ -2683,3 +2683,29 @@ func TestVTGateShowMetadataTwoShards(t *testing.T) { t.Errorf("shard %s not found in Values \n%+v", shard1, qr.Rows) } } + +func TestParseKeyspaceOptionalShard(t *testing.T) { + testcases := []struct { + keyspaceShard string + keyspace string + shard string + }{{ + keyspaceShard: "ks", + keyspace: "ks", + shard: "", + }, { + keyspaceShard: "ks/-80", + keyspace: "ks", + shard: "-80", + }, { + keyspaceShard: "ks:-80", + keyspace: "ks", + shard: "-80", + }} + + for _, tcase := range testcases { + if keyspace, shard := parseKeyspaceOptionalShard(tcase.keyspaceShard); keyspace != tcase.keyspace || shard != tcase.shard { + t.Errorf("parseKeyspaceShard(%s): %s:%s, want %s:%s", tcase.keyspaceShard, keyspace, shard, tcase.keyspace, tcase.shard) + } + } +} diff --git a/go/vt/workflow/node.go b/go/vt/workflow/node.go index 11aaa3bf951..06185ee4c5e 100644 --- a/go/vt/workflow/node.go +++ b/go/vt/workflow/node.go @@ -415,10 +415,17 @@ func (m *NodeManager) Action(ctx context.Context, ap *ActionParameters) error { if err != nil { return err } + + m.mu.Lock() + if n.Listener == nil { + m.mu.Unlock() return fmt.Errorf("Action %v is invoked on a node without listener (node path is %v)", ap.Name, ap.Path) } - return n.Listener.Action(ctx, ap.Path, ap.Name) + nodeListener := n.Listener + m.mu.Unlock() + + return nodeListener.Action(ctx, ap.Path, ap.Name) } func (m *NodeManager) getNodeByPath(nodePath string) (*Node, error) { diff --git a/go/vt/workflow/resharding/horizontal_resharding_workflow_test.go b/go/vt/workflow/resharding/horizontal_resharding_workflow_test.go index 1c29c9a52df..76d6e416f1d 100644 --- a/go/vt/workflow/resharding/horizontal_resharding_workflow_test.go +++ b/go/vt/workflow/resharding/horizontal_resharding_workflow_test.go @@ -83,8 +83,11 @@ func TestHorizontalResharding(t *testing.T) { func setupFakeVtworker(keyspace, vtworkers string) *fakevtworkerclient.FakeVtworkerClient { flag.Set("vtworker_client_protocol", "fake") fakeVtworkerClient := fakevtworkerclient.NewFakeVtworkerClient() + fakeVtworkerClient.RegisterResultForAddr(vtworkers, []string{"Reset"}, "", nil) fakeVtworkerClient.RegisterResultForAddr(vtworkers, []string{"SplitClone", "--min_healthy_rdonly_tablets=1", keyspace + "/0"}, "", nil) + fakeVtworkerClient.RegisterResultForAddr(vtworkers, []string{"Reset"}, "", nil) fakeVtworkerClient.RegisterResultForAddr(vtworkers, []string{"SplitDiff", "--min_healthy_rdonly_tablets=1", keyspace + "/-80"}, "", nil) + fakeVtworkerClient.RegisterResultForAddr(vtworkers, []string{"Reset"}, "", nil) fakeVtworkerClient.RegisterResultForAddr(vtworkers, []string{"SplitDiff", "--min_healthy_rdonly_tablets=1", keyspace + "/80-"}, "", nil) return fakeVtworkerClient } diff --git a/go/vt/workflow/resharding/tasks.go b/go/vt/workflow/resharding/tasks.go index da7ca7bcb8f..70a489744a2 100644 --- a/go/vt/workflow/resharding/tasks.go +++ b/go/vt/workflow/resharding/tasks.go @@ -56,7 +56,9 @@ func (hw *HorizontalReshardingWorkflow) runSplitClone(ctx context.Context, t *wo sourceKeyspaceShard := topoproto.KeyspaceShardString(keyspace, sourceShard) // Reset the vtworker to avoid error if vtworker command has been called elsewhere. // This is because vtworker class doesn't cleanup the environment after execution. - automation.ExecuteVtworker(ctx, worker, []string{"Reset"}) + if _, err := automation.ExecuteVtworker(ctx, worker, []string{"Reset"}); err != nil { + return err + } // The flag min_healthy_rdonly_tablets is set to 1 (default value is 2). // Therefore, we can reuse the normal end to end test setting, which has only 1 rdonly tablet. // TODO(yipeiw): Add min_healthy_rdonly_tablets as an input argument in UI. @@ -76,7 +78,9 @@ func (hw *HorizontalReshardingWorkflow) runSplitDiff(ctx context.Context, t *wor destShard := t.Attributes["destination_shard"] worker := t.Attributes["vtworker"] - automation.ExecuteVtworker(hw.ctx, worker, []string{"Reset"}) + if _, err := automation.ExecuteVtworker(hw.ctx, worker, []string{"Reset"}); err != nil { + return err + } args := []string{"SplitDiff", "--min_healthy_rdonly_tablets=1", topoproto.KeyspaceShardString(keyspace, destShard)} _, err := automation.ExecuteVtworker(ctx, worker, args) return err diff --git a/go/zk/zkctl/zksrv.sh b/go/zk/zkctl/zksrv.sh index a13dab5a2c3..4fed6666245 100755 --- a/go/zk/zkctl/zksrv.sh +++ b/go/zk/zkctl/zksrv.sh @@ -23,7 +23,7 @@ log() { return 0 } -for java in /usr/local/bin/java /usr/bin/java; do +for java in /usr/local/bin/java /usr/bin/java $JAVA_HOME/bin/java; do if [ -x "$java" ]; then break fi diff --git a/test/cluster/keytar/config/vitess_config.yaml b/test/cluster/keytar/config/vitess_config.yaml index e285661a95b..7402ee0903c 100644 --- a/test/cluster/keytar/config/vitess_config.yaml +++ b/test/cluster/keytar/config/vitess_config.yaml @@ -3,8 +3,8 @@ install: - python-mysqldb extra: - apt-get update - - wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz - - tar -C /usr/local -xzf go1.7.4.linux-amd64.tar.gz + - wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz + - tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz - wget https://storage.googleapis.com/kubernetes-helm/helm-v2.1.3-linux-amd64.tar.gz - tar -zxvf helm-v2.1.3-linux-amd64.tar.gz - pip install numpy diff --git a/test/vtctld_web_test.py b/test/vtctld_web_test.py index 9378293a59f..466b1970281 100755 --- a/test/vtctld_web_test.py +++ b/test/vtctld_web_test.py @@ -411,8 +411,8 @@ def test_dashboard_validate(self): dialog = dashboard_content.find_element_by_tag_name('vt-dialog') dialog_command = self._get_dialog_cmd(dialog) logging.info('Validate command: %s', ', '.join(dialog_command)) - self.assertEqual(1, len(dialog_command)) - self.assertListEqual(['Validate'], dialog_command) + self.assertEqual(2, len(dialog_command)) + self.assertListEqual(['Validate', '-ping-tablets=false'], dialog_command) # Validate Dialog Checkbox is working self._toggle_dialog_checkbox(dialog, 0) @@ -447,17 +447,19 @@ def test_create_keyspace(self): dialog_command = [ cmd.text for cmd in dialog.find_elements_by_class_name('vt-sheet')] logging.info('Create keyspace command: %s', ', '.join(dialog_command)) - self.assertEqual(2, len(dialog_command)) - self.assertListEqual(['CreateKeyspace', 'test_keyspace3'], dialog_command) + self.assertEqual(3, len(dialog_command)) + self.assertListEqual(['CreateKeyspace', '-force=false', 'test_keyspace3'], + dialog_command) # Create Keyspace autopopulates sharding_column type sharding_col_name_field.send_keys('test_id') dialog_command = [ cmd.text for cmd in dialog.find_elements_by_class_name('vt-sheet')] logging.info('Create keyspace command: %s', ', '.join(dialog_command)) - self.assertEqual(4, len(dialog_command)) + self.assertEqual(5, len(dialog_command)) self.assertListEqual(['CreateKeyspace', '-sharding_column_name=test_id', - '-sharding_column_type=UINT64', 'test_keyspace3'], + '-sharding_column_type=UINT64', '-force=false', + 'test_keyspace3'], dialog_command) # Dropdown works @@ -468,9 +470,10 @@ def test_create_keyspace(self): dialog_command = [ cmd.text for cmd in dialog.find_elements_by_class_name('vt-sheet')] logging.info('Create keyspace command: %s', ', '.join(dialog_command)) - self.assertEqual(4, len(dialog_command)) + self.assertEqual(5, len(dialog_command)) self.assertListEqual(['CreateKeyspace', '-sharding_column_name=test_id', - '-sharding_column_type=BYTES', 'test_keyspace3'], + '-sharding_column_type=BYTES', '-force=false', + 'test_keyspace3'], dialog_command) create = dialog.find_element_by_id('vt-action') diff --git a/vitess.io/_includes/left-nav-menu.html b/vitess.io/_includes/left-nav-menu.html index 688fdc29e68..226e5438701 100644 --- a/vitess.io/_includes/left-nav-menu.html +++ b/vitess.io/_includes/left-nav-menu.html @@ -31,6 +31,7 @@

    User Guide

  5. Sharding
  6. diff --git a/vitess.io/user-guide/horizontal-sharding-workflow.md b/vitess.io/user-guide/horizontal-sharding-workflow.md new file mode 100644 index 00000000000..693d56baf36 --- /dev/null +++ b/vitess.io/user-guide/horizontal-sharding-workflow.md @@ -0,0 +1,16 @@ +--- +layout: doc +title: "Horizontal Sharding Workflow" +description: +modified: +excerpt: +tags: [] +image: + feature: + teaser: + thumb: +toc: true +share: false +--- + +{% include doc/HorizontalReshardingWorkflowGuide.md %} diff --git a/vitess.io/user-guide/sharding-kubernetes-workflow.md b/vitess.io/user-guide/sharding-kubernetes-workflow.md new file mode 100644 index 00000000000..03d44a9d4be --- /dev/null +++ b/vitess.io/user-guide/sharding-kubernetes-workflow.md @@ -0,0 +1,16 @@ +--- +layout: doc +title: "Sharding in Kubernetes Using Workflow" +description: +modified: +excerpt: +tags: [] +image: + feature: + teaser: + thumb: +toc: true +share: false +--- + +{% include doc/ShardingKubernetesWorkflow.md %}