From ab39f3680e0c2d736f248f280d95ab02b39830fb Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 14:55:54 +0100 Subject: [PATCH 01/53] Add manan and florent to Docker files CODEOWNERS (#11983) Signed-off-by: Florent Poinsard Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2a4f4dbb866..a0a380c7712 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,7 +4,7 @@ bootstrap.sh @ajm188 @deepthi @frouioui @vmg /.github/workflows/ @deepthi @frouioui @mattlord /config/mycnf/ @deepthi @shlomi-noach @mattlord /doc/ @deepthi @frouioui @GuptaManan100 @rsajwani -/docker/ @deepthi @derekperkins @dkhenry @mattlord +/docker/ @deepthi @derekperkins @dkhenry @mattlord @GuptaManan100 @frouioui /examples/compose @shlomi-noach @GuptaManan100 @frouioui /examples/demo @mattlord @rohit-nayak-ps /examples/legacy_local @deepthi From 99a735ce5103e4781b9c6328dc40baaa637fee7b Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 4 Jan 2023 16:52:11 +0530 Subject: [PATCH 02/53] [release-15.0] Fix rbac config in the vtop example (#12034) (#12038) * feat: fix rbac config in the operator example Signed-off-by: Manan Gupta * feat: fix clusters value too Signed-off-by: Manan Gupta Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- examples/operator/101_initial_cluster.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index e959ca96ba3..abb22ebe85f 100644 --- a/examples/operator/101_initial_cluster.yaml +++ b/examples/operator/101_initial_cluster.yaml @@ -236,8 +236,7 @@ stringData: clusters: ["*"] - resource: "Shard" actions: - - "emergency_reparent_shard" - - "planned_reparent_shard" + - "emergency_failover_shard" + - "planned_failover_shard" subjects: ["*"] - clusters: - - "local" + clusters: ["*"] From c36db54eca6ff223df8a13127d05ff385d3df5ae Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 4 Jan 2023 20:58:22 +0100 Subject: [PATCH 03/53] Fix `codeql` workflow timeout issue (#11760) (#11957) * increase the timeout to build binaries in codeql workflow Signed-off-by: Florent Poinsard * test codeql workflow on pr Signed-off-by: Florent Poinsard * addition of Slack Workflow Notification Signed-off-by: Florent Poinsard * addition of if condition to send slack message Signed-off-by: Florent Poinsard * fail if needed Signed-off-by: Florent Poinsard * clean up codeql workflow Signed-off-by: Florent Poinsard Signed-off-by: Florent Poinsard Signed-off-by: Florent Poinsard --- .github/workflows/codeql_analysis.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index 788e2f3a0b9..78640b780d8 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -78,11 +78,25 @@ jobs: sudo apt-get update sudo apt-get install percona-xtrabackup-24 - - name: Building last release's binaries - timeout-minutes: 10 + - name: Building binaries + timeout-minutes: 30 run: | source build.env make build - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 + + - name: Slack Workflow Notification + if: ${{ failure() }} + uses: Gamesight/slack-workflow-status@master + with: + repo_token: ${{secrets.GITHUB_TOKEN}} + slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} + channel: '#codeql' + name: 'CodeQL Workflows' + + - name: Fail if needed + if: ${{ failure() }} + run: | + exit 1 \ No newline at end of file From 7e6e2cf02898a1061efc6da665c87cacac926243 Mon Sep 17 00:00:00 2001 From: Florent Poinsard Date: Thu, 5 Jan 2023 15:16:25 +0100 Subject: [PATCH 04/53] fix typo Signed-off-by: Florent Poinsard --- doc/releasenotes/15_0_2_summary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/releasenotes/15_0_2_summary.md b/doc/releasenotes/15_0_2_summary.md index 6f3346efa47..b12a97879a5 100644 --- a/doc/releasenotes/15_0_2_summary.md +++ b/doc/releasenotes/15_0_2_summary.md @@ -3,7 +3,7 @@ ### Upgrade to `go1.18.9` Vitess `v15.0.2` now runs on `go1.18.9`. -The patch release of Go, `go1.18.9`, was one of the main reasons for this release as it includes an important security fixe to `net/http` package, which is use extensively by Vitess. +The patch release of Go, `go1.18.9`, was one of the main reasons for this release as it includes an important security fix to `net/http` package, which is used extensively by Vitess. Below is a summary of this patch release. You can learn more [here](https://groups.google.com/g/golang-announce/c/L_3rmdT0BMU). > go1.18.9 (released 2022-12-06) includes security fixes to the net/http and os packages, as well as bug fixes to cgo, the compiler, the runtime, and the crypto/x509 and os/exec packages. From 362213494c9c193c2d1031a6fe68321479959e9d Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Mon, 9 Jan 2023 16:54:01 -0800 Subject: [PATCH 05/53] mysqlctl: flags should be added to vtbackup (#12048) Signed-off-by: deepthi Signed-off-by: deepthi --- go/flags/endtoend/vtbackup.txt | 5 +++++ go/vt/mysqlctl/compression.go | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/go/flags/endtoend/vtbackup.txt b/go/flags/endtoend/vtbackup.txt index 7f8147265ab..a588976126d 100644 --- a/go/flags/endtoend/vtbackup.txt +++ b/go/flags/endtoend/vtbackup.txt @@ -12,6 +12,8 @@ Usage of vtbackup: --backup_storage_implementation string Which backup storage implementation to use for creating and restoring backups. --backup_storage_number_blocks int if backup_storage_compress is true, backup_storage_number_blocks sets the number of blocks that can be processed, at once, before the writer blocks, during compression (default is 2). It should be equal to the number of CPUs available for compression. (default 2) --ceph_backup_storage_config string Path to JSON config file for ceph backup storage. (default "ceph_backup_config.json") + --compression-engine-name string compressor engine used for compression. (default "pargzip") + --compression-level int what level to pass to the compressor. (default 1) --concurrency int (init restore parameter) how many concurrent files to restore at once (default 4) --consul_auth_static_file string JSON File to read the topos/tokens from. --db-credentials-file string db credentials file; send SIGHUP to reload this file @@ -63,6 +65,9 @@ Usage of vtbackup: --db_tls_min_version string Configures the minimal TLS version negotiated when SSL is enabled. Defaults to TLSv1.2. Options: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. --detach detached mode - run backups detached from the terminal --emit_stats If set, emit stats to push-based monitoring and stats backends + --external-compressor string command with arguments to use when compressing a backup. + --external-compressor-extension string extension to use when using an external compressor. + --external-decompressor string command with arguments to use when decompressing a backup. --file_backup_storage_root string Root directory for the file backup storage. --gcs_backup_storage_bucket string Google Cloud Storage bucket to use for backups. --gcs_backup_storage_root string Root prefix for all backup-related object names. diff --git a/go/vt/mysqlctl/compression.go b/go/vt/mysqlctl/compression.go index 4687bec0265..ea8f96cc100 100644 --- a/go/vt/mysqlctl/compression.go +++ b/go/vt/mysqlctl/compression.go @@ -65,7 +65,7 @@ var ( ) func init() { - for _, cmd := range []string{"vtcombo", "vttablet", "vttestserver", "vtctld", "vtctldclient"} { + for _, cmd := range []string{"vtbackup", "vtcombo", "vttablet", "vttestserver", "vtctld", "vtctldclient"} { servenv.OnParseFor(cmd, registerBackupCompressionFlags) } } From 97c70ece2a5a2c669ef8ec80bec2a6cc3eb1d365 Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Thu, 12 Jan 2023 16:17:47 -0800 Subject: [PATCH 06/53] [15.0] CI: remove pitrtls test (#12064) * CI: remove pitrtls test Signed-off-by: deepthi * feat: update onclose timeout to 10 seconds Signed-off-by: Manan Gupta Signed-off-by: deepthi * test: fix unit test Signed-off-by: Manan Gupta * test: fix flaky test by not checking for an error Signed-off-by: Manan Gupta * feat: handle the case of empty hostname in tablet initialization Signed-off-by: Manan Gupta * CI: don't run backup_transform tests during upgrade/downgrade because it has been removed in v16 Signed-off-by: deepthi * flaky test fix - use new flag in v15 Signed-off-by: deepthi Signed-off-by: deepthi Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- .github/workflows/cluster_endtoend_26.yml | 107 ---- go/flags/endtoend/mysqlctl.txt | 2 +- go/flags/endtoend/mysqlctld.txt | 2 +- go/flags/endtoend/vtctld.txt | 2 +- go/flags/endtoend/vtgate.txt | 2 +- go/flags/endtoend/vtorc.txt | 2 +- go/flags/endtoend/vttablet.txt | 2 +- go/flags/endtoend/vttestserver.txt | 2 +- .../recovery/pitrtls/shardedpitr_tls_test.go | 544 ------------------ go/test/endtoend/reparent/utils/utils.go | 6 +- .../replication_manager/tablet_test.go | 3 +- go/vt/servenv/servenv.go | 2 +- go/vt/servenv/servenv_test.go | 4 +- go/vt/vttablet/tabletmanager/tm_init.go | 4 + test/ci_workflow_gen.go | 1 - test/config.json | 13 +- 16 files changed, 20 insertions(+), 678 deletions(-) delete mode 100644 .github/workflows/cluster_endtoend_26.yml delete mode 100644 go/test/endtoend/recovery/pitrtls/shardedpitr_tls_test.go diff --git a/.github/workflows/cluster_endtoend_26.yml b/.github/workflows/cluster_endtoend_26.yml deleted file mode 100644 index 40f1c0663f0..00000000000 --- a/.github/workflows/cluster_endtoend_26.yml +++ /dev/null @@ -1,107 +0,0 @@ -# DO NOT MODIFY: THIS FILE IS GENERATED USING "make generate_ci_workflows" - -name: Cluster (26) -on: [push, pull_request] -concurrency: - group: format('{0}-{1}', ${{ github.ref }}, 'Cluster (26)') - cancel-in-progress: true - -jobs: - build: - name: Run endtoend tests on Cluster (26) - runs-on: ubuntu-20.04 - permissions: - id-token: write - contents: read - - steps: - - name: Check if workflow needs to be skipped - id: skip-workflow - run: | - skip='false' - if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then - skip='true' - fi - echo Skip ${skip} - echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - - name: Check out code - if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 - - - name: Check for changes in relevant files - if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: frouioui/paths-filter@main - id: changes - with: - token: '' - filters: | - end_to_end: - - 'go/**/*.go' - - 'test.go' - - 'Makefile' - - 'build.env' - - 'go.sum' - - 'go.mod' - - 'proto/*.proto' - - 'tools/**' - - 'config/**' - - 'bootstrap.sh' - - '.github/workflows/cluster_endtoend_26.yml' - - - name: Set up Go - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 - with: - go-version: 1.18.9 - - - name: Set up python - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 - - - name: Tune the OS - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - # Limit local port range to not use ports that overlap with server side - # ports that we listen on. - sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # Increase the asynchronous non-blocking I/O. More information at https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_use_native_aio - echo "fs.aio-max-nr = 1048576" | sudo tee -a /etc/sysctl.conf - sudo sysctl -p /etc/sysctl.conf - - - name: Get dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - - # Get key to latest MySQL repo - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29 - # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.20-1_all.deb - echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections - sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* - sudo apt-get update - # Install everything else we need, and configure - sudo apt-get install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils - - sudo service mysql stop - sudo service etcd stop - sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ - sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld - go mod download - - # install JUnit report formatter - go install github.com/vitessio/go-junit-report@HEAD - - - name: Run cluster endtoend test - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 45 - run: | - # We set the VTDATAROOT to the /tmp folder to reduce the file path of mysql.sock file - # which musn't be more than 107 characters long. - export VTDATAROOT="/tmp/" - source build.env - - set -x - - # run the tests however you normally do, then produce a JUnit XML file - eatmydata -- go run test.go -docker=false -follow -shard 26 diff --git a/go/flags/endtoend/mysqlctl.txt b/go/flags/endtoend/mysqlctl.txt index 6444c8f4575..c9f500d7b74 100644 --- a/go/flags/endtoend/mysqlctl.txt +++ b/go/flags/endtoend/mysqlctl.txt @@ -67,7 +67,7 @@ Global flags: --mysqlctl_client_protocol string the protocol to use to talk to the mysqlctl server (default "grpc") --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. --pool_hostname_resolve_interval duration if set force an update to all hostnames and reconnect if changed, defaults to 0 (disabled) diff --git a/go/flags/endtoend/mysqlctld.txt b/go/flags/endtoend/mysqlctld.txt index f34697b39ef..f0a00822a1e 100644 --- a/go/flags/endtoend/mysqlctld.txt +++ b/go/flags/endtoend/mysqlctld.txt @@ -71,7 +71,7 @@ Usage of mysqlctld: --mysql_socket string Path to the mysqld socket file --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. --pool_hostname_resolve_interval duration if set force an update to all hostnames and reconnect if changed, defaults to 0 (disabled) diff --git a/go/flags/endtoend/vtctld.txt b/go/flags/endtoend/vtctld.txt index 887a4da95bc..83eac50a108 100644 --- a/go/flags/endtoend/vtctld.txt +++ b/go/flags/endtoend/vtctld.txt @@ -65,7 +65,7 @@ Usage of vtctld: --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --opentsdb_uri string URI of opentsdb /api/put method --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index e9e8591896c..f6b6ef51945 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -118,7 +118,7 @@ Usage of vtgate: --mysql_tcp_version string Select tcp, tcp4, or tcp6 to control the socket type. (default "tcp") --no_scatter when set to true, the planner will fail instead of producing a plan that includes scatter queries --normalize_queries Rewrite queries with bind vars. Turn this off if the app itself sends normalized queries with bind vars. (default true) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --opentsdb_uri string URI of opentsdb /api/put method --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/flags/endtoend/vtorc.txt b/go/flags/endtoend/vtorc.txt index 74ab84c90d8..3c57dd3bddf 100644 --- a/go/flags/endtoend/vtorc.txt +++ b/go/flags/endtoend/vtorc.txt @@ -29,7 +29,7 @@ Usage of vtorc: --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. --port int port for the server diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 25807a7a687..09badc91a58 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -191,7 +191,7 @@ Usage of vttablet: --mysql_server_version string MySQL server version to advertise. --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --opentsdb_uri string URI of opentsdb /api/put method --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/flags/endtoend/vttestserver.txt b/go/flags/endtoend/vttestserver.txt index d30ab355abe..de7edcc522a 100644 --- a/go/flags/endtoend/vttestserver.txt +++ b/go/flags/endtoend/vttestserver.txt @@ -75,7 +75,7 @@ Usage of vttestserver: --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) --null_probability float The probability to initialize a field with 'NULL' if --initialize_with_random_data is true. Only applies to fields that can contain NULL values. (default 0.1) --num_shards strings Comma separated shard count (one per keyspace) (default [2]) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --persistent_mode If this flag is set, the MySQL data directory is not cleaned up when LocalCluster.TearDown() is called. This is useful for running vttestserver as a database container in local developer environments. Note that db migration files (--schema_dir option) and seeding of random data (--initialize_with_random_data option) will only run during cluster startup if the data directory does not already exist. vschema migrations are run every time the cluster starts, since persistence for the topology server has not been implemented yet --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/test/endtoend/recovery/pitrtls/shardedpitr_tls_test.go b/go/test/endtoend/recovery/pitrtls/shardedpitr_tls_test.go deleted file mode 100644 index ab0020d3734..00000000000 --- a/go/test/endtoend/recovery/pitrtls/shardedpitr_tls_test.go +++ /dev/null @@ -1,544 +0,0 @@ -/* -Copyright 2020 The Vitess Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package pitrtls - -import ( - "context" - "crypto/x509" - "encoding/pem" - "fmt" - "os" - "os/exec" - "path" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "vitess.io/vitess/go/mysql" - "vitess.io/vitess/go/test/endtoend/cluster" - "vitess.io/vitess/go/vt/log" -) - -var ( - createTable = `create table product (id bigint(20) primary key, name char(10), created bigint(20));` - insertTable = `insert into product (id, name, created) values(%d, '%s', unix_timestamp());` - getCountID = `select count(*) from product` -) - -var ( - clusterInstance *cluster.LocalProcessCluster - - primary *cluster.Vttablet - replica *cluster.Vttablet - shard0Primary *cluster.Vttablet - shard0Replica *cluster.Vttablet - shard1Primary *cluster.Vttablet - shard1Replica *cluster.Vttablet - - cell = "zone1" - hostname = "localhost" - keyspaceName = "ks" - restoreKS1Name = "restoreks1" - restoreKS2Name = "restoreks2" - restoreKS3Name = "restoreks3" - shardName = "0" - shard0Name = "-80" - shard1Name = "80-" - dbName = "vt_ks" - mysqlUserName = "vt_dba" - mysqlPassword = "password" - vSchema = `{ - "sharded": true, - "vindexes": { - "hash_index": { - "type": "hash" - } - }, - "tables": { - "product": { - "column_vindexes": [ - { - "column": "id", - "name": "hash_index" - } - ] - } - } - }` - commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", - "--vreplication_retry_delay", "1s", - "--degraded_threshold", "5s", - "--lock_tables_timeout", "5s", - "--watch_replication_stream", - "--serving_state_grace_period", "1s"} -) - -func removeTablets(t *testing.T, tablets []*cluster.Vttablet) { - var mysqlProcs []*exec.Cmd - for _, tablet := range tablets { - proc, _ := tablet.MysqlctlProcess.StopProcess() - mysqlProcs = append(mysqlProcs, proc) - } - for _, proc := range mysqlProcs { - err := proc.Wait() - require.NoError(t, err) - } - for _, tablet := range tablets { - tablet.VttabletProcess.TearDown() - } -} - -func initializeCluster(t *testing.T) { - clusterInstance = cluster.NewCluster(cell, hostname) - - // Start topo server - err := clusterInstance.StartTopo() - require.NoError(t, err) - - // Start keyspace - keyspace := &cluster.Keyspace{ - Name: keyspaceName, - } - clusterInstance.Keyspaces = append(clusterInstance.Keyspaces, *keyspace) - - shard := &cluster.Shard{ - Name: shardName, - } - shard0 := &cluster.Shard{ - Name: shard0Name, - } - shard1 := &cluster.Shard{ - Name: shard1Name, - } - - // Defining all the tablets - primary = clusterInstance.NewVttabletInstance("replica", 0, "") - replica = clusterInstance.NewVttabletInstance("replica", 0, "") - shard0Primary = clusterInstance.NewVttabletInstance("replica", 0, "") - shard0Replica = clusterInstance.NewVttabletInstance("replica", 0, "") - shard1Primary = clusterInstance.NewVttabletInstance("replica", 0, "") - shard1Replica = clusterInstance.NewVttabletInstance("replica", 0, "") - - shard.Vttablets = []*cluster.Vttablet{primary, replica} - shard0.Vttablets = []*cluster.Vttablet{shard0Primary, shard0Replica} - shard1.Vttablets = []*cluster.Vttablet{shard1Primary, shard1Replica} - - clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, commonTabletArg...) - clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--restore_from_backup") - - err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard, *shard0, *shard1}) - require.NoError(t, err) - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) - out, err := vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") - require.NoError(t, err, out) - // Start MySql - var mysqlCtlProcessList []*exec.Cmd - for _, shard := range clusterInstance.Keyspaces[0].Shards { - for _, tablet := range shard.Vttablets { - tablet.MysqlctlProcess.SecureTransport = true - proc, err := tablet.MysqlctlProcess.StartProcess() - require.NoError(t, err) - mysqlCtlProcessList = append(mysqlCtlProcessList, proc) - } - } - - // Wait for mysql processes to start - for _, proc := range mysqlCtlProcessList { - err = proc.Wait() - require.NoError(t, err) - } - - queryCmds := []string{ - fmt.Sprintf("CREATE USER '%s'@'%%' IDENTIFIED BY '%s';", mysqlUserName, mysqlPassword), - fmt.Sprintf("GRANT ALL ON *.* TO '%s'@'%%';", mysqlUserName), - fmt.Sprintf("GRANT GRANT OPTION ON *.* TO '%s'@'%%';", mysqlUserName), - fmt.Sprintf("create database %s;", "vt_ks"), - "FLUSH PRIVILEGES;", - } - - for _, tablet := range []*cluster.Vttablet{primary, replica, shard0Primary, shard0Replica, shard1Primary, shard1Replica} { - for _, query := range queryCmds { - _, err = tablet.VttabletProcess.QueryTablet(query, keyspace.Name, false) - require.NoError(t, err) - } - - err = tablet.VttabletProcess.Setup() - require.NoError(t, err) - } - - err = clusterInstance.VtctlclientProcess.InitShardPrimary(keyspaceName, shard.Name, cell, primary.TabletUID) - require.NoError(t, err) - - // Start vtgate - err = clusterInstance.StartVtgate() - require.NoError(t, err) -} - -func insertRow(t *testing.T, id int, productName string, isSlow bool) { - ctx := context.Background() - vtParams := mysql.ConnParams{ - Host: clusterInstance.Hostname, - Port: clusterInstance.VtgateMySQLPort, - } - conn, err := mysql.Connect(ctx, &vtParams) - require.NoError(t, err) - defer conn.Close() - - insertSmt := fmt.Sprintf(insertTable, id, productName) - _, err = conn.ExecuteFetch(insertSmt, 1000, true) - require.NoError(t, err) - - if isSlow { - time.Sleep(1 * time.Second) - } -} - -func createRestoreKeyspace(t *testing.T, timeToRecover, restoreKeyspaceName string) { - output, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("CreateKeyspace", "--", - "--keyspace_type=SNAPSHOT", "--base_keyspace="+keyspaceName, - "--snapshot_time", timeToRecover, restoreKeyspaceName) - log.Info(output) - require.NoError(t, err) -} - -// Test pitr (Point in time recovery). -// ------------------------------------------- -// The following test will: -// - create a shard with primary and replica -// - run InitShardPrimary -// - insert some data using vtgate (e.g. here we have inserted rows 1,2) -// - verify the replication -// - take backup of replica -// - insert some data using vtgate (e.g. we inserted rows 3 4 5 6), while inserting row-4, note down the time (restoreTime1) -// - perform a resharding to create 2 shards (-80, 80-), and delete the old shard -// - insert some data using vtgate (e.g. we will insert 7 8 9 10) and verify we get required number of rows in -80, 80- shard -// - take backup of both shards -// - insert some more data using vtgate (e.g. we will insert 11 12 13 14 15), while inserting row-13, note down the time (restoreTime2) -// - note down the current time (restoreTime3) - -// - Till now we did all the presetup for assertions - -// - asserting that restoring to restoreTime1 (going from 2 shards to 1 shard) is working, i.e. we should get 4 rows. -// - asserting that while restoring if we give small timeout value, it will restore upto to the last available backup (asserting only -80 shard) -// - asserting that restoring to restoreTime2 (going from 2 shards to 2 shards with past time) is working, it will assert for both shards -// - asserting that restoring to restoreTime3 is working, we should get complete data after restoring, as we have in existing shards. -func TestTLSPITRRecovery(t *testing.T) { - defer cluster.PanicHandler(nil) - initializeCluster(t) - defer clusterInstance.Teardown() - - // Creating the table - _, err := primary.VttabletProcess.QueryTablet(createTable, keyspaceName, true) - require.NoError(t, err) - - insertRow(t, 1, "prd-1", false) - insertRow(t, 2, "prd-2", false) - - cluster.VerifyRowsInTabletForTable(t, replica, keyspaceName, 2, "product") - - // backup the replica - err = clusterInstance.VtctlclientProcess.ExecuteCommand("Backup", replica.Alias) - require.NoError(t, err) - - // check that the backup shows up in the listing - output, err := clusterInstance.ListBackups("ks/0") - require.NoError(t, err) - assert.Equal(t, 1, len(output)) - - // now insert some more data to simulate the changes after regular backup - // every insert has some time lag/difference to simulate the time gap between rows - // and when we recover to certain time, this time gap will be able to identify the exact eligible row - var restoreTime1 string - for counter := 3; counter <= 6; counter++ { - if counter == 4 { // we want to recovery till this, so noting the time - tm := time.Now().Add(1 * time.Second).UTC() - restoreTime1 = tm.Format(time.RFC3339) - } - insertRow(t, counter, fmt.Sprintf("prd-%d", counter), true) - } - - // creating restore keyspace with snapshot time as restoreTime1 - // Need to test this before resharding and we tear down the - // original mysql replica, which we use as a binlog source - createRestoreKeyspace(t, restoreTime1, restoreKS1Name) - - // Launching a recovery tablet which recovers data from the primary till the restoreTime1 - tlsTestTabletRecovery(t, replica, "2m", restoreKS1Name, "0", "INT64(4)") - - // starting resharding process - tlsPerformResharding(t) - - for counter := 7; counter <= 10; counter++ { - insertRow(t, counter, fmt.Sprintf("prd-%d", counter), false) - } - - // wait till all the shards have required data - cluster.VerifyRowsInTabletForTable(t, shard0Replica, keyspaceName, 6, "product") - cluster.VerifyRowsInTabletForTable(t, shard1Replica, keyspaceName, 4, "product") - - // take the backup (to simulate the regular backup) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("Backup", shard0Replica.Alias) - require.NoError(t, err) - // take the backup (to simulate the regular backup) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("Backup", shard1Replica.Alias) - require.NoError(t, err) - - backups, err := clusterInstance.ListBackups(keyspaceName + "/-80") - require.NoError(t, err) - require.Equal(t, len(backups), 1) - - backups, err = clusterInstance.ListBackups(keyspaceName + "/80-") - require.NoError(t, err) - require.Equal(t, len(backups), 1) - - // now insert some more data to simulate the changes after regular backup - // every insert has some time lag/difference to simulate the time gap between rows - // and when we recover to certain time, this time gap will be able to identify the exact eligible row - var restoreTime2 string - for counter := 11; counter <= 15; counter++ { - if counter == 13 { // we want to recovery till this, so noting the time - tm := time.Now().Add(1 * time.Second).UTC() - restoreTime2 = tm.Format(time.RFC3339) - } - insertRow(t, counter, fmt.Sprintf("prd-%d", counter), true) - } - restoreTime3 := time.Now().UTC().Format(time.RFC3339) - - // create restoreKeyspace with snapshot time as restoreTime2 - createRestoreKeyspace(t, restoreTime2, restoreKS2Name) - - // test the recovery with smaller binlog_lookup_timeout for shard0 - // since we have small lookup timeout, it will just get whatever available in the backup - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 1 | prd-1 | 1597219030 | - // | 2 | prd-2 | 1597219030 | - // | 3 | prd-3 | 1597219043 | - // | 5 | prd-5 | 1597219045 | - // | 9 | prd-9 | 1597219130 | - // | 10 | prd-10 | 1597219130 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard0Replica, "1ms", restoreKS2Name, "-80", "INT64(6)") - - // test the recovery with valid binlog_lookup_timeout for shard0 and getting the data till the restoreTime2 - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 1 | prd-1 | 1597219030 | - // | 2 | prd-2 | 1597219030 | - // | 3 | prd-3 | 1597219043 | - // | 5 | prd-5 | 1597219045 | - // | 9 | prd-9 | 1597219130 | - // | 10 | prd-10 | 1597219130 | - // | 13 | prd-13 | 1597219141 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard0Replica, "2m", restoreKS2Name, "-80", "INT64(7)") - - // test the recovery with valid binlog_lookup_timeout for shard1 and getting the data till the restoreTime2 - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 4 | prd-4 | 1597219044 | - // | 6 | prd-6 | 1597219046 | - // | 7 | prd-7 | 1597219130 | - // | 8 | prd-8 | 1597219130 | - // | 11 | prd-11 | 1597219139 | - // | 12 | prd-12 | 1597219140 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard1Replica, "2m", restoreKS2Name, "80-", "INT64(6)") - - // test the recovery with timetorecover > (timestamp of last binlog event in binlog server) - createRestoreKeyspace(t, restoreTime3, restoreKS3Name) - - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 1 | prd-1 | 1597219030 | - // | 2 | prd-2 | 1597219030 | - // | 3 | prd-3 | 1597219043 | - // | 5 | prd-5 | 1597219045 | - // | 9 | prd-9 | 1597219130 | - // | 10 | prd-10 | 1597219130 | - // | 13 | prd-13 | 1597219141 | - // | 15 | prd-15 | 1597219142 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard0Replica, "2m", restoreKS3Name, "-80", "INT64(8)") - - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 4 | prd-4 | 1597219044 | - // | 6 | prd-6 | 1597219046 | - // | 7 | prd-7 | 1597219130 | - // | 8 | prd-8 | 1597219130 | - // | 11 | prd-11 | 1597219139 | - // | 12 | prd-12 | 1597219140 | - // | 14 | prd-14 | 1597219142 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard1Replica, "2m", restoreKS3Name, "80-", "INT64(7)") -} - -func tlsPerformResharding(t *testing.T) { - err := clusterInstance.VtctlclientProcess.ApplyVSchema(keyspaceName, vSchema) - require.NoError(t, err) - - err = clusterInstance.VtctlProcess.ExecuteCommand("InitShardPrimary", "--", "--force", "ks/-80", shard0Primary.Alias) - require.NoError(t, err) - - err = clusterInstance.VtctlProcess.ExecuteCommand("InitShardPrimary", "--", "--force", "ks/80-", shard1Primary.Alias) - require.NoError(t, err) - - // we need to create the schema, and the worker will do data copying - for _, keyspaceShard := range []string{"ks/-80", "ks/80-"} { - err = clusterInstance.VtctlclientProcess.ExecuteCommand("CopySchemaShard", "ks/0", keyspaceShard) - require.NoError(t, err) - } - - err = clusterInstance.VtctlclientProcess.ExecuteCommand("Reshard", "ks.reshardWorkflow", "0", "--", "-80,80-") - require.NoError(t, err) - - err = clusterInstance.VtctlclientProcess.ExecuteCommand("SwitchReads", "--", "--tablet_type=rdonly", "ks.reshardWorkflow") - require.NoError(t, err) - - err = clusterInstance.VtctlclientProcess.ExecuteCommand("SwitchReads", "--", "--tablet_type=replica", "ks.reshardWorkflow") - require.NoError(t, err) - - // then serve primary from the split shards - err = clusterInstance.VtctlclientProcess.ExecuteCommand("SwitchWrites", "ks.reshardWorkflow") - require.NoError(t, err) - - // remove the original tablets in the original shard - removeTablets(t, []*cluster.Vttablet{primary, replica}) - - for _, tablet := range []*cluster.Vttablet{replica} { - err = clusterInstance.VtctlclientProcess.ExecuteCommand("DeleteTablet", tablet.Alias) - require.NoError(t, err) - } - err = clusterInstance.VtctlclientProcess.ExecuteCommand("DeleteTablet", "--", "--allow_primary", primary.Alias) - require.NoError(t, err) - - // rebuild the serving graph, all mentions of the old shards should be gone - err = clusterInstance.VtctlclientProcess.ExecuteCommand("RebuildKeyspaceGraph", "ks") - require.NoError(t, err) - - // delete the original shard - err = clusterInstance.VtctlclientProcess.ExecuteCommand("DeleteShard", "ks/0") - require.NoError(t, err) - - // Restart vtgate process - err = clusterInstance.VtgateProcess.TearDown() - require.NoError(t, err) - - err = clusterInstance.VtgateProcess.Setup() - require.NoError(t, err) - - clusterInstance.WaitForTabletsToHealthyInVtgate() -} - -func tlsTestTabletRecovery(t *testing.T, tabletForBinlogs *cluster.Vttablet, lookupTimeout, restoreKeyspaceName, shardName, expectedRows string) { - recoveryTablet := clusterInstance.NewVttabletInstance("replica", 0, cell) - tlsLaunchRecoveryTablet(t, recoveryTablet, tabletForBinlogs, lookupTimeout, restoreKeyspaceName, shardName) - - sqlRes, err := recoveryTablet.VttabletProcess.QueryTablet(getCountID, keyspaceName, true) - require.NoError(t, err) - assert.Equal(t, expectedRows, sqlRes.Rows[0][0].String()) - - defer recoveryTablet.MysqlctlProcess.Stop() - defer recoveryTablet.VttabletProcess.TearDown() -} - -func tlsLaunchRecoveryTablet(t *testing.T, tablet *cluster.Vttablet, tabletForBinlogs *cluster.Vttablet, lookupTimeout, restoreKeyspaceName, shardName string) { - tablet.MysqlctlProcess = *cluster.MysqlCtlProcessInstance(tablet.TabletUID, tablet.MySQLPort, clusterInstance.TmpDirectory) - tablet.MysqlctlProcess.SecureTransport = true - err := tablet.MysqlctlProcess.Start() - require.NoError(t, err) - - tablet.VttabletProcess = cluster.VttabletProcessInstance( - tablet.HTTPPort, - tablet.GrpcPort, - tablet.TabletUID, - clusterInstance.Cell, - shardName, - keyspaceName, - clusterInstance.VtctldProcess.Port, - tablet.Type, - clusterInstance.TopoProcess.Port, - clusterInstance.Hostname, - clusterInstance.TmpDirectory, - clusterInstance.VtTabletExtraArgs, - clusterInstance.EnableSemiSync, - clusterInstance.DefaultCharset) - tablet.Alias = tablet.VttabletProcess.TabletPath - tablet.VttabletProcess.SupportsBackup = true - tablet.VttabletProcess.Keyspace = restoreKeyspaceName - - certDir := path.Join(os.Getenv("VTDATAROOT"), fmt.Sprintf("/ssl_%010d", tablet.MysqlctlProcess.TabletUID)) - tablet.VttabletProcess.ExtraArgs = []string{ - "--disable_active_reparents", - "--enable_replication_reporter=false", - "--init_db_name_override", dbName, - "--init_tablet_type", "replica", - "--init_keyspace", restoreKeyspaceName, - "--init_shard", shardName, - "--binlog_host", clusterInstance.Hostname, - "--binlog_port", fmt.Sprintf("%d", tabletForBinlogs.MySQLPort), - "--binlog_user", mysqlUserName, - "--binlog_password", mysqlPassword, - "--binlog_ssl_ca", certDir + "/ca-cert.pem", - "--binlog_ssl_server_name", getCNFromCertPEM(certDir + "/server-001-cert.pem"), - "--pitr_gtid_lookup_timeout", lookupTimeout, - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", - "--vreplication_tablet_type", "replica", - "--vreplication_retry_delay", "1s", - "--degraded_threshold", "5s", - "--lock_tables_timeout", "5s", - "--watch_replication_stream", - "--serving_state_grace_period", "1s", - } - tablet.VttabletProcess.ServingStatus = "" - - err = tablet.VttabletProcess.Setup() - require.NoError(t, err) - - tablet.VttabletProcess.WaitForTabletStatusesForTimeout([]string{"SERVING"}, 20*time.Second) -} - -func getCNFromCertPEM(filename string) string { - pemBytes, _ := os.ReadFile(filename) - block, _ := pem.Decode(pemBytes) - cert, _ := x509.ParseCertificate(block.Bytes) - rdn := cert.Subject.ToRDNSequence()[0][0] - t := rdn.Type - - // 2.5.4.3 is ASN OID for "CN" - if len(t) == 4 && t[0] == 2 && t[1] == 5 && t[2] == 4 && t[3] == 3 { - return fmt.Sprintf("%s", rdn.Value) - } - // As good a fallback as any - return "localhost" -} diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index a3359d172d5..619eb1f3c59 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -113,6 +113,10 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s shard := &cluster.Shard{Name: shardName} shard.Vttablets = tablets + disableReplicationFlag := "--disable_active_reparents" + if clusterInstance.VtTabletMajorVersion >= 15 { + disableReplicationFlag = "--disable-replication-manager" + } clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--lock_tables_timeout", "5s", "--init_populate_metadata", @@ -129,7 +133,7 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s // the replication manager to silently fix the replication in case ERS or PRS mess up. All the // tests in this test suite should work irrespective of this flag. Each run of ERS, PRS should be // setting up the replication correctly. - "--disable_active_reparents") + disableReplicationFlag) // Initialize Cluster err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) diff --git a/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go b/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go index 3284ab65d49..d9a24b3b444 100644 --- a/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go +++ b/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go @@ -159,8 +159,7 @@ func waitForSourcePort(ctx context.Context, t *testing.T, tablet cluster.Vttable for time.Now().Before(timeout) { // Check that initially replication is setup correctly on the replica tablet replicaStatus, err := tmcGetReplicationStatus(ctx, tablet.GrpcPort) - require.NoError(t, err) - if replicaStatus.SourcePort == expectedPort { + if err == nil && replicaStatus.SourcePort == expectedPort { return nil } time.Sleep(300 * time.Millisecond) diff --git a/go/vt/servenv/servenv.go b/go/vt/servenv/servenv.go index f0144359d7f..0b82c93a347 100644 --- a/go/vt/servenv/servenv.go +++ b/go/vt/servenv/servenv.go @@ -78,7 +78,7 @@ var ( var ( lameduckPeriod = 50 * time.Millisecond onTermTimeout = 10 * time.Second - onCloseTimeout = time.Nanosecond + onCloseTimeout = 10 * time.Second catchSigpipe bool ) diff --git a/go/vt/servenv/servenv_test.go b/go/vt/servenv/servenv_test.go index 3d835fcea1a..b7bd874989a 100644 --- a/go/vt/servenv/servenv_test.go +++ b/go/vt/servenv/servenv_test.go @@ -65,9 +65,7 @@ func TestFireOnCloseHooksTimeout(t *testing.T) { time.Sleep(1 * time.Second) }) - // we deliberatly test the flag to make sure it's not accidently set to a - // high value. - if finished, want := fireOnCloseHooks(onCloseTimeout), false; finished != want { + if finished, want := fireOnCloseHooks(1*time.Nanosecond), false; finished != want { t.Errorf("finished = %v, want %v", finished, want) } } diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index f3a3d12a1d2..f2671b664d1 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -915,6 +915,10 @@ func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType t } // Set primary and start replication. + if currentPrimary.Tablet.MysqlHostname == "" { + log.Warningf("primary tablet in the shard record doesn't have mysql hostname specified. probably because that tablet shutdown.") + return nil, nil + } if err := tm.MysqlDaemon.SetReplicationSource(ctx, currentPrimary.Tablet.MysqlHostname, int(currentPrimary.Tablet.MysqlPort), false /* stopReplicationBefore */, true /* startReplicationAfter */); err != nil { return nil, vterrors.Wrap(err, "MysqlDaemon.SetReplicationSource failed") } diff --git a/test/ci_workflow_gen.go b/test/ci_workflow_gen.go index 7476d5bba89..d5e4f59cf48 100644 --- a/test/ci_workflow_gen.go +++ b/test/ci_workflow_gen.go @@ -79,7 +79,6 @@ var ( "21", "22", "mysql_server_vault", - "26", "vstream_failover", "vstream_stoponreshard_true", "vstream_stoponreshard_false", diff --git a/test/config.json b/test/config.json index 247bb04bb8d..6604456c064 100644 --- a/test/config.json +++ b/test/config.json @@ -125,7 +125,7 @@ "Manual": false, "Shard": "vtbackup_transform", "RetryMax": 1, - "Tags": ["upgrade_downgrade_backups"] + "Tags": [""] }, "backup_transform_mysqlctld": { "File": "unused.go", @@ -369,17 +369,6 @@ "site_test" ] }, - "pitrtls": { - "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/recovery/pitrtls"], - "Command": [], - "Manual": false, - "Shard": "26", - "RetryMax": 1, - "Tags": [ - "site_test" - ] - }, "recovery": { "File": "unused.go", "Args": ["vitess.io/vitess/go/test/endtoend/recovery/unshardedrecovery"], From 8024e6b7b3e8de3bf0d96d14c878daf567cc4167 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 18 Jan 2023 11:24:37 +0530 Subject: [PATCH 07/53] Fix: Date math with Interval keyword (#12082) (#12102) * feat: add failing parsing test and fix parser Signed-off-by: Manan Gupta * test: add e2e tests for interval with math functions Signed-off-by: Manan Gupta * test: explictly set the time-zone to prevent failures in CI Signed-off-by: Manan Gupta Signed-off-by: Manan Gupta Signed-off-by: Manan Gupta --- .../endtoend/vtgate/queries/misc/misc_test.go | 12 + go/vt/sqlparser/parse_test.go | 6 + go/vt/sqlparser/sql.go | 1856 ++++++++--------- go/vt/sqlparser/sql.y | 2 +- 4 files changed, 947 insertions(+), 929 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index fb66f395f9e..93fb8e28b42 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -89,3 +89,15 @@ func TestInvalidDateTimeTimestampVals(t *testing.T) { _, err = mcmp.ExecAllowAndCompareError(`select timestamp'2022'`) require.Error(t, err) } + +// TestIntervalWithMathFunctions tests that the Interval keyword can be used with math functions. +func TestIntervalWithMathFunctions(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + // Set the time zone explicitly to UTC, otherwise the output of FROM_UNIXTIME is going to be dependent + // on the time zone of the system. + mcmp.Exec("SET time_zone = '+00:00'") + mcmp.AssertMatches("select '2020-01-01' + interval month(DATE_SUB(FROM_UNIXTIME(1234), interval 1 month))-1 month", `[[CHAR("2020-12-01")]]`) + mcmp.AssertMatches("select DATE_ADD(MIN(FROM_UNIXTIME(1673444922)),interval -DAYOFWEEK(MIN(FROM_UNIXTIME(1673444922)))+1 DAY)", `[[DATETIME("2023-01-08 13:48:42")]]`) +} diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index bb3ab071820..020aa2d6b80 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -850,6 +850,12 @@ var ( }, { input: "select /* TIMESTAMPDIFF */ TIMESTAMPDIFF(MINUTE, '2008-01-02', '2008-01-04') from t", output: "select /* TIMESTAMPDIFF */ timestampdiff(MINUTE, '2008-01-02', '2008-01-04') from t", + }, { + input: "select DATE_ADD(MIN(FROM_UNIXTIME(1673444922)),interval -DAYOFWEEK(MIN(FROM_UNIXTIME(1673444922)))+1 DAY)", + output: "select DATE_ADD(min(FROM_UNIXTIME(1673444922)), interval (-DAYOFWEEK(min(FROM_UNIXTIME(1673444922))) + 1) DAY) from dual", + }, { + input: "select '2020-01-01' + interval month(DATE_SUB(FROM_UNIXTIME(1234), interval 1 month))-1 month", + output: "select '2020-01-01' + interval (month(DATE_SUB(FROM_UNIXTIME(1234), interval 1 month)) - 1) month from dual", }, { input: "select /* dual */ 1 from dual", }, { diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 8fd76760a4d..2852508634b 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1515,352 +1515,352 @@ const yyLast = 47864 var yyAct = [...]int{ 1496, 3085, 3497, 3086, 3087, 3319, 3467, 3424, 3508, 3466, - 802, 672, 3403, 3056, 1543, 652, 2913, 3369, 809, 2031, + 802, 672, 3403, 3056, 1543, 651, 2913, 3369, 809, 2031, 801, 2835, 3392, 1849, 2738, 2745, 2011, 3303, 3251, 2795, 2080, 2800, 2797, 2796, 2794, 2799, 2798, 5, 2786, 3301, 2351, 3043, 1114, 2699, 3115, 873, 2703, 2702, 2645, 3291, 2385, 2815, 2013, 2150, 654, 2814, 2700, 2952, 2424, 2580, - 3120, 764, 2946, 2051, 2753, 682, 2817, 1503, 2972, 2054, - 2697, 763, 762, 2687, 2035, 2411, 1973, 1063, 650, 928, - 2516, 2938, 769, 2113, 2484, 2841, 2564, 2138, 2118, 2485, - 1597, 2486, 2436, 768, 2181, 2068, 39, 2417, 2403, 157, - 1644, 2387, 38, 2056, 40, 1845, 2055, 1944, 1864, 1092, - 2556, 896, 897, 875, 1490, 2159, 2198, 143, 2043, 998, - 2137, 2120, 1803, 1626, 2478, 961, 956, 2453, 1532, 1970, - 1512, 2058, 1116, 1470, 664, 1352, 1822, 1868, 647, 1743, - 1280, 1633, 935, 1978, 2135, 932, 1725, 967, 936, 659, - 2109, 1531, 98, 99, 1517, 974, 962, 1747, 963, 887, - 1940, 1336, 884, 94, 1312, 79, 10, 93, 914, 9, - 916, 8, 1112, 877, 964, 881, 1106, 1752, 1592, 1618, - 1047, 885, 126, 127, 882, 100, 883, 909, 161, 658, - 121, 119, 120, 641, 899, 2036, 78, 1356, 3328, 92, - 2509, 3498, 1360, 101, 2152, 2153, 2154, 3354, 3044, 2783, - 2152, 87, 1943, 2507, 904, 908, 3164, 3166, 3165, 3183, - 3184, 3185, 3186, 3187, 3188, 3189, 704, 2539, 2538, 2196, - 128, 1710, 3036, 3355, 621, 3450, 1877, 2999, 122, 929, - 2572, 900, 2573, 89, 906, 906, 89, 3090, 1003, 3349, - 3350, 2239, 1810, 588, 1809, 1808, 627, 890, 89, 1281, - 923, 642, 891, 3090, 874, 1000, 818, 819, 820, 818, - 819, 820, 1807, 1979, 1806, 954, 876, 1825, 1017, 1018, - 1019, 1805, 1022, 1023, 1024, 1025, 978, 2, 1028, 1029, - 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, - 1040, 1041, 1042, 1043, 1044, 977, 924, 122, 1011, 952, - 951, 950, 898, 2805, 1783, 3404, 3445, 184, 953, 644, - 1497, 645, 2008, 2009, 1004, 1007, 1008, 2383, 2512, 105, - 106, 107, 2683, 110, 3089, 1281, 116, 1297, 2413, 185, - 2529, 123, 583, 145, 2185, 2805, 3518, 2649, 3350, 940, - 3089, 3454, 3452, 640, 166, 3465, 3488, 1020, 2802, 2918, - 2917, 2532, 869, 870, 871, 872, 1291, 945, 880, 2803, - 2183, 651, 922, 766, 767, 122, 3453, 3451, 3304, 2352, - 1466, 1815, 2129, 2860, 3247, 156, 3246, 89, 2184, 3049, - 3410, 144, 3050, 3410, 1002, 2809, 911, 912, 1001, 3479, - 80, 2803, 80, 80, 3257, 2123, 3448, 3256, 3068, 3057, - 163, 2248, 3393, 164, 621, 3400, 621, 2178, 80, 3067, - 1854, 82, 3470, 3429, 2427, 2880, 1607, 2809, 3333, 2546, - 2547, 2384, 1620, 1621, 155, 154, 183, 2734, 622, 922, - 766, 767, 1291, 2571, 3170, 2735, 2736, 2075, 2076, 2428, - 646, 3133, 2462, 2245, 2074, 2461, 2039, 1082, 2463, 3178, - 3179, 1533, 1313, 1534, 2555, 867, 866, 1287, 1070, 3320, - 1279, 2510, 1294, 1071, 1295, 1296, 2246, 2474, 89, 2949, - 89, 89, 635, 621, 2857, 1314, 1315, 1316, 1317, 1318, - 1319, 1320, 1322, 1321, 1323, 1324, 89, 2614, 2093, 2092, - 2420, 2421, 1070, 2868, 1050, 2866, 2806, 1071, 2240, 2241, - 2243, 2242, 1087, 1088, 1109, 1069, 1791, 1068, 639, 1530, - 621, 770, 633, 683, 774, 685, 771, 772, 2010, 681, - 684, 773, 2842, 2557, 1474, 149, 1622, 152, 2806, 1619, - 1083, 150, 151, 1287, 3279, 2160, 3280, 167, 2517, 1076, - 2837, 2122, 2542, 1046, 2199, 3500, 173, 702, 703, 3163, - 3167, 3168, 3169, 3180, 3181, 3182, 3190, 3192, 735, 3191, - 3193, 3194, 3195, 3198, 3199, 3200, 3201, 3196, 3197, 3202, - 3147, 3151, 3148, 3149, 3150, 3162, 3152, 3153, 3154, 3155, - 3156, 3157, 3158, 3159, 3160, 3161, 3203, 3204, 3205, 3206, - 3207, 3208, 3173, 3177, 3176, 3174, 3175, 3171, 3172, 1089, - 949, 3471, 1056, 1057, 621, 1726, 1700, 2830, 622, 1090, - 622, 775, 1108, 776, 1091, 2831, 780, 1084, 1085, 1086, - 782, 781, 3472, 783, 749, 748, 1077, 2838, 777, 778, - 3446, 779, 2037, 2038, 1059, 1103, 2219, 1052, 2220, 621, - 2221, 1731, 2559, 3038, 3037, 1021, 2615, 2222, 949, 1045, - 1701, 915, 1702, 1027, 1026, 2839, 2201, 1066, 947, 1072, - 1073, 1074, 1075, 2204, 2203, 158, 1330, 1331, 1332, 1333, - 3231, 2163, 925, 919, 917, 2648, 1344, 622, 3094, 1348, - 3034, 2039, 1110, 1111, 2052, 1477, 1286, 1283, 1284, 1285, - 1290, 1292, 1289, 958, 1288, 987, 3209, 3210, 3211, 3212, - 3213, 3214, 3215, 3216, 1282, 985, 2202, 3327, 1104, 2508, - 3434, 627, 944, 1049, 622, 946, 996, 995, 2205, 1338, - 955, 2211, 2207, 2209, 2210, 2208, 2212, 2213, 3432, 957, - 994, 1529, 993, 958, 992, 991, 990, 3438, 3439, 925, - 919, 917, 1611, 153, 989, 2755, 2756, 2511, 984, 2544, - 997, 2757, 3433, 933, 3406, 621, 3512, 3406, 970, 2950, - 3519, 2182, 1286, 1283, 1284, 1285, 1290, 1292, 1289, 1267, - 1288, 815, 3477, 933, 815, 1327, 1327, 1298, 948, 969, - 1282, 2476, 1268, 1269, 3405, 2246, 815, 3405, 2563, 1632, - 933, 1334, 1744, 3033, 931, 1006, 2136, 618, 2560, 2126, - 910, 969, 976, 2189, 146, 1005, 1353, 147, 622, 2188, - 1740, 1048, 949, 1272, 941, 1014, 2776, 2858, 2541, 1080, - 3088, 943, 942, 1605, 1604, 1603, 948, 1712, 1711, 1713, - 1714, 1715, 2527, 2997, 2998, 1741, 3088, 159, 3066, 2127, - 1601, 988, 83, 622, 171, 604, 2125, 587, 582, 976, - 2531, 986, 2754, 1734, 2180, 1732, 1733, 602, 1735, 1736, - 2576, 2260, 2388, 2390, 2757, 1328, 1329, 2037, 2038, 1358, - 947, 1359, 2554, 1498, 1500, 2553, 3316, 2986, 1362, 2968, - 2128, 2458, 918, 2247, 2423, 179, 88, 2360, 88, 88, - 2124, 1730, 2807, 2808, 2530, 1857, 1631, 599, 1464, 1521, - 1429, 1061, 2418, 975, 88, 2811, 613, 1465, 118, 969, - 972, 973, 1481, 933, 2081, 1327, 1324, 966, 970, 1067, - 2902, 609, 2733, 1055, 2807, 2808, 160, 165, 162, 168, - 169, 170, 172, 174, 175, 176, 177, 2811, 965, 893, - 1107, 1058, 178, 180, 181, 182, 1093, 1753, 2566, 918, - 975, 2566, 113, 2565, 3341, 999, 2565, 3029, 1480, 622, - 2962, 1065, 1484, 1435, 1436, 1437, 1438, 1439, 877, 1878, - 1099, 1465, 1101, 2200, 3510, 1478, 1800, 3511, 1737, 3509, - 1482, 1483, 1535, 1879, 98, 99, 2600, 1297, 1471, 1458, - 948, 976, 589, 1869, 591, 605, 1869, 624, 2277, 623, - 595, 2500, 593, 597, 606, 598, 2875, 592, 1297, 603, - 1098, 1100, 594, 607, 608, 611, 614, 615, 616, 612, - 610, 1079, 601, 625, 114, 1295, 1296, 1013, 2389, 1638, - 1513, 3480, 1081, 1296, 1624, 101, 3129, 3004, 1297, 1727, - 1499, 1728, 3003, 2167, 1729, 1817, 1819, 1820, 2179, 1468, - 1641, 2581, 874, 1640, 1630, 2177, 1673, 2172, 1502, 1676, - 2304, 1678, 2175, 1608, 1609, 1610, 987, 1599, 1617, 1818, - 976, 876, 1497, 1695, 985, 1646, 1479, 1647, 1677, 1649, - 1651, 2172, 3473, 1655, 1657, 1659, 1661, 1663, 1636, 1526, - 1527, 2987, 975, 1094, 1754, 1051, 2176, 979, 969, 889, - 1827, 3514, 981, 3371, 1064, 1635, 982, 980, 3520, 1096, - 1600, 976, 1876, 1097, 1828, 1325, 1326, 1826, 1634, 1634, - 2174, 3239, 1294, 1102, 1295, 1296, 3063, 983, 3064, 1614, - 1685, 1686, 1615, 1613, 2583, 1627, 1691, 1692, 976, 2252, - 2253, 2254, 3309, 1294, 1757, 1295, 1296, 1095, 3372, 1720, - 1718, 1761, 2602, 1763, 1764, 1765, 1766, 1485, 3238, 3229, - 1770, 3437, 1319, 1320, 1322, 1321, 1323, 1324, 1755, 1756, - 3079, 975, 1782, 1294, 1707, 1295, 1296, 969, 972, 973, - 3078, 933, 1760, 1918, 1749, 966, 970, 3310, 1745, 1767, - 1768, 1769, 3011, 3010, 1751, 3521, 818, 819, 820, 3000, - 1681, 2593, 2592, 2591, 2585, 3436, 2589, 1297, 2584, 2784, - 2582, 2772, 975, 1719, 1717, 2587, 1297, 979, 969, 2482, - 2481, 1497, 981, 1606, 2586, 2132, 982, 980, 1874, 2265, - 122, 626, 952, 951, 950, 1721, 1705, 1875, 1706, 975, - 1704, 1012, 2588, 2590, 1703, 1009, 1759, 1693, 1687, 1684, - 1297, 1683, 619, 1314, 1315, 1316, 1317, 1318, 1319, 1320, - 1322, 1321, 1323, 1324, 1682, 1780, 1653, 620, 2994, 627, - 1781, 1975, 1910, 1899, 1900, 1901, 1902, 1912, 1903, 1904, - 1905, 1917, 1913, 1906, 1907, 1914, 1915, 1916, 1908, 1909, - 1911, 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1313, - 3484, 1497, 1309, 1796, 1310, 1315, 1316, 1317, 1318, 1319, - 1320, 1322, 1321, 1323, 1324, 2834, 1271, 1831, 1311, 1325, - 1326, 1308, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, - 1321, 1323, 1324, 627, 3482, 1497, 1530, 1852, 1852, 1850, - 1850, 3474, 1294, 1853, 1295, 1296, 95, 1313, 1872, 2575, - 3336, 1294, 1873, 1295, 1296, 2465, 627, 96, 1297, 39, - 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1299, 1313, 1821, + 3120, 764, 2946, 2051, 2753, 682, 2035, 1503, 2972, 2817, + 2697, 763, 762, 2687, 2411, 2938, 1973, 1063, 650, 2485, + 2516, 2484, 769, 2113, 2138, 2564, 2118, 2054, 2486, 2841, + 1597, 652, 2181, 768, 157, 928, 39, 2068, 2436, 2056, + 1644, 2403, 40, 998, 2387, 2417, 974, 1944, 38, 1845, + 1864, 896, 897, 875, 2055, 1490, 1092, 1803, 2556, 1970, + 2159, 2137, 2043, 1626, 2198, 143, 2120, 956, 2478, 1532, + 2453, 1512, 94, 2058, 664, 1470, 961, 1352, 647, 1868, + 1822, 1743, 1280, 1978, 1633, 935, 967, 1725, 932, 2135, + 936, 962, 98, 99, 2109, 963, 1531, 1116, 964, 887, + 659, 914, 916, 1517, 1940, 93, 1747, 1336, 1979, 1312, + 10, 884, 101, 877, 79, 881, 9, 8, 1106, 1752, + 2036, 161, 121, 1112, 883, 119, 120, 126, 1592, 1618, + 882, 127, 1047, 909, 899, 885, 658, 87, 1356, 3328, + 2509, 92, 641, 3498, 2152, 2153, 2154, 3354, 1360, 3044, + 2783, 100, 2152, 2539, 2538, 78, 904, 908, 2507, 2196, + 1281, 1710, 3036, 89, 3450, 1943, 890, 2999, 89, 89, + 2572, 122, 2573, 3355, 3349, 3090, 2805, 978, 588, 3090, + 128, 900, 1825, 1003, 906, 906, 1877, 3350, 627, 1000, + 929, 2239, 621, 922, 766, 767, 1810, 1281, 1809, 1011, + 891, 1808, 1017, 1018, 1019, 1807, 1022, 1023, 1024, 1025, + 642, 923, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, + 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 977, + 874, 924, 2803, 954, 2, 876, 1497, 621, 898, 1806, + 122, 952, 1805, 953, 951, 950, 2008, 2009, 1004, 1007, + 1008, 2805, 627, 1783, 644, 184, 645, 2383, 2809, 818, + 819, 820, 3089, 3445, 2802, 2683, 3089, 1291, 3470, 922, + 766, 767, 1297, 3350, 2529, 2185, 105, 106, 107, 123, + 110, 145, 1020, 116, 945, 940, 185, 2649, 3518, 583, + 3465, 3454, 166, 89, 2413, 3488, 621, 818, 819, 820, + 640, 3452, 2918, 2917, 1291, 2532, 3304, 2803, 122, 869, + 870, 871, 872, 621, 2352, 880, 3453, 2183, 1815, 2184, + 1466, 2860, 3247, 156, 2129, 3246, 3451, 3049, 1002, 144, + 3050, 3479, 1001, 2809, 80, 80, 3257, 2248, 618, 80, + 3448, 3068, 3057, 911, 912, 621, 3404, 2123, 163, 80, + 3393, 164, 82, 3333, 3400, 2178, 3256, 3067, 1854, 2427, + 3429, 2880, 1607, 1533, 3434, 1534, 2546, 2547, 1287, 2806, + 132, 133, 155, 154, 183, 2462, 2735, 2736, 2461, 2075, + 2076, 2463, 3432, 3410, 2428, 2741, 604, 2039, 3133, 2384, + 646, 3438, 3439, 2734, 2571, 2245, 622, 1050, 602, 2755, + 2756, 2074, 2246, 2555, 1082, 1287, 3433, 1294, 1279, 1295, + 1296, 867, 89, 89, 866, 915, 1109, 89, 1087, 1088, + 1070, 3410, 2510, 3320, 2474, 1071, 949, 89, 1056, 1057, + 2742, 1070, 1083, 1069, 2949, 1068, 1071, 621, 599, 1076, + 621, 622, 2093, 2092, 2806, 2837, 2868, 613, 2240, 2241, + 2243, 2242, 2010, 633, 2744, 2614, 621, 3471, 2420, 2421, + 1059, 2866, 609, 635, 1530, 1791, 639, 2842, 944, 2557, + 1046, 946, 2739, 149, 130, 152, 137, 129, 3472, 150, + 151, 1021, 1474, 2517, 947, 167, 3279, 2160, 3280, 2755, + 2756, 2830, 2542, 2122, 173, 138, 2740, 2199, 2039, 2831, + 622, 3500, 1726, 925, 919, 917, 2754, 2204, 1103, 141, + 139, 134, 135, 136, 140, 1089, 1731, 622, 2757, 1084, + 1091, 131, 1052, 1700, 1108, 1090, 1077, 1085, 1086, 2746, + 142, 2559, 2838, 589, 3038, 591, 605, 3037, 624, 2222, + 623, 595, 1027, 593, 597, 606, 598, 1026, 592, 622, + 603, 949, 1045, 594, 607, 608, 611, 614, 615, 616, + 612, 610, 2205, 601, 625, 3231, 2839, 1701, 949, 1702, + 941, 2201, 2163, 2037, 2038, 2203, 3034, 943, 942, 925, + 919, 917, 1099, 3094, 1101, 2052, 987, 3446, 2211, 2207, + 2209, 2210, 2208, 2212, 2213, 958, 2754, 1286, 1283, 1284, + 1285, 1290, 1292, 1289, 948, 1288, 996, 1066, 2757, 1072, + 1073, 1074, 1075, 158, 2615, 1282, 1049, 2202, 985, 184, + 957, 995, 1098, 1100, 958, 2648, 947, 1611, 994, 1348, + 993, 992, 1110, 1111, 1286, 1283, 1284, 1285, 1290, 1292, + 1289, 622, 1288, 123, 622, 2219, 1477, 2220, 1313, 2221, + 991, 990, 1282, 989, 984, 997, 166, 1327, 3327, 2508, + 622, 2757, 1327, 933, 969, 1104, 3519, 3477, 970, 1338, + 2857, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, + 1323, 1324, 933, 1632, 2037, 2038, 1529, 2246, 955, 3033, + 1744, 153, 1330, 1331, 1332, 1333, 2544, 1080, 976, 2467, + 2136, 815, 1344, 910, 2563, 933, 815, 815, 2511, 931, + 2560, 1267, 163, 918, 1048, 164, 2189, 2188, 2182, 2743, + 3512, 1096, 2476, 1740, 2950, 1097, 2776, 1298, 1734, 948, + 1732, 1733, 988, 1735, 1736, 1102, 1272, 1014, 183, 2541, + 1605, 1334, 2576, 1268, 1269, 976, 948, 2260, 2388, 2390, + 1604, 2126, 146, 1603, 2527, 147, 1353, 3406, 3088, 1095, + 1741, 1601, 3088, 976, 986, 2807, 2808, 1712, 1711, 1713, + 1714, 1715, 626, 2997, 2998, 1013, 587, 582, 2811, 2554, + 3316, 2180, 2553, 83, 2986, 159, 3066, 3405, 2968, 918, + 1631, 2127, 171, 619, 2531, 3406, 2458, 1730, 2125, 975, + 976, 1328, 1329, 2423, 2360, 969, 972, 973, 620, 933, + 1857, 1006, 1521, 966, 970, 3437, 1429, 969, 1061, 2247, + 1358, 1005, 1359, 1498, 1500, 3405, 2418, 118, 2081, 1327, + 88, 88, 2128, 179, 1362, 88, 2733, 1324, 2530, 893, + 2807, 2808, 2124, 1093, 1753, 88, 975, 1107, 1464, 167, + 2566, 979, 969, 2811, 113, 2565, 981, 1297, 173, 3436, + 982, 980, 1481, 1465, 975, 2902, 1918, 2566, 1058, 1055, + 3341, 2600, 2565, 1878, 160, 165, 162, 168, 169, 170, + 172, 174, 175, 176, 177, 1067, 976, 1879, 1065, 999, + 178, 180, 181, 182, 2747, 3029, 2962, 2200, 2751, 1079, + 2500, 975, 1800, 1737, 1535, 2750, 979, 969, 1480, 1869, + 1081, 981, 1484, 3480, 2389, 982, 980, 1296, 877, 1435, + 1436, 1437, 1438, 1439, 2581, 1478, 114, 1465, 1295, 1296, + 1482, 1483, 3129, 3004, 98, 99, 983, 3003, 3510, 2752, + 1471, 3511, 2167, 3509, 2748, 1727, 1458, 1728, 1641, 2749, + 1729, 1869, 1640, 2277, 101, 1910, 1899, 1900, 1901, 1902, + 1912, 1903, 1904, 1905, 1917, 1913, 1906, 1907, 1914, 1915, + 1916, 1908, 1909, 1911, 1297, 2179, 1630, 158, 2177, 1638, + 1513, 1319, 1320, 1322, 1321, 1323, 1324, 975, 1499, 1012, + 1094, 1754, 1294, 1009, 1295, 1296, 2175, 1608, 1609, 1610, + 1624, 2602, 2172, 2172, 987, 985, 1673, 2583, 1468, 1676, + 3371, 1678, 1479, 2858, 1051, 1297, 1876, 1599, 3309, 1634, + 1634, 3520, 1502, 1695, 3473, 1646, 1617, 1647, 874, 1649, + 1651, 1064, 2987, 1655, 1657, 1659, 1661, 1663, 1636, 889, + 876, 2176, 2174, 3514, 1677, 1526, 1527, 3239, 3238, 1817, + 1819, 1820, 1827, 976, 3063, 3372, 3064, 1297, 1635, 1497, + 818, 819, 820, 3310, 1685, 1686, 1828, 1325, 1326, 1826, + 1691, 1692, 1600, 1818, 2593, 2592, 2591, 2585, 3229, 2589, + 1975, 2584, 1297, 2582, 1972, 1975, 1297, 1615, 2587, 1614, + 3079, 1613, 3078, 1974, 1757, 1627, 3011, 2586, 3010, 3484, + 1497, 1761, 3000, 1763, 1764, 1765, 1766, 813, 3521, 1294, + 1770, 1295, 1296, 2784, 1485, 2588, 2590, 2252, 2253, 2254, + 2772, 1720, 1782, 1718, 1707, 1755, 1756, 1317, 1318, 1319, + 1320, 1322, 1321, 1323, 1324, 1681, 2482, 2834, 2481, 1760, + 1745, 3482, 1497, 2132, 1751, 1721, 1767, 1768, 1769, 159, + 1294, 1705, 1295, 1296, 975, 1704, 171, 1297, 1703, 1749, + 969, 972, 973, 1693, 933, 1687, 3416, 1497, 966, 970, + 3414, 1497, 1684, 122, 952, 1297, 1683, 951, 950, 2304, + 1606, 1313, 1682, 1497, 1309, 1719, 1310, 1717, 1706, 965, + 1874, 1653, 1294, 1271, 1295, 1296, 627, 179, 1759, 1875, + 1311, 1325, 1326, 1308, 1314, 1315, 1316, 1317, 1318, 1319, + 1320, 1322, 1321, 1323, 1324, 1530, 1297, 1294, 3474, 1295, + 1296, 1294, 1781, 1295, 1296, 1297, 1780, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 160, 165, + 162, 168, 169, 170, 172, 174, 175, 176, 177, 2044, + 2045, 2994, 627, 1796, 178, 180, 181, 182, 1301, 1302, + 1303, 1304, 1305, 1306, 1307, 1299, 1830, 1297, 1832, 1833, + 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, + 1844, 2465, 627, 2148, 2147, 3336, 2875, 1852, 1852, 1850, + 1850, 1506, 1294, 1853, 1295, 1296, 3335, 1313, 1872, 2575, + 3412, 1497, 1873, 104, 1297, 2146, 2145, 2144, 2143, 39, + 1294, 1497, 1295, 1296, 103, 2274, 102, 2409, 3499, 1821, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, - 1324, 1823, 2044, 2045, 3335, 1294, 1936, 1295, 1296, 1338, - 2316, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, - 1323, 1324, 2148, 2147, 104, 3313, 1870, 2146, 2145, 2144, - 2143, 3312, 1497, 1497, 1968, 103, 3311, 102, 1313, 3234, - 2259, 3218, 1811, 1812, 1813, 1814, 97, 1506, 79, 1788, - 1789, 1464, 1799, 1824, 3217, 1797, 3128, 1798, 3126, 1997, - 1465, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, - 1323, 1324, 95, 3075, 1975, 2314, 1498, 2004, 1972, 97, - 1463, 1297, 1980, 96, 1829, 1293, 1497, 1974, 2409, 3499, - 3329, 1858, 1859, 1507, 3461, 1497, 1861, 1462, 906, 906, - 1866, 813, 1293, 1497, 1871, 1497, 3265, 1971, 1461, 1856, - 2028, 2409, 3399, 1294, 3008, 1295, 1296, 1884, 1885, 1886, - 1887, 1888, 1889, 1890, 1891, 1892, 1893, 2409, 3379, 2409, - 3375, 1919, 1920, 1921, 1922, 1923, 1924, 1926, 1497, 1931, - 2993, 1933, 1934, 1935, 1297, 1937, 1938, 1939, 2843, 1945, + 1324, 1823, 3313, 104, 95, 3312, 1936, 1507, 2314, 1338, + 3311, 97, 3234, 1831, 103, 96, 102, 1932, 1293, 1497, + 95, 1294, 1497, 1295, 1296, 97, 1870, 3461, 1497, 3329, + 1294, 96, 1295, 1296, 1968, 1293, 1497, 2409, 3399, 2409, + 3379, 3265, 1811, 1812, 1813, 1814, 2409, 3375, 3362, 1497, + 3264, 1464, 3218, 1824, 1497, 3222, 1799, 79, 2273, 1997, + 1788, 1789, 1797, 1798, 3047, 3326, 1465, 3242, 1497, 3221, + 1497, 3055, 1294, 3217, 1295, 1296, 1498, 2004, 2409, 3230, + 1297, 3128, 1980, 3126, 1497, 2518, 1497, 2961, 3075, 1829, + 1463, 1858, 1859, 1462, 1461, 3008, 1861, 2993, 906, 906, + 1866, 2843, 2265, 2840, 1871, 3047, 1497, 1971, 2775, 1294, + 2028, 1295, 1296, 2409, 3045, 1856, 2774, 1884, 1885, 1886, + 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1297, 1863, 1865, + 2491, 1919, 1920, 1921, 1922, 1923, 1924, 1926, 2479, 1931, + 1460, 1933, 1934, 1935, 2194, 1937, 1938, 1939, 2193, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, - 1966, 1967, 1982, 1969, 1980, 1976, 1977, 906, 2840, 906, + 1966, 1967, 2034, 1969, 1980, 1976, 1977, 906, 2016, 906, 906, 906, 906, 906, 2090, 1985, 1986, 98, 99, 1989, - 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1981, 1998, 1999, - 2000, 2001, 2002, 2021, 2775, 2022, 2774, 98, 99, 104, - 2133, 1880, 1881, 1882, 1883, 2027, 1294, 2491, 1295, 1296, - 103, 2479, 102, 3362, 1497, 1894, 3047, 3326, 3416, 1497, - 2062, 2085, 1460, 1863, 1865, 2194, 906, 1297, 2193, 2099, - 2100, 2101, 2102, 2003, 2015, 3242, 1497, 2409, 3230, 2094, - 2084, 2095, 2096, 2097, 2098, 2034, 1297, 2016, 2040, 2041, - 2066, 3047, 1497, 3264, 1982, 2409, 3045, 2105, 2106, 2107, - 2108, 2029, 1784, 890, 2172, 1497, 3222, 2088, 1750, 1294, - 1716, 1295, 1296, 2047, 2079, 2115, 97, 2161, 923, 2049, - 1497, 2072, 1830, 2121, 1832, 1833, 1834, 1835, 1836, 1837, - 1838, 1839, 1840, 1841, 1842, 1843, 1844, 2071, 2087, 2070, - 2086, 2966, 1497, 2158, 1984, 1297, 2454, 1987, 1988, 2325, - 1497, 3414, 1497, 2765, 2764, 3221, 2131, 2761, 2762, 2761, - 2760, 2433, 1497, 2454, 924, 1297, 2246, 2540, 1596, 2521, - 3412, 1497, 1297, 2117, 184, 1497, 2312, 1708, 2116, 2111, - 2112, 2514, 2515, 2409, 2408, 2130, 1698, 2134, 2270, 1497, - 2425, 2142, 2405, 1694, 2166, 1690, 2186, 2169, 123, 2170, - 1689, 2026, 1294, 1932, 1295, 1296, 1297, 97, 1688, 2455, - 1930, 166, 2165, 2116, 2168, 2164, 1313, 1508, 978, 2457, - 1941, 1294, 1105, 1295, 1296, 3055, 2455, 2190, 1634, 3288, - 1497, 2191, 2192, 2187, 2518, 1297, 2246, 977, 2496, 1314, - 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, - 1497, 1297, 1855, 1497, 2467, 1297, 3286, 1497, 1596, 1595, - 1541, 1540, 2433, 2432, 2698, 2270, 2274, 163, 2089, 2728, - 164, 2961, 1293, 2232, 2233, 2961, 2425, 103, 2235, 2246, - 1294, 2963, 1295, 1296, 2257, 3367, 2197, 2236, 2005, 3340, - 3283, 1497, 2173, 183, 1941, 2409, 2433, 2263, 2922, 2763, - 1294, 2268, 1295, 1296, 2271, 2671, 2272, 1294, 2073, 1295, - 1296, 2279, 2270, 2325, 2301, 2281, 2282, 2283, 2433, 3269, - 1497, 2225, 2300, 2172, 2155, 2289, 2290, 2291, 2292, 2293, - 2294, 2295, 2296, 2297, 2298, 2937, 1497, 1297, 2042, 2273, - 2264, 1294, 1501, 1295, 1296, 2006, 1293, 1297, 2961, 1823, - 2172, 1855, 1801, 1739, 3012, 1528, 1297, 2262, 960, 959, - 879, 2305, 2306, 2307, 2308, 2309, 89, 2311, 1297, 3442, - 1294, 2313, 1295, 1296, 3382, 2318, 2319, 3253, 2320, 1297, - 1504, 2323, 2244, 2324, 1297, 3219, 1294, 2327, 1295, 1296, - 1294, 2331, 1295, 1296, 3140, 2336, 2337, 2338, 2339, 3028, - 3025, 1824, 1297, 2255, 167, 3013, 3014, 3015, 2350, 2787, - 2353, 2354, 3006, 173, 1669, 1297, 2885, 2884, 2356, 2358, - 2488, 2930, 1497, 1598, 1297, 2361, 2362, 2363, 2364, 2365, - 1982, 2927, 1497, 2114, 1297, 2832, 2372, 2373, 89, 2374, - 2925, 1497, 2377, 2379, 2028, 2276, 2381, 2789, 2278, 1297, - 2785, 1050, 2890, 1497, 1297, 1981, 2393, 2522, 1297, 2285, - 2286, 2287, 2288, 2873, 1497, 1670, 1671, 1672, 2380, 1497, - 2110, 1297, 1294, 2104, 1295, 1296, 1852, 2103, 1850, 1723, - 1297, 2394, 1294, 1629, 1295, 1296, 2378, 1497, 1625, 1510, - 1594, 1294, 115, 1295, 1296, 2836, 1297, 3016, 3494, 2357, - 1497, 2310, 3254, 1294, 1353, 1295, 1296, 2392, 2340, 1497, - 2973, 2974, 2487, 2129, 1294, 1297, 1295, 1296, 3260, 1294, - 2019, 1295, 1296, 2267, 3492, 3468, 1665, 1297, 1786, 2429, - 3348, 3344, 158, 2266, 2395, 1297, 2397, 1294, 2981, 1295, - 1296, 3274, 2332, 1497, 3017, 3018, 3019, 2976, 1297, 2410, - 1294, 2781, 1295, 1296, 2780, 1509, 2779, 2698, 1297, 1294, - 2488, 1295, 1296, 2501, 2226, 1497, 2979, 2978, 2717, 1294, - 2448, 1295, 1296, 1666, 1667, 1668, 2419, 2716, 1471, 3255, - 2382, 3475, 2406, 1297, 1294, 39, 1295, 1296, 2033, 1294, - 1787, 1295, 1296, 1294, 2447, 1295, 1296, 2449, 1505, 2025, - 3324, 2967, 2720, 1465, 1472, 2407, 1294, 2721, 1295, 1296, - 2475, 2477, 3226, 2422, 2676, 1294, 2513, 1295, 1296, 1297, - 3030, 1513, 2718, 2468, 3110, 1297, 3109, 2719, 2452, 2675, - 2402, 1294, 2932, 1295, 1296, 2456, 3308, 2954, 1297, 2256, - 3119, 2258, 2459, 2483, 3121, 2953, 2957, 2121, 894, 2466, - 1294, 2469, 1295, 1296, 1297, 2722, 895, 2442, 2443, 2685, - 585, 2537, 1294, 1738, 1295, 1296, 2759, 2928, 865, 2480, - 1294, 2472, 1295, 1296, 3108, 2688, 2690, 2492, 868, 1016, - 1297, 2489, 2490, 1294, 2691, 1295, 1296, 2493, 2494, 1015, - 2535, 2498, 2497, 1294, 95, 1295, 1296, 2851, 2284, 1297, - 2502, 2503, 2504, 2900, 159, 96, 2487, 2569, 2534, 2896, - 1878, 171, 1270, 1617, 2528, 2299, 2578, 2959, 1294, 934, - 1295, 1296, 2882, 95, 1879, 2604, 2605, 2606, 2607, 2608, - 97, 2523, 2524, 123, 96, 2044, 2045, 1297, 2881, 97, - 3506, 2777, 2533, 2229, 2613, 3421, 3325, 1297, 104, 3249, - 2758, 2446, 179, 2030, 1294, 1297, 1295, 1296, 2218, 103, - 1294, 102, 1295, 1296, 2878, 2217, 2594, 2939, 2558, 2674, - 97, 902, 903, 1294, 2216, 1295, 1296, 2673, 2577, 3296, - 2215, 2567, 2214, 2376, 2568, 2609, 2250, 102, 2561, 1294, - 3295, 1295, 1296, 160, 165, 162, 168, 169, 170, 172, - 174, 175, 176, 177, 3277, 3127, 3125, 3124, 3117, 178, - 180, 181, 182, 2595, 3026, 1294, 2958, 1295, 1296, 2597, - 2956, 2375, 2438, 2441, 2442, 2443, 2439, 104, 2440, 2444, - 2574, 2371, 2973, 2974, 1294, 2650, 1295, 1296, 103, 2370, - 102, 2790, 2156, 2655, 1612, 2652, 104, 901, 103, 906, - 3116, 2947, 2598, 2599, 3495, 2425, 2601, 103, 3098, 2603, - 2618, 3496, 3495, 3, 2405, 2616, 2302, 1971, 2017, 1971, - 1522, 2707, 1294, 2624, 1295, 1296, 1297, 1514, 3496, 2610, - 2611, 2612, 1294, 3314, 1295, 1296, 108, 109, 2992, 2725, - 1294, 2617, 1295, 1296, 2619, 2620, 2621, 892, 91, 1, - 2622, 2623, 2678, 2996, 1945, 2625, 2655, 3431, 2627, 600, - 2007, 2629, 2630, 2631, 2632, 2679, 2710, 1469, 2727, 2633, - 1945, 1945, 1945, 1945, 1945, 2651, 3469, 2653, 2666, 2701, - 3427, 3428, 2670, 1709, 2701, 1699, 3058, 1942, 906, 2062, - 3250, 2677, 2793, 2654, 2162, 2656, 2657, 2658, 2659, 2660, - 2661, 2704, 2692, 2693, 2662, 2663, 3024, 2664, 2119, 2665, - 2369, 2680, 968, 2729, 881, 148, 2730, 2062, 2062, 2062, - 2062, 2062, 2709, 882, 2082, 883, 2695, 2723, 2712, 2713, - 2711, 2715, 2813, 2714, 2667, 2668, 2669, 2062, 2083, 3395, - 2062, 112, 926, 2731, 2634, 2635, 2636, 2637, 2638, 111, - 98, 99, 971, 1078, 2696, 2157, 3048, 2737, 2473, 2091, - 1547, 1294, 1545, 1295, 1296, 2853, 2769, 2768, 2767, 2792, - 1546, 2438, 2441, 2442, 2443, 2439, 1297, 2440, 2444, 2726, - 1544, 1749, 2855, 1549, 2791, 2870, 2871, 2872, 1548, 2874, - 2876, 2820, 2821, 799, 2859, 1297, 2303, 2770, 2771, 2121, - 2812, 2901, 1790, 2883, 2827, 634, 2445, 628, 2887, 2888, - 2889, 2891, 2892, 2893, 2894, 186, 1536, 2895, 1297, 2897, - 2898, 2899, 1515, 2579, 2903, 2904, 2905, 2906, 2907, 2908, - 2909, 2910, 2911, 2912, 2844, 2849, 2850, 2847, 2846, 2788, - 2596, 2914, 2919, 1010, 2854, 2923, 189, 2924, 2926, 189, - 2929, 2931, 632, 2933, 2934, 2935, 2936, 638, 590, 2864, - 2368, 2942, 2861, 2862, 2766, 2863, 2195, 189, 2865, 596, - 2867, 1345, 2869, 1297, 1785, 2672, 2916, 2460, 1297, 2367, - 921, 913, 189, 2920, 1297, 2018, 2396, 920, 3227, 2706, - 2951, 1297, 2684, 2686, 2412, 2689, 2964, 2965, 2682, 2626, - 2969, 2628, 2366, 1297, 3307, 3118, 3380, 638, 189, 638, - 2470, 1294, 1511, 1295, 1296, 2921, 2275, 2639, 2640, 2641, - 2642, 1867, 1297, 1335, 2059, 3093, 2945, 1816, 656, 655, - 1294, 2877, 1295, 1296, 1297, 653, 2398, 1054, 2943, 1060, - 2940, 2941, 1062, 2426, 1300, 2886, 1297, 803, 2948, 2386, - 2955, 1523, 1297, 1294, 2437, 1295, 1296, 2355, 1297, 2970, - 2960, 2435, 2349, 2434, 1297, 2227, 2067, 2975, 2348, 2971, - 1297, 3423, 2061, 2977, 2057, 2347, 2404, 754, 2984, 2985, - 753, 2982, 2980, 665, 657, 649, 1297, 2346, 2983, 752, - 751, 1297, 2989, 2819, 3407, 1274, 1297, 2990, 2991, 3031, - 3032, 1297, 2543, 2820, 2821, 3046, 2345, 1297, 1294, 2833, - 1295, 1296, 2062, 1294, 2545, 1295, 1296, 2471, 2344, 1294, - 2829, 1295, 1296, 3052, 3053, 3007, 1294, 3009, 1295, 1296, - 2343, 1297, 1278, 1487, 643, 939, 2342, 2856, 1294, 3331, - 1295, 1296, 2341, 2249, 2879, 1486, 1897, 3065, 2335, 1898, - 3069, 1297, 3338, 2801, 2334, 3042, 2782, 1294, 2519, 1295, - 1296, 3001, 3002, 2149, 65, 43, 3302, 3368, 750, 1294, - 2333, 1295, 1296, 747, 3095, 2330, 3096, 3080, 3097, 1297, - 2329, 1294, 2646, 1295, 1296, 2328, 3054, 1294, 1297, 1295, - 1296, 2326, 3084, 1294, 2647, 1295, 1296, 3351, 3352, 1294, - 746, 1295, 1296, 3353, 3092, 1294, 1925, 1295, 1296, 1275, - 1297, 3444, 3099, 3035, 3027, 2322, 1792, 3039, 3040, 3041, - 90, 1294, 34, 1295, 1296, 33, 1294, 3070, 1295, 1296, - 32, 1294, 31, 1295, 1296, 2321, 1294, 30, 1295, 1296, - 25, 24, 1294, 23, 1295, 1296, 22, 3051, 21, 27, - 1297, 20, 3091, 19, 18, 2804, 3464, 3505, 117, 3113, - 52, 49, 47, 2317, 125, 124, 1294, 50, 1295, 1296, - 46, 1053, 2315, 44, 29, 28, 17, 16, 15, 14, - 13, 3074, 12, 11, 7, 6, 1294, 37, 1295, 1296, - 1852, 36, 1850, 3134, 2280, 3142, 35, 1795, 3114, 3123, - 3132, 3122, 3071, 26, 3072, 3136, 3138, 3073, 3130, 4, - 3076, 3077, 2506, 2701, 1294, 2151, 1295, 1296, 0, 3081, - 0, 0, 0, 1294, 0, 1295, 1296, 0, 0, 3083, - 0, 3143, 3144, 3241, 2269, 0, 2704, 3146, 3228, 0, - 2704, 0, 3248, 0, 0, 1294, 0, 1295, 1296, 39, - 0, 3100, 0, 0, 3101, 0, 3102, 3103, 0, 3104, + 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1982, 1998, 1999, + 2000, 2001, 2002, 2021, 97, 2022, 1981, 98, 99, 1984, + 2133, 3260, 1987, 1988, 1784, 1294, 2027, 1295, 1296, 2172, + 1497, 1880, 1881, 1882, 1883, 2966, 1497, 2325, 1497, 2698, + 2062, 2099, 2100, 2101, 2102, 1894, 906, 1297, 2765, 2764, + 2961, 2003, 890, 2761, 2762, 2084, 1750, 2085, 2015, 2094, + 1313, 2095, 2096, 2097, 2098, 2066, 2761, 2760, 2040, 2041, + 1716, 1297, 1294, 1497, 1295, 1296, 2026, 2105, 2106, 2107, + 2108, 2029, 2316, 1314, 1315, 1316, 1317, 1318, 1319, 1320, + 1322, 1321, 1323, 1324, 2079, 2115, 1708, 2161, 2088, 1982, + 2121, 1698, 2047, 2433, 1497, 2496, 2072, 1694, 2049, 923, + 2071, 2070, 1690, 2087, 1297, 2246, 2540, 2086, 1315, 1316, + 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1689, 924, + 2454, 3288, 1497, 1596, 2521, 2514, 2515, 2409, 2408, 2158, + 2131, 2270, 1497, 103, 2454, 1855, 1497, 2405, 1688, 978, + 1508, 1596, 1595, 2117, 184, 3286, 1497, 1541, 1540, 1634, + 1105, 2116, 97, 2111, 2112, 2728, 2432, 2130, 2134, 2089, + 1293, 2963, 3367, 3340, 2166, 2246, 2142, 2169, 123, 2170, + 1297, 2409, 1294, 2425, 1295, 1296, 1297, 2425, 2433, 2922, + 1930, 166, 2186, 2455, 2164, 2165, 2116, 2168, 3283, 1497, + 1941, 977, 1313, 2457, 2259, 2763, 1294, 2455, 1295, 1296, + 2671, 2190, 1293, 1313, 2173, 2191, 2192, 2246, 2187, 2073, + 2270, 2433, 2270, 2325, 2301, 1314, 1315, 1316, 1317, 1318, + 1319, 1320, 1322, 1321, 1323, 1324, 1314, 1315, 1316, 1317, + 1318, 1319, 1320, 1322, 1321, 1323, 1324, 163, 1297, 1294, + 164, 1295, 1296, 2232, 2233, 2433, 2300, 2172, 2235, 2961, + 2155, 2197, 2042, 2256, 2981, 2258, 1501, 2236, 2005, 2006, + 3269, 1497, 2172, 183, 1941, 1297, 1855, 2263, 1801, 1739, + 1528, 2268, 960, 959, 2271, 89, 2272, 879, 3442, 3382, + 3253, 2279, 1504, 3219, 3140, 2281, 2282, 2283, 3028, 3025, + 3006, 2885, 2884, 2225, 1598, 2289, 2290, 2291, 2292, 2293, + 2294, 2295, 2296, 2297, 2298, 1294, 1297, 1295, 1296, 2114, + 2264, 1294, 2832, 1295, 1296, 2789, 2785, 2522, 2110, 1823, + 1297, 2487, 2937, 1497, 2104, 2103, 1297, 2262, 1723, 1629, + 2257, 2305, 2306, 2307, 2308, 2309, 1625, 2311, 1594, 115, + 2787, 2313, 2488, 1297, 1050, 2318, 2319, 2836, 2320, 2930, + 1497, 2323, 1297, 2324, 2244, 89, 3254, 2327, 2973, 2974, + 1297, 2331, 2129, 2019, 2979, 2336, 2337, 2338, 2339, 2488, + 3494, 1824, 3016, 1294, 167, 1295, 1296, 2255, 2350, 2978, + 2353, 2354, 1297, 173, 3492, 1786, 1297, 3012, 2356, 2358, + 2927, 1497, 3468, 2717, 1297, 2361, 2362, 2363, 2364, 2365, + 1294, 1297, 1295, 1296, 2925, 1497, 2372, 2373, 1297, 2374, + 2890, 1497, 2377, 2379, 2028, 3348, 2381, 2276, 2278, 3017, + 3018, 3019, 1297, 3274, 2976, 1982, 2393, 2873, 1497, 2285, + 2286, 2287, 2288, 2312, 1981, 2781, 2380, 1497, 3013, 3014, + 3015, 1294, 2780, 1295, 1296, 3475, 1852, 1787, 1850, 2779, + 2698, 2394, 1297, 2501, 2226, 1294, 2716, 1295, 1296, 3344, + 1297, 1294, 1669, 1295, 1296, 1297, 2378, 1497, 3255, 2033, + 2357, 1497, 1297, 2310, 1353, 1505, 2025, 2392, 1294, 3324, + 1295, 1296, 2967, 1510, 1297, 2340, 1497, 1294, 3308, 1295, + 1296, 1297, 2332, 1497, 3119, 1294, 2720, 1295, 1296, 2429, + 1297, 2721, 158, 2718, 2395, 2676, 2397, 1497, 2719, 2675, + 3121, 2410, 1297, 1670, 1671, 1672, 3110, 1294, 3109, 1295, + 1296, 1294, 2954, 1295, 1296, 2957, 2685, 1297, 1738, 1294, + 2953, 1295, 1296, 1665, 2267, 865, 1294, 3226, 1295, 1296, + 894, 1016, 2759, 1294, 2266, 1295, 1296, 2472, 895, 1509, + 1471, 2492, 2382, 2406, 2419, 39, 2932, 1294, 2448, 1295, + 1296, 1015, 2688, 2690, 2447, 2851, 3108, 2449, 2928, 2402, + 1297, 2691, 2475, 2477, 1472, 2407, 3030, 2487, 2569, 1465, + 1666, 1667, 1668, 1297, 2422, 2483, 2513, 1294, 2468, 1295, + 1296, 1513, 1297, 2452, 95, 1294, 2900, 1295, 1296, 2528, + 1294, 97, 1295, 1296, 1297, 96, 1270, 1294, 2456, 1295, + 1296, 2896, 95, 2459, 2121, 2722, 123, 2442, 2443, 1294, + 2466, 1295, 1296, 96, 2959, 97, 1294, 3421, 1295, 1296, + 585, 2537, 2469, 2044, 2045, 1294, 2490, 1295, 1296, 1297, + 3506, 2493, 2494, 2480, 1878, 2777, 3325, 1294, 868, 1295, + 1296, 1297, 2229, 3249, 2882, 2758, 2489, 2446, 1879, 1297, + 2535, 2939, 1294, 2030, 1295, 1296, 2497, 2881, 2284, 2498, + 2218, 2502, 2503, 2504, 159, 2217, 2878, 2216, 2534, 3296, + 2215, 171, 902, 903, 2674, 2299, 2214, 2579, 2376, 934, + 2250, 1617, 2673, 104, 102, 2604, 2605, 2606, 2607, 2608, + 104, 2523, 2524, 3295, 103, 1294, 102, 1295, 1296, 1297, + 3277, 103, 103, 102, 2613, 97, 3127, 2533, 1294, 1297, + 1295, 1296, 179, 2375, 3125, 1297, 3124, 1294, 3117, 1295, + 1296, 3026, 2958, 2956, 2790, 2371, 2594, 2156, 1612, 1294, + 104, 1295, 1296, 2370, 901, 3116, 2558, 2947, 2577, 2425, + 3098, 103, 2405, 2561, 2616, 2609, 3496, 3495, 2567, 2302, + 2017, 2568, 2578, 160, 165, 162, 168, 169, 170, 172, + 174, 175, 176, 177, 1294, 1522, 1295, 1296, 1514, 178, + 180, 181, 182, 108, 109, 3495, 1294, 2595, 1295, 1296, + 3496, 2597, 3314, 2369, 1294, 2992, 1295, 1296, 892, 3, + 2574, 91, 1, 2368, 2996, 2650, 3431, 600, 2007, 2367, + 1469, 3469, 3427, 2655, 3428, 2652, 1709, 1699, 3058, 906, + 1942, 3250, 2598, 2599, 2793, 2162, 2601, 3024, 2119, 2603, + 968, 148, 2082, 2083, 2618, 3395, 112, 1971, 926, 1971, + 111, 2707, 971, 2624, 1294, 1078, 1295, 1296, 2157, 2610, + 2611, 2612, 3048, 2473, 1294, 2091, 1295, 1296, 1547, 2725, + 1294, 2617, 1295, 1296, 2619, 2620, 2621, 1545, 1546, 1544, + 2622, 2623, 2678, 1549, 1945, 2625, 2655, 1548, 2627, 2859, + 2303, 2629, 2630, 2631, 2632, 2651, 2710, 2653, 2727, 2633, + 1945, 1945, 1945, 1945, 1945, 2901, 1790, 634, 2445, 2701, + 628, 2666, 2670, 2679, 2701, 2667, 2668, 2669, 906, 2062, + 186, 1536, 1515, 2654, 2677, 2656, 2657, 2658, 2659, 2660, + 2661, 2704, 2914, 1010, 2662, 2663, 590, 2664, 2766, 2665, + 2692, 2693, 2680, 2195, 881, 596, 1345, 2062, 2062, 2062, + 2062, 2062, 2709, 883, 2712, 2713, 2695, 2715, 1785, 882, + 2672, 2729, 2813, 2723, 2730, 2460, 921, 2062, 2711, 913, + 2062, 2714, 2018, 2396, 920, 2731, 3227, 2706, 2951, 2684, + 98, 99, 2737, 2686, 2696, 2412, 2769, 2634, 2635, 2636, + 2637, 2638, 2689, 2682, 2768, 2853, 2767, 3307, 3118, 2792, + 3380, 2438, 2441, 2442, 2443, 2439, 1297, 2440, 2444, 2726, + 2470, 2770, 2771, 1511, 2921, 2870, 2871, 2872, 2275, 2874, + 2876, 2820, 2821, 799, 1867, 1297, 2121, 1335, 2812, 2059, + 2791, 3093, 1816, 2883, 2827, 656, 1749, 655, 2887, 2888, + 2889, 2891, 2892, 2893, 2894, 653, 2398, 2895, 1297, 2897, + 2898, 2899, 2426, 1300, 2903, 2904, 2905, 2906, 2907, 2908, + 2909, 2910, 2911, 2912, 2847, 2849, 2850, 2846, 2844, 2788, + 2596, 803, 2919, 2386, 2854, 2923, 189, 2924, 2926, 189, + 2929, 2931, 632, 2933, 2934, 2935, 2936, 638, 2855, 2864, + 2366, 2942, 2861, 2862, 1523, 2863, 2437, 189, 2865, 2435, + 2867, 2434, 2869, 1297, 2227, 2067, 2916, 2975, 1297, 2355, + 2971, 3423, 189, 2920, 2061, 2057, 2404, 754, 753, 665, + 1297, 657, 649, 752, 751, 2989, 2964, 2965, 2819, 2626, + 2969, 2628, 2349, 1297, 3407, 2543, 2833, 638, 189, 638, + 2545, 1294, 2471, 1295, 1296, 2829, 1278, 2639, 2640, 2641, + 2642, 1487, 643, 1297, 939, 2856, 2945, 3331, 2249, 2879, + 1294, 2877, 1295, 1296, 2940, 2941, 1297, 1054, 2943, 1060, + 1486, 1897, 1062, 1898, 3338, 2886, 1297, 2948, 1495, 1491, + 2955, 2801, 1297, 1294, 3042, 1295, 1296, 2348, 1297, 2970, + 2960, 2782, 2347, 1492, 2519, 2438, 2441, 2442, 2443, 2439, + 1297, 2440, 2444, 2977, 2346, 2973, 2974, 2149, 2984, 2985, + 1297, 2982, 2980, 65, 43, 1297, 3302, 2345, 2023, 2024, + 1494, 1297, 1493, 3368, 750, 1274, 1297, 2990, 747, 3031, + 3032, 2991, 3095, 2820, 2821, 3046, 2983, 2344, 1294, 3096, + 1295, 1296, 2062, 1294, 3097, 1295, 1296, 3007, 2646, 3009, + 2343, 2647, 3351, 3052, 3053, 1294, 1297, 1295, 1296, 3352, + 2342, 746, 1297, 3353, 1925, 1275, 2341, 1297, 1294, 3444, + 1295, 1296, 2335, 1792, 90, 3001, 3002, 3065, 1297, 34, + 3069, 33, 32, 31, 2334, 30, 25, 24, 1294, 1297, + 1295, 1296, 23, 22, 2333, 21, 27, 20, 19, 2330, + 18, 1294, 2804, 1295, 1296, 2329, 3464, 3080, 3505, 117, + 2328, 1294, 52, 1295, 1296, 49, 3054, 1294, 47, 1295, + 1296, 125, 3084, 1294, 124, 1295, 1296, 3035, 1495, 1491, + 50, 3039, 3040, 3041, 3092, 1294, 46, 1295, 1296, 1053, + 2326, 44, 3099, 1492, 3027, 1294, 2322, 1295, 1296, 3070, + 1294, 2321, 1295, 1296, 29, 28, 1294, 17, 1295, 1296, + 16, 1294, 2317, 1295, 1296, 15, 14, 13, 1488, 1489, + 1494, 12, 1493, 2315, 11, 7, 6, 3051, 37, 36, + 1297, 35, 3091, 1795, 26, 4, 2506, 2151, 0, 3113, + 0, 1294, 0, 1295, 1296, 0, 0, 1294, 0, 1295, + 1296, 1297, 1294, 0, 1295, 1296, 0, 0, 0, 0, + 0, 3074, 0, 1294, 0, 1295, 1296, 0, 0, 0, + 1852, 0, 1850, 3134, 1294, 3142, 1295, 1296, 3114, 3123, + 3132, 3122, 3071, 0, 3072, 3136, 3138, 3073, 3130, 0, + 3076, 3077, 0, 2701, 0, 0, 0, 0, 0, 3081, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3083, + 0, 3143, 3144, 3241, 2280, 0, 2704, 3146, 3228, 0, + 2704, 0, 3248, 0, 0, 0, 0, 0, 0, 39, + 0, 3100, 0, 0, 3101, 2269, 3102, 3103, 0, 3104, 0, 3105, 3258, 3259, 1525, 3261, 3106, 3262, 3263, 0, 3225, 3224, 3266, 3267, 3268, 0, 3270, 3273, 3223, 3271, 3272, 0, 1542, 0, 3240, 1294, 0, 1295, 1296, 3245, 3252, 3131, 3282, 3284, 3285, 3287, 3289, 3290, 3292, 1852, - 3244, 1850, 3139, 0, 3275, 3141, 0, 3232, 0, 0, - 0, 0, 0, 0, 0, 1495, 1491, 3145, 0, 0, - 0, 0, 1495, 1491, 0, 0, 0, 0, 0, 3276, - 1492, 0, 0, 0, 3278, 3220, 3322, 1492, 3281, 0, - 0, 0, 0, 0, 0, 0, 3235, 3236, 3237, 3300, - 3318, 3297, 3298, 0, 3299, 2023, 2024, 1494, 0, 1493, - 0, 0, 1488, 1489, 1494, 1679, 1493, 0, 0, 0, + 3244, 1850, 3139, 0, 3275, 3141, 1294, 3232, 1295, 1296, + 0, 0, 0, 0, 0, 0, 0, 3145, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3276, + 3235, 3236, 3237, 0, 3278, 3220, 3322, 0, 3281, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3300, + 3318, 3297, 3298, 0, 3299, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1679, 0, 0, 0, 0, 0, 3315, 0, 0, 0, 0, 189, 0, 189, 3321, - 184, 189, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1724, 0, 0, 0, 123, 0, 2704, 0, 0, 0, - 0, 638, 0, 638, 638, 0, 0, 166, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2741, 0, 3323, + 1724, 0, 0, 0, 0, 0, 2704, 0, 0, 0, + 0, 638, 0, 638, 638, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3323, 0, 0, 1758, 638, 189, 0, 0, 0, 0, 1762, 3317, 0, 0, 0, 0, 3305, 0, 0, 0, 0, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 0, 0, 0, 0, 1340, 3347, 3342, 0, 0, 0, 3082, 0, 0, - 0, 0, 2742, 163, 3337, 0, 164, 3339, 3334, 0, + 0, 0, 0, 0, 3337, 0, 0, 3339, 3334, 0, 0, 0, 3363, 0, 0, 0, 0, 0, 3364, 3365, - 0, 0, 0, 0, 0, 0, 2744, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3330, 0, 0, 0, 0, 3357, - 3376, 0, 3358, 0, 2739, 0, 0, 0, 0, 0, + 3376, 0, 3358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3366, 2755, 2756, 39, 0, 0, 3401, 3402, 2740, 0, + 3366, 0, 0, 39, 0, 0, 3401, 3402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3373, 0, 3411, 3413, 3415, 3381, 3408, 3409, 0, 3383, 3386, 3394, 3391, 3388, 3387, 3385, 3390, 3389, 2701, 0, 0, 0, - 0, 2746, 0, 3252, 3396, 3443, 0, 0, 0, 0, + 0, 0, 0, 3252, 3396, 3443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3419, 0, 0, 0, 3345, 0, 0, 0, 3422, 3440, 3430, 3435, 0, 0, 0, 0, 0, 0, 1340, 0, 3408, 3409, 3449, 0, 39, - 167, 3447, 3359, 0, 3460, 3360, 1348, 3361, 0, 173, + 0, 3447, 3359, 0, 3460, 3360, 1348, 3361, 0, 0, 0, 0, 0, 3378, 0, 0, 0, 0, 3458, 0, - 3463, 0, 0, 0, 1804, 0, 0, 0, 2754, 0, - 0, 0, 0, 0, 0, 0, 3481, 3483, 3485, 0, - 2757, 3478, 3476, 0, 0, 0, 0, 0, 0, 3487, + 3463, 0, 0, 0, 1804, 0, 0, 0, 0, 3462, + 0, 0, 0, 0, 0, 0, 3481, 3483, 3485, 1564, + 0, 3478, 3476, 0, 0, 0, 0, 0, 0, 3487, 189, 0, 0, 3491, 638, 638, 3486, 3493, 0, 0, 0, 0, 0, 1852, 0, 1850, 0, 3504, 3490, 0, 189, 3408, 3409, 3501, 3489, 0, 3507, 0, 3306, 0, @@ -1868,72 +1868,72 @@ var yyAct = [...]int{ 638, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 3441, 0, 0, 3523, 638, 3524, 3525, 3272, 0, 0, 189, 0, 0, 0, 0, 0, 1852, 0, 1850, - 0, 0, 3522, 0, 0, 0, 0, 0, 158, 0, + 0, 0, 3522, 0, 0, 0, 0, 0, 0, 0, 0, 3455, 0, 3456, 0, 3457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, - 0, 2743, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, 0, 638, 638, 0, 638, 0, 638, 638, 0, 638, 638, 638, 638, 638, - 638, 0, 0, 0, 0, 0, 0, 0, 1340, 0, + 638, 0, 0, 1552, 0, 0, 0, 0, 1340, 0, 0, 1340, 638, 1340, 189, 0, 184, 0, 0, 0, - 0, 3502, 0, 3503, 0, 0, 0, 1616, 0, 0, + 0, 3502, 0, 3503, 0, 0, 0, 2512, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 123, 0, 145, 0, 0, 0, 0, 638, 0, 189, 3346, 0, 0, 166, 0, 0, 0, 0, 3356, 0, 0, 0, 0, 638, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2046, - 0, 189, 0, 0, 156, 0, 0, 2050, 189, 2053, + 0, 189, 0, 0, 156, 0, 1565, 2050, 189, 2053, 144, 0, 1804, 0, 0, 0, 0, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 638, 0, 0, 163, + 189, 189, 189, 189, 189, 189, 638, 0, 1564, 163, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, - 159, 0, 0, 0, 0, 0, 0, 171, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1620, 1621, 155, 154, 183, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2747, 0, 0, 0, - 2751, 0, 0, 0, 0, 0, 0, 2750, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 1578, 1581, 1582, 1583, 1584, + 1585, 1586, 0, 1587, 1588, 1589, 1590, 1591, 1566, 1567, + 1568, 1569, 1550, 1551, 1579, 0, 1553, 0, 1554, 1555, + 1556, 1557, 1558, 1559, 1560, 1561, 1562, 0, 0, 1563, + 1570, 1571, 1572, 1573, 0, 1574, 1575, 1576, 1577, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 814, + 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2752, 0, 0, 0, 0, 2748, 0, 0, 814, - 0, 2749, 81, 0, 0, 0, 0, 0, 0, 160, - 165, 162, 168, 169, 170, 172, 174, 175, 176, 177, - 0, 0, 0, 0, 0, 178, 180, 181, 182, 0, 0, 0, 0, 0, 149, 1622, 152, 0, 1619, 0, 150, 151, 0, 0, 0, 0, 167, 0, 0, 0, - 0, 0, 0, 0, 0, 173, 0, 0, 0, 3462, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1564, + 0, 0, 1552, 0, 0, 173, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 638, 0, 0, 0, 0, 0, 0, 638, 878, 0, 81, 0, 189, 0, 0, 0, 0, 1804, 0, 0, 0, 0, 0, 0, 2206, 0, 0, 0, 0, 878, 0, 0, 0, 2223, 2224, 0, 0, 2228, 0, 0, 0, 0, 0, 0, 938, 0, 2231, 0, 0, - 0, 0, 0, 0, 2234, 0, 0, 0, 0, 0, - 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2234, 0, 0, 0, 0, 1580, + 0, 638, 0, 0, 0, 1565, 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, 0, 0, 0, 0, 2237, 0, 638, 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 638, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1983, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1578, 1581, 1582, 1583, 1584, 1585, + 1586, 0, 1587, 1588, 1589, 1590, 1591, 1566, 1567, 1568, + 1569, 1550, 1551, 1579, 0, 1553, 0, 1554, 1555, 1556, + 1557, 1558, 1559, 1560, 1561, 1562, 0, 0, 1563, 1570, + 1571, 1572, 1573, 1983, 1574, 1575, 1576, 1577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1565, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 638, 0, 0, 0, 0, 146, 0, 0, 147, 0, 189, 0, 0, 0, 638, 0, 0, 1983, 189, 0, 189, 0, 189, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 159, 0, 0, 0, - 0, 0, 0, 171, 0, 1578, 1581, 1582, 1583, 1584, - 1585, 1586, 0, 1587, 1588, 1589, 1590, 1591, 1566, 1567, - 1568, 1569, 1550, 1551, 1579, 0, 1553, 0, 1554, 1555, - 1556, 1557, 1558, 1559, 1560, 1561, 1562, 0, 0, 1563, - 1570, 1571, 1572, 1573, 179, 1574, 1575, 1576, 1577, 0, + 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1580, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, @@ -1947,7 +1947,7 @@ var yyAct = [...]int{ 2499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, - 0, 0, 0, 0, 189, 0, 0, 0, 0, 1580, + 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 189, 189, 0, 0, 189, 0, 189, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 189, 0, 0, 2548, 2549, 2550, 2551, @@ -1978,7 +1978,7 @@ var yyAct = [...]int{ 189, 0, 0, 0, 0, 1467, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 1616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 145, 0, 0, 0, 0, 189, 0, 2778, 0, 1473, 189, 166, 0, 0, 0, 878, 0, 0, 0, 878, 0, @@ -1988,7 +1988,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2845, 163, 0, 2848, 164, 0, 0, 0, 638, 0, 0, 0, 0, 0, 189, - 0, 0, 0, 0, 0, 0, 189, 0, 132, 133, + 0, 0, 0, 0, 0, 0, 189, 0, 1620, 1621, 155, 154, 183, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, @@ -1999,98 +1999,98 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 189, 0, 0, 0, 0, 0, 0, 2944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 149, 130, 152, 137, 129, 0, 150, 151, 0, + 189, 149, 1622, 152, 0, 1619, 0, 150, 151, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, - 0, 638, 173, 138, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1564, 141, 139, 134, - 135, 136, 140, 0, 0, 0, 0, 0, 0, 131, - 0, 0, 1113, 0, 0, 0, 0, 0, 142, 0, + 0, 638, 173, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 3005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3020, 0, 0, 3021, 3022, 3023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 158, 0, 0, 0, 638, 0, 0, 0, 0, - 798, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80, 41, + 42, 82, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 158, 0, 0, 0, 638, 0, 0, 86, 0, + 798, 0, 45, 71, 72, 0, 69, 73, 0, 189, + 0, 0, 0, 638, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 1552, 1340, 0, 0, 638, 638, 1340, 189, 189, 189, - 189, 189, 0, 0, 0, 0, 0, 0, 0, 189, - 0, 0, 0, 0, 0, 189, 0, 189, 617, 0, + 0, 1340, 0, 0, 638, 638, 1340, 189, 189, 189, + 189, 189, 0, 0, 58, 0, 0, 0, 0, 189, + 0, 0, 0, 0, 0, 189, 89, 189, 617, 0, 189, 189, 189, 0, 637, 0, 1113, 1113, 0, 153, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, - 0, 0, 0, 1565, 637, 0, 637, 0, 638, 0, + 0, 0, 0, 0, 637, 0, 637, 0, 638, 0, 0, 1340, 0, 0, 0, 0, 638, 0, 0, 0, 146, 189, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 189, 0, 0, 189, 0, 0, - 171, 0, 1578, 1581, 1582, 1583, 1584, 1585, 1586, 0, - 1587, 1588, 1589, 1590, 1591, 1566, 1567, 1568, 1569, 1550, - 1551, 1579, 0, 1553, 0, 1554, 1555, 1556, 1557, 1558, - 1559, 1560, 1561, 1562, 0, 0, 1563, 1570, 1571, 1572, - 1573, 179, 1574, 1575, 1576, 1577, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, + 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 51, 54, 53, 56, 0, + 68, 0, 0, 77, 74, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 85, 84, 0, + 0, 66, 67, 55, 0, 0, 0, 0, 0, 75, + 76, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 160, 165, 162, 168, 169, 170, 172, 174, 175, 176, 177, 0, 0, 0, 0, 0, 178, 180, - 181, 182, 80, 41, 42, 82, 189, 0, 0, 0, + 181, 182, 0, 0, 0, 0, 189, 0, 0, 0, + 59, 60, 0, 61, 62, 63, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 0, 0, 0, 45, 71, 72, 0, - 69, 73, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2060, 0, 0, 0, - 0, 0, 189, 0, 0, 0, 0, 0, 58, 0, + 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 0, 0, 0, 0, 89, 1580, 0, 816, 0, - 0, 189, 804, 817, 818, 819, 820, 805, 0, 0, - 806, 807, 0, 808, 0, 0, 0, 0, 0, 0, - 189, 0, 0, 189, 189, 189, 0, 813, 821, 822, - 0, 0, 0, 638, 638, 0, 938, 0, 0, 0, + 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3343, + 189, 0, 0, 189, 189, 189, 0, 0, 0, 0, + 0, 0, 0, 638, 638, 0, 938, 0, 89, 0, + 0, 816, 0, 0, 0, 804, 817, 818, 819, 820, + 805, 0, 83, 806, 807, 0, 808, 0, 0, 3343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 938, - 0, 0, 0, 0, 2822, 2823, 0, 0, 0, 0, - 638, 638, 638, 638, 0, 0, 823, 824, 825, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, - 857, 858, 859, 860, 861, 862, 863, 864, 48, 51, - 54, 53, 56, 0, 68, 0, 0, 77, 74, 0, + 813, 821, 822, 0, 0, 0, 0, 0, 0, 0, + 638, 638, 638, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 57, 85, 84, 0, 0, 66, 67, 55, 2824, 0, - 0, 0, 0, 75, 76, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 0, 0, 2822, 2823, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 823, + 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, + 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, + 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, + 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, + 864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, - 638, 0, 638, 0, 59, 60, 0, 61, 62, 63, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 2824, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 816, 0, 1975, 0, 0, 817, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2825, 2826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2251, 0, 0, 637, 1266, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, - 637, 0, 0, 0, 0, 189, 0, 0, 638, 0, + 637, 0, 0, 2825, 2826, 189, 0, 0, 638, 0, 0, 0, 0, 0, 2261, 0, 0, 0, 0, 0, - 0, 638, 0, 0, 0, 0, 0, 0, 1339, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 770, 0, 0, 774, 0, 771, 772, 0, 0, - 0, 773, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, - 0, 638, 0, 0, 0, 638, 638, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 638, 0, 0, 0, 0, 0, 0, 1339, 823, + 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, + 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, + 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, + 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, + 864, 638, 0, 0, 0, 638, 638, 0, 0, 0, + 0, 0, 0, 0, 770, 0, 0, 774, 0, 771, + 772, 0, 0, 0, 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2359, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2133,7 +2133,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 816, 0, - 1975, 2824, 0, 817, 0, 0, 0, 0, 0, 0, + 0, 2824, 0, 817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1851, 0, 2060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2705, 0, @@ -2148,8 +2148,8 @@ var yyAct = [...]int{ 857, 858, 859, 860, 861, 862, 863, 864, 0, 2810, 0, 0, 0, 0, 0, 0, 0, 0, 637, 2818, 0, 0, 0, 0, 0, 0, 0, 0, 1339, 0, - 0, 0, 0, 816, 0, 0, 0, 1860, 817, 637, - 0, 0, 0, 0, 0, 1339, 0, 0, 1851, 0, + 0, 0, 0, 0, 0, 0, 0, 1860, 0, 637, + 0, 0, 0, 0, 0, 1339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2157,11 +2157,11 @@ var yyAct = [...]int{ 0, 0, 0, 1115, 0, 1115, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1273, 0, 0, 0, 0, - 637, 823, 824, 825, 826, 827, 828, 829, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, - 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, - 862, 863, 864, 0, 0, 0, 0, 0, 637, 0, + 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, @@ -2238,8 +2238,8 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 1115, 0, 0, 888, 0, 0, 3459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 907, 907, 0, 0, 0, - 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 586, 3164, 3166, 3165, 3183, 3184, + 3185, 3186, 3187, 3188, 3189, 704, 0, 0, 0, 0, 0, 0, 0, 2020, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2261,34 +2261,34 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 930, 0, 0, 0, 0, 1846, 0, 0, - 0, 1846, 1846, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1846, 1846, 3170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3178, 3179, 0, 0, 0, 2773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 1339, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 770, 0, 683, 774, 685, 771, 772, 0, 681, 684, + 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2852, 0, 2238, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 702, 703, 3163, 3167, + 3168, 3169, 3180, 3181, 3182, 3190, 3192, 735, 3191, 3193, + 3194, 3195, 3198, 3199, 3200, 3201, 3196, 3197, 3202, 3147, + 3151, 3148, 3149, 3150, 3162, 3152, 3153, 3154, 3155, 3156, + 3157, 3158, 3159, 3160, 3161, 3203, 3204, 3205, 3206, 3207, + 3208, 3173, 3177, 3176, 3174, 3175, 3171, 3172, 0, 0, 0, 0, 0, 1115, 637, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 775, 0, 776, 0, 0, 780, 0, 0, 0, 782, + 781, 0, 783, 749, 748, 0, 0, 777, 778, 0, + 779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 586, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2995, 0, 0, + 0, 0, 0, 0, 0, 3209, 3210, 3211, 3212, 3213, + 3214, 3215, 3216, 0, 0, 0, 0, 2995, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3595,19 +3595,19 @@ var yyAct = [...]int{ 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, - 0, 0, 0, 219, 0, 976, 0, 0, 0, 0, + 0, 0, 0, 219, 0, 0, 0, 0, 1313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, + 1323, 1324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 0, 385, 244, 0, 0, 0, 975, 541, 0, 0, - 0, 0, 0, 972, 973, 349, 933, 316, 191, 215, - 966, 970, 395, 441, 453, 0, 0, 0, 242, 0, + 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, + 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, + 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, @@ -3655,12 +3655,12 @@ var yyAct = [...]int{ 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 0, 0, 0, 1460, 800, 0, 0, 1457, - 0, 0, 0, 0, 1455, 0, 228, 1456, 1454, 235, - 1459, 0, 765, 335, 344, 343, 324, 325, 327, 329, + 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, + 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, - 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 219, 0, 976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3670,8 +3670,8 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, - 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, - 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, + 0, 0, 0, 975, 541, 0, 0, 0, 0, 0, + 972, 973, 349, 933, 316, 191, 215, 966, 970, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, @@ -3711,22 +3711,22 @@ var yyAct = [...]int{ 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, - 488, 489, 491, 379, 253, 416, 0, 380, 360, 497, - 498, 302, 80, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, - 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, - 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, - 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, + 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, + 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, + 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, + 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, + 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, + 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 89, 0, 0, 0, 188, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, - 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, - 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, - 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, + 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, + 0, 0, 1460, 800, 0, 0, 1457, 0, 0, 0, + 0, 1455, 0, 228, 1456, 1454, 235, 1459, 0, 765, + 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, + 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, + 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, + 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3734,63 +3734,63 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, - 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, - 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, - 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, - 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, - 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, - 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, - 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, - 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, - 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, - 437, 255, 280, 245, 398, 510, 511, 243, 561, 218, - 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, - 512, 376, 366, 320, 339, 340, 267, 293, 429, 359, - 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, - 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, - 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, - 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, - 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, - 0, 408, 452, 230, 522, 475, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 581, 368, 465, 519, 321, 333, - 336, 326, 345, 0, 346, 322, 323, 328, 330, 331, - 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, - 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, - 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, - 317, 318, 363, 431, 0, 190, 211, 352, 88, 434, - 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, - 0, 0, 0, 0, 2064, 0, 0, 2063, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, - 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, - 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, - 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, - 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, - 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, - 460, 287, 288, 426, 427, 300, 301, 556, 557, 286, - 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, - 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, - 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, - 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, - 491, 379, 253, 416, 1516, 0, 360, 497, 498, 302, + 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, + 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, + 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, + 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, + 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, + 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, + 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, + 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, + 526, 276, 436, 203, 485, 515, 229, 463, 0, 0, + 560, 205, 513, 482, 377, 312, 313, 204, 0, 437, + 255, 280, 245, 398, 510, 511, 243, 561, 218, 536, + 210, 0, 535, 391, 505, 514, 378, 367, 209, 512, + 376, 366, 320, 339, 340, 267, 293, 429, 359, 430, + 292, 294, 387, 386, 388, 198, 524, 0, 199, 0, + 478, 525, 562, 224, 225, 227, 0, 266, 270, 278, + 281, 289, 290, 299, 351, 402, 428, 424, 433, 0, + 500, 518, 530, 540, 546, 547, 549, 550, 551, 552, + 553, 555, 554, 390, 297, 474, 319, 357, 0, 0, + 408, 452, 230, 522, 475, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 581, 368, 465, 519, 321, 333, 336, + 326, 345, 0, 346, 322, 323, 328, 330, 331, 332, + 337, 338, 342, 348, 238, 201, 374, 382, 499, 298, + 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, + 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, + 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, + 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, + 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, + 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, + 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, + 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, + 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, + 471, 479, 480, 484, 507, 509, 521, 539, 544, 460, + 287, 288, 426, 427, 300, 301, 556, 557, 286, 516, + 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, + 0, 531, 481, 217, 446, 277, 240, 0, 0, 202, + 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, + 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, + 379, 253, 416, 0, 380, 360, 497, 498, 302, 80, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 399, 0, 0, 0, 1518, 0, 0, 0, + 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 1520, 627, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, + 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, - 0, 0, 0, 0, 0, 219, 0, 0, 0, 1294, - 0, 1295, 1296, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3826,9 +3826,9 @@ var yyAct = [...]int{ 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, - 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, + 431, 0, 190, 211, 352, 88, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2064, 0, 0, 2063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, @@ -3841,72 +3841,72 @@ var yyAct = [...]int{ 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, - 416, 0, 380, 360, 497, 498, 302, 80, 496, 0, + 416, 1516, 0, 360, 497, 498, 302, 496, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, + 0, 0, 0, 1518, 0, 0, 0, 0, 257, 0, + 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, + 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, + 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, + 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, + 396, 477, 273, 0, 0, 0, 0, 1520, 627, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, + 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, + 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, + 0, 0, 219, 0, 0, 0, 1294, 0, 1295, 1296, + 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, - 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, - 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, - 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, - 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 89, 0, 1497, 0, 627, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, - 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, - 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, - 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, + 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, + 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, + 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, + 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, + 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, + 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, + 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, + 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, + 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, + 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, + 511, 243, 561, 218, 536, 210, 0, 535, 391, 505, + 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, + 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, + 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, + 227, 0, 266, 270, 278, 281, 289, 290, 299, 351, + 402, 428, 424, 433, 0, 500, 518, 530, 540, 546, + 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, + 474, 319, 357, 0, 0, 408, 452, 230, 522, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, - 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, - 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, - 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, - 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, - 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, - 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, - 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, - 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, - 377, 312, 313, 204, 0, 437, 255, 280, 245, 398, - 510, 511, 243, 561, 218, 536, 210, 0, 535, 391, - 505, 514, 378, 367, 209, 512, 376, 366, 320, 339, - 340, 267, 293, 429, 359, 430, 292, 294, 387, 386, - 388, 198, 524, 0, 199, 0, 478, 525, 562, 224, - 225, 227, 0, 266, 270, 278, 281, 289, 290, 299, - 351, 402, 428, 424, 433, 0, 500, 518, 530, 540, - 546, 547, 549, 550, 551, 552, 553, 555, 554, 390, - 297, 474, 319, 357, 0, 0, 408, 452, 230, 522, - 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, - 368, 465, 519, 321, 333, 336, 326, 345, 0, 346, - 322, 323, 328, 330, 331, 332, 337, 338, 342, 348, - 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, - 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, - 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, - 190, 211, 352, 88, 434, 275, 559, 532, 527, 197, - 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, + 0, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 581, 368, + 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, + 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, + 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, + 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, + 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, + 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, + 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, - 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, - 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, - 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, - 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, - 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, - 507, 509, 521, 539, 544, 460, 287, 288, 426, 427, - 300, 301, 556, 557, 286, 516, 545, 0, 0, 362, - 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, - 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, - 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, - 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, - 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, + 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, + 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, + 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, + 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, + 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, + 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, + 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, + 301, 556, 557, 286, 516, 545, 0, 0, 362, 0, + 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, + 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, + 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, + 464, 487, 488, 489, 491, 379, 253, 416, 0, 380, + 360, 497, 498, 302, 80, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, @@ -3914,7 +3914,7 @@ var yyAct = [...]int{ 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 89, 0, 0, 0, 188, 0, 0, 0, + 273, 0, 89, 0, 1497, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, @@ -3956,8 +3956,8 @@ var yyAct = [...]int{ 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, 352, - 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, - 0, 0, 0, 0, 0, 0, 2064, 0, 0, 2063, + 88, 434, 275, 559, 532, 527, 197, 213, 0, 249, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, @@ -3972,14 +3972,14 @@ var yyAct = [...]int{ 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 399, 0, 0, 0, 2014, 0, + 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, - 0, 0, 1697, 188, 0, 0, 0, 0, 0, 0, + 0, 309, 237, 311, 195, 396, 477, 273, 0, 89, + 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, @@ -3997,7 +3997,7 @@ var yyAct = [...]int{ 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, - 415, 449, 422, 274, 0, 2012, 450, 356, 506, 432, + 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, @@ -4022,7 +4022,7 @@ var yyAct = [...]int{ 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2064, 0, 0, 2063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, @@ -4037,20 +4037,20 @@ var yyAct = [...]int{ 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 399, 0, 0, 0, 2014, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, - 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, - 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 311, 195, 396, 477, 273, 0, 0, 0, 0, 1697, + 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, - 0, 0, 0, 0, 0, 0, 0, 0, 927, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4059,10 +4059,10 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, - 0, 0, 0, 0, 0, 0, 349, 933, 316, 191, - 215, 931, 0, 395, 441, 453, 0, 0, 0, 242, + 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, + 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, - 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, + 274, 0, 2012, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, @@ -4102,20 +4102,20 @@ var yyAct = [...]int{ 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, - 0, 0, 2014, 0, 0, 0, 0, 257, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 0, 0, 0, 1697, 188, 0, 0, + 477, 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4124,7 +4124,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, - 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, + 0, 0, 0, 349, 933, 316, 191, 215, 931, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, @@ -4166,14 +4166,14 @@ var yyAct = [...]int{ 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 399, 0, 0, 0, 2014, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 1497, 0, 627, 0, 0, 0, 0, 0, + 0, 0, 0, 1697, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, @@ -4188,7 +4188,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, - 0, 0, 541, 0, 0, 0, 3294, 0, 0, 0, + 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, @@ -4237,8 +4237,8 @@ var yyAct = [...]int{ 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 1847, 627, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 311, 195, 396, 477, 273, 0, 0, 0, 1497, + 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, @@ -4246,14 +4246,14 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1848, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, - 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, + 0, 0, 0, 3294, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, @@ -4302,7 +4302,7 @@ var yyAct = [...]int{ 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 2415, 627, 0, + 396, 477, 273, 0, 0, 0, 0, 1847, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, @@ -4311,7 +4311,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2416, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4367,8 +4367,8 @@ var yyAct = [...]int{ 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, - 2400, 0, 0, 0, 0, 228, 0, 0, 235, 2401, + 0, 0, 0, 0, 2415, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, @@ -4376,7 +4376,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4426,14 +4426,14 @@ var yyAct = [...]int{ 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, - 0, 0, 257, 1539, 0, 0, 0, 350, 254, 0, + 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, - 0, 1538, 627, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, + 0, 0, 627, 0, 0, 0, 0, 2400, 0, 0, + 0, 0, 228, 0, 0, 235, 2401, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, @@ -4491,13 +4491,13 @@ var yyAct = [...]int{ 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, - 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, + 1539, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 0, 0, 0, 0, 629, - 630, 631, 0, 0, 0, 0, 0, 0, 0, 228, + 195, 396, 477, 273, 0, 0, 0, 0, 1538, 627, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, @@ -4561,7 +4561,7 @@ var yyAct = [...]int{ 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, + 273, 0, 0, 0, 0, 0, 629, 630, 631, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, @@ -4576,7 +4576,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, - 0, 0, 0, 0, 541, 0, 0, 0, 3418, 0, + 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, @@ -4626,7 +4626,7 @@ var yyAct = [...]int{ 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, - 0, 0, 1697, 188, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, @@ -4641,7 +4641,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, - 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, + 0, 541, 0, 0, 0, 3418, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, @@ -4690,8 +4690,8 @@ var yyAct = [...]int{ 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, - 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, - 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 311, 195, 396, 477, 273, 0, 0, 0, 0, 1697, + 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, @@ -4706,7 +4706,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, - 0, 0, 3294, 0, 0, 0, 349, 0, 316, 191, + 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, @@ -4755,7 +4755,7 @@ var yyAct = [...]int{ 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 89, 0, 0, 0, 627, 0, 0, + 477, 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, @@ -4770,7 +4770,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, - 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, + 244, 0, 0, 0, 0, 541, 0, 0, 0, 3294, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, @@ -4812,7 +4812,7 @@ var yyAct = [...]int{ 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, - 497, 498, 302, 496, 0, 0, 0, 0, 2065, 0, + 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, @@ -4820,7 +4820,7 @@ var yyAct = [...]int{ 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, + 89, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, @@ -4877,7 +4877,7 @@ var yyAct = [...]int{ 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, - 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 496, 0, 0, 0, 0, 2065, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, @@ -4885,7 +4885,7 @@ var yyAct = [...]int{ 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 1520, 627, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, @@ -4949,7 +4949,7 @@ var yyAct = [...]int{ 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 0, 627, 0, + 396, 477, 273, 0, 0, 0, 0, 1520, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, @@ -4958,7 +4958,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1327, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6304,25 +6304,25 @@ var yyAct = [...]int{ } var yyPact = [...]int{ - -1000, -1000, 5263, -1000, -458, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 4969, -1000, -456, -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, 2260, 2300, - -1000, -1000, -1000, -1000, 2433, -1000, 875, 1965, -1000, 2261, - 4625, -1000, 47207, 621, -1000, 44619, 620, 630, 29738, -1000, - 209, -1000, 164, 45913, 202, -1000, -1000, -1000, -292, 19384, - 2183, 78, 77, 47207, -1000, -1000, -1000, -1000, 2398, 1911, - -1000, 394, -1000, -1000, -1000, -1000, -1000, -1000, 43972, -1000, - 1009, -1000, -1000, 2269, 2231, 2444, 787, 2165, -1000, 2326, - 1911, -1000, 19384, 2387, 2307, 18737, 18737, 569, -1000, -1000, - 348, -1000, -1000, 25209, 47207, 32326, 586, -1000, 2261, -1000, - -1000, -1000, 99, -1000, 470, 1831, -1000, 1830, -1000, 675, - 864, 485, 588, 578, 481, 473, 472, 471, 469, 467, - 454, 453, 492, -1000, 814, 814, -111, -115, 3182, 567, - 545, 545, 1011, 585, 2213, 2203, -1000, -1000, 814, 814, - 814, 479, 814, 814, 814, 814, 383, 382, 814, 814, - 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, - 814, 814, 814, 814, 814, 422, 2261, 364, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2161, 2275, + -1000, -1000, -1000, -1000, 2360, -1000, 827, 1842, -1000, 2174, + 307, -1000, 47207, 600, -1000, 44619, 599, 221, 30385, -1000, + 200, -1000, 205, 45913, 210, -1000, -1000, -1000, -297, 19384, + 2080, 86, 83, 47207, -1000, -1000, -1000, -1000, 2322, 1858, + -1000, 385, -1000, -1000, -1000, -1000, -1000, -1000, 43972, -1000, + 999, -1000, -1000, 2185, 2179, 2375, 737, 2087, -1000, 2263, + 1858, -1000, 19384, 2314, 2248, 18737, 18737, 522, -1000, -1000, + 162, -1000, -1000, 25856, 47207, 32973, 392, -1000, 2174, -1000, + -1000, -1000, 117, -1000, 411, 1775, -1000, 1774, -1000, 976, + 723, 441, 551, 519, 440, 438, 437, 418, 417, 415, + 408, 393, 447, -1000, 798, 798, -117, -121, 1726, 633, + 480, 480, 809, 557, 2115, 2095, -1000, -1000, 798, 798, + 798, 365, 798, 798, 798, 798, 326, 321, 798, 798, + 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, + 798, 798, 798, 798, 798, 375, 2174, 299, -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, @@ -6362,59 +6362,59 @@ 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, 47207, 374, 47207, -1000, 690, 47207, 955, 955, - 129, 955, 955, 955, 955, 265, 793, 69, -1000, 256, - 344, 228, 340, 941, 743, -1000, -1000, 360, 941, 1692, - -1000, 791, 234, -1000, 955, 955, -1000, 12889, 165, 12889, - 12889, -1000, 2239, -1000, -1000, -1000, -1000, -1000, 1234, -1000, - -1000, -1000, -1000, -1000, 583, -1000, -1000, -1000, -1000, 45913, - 43325, -1000, -1000, 82, -1000, -1000, 1744, 1467, 19384, 1219, - -1000, 1169, 749, -1000, -1000, -1000, -1000, -1000, 652, -1000, - 20031, 20031, 20031, 20031, -1000, -1000, 1839, 42678, 1839, 1839, - 20031, 1839, -1000, 20031, 1839, 1839, 1839, 19384, 1839, 1839, - 1839, 1839, -1000, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, -1000, -1000, -1000, -1000, 1839, 689, 1839, 1839, 1839, - 1839, 1839, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1839, 1839, 1839, 1839, 1839, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21325, - 1408, 1397, 1380, -1000, 16796, 1839, -1000, -1000, -1000, -1000, + -1000, -1000, 47207, 250, 47207, -1000, 657, 47207, 932, 932, + 107, 932, 932, 932, 932, 215, 721, 76, -1000, 208, + 303, 194, 296, 888, 405, -1000, -1000, 283, 888, 1650, + -1000, 748, 196, -1000, 932, 932, -1000, 12889, 157, 12889, + 12889, -1000, 2163, -1000, -1000, -1000, -1000, -1000, 1161, -1000, + -1000, -1000, -1000, -1000, 556, -1000, -1000, -1000, -1000, 45913, + 43325, -1000, -1000, 80, -1000, -1000, 1662, 1231, 19384, 1167, + -1000, 1101, 713, -1000, -1000, -1000, -1000, -1000, 638, -1000, + 20031, 20031, 20031, 20031, -1000, -1000, 1778, 42678, 1778, 1778, + 20031, 1778, -1000, 20031, 1778, 1778, 1778, 19384, 1778, 1778, + 1778, 1778, -1000, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, -1000, -1000, -1000, -1000, 1778, 655, 1778, 1778, 1778, + 1778, 1778, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1778, 1778, 1778, 1778, 1778, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21972, + 1394, 1393, 1390, -1000, 16796, 1778, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 47207, -1000, 1839, 233, - 45913, 45913, 425, 2326, 1911, -1000, 2398, 2379, 394, -1000, - 3108, 1406, 1439, 1334, 1911, 1814, 47207, -1000, 1853, -1000, - -1000, -1000, -1000, 2096, 1393, 1687, -1000, -1000, -1000, -1000, - 2027, 19384, -1000, -1000, 2422, -1000, 22620, 688, 2415, 42031, - -1000, 569, 569, 1827, 428, 57, -1000, -1000, -1000, -1000, - 841, 29091, -1000, -1000, -1000, -1000, 1732, 47207, -1000, -1000, - 4853, 1252, -1000, 1963, -1000, 1730, -1000, 1896, 19384, 1929, - 613, 1252, 597, 596, 595, -1000, -17, -1000, -1000, -1000, - -1000, -1000, -1000, 814, 814, 814, -1000, 484, 2384, 4625, - 3608, -1000, -1000, -1000, 41384, 1961, 1252, -1000, 1956, -1000, - 927, 663, 722, 722, 1252, -1000, -1000, 46560, 1252, 926, - 923, 1252, 1252, 45913, 45913, -1000, 40737, -1000, 40090, 39443, - 1180, 45913, 38796, 38149, 37502, 36855, 36208, -1000, 2054, -1000, - 1942, -1000, -1000, -1000, 46560, 1252, 1252, 46560, 45913, 46560, - 47207, 1252, -1000, -1000, 385, -1000, -1000, 1178, 1165, 1163, - 814, 814, 1162, 1678, 1670, 1665, 814, 814, 1161, 1663, - 31032, 1656, 362, 1158, 1154, 1150, 1152, 1647, 199, 1580, - 1128, 1127, 1149, 45913, 1952, 47207, -1000, 327, 824, 561, - 837, 2261, 2178, 1825, 580, 608, 1252, 560, 560, 45913, - -1000, 14848, -1000, -1000, 1578, 19384, -1000, 942, 941, 941, - -1000, -1000, -1000, -1000, -1000, -1000, 955, 47207, 942, -1000, - -1000, -1000, 941, 955, 47207, 955, 955, 955, 955, 941, - 941, 941, 955, 47207, 47207, 47207, 47207, 47207, 47207, 47207, - 47207, 47207, 12889, 791, 955, -300, -1000, 1572, -1000, 2073, + -1000, -1000, -1000, -1000, -1000, -1000, 47207, -1000, 1778, 241, + 45913, 45913, 436, 2263, 1858, -1000, 2322, 2282, 385, -1000, + 2884, 1385, 1371, 1282, 1858, 1758, 47207, -1000, 1785, -1000, + -1000, -1000, -1000, 2003, 1307, 1640, -1000, -1000, -1000, -1000, + 2051, 19384, -1000, -1000, 2353, -1000, 23267, 651, 2350, 42031, + -1000, 522, 522, 1772, 433, 19, -1000, -1000, -1000, -1000, + 813, 29738, -1000, -1000, -1000, -1000, 1649, 47207, -1000, -1000, + 3675, 1165, -1000, 1841, -1000, 1643, -1000, 1797, 19384, 1852, + 584, 1165, 575, 572, 562, -1000, -21, -1000, -1000, -1000, + -1000, -1000, -1000, 798, 798, 798, -1000, 419, 2308, 307, + 4625, -1000, -1000, -1000, 41384, 1839, 1165, -1000, 1832, -1000, + 899, 607, 686, 686, 1165, -1000, -1000, 46560, 1165, 875, + 871, 1165, 1165, 45913, 45913, -1000, 40737, -1000, 40090, 39443, + 1155, 45913, 38796, 38149, 37502, 36855, 36208, -1000, 2091, -1000, + 2020, -1000, -1000, -1000, 46560, 1165, 1165, 46560, 45913, 46560, + 47207, 1165, -1000, -1000, 362, -1000, -1000, 1146, 1140, 1136, + 798, 798, 1129, 1638, 1618, 1602, 798, 798, 1127, 1597, + 31679, 1591, 329, 1122, 1119, 1115, 1152, 1586, 189, 1560, + 1151, 1149, 1109, 45913, 1831, 47207, -1000, 274, 780, 486, + 812, 2174, 2073, 1771, 543, 583, 1165, 508, 508, 45913, + -1000, 14848, -1000, -1000, 1546, 19384, -1000, 889, 888, 888, + -1000, -1000, -1000, -1000, -1000, -1000, 932, 47207, 889, -1000, + -1000, -1000, 888, 932, 47207, 932, 932, 932, 932, 888, + 888, 888, 932, 47207, 47207, 47207, 47207, 47207, 47207, 47207, + 47207, 47207, 12889, 748, 932, -301, -1000, 1514, -1000, 1960, -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, @@ -6431,277 +6431,277 @@ 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, 12889, 12889, -1000, -1000, - -1000, -1000, 200, -1000, 35561, 409, 835, -1000, 1824, 34914, - -1000, -333, -340, -342, -359, -1000, -1000, -1000, -360, -362, - -1000, -1000, -1000, 19384, 19384, 19384, 19384, -147, -1000, 936, - 20031, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 171, 965, + -1000, -1000, 209, -1000, 35561, 400, 811, -1000, 1770, 34914, + -1000, -312, -315, -349, -353, -1000, -1000, -1000, -356, -358, + -1000, -1000, -1000, 19384, 19384, 19384, 19384, -150, -1000, 990, + 20031, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 136, 967, 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, - 20031, 20031, 20031, 20031, 20031, -1000, -1000, 27150, 6253, 6253, - 749, 749, 749, 749, -1000, -82, 1823, 46560, -1000, -1000, - -1000, 684, 19384, 19384, 749, -1000, 1252, 16796, 34267, 18737, - 18737, 19384, 856, 1467, 46560, 19384, -1000, 1334, -1000, -1000, - -1000, 1142, -1000, 954, 2245, 2245, 2245, 2245, 19384, 19384, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 2245, 45913, - 45913, 858, 19384, 19384, 19384, 19384, 19384, 19384, 15501, 19384, - 19384, 20031, 19384, 19384, 19384, 1334, 19384, 19384, 19384, 19384, + 20031, 20031, 20031, 20031, 20031, -1000, -1000, 27797, 6098, 6098, + 713, 713, 713, 713, -1000, -84, 1768, 46560, -1000, -1000, + -1000, 649, 19384, 19384, 713, -1000, 1165, 16796, 20678, 18737, + 18737, 19384, 822, 1231, 46560, 19384, -1000, 1282, -1000, -1000, + -1000, 1154, -1000, 908, 2209, 2209, 2209, 2209, 19384, 19384, + 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 2209, 45913, + 45913, 591, 19384, 19384, 19384, 19384, 19384, 19384, 15501, 19384, + 19384, 20031, 19384, 19384, 19384, 1282, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, - 19384, 19384, 19384, 1334, 19384, 1372, 19384, 19384, 18737, 14195, + 19384, 19384, 19384, 1282, 19384, 1048, 19384, 19384, 18737, 14195, 18737, 18737, 18737, 18737, 18737, -1000, -1000, -1000, -1000, -1000, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 1334, 19384, + 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 1282, 19384, 19384, 19384, 19384, 19384, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1591, 1333, 1404, 19384, -1000, 1817, - -1000, -84, 24562, 19384, 1557, 2413, 2002, 45913, -1000, -1000, - -1000, 2326, -1000, 2326, 1591, 3101, 2099, 18737, -1000, -1000, - 3101, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1646, - -1000, 47207, 1814, 2287, 45913, 2085, 1555, 514, -1000, 19384, - 19384, 1810, -1000, 1364, 47207, -1000, -147, -1000, 33620, -1000, - -1000, 12236, 47207, 421, 47207, -1000, 23915, 32973, 281, 57, - -1000, 1780, -1000, 49, 40, 16148, 748, -1000, -1000, -1000, - 3182, 20678, 1739, 748, 130, -1000, -1000, -1000, 1896, -1000, - 1896, 1896, 1896, 1896, 514, 514, 514, 514, -1000, -1000, - -1000, -1000, -1000, 1950, 1946, -1000, 1896, 1896, 1896, 1896, + -1000, -1000, -1000, -1000, 1355, 1387, 1337, 19384, -1000, 1761, + -1000, -100, 25209, 19384, 1478, 2335, 1875, 45913, -1000, -1000, + -1000, 2263, -1000, 2263, 1355, 2734, 2006, 18737, -1000, -1000, + 2734, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1564, + -1000, 47207, 1758, 2227, 45913, 1996, 1472, 381, -1000, 19384, + 19384, 1754, -1000, 1281, 47207, -1000, -150, -1000, 34267, -1000, + -1000, 12236, 47207, 372, 47207, -1000, 24562, 33620, 238, 19, + -1000, 1711, -1000, 56, 32, 16148, 712, -1000, -1000, -1000, + 1726, 21325, 1660, 712, 134, -1000, -1000, -1000, 1797, -1000, + 1797, 1797, 1797, 1797, 381, 381, 381, 381, -1000, -1000, + -1000, -1000, -1000, 1828, 1827, -1000, 1797, 1797, 1797, 1797, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1943, 1943, 1943, - 1906, 1906, 535, -1000, 19384, 304, 32326, 2267, 1139, 2036, - 327, 564, 1995, 1252, 1252, 1252, 564, -1000, 1329, 1327, - 1322, -1000, -447, 1796, -1000, -1000, 2382, -1000, -1000, 943, - 957, 949, 984, 45913, 247, 408, -1000, 515, -1000, 32326, - 1252, 916, 722, 1252, -1000, 1252, -1000, -1000, -1000, -1000, - -1000, 1252, -1000, -1000, 1795, -1000, 1822, 1003, 945, 979, - 938, 1795, -1000, -1000, -88, 1795, -1000, 1795, -1000, 1795, - -1000, 1795, -1000, 1795, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 831, 227, -208, 45913, 247, 579, -1000, - 573, 27150, -1000, -1000, -1000, 27150, 27150, -1000, -1000, -1000, - -1000, 1538, 1535, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1821, 1821, 1821, + 1812, 1812, 494, -1000, 19384, 306, 32973, 2195, 1107, 1030, + 274, 518, 1874, 1165, 1165, 1165, 518, -1000, 1277, 1275, + 1253, -1000, -447, 1752, -1000, -1000, 2307, -1000, -1000, 621, + 938, 937, 668, 45913, 249, 359, -1000, 475, -1000, 32973, + 1165, 865, 686, 1165, -1000, 1165, -1000, -1000, -1000, -1000, + -1000, 1165, -1000, -1000, 1749, -1000, 1764, 975, 929, 974, + 911, 1749, -1000, -1000, -90, 1749, -1000, 1749, -1000, 1749, + -1000, 1749, -1000, 1749, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 808, 234, -217, 45913, 249, 537, -1000, + 536, 27797, -1000, -1000, -1000, 27797, 27797, -1000, -1000, -1000, + -1000, 1448, 1444, -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, -418, 47207, -1000, 264, 832, 387, 437, 436, - 47207, 429, 2318, 2316, 2310, 2301, 2294, 355, 376, 47207, - 47207, 560, 2047, 47207, 2276, 47207, -1000, -1000, -1000, -1000, - -1000, 1467, 47207, -1000, -1000, 955, 955, -1000, -1000, 47207, - 955, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 955, + -1000, -1000, -428, 47207, -1000, 267, 806, 352, 398, 330, + 47207, 346, 2252, 2246, 2243, 2241, 2236, 414, 318, 47207, + 47207, 508, 1967, 47207, 2215, 47207, -1000, -1000, -1000, -1000, + -1000, 1231, 47207, -1000, -1000, 932, 932, -1000, -1000, 47207, + 932, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 932, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 47207, -1000, -1000, -1000, -1000, 45913, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -99, 158, 47, 388, -1000, -1000, -1000, -1000, -1000, 2323, - -1000, 1467, 894, 901, -1000, 1839, -1000, -1000, 1030, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 171, 20031, 20031, 20031, - 1288, 610, 1636, 1100, 1151, 1135, 1135, 1004, 1004, 753, - 753, 753, 753, 753, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1532, -1000, 1839, 46560, 1724, 14195, 1213, 2005, - 1334, 2956, -1000, 1660, -1000, 1660, 1811, 859, -1000, 19384, - 1334, 2916, -1000, -1000, 1334, 1334, 1334, 19384, -1000, -1000, - 19384, 19384, 19384, 19384, 2036, 2036, 2036, 2036, 2036, 2036, - 2036, 2036, 2036, 2036, 19384, 1794, 1786, 2411, -1000, -1000, + -99, 43, 49, 374, -1000, -1000, -1000, -1000, -1000, 2257, + -1000, 1231, 847, 835, -1000, 1778, -1000, -1000, 1058, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 136, 20031, 20031, 20031, + 1642, 546, 1653, 1124, 1534, 1021, 1021, 873, 873, 724, + 724, 724, 724, 724, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1440, -1000, 1778, 46560, 1637, 14195, 1466, 2046, + 1282, 2977, -1000, 1633, -1000, 1633, 1360, 864, -1000, 19384, + 1282, 2956, -1000, -1000, 1282, 1282, 1282, 19384, -1000, -1000, + 19384, 19384, 19384, 19384, 1030, 1030, 1030, 1030, 1030, 1030, + 1030, 1030, 1030, 1030, 19384, 1748, 1716, 2334, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1044, - 2036, 2036, 2036, 2036, 2036, 19384, 1721, -1000, -1000, -1000, - 1387, 2894, 1238, 2885, 2036, 2036, -1000, 2036, 2857, 2837, - 1334, 1744, 1334, 1785, -1000, 2813, 2036, 2807, 2802, 2797, - 2014, 2792, 2776, 2770, 2036, 2036, 2036, 1980, 2764, 2758, - 2752, 2740, 2728, 2709, 2697, 2690, 2684, 2036, -150, 2036, - 1334, -1000, -1000, -1000, -1000, -1000, 2679, 1971, 1334, 1784, - 1839, 676, -1000, -1000, 1660, 1334, 1334, 1660, 1660, 2624, - 2601, 2582, 2432, 2311, 2303, 2036, 2036, -1000, 2036, 2293, - 2255, 1958, 1940, 1334, -1000, 1404, 47207, -1000, -284, -1000, - 24, 797, 1839, -1000, 31032, 1334, -1000, 6098, -1000, 1189, - -1000, -1000, -1000, -1000, -1000, 28444, 1737, 3101, -1000, -1000, - 1839, 1655, -1000, -1000, 514, 95, 27797, 735, 735, 137, - 1467, 1467, 19384, -1000, -1000, -1000, -1000, -1000, -1000, 673, - 2399, 391, 1839, -1000, 1790, 2514, -1000, -1000, -1000, 2285, - 21973, -1000, -1000, 1839, 1839, 47207, 1708, 1691, -1000, 670, - -1000, 1255, 1780, 57, 46, -1000, -1000, -1000, -1000, 1467, - -1000, 1275, 430, 1726, -1000, 552, -1000, -1000, -1000, -1000, - 2190, 107, -1000, -1000, -1000, 279, 514, -1000, -1000, -1000, - -1000, -1000, -1000, 1521, 1521, -1000, -1000, -1000, -1000, -1000, - 1134, -1000, -1000, -1000, 1133, -1000, -1000, 2114, 2038, 304, - -1000, -1000, 814, 1517, -1000, -1000, 2197, 814, 814, 45913, - -1000, -1000, 1709, 2267, 264, 47207, 868, 2046, -1000, 1995, - 1995, 1995, 47207, -1000, -1000, -1000, -1000, -1000, -1000, -437, - 63, 384, -1000, -1000, -1000, 309, 45913, 1653, -1000, 249, - -1000, 1705, -1000, 45913, -1000, 1640, 1930, 1252, 1252, -1000, - -1000, -1000, 45913, 1839, -1000, -1000, -1000, -1000, 605, 2242, - 308, -1000, -1000, -183, -1000, -1000, 247, 249, 46560, 1252, - 748, -1000, -1000, -1000, -1000, -1000, -421, 1638, 589, 255, - 339, 47207, 47207, 47207, 47207, 47207, 655, -1000, -1000, 68, - -1000, -1000, 224, -1000, -1000, -1000, -1000, 224, -1000, -1000, - -1000, -1000, 370, 568, -1000, 47207, 47207, 710, -1000, -1000, - -1000, 941, -1000, -1000, 941, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 2233, 47207, 37, -383, -1000, - -379, 19384, -1000, -1000, -1000, -1000, 1217, 609, 1636, 20031, - 20031, 20031, -1000, -1000, -1000, 884, 884, 27150, -1000, 19384, - 18737, -1000, -1000, 19384, 19384, 846, -1000, 19384, 1014, -1000, - 19384, -1000, -1000, -1000, 1404, 2036, 2036, 2036, 2036, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1818, - 19384, 19384, 19384, 1334, 320, -1000, -1000, -1000, -1000, -1000, - 2410, -1000, 19384, -1000, 27150, 19384, 19384, 19384, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1213, + 1030, 1030, 1030, 1030, 1030, 19384, 2008, -1000, -1000, -1000, + 1320, 2865, 1500, 2854, 1030, 1030, -1000, 1030, 2843, 2838, + 1282, 1662, 1282, 1715, -1000, 2832, 1030, 2802, 2797, 2791, + 1994, 2786, 2776, 2764, 1030, 1030, 1030, 1987, 2758, 2752, + 2742, 2729, 2709, 2696, 2684, 2679, 2624, 1030, -155, 1030, + 1282, -1000, -1000, -1000, -1000, -1000, 2601, 1972, 1282, 1714, + 1778, 643, -1000, -1000, 1633, 1282, 1282, 1633, 1633, 2582, + 2311, 2305, 2295, 2245, 2237, 1030, 1030, -1000, 1030, 2225, + 2190, 1968, 1938, 1282, -1000, 1337, 47207, -1000, -294, -1000, + 42, 733, 1778, -1000, 31679, 1282, -1000, 5491, -1000, 1053, + -1000, -1000, -1000, -1000, -1000, 29091, 1712, 2734, -1000, -1000, + 1778, 1629, -1000, -1000, 381, 118, 28444, 709, 709, 155, + 1231, 1231, 19384, -1000, -1000, -1000, -1000, -1000, -1000, 642, + 2323, 386, 1778, -1000, 1713, 2514, -1000, -1000, -1000, 2221, + 22620, -1000, -1000, 1778, 1778, 47207, 1709, 1695, -1000, 635, + -1000, 1184, 1711, 19, 29, -1000, -1000, -1000, -1000, 1231, + -1000, 1251, 382, 671, -1000, 517, -1000, -1000, -1000, -1000, + 2096, 114, -1000, -1000, -1000, 270, 381, -1000, -1000, -1000, + -1000, -1000, -1000, 1438, 1438, -1000, -1000, -1000, -1000, -1000, + 1102, -1000, -1000, -1000, 1100, -1000, -1000, 2086, 1877, 306, + -1000, -1000, 798, 1430, -1000, -1000, 2101, 798, 798, 45913, + -1000, -1000, 1596, 2195, 267, 47207, 817, 1966, -1000, 1874, + 1874, 1874, 47207, -1000, -1000, -1000, -1000, -1000, -1000, -432, + 63, 395, -1000, -1000, -1000, 3608, 45913, 1627, -1000, 244, + -1000, 1386, -1000, 45913, -1000, 1625, 1820, 1165, 1165, -1000, + -1000, -1000, 45913, 1778, -1000, -1000, -1000, -1000, 577, 2157, + 302, -1000, -1000, -179, -1000, -1000, 249, 244, 46560, 1165, + 712, -1000, -1000, -1000, -1000, -1000, -435, 1607, 560, 255, + 336, 47207, 47207, 47207, 47207, 47207, 612, -1000, -1000, 67, + -1000, -1000, 220, -1000, -1000, -1000, -1000, 220, -1000, -1000, + -1000, -1000, 309, 530, -1000, 47207, 47207, 676, -1000, -1000, + -1000, 888, -1000, -1000, 888, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 2134, 47207, 48, -393, -1000, + -389, 19384, -1000, -1000, -1000, -1000, 1217, 541, 1653, 20031, + 20031, 20031, -1000, -1000, -1000, 807, 807, 27797, -1000, 19384, + 18737, -1000, -1000, 19384, 19384, 781, -1000, 19384, 913, -1000, + 19384, -1000, -1000, -1000, 1337, 1030, 1030, 1030, 1030, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1704, + 19384, 19384, 19384, 1282, 338, -1000, -1000, -1000, -1000, -1000, + 2329, -1000, 19384, -1000, 27797, 19384, 19384, 19384, -1000, -1000, -1000, 19384, 19384, -1000, -1000, 19384, 19384, -1000, 19384, 19384, 19384, -1000, 19384, 19384, 19384, 19384, -1000, -1000, -1000, -1000, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, - -1000, -1000, 32326, 106, -150, 1372, 106, 1372, -1000, 18737, + -1000, -1000, 32973, 106, -155, 1048, 106, 1048, -1000, 18737, 13542, -1000, -1000, -1000, -1000, -1000, 19384, 19384, 19384, 19384, 19384, 19384, -1000, -1000, -1000, 19384, 19384, -1000, 19384, -1000, - 19384, -1000, -1000, -1000, -1000, -1000, 797, -1000, 722, 722, - 722, 45913, -1000, -1000, -1000, -1000, 1777, -1000, 2314, -1000, - 2131, 2116, 2409, 2399, -1000, 23915, 3101, -1000, -1000, 45913, - -274, -1000, 2172, 2187, 735, 735, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 11583, 2326, 19384, 2040, 46560, 159, -1000, - 23268, 45913, 46560, 23915, 23915, 23915, 23915, 23915, -1000, 2070, - 2061, -1000, 2115, 2095, 2148, 47207, -1000, 1591, 1633, -1000, - 19384, 25856, 1751, 23915, -1000, -1000, 23915, 47207, 10930, -1000, - -1000, 31, 35, -1000, -1000, -1000, -1000, 3182, -1000, -1000, - 3205, 2284, 2184, -1000, -1000, -1000, -1000, -1000, 1631, -1000, - 1629, 1771, 1625, 227, -1000, 1898, 2232, 814, 814, -1000, - 1125, -1000, 1252, 1506, 1504, -1000, -1000, -1000, 587, -1000, - 2274, 47207, 2039, 2037, 2034, -1000, -445, 1123, 1923, 1887, - 19384, 1920, 2381, 1767, 45913, -1000, -1000, 46560, -1000, 300, - -1000, 304, 45913, -1000, -1000, -1000, 408, 47207, -1000, 5931, - -1000, -1000, -1000, 249, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 47207, 329, -1000, 1908, 1233, -1000, -1000, 1977, -1000, - -1000, -1000, -1000, 271, 386, 1478, 222, 1448, 222, -1000, - 47207, 707, 2038, 47207, -1000, -1000, -1000, 955, 955, -1000, - -1000, 2223, -1000, 1252, 2036, 20031, 20031, -1000, 749, 322, - -128, 1896, 1896, -1000, 1896, 1906, -1000, 1896, 181, 1896, - 179, 1896, -1000, -1000, 1334, 1334, 1404, -1000, 1935, 993, - -1000, 1467, 19384, 2236, -1000, -1000, -1000, -1000, -1000, -23, - 2210, 2194, 2036, -1000, 1890, 1889, 19384, 2036, 1334, 1924, - 2036, 2036, 2036, 2036, -1000, 1467, 1404, 2181, 1404, 2036, - 2036, 2175, 333, 2036, 1621, 1621, 1621, 1621, 1621, 1404, - 1404, 1404, 1404, 45913, -1000, -150, -1000, -1000, -201, -202, - -1000, 1334, -150, 1770, 1334, -1000, 1912, 1903, 2139, 1893, - 2036, 2104, 2036, 2036, 2036, 1807, -1000, 2304, 2304, 2304, - 1576, 1189, 47207, -1000, -1000, -1000, -1000, 2399, 2394, 1768, - -1000, -1000, 95, 427, -1000, 2149, 2187, -1000, 2360, 2156, - 2356, -1000, -1000, -1000, -1000, -1000, 1467, -1000, 2246, 1747, - -1000, 819, 1753, -1000, -1000, 18090, 1613, 2103, 668, 1576, - 1820, 2514, 1993, 2030, 2315, -1000, -1000, -1000, -1000, 2060, - -1000, 2059, -1000, -1000, 1853, -1000, 2010, 421, 23915, 1734, - 1734, -1000, 666, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 982, 5268, 2435, -1000, 1440, -1000, 1188, 205, 1113, -1000, - -1000, 814, 814, -1000, 915, 910, -1000, 47207, 1885, -1000, - 514, 1414, 514, 1107, -1000, 1106, -1000, -1000, -1000, -1000, - 1882, 2025, -1000, -1000, -1000, -1000, 47207, -1000, -1000, 47207, - 47207, 47207, 1873, 2354, -1000, 19384, 1872, 816, 2091, 45913, + 19384, -1000, -1000, -1000, -1000, -1000, 733, -1000, 686, 686, + 686, 45913, -1000, -1000, -1000, -1000, 1702, -1000, 2259, -1000, + 2041, 2037, 2327, 2323, -1000, 24562, 2734, -1000, -1000, 45913, + -281, -1000, 2069, 2104, 709, 709, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 11583, 2263, 19384, 1963, 46560, 142, -1000, + 23915, 45913, 46560, 24562, 24562, 24562, 24562, 24562, -1000, 1979, + 1916, -1000, 2026, 2019, 2138, 47207, -1000, 1355, 1595, -1000, + 19384, 26503, 1667, 24562, -1000, -1000, 24562, 47207, 10930, -1000, + -1000, 47, 26, -1000, -1000, -1000, -1000, 1726, -1000, -1000, + 413, 2219, 2090, -1000, -1000, -1000, -1000, -1000, 1558, -1000, + 1545, 1697, 1540, 234, -1000, 1850, 2133, 798, 798, -1000, + 1084, -1000, 1165, 1416, 1408, -1000, -1000, -1000, 547, -1000, + 2208, 47207, 1962, 1955, 1948, -1000, -444, 1077, 1819, 1848, + 19384, 1818, 2304, 1673, 45913, -1000, -1000, 46560, -1000, 266, + -1000, 306, 45913, -1000, -1000, -1000, 359, 47207, -1000, 5931, + -1000, -1000, -1000, 244, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 47207, 263, -1000, 1815, 1105, -1000, -1000, 1859, -1000, + -1000, -1000, -1000, 226, 347, 1403, 217, 1401, 217, -1000, + 47207, 659, 1877, 47207, -1000, -1000, -1000, 932, 932, -1000, + -1000, 2121, -1000, 1165, 1030, 20031, 20031, -1000, 713, 568, + -130, 1797, 1797, -1000, 1797, 1812, -1000, 1797, 197, 1797, + 182, 1797, -1000, -1000, 1282, 1282, 1337, -1000, 1929, 1323, + -1000, 1231, 19384, 2178, -1000, -1000, -1000, -1000, -1000, -27, + 2169, 2156, 1030, -1000, 1795, 1794, 19384, 1030, 1282, 1912, + 1030, 1030, 1030, 1030, -1000, 1231, 1337, 2113, 1337, 1030, + 1030, 2098, 328, 1030, 1529, 1529, 1529, 1529, 1529, 1337, + 1337, 1337, 1337, 45913, -1000, -155, -1000, -1000, -198, -199, + -1000, 1282, -155, 1681, 1282, -1000, 1906, 1892, 2070, 1851, + 1030, 2058, 1030, 1030, 1030, 1824, -1000, 2228, 2228, 2228, + 1521, 1053, 47207, -1000, -1000, -1000, -1000, 2323, 2320, 1680, + -1000, -1000, 118, 442, -1000, 2064, 2104, -1000, 2303, 2065, + 2302, -1000, -1000, -1000, -1000, -1000, 1231, -1000, 2183, 1542, + -1000, 805, 1663, -1000, -1000, 18090, 1527, 2014, 627, 1521, + 1751, 2514, 1871, 1937, 2708, -1000, -1000, -1000, -1000, 1902, + -1000, 1887, -1000, -1000, 1785, -1000, 1756, 372, 24562, 1747, + 1747, -1000, 623, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 973, 5311, 2372, -1000, 1397, -1000, 1221, 195, 1066, -1000, + -1000, 798, 798, -1000, 860, 856, -1000, 47207, 1793, -1000, + 381, 1395, 381, 1062, -1000, 1060, -1000, -1000, -1000, -1000, + 1945, 1930, -1000, -1000, -1000, -1000, 47207, -1000, -1000, 47207, + 47207, 47207, 1792, 2301, -1000, 19384, 1791, 804, 2077, 45913, 45913, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 528, 814, -400, 373, 372, 814, 814, 814, - -446, -1000, -1000, 1567, 1563, -1000, -116, -1000, 19384, -1000, - -1000, -1000, 1110, 1110, 1408, 1397, 1380, -1000, 1853, -1000, - -1000, -1000, 1696, -1000, -1000, -96, 45913, 45913, 45913, 45913, - -1000, -1000, 1040, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 749, 1334, 345, -98, 1334, - -1000, -1000, 514, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 19384, -1000, 19384, -1000, 1467, 19384, 2326, - 1373, 19384, 19384, -1000, 1094, 1084, 2036, -1000, -1000, -1000, + -1000, -1000, 474, 798, -410, 316, 313, 798, 798, 798, + -445, -1000, -1000, 1415, 1407, -1000, -118, -1000, 19384, -1000, + -1000, -1000, 1024, 1024, 1394, 1393, 1390, -1000, 1785, -1000, + -1000, -1000, 1372, -1000, -1000, -103, 45913, 45913, 45913, 45913, + -1000, -1000, 1018, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 713, 1282, 343, -105, 1282, + -1000, -1000, 381, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 19384, -1000, 19384, -1000, 1231, 19384, 2263, + 1388, 19384, 19384, -1000, 1056, 1054, 1030, -1000, -1000, -1000, 19384, -1000, -1000, -1000, -1000, -1000, 19384, -1000, -1000, -1000, - 19384, 231, 884, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 1334, 415, -1000, -1000, -1000, -1000, 2403, - -1000, 1334, 19384, -1000, -1000, 19384, -1000, 19384, 19384, -1000, - 19384, -1000, 19384, -1000, -1000, -1000, -1000, 19384, 1839, 2167, - 1839, 1839, 25856, -1000, -1000, 2394, 2392, 2348, 2146, 2151, - 2151, 2149, -1000, 2347, 2346, -1000, 1358, 2345, 1356, 909, - -1000, 46560, 19384, 159, -1000, 393, 45913, 159, 45913, -1000, - 2389, -1000, -1000, 19384, 1867, -1000, 19384, -1000, -1000, -1000, - -1000, 6253, 2399, 1734, -1000, -1000, 764, -1000, 19384, -1000, - -1000, -1000, 108, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1354, 1341, -1000, -1000, 1858, 19384, -1000, -1000, -1000, - 1626, 1577, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1853, -1000, -1000, -1000, -1000, 408, -441, 2083, 45913, 1073, - -1000, 1549, 1767, 404, 159, 1339, 814, 814, 814, 1072, - 1035, 31032, 1547, -1000, 45913, 506, -1000, 408, -1000, -123, - -125, 2036, -1000, -1000, 2283, -1000, -1000, 13542, -1000, -1000, - 1850, 1984, -1000, -1000, -1000, -1000, 2076, -97, -103, -1000, - -1000, 2036, 2036, 1990, 1334, -1000, 2036, 2036, 1564, 1407, - -1000, 2036, 1404, 1791, -1000, 231, 1334, 2024, -1000, -1000, - 6253, -1000, -1000, 2389, 2344, 106, -1000, -1000, 246, 106, - 1467, 1762, 2036, 1728, 1701, 2036, 2036, 26503, -1000, 2330, - 2319, 31679, 31679, 797, 2392, -157, 19384, 19384, 2141, 1075, - -1000, -1000, -1000, -1000, 1336, 1331, -1000, 1325, -1000, 2430, - -1000, 1467, -1000, 159, -1000, 665, 1753, -1000, 2326, 1467, - 45913, 1467, 96, 2389, -1000, 2036, -1000, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, -1000, -1000, 45913, - 2071, -1000, -1000, 2280, 1528, 61, -1000, 1391, 1767, -1000, - -1000, 156, -1000, 19384, -1000, 31032, 1304, 1270, -1000, -1000, - -1000, -1000, -446, -1000, -1000, -1000, -1000, -1000, -1000, 394, - 1761, -1000, 813, 45913, 47207, -1000, 2028, -1000, -1000, -1000, + 19384, 207, 807, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1282, 370, -1000, -1000, -1000, -1000, 2325, + -1000, 1282, 19384, -1000, -1000, 19384, -1000, 19384, 19384, -1000, + 19384, -1000, 19384, -1000, -1000, -1000, -1000, 19384, 1778, 2089, + 1778, 1778, 26503, -1000, -1000, 2320, 2317, 2298, 2030, 2047, + 2047, 2064, -1000, 2296, 2294, -1000, 1383, 2286, 1381, 855, + -1000, 46560, 19384, 142, -1000, 390, 45913, 142, 45913, -1000, + 2283, -1000, -1000, 19384, 1787, -1000, 19384, -1000, -1000, -1000, + -1000, 6098, 2323, 1747, -1000, -1000, 728, -1000, 19384, -1000, + -1000, -1000, 7137, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1373, 1352, -1000, -1000, 1786, 19384, -1000, -1000, -1000, + 1370, 1356, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1785, -1000, -1000, -1000, -1000, 359, -439, 2038, 45913, 1042, + -1000, 1380, 1673, 349, 142, 1312, 798, 798, 798, 1012, + 1011, 31679, 1369, -1000, 45913, 466, -1000, 359, -1000, -124, + -127, 1030, -1000, -1000, 2217, -1000, -1000, 13542, -1000, -1000, + 1783, 1868, -1000, -1000, -1000, -1000, 1995, -88, -111, -1000, + -1000, 1030, 1030, 1513, 1282, -1000, 1030, 1030, 1351, 1342, + -1000, 1030, 1337, 1762, -1000, 207, 1282, 1936, -1000, -1000, + 6098, -1000, -1000, 2283, 2280, 106, -1000, -1000, 248, 106, + 1231, 1690, 1030, 1647, 1623, 1030, 1030, 27150, -1000, 2273, + 2249, 32326, 32326, 733, 2317, -169, 19384, 19384, 2023, 1001, + -1000, -1000, -1000, -1000, 1310, 1305, -1000, 1302, -1000, 2369, + -1000, 1231, -1000, 142, -1000, 619, 1663, -1000, 2263, 1231, + 45913, 1231, 110, 2283, -1000, 1030, -1000, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, + 1778, 1778, 1778, 1778, 1778, 1778, 1778, -1000, -1000, 45913, + 1980, -1000, -1000, 2210, 1366, 62, -1000, 1330, 1673, -1000, + -1000, 141, -1000, 19384, -1000, 31679, 1266, 1255, -1000, -1000, + -1000, -1000, -445, -1000, -1000, -1000, -1000, -1000, -1000, 385, + 1665, -1000, 779, 45913, 47207, -1000, 1986, -1000, -1000, -1000, 19384, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 19384, - -1000, 1334, 2013, -1000, -267, -1000, -419, 19384, -150, -1000, - -1000, -150, -1000, 19384, -1000, -1000, 19384, -1000, 19384, -1000, - -1000, 1525, -1000, -1000, -1000, -1000, -1000, 1525, 1525, -1000, - -157, -1000, 1757, -1000, 45913, 1467, 1744, -1000, 1036, -1000, - -1000, -1000, -1000, -1000, 46560, 1753, 45913, -1000, 1431, 1334, - 1839, 2326, -1000, 1429, -1000, 394, -1000, 1847, 1887, -1000, - -1000, -1000, 17443, -1000, -1000, -1000, -1000, -1000, 268, -93, - 13542, 10277, 1413, -1000, -90, 2036, 1404, -1000, -365, -1000, - -1000, -1000, -1000, 170, -1000, -1000, 1744, -1000, -1000, 1642, - 1623, 1530, 30385, -1000, -1000, -1000, -1000, -157, -1000, -1000, - 2279, -1000, -1000, 1743, -1000, -1000, 25856, 45266, -1000, -78, - 619, -93, 19384, 1842, 1334, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 29, -1000, -1000, -1000, -1000, -1000, 1977, - -100, -1000, -1000, -1000, 173, -390, -195, -196, -1000, -1000, + -1000, 1282, 1928, -1000, -282, -1000, -419, 19384, -155, -1000, + -1000, -155, -1000, 19384, -1000, -1000, 19384, -1000, 19384, -1000, + -1000, 1350, -1000, -1000, -1000, -1000, -1000, 1350, 1350, -1000, + -169, -1000, 1664, -1000, 45913, 1231, 1662, -1000, 993, -1000, + -1000, -1000, -1000, -1000, 46560, 1663, 45913, -1000, 1348, 1282, + 1778, 2263, -1000, 1341, -1000, 385, -1000, 1782, 1848, -1000, + -1000, -1000, 17443, -1000, -1000, -1000, -1000, -1000, 191, -95, + 13542, 10277, 1339, -1000, -91, 1030, 1337, -1000, -368, -1000, + -1000, -1000, -1000, 261, -1000, -1000, 1662, -1000, -1000, 1272, + 1142, 1138, 31032, -1000, -1000, -1000, -1000, -169, -1000, -1000, + 2191, -1000, -1000, 1389, -1000, -1000, 26503, 45266, -1000, -81, + 323, -95, 19384, 1781, 1282, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 36, -1000, -1000, -1000, -1000, -1000, 1859, + -106, -1000, -1000, -1000, 223, -401, -186, -196, -1000, -1000, 20031, -1000, 19384, -1000, 19384, -1000, 19384, -1000, -1000, -1000, - 45913, 1839, -1000, 1396, -1000, 3836, -214, 2008, -1000, 43, - -1000, -1000, -1000, 973, 1261, -1000, -1000, -1000, -1000, -1000, - -1000, 2052, 45913, -1000, 534, -1000, -1000, -96, -108, 899, - -1000, -1000, -1000, -1000, -1000, 1256, 1222, 2036, -1000, 45913, - -1000, 45266, -209, 748, 6253, -1000, 2007, 1981, 2408, -1000, - -1000, -1000, -1000, -1000, -1000, -454, 1390, 266, -1000, -1000, - 173, -1000, 19384, -1000, 19384, -1000, 1334, -1000, -1000, 2273, - 96, -1000, 2425, -1000, 2400, 733, 733, -1000, 1015, -454, - -1000, -1000, 2036, 2036, -1000, -223, -1000, -1000, -1000, -1000, - -1000, 520, 1086, -1000, -1000, -1000, -1000, -1000, 6253, -1000, - -1000, -1000, 215, 215, -1000, -1000, + 45913, 1778, -1000, 1329, -1000, 3426, -219, 1905, -1000, -51, + -1000, -1000, -1000, 965, 1188, -1000, -1000, -1000, -1000, -1000, + -1000, 1946, 45913, -1000, 479, -1000, -1000, -103, -116, 831, + -1000, -1000, -1000, -1000, -1000, 1113, 1071, 1030, -1000, 45913, + -1000, 45266, -210, 712, 6098, -1000, 1897, 1883, 2333, -1000, + -1000, -1000, -1000, -1000, -1000, -452, 1289, 272, -1000, -1000, + 223, -1000, 19384, -1000, 19384, -1000, 1282, -1000, -1000, 2203, + 110, -1000, 2367, -1000, 2361, 747, 747, -1000, 1007, -452, + -1000, -1000, 1030, 1030, -1000, -221, -1000, -1000, -1000, -1000, + -1000, 476, 1049, -1000, -1000, -1000, -1000, -1000, 6098, -1000, + -1000, -1000, 203, 203, -1000, -1000, } var yyPgo = [...]int{ - 0, 3025, 3022, 38, 2, 36, 35, 3019, 93, 102, - 196, 37, 211, 104, 3013, 3007, 3006, 3001, 2997, 2995, - 2994, 171, 169, 166, 2993, 2992, 2990, 2989, 2988, 2987, - 2986, 2985, 2984, 2983, 162, 159, 181, 2981, 2980, 2977, - 117, 179, 89, 91, 183, 2975, 2974, 84, 2972, 2971, - 2970, 192, 191, 190, 918, 2968, 188, 115, 53, 2967, - 2966, 2965, 2964, 2963, 2961, 2959, 2958, 2956, 2953, 2951, - 2950, 2947, 2942, 2940, 2935, 2932, 287, 2930, 2926, 22, - 2921, 86, 2919, 2916, 2913, 2910, 12, 2908, 2907, 16, - 40, 2904, 2892, 48, 2888, 2886, 2884, 2883, 2878, 17, - 2877, 27, 2876, 39, 2875, 2874, 126, 2873, 2868, 2866, - 41, 2865, 2863, 2862, 2859, 2856, 2855, 2854, 140, 2853, - 2849, 2847, 236, 185, 2845, 2844, 273, 143, 108, 2843, - 2842, 114, 180, 2830, 116, 2827, 2824, 2819, 146, 2812, - 138, 2804, 2803, 66, 71, 2802, 371, 2800, 2799, 11, - 15, 72, 10, 20, 23, 2795, 2794, 65, 78, 2793, - 129, 2790, 2787, 98, 69, 2786, 106, 103, 2784, 2782, - 7, 5, 2781, 3, 1, 4, 68, 2779, 2777, 122, - 2776, 2775, 2773, 92, 2771, 2764, 2164, 2761, 95, 131, - 101, 81, 2759, 50, 58, 2757, 2754, 2753, 2746, 2745, - 54, 2739, 2738, 2737, 136, 380, 160, 2735, 47, 82, - 46, 134, 2734, 61, 80, 189, 161, 2733, 2731, 137, - 135, 2726, 2725, 62, 44, 45, 2722, 113, 130, 118, - 111, 112, 163, 2720, 2716, 60, 75, 2715, 2714, 2708, - 2705, 164, 2704, 2703, 73, 2702, 57, 2700, 167, 2699, - 19, 67, 2698, 49, 149, 2697, 76, 2696, 2695, 63, - 100, 70, 43, 2691, 195, 2690, 56, 170, 128, 151, - 2687, 2685, 2684, 2681, 187, 338, 2679, 2676, 77, 176, - 139, 144, 94, 2674, 349, 2668, 2653, 132, 2603, 5785, - 2651, 42, 154, 2632, 2626, 7129, 157, 52, 26, 2625, - 109, 2617, 2616, 2615, 2612, 193, 172, 105, 168, 59, - 2611, 2606, 2604, 14, 2598, 2593, 2590, 2580, 2572, 2570, - 90, 34, 33, 32, 202, 74, 30, 97, 150, 83, - 2569, 2568, 2566, 124, 79, 2565, 158, 156, 125, 155, - 2563, 177, 141, 123, 2562, 119, 31, 2559, 2552, 2551, - 2549, 99, 2548, 2534, 2525, 2522, 148, 142, 121, 87, - 2518, 88, 120, 147, 145, 55, 2516, 51, 2504, 2502, - 29, 182, 28, 2500, 13, 107, 212, 2497, 5000, 178, - 2496, 21, 367, 174, 2495, 2493, 8, 9, 6, 2491, - 2490, 2486, 2477, 133, 2470, 2469, 2467, 2463, 25, 64, - 24, 18, 110, 85, 2459, 2458, 3799, 0, 127, 2423, - 197, + 0, 2967, 2966, 38, 2, 36, 35, 2965, 93, 108, + 215, 37, 197, 102, 2964, 2963, 2961, 2959, 2958, 2956, + 2955, 177, 176, 170, 2954, 2951, 2947, 2946, 2945, 2940, + 2937, 2935, 2934, 2921, 171, 159, 195, 2919, 2916, 2910, + 125, 189, 79, 88, 191, 2904, 2901, 81, 2898, 2895, + 2892, 186, 185, 182, 887, 2889, 181, 120, 53, 2888, + 2886, 2882, 2880, 2878, 2877, 2876, 2875, 2873, 2872, 2867, + 2866, 2865, 2863, 2862, 2861, 2859, 294, 2854, 2853, 22, + 2849, 85, 2845, 2844, 2843, 2841, 12, 2839, 2832, 16, + 40, 2831, 2828, 48, 2824, 2819, 2812, 2808, 2804, 17, + 2803, 27, 2796, 39, 2794, 2793, 127, 2787, 2774, 2771, + 41, 2764, 2761, 2754, 2753, 2751, 2750, 2739, 142, 2738, + 2737, 2735, 246, 211, 2734, 2732, 168, 143, 110, 2731, + 2726, 115, 192, 2725, 124, 2722, 2720, 2716, 147, 2715, + 138, 2714, 2708, 69, 71, 2705, 15, 2704, 2703, 11, + 91, 72, 10, 20, 23, 2702, 2701, 65, 78, 2699, + 119, 2698, 2697, 101, 87, 2696, 114, 99, 2695, 2694, + 7, 5, 2691, 3, 1, 4, 68, 2690, 2687, 117, + 2685, 2684, 2681, 98, 2679, 2676, 2164, 2674, 97, 133, + 104, 75, 2653, 50, 58, 2651, 2633, 2632, 2626, 2625, + 54, 2617, 2615, 2612, 140, 380, 164, 2611, 47, 82, + 46, 134, 2609, 61, 80, 196, 167, 2607, 2604, 139, + 137, 2598, 2594, 62, 44, 45, 2593, 113, 131, 122, + 111, 112, 132, 2590, 2580, 60, 74, 2578, 2577, 2573, + 2572, 169, 2565, 2563, 73, 2559, 57, 2558, 165, 2557, + 19, 67, 2556, 49, 160, 2554, 76, 2553, 2552, 63, + 100, 70, 43, 2549, 180, 2546, 56, 162, 129, 156, + 2545, 2540, 2538, 2526, 193, 354, 2525, 2523, 77, 178, + 141, 149, 92, 2518, 345, 2516, 2513, 157, 2603, 5785, + 2512, 42, 163, 2502, 2501, 7129, 166, 52, 26, 2500, + 116, 2490, 2488, 2487, 2486, 202, 183, 109, 161, 59, + 2485, 2470, 2469, 14, 2467, 2463, 2459, 2458, 2457, 2448, + 90, 34, 33, 32, 208, 66, 30, 105, 154, 83, + 2445, 2443, 2442, 128, 95, 2438, 155, 151, 136, 106, + 2435, 179, 144, 123, 2432, 103, 31, 2430, 2428, 2426, + 2425, 94, 2423, 2422, 2421, 2420, 150, 145, 126, 84, + 2418, 86, 121, 146, 148, 55, 2417, 51, 2415, 2414, + 29, 187, 28, 2411, 13, 107, 225, 2410, 5000, 188, + 2408, 21, 344, 158, 2407, 2406, 8, 9, 6, 2404, + 2402, 2401, 2400, 135, 2398, 2397, 2396, 2394, 25, 64, + 24, 18, 118, 89, 2392, 2391, 3799, 0, 130, 2389, + 198, } //line sql.y:7884 @@ -7928,7 +7928,7 @@ var yyChk = [...]int{ 145, 159, -241, 140, 163, 164, 165, 166, 167, 168, 169, 171, 170, 172, 173, 160, 161, 176, 223, 224, -150, -150, -150, -150, -211, -217, -216, -406, -213, -378, - -288, -295, -406, -406, -150, -273, -406, -406, -150, -406, + -288, -295, -406, -406, -150, -273, -406, -406, -146, -406, -406, -406, -220, -140, -406, -406, -410, -406, -410, -410, -324, -406, -324, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 5c2e7c397e1..989d6fd60fe 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -5336,7 +5336,7 @@ function_call_keyword } interval_value: - INTERVAL simple_expr sql_id + INTERVAL bit_expr sql_id { $$ = &IntervalExpr{Expr: $2, Unit: $3.String()} } From e259218a23d79e60133fbcdd3955f8be0d71fa6d Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 19 Jan 2023 12:48:02 +0530 Subject: [PATCH 08/53] feat: fix translation logic to fail translation for conversions not supported (#12111) (#12117) Signed-off-by: Manan Gupta Signed-off-by: Manan Gupta Signed-off-by: Manan Gupta --- .../endtoend/vtgate/queries/misc/misc_test.go | 12 +++++++ go/vt/vtgate/evalengine/convert.go | 14 ++++---- go/vt/vtgate/evalengine/translate.go | 5 +++ go/vt/vtgate/evalengine/translate_test.go | 34 +++++++++++++++++++ 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index 93fb8e28b42..ac9cf7473b6 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -101,3 +101,15 @@ func TestIntervalWithMathFunctions(t *testing.T) { mcmp.AssertMatches("select '2020-01-01' + interval month(DATE_SUB(FROM_UNIXTIME(1234), interval 1 month))-1 month", `[[CHAR("2020-12-01")]]`) mcmp.AssertMatches("select DATE_ADD(MIN(FROM_UNIXTIME(1673444922)),interval -DAYOFWEEK(MIN(FROM_UNIXTIME(1673444922)))+1 DAY)", `[[DATETIME("2023-01-08 13:48:42")]]`) } + +// TestCast tests the queries that contain the cast function. +func TestCast(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + mcmp.AssertMatches("select cast('2023-01-07 12:34:56' as date) limit 1", `[[DATE("2023-01-07")]]`) + mcmp.AssertMatches("select cast('2023-01-07 12:34:56' as date)", `[[DATE("2023-01-07")]]`) + mcmp.AssertMatches("select cast('3.2' as float)", `[[FLOAT32(3.2)]]`) + mcmp.AssertMatches("select cast('3.2' as double)", `[[FLOAT64(3.2)]]`) + mcmp.AssertMatches("select cast('3.2' as unsigned)", `[[UINT64(3)]]`) +} diff --git a/go/vt/vtgate/evalengine/convert.go b/go/vt/vtgate/evalengine/convert.go index e769196b62c..d1996fcb1ee 100644 --- a/go/vt/vtgate/evalengine/convert.go +++ b/go/vt/vtgate/evalengine/convert.go @@ -39,6 +39,10 @@ type ( ) func (c *ConvertExpr) unsupported() { + throwEvalError(c.returnUnsupportedError()) +} + +func (c *ConvertExpr) returnUnsupportedError() error { var err error switch { case c.HasLength && c.HasScale: @@ -48,7 +52,7 @@ func (c *ConvertExpr) unsupported() { default: err = vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "Unsupported type conversion: %s", c.Type) } - throwEvalError(err) + return err } func (c *ConvertExpr) eval(env *ExpressionEnv, result *EvalResult) { @@ -86,15 +90,9 @@ func (c *ConvertExpr) eval(env *ExpressionEnv, result *EvalResult) { case "FLOAT": if c.HasLength { switch p := c.Length; { - case p <= 24: - c.unsupported() - case p <= 53: - result.makeFloat() - default: + case p > 53: throwEvalError(vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Too-big precision %d specified for 'CONVERT'. Maximum is 53.", p)) } - } else { - c.unsupported() } c.unsupported() case "SIGNED", "SIGNED INTEGER": diff --git a/go/vt/vtgate/evalengine/translate.go b/go/vt/vtgate/evalengine/translate.go index 6fdce977b08..d2ba9326911 100644 --- a/go/vt/vtgate/evalengine/translate.go +++ b/go/vt/vtgate/evalengine/translate.go @@ -493,6 +493,11 @@ func translateConvertExpr(expr sqlparser.Expr, convertType *sqlparser.ConvertTyp if err != nil { return nil, err } + case "BINARY", "DOUBLE", "REAL", "SIGNED", "SIGNED INTEGER", "UNSIGNED", "UNSIGNED INTEGER": + // Supported types for conv expression + default: + // For unsupported types, we should return an error on translation instead of returning an error on runtime. + return nil, convert.returnUnsupportedError() } return &convert, nil diff --git a/go/vt/vtgate/evalengine/translate_test.go b/go/vt/vtgate/evalengine/translate_test.go index ce8249653dc..22cede333ba 100644 --- a/go/vt/vtgate/evalengine/translate_test.go +++ b/go/vt/vtgate/evalengine/translate_test.go @@ -340,3 +340,37 @@ func TestEvaluateTuple(t *testing.T) { }) } } + +// TestTranslationFailures tests that translation fails for functions that we don't support evaluation for. +func TestTranslationFailures(t *testing.T) { + testcases := []struct { + expression string + expectedErr string + }{ + { + expression: "cast('2023-01-07 12:34:56' as date)", + expectedErr: "Unsupported type conversion: DATE", + }, { + expression: "cast('2023-01-07 12:34:56' as datetime(5))", + expectedErr: "Unsupported type conversion: DATETIME(5)", + }, { + expression: "cast('3.4' as FLOAT)", + expectedErr: "Unsupported type conversion: FLOAT", + }, { + expression: "cast('3.4' as FLOAT(3))", + expectedErr: "Unsupported type conversion: FLOAT(3)", + }, + } + + for _, testcase := range testcases { + t.Run(testcase.expression, func(t *testing.T) { + // Given + stmt, err := sqlparser.Parse("select " + testcase.expression) + require.NoError(t, err) + astExpr := stmt.(*sqlparser.Select).SelectExprs[0].(*sqlparser.AliasedExpr).Expr + _, err = Translate(astExpr, LookupDefaultCollation(45)) + require.EqualError(t, err, testcase.expectedErr) + }) + } + +} From 04dbcf788bad7a02794799961bfafd8028d11388 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 25 Jan 2023 09:55:50 +0530 Subject: [PATCH 09/53] Remove removed flags from being used for v16+ binaries (#12128) * feat: remove enable_semi_sync and workflow flags from v16+ Signed-off-by: Manan Gupta * test: also fix test for ers initialization Signed-off-by: Manan Gupta * tests: remove workflow manager flags entirely Signed-off-by: Manan Gupta Signed-off-by: Manan Gupta --- go/test/endtoend/cluster/vtctld_process.go | 3 +-- go/test/endtoend/cluster/vttablet_process.go | 10 +++++++++- .../endtoend/reparent/emergencyreparent/ers_test.go | 4 +++- go/test/endtoend/reparent/utils/utils.go | 3 ++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/go/test/endtoend/cluster/vtctld_process.go b/go/test/endtoend/cluster/vtctld_process.go index 074234fb97c..48408a8db34 100644 --- a/go/test/endtoend/cluster/vtctld_process.go +++ b/go/test/endtoend/cluster/vtctld_process.go @@ -58,8 +58,6 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) "--topo_global_server_address", vtctld.CommonArg.TopoGlobalAddress, "--topo_global_root", vtctld.CommonArg.TopoGlobalRoot, "--cell", cell, - "--workflow_manager_init", - "--workflow_manager_use_election", "--service_map", vtctld.ServiceMap, "--backup_storage_implementation", vtctld.BackupStorageImplementation, "--file_backup_storage_root", vtctld.FileBackupStorageRoot, @@ -67,6 +65,7 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) "--port", fmt.Sprintf("%d", vtctld.Port), "--grpc_port", fmt.Sprintf("%d", vtctld.GrpcPort), ) + if *isCoverage { vtctld.proc.Args = append(vtctld.proc.Args, "--test.coverprofile="+getCoveragePath("vtctld.out")) } diff --git a/go/test/endtoend/cluster/vttablet_process.go b/go/test/endtoend/cluster/vttablet_process.go index 46f55f579e3..3779a762ac4 100644 --- a/go/test/endtoend/cluster/vttablet_process.go +++ b/go/test/endtoend/cluster/vttablet_process.go @@ -118,7 +118,15 @@ func (vttablet *VttabletProcess) Setup() (err error) { vttablet.proc.Args = append(vttablet.proc.Args, "--restore_from_backup") } if vttablet.EnableSemiSync { - vttablet.proc.Args = append(vttablet.proc.Args, "--enable_semi_sync") + var majorVersion int + majorVersion, err = GetMajorVersion("vttablet") + if err != nil { + return err + } + // enable_semi_sync is removed in v16 and shouldn't be set on any release v16+ + if majorVersion <= 15 { + vttablet.proc.Args = append(vttablet.proc.Args, "--enable_semi_sync") + } } if vttablet.DbFlavor != "" { vttablet.proc.Args = append(vttablet.proc.Args, fmt.Sprintf("--db_flavor=%s", vttablet.DbFlavor)) diff --git a/go/test/endtoend/reparent/emergencyreparent/ers_test.go b/go/test/endtoend/reparent/emergencyreparent/ers_test.go index 3564ba3badb..4828731b444 100644 --- a/go/test/endtoend/reparent/emergencyreparent/ers_test.go +++ b/go/test/endtoend/reparent/emergencyreparent/ers_test.go @@ -387,10 +387,12 @@ func TestERSForInitialization(t *testing.T) { shard.Vttablets = tablets clusterInstance.VtTabletExtraArgs = []string{ "--lock_tables_timeout", "5s", - "--enable_semi_sync", "--init_populate_metadata", "--track_schema_versions=true", } + if clusterInstance.VtTabletMajorVersion <= 15 { + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--enable_semi_sync") + } // Initialize Cluster err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index 619eb1f3c59..d85b3ac52c0 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -82,7 +82,8 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s clusterInstance := cluster.NewCluster(cells[0], Hostname) keyspace := &cluster.Keyspace{Name: KeyspaceName} - if durability == "semi_sync" { + // enable_semi_sync is removed in v16 and shouldn't be set on any release v16+ + if durability == "semi_sync" && clusterInstance.VtTabletMajorVersion <= 15 { clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--enable_semi_sync") } From 452f55865641bf7282cc907fcc7aa4095137e740 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 26 Jan 2023 08:38:23 +0100 Subject: [PATCH 10/53] Back to dev mode (#11962) Signed-off-by: Florent Poinsard Signed-off-by: Florent Poinsard --- docker/release.sh | 2 +- go/vt/servenv/version.go | 2 +- java/client/pom.xml | 2 +- java/example/pom.xml | 2 +- java/grpc-client/pom.xml | 2 +- java/jdbc/pom.xml | 2 +- java/pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docker/release.sh b/docker/release.sh index 5298e6b902c..163c718f431 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='15.0.2' +vt_base_version='15.0.3-SNAPSHOT' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 8af53ffda4a..58d1431f6b8 100644 --- a/go/vt/servenv/version.go +++ b/go/vt/servenv/version.go @@ -19,4 +19,4 @@ package servenv // THIS FILE IS AUTO-GENERATED DURING NEW RELEASES BY ./tools/do_releases.sh // DO NOT EDIT -const versionName = "15.0.2" +const versionName = "15.0.3-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index 540fdf1452b..7e8b1fbc41e 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 15.0.2 + 15.0.3-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 9f687aab3ea..d37f0611623 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 15.0.2 + 15.0.3-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index cdd811822ef..8231a9f012c 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 15.0.2 + 15.0.3-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 5b24e669d41..3d846e504c8 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 15.0.2 + 15.0.3-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 987a25b69fe..b3be19edf86 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 15.0.2 + 15.0.3-SNAPSHOT pom Vitess Java Client libraries [Parent] From 0488e91642ae9e01739c412b42a52836c1db0932 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 31 Jan 2023 11:01:13 -0500 Subject: [PATCH 11/53] [release-15.0] VTGate: Ensure HealthCheck Cache Secondary Maps Stay in Sync With Authoritative Map on Tablet Delete (#12178) (#12193) * Ensure secondary maps stay in sync with authoritative map on delete Signed-off-by: Matt Lord * Remove all possible entries for a tablet alias in secondary maps Signed-off-by: Matt Lord * Add unit test case Signed-off-by: Matt Lord --------- Signed-off-by: Matt Lord Co-authored-by: Matt Lord --- go/vt/discovery/healthcheck.go | 35 +++++++++++------- go/vt/discovery/healthcheck_test.go | 57 ++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/go/vt/discovery/healthcheck.go b/go/vt/discovery/healthcheck.go index be085288892..be0d022ff98 100644 --- a/go/vt/discovery/healthcheck.go +++ b/go/vt/discovery/healthcheck.go @@ -429,8 +429,29 @@ func (hc *HealthCheckImpl) deleteTablet(tablet *topodata.Tablet) { hc.mu.Lock() defer hc.mu.Unlock() - key := KeyFromTablet(tablet) tabletAlias := tabletAliasString(topoproto.TabletAliasString(tablet.Alias)) + defer func() { + // We want to be sure the tablet is gone from the secondary + // maps even if it's already gone from the authoritative map. + // The tablet's type also may have recently changed as well, + // so ensure that the tablet we're removing is removed from + // any possible secondary map keys: + // key: keyspace.shard.tabletType -> val: map[tabletAlias]tabletHealth + for _, tabletType := range topoproto.AllTabletTypes { + key := KeyspaceShardTabletType(fmt.Sprintf("%s.%s.%s", tablet.Keyspace, tablet.Shard, topoproto.TabletTypeLString(tabletType))) + // delete from map by keyspace.shard.tabletType + ths, ok := hc.healthData[key] + if !ok { + continue + } + delete(ths, tabletAlias) + // delete from healthy list + healthy, ok := hc.healthy[key] + if ok && len(healthy) > 0 { + hc.recomputeHealthy(key) + } + } + }() // delete from authoritative map th, ok := hc.healthByAlias[tabletAlias] if !ok { @@ -441,18 +462,6 @@ func (hc *HealthCheckImpl) deleteTablet(tablet *topodata.Tablet) { // which will call finalizeConn, which will close the connection. th.cancelFunc() delete(hc.healthByAlias, tabletAlias) - // delete from map by keyspace.shard.tabletType - ths, ok := hc.healthData[key] - if !ok { - log.Warningf("We have no health data for target: %v", key) - return - } - delete(ths, tabletAlias) - // delete from healthy list - healthy, ok := hc.healthy[key] - if ok && len(healthy) > 0 { - hc.recomputeHealthy(key) - } } func (hc *HealthCheckImpl) updateHealth(th *TabletHealth, prevTarget *query.Target, trivialUpdate bool, up bool) { diff --git a/go/vt/discovery/healthcheck_test.go b/go/vt/discovery/healthcheck_test.go index 5ba47f69025..97d8041aa84 100644 --- a/go/vt/discovery/healthcheck_test.go +++ b/go/vt/discovery/healthcheck_test.go @@ -684,7 +684,7 @@ func TestRemoveTablet(t *testing.T) { // there will be a first result, get and discard it <-resultChan - shr := &querypb.StreamHealthResponse{ + shrReplica := &querypb.StreamHealthResponse{ TabletAlias: tablet.Alias, Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}, Serving: true, @@ -698,7 +698,7 @@ func TestRemoveTablet(t *testing.T) { Stats: &querypb.RealtimeStats{ReplicationLagSeconds: 1, CpuUsage: 0.2}, PrimaryTermStartTime: 0, }} - input <- shr + input <- shrReplica <-resultChan // check it's there a := hc.GetHealthyTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) @@ -708,6 +708,59 @@ func TestRemoveTablet(t *testing.T) { hc.RemoveTablet(tablet) a = hc.GetHealthyTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) assert.Empty(t, a, "wrong result, expected empty list") + + // Now confirm that when a tablet's type changes between when it's added to the cache + // and when it's removed, that the tablet is entirely removed from the cache since + // in the secondary maps it's keyed in part by tablet type. + // Note: we are using GetTabletStats here to check the healthData map (rather than + // the healthy map that we checked above) because that is the data structure that + // is used when printing the contents of the healthcheck cache in the /debug/status + // endpoint and in the SHOW VITESS_TABLETS; SQL command output. + + // Add the tablet back. + hc.AddTablet(tablet) + // Receive and discard the initial result. + <-resultChan + input <- shrReplica + // Confirm it's there in the cache. + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) + mustMatch(t, want, a, "unexpected result") + // Change the tablet type to RDONLY. + tablet.Type = topodatapb.TabletType_RDONLY + shrRdonly := &querypb.StreamHealthResponse{ + TabletAlias: tablet.Alias, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}, + Serving: true, + TabletExternallyReparentedTimestamp: 0, + RealtimeStats: &querypb.RealtimeStats{ReplicationLagSeconds: 2, CpuUsage: 0.4}, + } + // Now replace it, which does a Remove and Add. The tablet should + // be removed from the cache and all its maps even though the + // tablet type had changed in-between the initial Add and Remove. + hc.ReplaceTablet(tablet, tablet) + // Confirm that the old entry is gone. + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) + assert.Empty(t, a, "wrong result, expected empty list") + // Receive and discard the initial result. + <-resultChan + input <- shrRdonly + // Confirm that the new entry is there in the cache. + want = []*TabletHealth{{ + Tablet: tablet, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}, + Serving: true, + Stats: &querypb.RealtimeStats{ReplicationLagSeconds: 2, CpuUsage: 0.4}, + PrimaryTermStartTime: 0, + }} + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}) + mustMatch(t, want, a, "unexpected result") + // Delete the tablet, confirm again that it's gone in both + // tablet type forms. + hc.RemoveTablet(tablet) + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) + assert.Empty(t, a, "wrong result, expected empty list") + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}) + assert.Empty(t, a, "wrong result, expected empty list") } // TestGetHealthyTablets tests the functionality of GetHealthyTabletStats. From c2cec554f6860afe3f842b5494df846e4b78c45d Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 20:10:22 +0530 Subject: [PATCH 12/53] Properly test healthcheck cache response handling. (#12227) Signed-off-by: Matt Lord Co-authored-by: Matt Lord --- go/vt/discovery/healthcheck_test.go | 42 ++++++++++++++++++----------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/go/vt/discovery/healthcheck_test.go b/go/vt/discovery/healthcheck_test.go index 97d8041aa84..e61915a9b85 100644 --- a/go/vt/discovery/healthcheck_test.go +++ b/go/vt/discovery/healthcheck_test.go @@ -709,22 +709,28 @@ func TestRemoveTablet(t *testing.T) { a = hc.GetHealthyTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) assert.Empty(t, a, "wrong result, expected empty list") - // Now confirm that when a tablet's type changes between when it's added to the cache - // and when it's removed, that the tablet is entirely removed from the cache since - // in the secondary maps it's keyed in part by tablet type. - // Note: we are using GetTabletStats here to check the healthData map (rather than - // the healthy map that we checked above) because that is the data structure that - // is used when printing the contents of the healthcheck cache in the /debug/status - // endpoint and in the SHOW VITESS_TABLETS; SQL command output. + // Now confirm that when a tablet's type changes between when it's added to the + // cache and when it's removed, that the tablet is entirely removed from the + // cache since in the secondary maps it's keyed in part by tablet type. + // Note: we are using GetTabletStats here to check the healthData map (rather + // than the healthy map that we checked above) because that is the data + // structure that is used when printing the contents of the healthcheck cache + // in the /debug/status endpoint and in the SHOW VITESS_TABLETS; SQL command + // output. // Add the tablet back. hc.AddTablet(tablet) - // Receive and discard the initial result. + // Receive and discard the initial result as we have not yet sent the first + // StreamHealthResponse with the dynamic serving and stats information. <-resultChan + // Send the first StreamHealthResponse with the dynamic serving and stats + // information. input <- shrReplica + <-resultChan // Confirm it's there in the cache. a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) mustMatch(t, want, a, "unexpected result") + // Change the tablet type to RDONLY. tablet.Type = topodatapb.TabletType_RDONLY shrRdonly := &querypb.StreamHealthResponse{ @@ -734,16 +740,21 @@ func TestRemoveTablet(t *testing.T) { TabletExternallyReparentedTimestamp: 0, RealtimeStats: &querypb.RealtimeStats{ReplicationLagSeconds: 2, CpuUsage: 0.4}, } - // Now replace it, which does a Remove and Add. The tablet should - // be removed from the cache and all its maps even though the - // tablet type had changed in-between the initial Add and Remove. + + // Now Replace it, which does a Remove and Add. The tablet should be removed + // from the cache and all its maps even though the tablet type had changed + // in-between the initial Add and Remove. hc.ReplaceTablet(tablet, tablet) + // Receive and discard the initial result as we have not yet sent the first + // StreamHealthResponse with the dynamic serving and stats information. + <-resultChan // Confirm that the old entry is gone. a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) assert.Empty(t, a, "wrong result, expected empty list") - // Receive and discard the initial result. - <-resultChan + // Send the first StreamHealthResponse with the dynamic serving and stats + // information. input <- shrRdonly + <-resultChan // Confirm that the new entry is there in the cache. want = []*TabletHealth{{ Tablet: tablet, @@ -754,8 +765,9 @@ func TestRemoveTablet(t *testing.T) { }} a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}) mustMatch(t, want, a, "unexpected result") - // Delete the tablet, confirm again that it's gone in both - // tablet type forms. + + // Delete the tablet, confirm again that it's gone in both tablet type + // forms. hc.RemoveTablet(tablet) a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) assert.Empty(t, a, "wrong result, expected empty list") From 91e7790c3e6223abfec88ec24c8db6b83942d1d5 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 18:42:16 +0100 Subject: [PATCH 13/53] [release-15.0] [Gen4] Fix lookup vindexes with `autocommit` enabled (#12172) (#12230) * test: show that `autocommit` on lookup vindexes is broken when used after a savepoint is created Signed-off-by: Arthur Schreiber * test: rework the test case to show that the problem lies with transactions Signed-off-by: Arthur Schreiber * Correctly handle `autocommit` in the `VIndexLookup` primitive. Signed-off-by: Arthur Schreiber * Copy the `logging` struct so autocommit queries show up correctly in `vexplain` output. Signed-off-by: Arthur Schreiber --------- Signed-off-by: Arthur Schreiber Co-authored-by: Arthur Schreiber --- go/test/endtoend/vtgate/lookup_test.go | 39 +++++++++++++++++++ go/test/endtoend/vtgate/main_test.go | 2 +- go/test/endtoend/vtgate/schema.sql | 14 +++++++ go/test/endtoend/vtgate/vschema.json | 30 ++++++++++++++ go/vt/vtgate/engine/fake_vcursor_test.go | 8 ++++ go/vt/vtgate/engine/primitive.go | 11 ++++-- go/vt/vtgate/engine/vindex_lookup.go | 21 +++++++++- go/vt/vtgate/planbuilder/plan_test.go | 1 + go/vt/vtgate/vcursor_impl.go | 14 +++++++ go/vt/vtgate/vindexes/consistent_lookup.go | 8 ++++ go/vt/vtgate/vindexes/lookup.go | 8 ++++ go/vt/vtgate/vindexes/lookup_hash.go | 8 ++++ .../vindexes/lookup_unicodeloosemd5_hash.go | 8 ++++ go/vt/vtgate/vindexes/vindex.go | 1 + 14 files changed, 166 insertions(+), 7 deletions(-) diff --git a/go/test/endtoend/vtgate/lookup_test.go b/go/test/endtoend/vtgate/lookup_test.go index c984459ab97..3294c1898d6 100644 --- a/go/test/endtoend/vtgate/lookup_test.go +++ b/go/test/endtoend/vtgate/lookup_test.go @@ -42,6 +42,45 @@ func TestUnownedLookupInsertNull(t *testing.T) { utils.Exec(t, conn, "insert into t8(id, parent_id, t9_id) VALUES (3, 2, 2)") } +func TestLookupUniqueWithAutocommit(t *testing.T) { + conn, closer := start(t) + defer closer() + + // conn2 is to check entries in the lookup table + conn2, err := mysql.Connect(context.Background(), &vtParams) + require.Nil(t, err) + defer conn2.Close() + + // Test that all vindex writes are autocommitted outside of any ongoing transactions. + // + // Also test that autocommited vindex entries are visible inside transactions, as lookups + // should also use the autocommit connection. + + utils.Exec(t, conn, "insert into t10(id, sharding_key) VALUES (1, 1)") + + utils.AssertMatches(t, conn2, "select id from t10_id_to_keyspace_id_idx order by id asc", "[[INT64(1)]]") + utils.AssertMatches(t, conn, "select id from t10 where id = 1", "[[INT64(1)]]") + + utils.Exec(t, conn, "begin") + + utils.Exec(t, conn, "insert into t10(id, sharding_key) VALUES (2, 1)") + + utils.AssertMatches(t, conn2, "select id from t10_id_to_keyspace_id_idx order by id asc", "[[INT64(1)] [INT64(2)]]") + utils.AssertMatches(t, conn, "select id from t10 where id = 2", "[[INT64(2)]]") + + utils.Exec(t, conn, "insert into t10(id, sharding_key) VALUES (3, 1)") + + utils.AssertMatches(t, conn2, "select id from t10_id_to_keyspace_id_idx order by id asc", "[[INT64(1)] [INT64(2)] [INT64(3)]]") + utils.AssertMatches(t, conn, "select id from t10 where id = 3", "[[INT64(3)]]") + + utils.Exec(t, conn, "savepoint sp_foobar") + + utils.Exec(t, conn, "insert into t10(id, sharding_key) VALUES (4, 1)") + + utils.AssertMatches(t, conn2, "select id from t10_id_to_keyspace_id_idx order by id asc", "[[INT64(1)] [INT64(2)] [INT64(3)] [INT64(4)]]") + utils.AssertMatches(t, conn, "select id from t10 where id = 4", "[[INT64(4)]]") +} + func TestUnownedLookupInsertChecksKeyspaceIdsAreMatching(t *testing.T) { conn, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/main_test.go b/go/test/endtoend/vtgate/main_test.go index f683be5cef1..1d2bc59b50a 100644 --- a/go/test/endtoend/vtgate/main_test.go +++ b/go/test/endtoend/vtgate/main_test.go @@ -110,7 +110,7 @@ func start(t *testing.T) (*mysql.Conn, func()) { deleteAll := func() { utils.Exec(t, conn, "use ks") - tables := []string{"t1", "t2", "vstream_test", "t3", "t4", "t6", "t7_xxhash", "t7_xxhash_idx", "t7_fk", "t8", "t9", "t9_id_to_keyspace_id_idx", "t1_id2_idx", "t2_id4_idx", "t3_id7_idx", "t4_id2_idx", "t5_null_vindex", "t6_id2_idx"} + tables := []string{"t1", "t2", "vstream_test", "t3", "t4", "t6", "t7_xxhash", "t7_xxhash_idx", "t7_fk", "t8", "t9", "t9_id_to_keyspace_id_idx", "t10", "t10_id_to_keyspace_id_idx", "t1_id2_idx", "t2_id4_idx", "t3_id7_idx", "t4_id2_idx", "t5_null_vindex", "t6_id2_idx"} for _, table := range tables { _, _ = utils.ExecAllowError(t, conn, "delete from "+table) } diff --git a/go/test/endtoend/vtgate/schema.sql b/go/test/endtoend/vtgate/schema.sql index c597bd7e53e..536bec397ec 100644 --- a/go/test/endtoend/vtgate/schema.sql +++ b/go/test/endtoend/vtgate/schema.sql @@ -138,3 +138,17 @@ create table t9_id_to_keyspace_id_idx keyspace_id varbinary(10), primary key (id) ) Engine = InnoDB; + +create table t10 +( + id bigint, + sharding_key bigint, + primary key (id) +) Engine = InnoDB; + +create table t10_id_to_keyspace_id_idx +( + id bigint, + keyspace_id varbinary(10), + primary key (id) +) Engine = InnoDB; diff --git a/go/test/endtoend/vtgate/vschema.json b/go/test/endtoend/vtgate/vschema.json index 3aafd1106b5..8d16beec2a6 100644 --- a/go/test/endtoend/vtgate/vschema.json +++ b/go/test/endtoend/vtgate/vschema.json @@ -79,6 +79,16 @@ "to": "keyspace_id" }, "owner": "t9" + }, + "t10_id_to_keyspace_id_idx": { + "type": "lookup_unique", + "params": { + "autocommit": "true", + "table": "t10_id_to_keyspace_id_idx", + "from": "id", + "to": "keyspace_id" + }, + "owner": "t10" } }, "tables": { @@ -271,6 +281,26 @@ "name": "hash" } ] + }, + "t10": { + "column_vindexes": [ + { + "column": "sharding_key", + "name": "hash" + }, + { + "column": "id", + "name": "t10_id_to_keyspace_id_idx" + } + ] + }, + "t10_id_to_keyspace_id_idx": { + "column_vindexes": [ + { + "column": "id", + "name": "hash" + } + ] } } } diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index 35c90977d4d..c452c44e210 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -105,6 +105,10 @@ func (t *noopVCursor) ExecutePrimitive(ctx context.Context, primitive Primitive, return primitive.TryExecute(ctx, t, bindVars, wantfields) } +func (t *noopVCursor) ExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + return primitive.TryExecute(ctx, t, bindVars, wantfields) +} + func (t *noopVCursor) StreamExecutePrimitive(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { return primitive.TryStreamExecute(ctx, t, bindVars, wantfields, callback) } @@ -350,6 +354,10 @@ func (f *loggingVCursor) ExecutePrimitive(ctx context.Context, primitive Primiti return primitive.TryExecute(ctx, f, bindVars, wantfields) } +func (f *loggingVCursor) ExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + return primitive.TryExecute(ctx, f, bindVars, wantfields) +} + func (f *loggingVCursor) StreamExecutePrimitive(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { return primitive.TryStreamExecute(ctx, f, bindVars, wantfields, callback) } diff --git a/go/vt/vtgate/engine/primitive.go b/go/vt/vtgate/engine/primitive.go index 51725adc5da..dd1aa219ed4 100644 --- a/go/vt/vtgate/engine/primitive.go +++ b/go/vt/vtgate/engine/primitive.go @@ -57,9 +57,15 @@ type ( Execute(ctx context.Context, method string, query string, bindVars map[string]*querypb.BindVariable, rollbackOnError bool, co vtgatepb.CommitOrder) (*sqltypes.Result, error) AutocommitApproval() bool - // Primitive functions + // Execute the given primitive ExecutePrimitive(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) + // Execute the given primitive in a new autocommit session + ExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) + + // Execute the given primitive StreamExecutePrimitive(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error + // Execute the given primitive in a new autocommit session + StreamExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(result *sqltypes.Result) error) error // Shard-level functions. ExecuteMultiShard(ctx context.Context, rss []*srvtopo.ResolvedShard, queries []*querypb.BoundQuery, rollbackOnError, canAutocommit bool) (*sqltypes.Result, []error) @@ -109,9 +115,6 @@ type ( // ReleaseLock releases all the held advisory locks. ReleaseLock(ctx context.Context) error - - // StreamExecutePrimitiveStandalone executes the primitive in its own new autocommit session. - StreamExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(result *sqltypes.Result) error) error } // SessionActions gives primitives ability to interact with the session state diff --git a/go/vt/vtgate/engine/vindex_lookup.go b/go/vt/vtgate/engine/vindex_lookup.go index 8883f138dcd..816507ae086 100644 --- a/go/vt/vtgate/engine/vindex_lookup.go +++ b/go/vt/vtgate/engine/vindex_lookup.go @@ -187,10 +187,17 @@ func (vr *VindexLookup) executeNonBatch(ctx context.Context, vcursor VCursor, id bindVars := map[string]*querypb.BindVariable{ vr.Arguments[0]: vars, } - result, err := vcursor.ExecutePrimitive(ctx, vr.Lookup, bindVars, false) + + var result *sqltypes.Result + if vr.Vindex.AutoCommitEnabled() { + result, err = vcursor.ExecutePrimitiveStandalone(ctx, vr.Lookup, bindVars, false) + } else { + result, err = vcursor.ExecutePrimitive(ctx, vr.Lookup, bindVars, false) + } if err != nil { return nil, err } + rows := make([][]sqltypes.Value, 0, len(result.Rows)) for _, row := range result.Rows { rows = append(rows, []sqltypes.Value{row[1]}) @@ -212,7 +219,17 @@ func (vr *VindexLookup) executeBatch(ctx context.Context, vcursor VCursor, ids [ bindVars := map[string]*querypb.BindVariable{ vr.Arguments[0]: vars, } - result, err := vcursor.ExecutePrimitive(ctx, vr.Lookup, bindVars, false) + + var result *sqltypes.Result + if vr.Vindex.AutoCommitEnabled() { + result, err = vcursor.ExecutePrimitiveStandalone(ctx, vr.Lookup, bindVars, false) + } else { + result, err = vcursor.ExecutePrimitive(ctx, vr.Lookup, bindVars, false) + } + if err != nil { + return nil, err + } + if err != nil { return nil, vterrors.Wrapf(err, "failed while running the lookup query") } diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index f2a7d5f6cc7..0b60ca73b04 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -110,6 +110,7 @@ func (*nameLkpIndex) Cost() int { return 3 } func (*nameLkpIndex) IsUnique() bool { return false } func (*nameLkpIndex) NeedsVCursor() bool { return false } func (*nameLkpIndex) AllowBatch() bool { return true } +func (*nameLkpIndex) AutoCommitEnabled() bool { return false } func (*nameLkpIndex) GetCommitOrder() vtgatepb.CommitOrder { return vtgatepb.CommitOrder_NORMAL } func (*nameLkpIndex) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { return []bool{}, nil diff --git a/go/vt/vtgate/vcursor_impl.go b/go/vt/vtgate/vcursor_impl.go index ff2e14f8545..25632cdd319 100644 --- a/go/vt/vtgate/vcursor_impl.go +++ b/go/vt/vtgate/vcursor_impl.go @@ -402,6 +402,19 @@ func (vc *vcursorImpl) ExecutePrimitive(ctx context.Context, primitive engine.Pr return nil, vterrors.New(vtrpcpb.Code_UNAVAILABLE, "upstream shards are not available") } +func (vc *vcursorImpl) ExecutePrimitiveStandalone(ctx context.Context, primitive engine.Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + // clone the vcursorImpl with a new session. + newVC := vc.cloneWithAutocommitSession() + for try := 0; try < MaxBufferingRetries; try++ { + res, err := primitive.TryExecute(ctx, newVC, bindVars, wantfields) + if err != nil && vterrors.RootCause(err) == buffer.ShardMissingError { + continue + } + return res, err + } + return nil, vterrors.New(vtrpcpb.Code_UNAVAILABLE, "upstream shards are not available") +} + func (vc *vcursorImpl) StreamExecutePrimitive(ctx context.Context, primitive engine.Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { for try := 0; try < MaxBufferingRetries; try++ { err := primitive.TryStreamExecute(ctx, vc, bindVars, wantfields, callback) @@ -1021,6 +1034,7 @@ func (vc *vcursorImpl) ReleaseLock(ctx context.Context) error { func (vc *vcursorImpl) cloneWithAutocommitSession() *vcursorImpl { safeSession := NewAutocommitSession(vc.safeSession.Session) + safeSession.logging = vc.safeSession.logging return &vcursorImpl{ safeSession: safeSession, keyspace: vc.keyspace, diff --git a/go/vt/vtgate/vindexes/consistent_lookup.go b/go/vt/vtgate/vindexes/consistent_lookup.go index 1cd372906f4..3c2166c0aaf 100644 --- a/go/vt/vtgate/vindexes/consistent_lookup.go +++ b/go/vt/vtgate/vindexes/consistent_lookup.go @@ -148,6 +148,10 @@ func (lu *ConsistentLookup) AllowBatch() bool { return lu.lkp.BatchLookup } +func (lu *ConsistentLookup) AutoCommitEnabled() bool { + return lu.lkp.Autocommit +} + //==================================================================== // ConsistentLookupUnique defines a vindex that uses a lookup table. @@ -240,6 +244,10 @@ func (lu *ConsistentLookupUnique) AllowBatch() bool { return lu.lkp.BatchLookup } +func (lu *ConsistentLookupUnique) AutoCommitEnabled() bool { + return lu.lkp.Autocommit +} + //==================================================================== // clCommon defines a vindex that uses a lookup table. diff --git a/go/vt/vtgate/vindexes/lookup.go b/go/vt/vtgate/vindexes/lookup.go index 09c838ede4e..c2577f17a1b 100644 --- a/go/vt/vtgate/vindexes/lookup.go +++ b/go/vt/vtgate/vindexes/lookup.go @@ -57,6 +57,10 @@ func (ln *LookupNonUnique) AllowBatch() bool { return ln.lkp.BatchLookup } +func (ln *LookupNonUnique) AutoCommitEnabled() bool { + return ln.lkp.Autocommit +} + // String returns the name of the vindex. func (ln *LookupNonUnique) String() string { return ln.name @@ -225,6 +229,10 @@ func (lu *LookupUnique) AllowBatch() bool { return lu.lkp.BatchLookup } +func (lu *LookupUnique) AutoCommitEnabled() bool { + return lu.lkp.Autocommit +} + // NewLookupUnique creates a LookupUnique vindex. // The supplied map has the following required fields: // diff --git a/go/vt/vtgate/vindexes/lookup_hash.go b/go/vt/vtgate/vindexes/lookup_hash.go index 455f3be09b9..ae838adf343 100644 --- a/go/vt/vtgate/vindexes/lookup_hash.go +++ b/go/vt/vtgate/vindexes/lookup_hash.go @@ -171,6 +171,10 @@ func (lh *LookupHash) AllowBatch() bool { return lh.lkp.BatchLookup } +func (lh *LookupHash) AutoCommitEnabled() bool { + return lh.lkp.Autocommit +} + // GetCommitOrder implements the LookupPlanable interface func (lh *LookupHash) GetCommitOrder() vtgatepb.CommitOrder { return vtgatepb.CommitOrder_NORMAL @@ -403,6 +407,10 @@ func (lhu *LookupHashUnique) AllowBatch() bool { return lhu.lkp.BatchLookup } +func (lhu *LookupHashUnique) AutoCommitEnabled() bool { + return lhu.lkp.Autocommit +} + func (lhu *LookupHashUnique) Query() (selQuery string, arguments []string) { return lhu.lkp.query() } diff --git a/go/vt/vtgate/vindexes/lookup_unicodeloosemd5_hash.go b/go/vt/vtgate/vindexes/lookup_unicodeloosemd5_hash.go index 884fd7c99b9..433234b82cb 100644 --- a/go/vt/vtgate/vindexes/lookup_unicodeloosemd5_hash.go +++ b/go/vt/vtgate/vindexes/lookup_unicodeloosemd5_hash.go @@ -192,6 +192,10 @@ func (lh *LookupUnicodeLooseMD5Hash) AllowBatch() bool { return lh.lkp.BatchLookup } +func (lh *LookupUnicodeLooseMD5Hash) AutoCommitEnabled() bool { + return lh.lkp.Autocommit +} + // GetCommitOrder implements the LookupPlanable interface func (lh *LookupUnicodeLooseMD5Hash) GetCommitOrder() vtgatepb.CommitOrder { return vtgatepb.CommitOrder_NORMAL @@ -402,6 +406,10 @@ func (lhu *LookupUnicodeLooseMD5HashUnique) AllowBatch() bool { return lhu.lkp.BatchLookup } +func (lhu *LookupUnicodeLooseMD5HashUnique) AutoCommitEnabled() bool { + return lhu.lkp.Autocommit +} + // GetCommitOrder implements the LookupPlanable interface func (lhu *LookupUnicodeLooseMD5HashUnique) GetCommitOrder() vtgatepb.CommitOrder { return vtgatepb.CommitOrder_NORMAL diff --git a/go/vt/vtgate/vindexes/vindex.go b/go/vt/vtgate/vindexes/vindex.go index dcb96e73a28..700b8e6175c 100644 --- a/go/vt/vtgate/vindexes/vindex.go +++ b/go/vt/vtgate/vindexes/vindex.go @@ -143,6 +143,7 @@ type ( MapResult(ids []sqltypes.Value, results []*sqltypes.Result) ([]key.Destination, error) AllowBatch() bool GetCommitOrder() vtgatepb.CommitOrder + AutoCommitEnabled() bool } // LookupBackfill interfaces all lookup vindexes that can backfill rows, such as LookupUnique. From c1d8c14a7f32a57f492c63f759c37a527f4db675 Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Mon, 6 Feb 2023 10:26:07 +0100 Subject: [PATCH 14/53] Release-15: Cherry pick vtorc no cgo (#12223) * Move vtorc from go-sqlite3 to modernc.org/sqlite (#12214) * Move vtorc from go-sqlite3 to modernc.org/sqlite This moves vtorc from the go-sqlite3 library that uses CGO, to use modernc.org/sqlite which is a pure Go implementation. vtorc is the only component we have to build with CGO but it's causing pain for releases since we need to build it against an old Linux for linking against glibc. Using modernc.org/sqlite allows for using Go only again and makes all Vitess components buildable without CGO. In https://datastation.multiprocess.io/blog/2022-05-12-sqlite-in-go-with-and-without-cgo.html someone ran some basic benchmarks. It shows that the pure Go version can be twice as slow, but the usage of vtorc is very limited and we operate on small datasets, so I think the performance impact purely of a somewhat slower sqlite implementation is negligable. None of this is in a hot query serving path or anything like that, so I have little concern performance wise. Signed-off-by: Dirkjan Bussink * Fix error handling in RowToArray Signed-off-by: Dirkjan Bussink --------- Signed-off-by: Dirkjan Bussink * empty-commit Signed-off-by: Manan Gupta * Run go mod tidy Signed-off-by: Dirkjan Bussink --------- Signed-off-by: Dirkjan Bussink Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- Makefile | 11 +---- go.mod | 22 +++++++-- go.sum | 47 +++++++++++++++---- go/cmd/vtorc/main.go | 2 +- .../vtorc/readtopologyinstance/main_test.go | 2 +- .../external/golib/sqlutils/dialect.go | 0 .../external/golib/sqlutils/sqlite_dialect.go | 0 .../golib/sqlutils/sqlite_dialect_test.go | 0 .../external/golib/sqlutils/sqlutils.go | 19 ++++---- go/vt/vtgr/config/vtgr_config.go | 6 +-- go/vt/vtgr/db/db.go | 2 +- go/vt/vtgr/db/mysql.go | 3 +- go/vt/vtgr/db/tls.go | 2 +- go/vt/vtorc/attributes/attributes_dao.go | 4 +- go/vt/vtorc/db/db.go | 3 +- go/vt/vtorc/inst/analysis_dao.go | 3 +- go/vt/vtorc/inst/analysis_dao_test.go | 2 +- go/vt/vtorc/inst/audit_dao.go | 3 +- .../inst/candidate_database_instance_dao.go | 4 +- go/vt/vtorc/inst/instance_dao.go | 3 +- go/vt/vtorc/inst/keyspace_dao.go | 3 +- go/vt/vtorc/inst/keyspace_dao_test.go | 2 +- go/vt/vtorc/inst/resolve_dao.go | 5 +- go/vt/vtorc/inst/tablet_dao.go | 3 +- go/vt/vtorc/inst/tag_dao.go | 4 +- go/vt/vtorc/logic/disable_recovery.go | 3 +- go/vt/vtorc/logic/keyspace_discovery_test.go | 2 +- go/vt/vtorc/logic/tablet_discovery.go | 4 +- go/vt/vtorc/logic/topology_recovery_dao.go | 4 +- go/vt/vtorc/process/election_dao.go | 3 +- go/vt/vtorc/process/health_dao.go | 4 +- go/vt/vtorc/test/db.go | 4 +- go/vt/vtorc/test/recovery_analysis.go | 2 +- 33 files changed, 99 insertions(+), 82 deletions(-) rename go/vt/{vtgr => }/external/golib/sqlutils/dialect.go (100%) rename go/vt/{vtgr => }/external/golib/sqlutils/sqlite_dialect.go (100%) rename go/vt/{vtgr => }/external/golib/sqlutils/sqlite_dialect_test.go (100%) rename go/vt/{vtgr => }/external/golib/sqlutils/sqlutils.go (96%) diff --git a/Makefile b/Makefile index c0fee347ac3..f8eedc38f1a 100644 --- a/Makefile +++ b/Makefile @@ -92,12 +92,6 @@ endif -ldflags "$(shell tools/build_version_flags.sh)" \ -o ${VTROOTBIN} ./go/... - # build vtorc with CGO, because it depends on sqlite - CGO_ENABLED=1 go build \ - -trimpath $(EXTRA_BUILD_FLAGS) $(VT_GO_PARALLEL) \ - -ldflags "$(shell tools/build_version_flags.sh)" \ - -o ${VTROOTBIN} ./go/cmd/vtorc/... - # cross-build can be used to cross-compile Vitess client binaries # Outside of select client binaries (namely vtctlclient & vtexplain), cross-compiled Vitess Binaries are not recommended for production deployments # Usage: GOOS=darwin GOARCH=amd64 make cross-build @@ -120,8 +114,6 @@ endif echo "Missing vttablet at: ${VTROOTBIN}/${GOOS}_${GOARCH}." && exit; \ fi - # Cross-compiling w/ cgo isn't trivial and we don't need vtorc, so we can skip building it - debug: ifndef NOBANNER echo $$(date): Building source tree @@ -145,8 +137,7 @@ install: build cross-install: cross-build # binaries mkdir -p "$${PREFIX}/bin" - # Still no vtorc for cross-compile - cp "${VTROOTBIN}/${GOOS}_${GOARCH}/"{mysqlctl,mysqlctld,vtadmin,vtctld,vtctlclient,vtctldclient,vtgate,vttablet,vtbackup} "$${PREFIX}/bin/" + cp "${VTROOTBIN}/${GOOS}_${GOARCH}/"{mysqlctl,mysqlctld,vtorc,vtadmin,vtctld,vtctlclient,vtctldclient,vtgate,vttablet,vtbackup} "$${PREFIX}/bin/" # Install local install the binaries needed to run vitess locally # Usage: make install-local PREFIX=/path/to/install/root diff --git a/go.mod b/go.mod index 7a1497afe26..2e5e8a64258 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/golang/mock v1.5.0 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.3 - github.com/google/go-cmp v0.5.8 + github.com/google/go-cmp v0.5.9 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/google/uuid v1.3.0 github.com/googleapis/gnostic v0.4.1 // indirect @@ -49,7 +49,7 @@ require ( github.com/klauspost/pgzip v1.2.4 github.com/krishicks/yaml-patch v0.0.10 github.com/magiconair/properties v1.8.5 - github.com/mattn/go-sqlite3 v1.14.14 + github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1 github.com/mitchellh/go-testing-interface v1.14.0 // indirect github.com/montanaflynn/stats v0.6.3 @@ -90,7 +90,7 @@ require ( golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/net v0.0.0-20220722155237-a158d28d115b golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f - golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 golang.org/x/text v0.3.8 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac @@ -117,7 +117,7 @@ require ( require ( github.com/bndr/gotabulate v1.1.2 - github.com/openark/golib v0.0.0-20210531070646-355f37940af8 + modernc.org/sqlite v1.20.3 ) require ( @@ -131,6 +131,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect github.com/fatih/color v1.9.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect github.com/frankban/quicktest v1.14.3 // indirect @@ -147,9 +148,10 @@ require ( github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/json-iterator/go v1.1.11 // indirect github.com/jstemmer/go-junit-report v0.9.1 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/mattn/go-colorable v0.1.6 // indirect github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d // indirect - github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect github.com/mattn/go-runewidth v0.0.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -162,6 +164,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/procfs v0.6.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/satori/go.uuid v1.2.0 // indirect github.com/spf13/afero v1.6.0 // indirect @@ -186,5 +189,14 @@ require ( k8s.io/klog/v2 v2.4.0 // indirect k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect + lukechampine.com/uint128 v1.2.0 // indirect + modernc.org/cc/v3 v3.40.0 // indirect + modernc.org/ccgo/v3 v3.16.13 // indirect + modernc.org/libc v1.22.2 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.4.0 // indirect + modernc.org/opt v0.1.3 // indirect + modernc.org/strutil v1.1.3 // indirect + modernc.org/token v1.0.1 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.0.3 // indirect ) diff --git a/go.sum b/go.sum index 551e6199f9d..bcc129d097c 100644 --- a/go.sum +++ b/go.sum @@ -183,6 +183,7 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvyukov/go-fuzz v0.0.0-20210914135545-4980593459a1/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -332,8 +333,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v27 v27.0.4/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -355,6 +356,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -475,6 +477,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -517,13 +521,14 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -577,8 +582,6 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/openark/golib v0.0.0-20210531070646-355f37940af8 h1:9ciIHNuyFqRWi9NpMNw9sVLB6z1ItpP5ZhTY9Q1xVu4= -github.com/openark/golib v0.0.0-20210531070646-355f37940af8/go.mod h1:1jj8x1eDVZxgc/Z4VyamX4qTbAdHPUQA6NeVtCd8Sl8= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02 h1:0R5mDLI66Qw13qN80TRz85zthQ2nf2+uDyiV23w6c3Q= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= @@ -638,6 +641,8 @@ github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3x github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -978,8 +983,8 @@ golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1271,6 +1276,30 @@ k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAG k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/libc v1.22.2 h1:4U7v51GyhlWqQmwCHj28Rdq2Yzwk55ovjFrdPjs8Hb0= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.4.0 h1:crykUfNSnMAXaOJnnxcSzbUGMqkLWjklJKkBK2nwZwk= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.20.3 h1:SqGJMMxjj1PHusLxdYxeQSodg7Jxn9WWkaAQjKrntZs= +modernc.org/sqlite v1.20.3/go.mod h1:zKcGyrICaxNTMEHSr1HQ2GUraP0j+845GYw37+EyT6A= +modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.15.0 h1:oY+JeD11qVVSgVvodMJsu7Edf8tr5E/7tuhF5cNYz34= +modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/go/cmd/vtorc/main.go b/go/cmd/vtorc/main.go index f5418819a05..0d28c8da9bf 100644 --- a/go/cmd/vtorc/main.go +++ b/go/cmd/vtorc/main.go @@ -22,8 +22,8 @@ import ( "strings" _ "github.com/go-sql-driver/mysql" - _ "github.com/mattn/go-sqlite3" "github.com/spf13/pflag" + _ "modernc.org/sqlite" "vitess.io/vitess/go/acl" "vitess.io/vitess/go/vt/grpccommon" diff --git a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go index c6426021d6c..8dbd4761f93 100644 --- a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go +++ b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go @@ -30,9 +30,9 @@ import ( "vitess.io/vitess/go/vt/vtorc/server" _ "github.com/go-sql-driver/mysql" - _ "github.com/mattn/go-sqlite3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + _ "modernc.org/sqlite" ) func TestReadTopologyInstanceBufferable(t *testing.T) { diff --git a/go/vt/vtgr/external/golib/sqlutils/dialect.go b/go/vt/external/golib/sqlutils/dialect.go similarity index 100% rename from go/vt/vtgr/external/golib/sqlutils/dialect.go rename to go/vt/external/golib/sqlutils/dialect.go diff --git a/go/vt/vtgr/external/golib/sqlutils/sqlite_dialect.go b/go/vt/external/golib/sqlutils/sqlite_dialect.go similarity index 100% rename from go/vt/vtgr/external/golib/sqlutils/sqlite_dialect.go rename to go/vt/external/golib/sqlutils/sqlite_dialect.go diff --git a/go/vt/vtgr/external/golib/sqlutils/sqlite_dialect_test.go b/go/vt/external/golib/sqlutils/sqlite_dialect_test.go similarity index 100% rename from go/vt/vtgr/external/golib/sqlutils/sqlite_dialect_test.go rename to go/vt/external/golib/sqlutils/sqlite_dialect_test.go diff --git a/go/vt/vtgr/external/golib/sqlutils/sqlutils.go b/go/vt/external/golib/sqlutils/sqlutils.go similarity index 96% rename from go/vt/vtgr/external/golib/sqlutils/sqlutils.go rename to go/vt/external/golib/sqlutils/sqlutils.go index f89d96229a3..91e83f0a4e4 100644 --- a/go/vt/vtgr/external/golib/sqlutils/sqlutils.go +++ b/go/vt/external/golib/sqlutils/sqlutils.go @@ -38,7 +38,7 @@ const DateTimeFormat = "2006-01-02 15:04:05.999999" // for easy, typed getters by column name. type RowMap map[string]CellData -// Cell data is the result of a single (atomic) column in a single row +// CellData is the result of a single (atomic) column in a single row type CellData sql.NullString func (this *CellData) MarshalJSON() ([]byte, error) { @@ -200,22 +200,22 @@ func GetDB(mysql_uri string) (*sql.DB, bool, error) { return GetGenericDB("mysql", mysql_uri) } -// GetDB returns a SQLite DB instance based on DB file name. +// GetSQLiteDB returns a SQLite DB instance based on DB file name. // bool result indicates whether the DB was returned from cache; err func GetSQLiteDB(dbFile string) (*sql.DB, bool, error) { - return GetGenericDB("sqlite3", dbFile) + return GetGenericDB("sqlite", dbFile) } // RowToArray is a convenience function, typically not called directly, which maps a // single read database row into a NullString -func RowToArray(rows *sql.Rows, columns []string) []CellData { +func RowToArray(rows *sql.Rows, columns []string) ([]CellData, error) { buff := make([]any, len(columns)) data := make([]CellData, len(columns)) for i := range buff { buff[i] = data[i].NullString() } - rows.Scan(buff...) - return data + err := rows.Scan(buff...) + return data, err } // ScanRowsToArrays is a convenience function, typically not called directly, which maps rows @@ -223,8 +223,11 @@ func RowToArray(rows *sql.Rows, columns []string) []CellData { func ScanRowsToArrays(rows *sql.Rows, on_row func([]CellData) error) error { columns, _ := rows.Columns() for rows.Next() { - arr := RowToArray(rows, columns) - err := on_row(arr) + arr, err := RowToArray(rows, columns) + if err != nil { + return err + } + err = on_row(arr) if err != nil { return err } diff --git a/go/vt/vtgr/config/vtgr_config.go b/go/vt/vtgr/config/vtgr_config.go index 3f66e0dcfc1..4b4063f6460 100644 --- a/go/vt/vtgr/config/vtgr_config.go +++ b/go/vt/vtgr/config/vtgr_config.go @@ -104,8 +104,8 @@ type Configuration struct { MySQLTopologyUseMutualTLS bool // Turn on TLS authentication with the Topology MySQL instances MySQLTopologyUseMixedTLS bool // Mixed TLS and non-TLS authentication with the Topology MySQL instances TLSCacheTTLFactor uint // Factor of InstancePollSeconds that we set as TLS info cache expiry - BackendDB string // EXPERIMENTAL: type of backend db; either "mysql" or "sqlite3" - SQLite3DataFile string // when BackendDB == "sqlite3", full path to sqlite3 datafile + BackendDB string // EXPERIMENTAL: type of backend db; either "mysql" or "sqlite" + SQLite3DataFile string // when BackendDB == "sqlite", full path to sqlite3 datafile SkipOrchestratorDatabaseUpdate bool // When true, do not check backend database schema nor attempt to update it. Useful when you may be running multiple versions of orchestrator, and you only wish certain boxes to dictate the db structure (or else any time a different orchestrator version runs it will rebuild database schema) PanicIfDifferentDatabaseDeploy bool // When true, and this process finds the orchestrator backend DB was provisioned by a different version, panic RaftEnabled bool // When true, setup orchestrator in a raft consensus layout. When false (default) all Raft* variables are ignored @@ -477,7 +477,7 @@ func (config *Configuration) postReadAdjustments() error { } if config.IsSQLite() && config.SQLite3DataFile == "" { - return fmt.Errorf("SQLite3DataFile must be set when BackendDB is sqlite3") + return fmt.Errorf("SQLite3DataFile must be set when BackendDB is sqlite") } if config.RaftEnabled && config.RaftDataDir == "" { return fmt.Errorf("RaftDataDir must be defined since raft is enabled (RaftEnabled)") diff --git a/go/vt/vtgr/db/db.go b/go/vt/vtgr/db/db.go index a8736596b07..f9a0ab2b478 100644 --- a/go/vt/vtgr/db/db.go +++ b/go/vt/vtgr/db/db.go @@ -27,9 +27,9 @@ import ( "sync" "time" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vtgr/config" - "vitess.io/vitess/go/vt/vtgr/external/golib/sqlutils" ) var ( diff --git a/go/vt/vtgr/db/mysql.go b/go/vt/vtgr/db/mysql.go index 1b6222d3223..8c3787c9187 100644 --- a/go/vt/vtgr/db/mysql.go +++ b/go/vt/vtgr/db/mysql.go @@ -26,11 +26,12 @@ import ( gouuid "github.com/google/uuid" "github.com/spf13/pflag" + "vitess.io/vitess/go/vt/external/golib/sqlutils" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/vtgr/config" - "vitess.io/vitess/go/vt/vtgr/external/golib/sqlutils" "vitess.io/vitess/go/vt/vtgr/inst" ) diff --git a/go/vt/vtgr/db/tls.go b/go/vt/vtgr/db/tls.go index 67aeaa9b25f..62dcf028c0d 100644 --- a/go/vt/vtgr/db/tls.go +++ b/go/vt/vtgr/db/tls.go @@ -26,6 +26,7 @@ import ( "strings" "time" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" "github.com/go-sql-driver/mysql" @@ -33,7 +34,6 @@ import ( "github.com/rcrowley/go-metrics" "vitess.io/vitess/go/vt/vtgr/config" - "vitess.io/vitess/go/vt/vtgr/external/golib/sqlutils" "vitess.io/vitess/go/vt/vtgr/ssl" ) diff --git a/go/vt/vtorc/attributes/attributes_dao.go b/go/vt/vtorc/attributes/attributes_dao.go index 503d4e4d22c..9e07ac96eaf 100644 --- a/go/vt/vtorc/attributes/attributes_dao.go +++ b/go/vt/vtorc/attributes/attributes_dao.go @@ -19,10 +19,8 @@ package attributes import ( "fmt" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" - - "github.com/openark/golib/sqlutils" - "vitess.io/vitess/go/vt/vtorc/db" ) diff --git a/go/vt/vtorc/db/db.go b/go/vt/vtorc/db/db.go index b71a80a1dc2..d3cf83b871d 100644 --- a/go/vt/vtorc/db/db.go +++ b/go/vt/vtorc/db/db.go @@ -20,8 +20,7 @@ import ( "database/sql" "strings" - "github.com/openark/golib/sqlutils" - + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vtorc/config" ) diff --git a/go/vt/vtorc/inst/analysis_dao.go b/go/vt/vtorc/inst/analysis_dao.go index 657bb6ddea3..638d9885f10 100644 --- a/go/vt/vtorc/inst/analysis_dao.go +++ b/go/vt/vtorc/inst/analysis_dao.go @@ -20,6 +20,7 @@ import ( "fmt" "time" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" "google.golang.org/protobuf/encoding/prototext" @@ -34,8 +35,6 @@ import ( "github.com/patrickmn/go-cache" "github.com/rcrowley/go-metrics" - - "github.com/openark/golib/sqlutils" ) var analysisChangeWriteAttemptCounter = metrics.NewCounter() diff --git a/go/vt/vtorc/inst/analysis_dao_test.go b/go/vt/vtorc/inst/analysis_dao_test.go index a705530a585..190c9e0a749 100644 --- a/go/vt/vtorc/inst/analysis_dao_test.go +++ b/go/vt/vtorc/inst/analysis_dao_test.go @@ -21,7 +21,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/openark/golib/sqlutils" + "vitess.io/vitess/go/vt/external/golib/sqlutils" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/vtorc/db" diff --git a/go/vt/vtorc/inst/audit_dao.go b/go/vt/vtorc/inst/audit_dao.go index 36c690d2513..fc0d4ca4bf8 100644 --- a/go/vt/vtorc/inst/audit_dao.go +++ b/go/vt/vtorc/inst/audit_dao.go @@ -22,12 +22,11 @@ import ( "os" "time" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" "github.com/rcrowley/go-metrics" - "github.com/openark/golib/sqlutils" - "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/db" ) diff --git a/go/vt/vtorc/inst/candidate_database_instance_dao.go b/go/vt/vtorc/inst/candidate_database_instance_dao.go index b9883626eca..95bbb53f617 100644 --- a/go/vt/vtorc/inst/candidate_database_instance_dao.go +++ b/go/vt/vtorc/inst/candidate_database_instance_dao.go @@ -17,10 +17,8 @@ package inst import ( - "github.com/openark/golib/sqlutils" - + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/db" ) diff --git a/go/vt/vtorc/inst/instance_dao.go b/go/vt/vtorc/inst/instance_dao.go index d6610de09b6..c51ca63e8d0 100644 --- a/go/vt/vtorc/inst/instance_dao.go +++ b/go/vt/vtorc/inst/instance_dao.go @@ -27,11 +27,12 @@ import ( "sync" "time" - "github.com/openark/golib/sqlutils" "github.com/patrickmn/go-cache" "github.com/rcrowley/go-metrics" "github.com/sjmudd/stopwatch" + "vitess.io/vitess/go/vt/external/golib/sqlutils" + vitessmysql "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/tb" "vitess.io/vitess/go/vt/log" diff --git a/go/vt/vtorc/inst/keyspace_dao.go b/go/vt/vtorc/inst/keyspace_dao.go index e02d13fc448..7e55471854d 100644 --- a/go/vt/vtorc/inst/keyspace_dao.go +++ b/go/vt/vtorc/inst/keyspace_dao.go @@ -19,8 +19,7 @@ package inst import ( "errors" - "github.com/openark/golib/sqlutils" - + "vitess.io/vitess/go/vt/external/golib/sqlutils" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vtorc/db" diff --git a/go/vt/vtorc/inst/keyspace_dao_test.go b/go/vt/vtorc/inst/keyspace_dao_test.go index 9ccfca7f09d..56ad06ec9e5 100644 --- a/go/vt/vtorc/inst/keyspace_dao_test.go +++ b/go/vt/vtorc/inst/keyspace_dao_test.go @@ -19,8 +19,8 @@ package inst import ( "testing" - _ "github.com/mattn/go-sqlite3" "github.com/stretchr/testify/require" + _ "modernc.org/sqlite" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" diff --git a/go/vt/vtorc/inst/resolve_dao.go b/go/vt/vtorc/inst/resolve_dao.go index 2af0bf6d32d..d38146469d2 100644 --- a/go/vt/vtorc/inst/resolve_dao.go +++ b/go/vt/vtorc/inst/resolve_dao.go @@ -19,10 +19,9 @@ package inst import ( "github.com/rcrowley/go-metrics" - "vitess.io/vitess/go/vt/log" - - "github.com/openark/golib/sqlutils" + "vitess.io/vitess/go/vt/external/golib/sqlutils" + "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/db" ) diff --git a/go/vt/vtorc/inst/tablet_dao.go b/go/vt/vtorc/inst/tablet_dao.go index f9d00ca8ea3..0e258bf0882 100644 --- a/go/vt/vtorc/inst/tablet_dao.go +++ b/go/vt/vtorc/inst/tablet_dao.go @@ -20,14 +20,13 @@ import ( "context" "errors" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" - "github.com/openark/golib/sqlutils" - "vitess.io/vitess/go/vt/logutil" replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" diff --git a/go/vt/vtorc/inst/tag_dao.go b/go/vt/vtorc/inst/tag_dao.go index b49601198be..5b5962a9326 100644 --- a/go/vt/vtorc/inst/tag_dao.go +++ b/go/vt/vtorc/inst/tag_dao.go @@ -19,10 +19,8 @@ package inst import ( "fmt" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" - - "github.com/openark/golib/sqlutils" - "vitess.io/vitess/go/vt/vtorc/db" ) diff --git a/go/vt/vtorc/logic/disable_recovery.go b/go/vt/vtorc/logic/disable_recovery.go index f5d18381452..4a3766055d2 100644 --- a/go/vt/vtorc/logic/disable_recovery.go +++ b/go/vt/vtorc/logic/disable_recovery.go @@ -32,8 +32,7 @@ package logic import ( "fmt" - "github.com/openark/golib/sqlutils" - + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vtorc/db" ) diff --git a/go/vt/vtorc/logic/keyspace_discovery_test.go b/go/vt/vtorc/logic/keyspace_discovery_test.go index 2abaa29e83d..e5be1fd82f2 100644 --- a/go/vt/vtorc/logic/keyspace_discovery_test.go +++ b/go/vt/vtorc/logic/keyspace_discovery_test.go @@ -20,9 +20,9 @@ import ( "context" "testing" - _ "github.com/mattn/go-sqlite3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + _ "modernc.org/sqlite" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" diff --git a/go/vt/vtorc/logic/tablet_discovery.go b/go/vt/vtorc/logic/tablet_discovery.go index 85ccddc2210..9ace94af430 100644 --- a/go/vt/vtorc/logic/tablet_discovery.go +++ b/go/vt/vtorc/logic/tablet_discovery.go @@ -26,6 +26,8 @@ import ( "github.com/spf13/pflag" + "vitess.io/vitess/go/vt/external/golib/sqlutils" + "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" @@ -34,8 +36,6 @@ import ( "vitess.io/vitess/go/vt/vtorc/config" - "github.com/openark/golib/sqlutils" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topotools" diff --git a/go/vt/vtorc/logic/topology_recovery_dao.go b/go/vt/vtorc/logic/topology_recovery_dao.go index f1cfa284de8..0a24d507793 100644 --- a/go/vt/vtorc/logic/topology_recovery_dao.go +++ b/go/vt/vtorc/logic/topology_recovery_dao.go @@ -20,10 +20,8 @@ import ( "fmt" "strings" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" - - "github.com/openark/golib/sqlutils" - "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/db" "vitess.io/vitess/go/vt/vtorc/inst" diff --git a/go/vt/vtorc/process/election_dao.go b/go/vt/vtorc/process/election_dao.go index f4737217d6f..f723bd48dde 100644 --- a/go/vt/vtorc/process/election_dao.go +++ b/go/vt/vtorc/process/election_dao.go @@ -17,8 +17,7 @@ package process import ( - "github.com/openark/golib/sqlutils" - + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/db" diff --git a/go/vt/vtorc/process/health_dao.go b/go/vt/vtorc/process/health_dao.go index ed2b90fcf5c..59ea557223d 100644 --- a/go/vt/vtorc/process/health_dao.go +++ b/go/vt/vtorc/process/health_dao.go @@ -19,10 +19,8 @@ package process import ( "time" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" - - "github.com/openark/golib/sqlutils" - "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/db" ) diff --git a/go/vt/vtorc/test/db.go b/go/vt/vtorc/test/db.go index 199dc924619..fab5db4e500 100644 --- a/go/vt/vtorc/test/db.go +++ b/go/vt/vtorc/test/db.go @@ -19,10 +19,8 @@ package test import ( "fmt" + "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" - - "github.com/openark/golib/sqlutils" - "vitess.io/vitess/go/vt/vtorc/db" ) diff --git a/go/vt/vtorc/test/recovery_analysis.go b/go/vt/vtorc/test/recovery_analysis.go index 4fa748f91cf..07a9219f4c5 100644 --- a/go/vt/vtorc/test/recovery_analysis.go +++ b/go/vt/vtorc/test/recovery_analysis.go @@ -22,7 +22,7 @@ import ( "google.golang.org/protobuf/encoding/prototext" - "github.com/openark/golib/sqlutils" + "vitess.io/vitess/go/vt/external/golib/sqlutils" topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) From ad802f0d11607bf1df533e7cf3b19d342aa4d1fb Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 9 Feb 2023 13:36:04 +0530 Subject: [PATCH 15/53] feat: fix release script for v15 (#12285) Signed-off-by: Manan Gupta --- tools/do_release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/do_release.sh b/tools/do_release.sh index 181c813cf65..5b89b0f5819 100755 --- a/tools/do_release.sh +++ b/tools/do_release.sh @@ -115,7 +115,7 @@ function updateVitessExamples () { # First argument is the Release Version the docker release script should be set to (for instance: v15.0.0) function updateDockerReleaseScript () { - sed -i.bak -E "s/vt_base_version=.*/vt_base_version='$1'/g" $ROOT/docker/release.sh + sed -i.bak -E "s/vt_base_version=.*/vt_base_version='v$1'/g" $ROOT/docker/release.sh rm -f $ROOT/docker/release.sh.bak } From 358b68929dfc554dbf13f07f077b71c565ff17df Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 19:12:24 +0530 Subject: [PATCH 16/53] fix: added null safe operator precendence rule (#12306) Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- go/vt/sqlparser/precedence.go | 2 +- go/vt/sqlparser/precedence_test.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/go/vt/sqlparser/precedence.go b/go/vt/sqlparser/precedence.go index e1beafef816..d63a56b62ef 100644 --- a/go/vt/sqlparser/precedence.go +++ b/go/vt/sqlparser/precedence.go @@ -59,7 +59,7 @@ func precedenceFor(in Expr) Precendence { return P12 case *ComparisonExpr: switch node.Operator { - case EqualOp, NotEqualOp, GreaterThanOp, GreaterEqualOp, LessThanOp, LessEqualOp, LikeOp, InOp, RegexpOp: + case EqualOp, NotEqualOp, GreaterThanOp, GreaterEqualOp, LessThanOp, LessEqualOp, LikeOp, InOp, RegexpOp, NullSafeEqualOp: return P11 } case *IsExpr: diff --git a/go/vt/sqlparser/precedence_test.go b/go/vt/sqlparser/precedence_test.go index cbc481bb4d3..215c9480823 100644 --- a/go/vt/sqlparser/precedence_test.go +++ b/go/vt/sqlparser/precedence_test.go @@ -198,6 +198,7 @@ func TestParens(t *testing.T) { {in: "10 - 2 - 1", expected: "10 - 2 - 1"}, {in: "(10 - 2) - 1", expected: "10 - 2 - 1"}, {in: "10 - (2 - 1)", expected: "10 - (2 - 1)"}, + {in: "0 <=> (1 and 0)", expected: "0 <=> (1 and 0)"}, } for _, tc := range tests { From 9f123a512b7ee13b3f4fd1506ffd155cc087d520 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 13 Feb 2023 19:14:43 +0530 Subject: [PATCH 17/53] Fix aggregation on outer joins (#12298) (#12313) * fix: aggregation coming from right hand side of left join check for null * test: added a sum test * addressed review comments --------- Signed-off-by: Harshit Gangal --- .../queries/aggregation/aggregation_test.go | 14 ++++ go/vt/vtgate/planbuilder/horizon_planning.go | 8 +- .../planbuilder/testdata/aggr_cases.json | 78 ++++++++++++++++--- .../planbuilder/testdata/tpch_cases.json | 18 ++--- 4 files changed, 99 insertions(+), 19 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index d3b7364afa6..3f39addbf94 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -386,3 +386,17 @@ func TestAggregateRandom(t *testing.T) { utils.Exec(t, mcmp.MySQLConn, "set sql_mode=''") mcmp.AssertMatches("SELECT /*vt+ PLANNER=gen4 */ t1.shardKey, t1.name, count(t2.id) FROM t1 JOIN t2 ON t1.value != t2.shardKey GROUP BY t1.t1_id", `[[INT64(1) VARCHAR("name 1") INT64(2)] [INT64(2) VARCHAR("name 2") INT64(2)]]`) } + +// TestAggregateLeftJoin tests that aggregates work with left joins and does not ignore the count when column value does not match the right side table. +func TestAggregateLeftJoin(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into t1(t1_id, name, value, shardKey) values (11, 'r', 'r', 1), (3, 'r', 'r', 0)") + mcmp.Exec("insert into t2(id, shardKey) values (11, 1)") + + mcmp.AssertMatchesNoOrder("SELECT t1.shardkey FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[INT64(1)] [INT64(0)]]`) + mcmp.AssertMatches("SELECT count(t1.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[INT64(2)]]`) + mcmp.AssertMatches("SELECT count(*) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[INT64(2)]]`) + mcmp.AssertMatches("SELECT sum(t1.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(1)]]`) +} diff --git a/go/vt/vtgate/planbuilder/horizon_planning.go b/go/vt/vtgate/planbuilder/horizon_planning.go index f84c69ac3cc..518860cdbda 100644 --- a/go/vt/vtgate/planbuilder/horizon_planning.go +++ b/go/vt/vtgate/planbuilder/horizon_planning.go @@ -395,7 +395,13 @@ func generateAggregateParams(aggrs []abstract.Aggr, aggrParamOffsets [][]offsets aggrExpr = &sqlparser.BinaryExpr{ Operator: sqlparser.MultOp, Left: aggrExpr, - Right: curr, + Right: &sqlparser.FuncExpr{ + Name: sqlparser.NewIdentifierCI("coalesce"), + Exprs: sqlparser.SelectExprs{ + &sqlparser.AliasedExpr{Expr: curr}, + &sqlparser.AliasedExpr{Expr: sqlparser.NewIntLiteral("1")}, + }, + }, } } } diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index 760a136eca7..2e5b7a12ea2 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -2922,7 +2922,7 @@ { "OperatorType": "Projection", "Expressions": [ - "[COLUMN 0] * [COLUMN 1] as count(*)" + "[COLUMN 0] * COALESCE([COLUMN 1], INT64(1)) as count(*)" ], "Inputs": [ { @@ -3041,7 +3041,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as a", - "[COLUMN 2] * [COLUMN 3] as count(*)", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as count(*)", "[COLUMN 1]" ], "Inputs": [ @@ -3104,7 +3104,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as a", - "[COLUMN 2] * [COLUMN 3] as count(user_extra.a)", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as count(user_extra.a)", "[COLUMN 1]" ], "Inputs": [ @@ -3166,8 +3166,8 @@ { "OperatorType": "Projection", "Expressions": [ - "([COLUMN 2] * [COLUMN 3]) * [COLUMN 4] as count(u.textcol1)", - "([COLUMN 5] * [COLUMN 6]) * [COLUMN 7] as count(ue.foo)", + "([COLUMN 2] * COALESCE([COLUMN 3], INT64(1))) * COALESCE([COLUMN 4], INT64(1)) as count(u.textcol1)", + "([COLUMN 5] * COALESCE([COLUMN 6], INT64(1))) * COALESCE([COLUMN 7], INT64(1)) as count(ue.foo)", "[COLUMN 0] as bar", "[COLUMN 1]" ], @@ -3797,7 +3797,7 @@ { "OperatorType": "Projection", "Expressions": [ - "[COLUMN 2] * [COLUMN 3] as sum(col)" + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as sum(col)" ], "Inputs": [ { @@ -4055,7 +4055,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as id", - "[COLUMN 2] * [COLUMN 3] as count(u.`name`)", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as count(u.`name`)", "[COLUMN 1]" ], "Inputs": [ @@ -4181,7 +4181,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as id", - "[COLUMN 2] * [COLUMN 3] as count(*)", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as count(*)", "[COLUMN 1]" ], "Inputs": [ @@ -4839,7 +4839,7 @@ "Expressions": [ "[COLUMN 0] as id", "[COLUMN 2] as name", - "[COLUMN 3] * [COLUMN 4] as count(m.predef1)", + "[COLUMN 3] * COALESCE([COLUMN 4], INT64(1)) as count(m.predef1)", "[COLUMN 1]" ], "Inputs": [ @@ -4896,5 +4896,65 @@ "user.user_extra" ] } + }, + { + "comment": "Aggregation in a left join query", + "query": "select count (u.id) from user u left join user_extra ue on u.col = ue.col", + "plan": { + "QueryType": "SELECT", + "Original": "select count (u.id) from user u left join user_extra ue on u.col = ue.col", + "Instructions": { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum_count(0) AS count(u.id)", + "Inputs": [ + { + "OperatorType": "Projection", + "Expressions": [ + "[COLUMN 0] * COALESCE([COLUMN 1], INT64(1)) as count(u.id)" + ], + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "LeftJoin", + "JoinColumnIndexes": "L:1,R:1", + "JoinVars": { + "u_col": 0 + }, + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select u.col, count(u.id) from `user` as u where 1 != 1 group by u.col", + "Query": "select u.col, count(u.id) from `user` as u group by u.col", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1, count(*) from user_extra as ue where 1 != 1 group by 1", + "Query": "select 1, count(*) from user_extra as ue where ue.col = :u_col group by 1", + "Table": "user_extra" + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "user.user", + "user.user_extra" + ] + } } ] \ No newline at end of file diff --git a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json index 087448bc990..90ac48623f3 100644 --- a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json @@ -38,7 +38,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as l_orderkey", - "([COLUMN 6] * [COLUMN 7]) * [COLUMN 8] as revenue", + "([COLUMN 6] * COALESCE([COLUMN 7], INT64(1))) * COALESCE([COLUMN 8], INT64(1)) as revenue", "[COLUMN 1] as o_orderdate", "[COLUMN 2] as o_shippriority", "[COLUMN 5]", @@ -247,7 +247,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as n_name", - "(((([COLUMN 2] * [COLUMN 3]) * [COLUMN 4]) * [COLUMN 5]) * [COLUMN 6]) * [COLUMN 7] as revenue", + "(((([COLUMN 2] * COALESCE([COLUMN 3], INT64(1))) * COALESCE([COLUMN 4], INT64(1))) * COALESCE([COLUMN 5], INT64(1))) * COALESCE([COLUMN 6], INT64(1))) * COALESCE([COLUMN 7], INT64(1)) as revenue", "[COLUMN 1]" ], "Inputs": [ @@ -512,7 +512,7 @@ "[COLUMN 4] as supp_nation", "[COLUMN 5] as cust_nation", "[COLUMN 6] as l_year", - "(((([COLUMN 10] * [COLUMN 11]) * [COLUMN 12]) * [COLUMN 13]) * [COLUMN 14]) * [COLUMN 15] as revenue", + "(((([COLUMN 10] * COALESCE([COLUMN 11], INT64(1))) * COALESCE([COLUMN 12], INT64(1))) * COALESCE([COLUMN 13], INT64(1))) * COALESCE([COLUMN 14], INT64(1))) * COALESCE([COLUMN 15], INT64(1)) as revenue", "[COLUMN 9]", "[COLUMN 8]", "[COLUMN 7]" @@ -720,7 +720,7 @@ "Expressions": [ "[COLUMN 0] as c_custkey", "[COLUMN 1] as c_name", - "(([COLUMN 14] * [COLUMN 15]) * [COLUMN 16]) * [COLUMN 17] as revenue", + "(([COLUMN 14] * COALESCE([COLUMN 15], INT64(1))) * COALESCE([COLUMN 16], INT64(1))) * COALESCE([COLUMN 17], INT64(1)) as revenue", "[COLUMN 2] as c_acctbal", "[COLUMN 4] as n_name", "[COLUMN 5] as c_address", @@ -896,8 +896,8 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as l_shipmode", - "[COLUMN 2] * [COLUMN 3] as high_line_count", - "[COLUMN 4] * [COLUMN 5] as low_line_count", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as high_line_count", + "[COLUMN 4] * COALESCE([COLUMN 5], INT64(1)) as low_line_count", "[COLUMN 1]" ], "Inputs": [ @@ -1153,7 +1153,7 @@ "[COLUMN 4] as o_orderkey", "[COLUMN 1] as o_orderdate", "[COLUMN 0] as o_totalprice", - "([COLUMN 10] * [COLUMN 11]) * [COLUMN 12] as sum(l_quantity)", + "([COLUMN 10] * COALESCE([COLUMN 11], INT64(1))) * COALESCE([COLUMN 12], INT64(1)) as sum(l_quantity)", "[COLUMN 9]", "[COLUMN 8]", "[COLUMN 7]", @@ -1288,7 +1288,7 @@ { "OperatorType": "Projection", "Expressions": [ - "[COLUMN 0] * [COLUMN 1] as revenue" + "[COLUMN 0] * COALESCE([COLUMN 1], INT64(1)) as revenue" ], "Inputs": [ { @@ -1370,7 +1370,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as s_name", - "(([COLUMN 2] * [COLUMN 3]) * [COLUMN 4]) * [COLUMN 5] as numwait", + "(([COLUMN 2] * COALESCE([COLUMN 3], INT64(1))) * COALESCE([COLUMN 4], INT64(1))) * COALESCE([COLUMN 5], INT64(1)) as numwait", "[COLUMN 1]" ], "Inputs": [ From 1a950cd86f262702518c94492abb2681942d6196 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 10:42:33 +0200 Subject: [PATCH 18/53] only expand when we have full information (#12002) Signed-off-by: Andres Taylor Co-authored-by: Andres Taylor --- go/vt/vtgate/semantics/derived_table.go | 18 ++++++++----- go/vt/vtgate/semantics/early_rewriter_test.go | 7 +++++ go/vt/vtgate/semantics/vtable.go | 26 ++++++++++++------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/go/vt/vtgate/semantics/derived_table.go b/go/vt/vtgate/semantics/derived_table.go index 4ca57d32d4f..f6bf7da3347 100644 --- a/go/vt/vtgate/semantics/derived_table.go +++ b/go/vt/vtgate/semantics/derived_table.go @@ -25,17 +25,18 @@ import ( // DerivedTable contains the information about the projection, tables involved in derived table. type DerivedTable struct { - tableName string - ASTNode *sqlparser.AliasedTableExpr - columnNames []string - cols []sqlparser.Expr - tables TableSet + tableName string + ASTNode *sqlparser.AliasedTableExpr + columnNames []string + cols []sqlparser.Expr + tables TableSet + isAuthoritative bool } var _ TableInfo = (*DerivedTable)(nil) func createDerivedTableForExpressions(expressions sqlparser.SelectExprs, cols sqlparser.Columns, tables []TableInfo, org originable) *DerivedTable { - vTbl := &DerivedTable{} + vTbl := &DerivedTable{isAuthoritative: true} for i, selectExpr := range expressions { switch expr := selectExpr.(type) { case *sqlparser.AliasedExpr: @@ -56,6 +57,9 @@ func createDerivedTableForExpressions(expressions sqlparser.SelectExprs, cols sq case *sqlparser.StarExpr: for _, table := range tables { vTbl.tables = vTbl.tables.Merge(table.getTableSet(org)) + if !table.authoritative() { + vTbl.isAuthoritative = false + } } } } @@ -91,7 +95,7 @@ func (dt *DerivedTable) matches(name sqlparser.TableName) bool { } func (dt *DerivedTable) authoritative() bool { - return true + return dt.isAuthoritative } // Name implements the TableInfo interface diff --git a/go/vt/vtgate/semantics/early_rewriter_test.go b/go/vt/vtgate/semantics/early_rewriter_test.go index ff6411b19e7..79f3eb7061c 100644 --- a/go/vt/vtgate/semantics/early_rewriter_test.go +++ b/go/vt/vtgate/semantics/early_rewriter_test.go @@ -152,6 +152,13 @@ func TestExpandStar(t *testing.T) { }, { sql: "select * from (select 12) as t", expSQL: "select t.`12` from (select 12 from dual) as t", + }, { + sql: "SELECT * FROM (SELECT *, 12 AS foo FROM t3) as results", + expSQL: "select * from (select *, 12 as foo from t3) as results", + }, { + // if we are only star-expanding authoritative tables, we don't need to stop the expansion + sql: "SELECT * FROM (SELECT t2.*, 12 AS foo FROM t3, t2) as results", + expSQL: "select results.c1, results.c2, results.foo from (select t2.c1 as c1, t2.c2 as c2, 12 as foo from t3, t2) as results", }} for _, tcase := range tcases { t.Run(tcase.sql, func(t *testing.T) { diff --git a/go/vt/vtgate/semantics/vtable.go b/go/vt/vtgate/semantics/vtable.go index f9a3bc44a2a..f08e529c710 100644 --- a/go/vt/vtgate/semantics/vtable.go +++ b/go/vt/vtgate/semantics/vtable.go @@ -26,10 +26,11 @@ import ( // vTableInfo is used to represent projected results, not real tables. It is used for // ORDER BY, GROUP BY and HAVING that need to access result columns type vTableInfo struct { - tableName string - columnNames []string - cols []sqlparser.Expr - tables TableSet + tableName string + columnNames []string + cols []sqlparser.Expr + tables TableSet + isAuthoritative bool } var _ TableInfo = (*vTableInfo)(nil) @@ -62,7 +63,7 @@ func (v *vTableInfo) matches(name sqlparser.TableName) bool { } func (v *vTableInfo) authoritative() bool { - return true + return v.isAuthoritative } func (v *vTableInfo) Name() (sqlparser.TableName, error) { @@ -108,11 +109,12 @@ func (v *vTableInfo) getExprFor(s string) (sqlparser.Expr, error) { } func createVTableInfoForExpressions(expressions sqlparser.SelectExprs, tables []TableInfo, org originable) *vTableInfo { - cols, colNames, ts := selectExprsToInfos(expressions, tables, org) + cols, colNames, ts, isAuthoritative := selectExprsToInfos(expressions, tables, org) return &vTableInfo{ - columnNames: colNames, - cols: cols, - tables: ts, + columnNames: colNames, + cols: cols, + tables: ts, + isAuthoritative: isAuthoritative, } } @@ -120,7 +122,8 @@ func selectExprsToInfos( expressions sqlparser.SelectExprs, tables []TableInfo, org originable, -) (cols []sqlparser.Expr, colNames []string, ts TableSet) { +) (cols []sqlparser.Expr, colNames []string, ts TableSet, isAuthoritative bool) { + isAuthoritative = true for _, selectExpr := range expressions { switch expr := selectExpr.(type) { case *sqlparser.AliasedExpr: @@ -139,6 +142,9 @@ func selectExprsToInfos( case *sqlparser.StarExpr: for _, table := range tables { ts = ts.Merge(table.getTableSet(org)) + if !table.authoritative() { + isAuthoritative = false + } } } } From c35032feee3747b9c6cae60118b075fc1e4555e4 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Fri, 17 Feb 2023 10:43:31 +0200 Subject: [PATCH 19/53] Bug fix: Cache filtered out tablets in topology watcher to avoid unnecessary GetTablet calls to topo (#12194) (#12244) * check filter later in loadTablets. Add tests to confirm expected behavior * remove unnecessary assignment * add some explanation around TestFilterByKeypsaceSkipsIgnoredTablets * simplify filter check logic as well as major test cleanup, using testify where possible --------- Signed-off-by: Brian Ramos Co-authored-by: Brian Ramos --- go/vt/discovery/topology_watcher.go | 11 +- go/vt/discovery/topology_watcher_test.go | 126 +++++++++++++++++++++-- 2 files changed, 125 insertions(+), 12 deletions(-) diff --git a/go/vt/discovery/topology_watcher.go b/go/vt/discovery/topology_watcher.go index a2a70a1f2d0..5e5c54ab57a 100644 --- a/go/vt/discovery/topology_watcher.go +++ b/go/vt/discovery/topology_watcher.go @@ -199,9 +199,6 @@ func (tw *TopologyWatcher) loadTablets() { log.Errorf("cannot get tablet for alias %v: %v", alias, err) return } - if !(tw.tabletFilter == nil || tw.tabletFilter.IsIncluded(tablet.Tablet)) { - return - } tw.mu.Lock() aliasStr := topoproto.TabletAliasString(alias) newTablets[aliasStr] = &tabletInfo{ @@ -217,6 +214,10 @@ func (tw *TopologyWatcher) loadTablets() { tw.mu.Lock() for alias, newVal := range newTablets { + if tw.tabletFilter != nil && !tw.tabletFilter.IsIncluded(newVal.tablet) { + continue + } + // trust the alias from topo and add it if it doesn't exist if val, ok := tw.tablets[alias]; ok { // check if the host and port have changed. If yes, replace tablet. @@ -236,6 +237,10 @@ func (tw *TopologyWatcher) loadTablets() { } for _, val := range tw.tablets { + if tw.tabletFilter != nil && !tw.tabletFilter.IsIncluded(val.tablet) { + continue + } + if _, ok := newTablets[val.alias]; !ok { tw.healthcheck.RemoveTablet(val.tablet) topologyWatcherOperations.Add(topologyWatcherOpRemoveTablet, 1) diff --git a/go/vt/discovery/topology_watcher_test.go b/go/vt/discovery/topology_watcher_test.go index 9d0876cf424..dff8ba720c7 100644 --- a/go/vt/discovery/topology_watcher_test.go +++ b/go/vt/discovery/topology_watcher_test.go @@ -17,12 +17,13 @@ limitations under the License. package discovery import ( + "context" "math/rand" "testing" "time" - "context" - + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" "vitess.io/vitess/go/vt/logutil" @@ -44,19 +45,14 @@ func checkOpCounts(t *testing.T, prevCounts, deltas map[string]int64) map[string newVal = 0 } - if newVal != prevVal+delta { - t.Errorf("expected %v to increase by %v, got %v -> %v", key, delta, prevVal, newVal) - } + assert.Equal(t, newVal, prevVal+delta, "expected %v to increase by %v, got %v -> %v", key, delta, prevVal, newVal) } return newCounts } func checkChecksum(t *testing.T, tw *TopologyWatcher, want uint32) { t.Helper() - got := tw.TopoChecksum() - if want != got { - t.Errorf("want checksum %v got %v", want, got) - } + assert.Equal(t, want, tw.TopoChecksum()) } func TestStartAndCloseTopoWatcher(t *testing.T) { @@ -506,3 +502,115 @@ func TestFilterByKeyspace(t *testing.T) { } } } + +// TestFilterByKeypsaceSkipsIgnoredTablets confirms a bug fix for the case when a TopologyWatcher +// has a FilterByKeyspace TabletFilter configured along with refreshKnownTablets turned off. We want +// to ensure that the TopologyWatcher: +// - does not continuosly call GetTablets for tablets that do not satisfy the filter +// - does not add or remove these filtered out tablets from the its healtcheck +func TestFilterByKeypsaceSkipsIgnoredTablets(t *testing.T) { + ts := memorytopo.NewServer("aa") + fhc := NewFakeHealthCheck(nil) + topologyWatcherOperations.ZeroAll() + counts := topologyWatcherOperations.Counts() + f := NewFilterByKeyspace(testKeyspacesToWatch) + tw := NewCellTabletsWatcher(context.Background(), ts, fhc, f, "aa", 10*time.Minute, false /*refreshKnownTablets*/, 5) + + counts = checkOpCounts(t, counts, map[string]int64{}) + checkChecksum(t, tw, 0) + + // Add a tablet from a tracked keyspace to the topology. + tablet := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "aa", + Uid: 0, + }, + Hostname: "host1", + PortMap: map[string]int32{ + "vt": 123, + }, + Keyspace: "ks1", + Shard: "shard", + } + require.NoError(t, ts.CreateTablet(context.Background(), tablet)) + + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "GetTablet": 1, "AddTablet": 1}) + checkChecksum(t, tw, 3238442862) + + // Check tablet is reported by HealthCheck + allTablets := fhc.GetAllTablets() + key := TabletToMapKey(tablet) + assert.Contains(t, allTablets, key) + assert.True(t, proto.Equal(tablet, allTablets[key])) + + // Add a second tablet to the topology that should get filtered out by the keyspace filter + tablet2 := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "aa", + Uid: 2, + }, + Hostname: "host2", + PortMap: map[string]int32{ + "vt": 789, + }, + Keyspace: "ks3", + Shard: "shard", + } + require.NoError(t, ts.CreateTablet(context.Background(), tablet2)) + + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "GetTablet": 1}) + checkChecksum(t, tw, 2762153755) + + // Check the new tablet is NOT reported by HealthCheck. + allTablets = fhc.GetAllTablets() + assert.Len(t, allTablets, 1) + key = TabletToMapKey(tablet2) + assert.NotContains(t, allTablets, key) + + // Load the tablets again to show that when refreshKnownTablets is disabled, + // only the list is read from the topo and the checksum doesn't change + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1}) + checkChecksum(t, tw, 2762153755) + + // With refreshKnownTablets set to false, changes to the port map for the same tablet alias + // should not be reflected in the HealtCheck state + _, err := ts.UpdateTabletFields(context.Background(), tablet.Alias, func(t *topodatapb.Tablet) error { + t.PortMap["vt"] = 456 + return nil + }) + require.NoError(t, err) + + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1}) + checkChecksum(t, tw, 2762153755) + + allTablets = fhc.GetAllTablets() + assert.Len(t, allTablets, 1) + origKey := TabletToMapKey(tablet) + tabletWithNewPort := proto.Clone(tablet).(*topodatapb.Tablet) + tabletWithNewPort.PortMap["vt"] = 456 + keyWithNewPort := TabletToMapKey(tabletWithNewPort) + assert.Contains(t, allTablets, origKey) + assert.NotContains(t, allTablets, keyWithNewPort) + + // Remove the tracked tablet from the topo and check that it is detected as being gone. + require.NoError(t, ts.DeleteTablet(context.Background(), tablet.Alias)) + + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "RemoveTablet": 1}) + checkChecksum(t, tw, 789108290) + assert.Empty(t, fhc.GetAllTablets()) + + // Remove ignored tablet and check that we didn't try to remove it from the health check + require.NoError(t, ts.DeleteTablet(context.Background(), tablet2.Alias)) + + tw.loadTablets() + checkOpCounts(t, counts, map[string]int64{"ListTablets": 1}) + checkChecksum(t, tw, 0) + assert.Empty(t, fhc.GetAllTablets()) + + tw.Stop() +} From 911f2461493b2db652ad410b579f6f12e8fec2a6 Mon Sep 17 00:00:00 2001 From: Rameez Sajwani Date: Fri, 24 Feb 2023 09:16:57 -0800 Subject: [PATCH 20/53] Fix vtbackup upgrade/downgrade test (#12437) * adding check for v16 for upgrade/downgrade backup tests Signed-off-by: Rameez Sajwani * removing TestReparentDoesntHangIfPrimaryFails Signed-off-by: Rameez Sajwani * Removing keep-data from upgrade/downgrade workflow Signed-off-by: Rameez Sajwani * setting -keep-data=false in workflows Signed-off-by: Rameez Sajwani --------- Signed-off-by: Rameez Sajwani --- .../upgrade_downgrade_test_backups_e2e.yml | 2 +- ...owngrade_test_backups_e2e_next_release.yml | 2 +- ...e_downgrade_test_query_serving_queries.yml | 6 ++--- ...est_query_serving_queries_next_release.yml | 6 ++--- ...de_downgrade_test_query_serving_schema.yml | 6 ++--- ...test_query_serving_schema_next_release.yml | 6 ++--- ...rade_downgrade_test_reparent_new_vtctl.yml | 2 +- ...e_downgrade_test_reparent_new_vttablet.yml | 2 +- ...rade_downgrade_test_reparent_old_vtctl.yml | 2 +- ...e_downgrade_test_reparent_old_vttablet.yml | 2 +- .../backup/vtbackup/backup_only_test.go | 27 +++++++++++-------- go/test/endtoend/backup/vtbackup/main_test.go | 10 +++++++ go/test/endtoend/cluster/cluster_process.go | 16 +++++++++++ go/test/endtoend/cluster/vttablet_process.go | 18 +++++++++---- .../reparent/plannedreparent/reparent_test.go | 6 ++++- 15 files changed, 78 insertions(+), 35 deletions(-) diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 1092700c58a..52774b32204 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -188,4 +188,4 @@ jobs: mkdir -p /tmp/vtdataroot set -x source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_backups + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_backups diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 9a82e337355..66289bccaa0 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -191,4 +191,4 @@ jobs: mkdir -p /tmp/vtdataroot set -x source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_backups + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_backups diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index e0ef5d67e70..c889d1d39da 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -174,7 +174,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries # Swap the binaries in the bin. Use vtgate version n-1 and keep vttablet at version n - name: Use last release's VTGate @@ -194,7 +194,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n-1 - name: Use current version VTGate, and other version VTTablet @@ -216,4 +216,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index 0d615c6f2a2..6b27b4fd854 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -177,7 +177,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries # Swap the binaries in the bin. Use vtgate version n+1 and keep vttablet at version n - name: Use next release's VTGate @@ -197,7 +197,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n+1 - name: Use current version VTGate, and other version VTTablet @@ -219,4 +219,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 26f194787f8..65e39baadcc 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -174,7 +174,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema # Swap the binaries in the bin. Use vtgate version n-1 and keep vttablet at version n - name: Use last release's VTGate @@ -194,7 +194,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n-1 - name: Use current version VTGate, and other version VTTablet @@ -216,4 +216,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index e404df0f998..c9cfe635bc3 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -177,7 +177,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema # Swap the binaries in the bin. Use vtgate version n+1 and keep vttablet at version n - name: Use next release's VTGate @@ -197,7 +197,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n+1 - name: Use current version VTGate, and other version VTTablet @@ -219,4 +219,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index 23828451b01..c049cbffd0f 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -191,4 +191,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_reparent + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_reparent diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index ec848449286..f8a62b162d8 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -188,4 +188,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_reparent + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_reparent diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index ecd0550dc22..7b69aef3265 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -188,4 +188,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_reparent + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_reparent diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 5af4c4a7fb3..6f5aa09f747 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -185,4 +185,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_reparent + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_reparent diff --git a/go/test/endtoend/backup/vtbackup/backup_only_test.go b/go/test/endtoend/backup/vtbackup/backup_only_test.go index f67b5fadeed..b9f780c770d 100644 --- a/go/test/endtoend/backup/vtbackup/backup_only_test.go +++ b/go/test/endtoend/backup/vtbackup/backup_only_test.go @@ -66,6 +66,9 @@ func TestTabletInitialBackup(t *testing.T) { // Restore the Tablets restore(t, primary, "replica", "NOT_SERVING") err := localCluster.VtctlclientProcess.ExecuteCommand( + "SetReadWrite", primary.Alias) + require.Nil(t, err) + err = localCluster.VtctlclientProcess.ExecuteCommand( "TabletExternallyReparented", primary.Alias) require.Nil(t, err) restore(t, replica1, "replica", "SERVING") @@ -152,17 +155,19 @@ func firstBackupTest(t *testing.T, tabletType string) { cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) // check that the restored replica has the right local_metadata - result, err := replica2.VttabletProcess.QueryTabletWithDB("select * from local_metadata", "_vt") - require.Nil(t, err) - require.NotNil(t, result) - require.NotEmpty(t, result.Rows) - assert.Equal(t, replica2.Alias, result.Rows[0][1].ToString(), "Alias") - assert.Equal(t, "ks.0", result.Rows[1][1].ToString(), "ClusterAlias") - assert.Equal(t, cell, result.Rows[2][1].ToString(), "DataCenter") - if tabletType == "replica" { - assert.Equal(t, "neutral", result.Rows[3][1].ToString(), "PromotionRule") - } else { - assert.Equal(t, "must_not", result.Rows[3][1].ToString(), "PromotionRule") + if localCluster.VtTabletMajorVersion <= 15 { + result, err := replica2.VttabletProcess.QueryTabletWithDB("select * from local_metadata", "_vt") + require.Nil(t, err) + require.NotNil(t, result) + require.NotEmpty(t, result.Rows) + assert.Equal(t, replica2.Alias, result.Rows[0][1].ToString(), "Alias") + assert.Equal(t, "ks.0", result.Rows[1][1].ToString(), "ClusterAlias") + assert.Equal(t, cell, result.Rows[2][1].ToString(), "DataCenter") + if tabletType == "replica" { + assert.Equal(t, "neutral", result.Rows[3][1].ToString(), "PromotionRule") + } else { + assert.Equal(t, "must_not", result.Rows[3][1].ToString(), "PromotionRule") + } } removeBackups(t) diff --git a/go/test/endtoend/backup/vtbackup/main_test.go b/go/test/endtoend/backup/vtbackup/main_test.go index ce0720e77c4..0ac5cb521bf 100644 --- a/go/test/endtoend/backup/vtbackup/main_test.go +++ b/go/test/endtoend/backup/vtbackup/main_test.go @@ -135,6 +135,16 @@ func TestMain(m *testing.M) { } } + if localCluster.VtTabletMajorVersion >= 16 { + // If vttablets are any lower than version 16, then they are running the replication manager. + // Running VTOrc and replication manager sometimes creates the situation where VTOrc has set up semi-sync on the primary, + // but the replication manager starts replication on the replica without setting semi-sync. This hangs the primary. + // Even if VTOrc fixes it, since there is no ongoing traffic, the state remains blocked. + if err := localCluster.StartVTOrc(keyspaceName); err != nil { + return 1, err + } + } + return m.Run(), nil }() diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index cb6fbb4fd40..8d922a3c179 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -251,6 +251,22 @@ func (cluster *LocalProcessCluster) StartTopo() (err error) { return } +// StartVTOrc starts a VTOrc instance +func (cluster *LocalProcessCluster) StartVTOrc(keyspace string) error { + // Start vtorc + vtorcProcess := cluster.NewVTOrcProcess(VTOrcConfiguration{}) + err := vtorcProcess.Setup() + if err != nil { + log.Error(err.Error()) + return err + } + if keyspace != "" { + vtorcProcess.ExtraArgs = append(vtorcProcess.ExtraArgs, fmt.Sprintf(`--clusters_to_watch="%s"`, keyspace)) + } + cluster.VTOrcProcesses = append(cluster.VTOrcProcesses, vtorcProcess) + return nil +} + // StartUnshardedKeyspace starts unshared keyspace with shard name as "0" func (cluster *LocalProcessCluster) StartUnshardedKeyspace(keyspace Keyspace, replicaCount int, rdonly bool) error { return cluster.StartKeyspace(keyspace, []string{"0"}, replicaCount, rdonly) diff --git a/go/test/endtoend/cluster/vttablet_process.go b/go/test/endtoend/cluster/vttablet_process.go index 3779a762ac4..60ca23a059e 100644 --- a/go/test/endtoend/cluster/vttablet_process.go +++ b/go/test/endtoend/cluster/vttablet_process.go @@ -117,17 +117,25 @@ func (vttablet *VttabletProcess) Setup() (err error) { if vttablet.SupportsBackup { vttablet.proc.Args = append(vttablet.proc.Args, "--restore_from_backup") } + var majorVersion int + majorVersion, err = GetMajorVersion("vttablet") + if err != nil { + return err + } + if vttablet.EnableSemiSync { - var majorVersion int - majorVersion, err = GetMajorVersion("vttablet") - if err != nil { - return err - } // enable_semi_sync is removed in v16 and shouldn't be set on any release v16+ if majorVersion <= 15 { vttablet.proc.Args = append(vttablet.proc.Args, "--enable_semi_sync") } } + + // enable_semi_sync is removed in v16 and shouldn't be set on any release v16+ + if majorVersion >= 16 { + disableReplicationFlag := "--disable-replication-manager" + vttablet.proc.Args = append(vttablet.proc.Args, disableReplicationFlag) + } + if vttablet.DbFlavor != "" { vttablet.proc.Args = append(vttablet.proc.Args, fmt.Sprintf("--db_flavor=%s", vttablet.DbFlavor)) } diff --git a/go/test/endtoend/reparent/plannedreparent/reparent_test.go b/go/test/endtoend/reparent/plannedreparent/reparent_test.go index 66db2908380..255c41faf78 100644 --- a/go/test/endtoend/reparent/plannedreparent/reparent_test.go +++ b/go/test/endtoend/reparent/plannedreparent/reparent_test.go @@ -362,6 +362,11 @@ func TestReparentDoesntHangIfPrimaryFails(t *testing.T) { defer cluster.PanicHandler(t) clusterInstance := utils.SetupReparentCluster(t, "semi_sync") defer utils.TeardownCluster(clusterInstance) + + // This test is no longer valid post v16 + if clusterInstance.VtTabletMajorVersion >= 16 { + t.Skip("Skipping TestReparentDoesntHangIfPrimaryFails in CI environment for v16") + } tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets // Change the schema of the _vt.reparent_journal table, so that @@ -369,7 +374,6 @@ func TestReparentDoesntHangIfPrimaryFails(t *testing.T) { _, err := tablets[0].VttabletProcess.QueryTabletWithDB( "ALTER TABLE reparent_journal DROP COLUMN replication_position", "_vt") require.NoError(t, err) - // Perform a planned reparent operation, the primary will fail the // insert. The replicas should then abort right away. out, err := utils.Prs(t, clusterInstance, tablets[1]) From 7a594612dc81b6abccf48071b2e2c2524811c047 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Mon, 27 Feb 2023 12:23:02 +0530 Subject: [PATCH 21/53] Fix scalar aggregation engine primitive for column truncation (#12468) (#12472) * fix: scalar aggregation truncation * test: added scalar aggr engine unit test * remove onecase change --------- Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- .../queries/aggregation/aggregation_test.go | 27 +++++++++++++ go/vt/vtgate/engine/scalar_aggregation.go | 2 +- .../vtgate/engine/scalar_aggregation_test.go | 39 +++++++++++++++++-- go/vt/vtgate/executor_select_test.go | 6 +-- 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index 3f39addbf94..8402914ceb4 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -400,3 +400,30 @@ func TestAggregateLeftJoin(t *testing.T) { mcmp.AssertMatches("SELECT count(*) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[INT64(2)]]`) mcmp.AssertMatches("SELECT sum(t1.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(1)]]`) } + +// TestScalarAggregate tests validates that only count is returned and no additional field is returned.gst +func TestScalarAggregate(t *testing.T) { + // disable schema tracking to have weight_string column added to query send down to mysql. + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, "--schema_change_signal=false") + require.NoError(t, + clusterInstance.RestartVtgate()) + + // update vtgate params + vtParams = clusterInstance.GetVTParams(keyspaceName) + + defer func() { + // roll it back + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, "--schema_change_signal") + require.NoError(t, + clusterInstance.RestartVtgate()) + // update vtgate params + vtParams = clusterInstance.GetVTParams(keyspaceName) + + }() + + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into aggr_test(id, val1, val2) values(1,'a',1), (2,'A',1), (3,'b',1), (4,'c',3), (5,'c',4)") + mcmp.AssertMatches("select /*vt+ PLANNER=gen4 */ count(distinct val1) from aggr_test", `[[INT64(3)]]`) +} diff --git a/go/vt/vtgate/engine/scalar_aggregation.go b/go/vt/vtgate/engine/scalar_aggregation.go index 99fd21d8ea1..a1a76091689 100644 --- a/go/vt/vtgate/engine/scalar_aggregation.go +++ b/go/vt/vtgate/engine/scalar_aggregation.go @@ -122,7 +122,7 @@ func (sa *ScalarAggregate) TryExecute(ctx context.Context, vcursor VCursor, bind } out.Rows = [][]sqltypes.Value{resultRow} - return out, nil + return out.Truncate(sa.TruncateColumnCount), nil } // TryStreamExecute implements the Primitive interface diff --git a/go/vt/vtgate/engine/scalar_aggregation_test.go b/go/vt/vtgate/engine/scalar_aggregation_test.go index 11e5b20a72b..15e72639f3d 100644 --- a/go/vt/vtgate/engine/scalar_aggregation_test.go +++ b/go/vt/vtgate/engine/scalar_aggregation_test.go @@ -106,16 +106,16 @@ func TestEmptyRows(outer *testing.T) { func TestScalarAggregateStreamExecute(t *testing.T) { assert := assert.New(t) fields := sqltypes.MakeTestFields( - "count(*)", - "uint64", + "col|weight_string(col)", + "uint64|varbinary", ) fp := &fakePrimitive{ allResultsInOneCall: true, results: []*sqltypes.Result{ sqltypes.MakeTestResult(fields, - "1", + "1|null", ), sqltypes.MakeTestResult(fields, - "3", + "3|null", )}, } @@ -141,3 +141,34 @@ func TestScalarAggregateStreamExecute(t *testing.T) { got := fmt.Sprintf("%v", results[1].Rows) assert.Equal("[[UINT64(4)]]", got) } + +// TestScalarAggregateExecuteTruncate checks if truncate works +func TestScalarAggregateExecuteTruncate(t *testing.T) { + assert := assert.New(t) + fields := sqltypes.MakeTestFields( + "col|weight_string(col)", + "uint64|varbinary", + ) + + fp := &fakePrimitive{ + allResultsInOneCall: true, + results: []*sqltypes.Result{ + sqltypes.MakeTestResult(fields, + "1|null", "3|null", + )}, + } + + oa := &ScalarAggregate{ + Aggregates: []*AggregateParams{{ + Opcode: AggregateSum, + Col: 0, + }}, + Input: fp, + TruncateColumnCount: 1, + PreProcess: true, + } + + qr, err := oa.TryExecute(context.Background(), &noopVCursor{}, nil, true) + assert.NoError(err) + assert.Equal("[[UINT64(4)]]", fmt.Sprintf("%v", qr.Rows)) +} diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index eac23981d01..c95810cc209 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -3614,7 +3614,7 @@ func TestSelectAggregationData(t *testing.T) { }{ { sql: `select count(distinct col) from user`, - sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col", "int64"), "1", "2", "2", "3"), + sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|weight_string(col)", "int64|varbinary"), "1|NULL", "2|NULL", "2|NULL", "3|NULL"), expSandboxQ: "select col, weight_string(col) from `user` group by col, weight_string(col) order by col asc", expField: `[name:"count(distinct col)" type:INT64]`, expRow: `[[INT64(3)]]`, @@ -3628,14 +3628,14 @@ func TestSelectAggregationData(t *testing.T) { }, { sql: `select col, count(*) from user group by col`, - sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|count(*)", "int64|int64"), "1|3"), + sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|count(*)|weight_string(col)", "int64|int64|varbinary"), "1|3|NULL"), expSandboxQ: "select col, count(*), weight_string(col) from `user` group by col, weight_string(col) order by col asc", expField: `[name:"col" type:INT64 name:"count(*)" type:INT64]`, expRow: `[[INT64(1) INT64(24)]]`, }, { sql: `select col, count(*) from user group by col limit 2`, - sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|count(*)", "int64|int64"), "1|2", "2|1", "3|4"), + sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|count(*)|weight_string(col)", "int64|int64|varbinary"), "1|2|NULL", "2|1|NULL", "3|4|NULL"), expSandboxQ: "select col, count(*), weight_string(col) from `user` group by col, weight_string(col) order by col asc limit :__upper_limit", expField: `[name:"col" type:INT64 name:"count(*)" type:INT64]`, expRow: `[[INT64(1) INT64(16)] [INT64(2) INT64(8)]]`, From b55eae3b9323a40c0065acd00349369689dfc31e Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Mon, 27 Feb 2023 10:49:31 +0200 Subject: [PATCH 22/53] Skip TestReparentDoesntHangIfPrimaryFails in vttablet v16 and above (#12387) Signed-off-by: Florent Poinsard --- .../reparent/plannedreparent/reparent_test.go | 20 +++++++++++-------- go/test/endtoend/utils/utils.go | 11 ++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/go/test/endtoend/reparent/plannedreparent/reparent_test.go b/go/test/endtoend/reparent/plannedreparent/reparent_test.go index 255c41faf78..d33992d5a81 100644 --- a/go/test/endtoend/reparent/plannedreparent/reparent_test.go +++ b/go/test/endtoend/reparent/plannedreparent/reparent_test.go @@ -25,6 +25,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + utilstest "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/reparent/utils" "vitess.io/vitess/go/vt/log" @@ -183,13 +185,13 @@ func TestReparentFromOutsideWithNoPrimary(t *testing.T) { } func reparentFromOutside(t *testing.T, clusterInstance *cluster.LocalProcessCluster, downPrimary bool) { - //This test will start a primary and 3 replicas. - //Then: - //- one replica will be the new primary - //- one replica will be reparented to that new primary - //- one replica will be busted and dead in the water and we'll call TabletExternallyReparented. - //Args: - //downPrimary: kills the old primary first + // This test will start a primary and 3 replicas. + // Then: + // - one replica will be the new primary + // - one replica will be reparented to that new primary + // - one replica will be busted and dead in the water and we'll call TabletExternallyReparented. + // Args: + // downPrimary: kills the old primary first ctx := context.Background() tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -202,7 +204,7 @@ func reparentFromOutside(t *testing.T, clusterInstance *cluster.LocalProcessClus demoteCommands := "SET GLOBAL read_only = ON; FLUSH TABLES WITH READ LOCK; UNLOCK TABLES" utils.RunSQL(ctx, t, demoteCommands, tablets[0]) - //Get the position of the old primary and wait for the new one to catch up. + // Get the position of the old primary and wait for the new one to catch up. err := utils.WaitForReplicationPosition(t, tablets[0], tablets[1]) require.NoError(t, err) } @@ -359,6 +361,8 @@ func TestChangeTypeSemiSync(t *testing.T) { } func TestReparentDoesntHangIfPrimaryFails(t *testing.T) { + utilstest.SkipIfBinaryIsAboveVersion(t, 15, "vttablet") + defer cluster.PanicHandler(t) clusterInstance := utils.SetupReparentCluster(t, "semi_sync") defer utils.TeardownCluster(clusterInstance) diff --git a/go/test/endtoend/utils/utils.go b/go/test/endtoend/utils/utils.go index bd80385342f..ae9514b26a7 100644 --- a/go/test/endtoend/utils/utils.go +++ b/go/test/endtoend/utils/utils.go @@ -154,6 +154,17 @@ func SkipIfBinaryIsBelowVersion(t *testing.T, majorVersion int, binary string) { } } +// SkipIfBinaryIsAboveVersion skips the given test if the binary's major version is above majorVersion. +func SkipIfBinaryIsAboveVersion(t *testing.T, majorVersion int, binary string) { + version, err := cluster.GetMajorVersion(binary) + if err != nil { + return + } + if version > majorVersion { + t.Skip("Current version of ", binary, ": v", version, ", expected version >= v", majorVersion) + } +} + // AssertMatchesWithTimeout asserts that the given query produces the expected result. // The query will be executed every 'r' duration until it matches the expected result. // If after 'd' duration we still did not find the expected result, the test will be marked as failed. From 9f173734bb3442f743b14d1b9ffb68ee81c38895 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Mon, 27 Feb 2023 21:21:42 +0530 Subject: [PATCH 23/53] [release-15.0] BugFix: Unsharded query using a derived table and a dual table (#12484) (#12492) * BugFix: Unsharded query using a derived table and a dual table (#12484) * test: add failing test for a query in an unsharded keyspace using a derived table and reference table Signed-off-by: Manan Gupta * feat: fix logic to check if a single unsharded keyspace is used Signed-off-by: Manan Gupta * feat: fix test output Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta * feat: remove test files Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta --- .../planbuilder/testdata/select_cases.json | 38 +++++++++++++++++++ go/vt/vtgate/semantics/semantic_state.go | 9 ++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 5157e1acc9c..664e945c606 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -7870,5 +7870,43 @@ "main.dual" ] } + }, + { + "comment": "query with a derived table and dual table in unsharded keyspace", + "query": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a where 1 != 1)) as `name` from dual where 1 != 1) as t2 where 1 != 1", + "Query": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a)) as `name` from dual) as t2 where t1.`name` >= t2.`name` order by t1.`name` asc limit 1", + "Table": "unsharded_a, dual" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a where 1 != 1)) as `name` from dual where 1 != 1) as t2 where 1 != 1", + "Query": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a)) as `name` from dual) as t2 where t1.`name` >= t2.`name` order by t1.`name` asc limit 1", + "Table": "dual, unsharded_a" + }, + "TablesUsed": [ + "main.dual", + "main.unsharded_a" + ] + } } ] \ No newline at end of file diff --git a/go/vt/vtgate/semantics/semantic_state.go b/go/vt/vtgate/semantics/semantic_state.go index 7a981f542bd..f685bec5316 100644 --- a/go/vt/vtgate/semantics/semantic_state.go +++ b/go/vt/vtgate/semantics/semantic_state.go @@ -372,7 +372,7 @@ func (st *SemTable) SingleUnshardedKeyspace() (*vindexes.Keyspace, []*vindexes.T for _, table := range st.Tables { vindexTable := table.GetVindexTable() - if vindexTable == nil || vindexTable.Type != "" { + if vindexTable == nil { _, isDT := table.getExpr().Expr.(*sqlparser.DerivedTable) if isDT { // derived tables are ok, as long as all real tables are from the same unsharded keyspace @@ -381,6 +381,13 @@ func (st *SemTable) SingleUnshardedKeyspace() (*vindexes.Keyspace, []*vindexes.T } return nil, nil } + if vindexTable.Type != "" { + // A reference table is not an issue when seeing if a query is going to an unsharded keyspace + if vindexTable.Type == vindexes.TypeReference { + continue + } + return nil, nil + } name, ok := table.getExpr().Expr.(sqlparser.TableName) if !ok { return nil, nil From f183ac72ca75ebd1bbfa2161b45ba8789c1c534c Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 28 Feb 2023 16:00:27 +0200 Subject: [PATCH 24/53] Upgrade golang.org deps (#12405) Signed-off-by: Florent Poinsard --- go.mod | 8 ++++---- go.sum | 15 ++++++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 2e5e8a64258..799edc6be66 100644 --- a/go.mod +++ b/go.mod @@ -88,11 +88,11 @@ require ( golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b + golang.org/x/net v0.7.0 golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f - golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 - golang.org/x/text v0.3.8 + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 + golang.org/x/text v0.7.0 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.12 google.golang.org/api v0.45.0 diff --git a/go.sum b/go.sum index bcc129d097c..ae1bf014370 100644 --- a/go.sum +++ b/go.sum @@ -883,8 +883,8 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -983,11 +983,12 @@ golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -997,8 +998,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 7bd77855e4889e23095f6344df48cb273df4573b Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 28 Feb 2023 20:18:58 +0200 Subject: [PATCH 25/53] Use go1.20.1 in upgrade/downgrade tests (#12512) Signed-off-by: Florent Poinsard --- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- ...pgrade_downgrade_test_query_serving_queries_next_release.yml | 2 +- ...upgrade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 66289bccaa0..50122f65137 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -79,7 +79,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v2 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml index b8675c202ad..a7b358f30dd 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -81,7 +81,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v2 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index 6b27b4fd854..69d000b3b1a 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -81,7 +81,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v2 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index c9cfe635bc3..e29c983ab54 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -81,7 +81,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v2 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index c049cbffd0f..26ce805e2f2 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -81,7 +81,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v2 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index f8a62b162d8..cdf7efe6951 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -81,7 +81,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v2 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' From 6fe32599ca0b3374e14755e84ed5ac366fa6d87b Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:10:59 +0200 Subject: [PATCH 26/53] handle readtablet error (#12511) Signed-off-by: Florent Poinsard --- go/vt/vtorc/logic/topology_recovery.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/go/vt/vtorc/logic/topology_recovery.go b/go/vt/vtorc/logic/topology_recovery.go index af12587177c..001d702cfde 100644 --- a/go/vt/vtorc/logic/topology_recovery.go +++ b/go/vt/vtorc/logic/topology_recovery.go @@ -258,6 +258,9 @@ func recoverDeadPrimary(ctx context.Context, analysisEntry inst.ReplicationAnaly // Read the tablet information from the database to find the shard and keyspace of the tablet tablet, err := inst.ReadTablet(analysisEntry.AnalyzedInstanceKey) + if err != nil { + return false, nil, err + } var candidateTabletAlias *topodatapb.TabletAlias if candidateInstanceKey != nil { From 5701a05455e38f4a685f4a05a7a44e90f4810b66 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:12:10 +0200 Subject: [PATCH 27/53] Make upgrade downgrade job names unique (#12498) Signed-off-by: Florent Poinsard --- .../check_make_vtadmin_authz_testgen.yml | 4 ++-- .../workflows/check_make_vtadmin_web_proto.yml | 4 ++-- .github/workflows/cluster_endtoend_12.yml | 6 +++--- .github/workflows/cluster_endtoend_13.yml | 6 +++--- .github/workflows/cluster_endtoend_15.yml | 6 +++--- .github/workflows/cluster_endtoend_18.yml | 6 +++--- .github/workflows/cluster_endtoend_21.yml | 6 +++--- .github/workflows/cluster_endtoend_22.yml | 6 +++--- ...luster_endtoend_ers_prs_newfeatures_heavy.yml | 6 +++--- .github/workflows/cluster_endtoend_mysql80.yml | 6 +++--- .../cluster_endtoend_mysql_server_vault.yml | 6 +++--- .../cluster_endtoend_onlineddl_declarative.yml | 6 +++--- ...er_endtoend_onlineddl_declarative_mysql57.yml | 6 +++--- .../cluster_endtoend_onlineddl_ghost.yml | 6 +++--- .../cluster_endtoend_onlineddl_ghost_mysql57.yml | 6 +++--- .../cluster_endtoend_onlineddl_revert.yml | 6 +++--- ...cluster_endtoend_onlineddl_revert_mysql57.yml | 6 +++--- .../cluster_endtoend_onlineddl_revertible.yml | 6 +++--- ...ter_endtoend_onlineddl_revertible_mysql57.yml | 6 +++--- .../cluster_endtoend_onlineddl_scheduler.yml | 6 +++--- ...ster_endtoend_onlineddl_scheduler_mysql57.yml | 6 +++--- .../cluster_endtoend_onlineddl_singleton.yml | 6 +++--- ...ster_endtoend_onlineddl_singleton_mysql57.yml | 6 +++--- .../cluster_endtoend_onlineddl_vrepl.yml | 6 +++--- .../cluster_endtoend_onlineddl_vrepl_mysql57.yml | 6 +++--- .../cluster_endtoend_onlineddl_vrepl_stress.yml | 6 +++--- ...r_endtoend_onlineddl_vrepl_stress_mysql57.yml | 6 +++--- ...ter_endtoend_onlineddl_vrepl_stress_suite.yml | 6 +++--- ...oend_onlineddl_vrepl_stress_suite_mysql57.yml | 6 +++--- .../cluster_endtoend_onlineddl_vrepl_suite.yml | 6 +++--- ...er_endtoend_onlineddl_vrepl_suite_mysql57.yml | 6 +++--- .../cluster_endtoend_schemadiff_vrepl.yml | 6 +++--- ...cluster_endtoend_schemadiff_vrepl_mysql57.yml | 6 +++--- .../cluster_endtoend_tabletmanager_consul.yml | 6 +++--- .../cluster_endtoend_tabletmanager_tablegc.yml | 6 +++--- ...er_endtoend_tabletmanager_tablegc_mysql57.yml | 6 +++--- .../cluster_endtoend_tabletmanager_throttler.yml | 6 +++--- ...end_tabletmanager_throttler_custom_config.yml | 6 +++--- .../cluster_endtoend_topo_connection_cache.yml | 6 +++--- ..._endtoend_vreplication_across_db_versions.yml | 6 +++--- .../cluster_endtoend_vreplication_basic.yml | 6 +++--- .../cluster_endtoend_vreplication_cellalias.yml | 6 +++--- ...nd_vreplication_migrate_vdiff2_convert_tz.yml | 6 +++--- .../cluster_endtoend_vreplication_multicell.yml | 6 +++--- .../cluster_endtoend_vreplication_v2.yml | 6 +++--- .../cluster_endtoend_vstream_failover.yml | 6 +++--- ...ster_endtoend_vstream_stoponreshard_false.yml | 6 +++--- ...uster_endtoend_vstream_stoponreshard_true.yml | 6 +++--- ..._endtoend_vstream_with_keyspaces_to_watch.yml | 6 +++--- .../cluster_endtoend_vtbackup_transform.yml | 6 +++--- ...end_vtctlbackup_sharded_clustertest_heavy.yml | 6 +++--- .../cluster_endtoend_vtgate_concurrentdml.yml | 6 +++--- .../workflows/cluster_endtoend_vtgate_gen4.yml | 6 +++--- .../cluster_endtoend_vtgate_general_heavy.yml | 6 +++--- .../cluster_endtoend_vtgate_godriver.yml | 6 +++--- .../cluster_endtoend_vtgate_partial_keyspace.yml | 6 +++--- .../cluster_endtoend_vtgate_queries.yml | 6 +++--- .../cluster_endtoend_vtgate_readafterwrite.yml | 6 +++--- .../cluster_endtoend_vtgate_reservedconn.yml | 6 +++--- .../workflows/cluster_endtoend_vtgate_schema.yml | 6 +++--- .../cluster_endtoend_vtgate_schema_tracker.yml | 6 +++--- ..._endtoend_vtgate_tablet_healthcheck_cache.yml | 6 +++--- .../workflows/cluster_endtoend_vtgate_topo.yml | 6 +++--- .../cluster_endtoend_vtgate_topo_consul.yml | 6 +++--- .../cluster_endtoend_vtgate_topo_etcd.yml | 6 +++--- .../cluster_endtoend_vtgate_transaction.yml | 6 +++--- .../cluster_endtoend_vtgate_unsharded.yml | 6 +++--- .../cluster_endtoend_vtgate_vindex_heavy.yml | 6 +++--- .../cluster_endtoend_vtgate_vschema.yml | 6 +++--- .github/workflows/cluster_endtoend_vtorc.yml | 6 +++--- .../workflows/cluster_endtoend_vtorc_mysql57.yml | 6 +++--- .../cluster_endtoend_vttablet_prscomplex.yml | 6 +++--- .github/workflows/cluster_endtoend_xb_backup.yml | 6 +++--- .../cluster_endtoend_xb_backup_mysql57.yml | 6 +++--- .../workflows/cluster_endtoend_xb_recovery.yml | 6 +++--- .../cluster_endtoend_xb_recovery_mysql57.yml | 6 +++--- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 4 ++-- .github/workflows/docker_test_cluster_10.yml | 4 ++-- .github/workflows/docker_test_cluster_25.yml | 4 ++-- .github/workflows/e2e_race.yml | 4 ++-- .github/workflows/endtoend.yml | 4 ++-- .github/workflows/local_example.yml | 4 ++-- .github/workflows/region_example.yml | 4 ++-- .github/workflows/sonar_analysis.yml | 4 ++-- .github/workflows/static_checks_etc.yml | 4 ++-- .github/workflows/unit_race.yml | 4 ++-- .github/workflows/unit_test_mariadb103.yml | 4 ++-- .github/workflows/unit_test_mysql57.yml | 4 ++-- .github/workflows/unit_test_mysql80.yml | 4 ++-- .../upgrade_downgrade_test_backups_e2e.yml | 16 ++++++++-------- ...e_downgrade_test_backups_e2e_next_release.yml | 16 ++++++++-------- .../upgrade_downgrade_test_backups_manual.yml | 16 ++++++++-------- ...owngrade_test_backups_manual_next_release.yml | 16 ++++++++-------- ...rade_downgrade_test_query_serving_queries.yml | 16 ++++++++-------- ...e_test_query_serving_queries_next_release.yml | 16 ++++++++-------- ...grade_downgrade_test_query_serving_schema.yml | 16 ++++++++-------- ...de_test_query_serving_schema_next_release.yml | 16 ++++++++-------- ...upgrade_downgrade_test_reparent_new_vtctl.yml | 16 ++++++++-------- ...rade_downgrade_test_reparent_new_vttablet.yml | 16 ++++++++-------- ...upgrade_downgrade_test_reparent_old_vtctl.yml | 16 ++++++++-------- ...rade_downgrade_test_reparent_old_vttablet.yml | 16 ++++++++-------- .github/workflows/vtadmin_web_build.yml | 2 +- .github/workflows/vtadmin_web_lint.yml | 2 +- .github/workflows/vtadmin_web_unit_tests.yml | 2 +- test/templates/cluster_endtoend_test.tpl | 6 +++--- test/templates/cluster_endtoend_test_docker.tpl | 4 ++-- test/templates/cluster_endtoend_test_mysql57.tpl | 6 +++--- .../cluster_endtoend_test_self_hosted.tpl | 2 +- test/templates/unit_test.tpl | 4 ++-- test/templates/unit_test_self_hosted.tpl | 2 +- 111 files changed, 364 insertions(+), 364 deletions(-) diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index e403c64604e..ca74a8e9dfd 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -18,7 +18,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -38,7 +38,7 @@ jobs: - '.github/workflows/check_make_vtadmin_authz_testgen.yml' - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: go-version: 1.18.9 diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index eaaf651a21d..00bdab7c918 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -18,7 +18,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -40,7 +40,7 @@ jobs: - '.github/workflows/check_make_vtadmin_web_proto.yml' - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: go-version: 1.18.9 diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 89e28a615da..f8b1c5c30b9 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index 8539fff4013..56dcfb35898 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index bc0f2b75cbb..324ab7c6321 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index 6844a755ead..b947e5ae3b9 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index 880c95849c6..2df268e9fb6 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_22.yml b/.github/workflows/cluster_endtoend_22.yml index 0342ee17c13..a1c6c3abade 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index f19d800b76a..ec52d47b8a0 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index 78883d7f4d6..85759bd60e6 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index b3a90de85f1..32960d5f71f 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_declarative.yml b/.github/workflows/cluster_endtoend_onlineddl_declarative.yml index 2195c161025..706f2adeeb4 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_declarative.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_declarative.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_declarative_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_declarative_mysql57.yml index e839788199d..3bb311b87ad 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_declarative_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_declarative_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml index 9c2ebfeb8da..8ed3ac1956e 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml index 90e814fc2ba..36d8aafbabb 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index 38356581b5a..c0f315b749a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml index d36eacc3cd2..3925ae235ab 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revertible.yml b/.github/workflows/cluster_endtoend_onlineddl_revertible.yml index 766e7c3cec8..ac6cd567a92 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revertible.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revertible.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revertible_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_revertible_mysql57.yml index 62234ad74ca..5ecee59f025 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revertible_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revertible_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index a071219dae2..e6df6eea577 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml index a7b97dcdda8..5679ffe8afe 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_singleton.yml b/.github/workflows/cluster_endtoend_onlineddl_singleton.yml index a3a734705fd..b5c04aa8ebf 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_singleton.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_singleton.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_singleton_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_singleton_mysql57.yml index f8333e3f052..9b93e4b5ced 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_singleton_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_singleton_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index a9a82381db0..92365edc713 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml index 522fe67abcf..7500e41d5ac 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index 04731a97299..294dcb85591 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml index e141b30a8c1..4c0a6e37929 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index 56be178eb6b..660236f4e02 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml index 975d77a86e6..4abbb6252d1 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index 3a1868c577c..ffed44826b6 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml index 78776556359..1d538e9ac40 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 3bcb1ff611a..be36493fc1d 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml index bd1788ab1a1..5fae3e60abe 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 0072fd5ae85..fd3ffa2af8e 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index 5d94bd0d00f..1d5e97391e6 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml index 3a73839a608..ee57156c701 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml index 221998d44d4..2f9e7194009 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml index f317444397b..dbb33ee7c69 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index 0bce2196342..1bc200a4232 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index 677235fa0ea..158886259b0 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index b1bfbf5f30b..afe3e36ca89 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index 67e9d4757f2..7cfb1ad6902 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml index cd7001209ef..4d7ba6f9e03 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_multicell.yml b/.github/workflows/cluster_endtoend_vreplication_multicell.yml index 2a83337a469..5f0816457cc 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index 9960ad7a2d4..856d6147c0d 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_failover.yml b/.github/workflows/cluster_endtoend_vstream_failover.yml index 2bfbaf78e07..8f1e3640b4b 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml index c1d6ed798ef..d88ed0e18ba 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml index 497e433173f..95bc1f81f6a 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml index f2d122cf973..42bc76d6997 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup_transform.yml b/.github/workflows/cluster_endtoend_vtbackup_transform.yml index eb27b0fc5c5..44978cba1e0 100644 --- a/.github/workflows/cluster_endtoend_vtbackup_transform.yml +++ b/.github/workflows/cluster_endtoend_vtbackup_transform.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index 3cb2780e3ca..6ed075a3def 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index 225b829b33c..fc1f4c00e0d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index addfda26ba8..20cf8a8ecea 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index 3fa8d4899ae..b361e6d6b27 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 72da0eaedac..e86a1dfb61a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index ace4e6e6066..92de29d023f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index d93bbf8f7d9..e1d94f2783a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index be42a14816b..d5605d3f05d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index dabc0448a81..45346a52047 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index 3a62e835905..7afbe5c91a6 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 4bf3f6dfe27..eb908e8383c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index 4649bdd64e5..85aae0bb929 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index 957dc9151a9..a1582cecc3a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index 3968e9db40d..e004dac3b45 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index 3553a7b8698..5a2d78b9ad1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index 5191898ff48..ae0e1e30a9b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index 393c31aa33b..39495965889 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index 58885e3a4a5..1f172f89bd3 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index d85be488bea..07964dc91a7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index 3e03a3d4fd2..3315be23255 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml index cf4d74d4d09..41e58cf8c40 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index 29d2d2ff305..7c6ae266274 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index d07cd5621b3..671acb6c358 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml index dcdf9d9ad37..08e3318c8b9 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -29,7 +29,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,13 +53,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index eb8474c601b..b58e77b3416 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml index f5538ecc3e0..659746911b5 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -29,7 +29,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,13 +53,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index 78640b780d8..6757a5eec67 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -39,7 +39,7 @@ jobs: # queries: security-extended,security-and-quality - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 0f651082079..cb681c0a5a1 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 @@ -29,7 +29,7 @@ jobs: # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - name: Check out code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 06aaba68c00..7f8d6d78f01 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -19,7 +19,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -44,7 +44,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index e9dda7d7c31..ced90f7e550 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -19,7 +19,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -44,7 +44,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 677d23e3eaa..91d23757588 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -18,7 +18,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -42,7 +42,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 154f914dde4..441cf8d04a2 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -18,7 +18,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -42,7 +42,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index 8c2db274bfc..08bd888f504 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,7 +48,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 8da29dbb6d3..ddfbe472280 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,7 +48,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index 871e6cc7f83..84f53a3968f 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -10,7 +10,7 @@ jobs: steps: - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.13 @@ -25,7 +25,7 @@ jobs: # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - name: Check out code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 909d293ae6f..e50a08fc0c5 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -22,7 +22,7 @@ jobs: - name: Checkout code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Run FOSSA scan and upload build data if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -93,7 +93,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && (steps.changes.outputs.go_files == 'true' || steps.changes.outputs.parser_changes == 'true' || steps.changes.outputs.proto_changes == 'true') - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 37a354245a2..13311e57ef7 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -22,7 +22,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -46,7 +46,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/unit_test_mariadb103.yml b/.github/workflows/unit_test_mariadb103.yml index 6738268662f..ec9b68f2eed 100644 --- a/.github/workflows/unit_test_mariadb103.yml +++ b/.github/workflows/unit_test_mariadb103.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -47,7 +47,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 5e93a8a1240..51f4df0b1e0 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -47,7 +47,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index c83bb683431..13d2b7f0596 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -47,7 +47,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 52774b32204..550474eabe2 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -10,14 +10,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Backups - E2E runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -31,7 +31,7 @@ jobs: upgrade_downgrade_test_e2e: timeout-minutes: 60 if: always() && needs.get_previous_release.result == 'success' - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Backups - E2E runs-on: ubuntu-20.04 needs: - get_previous_release @@ -49,7 +49,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -74,13 +74,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -110,7 +110,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -132,7 +132,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 50122f65137..a8dd59b91fe 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -10,14 +10,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Backups - E2E - Next Release runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -31,7 +31,7 @@ jobs: upgrade_downgrade_test_e2e: timeout-minutes: 60 if: always() && needs.get_next_release.result == 'success' - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Backups - E2E - Next Release runs-on: ubuntu-20.04 needs: - get_next_release @@ -52,7 +52,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -77,13 +77,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -113,7 +113,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -135,7 +135,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index ae1a78ab3b2..5d768e2f2e0 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -10,14 +10,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get a recent LTS release + name: Get Previous Release - Backups - Manual runs-on: ubuntu-20.04 outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -32,7 +32,7 @@ jobs: upgrade_downgrade_test_manual: timeout-minutes: 40 if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Backups - Manual runs-on: ubuntu-20.04 needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -151,7 +151,7 @@ jobs: # Checkout to the last release of Vitess - name: Checkout to the other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -173,7 +173,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml index a7b358f30dd..52a540a5fe9 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -10,14 +10,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get a recent LTS release + name: Get Previous Release - Backups - Manual - Next Release runs-on: ubuntu-20.04 outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -32,7 +32,7 @@ jobs: upgrade_downgrade_test_manual: timeout-minutes: 40 if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Backups - Manual - Next Release runs-on: ubuntu-20.04 needs: - get_next_release @@ -54,7 +54,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -154,7 +154,7 @@ jobs: # Checkout to the next release of Vitess - name: Checkout to the other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -176,7 +176,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index c889d1d39da..ce911f269a3 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Query Serving (Queries) runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Query Serving (Queries) runs-on: ubuntu-latest needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -128,7 +128,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -150,7 +150,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index 69d000b3b1a..25319498cce 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Query Serving (Queries) Next Release runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Query Serving (Queries) Next Release runs-on: ubuntu-latest needs: - get_next_release @@ -54,7 +54,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +131,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -153,7 +153,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 65e39baadcc..a9043ecaf61 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Query Serving (Schema) runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Query Serving (Schema) runs-on: ubuntu-latest needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -128,7 +128,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -150,7 +150,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index e29c983ab54..e5d4601f245 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Query Serving (Schema) Next Release runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Query Serving (Schema) Next Release runs-on: ubuntu-latest needs: - get_next_release @@ -54,7 +54,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +131,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -153,7 +153,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index 26ce805e2f2..a533d28526d 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Reparent New Vtctl runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Reparent New Vtctl runs-on: ubuntu-latest needs: - get_next_release @@ -54,7 +54,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +131,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -153,7 +153,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index cdf7efe6951..c6499adc5d8 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Reparent New VTTablet runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Reparent New VTTablet runs-on: ubuntu-latest needs: - get_next_release @@ -54,7 +54,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.20.1 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +131,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -153,7 +153,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 7b69aef3265..043042ed626 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Reparent Old Vtctl runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Reparent Old Vtctl runs-on: ubuntu-latest needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -128,7 +128,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -150,7 +150,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 6f5aa09f747..9775add29d7 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Reparent Old VTTablet runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Reparent Old VTTablet runs-on: ubuntu-latest needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -128,7 +128,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -150,7 +150,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/vtadmin_web_build.yml b/.github/workflows/vtadmin_web_build.yml index 8af9982b9a5..fdb70ecc49e 100644 --- a/.github/workflows/vtadmin_web_build.yml +++ b/.github/workflows/vtadmin_web_build.yml @@ -26,7 +26,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v2 diff --git a/.github/workflows/vtadmin_web_lint.yml b/.github/workflows/vtadmin_web_lint.yml index 4c2ef845ee6..0a0977caa66 100644 --- a/.github/workflows/vtadmin_web_lint.yml +++ b/.github/workflows/vtadmin_web_lint.yml @@ -26,7 +26,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v2 diff --git a/.github/workflows/vtadmin_web_unit_tests.yml b/.github/workflows/vtadmin_web_unit_tests.yml index e6d248124ff..abb884dcdd9 100644 --- a/.github/workflows/vtadmin_web_unit_tests.yml +++ b/.github/workflows/vtadmin_web_unit_tests.yml @@ -26,7 +26,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v2 diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 378dccc0b22..d8ff13d8786 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -22,7 +22,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -46,13 +46,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/cluster_endtoend_test_docker.tpl b/test/templates/cluster_endtoend_test_docker.tpl index 0744a41619d..3395b63720f 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -19,7 +19,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -43,7 +43,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/test/templates/cluster_endtoend_test_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index 38f6b7a3920..22d92fd08da 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -29,7 +29,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,13 +53,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/cluster_endtoend_test_self_hosted.tpl b/test/templates/cluster_endtoend_test_self_hosted.tpl index e67a7b2a374..93030c88bb4 100644 --- a/test/templates/cluster_endtoend_test_self_hosted.tpl +++ b/test/templates/cluster_endtoend_test_self_hosted.tpl @@ -22,7 +22,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index 28040f454a6..a1d27243b54 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -21,7 +21,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -45,7 +45,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/test/templates/unit_test_self_hosted.tpl b/test/templates/unit_test_self_hosted.tpl index 995e7c7b91f..3bf1508984f 100644 --- a/test/templates/unit_test_self_hosted.tpl +++ b/test/templates/unit_test_self_hosted.tpl @@ -21,7 +21,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' From 7ac5c3939b047b42bfc20072665cee210e08261c Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Wed, 1 Mar 2023 15:14:01 -0500 Subject: [PATCH 28/53] Fix `vtctldclient`'s Root command to return an error on unknown command (#12481) (#12531) * Add a Run func to `vtctldclient`'s Root command to return an error on unknown command Closes #12480. * Add test * flags test data --------- Signed-off-by: Andrew Mason --- go/cmd/vtctldclient/command/root.go | 21 +++++++++ go/cmd/vtctldclient/command/root_test.go | 54 ++++++++++++++++++++++++ go/flags/endtoend/vtctldclient.txt | 1 + 3 files changed, 76 insertions(+) create mode 100644 go/cmd/vtctldclient/command/root_test.go diff --git a/go/cmd/vtctldclient/command/root.go b/go/cmd/vtctldclient/command/root.go index 0d53c97c72d..aeff58f2986 100644 --- a/go/cmd/vtctldclient/command/root.go +++ b/go/cmd/vtctldclient/command/root.go @@ -19,6 +19,7 @@ package command import ( "context" "errors" + "fmt" "io" "time" @@ -82,6 +83,26 @@ var ( // propagated). SilenceErrors: true, Version: servenv.AppVersion.String(), + // If we've reached this function, it means that: + // + // (1) The user specified some positional arguments, which, for the way + // we've structured things can only be a subcommand name, **and** + // + // (2) Cobra was unable to find a subcommand with that name for which to + // call a Run or RunE function. + // + // From this we conclude that the user was trying to either run a + // command that doesn't exist (e.g. "vtctldclient delete-my-data") or + // has misspelled a legitimate command (e.g. "vtctldclient StapReplication"). + // If we think this has happened, return an error, which will get + // displayed to the user in main.go along with the usage. + RunE: func(cmd *cobra.Command, args []string) error { + if cmd.Flags().NArg() > 0 { + return fmt.Errorf("unknown command: %s", cmd.Flags().Arg(0)) + } + + return nil + }, } ) diff --git a/go/cmd/vtctldclient/command/root_test.go b/go/cmd/vtctldclient/command/root_test.go new file mode 100644 index 00000000000..155fac78705 --- /dev/null +++ b/go/cmd/vtctldclient/command/root_test.go @@ -0,0 +1,54 @@ +/* +Copyright 2023 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package command_test + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/cmd/vtctldclient/command" + "vitess.io/vitess/go/vt/vtctl/localvtctldclient" + + vtctlservicepb "vitess.io/vitess/go/vt/proto/vtctlservice" +) + +type emptyLocalServer struct { + vtctlservicepb.UnimplementedVtctldServer +} + +func TestRoot(t *testing.T) { + t.Run("error on unknown subcommand", func(t *testing.T) { + args := append([]string{}, os.Args...) + protocol := command.VtctldClientProtocol + localvtctldclient.SetServer(&emptyLocalServer{}) + + t.Cleanup(func() { + os.Args = append([]string{}, args...) + command.VtctldClientProtocol = protocol + }) + + os.Args = []string{"vtctldclient", "this-is-bunk"} + command.VtctldClientProtocol = "local" + + err := command.Root.Execute() + require.Error(t, err, "root command should error on unknown command") + assert.Contains(t, err.Error(), "unknown command") + }) +} diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index 35c70924db4..79905723cfe 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -1,6 +1,7 @@ Executes a cluster management command on the remote vtctld server. Usage: + vtctldclient [flags] vtctldclient [command] Available Commands: From 92d2af292b3ace4d350e7008b886e20eb47fce1c Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Sun, 5 Mar 2023 09:21:08 +0100 Subject: [PATCH 29/53] [bug fix] USING planning on information_schema (#12542) * [planner] Schema information on the information_schema views (#11941) * add info_schema information Signed-off-by: Andres Taylor * add SchemaInformation handling for info_schema tables Signed-off-by: Andres Taylor * fix bad test query Signed-off-by: Andres Taylor * add support for information_schema on mysql 5.7 Signed-off-by: Andres Taylor * columns sorted just like mysql, and tests for 5.7 Signed-off-by: Andres Taylor * test: skip test that should not run Signed-off-by: Andres Taylor Signed-off-by: Andres Taylor * Fix for USING when column names not lower cased (#12379) Signed-off-by: Andres Taylor --------- Signed-off-by: Andres Taylor --- go/vt/sqlparser/ast_funcs.go | 92 +- go/vt/sqlparser/keywords.go | 2 + go/vt/vtgate/planbuilder/plan_test.go | 13 +- .../planbuilder/testdata/filter_cases.json | 21 +- .../planbuilder/testdata/from_cases.json | 7 +- .../planbuilder/testdata/select_cases.json | 13 +- .../testdata/sysschema_default.json | 14 +- .../testdata/systemtables_cases57.json | 1880 +++++++++++++++++ ...s_cases.json => systemtables_cases80.json} | 653 ++++-- .../planbuilder/testdata/union_cases.json | 5 +- .../testdata/unsupported_cases.json | 16 +- go/vt/vtgate/semantics/analyzer.go | 2 +- go/vt/vtgate/semantics/analyzer_test.go | 11 + go/vt/vtgate/semantics/derived_table.go | 4 +- go/vt/vtgate/semantics/early_rewriter.go | 3 +- go/vt/vtgate/semantics/info_schema.go | 1710 +++++++++++++++ .../vtgate/semantics/info_schema_gen_test.go | 228 ++ go/vt/vtgate/semantics/table_collector.go | 21 +- 18 files changed, 4449 insertions(+), 246 deletions(-) create mode 100644 go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json rename go/vt/vtgate/planbuilder/testdata/{systemtables_cases.json => systemtables_cases80.json} (74%) create mode 100644 go/vt/vtgate/semantics/info_schema.go create mode 100644 go/vt/vtgate/semantics/info_schema_gen_test.go diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 8ece2749788..b9a1ea1b6d3 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -210,97 +210,101 @@ func (ct *ColumnType) DescribeType() string { // SQLType returns the sqltypes type code for the given column func (ct *ColumnType) SQLType() querypb.Type { - switch strings.ToLower(ct.Type) { - case keywordStrings[TINYINT]: - if ct.Unsigned { + return SQLTypeToQueryType(ct.Type, ct.Unsigned) +} + +func SQLTypeToQueryType(typeName string, unsigned bool) querypb.Type { + switch keywordVals[strings.ToLower(typeName)] { + case TINYINT: + if unsigned { return sqltypes.Uint8 } return sqltypes.Int8 - case keywordStrings[SMALLINT]: - if ct.Unsigned { + case SMALLINT: + if unsigned { return sqltypes.Uint16 } return sqltypes.Int16 - case keywordStrings[MEDIUMINT]: - if ct.Unsigned { + case MEDIUMINT: + if unsigned { return sqltypes.Uint24 } return sqltypes.Int24 - case keywordStrings[INT], keywordStrings[INTEGER]: - if ct.Unsigned { + case INT, INTEGER: + if unsigned { return sqltypes.Uint32 } return sqltypes.Int32 - case keywordStrings[BIGINT]: - if ct.Unsigned { + case BIGINT: + if unsigned { return sqltypes.Uint64 } return sqltypes.Int64 - case keywordStrings[BOOL], keywordStrings[BOOLEAN]: + case BOOL, BOOLEAN: return sqltypes.Uint8 - case keywordStrings[TEXT]: + case TEXT: return sqltypes.Text - case keywordStrings[TINYTEXT]: + case TINYTEXT: return sqltypes.Text - case keywordStrings[MEDIUMTEXT]: + case MEDIUMTEXT: return sqltypes.Text - case keywordStrings[LONGTEXT]: + case LONGTEXT: return sqltypes.Text - case keywordStrings[BLOB]: + case BLOB: return sqltypes.Blob - case keywordStrings[TINYBLOB]: + case TINYBLOB: return sqltypes.Blob - case keywordStrings[MEDIUMBLOB]: + case MEDIUMBLOB: return sqltypes.Blob - case keywordStrings[LONGBLOB]: + case LONGBLOB: return sqltypes.Blob - case keywordStrings[CHAR]: + case CHAR: return sqltypes.Char - case keywordStrings[VARCHAR]: + case VARCHAR: return sqltypes.VarChar - case keywordStrings[BINARY]: + case BINARY: return sqltypes.Binary - case keywordStrings[VARBINARY]: + case VARBINARY: return sqltypes.VarBinary - case keywordStrings[DATE]: + case DATE: return sqltypes.Date - case keywordStrings[TIME]: + case TIME: return sqltypes.Time - case keywordStrings[DATETIME]: + case DATETIME: return sqltypes.Datetime - case keywordStrings[TIMESTAMP]: + case TIMESTAMP: return sqltypes.Timestamp - case keywordStrings[YEAR]: + case YEAR: return sqltypes.Year - case keywordStrings[FLOAT_TYPE]: + case FLOAT_TYPE: return sqltypes.Float32 - case keywordStrings[DOUBLE]: + case DOUBLE: return sqltypes.Float64 - case keywordStrings[DECIMAL]: + case DECIMAL, DECIMAL_TYPE: return sqltypes.Decimal - case keywordStrings[BIT]: + case BIT: return sqltypes.Bit - case keywordStrings[ENUM]: + case ENUM: return sqltypes.Enum - case keywordStrings[SET]: + case SET: return sqltypes.Set - case keywordStrings[JSON]: + case JSON: return sqltypes.TypeJSON - case keywordStrings[GEOMETRY]: + case GEOMETRY: return sqltypes.Geometry - case keywordStrings[POINT]: + case POINT: return sqltypes.Geometry - case keywordStrings[LINESTRING]: + case LINESTRING: return sqltypes.Geometry - case keywordStrings[POLYGON]: + case POLYGON: return sqltypes.Geometry - case keywordStrings[GEOMETRYCOLLECTION]: + case GEOMETRYCOLLECTION: return sqltypes.Geometry - case keywordStrings[MULTIPOINT]: + case MULTIPOINT: return sqltypes.Geometry - case keywordStrings[MULTILINESTRING]: + case MULTILINESTRING: return sqltypes.Geometry - case keywordStrings[MULTIPOLYGON]: + case MULTIPOLYGON: return sqltypes.Geometry } return sqltypes.Null diff --git a/go/vt/sqlparser/keywords.go b/go/vt/sqlparser/keywords.go index ec980a05c65..d0a152f907c 100644 --- a/go/vt/sqlparser/keywords.go +++ b/go/vt/sqlparser/keywords.go @@ -687,6 +687,7 @@ var keywords = []keyword{ // keywordStrings contains the reverse mapping of token to keyword strings var keywordStrings = map[int]string{} +var keywordVals = map[string]int{} // keywordLookupTable is a perfect hash map that maps **case insensitive** keyword names to their ids var keywordLookupTable *caseInsensitiveTable @@ -735,6 +736,7 @@ func init() { panic(fmt.Sprintf("keyword %q must be lowercase in table", kw.name)) } keywordStrings[kw.id] = kw.name + keywordVals[kw.name] = kw.id } keywordLookupTable = buildCaseInsensitiveTable(keywords) diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index 0b60ca73b04..96ac5cf964a 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -31,6 +31,8 @@ import ( "github.com/stretchr/testify/require" + "vitess.io/vitess/go/vt/servenv" + vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" "vitess.io/vitess/go/test/utils" @@ -252,7 +254,16 @@ func TestPlan(t *testing.T) { testFile(t, "flush_cases_no_default_keyspace.json", testOutputTempDir, vschemaWrapper, false) testFile(t, "show_cases_no_default_keyspace.json", testOutputTempDir, vschemaWrapper, false) testFile(t, "stream_cases.json", testOutputTempDir, vschemaWrapper, false) - testFile(t, "systemtables_cases.json", testOutputTempDir, vschemaWrapper, false) + testFile(t, "systemtables_cases80.json", testOutputTempDir, vschemaWrapper, false) +} + +func TestSystemTables57(t *testing.T) { + // first we move everything to use 5.7 logic + servenv.SetMySQLServerVersionForTest("5.7") + defer servenv.SetMySQLServerVersionForTest("") + vschemaWrapper := &vschemaWrapper{v: loadSchema(t, "vschemas/schema.json", true)} + testOutputTempDir := makeTestOutput(t) + testFile(t, "systemtables_cases57.json", testOutputTempDir, vschemaWrapper, false) } func TestSysVarSetDisabled(t *testing.T) { diff --git a/go/vt/vtgate/planbuilder/testdata/filter_cases.json b/go/vt/vtgate/planbuilder/testdata/filter_cases.json index 5ba0fea9007..242d447cc40 100644 --- a/go/vt/vtgate/planbuilder/testdata/filter_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/filter_cases.json @@ -4381,7 +4381,7 @@ { "comment": "SelectDBA with uncorrelated subqueries", "query": "select t.table_schema from information_schema.tables as t where t.table_schema in (select c.column_name from information_schema.columns as c)", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select t.table_schema from information_schema.tables as t where t.table_schema in (select c.column_name from information_schema.columns as c)", "Instructions": { @@ -4395,6 +4395,25 @@ "Query": "select t.table_schema from information_schema.`tables` as t where t.table_schema in (select c.column_name from information_schema.`columns` as c)", "Table": "information_schema.`tables`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select t.table_schema from information_schema.tables as t where t.table_schema in (select c.column_name from information_schema.columns as c)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select t.table_schema from information_schema.`tables` as t where 1 != 1", + "Query": "select t.table_schema from information_schema.`tables` as t where t.table_schema in (select c.column_name from information_schema.`columns` as c)", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.columns", + "information_schema.tables" + ] } }, { diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index f9c88a765fb..bfef302f982 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -587,6 +587,7 @@ "plan": "table disabled has been disabled" }, { + "comment": "select second_user.foo.col from second_user.foo join user on second_user.foo.id = user.id where second_user.foo.col = 42", "query": "select second_user.foo.col from second_user.foo join user on second_user.foo.id = user.id where second_user.foo.col = 42", "v3-plan": { "QueryType": "SELECT", @@ -623,6 +624,7 @@ } }, { + "comment": "select user.music.foo from user.music join user on user.music.id = user.id where user.music.col = 42", "query": "select user.music.foo from user.music join user on user.music.id = user.id where user.music.col = 42", "v3-plan": { "QueryType": "SELECT", @@ -3001,6 +3003,7 @@ ] }, "TablesUsed": [ + "information_schema.a", "main.unsharded" ] } @@ -3076,6 +3079,7 @@ ] }, "TablesUsed": [ + "information_schema.a", "main.unsharded" ] } @@ -6160,6 +6164,7 @@ } }, { + "comment": "select * from (select bar as push_it from (select foo as bar from (select id as foo from user) as t1) as t2) as t3 where push_it = 12", "query": "select * from (select bar as push_it from (select foo as bar from (select id as foo from user) as t1) as t2) as t3 where push_it = 12", "v3-plan": { "QueryType": "SELECT", @@ -6203,4 +6208,4 @@ ] } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 664e945c606..aadbc7840cd 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -2535,6 +2535,7 @@ } }, { + "comment": "(select id from unsharded) union (select id from unsharded_auto) order by id limit 5", "query": "(select id from unsharded) union (select id from unsharded_auto) order by id limit 5", "v3-plan": { "QueryType": "SELECT", @@ -3295,6 +3296,7 @@ "plan": "syntax error at position 41 near 'into'" }, { + "comment": "select (select u.id from user as u where u.id = 1), a.id from user as a where a.id = 1", "query": "select (select u.id from user as u where u.id = 1), a.id from user as a where a.id = 1", "v3-plan": { "QueryType": "SELECT", @@ -3416,6 +3418,7 @@ } }, { + "comment": "((((select 1))))", "query": "((((select 1))))", "v3-plan": { "QueryType": "SELECT", @@ -3585,6 +3588,7 @@ } }, { + "comment": "select (select col from user limit 1) as a from user join user_extra order by a", "query": "select (select col from user limit 1) as a from user join user_extra order by a", "v3-plan": { "QueryType": "SELECT", @@ -3716,6 +3720,7 @@ } }, { + "comment": "select t.a from (select (select col from user limit 1) as a from user join user_extra) t", "query": "select t.a from (select (select col from user limit 1) as a from user join user_extra) t", "v3-plan": { "QueryType": "SELECT", @@ -3860,6 +3865,7 @@ } }, { + "comment": "select (select col from user where user_extra.id = 4 limit 1) as a from user join user_extra", "query": "select (select col from user where user_extra.id = 4 limit 1) as a from user join user_extra", "plan": "unsupported: cross-shard correlated subquery" }, @@ -4462,6 +4468,7 @@ } }, { + "comment": "select user.id, trim(leading 'x' from user.name) from user", "query": "select user.id, trim(leading 'x' from user.name) from user", "v3-plan": { "QueryType": "SELECT", @@ -4571,6 +4578,7 @@ "Table": "dual" }, "TablesUsed": [ + "information_schema.TABLES", "main.dual" ] } @@ -4613,6 +4621,7 @@ } }, { + "comment": "select (select id from user order by id limit 1) from user_extra", "query": "select (select id from user order by id limit 1) from user_extra", "v3-plan": { "QueryType": "SELECT", @@ -7687,6 +7696,7 @@ } }, { + "comment": "select user.a, t.b from user join (select id, count(*) b, req from user_extra group by req, id) as t on user.id = t.id", "query": "select user.a, t.b from user join (select id, count(*) b, req from user_extra group by req, id) as t on user.id = t.id", "v3-plan": "unsupported: filtering on results of cross-shard subquery", "gen4-plan": { @@ -7765,6 +7775,7 @@ "gen4-plan": "unsupported: JOIN not supported between derived tables" }, { + "comment": "SELECT music.id FROM (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other JOIN music ON other.maxt = music.id", "query": "SELECT music.id FROM (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other JOIN music ON other.maxt = music.id", "v3-plan": { "QueryType": "SELECT", @@ -7909,4 +7920,4 @@ ] } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/sysschema_default.json b/go/vt/vtgate/planbuilder/testdata/sysschema_default.json index 2d12dd815cf..275a6720e29 100644 --- a/go/vt/vtgate/planbuilder/testdata/sysschema_default.json +++ b/go/vt/vtgate/planbuilder/testdata/sysschema_default.json @@ -69,7 +69,11 @@ "Query": "select t.table_schema, t.table_name, c.column_name, c.column_type from information_schema.`tables` as t, information_schema.`columns` as c where t.table_schema = :__vtschemaname and c.table_schema = :__vtschemaname and c.table_schema = t.table_schema and c.table_name = t.table_name order by t.table_schema asc, t.table_name asc, c.column_name asc", "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"user\")]", "Table": "information_schema.`columns`, information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.columns", + "information_schema.tables" + ] } }, { @@ -107,6 +111,7 @@ "Table": "dual" }, "TablesUsed": [ + "information_schema.schemata", "main.dual" ] } @@ -144,7 +149,10 @@ "Query": "select x.`1` from (select 1 from information_schema.schemata where schema_name = :__vtschemaname limit 1) as x", "SysTableTableSchema": "[VARCHAR(\"MyDatabase\")]", "Table": "information_schema.schemata" - } + }, + "TablesUsed": [ + "information_schema.schemata" + ] } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json b/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json new file mode 100644 index 00000000000..17441749e3f --- /dev/null +++ b/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json @@ -0,0 +1,1880 @@ +[ + { + "comment": "Single information_schema query", + "query": "select TABLE_NAME from information_schema.TABLES", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select TABLE_NAME from information_schema.TABLES", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`TABLES` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`TABLES`", + "Table": "information_schema.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select TABLE_NAME from information_schema.TABLES", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`TABLES` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`TABLES`", + "Table": "information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "',' join information_schema", + "query": "select a.ENGINE, b.DATA_TYPE from information_schema.TABLES as a, information_schema.COLUMNS as b", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select a.ENGINE, b.DATA_TYPE from information_schema.TABLES as a, information_schema.COLUMNS as b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.`ENGINE`, b.DATA_TYPE from information_schema.`TABLES` as a, information_schema.`COLUMNS` as b where 1 != 1", + "Query": "select a.`ENGINE`, b.DATA_TYPE from information_schema.`TABLES` as a, information_schema.`COLUMNS` as b", + "Table": "information_schema.`TABLES`, information_schema.`COLUMNS`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select a.ENGINE, b.DATA_TYPE from information_schema.TABLES as a, information_schema.COLUMNS as b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.`ENGINE`, b.DATA_TYPE from information_schema.`TABLES` as a, information_schema.`COLUMNS` as b where 1 != 1", + "Query": "select a.`ENGINE`, b.DATA_TYPE from information_schema.`TABLES` as a, information_schema.`COLUMNS` as b", + "Table": "information_schema.`COLUMNS`, information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.COLUMNS", + "information_schema.TABLES" + ] + } + }, + { + "comment": "information schema query that uses table_schema", + "query": "select column_name from information_schema.columns where table_schema = (select schema())", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select column_name from information_schema.columns where table_schema = (select schema())", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.`columns` where 1 != 1", + "Query": "select column_name from information_schema.`columns` where table_schema = schema()", + "Table": "information_schema.`columns`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select column_name from information_schema.columns where table_schema = (select schema())", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.`columns` where 1 != 1", + "Query": "select column_name from information_schema.`columns` where table_schema = schema()", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns" + ] + } + }, + { + "comment": "information schema join", + "query": "select tables.TABLE_SCHEMA, files.`STATUS` from information_schema.tables join information_schema.files", + "v3-plan": "symbol `tables`.TABLE_SCHEMA not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select tables.TABLE_SCHEMA, files.`STATUS` from information_schema.tables join information_schema.files", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select `tables`.TABLE_SCHEMA, files.`STATUS` from information_schema.`tables`, information_schema.files where 1 != 1", + "Query": "select `tables`.TABLE_SCHEMA, files.`STATUS` from information_schema.`tables`, information_schema.files", + "Table": "information_schema.`tables`, information_schema.files" + }, + "TablesUsed": [ + "information_schema.files", + "information_schema.tables" + ] + } + }, + { + "comment": "access to qualified column names in information_schema", + "query": "select * from information_schema.COLUMNS where information_schema.COLUMNS.COLUMN_NAME='toto'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.COLUMNS where information_schema.COLUMNS.COLUMN_NAME='toto'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.`COLUMNS` where 1 != 1", + "Query": "select * from information_schema.`COLUMNS` where information_schema.`COLUMNS`.COLUMN_NAME = 'toto'", + "Table": "information_schema.`COLUMNS`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.COLUMNS where information_schema.COLUMNS.COLUMN_NAME='toto'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE, COLUMN_KEY, EXTRA, `PRIVILEGES`, COLUMN_COMMENT, GENERATION_EXPRESSION from information_schema.`COLUMNS` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE, COLUMN_KEY, EXTRA, `PRIVILEGES`, COLUMN_COMMENT, GENERATION_EXPRESSION from information_schema.`COLUMNS` where `COLUMNS`.COLUMN_NAME = 'toto'", + "Table": "information_schema.`COLUMNS`" + }, + "TablesUsed": [ + "information_schema.COLUMNS" + ] + } + }, + { + "comment": "union of information_schema", + "query": "select TABLE_NAME from information_schema.columns union select table_schema from information_schema.tables", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select TABLE_NAME from information_schema.columns union select table_schema from information_schema.tables", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`columns` where 1 != 1 union select table_schema from information_schema.`tables` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`columns` union select table_schema from information_schema.`tables`", + "Table": "information_schema.`columns`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select TABLE_NAME from information_schema.columns union select table_schema from information_schema.tables", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`columns` where 1 != 1 union select table_schema from information_schema.`tables` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`columns` union select table_schema from information_schema.`tables`", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns", + "information_schema.tables" + ] + } + }, + { + "comment": "union between information_schema tables that should not be merged", + "query": "select * from information_schema.tables where table_schema = 'user' union select * from information_schema.tables where table_schema = 'main'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.tables where table_schema = 'user' union select * from information_schema.tables where table_schema = 'main'", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.`tables` where 1 != 1", + "Query": "select * from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.`tables` where 1 != 1", + "Query": "select * from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"main\")]", + "Table": "information_schema.`tables`" + } + ] + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.tables where table_schema = 'user' union select * from information_schema.tables where table_schema = 'main'", + "Instructions": { + "OperatorType": "Distinct", + "Collations": [ + "(0:21)", + "(1:22)", + "(2:23)", + "(3:24)", + "(4:25)", + "5: binary", + "(6:26)", + "7: binary", + "8: binary", + "9: binary", + "10: binary", + "11: binary", + "12: binary", + "13: binary", + "(14:27)", + "(15:28)", + "(16:29)", + "(17:30)", + "18: binary", + "(19:31)", + "(20:32)" + ], + "ResultColumns": 21, + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where 1 != 1", + "Query": "select distinct TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where 1 != 1", + "Query": "select distinct TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"main\")]", + "Table": "information_schema.`tables`" + } + ] + } + ] + }, + "TablesUsed": [ + "information_schema.tables" + ] + } + }, + { + "comment": "Select from information schema query with two tables that route should be merged", + "query": "SELECT RC.CONSTRAINT_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.COLUMN_NAME = 'id' AND KCU.REFERENCED_TABLE_SCHEMA = 'test' AND KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT RC.CONSTRAINT_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.COLUMN_NAME = 'id' AND KCU.REFERENCED_TABLE_SCHEMA = 'test' AND KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select RC.CONSTRAINT_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC on KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME where 1 != 1", + "Query": "select RC.CONSTRAINT_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC on KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME where KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.COLUMN_NAME = 'id' and KCU.REFERENCED_TABLE_SCHEMA = 'test' and KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", + "SysTableTableName": "[KCU_TABLE_NAME:VARCHAR(\"data_type_table\")]", + "SysTableTableSchema": "[VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT RC.CONSTRAINT_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.COLUMN_NAME = 'id' AND KCU.REFERENCED_TABLE_SCHEMA = 'test' AND KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select RC.CONSTRAINT_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC where 1 != 1", + "Query": "select RC.CONSTRAINT_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC where KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.COLUMN_NAME = 'id' and KCU.REFERENCED_TABLE_SCHEMA = 'test' and KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' and KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", + "SysTableTableName": "[KCU_TABLE_NAME:VARCHAR(\"data_type_table\")]", + "SysTableTableSchema": "[VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" + }, + "TablesUsed": [ + "information_schema.KEY_COLUMN_USAGE", + "information_schema.REFERENTIAL_CONSTRAINTS" + ] + } + }, + { + "comment": "Select from information schema query with three tables such that route for 2 should be merged but not for the last.", + "query": "SELECT KCU.`TABLE_NAME`, S.`TABLE_NAME` FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME, INFORMATION_SCHEMA.`TABLES` AS S WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.TABLE_NAME = 'data_type_table' AND S.TABLE_SCHEMA = 'test' AND S.TABLE_NAME = 'sc' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT KCU.`TABLE_NAME`, S.`TABLE_NAME` FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME, INFORMATION_SCHEMA.`TABLES` AS S WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.TABLE_NAME = 'data_type_table' AND S.TABLE_SCHEMA = 'test' AND S.TABLE_NAME = 'sc' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,R:0", + "TableName": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS_INFORMATION_SCHEMA.`TABLES`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select KCU.TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC on KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME where 1 != 1", + "Query": "select KCU.TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC on KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME where KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.TABLE_NAME = :KCU_TABLE_NAME1 order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", + "SysTableTableName": "[KCU_TABLE_NAME1:VARCHAR(\"data_type_table\"), KCU_TABLE_NAME:VARCHAR(\"data_type_table\")]", + "SysTableTableSchema": "[VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select S.TABLE_NAME from INFORMATION_SCHEMA.`TABLES` as S where 1 != 1", + "Query": "select S.TABLE_NAME from INFORMATION_SCHEMA.`TABLES` as S where S.TABLE_SCHEMA = :__vtschemaname and S.TABLE_NAME = :S_TABLE_NAME", + "SysTableTableName": "[S_TABLE_NAME:VARCHAR(\"sc\")]", + "SysTableTableSchema": "[VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT KCU.`TABLE_NAME`, S.`TABLE_NAME` FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME, INFORMATION_SCHEMA.`TABLES` AS S WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.TABLE_NAME = 'data_type_table' AND S.TABLE_SCHEMA = 'test' AND S.TABLE_NAME = 'sc' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select KCU.TABLE_NAME, S.TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC, INFORMATION_SCHEMA.`TABLES` as S where 1 != 1", + "Query": "select KCU.TABLE_NAME, S.TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC, INFORMATION_SCHEMA.`TABLES` as S where S.TABLE_SCHEMA = :__vtschemaname and S.TABLE_NAME = :S_TABLE_NAME and KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.TABLE_NAME = :KCU_TABLE_NAME1 and KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", + "SysTableTableName": "[KCU_TABLE_NAME1:VARCHAR(\"data_type_table\"), KCU_TABLE_NAME:VARCHAR(\"data_type_table\"), S_TABLE_NAME:VARCHAR(\"sc\")]", + "SysTableTableSchema": "[VARCHAR(\"test\"), VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS, INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.KEY_COLUMN_USAGE", + "information_schema.REFERENTIAL_CONSTRAINTS", + "information_schema.TABLES" + ] + } + }, + { + "comment": "information_schema.routines", + "query": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select routine_name as `name`, routine_definition as definition from information_schema.routines where 1 != 1", + "Query": "select routine_name as `name`, routine_definition as definition from information_schema.routines where ROUTINE_SCHEMA = :__vtschemaname and ROUTINE_TYPE = 'PROCEDURE'", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.routines" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select routine_name as `name`, routine_definition as definition from information_schema.routines where 1 != 1", + "Query": "select routine_name as `name`, routine_definition as definition from information_schema.routines where ROUTINE_SCHEMA = :__vtschemaname and ROUTINE_TYPE = 'PROCEDURE'", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.routines" + }, + "TablesUsed": [ + "information_schema.routines" + ] + } + }, + { + "comment": "information_schema table sizes", + "query": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sum(data_length + index_length) as size from information_schema.`TABLES` where 1 != 1", + "Query": "select sum(data_length + index_length) as size from information_schema.`TABLES` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sum(data_length + index_length) as size from information_schema.`TABLES` where 1 != 1", + "Query": "select sum(data_length + index_length) as size from information_schema.`TABLES` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "information_schema referential contraints", + "query": "SELECT kcu.constraint_name constraint_name, kcu.column_name column_name, kcu.referenced_table_name referenced_table_name, kcu.referenced_column_name referenced_column_name, kcu.ordinal_position ordinal_position, kcu.table_name table_name, rc.delete_rule delete_rule, rc.update_rule update_rule FROM information_schema.key_column_usage AS kcu INNER JOIN information_schema.referential_constraints AS rc ON kcu.constraint_name = rc.constraint_name WHERE kcu.table_schema = ? AND rc.constraint_schema = ? AND kcu.referenced_column_name IS NOT NULL ORDER BY ordinal_position", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT kcu.constraint_name constraint_name, kcu.column_name column_name, kcu.referenced_table_name referenced_table_name, kcu.referenced_column_name referenced_column_name, kcu.ordinal_position ordinal_position, kcu.table_name table_name, rc.delete_rule delete_rule, rc.update_rule update_rule FROM information_schema.key_column_usage AS kcu INNER JOIN information_schema.referential_constraints AS rc ON kcu.constraint_name = rc.constraint_name WHERE kcu.table_schema = ? AND rc.constraint_schema = ? AND kcu.referenced_column_name IS NOT NULL ORDER BY ordinal_position", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu join information_schema.referential_constraints as rc on kcu.constraint_name = rc.constraint_name where 1 != 1", + "Query": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu join information_schema.referential_constraints as rc on kcu.constraint_name = rc.constraint_name where kcu.table_schema = :__vtschemaname and rc.constraint_schema = :__vtschemaname and kcu.referenced_column_name is not null order by ordinal_position asc", + "SysTableTableSchema": "[:v1, :v2]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT kcu.constraint_name constraint_name, kcu.column_name column_name, kcu.referenced_table_name referenced_table_name, kcu.referenced_column_name referenced_column_name, kcu.ordinal_position ordinal_position, kcu.table_name table_name, rc.delete_rule delete_rule, rc.update_rule update_rule FROM information_schema.key_column_usage AS kcu INNER JOIN information_schema.referential_constraints AS rc ON kcu.constraint_name = rc.constraint_name WHERE kcu.table_schema = ? AND rc.constraint_schema = ? AND kcu.referenced_column_name IS NOT NULL ORDER BY ordinal_position", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu, information_schema.referential_constraints as rc where 1 != 1", + "Query": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu, information_schema.referential_constraints as rc where kcu.table_schema = :__vtschemaname and kcu.referenced_column_name is not null and rc.constraint_schema = :__vtschemaname and kcu.constraint_name = rc.constraint_name order by ordinal_position asc", + "SysTableTableSchema": "[:v1, :v2]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] + } + }, + { + "comment": "rails query", + "query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as name, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = ':vtg1' and rc.constraint_schema = database() and rc.table_name = ':vtg1'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as name, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = ':vtg1' and rc.constraint_schema = database() and rc.table_name = ':vtg1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where 1 != 1", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = :fk_table_name and rc.constraint_schema = database() and rc.table_name = :rc_table_name", + "SysTableTableName": "[fk_table_name:VARCHAR(\":vtg1\"), rc_table_name:VARCHAR(\":vtg1\")]", + "Table": "information_schema.referential_constraints, information_schema.key_column_usage" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as name, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = ':vtg1' and rc.constraint_schema = database() and rc.table_name = ':vtg1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where 1 != 1", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = database() and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = :fk_table_name and rc.constraint_schema = fk.constraint_schema and rc.constraint_name = fk.constraint_name", + "SysTableTableName": "[fk_table_name:VARCHAR(\":vtg1\"), rc_table_name:VARCHAR(\":vtg1\")]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] + } + }, + { + "comment": "rails_query 2", + "query": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.schemata where 1 != 1", + "Query": "select * from information_schema.schemata where schema_name = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.schemata" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, SQL_PATH from information_schema.schemata where 1 != 1", + "Query": "select CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, SQL_PATH from information_schema.schemata where schema_name = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.schemata" + }, + "TablesUsed": [ + "information_schema.schemata" + ] + } + }, + { + "comment": "rails_query 3", + "query": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_comment from information_schema.`tables` where 1 != 1", + "Query": "select table_comment from information_schema.`tables` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"schema_name\")]", + "Table": "information_schema.`tables`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_comment from information_schema.`tables` where 1 != 1", + "Query": "select table_comment from information_schema.`tables` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"schema_name\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] + } + }, + { + "comment": "rails_query 4", + "query": "SELECT fk.referenced_table_name AS 'to_table', fk.referenced_column_name AS 'primary_key',fk.column_name AS 'column',fk.constraint_name AS 'name',rc.update_rule AS 'on_update',rc.delete_rule AS 'on_delete' FROM information_schema.referential_constraints rc JOIN information_schema.key_column_usage fk USING (constraint_schema, constraint_name) WHERE fk.referenced_column_name IS NOT NULL AND fk.table_schema = 'table_schema' AND fk.table_name = 'table_name' AND rc.constraint_schema = 'table_schema' AND rc.table_name = 'table_name'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT fk.referenced_table_name AS 'to_table', fk.referenced_column_name AS 'primary_key',fk.column_name AS 'column',fk.constraint_name AS 'name',rc.update_rule AS 'on_update',rc.delete_rule AS 'on_delete' FROM information_schema.referential_constraints rc JOIN information_schema.key_column_usage fk USING (constraint_schema, constraint_name) WHERE fk.referenced_column_name IS NOT NULL AND fk.table_schema = 'table_schema' AND fk.table_name = 'table_name' AND rc.constraint_schema = 'table_schema' AND rc.table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where 1 != 1", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = :__vtschemaname and fk.table_name = :fk_table_name and rc.constraint_schema = :__vtschemaname and rc.table_name = :rc_table_name", + "SysTableTableName": "[fk_table_name:VARCHAR(\"table_name\"), rc_table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\"), VARCHAR(\"table_schema\")]", + "Table": "information_schema.referential_constraints, information_schema.key_column_usage" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT fk.referenced_table_name AS 'to_table', fk.referenced_column_name AS 'primary_key',fk.column_name AS 'column',fk.constraint_name AS 'name',rc.update_rule AS 'on_update',rc.delete_rule AS 'on_delete' FROM information_schema.referential_constraints rc JOIN information_schema.key_column_usage fk USING (constraint_schema, constraint_name) WHERE fk.referenced_column_name IS NOT NULL AND fk.table_schema = 'table_schema' AND fk.table_name = 'table_name' AND rc.constraint_schema = 'table_schema' AND rc.table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where 1 != 1", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = :__vtschemaname and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = :__vtschemaname and fk.table_name = :fk_table_name and rc.constraint_schema = fk.constraint_schema and rc.constraint_name = fk.constraint_name", + "SysTableTableName": "[fk_table_name:VARCHAR(\"table_name\"), rc_table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\"), VARCHAR(\"table_schema\")]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] + } + }, + { + "comment": "rails_query 6", + "query": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.statistics where 1 != 1", + "Query": "select column_name from information_schema.statistics where index_name = 'PRIMARY' and table_schema = :__vtschemaname and table_name = :table_name order by seq_in_index asc", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.statistics" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.statistics where 1 != 1", + "Query": "select column_name from information_schema.statistics where index_name = 'PRIMARY' and table_schema = :__vtschemaname and table_name = :table_name order by seq_in_index asc", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.statistics" + }, + "TablesUsed": [ + "information_schema.statistics" + ] + } + }, + { + "comment": "rails_query 7", + "query": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select generation_expression from information_schema.`columns` where 1 != 1", + "Query": "select generation_expression from information_schema.`columns` where table_schema = :__vtschemaname and table_name = :table_name and column_name = 'column_name'", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`columns`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select generation_expression from information_schema.`columns` where 1 != 1", + "Query": "select generation_expression from information_schema.`columns` where table_schema = :__vtschemaname and table_name = :table_name and column_name = 'column_name'", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns" + ] + } + }, + { + "comment": "rails_query 8", + "query": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id from information_schema.`processlist` where 1 != 1", + "Query": "select id from information_schema.`processlist` where info like '% FOR UPDATE'", + "Table": "information_schema.`processlist`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id from information_schema.`processlist` where 1 != 1", + "Query": "select id from information_schema.`processlist` where info like '% FOR UPDATE'", + "Table": "information_schema.`processlist`" + }, + "TablesUsed": [ + "information_schema.processlist" + ] + } + }, + { + "comment": "rails_query 9", + "query": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select * from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select * from information_schema.`tables` where table_schema = :__vtschemaname) as _subquery", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where table_schema = :__vtschemaname) as _subquery", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] + } + }, + { + "comment": "rails_query 10", + "query": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery WHERE _subquery.table_type = 'table_type' AND _subquery.table_name = 'table_name'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery WHERE _subquery.table_type = 'table_type' AND _subquery.table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select * from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select * from information_schema.`tables` where table_schema = :__vtschemaname) as _subquery where _subquery.table_type = 'table_type' and _subquery.table_name = :_subquery_table_name", + "SysTableTableName": "[_subquery_table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery WHERE _subquery.table_type = 'table_type' AND _subquery.table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where table_schema = :__vtschemaname and table_type = 'table_type' and table_name = 'table_name') as _subquery", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] + } + }, + { + "comment": "system schema in where clause of information_schema query", + "query": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select count(*) from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select count(*) from INFORMATION_SCHEMA.`TABLES` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"foo\")]", + "SysTableTableSchema": "[VARCHAR(\"performance_schema\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select count(*) from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select count(*) from INFORMATION_SCHEMA.`TABLES` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"foo\")]", + "SysTableTableSchema": "[VARCHAR(\"performance_schema\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "subquery of information_schema with itself", + "query": "select TABLES.CHECKSUM from information_schema.`TABLES` where `TABLE_NAME` in (select `TABLE_NAME` from information_schema.`COLUMNS`)", + "v3-plan": "symbol `TABLES`.`CHECKSUM` not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select TABLES.CHECKSUM from information_schema.`TABLES` where `TABLE_NAME` in (select `TABLE_NAME` from information_schema.`COLUMNS`)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select `TABLES`.`CHECKSUM` from information_schema.`TABLES` where 1 != 1", + "Query": "select `TABLES`.`CHECKSUM` from information_schema.`TABLES` where TABLE_NAME in (select TABLE_NAME from information_schema.`COLUMNS`)", + "Table": "information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.COLUMNS", + "information_schema.TABLES" + ] + } + }, + { + "comment": "query trying to query two different keyspaces at the same time", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "information_schema query using database() func", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = database()", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = database()", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "table_schema predicate the wrong way around", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "table_name predicate against a routed table", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and TABLE_NAME = :TABLE_NAME", + "SysTableTableName": "[TABLE_NAME:VARCHAR(\"route1\")]", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and TABLE_NAME = :TABLE_NAME", + "SysTableTableName": "[TABLE_NAME:VARCHAR(\"route1\")]", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "information_schema query with additional predicates", + "query": "SELECT `TABLE_NAME` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and DATA_FREE = 42", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT `TABLE_NAME` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and DATA_FREE = 42", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_NAME from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and DATA_FREE = 42", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT `TABLE_NAME` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and DATA_FREE = 42", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_NAME from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and DATA_FREE = 42", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "able to isolate table_schema value even when hidden inside of ORs", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and DATA_FREE = 42) OR (TABLE_SCHEMA = 'ks' and CHECKSUM = 'value')", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and DATA_FREE = 42) OR (TABLE_SCHEMA = 'ks' and CHECKSUM = 'value')", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and (DATA_FREE = 42 or TABLE_SCHEMA = 'ks') and (DATA_FREE = 42 or `CHECKSUM` = 'value')", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and DATA_FREE = 42) OR (TABLE_SCHEMA = 'ks' and CHECKSUM = 'value')", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and (DATA_FREE = 42 or TABLE_SCHEMA = 'ks') and (DATA_FREE = 42 or `CHECKSUM` = 'value')", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "expand star with information schema", + "query": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name from (select a.* from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name from (select a.* from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + }, + "TablesUsed": [ + "information_schema.key_column_usage" + ] + } + }, + { + "comment": "expand star with information schema in a derived table", + "query": "select x.table_name from (select a.* from information_schema.key_column_usage a) x join user on x.`COLUMN_NAME` = user.id", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x join user on x.`COLUMN_NAME` = user.id", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0", + "JoinVars": { + "x_COLUMN_NAME": 1 + }, + "TableName": "information_schema.key_column_usage_`user`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name, x.COLUMN_NAME from (select a.* from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name, x.COLUMN_NAME from (select a.* from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where `user`.id = :x_COLUMN_NAME", + "Table": "`user`", + "Values": [ + ":x_COLUMN_NAME" + ], + "Vindex": "user_index" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x join user on x.`COLUMN_NAME` = user.id", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0", + "JoinVars": { + "x_COLUMN_NAME": 0 + }, + "TableName": "information_schema.key_column_usage_`user`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where `user`.id = :x_COLUMN_NAME", + "Table": "`user`", + "Values": [ + ":x_COLUMN_NAME" + ], + "Vindex": "user_index" + } + ] + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "user.user" + ] + } + }, + { + "comment": "join of information_schema queries with select stars exprs", + "query": "select a.*, b.* from information_schema.a a, information_schema.b b", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select a.*, b.* from information_schema.a a, information_schema.b b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.*, b.* from information_schema.a as a, information_schema.b as b where 1 != 1", + "Query": "select a.*, b.* from information_schema.a as a, information_schema.b as b", + "Table": "information_schema.a, information_schema.b" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select a.*, b.* from information_schema.a a, information_schema.b b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.*, b.* from information_schema.a as a, information_schema.b as b where 1 != 1", + "Query": "select a.*, b.* from information_schema.a as a, information_schema.b as b", + "Table": "information_schema.a, information_schema.b" + }, + "TablesUsed": [ + "information_schema.a", + "information_schema.b" + ] + } + }, + { + "comment": "join two routes with SysTableTableName entries in LHS and RHS", + "query": "select a.table_name from (select * from information_schema.key_column_usage a where a.table_name = 'users') a join (select * from information_schema.referential_constraints where table_name = 'users') b", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select a.table_name from (select * from information_schema.key_column_usage a where a.table_name = 'users') a join (select * from information_schema.referential_constraints where table_name = 'users') b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.table_name from (select * from information_schema.key_column_usage as a where 1 != 1) as a join (select * from information_schema.referential_constraints where 1 != 1) as b where 1 != 1", + "Query": "select a.table_name from (select * from information_schema.key_column_usage as a where a.table_name = :a_table_name) as a join (select * from information_schema.referential_constraints where table_name = :table_name) as b", + "SysTableTableName": "[a_table_name:VARCHAR(\"users\"), table_name:VARCHAR(\"users\")]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select a.table_name from (select * from information_schema.key_column_usage a where a.table_name = 'users') a join (select * from information_schema.referential_constraints where table_name = 'users') b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as a, (select CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE, TABLE_NAME, REFERENCED_TABLE_NAME from information_schema.referential_constraints where 1 != 1) as b where 1 != 1", + "Query": "select a.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where a.table_name = :a_table_name) as a, (select CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE, TABLE_NAME, REFERENCED_TABLE_NAME from information_schema.referential_constraints where table_name = :table_name) as b", + "SysTableTableName": "[a_table_name:VARCHAR(\"users\"), table_name:VARCHAR(\"users\")]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] + } + }, + { + "comment": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "query": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "v3-plan": "unsupported: cross-shard query with aggregates", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sum(found) from (select 1 as found from information_schema.`tables` where 1 != 1 union all (select 1 as found from information_schema.views where 1 != 1)) as t where 1 != 1", + "Query": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)) as t", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "union as a derived table", + "query": "select found from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select found from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 0 + ], + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.views where 1 != 1", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1", + "SysTableTableSchema": "[VARCHAR(\"music\")]", + "Table": "information_schema.views" + } + ] + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select found from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select found from (select 1 as found from information_schema.`tables` where 1 != 1 union all (select 1 as found from information_schema.views where 1 != 1)) as t where 1 != 1", + "Query": "select found from (select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)) as t", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "merge system schema queries as long as they have any same table_schema", + "query": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.views where 1 != 1", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"user\")]", + "Table": "information_schema.views" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1 union all (select 1 as found from information_schema.views where 1 != 1)", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "merge system schema queries as long as they have any same table_name", + "query": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.views where 1 != 1", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"user\")]", + "Table": "information_schema.views" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1 union all (select 1 as found from information_schema.views where 1 != 1)", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "merge union subquery with outer query referencing the same system schemas", + "query": "select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' and exists (select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' union all (select 1 as found from information_schema.views where table_name = 'music' and table_name = 'user' limit 1))", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' and exists (select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' union all (select 1 as found from information_schema.views where table_name = 'music' and table_name = 'user' limit 1))", + "Instructions": { + "OperatorType": "Subquery", + "Variant": "PulloutExists", + "PulloutVars": [ + "__sq_has_values1", + "__sq1" + ], + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_name = :table_name2 and table_name = :table_name3", + "SysTableTableName": "[table_name2:VARCHAR(\"music\"), table_name3:VARCHAR(\"Music\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.views where 1 != 1", + "Query": "select 1 as found from information_schema.views where table_name = :table_name4 and table_name = :table_name5 limit 1", + "SysTableTableName": "[table_name4:VARCHAR(\"music\"), table_name5:VARCHAR(\"user\")]", + "Table": "information_schema.views" + } + ] + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_name = :table_name and table_name = :table_name1 and :__sq_has_values1", + "SysTableTableName": "[table_name1:VARCHAR(\"Music\"), table_name:VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' and exists (select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' union all (select 1 as found from information_schema.views where table_name = 'music' and table_name = 'user' limit 1))", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_name = :table_name and table_name = :table_name1 and exists (select 1 as found from information_schema.`tables` where table_name = :table_name2 and table_name = :table_name3 union all (select 1 as found from information_schema.views where table_name = :table_name4 and table_name = :table_name5 limit 1))", + "SysTableTableName": "[table_name1:VARCHAR(\"Music\"), table_name2:VARCHAR(\"music\"), table_name3:VARCHAR(\"Music\"), table_name4:VARCHAR(\"music\"), table_name5:VARCHAR(\"user\"), table_name:VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "merge even one side have schema name in derived table", + "query": "select * from (select TABLE_NAME from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select TABLE_NAME from information_schema.columns) dt", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from (select TABLE_NAME from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select TABLE_NAME from information_schema.columns) dt", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 0 + ], + "Inputs": [ + { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`tables` as t where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`tables` as t where t.TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"a\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`columns` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`columns`", + "Table": "information_schema.`columns`" + } + ] + } + ] + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from (select TABLE_NAME from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select TABLE_NAME from information_schema.columns) dt", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select dt.TABLE_NAME from (select TABLE_NAME from information_schema.`tables` as t where 1 != 1 union select TABLE_NAME from information_schema.`columns` where 1 != 1) as dt where 1 != 1", + "Query": "select dt.TABLE_NAME from (select TABLE_NAME from information_schema.`tables` as t where t.TABLE_SCHEMA = :__vtschemaname union select TABLE_NAME from information_schema.`columns`) as dt", + "SysTableTableSchema": "[VARCHAR(\"a\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.columns", + "information_schema.tables" + ] + } + }, + { + "comment": "merge even one side have schema name in subquery", + "query": "select `COLLATION_NAME` from information_schema.`COLUMNS` t where `COLUMN_NAME` in (select `COLUMN_NAME` from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select `COLUMN_NAME` from information_schema.columns)", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select `COLLATION_NAME` from information_schema.`COLUMNS` t where `COLUMN_NAME` in (select `COLUMN_NAME` from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select `COLUMN_NAME` from information_schema.columns)", + "Instructions": { + "OperatorType": "Subquery", + "Variant": "PulloutIn", + "PulloutVars": [ + "__sq_has_values1", + "__sq1" + ], + "Inputs": [ + { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select COLUMN_NAME from information_schema.`tables` as t where 1 != 1", + "Query": "select COLUMN_NAME from information_schema.`tables` as t where t.TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"a\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select COLUMN_NAME from information_schema.`columns` where 1 != 1", + "Query": "select COLUMN_NAME from information_schema.`columns`", + "Table": "information_schema.`columns`" + } + ] + } + ] + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select COLLATION_NAME from information_schema.`COLUMNS` as t where 1 != 1", + "Query": "select COLLATION_NAME from information_schema.`COLUMNS` as t where :__sq_has_values1 = 1 and COLUMN_NAME in ::__sq1", + "Table": "information_schema.`COLUMNS`" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select `COLLATION_NAME` from information_schema.`COLUMNS` t where `COLUMN_NAME` in (select `COLUMN_NAME` from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select `COLUMN_NAME` from information_schema.columns)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select COLLATION_NAME from information_schema.`COLUMNS` as t where 1 != 1", + "Query": "select COLLATION_NAME from information_schema.`COLUMNS` as t where COLUMN_NAME in (select COLUMN_NAME from information_schema.`tables` as t where t.TABLE_SCHEMA = :__vtschemaname union select COLUMN_NAME from information_schema.`columns`)", + "SysTableTableSchema": "[VARCHAR(\"a\")]", + "Table": "information_schema.`COLUMNS`" + }, + "TablesUsed": [ + "information_schema.COLUMNS", + "information_schema.columns", + "information_schema.tables" + ] + } + }, + { + "comment": "table_schema OR predicate\n# It is unsupported because we do not route queries to multiple keyspaces right now", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + } +] diff --git a/go/vt/vtgate/planbuilder/testdata/systemtables_cases.json b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json similarity index 74% rename from go/vt/vtgate/planbuilder/testdata/systemtables_cases.json rename to go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json index 235fc1c398b..9d4c8e81e8b 100644 --- a/go/vt/vtgate/planbuilder/testdata/systemtables_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json @@ -2,7 +2,7 @@ { "comment": "Single information_schema query", "query": "select col from information_schema.foo", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select col from information_schema.foo", "Instructions": { @@ -16,12 +16,13 @@ "Query": "select col from information_schema.foo", "Table": "information_schema.foo" } - } + }, + "gen4-plan": "symbol col not found" }, { "comment": "',' join information_schema", "query": "select a.id,b.id from information_schema.a as a, information_schema.b as b", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select a.id,b.id from information_schema.a as a, information_schema.b as b", "Instructions": { @@ -35,12 +36,13 @@ "Query": "select a.id, b.id from information_schema.a as a, information_schema.b as b", "Table": "information_schema.a, information_schema.b" } - } + }, + "gen4-plan": "symbol a.id not found" }, { "comment": "information schema query that uses table_schema", "query": "select column_name from information_schema.columns where table_schema = (select schema())", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select column_name from information_schema.columns where table_schema = (select schema())", "Instructions": { @@ -54,6 +56,24 @@ "Query": "select column_name from information_schema.`columns` where table_schema = schema()", "Table": "information_schema.`columns`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select column_name from information_schema.columns where table_schema = (select schema())", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.`columns` where 1 != 1", + "Query": "select column_name from information_schema.`columns` where table_schema = schema()", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns" + ] } }, { @@ -87,13 +107,17 @@ "FieldQuery": "select * from information_schema.a, information_schema.b where 1 != 1", "Query": "select * from information_schema.a, information_schema.b", "Table": "information_schema.a, information_schema.b" - } + }, + "TablesUsed": [ + "information_schema.a", + "information_schema.b" + ] } }, { "comment": "access to unqualified column names in information_schema", "query": "select * from information_schema.a where b=10", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select * from information_schema.a where b=10", "Instructions": { @@ -107,7 +131,8 @@ "Query": "select * from information_schema.a where b = 10", "Table": "information_schema.a" } - } + }, + "gen4-plan": "symbol b not found" }, { "comment": "access to qualified column names in information_schema", @@ -127,9 +152,14 @@ "Table": "information_schema.a" } }, - "gen4-plan": { + "gen4-plan": "symbol information_schema.a.b not found" + }, + { + "comment": "union of information_schema", + "query": "select * from information_schema.a union select * from information_schema.b", + "v3-plan": { "QueryType": "SELECT", - "Original": "select * from information_schema.a where information_schema.a.b=10", + "Original": "select * from information_schema.a union select * from information_schema.b", "Instructions": { "OperatorType": "Route", "Variant": "DBA", @@ -137,16 +167,12 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from information_schema.a where 1 != 1", - "Query": "select * from information_schema.a where a.b = 10", + "FieldQuery": "select * from information_schema.a where 1 != 1 union select * from information_schema.b where 1 != 1", + "Query": "select * from information_schema.a union select * from information_schema.b", "Table": "information_schema.a" } - } - }, - { - "comment": "union of information_schema", - "query": "select * from information_schema.a union select * from information_schema.b", - "plan": { + }, + "gen4-plan": { "QueryType": "SELECT", "Original": "select * from information_schema.a union select * from information_schema.b", "Instructions": { @@ -159,7 +185,11 @@ "FieldQuery": "select * from information_schema.a where 1 != 1 union select * from information_schema.b where 1 != 1", "Query": "select * from information_schema.a union select * from information_schema.b", "Table": "information_schema.a" - } + }, + "TablesUsed": [ + "information_schema.a", + "information_schema.b" + ] } }, { @@ -208,6 +238,30 @@ "Original": "select * from information_schema.tables where table_schema = 'user' union select * from information_schema.tables where table_schema = 'main'", "Instructions": { "OperatorType": "Distinct", + "Collations": [ + "(0:21)", + "(1:22)", + "(2:23)", + "(3:24)", + "(4:25)", + "5: binary", + "(6:26)", + "7: binary", + "8: binary", + "9: binary", + "10: binary", + "11: binary", + "12: binary", + "13: binary", + "(14:27)", + "(15:28)", + "(16:29)", + "(17:30)", + "18: binary", + "(19:31)", + "(20:32)" + ], + "ResultColumns": 21, "Inputs": [ { "OperatorType": "Concatenate", @@ -219,8 +273,8 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from information_schema.`tables` where 1 != 1", - "Query": "select distinct * from information_schema.`tables` where table_schema = :__vtschemaname", + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where 1 != 1", + "Query": "select distinct TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where table_schema = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"user\")]", "Table": "information_schema.`tables`" }, @@ -231,15 +285,18 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from information_schema.`tables` where 1 != 1", - "Query": "select distinct * from information_schema.`tables` where table_schema = :__vtschemaname", + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where 1 != 1", + "Query": "select distinct TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where table_schema = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"main\")]", "Table": "information_schema.`tables`" } ] } ] - } + }, + "TablesUsed": [ + "information_schema.tables" + ] } }, { @@ -277,7 +334,11 @@ "SysTableTableName": "[KCU_TABLE_NAME:VARCHAR(\"data_type_table\")]", "SysTableTableSchema": "[VARCHAR(\"test\")]", "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" - } + }, + "TablesUsed": [ + "information_schema.KEY_COLUMN_USAGE", + "information_schema.REFERENTIAL_CONSTRAINTS" + ] } }, { @@ -321,9 +382,14 @@ ] } }, - "gen4-plan": { + "gen4-plan": "symbol KCU.DELETE_RULE not found" + }, + { + "comment": "information_schema.routines", + "query": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", + "v3-plan": { "QueryType": "SELECT", - "Original": "SELECT KCU.DELETE_RULE, S.UPDATE_RULE FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME, INFORMATION_SCHEMA.K AS S WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.TABLE_NAME = 'data_type_table' AND S.TABLE_SCHEMA = 'test' AND S.TABLE_NAME = 'sc' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Original": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", "Instructions": { "OperatorType": "Route", "Variant": "DBA", @@ -331,18 +397,13 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select KCU.DELETE_RULE, S.UPDATE_RULE from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC, INFORMATION_SCHEMA.K as S where 1 != 1", - "Query": "select KCU.DELETE_RULE, S.UPDATE_RULE from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC, INFORMATION_SCHEMA.K as S where S.TABLE_SCHEMA = :__vtschemaname and S.TABLE_NAME = :S_TABLE_NAME and KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.TABLE_NAME = :KCU_TABLE_NAME1 and KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", - "SysTableTableName": "[KCU_TABLE_NAME1:VARCHAR(\"data_type_table\"), KCU_TABLE_NAME:VARCHAR(\"data_type_table\"), S_TABLE_NAME:VARCHAR(\"sc\")]", - "SysTableTableSchema": "[VARCHAR(\"test\"), VARCHAR(\"test\")]", - "Table": "INFORMATION_SCHEMA.K, INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" + "FieldQuery": "select routine_name as `name`, routine_definition as definition from information_schema.routines where 1 != 1", + "Query": "select routine_name as `name`, routine_definition as definition from information_schema.routines where ROUTINE_SCHEMA = :__vtschemaname and ROUTINE_TYPE = 'PROCEDURE'", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.routines" } - } - }, - { - "comment": "information_schema.routines", - "query": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", - "plan": { + }, + "gen4-plan": { "QueryType": "SELECT", "Original": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", "Instructions": { @@ -356,13 +417,16 @@ "Query": "select routine_name as `name`, routine_definition as definition from information_schema.routines where ROUTINE_SCHEMA = :__vtschemaname and ROUTINE_TYPE = 'PROCEDURE'", "SysTableTableSchema": "[:v1]", "Table": "information_schema.routines" - } + }, + "TablesUsed": [ + "information_schema.routines" + ] } }, { "comment": "information_schema table sizes", "query": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", "Instructions": { @@ -377,6 +441,25 @@ "SysTableTableSchema": "[:v1]", "Table": "information_schema.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sum(data_length + index_length) as size from information_schema.`TABLES` where 1 != 1", + "Query": "select sum(data_length + index_length) as size from information_schema.`TABLES` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { @@ -412,7 +495,11 @@ "Query": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu, information_schema.referential_constraints as rc where kcu.table_schema = :__vtschemaname and kcu.referenced_column_name is not null and rc.constraint_schema = :__vtschemaname and kcu.constraint_name = rc.constraint_name order by ordinal_position asc", "SysTableTableSchema": "[:v1, :v2]", "Table": "information_schema.key_column_usage, information_schema.referential_constraints" - } + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] } }, { @@ -445,16 +532,20 @@ "Sharded": false }, "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where 1 != 1", - "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = database() and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = :fk_table_name", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = database() and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = :fk_table_name and rc.constraint_schema = fk.constraint_schema and rc.constraint_name = fk.constraint_name", "SysTableTableName": "[fk_table_name:VARCHAR(\":vtg1\"), rc_table_name:VARCHAR(\":vtg1\")]", "Table": "information_schema.key_column_usage, information_schema.referential_constraints" - } + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] } }, { "comment": "rails_query 2", "query": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", "Instructions": { @@ -469,12 +560,31 @@ "SysTableTableSchema": "[VARCHAR(\"user\")]", "Table": "information_schema.schemata" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, SQL_PATH, DEFAULT_ENCRYPTION from information_schema.schemata where 1 != 1", + "Query": "select CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, SQL_PATH, DEFAULT_ENCRYPTION from information_schema.schemata where schema_name = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.schemata" + }, + "TablesUsed": [ + "information_schema.schemata" + ] } }, { "comment": "rails_query 3", "query": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", "Instructions": { @@ -490,6 +600,26 @@ "SysTableTableSchema": "[VARCHAR(\"schema_name\")]", "Table": "information_schema.`tables`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_comment from information_schema.`tables` where 1 != 1", + "Query": "select table_comment from information_schema.`tables` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"schema_name\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] } }, { @@ -523,11 +653,15 @@ "Sharded": false }, "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where 1 != 1", - "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = :__vtschemaname and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = :__vtschemaname and fk.table_name = :fk_table_name", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = :__vtschemaname and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = :__vtschemaname and fk.table_name = :fk_table_name and rc.constraint_schema = fk.constraint_schema and rc.constraint_name = fk.constraint_name", "SysTableTableName": "[fk_table_name:VARCHAR(\"table_name\"), rc_table_name:VARCHAR(\"table_name\")]", "SysTableTableSchema": "[VARCHAR(\"table_schema\"), VARCHAR(\"table_schema\")]", "Table": "information_schema.key_column_usage, information_schema.referential_constraints" - } + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] } }, { @@ -561,17 +695,21 @@ "Sharded": false }, "FieldQuery": "select cc.constraint_name as `name`, cc.check_clause as expression from information_schema.check_constraints as cc, information_schema.table_constraints as tc where 1 != 1", - "Query": "select cc.constraint_name as `name`, cc.check_clause as expression from information_schema.check_constraints as cc, information_schema.table_constraints as tc where cc.constraint_schema = :__vtschemaname and tc.table_schema = :__vtschemaname and tc.table_name = :tc_table_name", + "Query": "select cc.constraint_name as `name`, cc.check_clause as expression from information_schema.check_constraints as cc, information_schema.table_constraints as tc where cc.constraint_schema = :__vtschemaname and tc.table_schema = :__vtschemaname and tc.table_name = :tc_table_name and cc.constraint_schema = tc.constraint_schema and cc.constraint_name = tc.constraint_name", "SysTableTableName": "[tc_table_name:VARCHAR(\"table_name\")]", "SysTableTableSchema": "[VARCHAR(\"constraint_schema\"), VARCHAR(\"table_schema\")]", "Table": "information_schema.check_constraints, information_schema.table_constraints" - } + }, + "TablesUsed": [ + "information_schema.check_constraints", + "information_schema.table_constraints" + ] } }, { "comment": "rails_query 6", "query": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", "Instructions": { @@ -587,12 +725,32 @@ "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", "Table": "information_schema.statistics" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.statistics where 1 != 1", + "Query": "select column_name from information_schema.statistics where index_name = 'PRIMARY' and table_schema = :__vtschemaname and table_name = :table_name order by seq_in_index asc", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.statistics" + }, + "TablesUsed": [ + "information_schema.statistics" + ] } }, { "comment": "rails_query 7", "query": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", "Instructions": { @@ -608,12 +766,32 @@ "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", "Table": "information_schema.`columns`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select generation_expression from information_schema.`columns` where 1 != 1", + "Query": "select generation_expression from information_schema.`columns` where table_schema = :__vtschemaname and table_name = :table_name and column_name = 'column_name'", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns" + ] } }, { "comment": "rails_query 8", "query": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", "Instructions": { @@ -627,12 +805,30 @@ "Query": "select id from information_schema.`processlist` where info like '% FOR UPDATE'", "Table": "information_schema.`processlist`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id from information_schema.`processlist` where 1 != 1", + "Query": "select id from information_schema.`processlist` where info like '% FOR UPDATE'", + "Table": "information_schema.`processlist`" + }, + "TablesUsed": [ + "information_schema.processlist" + ] } }, { "comment": "rails_query 9", "query": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", "Instructions": { @@ -647,6 +843,25 @@ "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", "Table": "information_schema.`tables`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where table_schema = :__vtschemaname) as _subquery", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] } }, { @@ -679,17 +894,20 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select table_name from (select * from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", - "Query": "select table_name from (select * from information_schema.`tables` where table_schema = :__vtschemaname and table_type = 'table_type' and table_name = 'table_name') as _subquery", + "FieldQuery": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where table_schema = :__vtschemaname and table_type = 'table_type' and table_name = 'table_name') as _subquery", "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables" + ] } }, { "comment": "two predicates specifying the database for the same table work if the database is the same", "query": "SELECT cc.constraint_name AS 'name' FROM information_schema.check_constraints cc WHERE cc.constraint_schema = 'a' AND cc.table_schema = 'a'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT cc.constraint_name AS 'name' FROM information_schema.check_constraints cc WHERE cc.constraint_schema = 'a' AND cc.table_schema = 'a'", "Instructions": { @@ -704,12 +922,13 @@ "SysTableTableSchema": "[VARCHAR(\"a\"), VARCHAR(\"a\")]", "Table": "information_schema.check_constraints" } - } + }, + "gen4-plan": "symbol cc.table_schema not found" }, { "comment": "system schema in where clause of information_schema query", "query": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", "Instructions": { @@ -725,12 +944,32 @@ "SysTableTableSchema": "[VARCHAR(\"performance_schema\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select count(*) from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select count(*) from INFORMATION_SCHEMA.`TABLES` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"foo\")]", + "SysTableTableSchema": "[VARCHAR(\"performance_schema\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "subquery of information_schema with itself", "query": "select * from information_schema.a where id in (select * from information_schema.b)", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select * from information_schema.a where id in (select * from information_schema.b)", "Instructions": { @@ -744,12 +983,13 @@ "Query": "select * from information_schema.a where id in (select * from information_schema.b)", "Table": "information_schema.a" } - } + }, + "gen4-plan": "symbol id not found" }, { "comment": "query trying to query two different keyspaces at the same time", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", "Instructions": { @@ -764,12 +1004,31 @@ "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "information_schema query using database() func", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", "Instructions": { @@ -783,12 +1042,30 @@ "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = database()", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = database()", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "table_schema predicate the wrong way around", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", "Instructions": { @@ -803,12 +1080,31 @@ "SysTableTableSchema": "[VARCHAR(\"ks\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "table_name predicate against a routed table", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", "Instructions": { @@ -824,12 +1120,32 @@ "SysTableTableSchema": "[VARCHAR(\"ks\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and TABLE_NAME = :TABLE_NAME", + "SysTableTableName": "[TABLE_NAME:VARCHAR(\"route1\")]", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "information_schema query with additional predicates", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and other_column = 42", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and other_column = 42", "Instructions": { @@ -844,12 +1160,13 @@ "SysTableTableSchema": "[VARCHAR(\"ks\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } - } + }, + "gen4-plan": "symbol other_column not found" }, { "comment": "able to isolate table_schema value even when hidden inside of ORs", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and other_column = 42) OR (TABLE_SCHEMA = 'ks' and foobar = 'value')", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and other_column = 42) OR (TABLE_SCHEMA = 'ks' and foobar = 'value')", "Instructions": { @@ -864,12 +1181,13 @@ "SysTableTableSchema": "[VARCHAR(\"ks\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } - } + }, + "gen4-plan": "symbol other_column not found" }, { "comment": "expand star with information schema", "query": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", "Instructions": { @@ -883,6 +1201,24 @@ "Query": "select x.table_name from (select a.* from information_schema.key_column_usage as a) as x", "Table": "information_schema.key_column_usage" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + }, + "TablesUsed": [ + "information_schema.key_column_usage" + ] } }, { @@ -929,55 +1265,12 @@ ] } }, - "gen4-plan": { - "QueryType": "SELECT", - "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x join user on x.id = user.id", - "Instructions": { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "L:1", - "JoinVars": { - "x_id": 0 - }, - "TableName": "information_schema.key_column_usage_`user`", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "DBA", - "Keyspace": { - "Name": "main", - "Sharded": false - }, - "FieldQuery": "select x.id, x.table_name from (select a.* from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", - "Query": "select x.id, x.table_name from (select a.* from information_schema.key_column_usage as a) as x", - "Table": "information_schema.key_column_usage" - }, - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select 1 from `user` where 1 != 1", - "Query": "select 1 from `user` where `user`.id = :x_id", - "Table": "`user`", - "Values": [ - ":x_id" - ], - "Vindex": "user_index" - } - ] - }, - "TablesUsed": [ - "user.user" - ] - } + "gen4-plan": "symbol x.id not found" }, { "comment": "join of information_schema queries with select stars exprs", "query": "select a.*, b.* from information_schema.a a, information_schema.b b", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select a.*, b.* from information_schema.a a, information_schema.b b", "Instructions": { @@ -991,6 +1284,25 @@ "Query": "select a.*, b.* from information_schema.a as a, information_schema.b as b", "Table": "information_schema.a, information_schema.b" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select a.*, b.* from information_schema.a a, information_schema.b b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.*, b.* from information_schema.a as a, information_schema.b as b where 1 != 1", + "Query": "select a.*, b.* from information_schema.a as a, information_schema.b as b", + "Table": "information_schema.a, information_schema.b" + }, + "TablesUsed": [ + "information_schema.a", + "information_schema.b" + ] } }, { @@ -1022,14 +1334,19 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select a.table_name from (select * from information_schema.key_column_usage as a where 1 != 1) as a, (select * from information_schema.referential_constraints where 1 != 1) as b where 1 != 1", - "Query": "select a.table_name from (select * from information_schema.key_column_usage as a where a.table_name = :a_table_name) as a, (select * from information_schema.referential_constraints where table_name = :table_name) as b", + "FieldQuery": "select a.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as a, (select CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE, TABLE_NAME, REFERENCED_TABLE_NAME from information_schema.referential_constraints where 1 != 1) as b where 1 != 1", + "Query": "select a.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where a.table_name = :a_table_name) as a, (select CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE, TABLE_NAME, REFERENCED_TABLE_NAME from information_schema.referential_constraints where table_name = :table_name) as b", "SysTableTableName": "[a_table_name:VARCHAR(\"users\"), table_name:VARCHAR(\"users\")]", "Table": "information_schema.key_column_usage, information_schema.referential_constraints" - } + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] } }, { + "comment": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", "query": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", "v3-plan": "unsupported: cross-shard query with aggregates", "gen4-plan": { @@ -1046,7 +1363,11 @@ "Query": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)) as t", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"music\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1107,7 +1428,11 @@ "Query": "select found from (select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)) as t", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"music\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1160,7 +1485,11 @@ "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1213,7 +1542,11 @@ "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1288,7 +1621,11 @@ "Query": "select 1 as found from information_schema.`tables` where table_name = :table_name and table_name = :table_name1 and exists (select 1 as found from information_schema.`tables` where table_name = :table_name2 and table_name = :table_name3 union all (select 1 as found from information_schema.views where table_name = :table_name4 and table_name = :table_name5 limit 1))", "SysTableTableName": "[table_name1:VARCHAR(\"Music\"), table_name2:VARCHAR(\"music\"), table_name3:VARCHAR(\"Music\"), table_name4:VARCHAR(\"music\"), table_name5:VARCHAR(\"user\"), table_name:VARCHAR(\"music\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1339,22 +1676,7 @@ ] } }, - "gen4-plan": { - "QueryType": "SELECT", - "Original": "select id from (select id from information_schema.table t where t.schema_name = 'a' union select id from information_schema.columns) dt", - "Instructions": { - "OperatorType": "Route", - "Variant": "DBA", - "Keyspace": { - "Name": "main", - "Sharded": false - }, - "FieldQuery": "select id from (select id from information_schema.`table` as t where 1 != 1 union select id from information_schema.`columns` where 1 != 1) as dt where 1 != 1", - "Query": "select id from (select id from information_schema.`table` as t where t.schema_name = :__vtschemaname union select id from information_schema.`columns`) as dt", - "SysTableTableSchema": "[VARCHAR(\"a\")]", - "Table": "information_schema.`table`" - } - } + "gen4-plan": "symbol id not found" }, { "comment": "merge even one side have schema name in subquery", @@ -1417,30 +1739,20 @@ ] } }, - "gen4-plan": { - "QueryType": "SELECT", - "Original": "select id from information_schema.random t where t.col in (select id from information_schema.table t where t.schema_name = 'a' union select id from information_schema.columns)", - "Instructions": { - "OperatorType": "Route", - "Variant": "DBA", - "Keyspace": { - "Name": "main", - "Sharded": false - }, - "FieldQuery": "select id from information_schema.random as t where 1 != 1", - "Query": "select id from information_schema.random as t where t.col in (select id from information_schema.`table` as t where t.schema_name = :__vtschemaname union select id from information_schema.`columns`)", - "SysTableTableSchema": "[VARCHAR(\"a\")]", - "Table": "information_schema.random" - } - } + "gen4-plan": "symbol id not found" }, { "comment": "systable union query in derived table with constraint on outside (star projection)", "query": "select * from (select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `constraint_name` = 'primary'", "v3-plan": "symbol constraint_name not found in table or subquery", - "gen4-plan": { + "gen4-plan": "can't push predicates on concatenate" + }, + { + "comment": "table_schema OR predicate\n# It is unsupported because we do not route queries to multiple keyspaces right now", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "v3-plan": { "QueryType": "SELECT", - "Original": "select * from (select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `constraint_name` = 'primary'", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", "Instructions": { "OperatorType": "Route", "Variant": "DBA", @@ -1448,18 +1760,12 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from (select * from information_schema.key_column_usage as kcu where 1 != 1 union select * from information_schema.key_column_usage as kcu where 1 != 1) as kcu where 1 != 1", - "Query": "select * from (select * from information_schema.key_column_usage as kcu where kcu.table_schema = :__vtschemaname and kcu.table_name = :kcu_table_name and constraint_name = 'primary' union select * from information_schema.key_column_usage as kcu where kcu.table_schema = :__vtschemaname and kcu.table_name = :kcu_table_name1 and constraint_name = 'primary') as kcu", - "SysTableTableName": "[kcu_table_name1:VARCHAR(\"music\"), kcu_table_name:VARCHAR(\"user_extra\")]", - "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"user\")]", - "Table": "information_schema.key_column_usage" + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", + "Table": "INFORMATION_SCHEMA.`TABLES`" } - } - }, - { - "comment": "table_schema OR predicate\n# It is unsupported because we do not route queries to multiple keyspaces right now", - "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", - "plan": { + }, + "gen4-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", "Instructions": { @@ -1469,10 +1775,13 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", - "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", "Table": "INFORMATION_SCHEMA.`TABLES`" - } + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.json b/go/vt/vtgate/planbuilder/testdata/union_cases.json index e32d28c862c..c527b69de7c 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.json @@ -660,6 +660,7 @@ ] }, "TablesUsed": [ + "information_schema.a", "main.unsharded" ] } @@ -739,6 +740,7 @@ ] }, "TablesUsed": [ + "information_schema.a", "main.unsharded" ] } @@ -2286,6 +2288,7 @@ "plan": "can't do ORDER BY on top of UNION" }, { + "comment": "select 1 from (select id+42 as foo from user union select 1+id as foo from unsharded) as t", "query": "select 1 from (select id+42 as foo from user union select 1+id as foo from unsharded) as t", "v3-plan": "unsupported: expression on results of a cross-shard subquery", "gen4-plan": { @@ -2340,4 +2343,4 @@ ] } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 7e908b958f4..1c49a7368fd 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -273,26 +273,32 @@ "plan": "unsupported: REPLACE INTO with sharded schema" }, { + "comment": "select keyspace_id from user_index where id = 1 and id = 2", "query": "select keyspace_id from user_index where id = 1 and id = 2", "plan": "unsupported: where clause for vindex function must be of the form id = or id in(,...) (multiple filters)" }, { + "comment": "select keyspace_id from user_index where func(id)", "query": "select keyspace_id from user_index where func(id)", "plan": "unsupported: where clause for vindex function must be of the form id = or id in(,...) (not a comparison)" }, { + "comment": "select keyspace_id from user_index where id > 1", "query": "select keyspace_id from user_index where id > 1", "plan": "unsupported: where clause for vindex function must be of the form id = or id in(,...) (not equality)" }, { + "comment": "select keyspace_id from user_index where 1 = id", "query": "select keyspace_id from user_index where 1 = id", "plan": "unsupported: where clause for vindex function must be of the form id = or id in(,...) (lhs is not a column)" }, { + "comment": "select keyspace_id from user_index where keyspace_id = 1", "query": "select keyspace_id from user_index where keyspace_id = 1", "plan": "unsupported: where clause for vindex function must be of the form id = or id in(,...) (lhs is not id)" }, { + "comment": "select keyspace_id from user_index where id = id+1", "query": "select keyspace_id from user_index where id = id+1", "plan": "unsupported: where clause for vindex function must be of the form id = or id in(,...) (rhs is not a value)" }, @@ -307,6 +313,7 @@ "plan": "unsupported: where clause for vindex function must be of the form id = or id in(,...) (where clause missing)" }, { + "comment": "select func(keyspace_id) from user_index where id = :id", "query": "select func(keyspace_id) from user_index where id = :id", "plan": "unsupported: expression on results of a vindex function" }, @@ -392,11 +399,6 @@ "query": "select distinct a, b as a from user", "plan": "generating order by clause: ambiguous symbol reference: a" }, - { - "comment": "subquery of information_schema with itself and star expression in outer select", - "query": "select a.*, u.id from information_schema.a a, user u where a.id in (select * from information_schema.b)", - "plan": "unsupported: '*' expression in cross-shard query" - }, { "comment": "outer and inner subquery route reference the same \"uu.id\" name\n# but they refer to different things. The first reference is to the outermost query,\n# and the second reference is to the innermost 'from' subquery.\n# This query will never work as the inner derived table is only selecting one of the column", "query": "select id2 from user uu where id in (select id from user where id = uu.id and user.col in (select col from (select id from user_extra where user_id = 5) uu where uu.user_id = uu.id))", @@ -449,7 +451,7 @@ "comment": "systable union query in derived table with constraint on outside (without star projection)", "query": "select id from (select id from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select id from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `id` = 'primary'", "v3-plan": "unsupported: filtering on results of cross-shard subquery", - "gen4-plan": "can't push predicates on concatenate" + "gen4-plan": "symbol id not found" }, { "comment": "insert having subquery in row values", @@ -471,4 +473,4 @@ "query": "select get_lock('xyz', 10), 1 from dual", "plan": "unsupported: lock function and other expression in same select query" } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/semantics/analyzer.go b/go/vt/vtgate/semantics/analyzer.go index ba30f0392c0..a0e1ec2eba6 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -63,7 +63,7 @@ func newAnalyzer(dbName string, si SchemaInformation) *analyzer { // Analyze analyzes the parsed query. func Analyze(statement sqlparser.Statement, currentDb string, si SchemaInformation) (*SemTable, error) { - analyzer := newAnalyzer(currentDb, si) + analyzer := newAnalyzer(currentDb, newSchemaInfo(si)) // Analysis for initial scope err := analyzer.analyze(statement) diff --git a/go/vt/vtgate/semantics/analyzer_test.go b/go/vt/vtgate/semantics/analyzer_test.go index f7bfe3b04f9..d67a960fd95 100644 --- a/go/vt/vtgate/semantics/analyzer_test.go +++ b/go/vt/vtgate/semantics/analyzer_test.go @@ -75,6 +75,17 @@ func TestBindingSingleTablePositive(t *testing.T) { } } +func TestInformationSchemaColumnInfo(t *testing.T) { + stmt, semTable := parseAndAnalyze(t, "select table_comment, file_name from information_schema.`TABLES`, information_schema.`FILES`", "d") + + sel, _ := stmt.(*sqlparser.Select) + tables := SingleTableSet(0) + files := SingleTableSet(1) + + assert.Equal(t, tables, semTable.RecursiveDeps(extract(sel, 0))) + assert.Equal(t, files, semTable.DirectDeps(extract(sel, 1))) +} + func TestBindingSingleAliasedTablePositive(t *testing.T) { queries := []string{ "select col from tabl as X", diff --git a/go/vt/vtgate/semantics/derived_table.go b/go/vt/vtgate/semantics/derived_table.go index f6bf7da3347..7379fa43f4e 100644 --- a/go/vt/vtgate/semantics/derived_table.go +++ b/go/vt/vtgate/semantics/derived_table.go @@ -17,6 +17,8 @@ limitations under the License. package semantics import ( + "strings" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" @@ -70,7 +72,7 @@ func createDerivedTableForExpressions(expressions sqlparser.SelectExprs, cols sq func (dt *DerivedTable) dependencies(colName string, org originable) (dependencies, error) { directDeps := org.tableSetFor(dt.ASTNode) for i, name := range dt.columnNames { - if name != colName { + if !strings.EqualFold(name, colName) { continue } _, recursiveDeps, qt := org.depsForExpr(dt.cols[i]) diff --git a/go/vt/vtgate/semantics/early_rewriter.go b/go/vt/vtgate/semantics/early_rewriter.go index 84b27cb8e66..32e67fd864c 100644 --- a/go/vt/vtgate/semantics/early_rewriter.go +++ b/go/vt/vtgate/semantics/early_rewriter.go @@ -18,6 +18,7 @@ package semantics import ( "strconv" + "strings" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/sqlparser" @@ -238,7 +239,7 @@ func rewriteJoinUsing( usingCols = map[string]TableSet{} } for _, col := range tbl.getColumns() { - _, found := usingCols[col.Name] + _, found := usingCols[strings.ToLower(col.Name)] if found { tblName, err := tbl.Name() if err != nil { diff --git a/go/vt/vtgate/semantics/info_schema.go b/go/vt/vtgate/semantics/info_schema.go new file mode 100644 index 00000000000..f834bb52f35 --- /dev/null +++ b/go/vt/vtgate/semantics/info_schema.go @@ -0,0 +1,1710 @@ +/* +Copyright 2022 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package semantics + +import ( + "strings" + + "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/vt/key" + "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/servenv" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vtgate/vindexes" +) + +func createCol(name string, typ int) vindexes.Column { + return vindexes.Column{Name: sqlparser.NewIdentifierCI(name), Type: query.Type(typ)} +} + +// getInfoSchema57 returns a map of all information_schema tables and their columns with types +// To recreate this information from MySQL, you can run the test in info_schema_gen_test.go +func getInfoSchema57() map[string][]vindexes.Column { + infSchema := map[string][]vindexes.Column{} + var cols []vindexes.Column + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("DEFAULT_COLLATE_NAME", 6165)) + cols = append(cols, createCol("DESCRIPTION", 6165)) + cols = append(cols, createCol("MAXLEN", 265)) + infSchema["CHARACTER_SETS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + infSchema["COLLATION_CHARACTER_SET_APPLICABILITY"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("ID", 265)) + cols = append(cols, createCol("IS_DEFAULT", 6165)) + cols = append(cols, createCol("IS_COMPILED", 6165)) + cols = append(cols, createCol("SORTLEN", 265)) + infSchema["COLLATIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["COLUMN_PRIVILEGES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("ORDINAL_POSITION", 265)) + cols = append(cols, createCol("COLUMN_DEFAULT", 6163)) + cols = append(cols, createCol("IS_NULLABLE", 6165)) + cols = append(cols, createCol("DATA_TYPE", 6165)) + cols = append(cols, createCol("CHARACTER_MAXIMUM_LENGTH", 265)) + cols = append(cols, createCol("CHARACTER_OCTET_LENGTH", 265)) + cols = append(cols, createCol("NUMERIC_PRECISION", 265)) + cols = append(cols, createCol("NUMERIC_SCALE", 265)) + cols = append(cols, createCol("DATETIME_PRECISION", 265)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("COLUMN_TYPE", 6163)) + cols = append(cols, createCol("COLUMN_KEY", 6165)) + cols = append(cols, createCol("EXTRA", 6165)) + cols = append(cols, createCol("PRIVILEGES", 6165)) + cols = append(cols, createCol("COLUMN_COMMENT", 6165)) + cols = append(cols, createCol("GENERATION_EXPRESSION", 6163)) + infSchema["COLUMNS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ENGINE", 6165)) + cols = append(cols, createCol("SUPPORT", 6165)) + cols = append(cols, createCol("COMMENT", 6165)) + cols = append(cols, createCol("TRANSACTIONS", 6165)) + cols = append(cols, createCol("XA", 6165)) + cols = append(cols, createCol("SAVEPOINTS", 6165)) + infSchema["ENGINES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("EVENT_CATALOG", 6165)) + cols = append(cols, createCol("EVENT_SCHEMA", 6165)) + cols = append(cols, createCol("EVENT_NAME", 6165)) + cols = append(cols, createCol("DEFINER", 6165)) + cols = append(cols, createCol("TIME_ZONE", 6165)) + cols = append(cols, createCol("EVENT_BODY", 6165)) + cols = append(cols, createCol("EVENT_DEFINITION", 6163)) + cols = append(cols, createCol("EVENT_TYPE", 6165)) + cols = append(cols, createCol("EXECUTE_AT", 2064)) + cols = append(cols, createCol("INTERVAL_VALUE", 6165)) + cols = append(cols, createCol("INTERVAL_FIELD", 6165)) + cols = append(cols, createCol("SQL_MODE", 6165)) + cols = append(cols, createCol("STARTS", 2064)) + cols = append(cols, createCol("ENDS", 2064)) + cols = append(cols, createCol("STATUS", 6165)) + cols = append(cols, createCol("ON_COMPLETION", 6165)) + cols = append(cols, createCol("CREATED", 2064)) + cols = append(cols, createCol("LAST_ALTERED", 2064)) + cols = append(cols, createCol("LAST_EXECUTED", 2064)) + cols = append(cols, createCol("EVENT_COMMENT", 6165)) + cols = append(cols, createCol("ORIGINATOR", 265)) + cols = append(cols, createCol("CHARACTER_SET_CLIENT", 6165)) + cols = append(cols, createCol("COLLATION_CONNECTION", 6165)) + cols = append(cols, createCol("DATABASE_COLLATION", 6165)) + infSchema["EVENTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("FILE_ID", 265)) + cols = append(cols, createCol("FILE_NAME", 6165)) + cols = append(cols, createCol("FILE_TYPE", 6165)) + cols = append(cols, createCol("TABLESPACE_NAME", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("LOGFILE_GROUP_NAME", 6165)) + cols = append(cols, createCol("LOGFILE_GROUP_NUMBER", 265)) + cols = append(cols, createCol("ENGINE", 6165)) + cols = append(cols, createCol("FULLTEXT_KEYS", 6165)) + cols = append(cols, createCol("DELETED_ROWS", 265)) + cols = append(cols, createCol("UPDATE_COUNT", 265)) + cols = append(cols, createCol("FREE_EXTENTS", 265)) + cols = append(cols, createCol("TOTAL_EXTENTS", 265)) + cols = append(cols, createCol("EXTENT_SIZE", 265)) + cols = append(cols, createCol("INITIAL_SIZE", 265)) + cols = append(cols, createCol("MAXIMUM_SIZE", 265)) + cols = append(cols, createCol("AUTOEXTEND_SIZE", 265)) + cols = append(cols, createCol("CREATION_TIME", 2064)) + cols = append(cols, createCol("LAST_UPDATE_TIME", 2064)) + cols = append(cols, createCol("LAST_ACCESS_TIME", 2064)) + cols = append(cols, createCol("RECOVER_TIME", 265)) + cols = append(cols, createCol("TRANSACTION_COUNTER", 265)) + cols = append(cols, createCol("VERSION", 265)) + cols = append(cols, createCol("ROW_FORMAT", 6165)) + cols = append(cols, createCol("TABLE_ROWS", 265)) + cols = append(cols, createCol("AVG_ROW_LENGTH", 265)) + cols = append(cols, createCol("DATA_LENGTH", 265)) + cols = append(cols, createCol("MAX_DATA_LENGTH", 265)) + cols = append(cols, createCol("INDEX_LENGTH", 265)) + cols = append(cols, createCol("DATA_FREE", 265)) + cols = append(cols, createCol("CREATE_TIME", 2064)) + cols = append(cols, createCol("UPDATE_TIME", 2064)) + cols = append(cols, createCol("CHECK_TIME", 2064)) + cols = append(cols, createCol("CHECKSUM", 265)) + cols = append(cols, createCol("STATUS", 6165)) + cols = append(cols, createCol("EXTRA", 6165)) + infSchema["FILES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("VARIABLE_NAME", 6165)) + cols = append(cols, createCol("VARIABLE_VALUE", 6165)) + infSchema["GLOBAL_STATUS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("VARIABLE_NAME", 6165)) + cols = append(cols, createCol("VARIABLE_VALUE", 6165)) + infSchema["GLOBAL_VARIABLES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("POOL_ID", 265)) + cols = append(cols, createCol("BLOCK_ID", 265)) + cols = append(cols, createCol("SPACE", 265)) + cols = append(cols, createCol("PAGE_NUMBER", 265)) + cols = append(cols, createCol("PAGE_TYPE", 6165)) + cols = append(cols, createCol("FLUSH_TYPE", 265)) + cols = append(cols, createCol("FIX_COUNT", 265)) + cols = append(cols, createCol("IS_HASHED", 6165)) + cols = append(cols, createCol("NEWEST_MODIFICATION", 265)) + cols = append(cols, createCol("OLDEST_MODIFICATION", 265)) + cols = append(cols, createCol("ACCESS_TIME", 265)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("INDEX_NAME", 6165)) + cols = append(cols, createCol("NUMBER_RECORDS", 265)) + cols = append(cols, createCol("DATA_SIZE", 265)) + cols = append(cols, createCol("COMPRESSED_SIZE", 265)) + cols = append(cols, createCol("PAGE_STATE", 6165)) + cols = append(cols, createCol("IO_FIX", 6165)) + cols = append(cols, createCol("IS_OLD", 6165)) + cols = append(cols, createCol("FREE_PAGE_CLOCK", 265)) + infSchema["INNODB_BUFFER_PAGE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("POOL_ID", 265)) + cols = append(cols, createCol("LRU_POSITION", 265)) + cols = append(cols, createCol("SPACE", 265)) + cols = append(cols, createCol("PAGE_NUMBER", 265)) + cols = append(cols, createCol("PAGE_TYPE", 6165)) + cols = append(cols, createCol("FLUSH_TYPE", 265)) + cols = append(cols, createCol("FIX_COUNT", 265)) + cols = append(cols, createCol("IS_HASHED", 6165)) + cols = append(cols, createCol("NEWEST_MODIFICATION", 265)) + cols = append(cols, createCol("OLDEST_MODIFICATION", 265)) + cols = append(cols, createCol("ACCESS_TIME", 265)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("INDEX_NAME", 6165)) + cols = append(cols, createCol("NUMBER_RECORDS", 265)) + cols = append(cols, createCol("DATA_SIZE", 265)) + cols = append(cols, createCol("COMPRESSED_SIZE", 265)) + cols = append(cols, createCol("COMPRESSED", 6165)) + cols = append(cols, createCol("IO_FIX", 6165)) + cols = append(cols, createCol("IS_OLD", 6165)) + cols = append(cols, createCol("FREE_PAGE_CLOCK", 265)) + infSchema["INNODB_BUFFER_PAGE_LRU"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("POOL_ID", 265)) + cols = append(cols, createCol("POOL_SIZE", 265)) + cols = append(cols, createCol("FREE_BUFFERS", 265)) + cols = append(cols, createCol("DATABASE_PAGES", 265)) + cols = append(cols, createCol("OLD_DATABASE_PAGES", 265)) + cols = append(cols, createCol("MODIFIED_DATABASE_PAGES", 265)) + cols = append(cols, createCol("PENDING_DECOMPRESS", 265)) + cols = append(cols, createCol("PENDING_READS", 265)) + cols = append(cols, createCol("PENDING_FLUSH_LRU", 265)) + cols = append(cols, createCol("PENDING_FLUSH_LIST", 265)) + cols = append(cols, createCol("PAGES_MADE_YOUNG", 265)) + cols = append(cols, createCol("PAGES_NOT_MADE_YOUNG", 265)) + cols = append(cols, createCol("PAGES_MADE_YOUNG_RATE", 1036)) + cols = append(cols, createCol("PAGES_MADE_NOT_YOUNG_RATE", 1036)) + cols = append(cols, createCol("NUMBER_PAGES_READ", 265)) + cols = append(cols, createCol("NUMBER_PAGES_CREATED", 265)) + cols = append(cols, createCol("NUMBER_PAGES_WRITTEN", 265)) + cols = append(cols, createCol("PAGES_READ_RATE", 1036)) + cols = append(cols, createCol("PAGES_CREATE_RATE", 1036)) + cols = append(cols, createCol("PAGES_WRITTEN_RATE", 1036)) + cols = append(cols, createCol("NUMBER_PAGES_GET", 265)) + cols = append(cols, createCol("HIT_RATE", 265)) + cols = append(cols, createCol("YOUNG_MAKE_PER_THOUSAND_GETS", 265)) + cols = append(cols, createCol("NOT_YOUNG_MAKE_PER_THOUSAND_GETS", 265)) + cols = append(cols, createCol("NUMBER_PAGES_READ_AHEAD", 265)) + cols = append(cols, createCol("NUMBER_READ_AHEAD_EVICTED", 265)) + cols = append(cols, createCol("READ_AHEAD_RATE", 1036)) + cols = append(cols, createCol("READ_AHEAD_EVICTED_RATE", 1036)) + cols = append(cols, createCol("LRU_IO_TOTAL", 265)) + cols = append(cols, createCol("LRU_IO_CURRENT", 265)) + cols = append(cols, createCol("UNCOMPRESS_TOTAL", 265)) + cols = append(cols, createCol("UNCOMPRESS_CURRENT", 265)) + infSchema["INNODB_BUFFER_POOL_STATS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("page_size", 263)) + cols = append(cols, createCol("compress_ops", 263)) + cols = append(cols, createCol("compress_ops_ok", 263)) + cols = append(cols, createCol("compress_time", 263)) + cols = append(cols, createCol("uncompress_ops", 263)) + cols = append(cols, createCol("uncompress_time", 263)) + infSchema["INNODB_CMP"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("database_name", 6165)) + cols = append(cols, createCol("table_name", 6165)) + cols = append(cols, createCol("index_name", 6165)) + cols = append(cols, createCol("compress_ops", 263)) + cols = append(cols, createCol("compress_ops_ok", 263)) + cols = append(cols, createCol("compress_time", 263)) + cols = append(cols, createCol("uncompress_ops", 263)) + cols = append(cols, createCol("uncompress_time", 263)) + infSchema["INNODB_CMP_PER_INDEX"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("database_name", 6165)) + cols = append(cols, createCol("table_name", 6165)) + cols = append(cols, createCol("index_name", 6165)) + cols = append(cols, createCol("compress_ops", 263)) + cols = append(cols, createCol("compress_ops_ok", 263)) + cols = append(cols, createCol("compress_time", 263)) + cols = append(cols, createCol("uncompress_ops", 263)) + cols = append(cols, createCol("uncompress_time", 263)) + infSchema["INNODB_CMP_PER_INDEX_RESET"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("page_size", 263)) + cols = append(cols, createCol("compress_ops", 263)) + cols = append(cols, createCol("compress_ops_ok", 263)) + cols = append(cols, createCol("compress_time", 263)) + cols = append(cols, createCol("uncompress_ops", 263)) + cols = append(cols, createCol("uncompress_time", 263)) + infSchema["INNODB_CMP_RESET"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("page_size", 263)) + cols = append(cols, createCol("buffer_pool_instance", 263)) + cols = append(cols, createCol("pages_used", 263)) + cols = append(cols, createCol("pages_free", 263)) + cols = append(cols, createCol("relocation_ops", 265)) + cols = append(cols, createCol("relocation_time", 263)) + infSchema["INNODB_CMPMEM"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("page_size", 263)) + cols = append(cols, createCol("buffer_pool_instance", 263)) + cols = append(cols, createCol("pages_used", 263)) + cols = append(cols, createCol("pages_free", 263)) + cols = append(cols, createCol("relocation_ops", 265)) + cols = append(cols, createCol("relocation_time", 263)) + infSchema["INNODB_CMPMEM_RESET"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("DOC_ID", 265)) + infSchema["INNODB_FT_BEING_DELETED"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("KEY", 6165)) + cols = append(cols, createCol("VALUE", 6165)) + infSchema["INNODB_FT_CONFIG"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("value", 6165)) + infSchema["INNODB_FT_DEFAULT_STOPWORD"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("DOC_ID", 265)) + infSchema["INNODB_FT_DELETED"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("WORD", 6165)) + cols = append(cols, createCol("FIRST_DOC_ID", 265)) + cols = append(cols, createCol("LAST_DOC_ID", 265)) + cols = append(cols, createCol("DOC_COUNT", 265)) + cols = append(cols, createCol("DOC_ID", 265)) + cols = append(cols, createCol("POSITION", 265)) + infSchema["INNODB_FT_INDEX_CACHE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("WORD", 6165)) + cols = append(cols, createCol("FIRST_DOC_ID", 265)) + cols = append(cols, createCol("LAST_DOC_ID", 265)) + cols = append(cols, createCol("DOC_COUNT", 265)) + cols = append(cols, createCol("DOC_ID", 265)) + cols = append(cols, createCol("POSITION", 265)) + infSchema["INNODB_FT_INDEX_TABLE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("requesting_trx_id", 6165)) + cols = append(cols, createCol("requested_lock_id", 6165)) + cols = append(cols, createCol("blocking_trx_id", 6165)) + cols = append(cols, createCol("blocking_lock_id", 6165)) + infSchema["INNODB_LOCK_WAITS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("lock_id", 6165)) + cols = append(cols, createCol("lock_trx_id", 6165)) + cols = append(cols, createCol("lock_mode", 6165)) + cols = append(cols, createCol("lock_type", 6165)) + cols = append(cols, createCol("lock_table", 6165)) + cols = append(cols, createCol("lock_index", 6165)) + cols = append(cols, createCol("lock_space", 265)) + cols = append(cols, createCol("lock_page", 265)) + cols = append(cols, createCol("lock_rec", 265)) + cols = append(cols, createCol("lock_data", 6165)) + infSchema["INNODB_LOCKS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("SUBSYSTEM", 6165)) + cols = append(cols, createCol("COUNT", 265)) + cols = append(cols, createCol("MAX_COUNT", 265)) + cols = append(cols, createCol("MIN_COUNT", 265)) + cols = append(cols, createCol("AVG_COUNT", 1036)) + cols = append(cols, createCol("COUNT_RESET", 265)) + cols = append(cols, createCol("MAX_COUNT_RESET", 265)) + cols = append(cols, createCol("MIN_COUNT_RESET", 265)) + cols = append(cols, createCol("AVG_COUNT_RESET", 1036)) + cols = append(cols, createCol("TIME_ENABLED", 2064)) + cols = append(cols, createCol("TIME_DISABLED", 2064)) + cols = append(cols, createCol("TIME_ELAPSED", 265)) + cols = append(cols, createCol("TIME_RESET", 2064)) + cols = append(cols, createCol("STATUS", 6165)) + cols = append(cols, createCol("TYPE", 6165)) + cols = append(cols, createCol("COMMENT", 6165)) + infSchema["INNODB_METRICS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 265)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("POS", 265)) + cols = append(cols, createCol("MTYPE", 263)) + cols = append(cols, createCol("PRTYPE", 263)) + cols = append(cols, createCol("LEN", 263)) + infSchema["INNODB_SYS_COLUMNS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPACE", 263)) + cols = append(cols, createCol("PATH", 6165)) + infSchema["INNODB_SYS_DATAFILES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("INDEX_ID", 265)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("POS", 263)) + infSchema["INNODB_SYS_FIELDS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ID", 6165)) + cols = append(cols, createCol("FOR_NAME", 6165)) + cols = append(cols, createCol("REF_NAME", 6165)) + cols = append(cols, createCol("N_COLS", 263)) + cols = append(cols, createCol("TYPE", 263)) + infSchema["INNODB_SYS_FOREIGN"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ID", 6165)) + cols = append(cols, createCol("FOR_COL_NAME", 6165)) + cols = append(cols, createCol("REF_COL_NAME", 6165)) + cols = append(cols, createCol("POS", 263)) + infSchema["INNODB_SYS_FOREIGN_COLS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("INDEX_ID", 265)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("TABLE_ID", 265)) + cols = append(cols, createCol("TYPE", 263)) + cols = append(cols, createCol("N_FIELDS", 263)) + cols = append(cols, createCol("PAGE_NO", 263)) + cols = append(cols, createCol("SPACE", 263)) + cols = append(cols, createCol("MERGE_THRESHOLD", 263)) + infSchema["INNODB_SYS_INDEXES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 265)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("FLAG", 263)) + cols = append(cols, createCol("N_COLS", 263)) + cols = append(cols, createCol("SPACE", 263)) + cols = append(cols, createCol("FILE_FORMAT", 6165)) + cols = append(cols, createCol("ROW_FORMAT", 6165)) + cols = append(cols, createCol("ZIP_PAGE_SIZE", 263)) + cols = append(cols, createCol("SPACE_TYPE", 6165)) + infSchema["INNODB_SYS_TABLES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPACE", 263)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("FLAG", 263)) + cols = append(cols, createCol("FILE_FORMAT", 6165)) + cols = append(cols, createCol("ROW_FORMAT", 6165)) + cols = append(cols, createCol("PAGE_SIZE", 263)) + cols = append(cols, createCol("ZIP_PAGE_SIZE", 263)) + cols = append(cols, createCol("SPACE_TYPE", 6165)) + cols = append(cols, createCol("FS_BLOCK_SIZE", 263)) + cols = append(cols, createCol("FILE_SIZE", 265)) + cols = append(cols, createCol("ALLOCATED_SIZE", 265)) + infSchema["INNODB_SYS_TABLESPACES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 265)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("STATS_INITIALIZED", 6165)) + cols = append(cols, createCol("NUM_ROWS", 265)) + cols = append(cols, createCol("CLUST_INDEX_SIZE", 265)) + cols = append(cols, createCol("OTHER_INDEX_SIZE", 265)) + cols = append(cols, createCol("MODIFIED_COUNTER", 265)) + cols = append(cols, createCol("AUTOINC", 265)) + cols = append(cols, createCol("REF_COUNT", 263)) + infSchema["INNODB_SYS_TABLESTATS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 265)) + cols = append(cols, createCol("POS", 263)) + cols = append(cols, createCol("BASE_POS", 263)) + infSchema["INNODB_SYS_VIRTUAL"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 265)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("N_COLS", 263)) + cols = append(cols, createCol("SPACE", 263)) + cols = append(cols, createCol("PER_TABLE_TABLESPACE", 6165)) + cols = append(cols, createCol("IS_COMPRESSED", 6165)) + infSchema["INNODB_TEMP_TABLE_INFO"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("trx_id", 6165)) + cols = append(cols, createCol("trx_state", 6165)) + cols = append(cols, createCol("trx_started", 2064)) + cols = append(cols, createCol("trx_requested_lock_id", 6165)) + cols = append(cols, createCol("trx_wait_started", 2064)) + cols = append(cols, createCol("trx_weight", 265)) + cols = append(cols, createCol("trx_mysql_thread_id", 265)) + cols = append(cols, createCol("trx_query", 6165)) + cols = append(cols, createCol("trx_operation_state", 6165)) + cols = append(cols, createCol("trx_tables_in_use", 265)) + cols = append(cols, createCol("trx_tables_locked", 265)) + cols = append(cols, createCol("trx_lock_structs", 265)) + cols = append(cols, createCol("trx_lock_memory_bytes", 265)) + cols = append(cols, createCol("trx_rows_locked", 265)) + cols = append(cols, createCol("trx_rows_modified", 265)) + cols = append(cols, createCol("trx_concurrency_tickets", 265)) + cols = append(cols, createCol("trx_isolation_level", 6165)) + cols = append(cols, createCol("trx_unique_checks", 263)) + cols = append(cols, createCol("trx_foreign_key_checks", 263)) + cols = append(cols, createCol("trx_last_foreign_key_error", 6165)) + cols = append(cols, createCol("trx_adaptive_hash_latched", 263)) + cols = append(cols, createCol("trx_adaptive_hash_timeout", 265)) + cols = append(cols, createCol("trx_is_read_only", 263)) + cols = append(cols, createCol("trx_autocommit_non_locking", 263)) + infSchema["INNODB_TRX"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("ORDINAL_POSITION", 265)) + cols = append(cols, createCol("POSITION_IN_UNIQUE_CONSTRAINT", 265)) + cols = append(cols, createCol("REFERENCED_TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("REFERENCED_TABLE_NAME", 6165)) + cols = append(cols, createCol("REFERENCED_COLUMN_NAME", 6165)) + infSchema["KEY_COLUMN_USAGE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("QUERY", 6163)) + cols = append(cols, createCol("TRACE", 6163)) + cols = append(cols, createCol("MISSING_BYTES_BEYOND_MAX_MEM_SIZE", 263)) + cols = append(cols, createCol("INSUFFICIENT_PRIVILEGES", 257)) + infSchema["OPTIMIZER_TRACE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPECIFIC_CATALOG", 6165)) + cols = append(cols, createCol("SPECIFIC_SCHEMA", 6165)) + cols = append(cols, createCol("SPECIFIC_NAME", 6165)) + cols = append(cols, createCol("ORDINAL_POSITION", 263)) + cols = append(cols, createCol("PARAMETER_MODE", 6165)) + cols = append(cols, createCol("PARAMETER_NAME", 6165)) + cols = append(cols, createCol("DATA_TYPE", 6165)) + cols = append(cols, createCol("CHARACTER_MAXIMUM_LENGTH", 263)) + cols = append(cols, createCol("CHARACTER_OCTET_LENGTH", 263)) + cols = append(cols, createCol("NUMERIC_PRECISION", 265)) + cols = append(cols, createCol("NUMERIC_SCALE", 263)) + cols = append(cols, createCol("DATETIME_PRECISION", 265)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("DTD_IDENTIFIER", 6163)) + cols = append(cols, createCol("ROUTINE_TYPE", 6165)) + infSchema["PARAMETERS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("PARTITION_NAME", 6165)) + cols = append(cols, createCol("SUBPARTITION_NAME", 6165)) + cols = append(cols, createCol("PARTITION_ORDINAL_POSITION", 265)) + cols = append(cols, createCol("SUBPARTITION_ORDINAL_POSITION", 265)) + cols = append(cols, createCol("PARTITION_METHOD", 6165)) + cols = append(cols, createCol("SUBPARTITION_METHOD", 6165)) + cols = append(cols, createCol("PARTITION_EXPRESSION", 6163)) + cols = append(cols, createCol("SUBPARTITION_EXPRESSION", 6163)) + cols = append(cols, createCol("PARTITION_DESCRIPTION", 6163)) + cols = append(cols, createCol("TABLE_ROWS", 265)) + cols = append(cols, createCol("AVG_ROW_LENGTH", 265)) + cols = append(cols, createCol("DATA_LENGTH", 265)) + cols = append(cols, createCol("MAX_DATA_LENGTH", 265)) + cols = append(cols, createCol("INDEX_LENGTH", 265)) + cols = append(cols, createCol("DATA_FREE", 265)) + cols = append(cols, createCol("CREATE_TIME", 2064)) + cols = append(cols, createCol("UPDATE_TIME", 2064)) + cols = append(cols, createCol("CHECK_TIME", 2064)) + cols = append(cols, createCol("CHECKSUM", 265)) + cols = append(cols, createCol("PARTITION_COMMENT", 6165)) + cols = append(cols, createCol("NODEGROUP", 6165)) + cols = append(cols, createCol("TABLESPACE_NAME", 6165)) + infSchema["PARTITIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("PLUGIN_NAME", 6165)) + cols = append(cols, createCol("PLUGIN_VERSION", 6165)) + cols = append(cols, createCol("PLUGIN_STATUS", 6165)) + cols = append(cols, createCol("PLUGIN_TYPE", 6165)) + cols = append(cols, createCol("PLUGIN_TYPE_VERSION", 6165)) + cols = append(cols, createCol("PLUGIN_LIBRARY", 6165)) + cols = append(cols, createCol("PLUGIN_LIBRARY_VERSION", 6165)) + cols = append(cols, createCol("PLUGIN_AUTHOR", 6165)) + cols = append(cols, createCol("PLUGIN_DESCRIPTION", 6163)) + cols = append(cols, createCol("PLUGIN_LICENSE", 6165)) + cols = append(cols, createCol("LOAD_OPTION", 6165)) + infSchema["PLUGINS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ID", 265)) + cols = append(cols, createCol("USER", 6165)) + cols = append(cols, createCol("HOST", 6165)) + cols = append(cols, createCol("DB", 6165)) + cols = append(cols, createCol("COMMAND", 6165)) + cols = append(cols, createCol("TIME", 263)) + cols = append(cols, createCol("STATE", 6165)) + cols = append(cols, createCol("INFO", 6163)) + infSchema["PROCESSLIST"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("QUERY_ID", 263)) + cols = append(cols, createCol("SEQ", 263)) + cols = append(cols, createCol("STATE", 6165)) + cols = append(cols, createCol("DURATION", 18)) + cols = append(cols, createCol("CPU_USER", 18)) + cols = append(cols, createCol("CPU_SYSTEM", 18)) + cols = append(cols, createCol("CONTEXT_VOLUNTARY", 263)) + cols = append(cols, createCol("CONTEXT_INVOLUNTARY", 263)) + cols = append(cols, createCol("BLOCK_OPS_IN", 263)) + cols = append(cols, createCol("BLOCK_OPS_OUT", 263)) + cols = append(cols, createCol("MESSAGES_SENT", 263)) + cols = append(cols, createCol("MESSAGES_RECEIVED", 263)) + cols = append(cols, createCol("PAGE_FAULTS_MAJOR", 263)) + cols = append(cols, createCol("PAGE_FAULTS_MINOR", 263)) + cols = append(cols, createCol("SWAPS", 263)) + cols = append(cols, createCol("SOURCE_FUNCTION", 6165)) + cols = append(cols, createCol("SOURCE_FILE", 6165)) + cols = append(cols, createCol("SOURCE_LINE", 263)) + infSchema["PROFILING"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("UNIQUE_CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("UNIQUE_CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("UNIQUE_CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("MATCH_OPTION", 6165)) + cols = append(cols, createCol("UPDATE_RULE", 6165)) + cols = append(cols, createCol("DELETE_RULE", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("REFERENCED_TABLE_NAME", 6165)) + infSchema["REFERENTIAL_CONSTRAINTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPECIFIC_NAME", 6165)) + cols = append(cols, createCol("ROUTINE_CATALOG", 6165)) + cols = append(cols, createCol("ROUTINE_SCHEMA", 6165)) + cols = append(cols, createCol("ROUTINE_NAME", 6165)) + cols = append(cols, createCol("ROUTINE_TYPE", 6165)) + cols = append(cols, createCol("DATA_TYPE", 6165)) + cols = append(cols, createCol("CHARACTER_MAXIMUM_LENGTH", 263)) + cols = append(cols, createCol("CHARACTER_OCTET_LENGTH", 263)) + cols = append(cols, createCol("NUMERIC_PRECISION", 265)) + cols = append(cols, createCol("NUMERIC_SCALE", 263)) + cols = append(cols, createCol("DATETIME_PRECISION", 265)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("DTD_IDENTIFIER", 6163)) + cols = append(cols, createCol("ROUTINE_BODY", 6165)) + cols = append(cols, createCol("ROUTINE_DEFINITION", 6163)) + cols = append(cols, createCol("EXTERNAL_NAME", 6165)) + cols = append(cols, createCol("EXTERNAL_LANGUAGE", 6165)) + cols = append(cols, createCol("PARAMETER_STYLE", 6165)) + cols = append(cols, createCol("IS_DETERMINISTIC", 6165)) + cols = append(cols, createCol("SQL_DATA_ACCESS", 6165)) + cols = append(cols, createCol("SQL_PATH", 6165)) + cols = append(cols, createCol("SECURITY_TYPE", 6165)) + cols = append(cols, createCol("CREATED", 2064)) + cols = append(cols, createCol("LAST_ALTERED", 2064)) + cols = append(cols, createCol("SQL_MODE", 6165)) + cols = append(cols, createCol("ROUTINE_COMMENT", 6163)) + cols = append(cols, createCol("DEFINER", 6165)) + cols = append(cols, createCol("CHARACTER_SET_CLIENT", 6165)) + cols = append(cols, createCol("COLLATION_CONNECTION", 6165)) + cols = append(cols, createCol("DATABASE_COLLATION", 6165)) + infSchema["ROUTINES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["SCHEMA_PRIVILEGES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CATALOG_NAME", 6165)) + cols = append(cols, createCol("SCHEMA_NAME", 6165)) + cols = append(cols, createCol("DEFAULT_CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("DEFAULT_COLLATION_NAME", 6165)) + cols = append(cols, createCol("SQL_PATH", 6165)) + infSchema["SCHEMATA"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("VARIABLE_NAME", 6165)) + cols = append(cols, createCol("VARIABLE_VALUE", 6165)) + infSchema["SESSION_STATUS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("VARIABLE_NAME", 6165)) + cols = append(cols, createCol("VARIABLE_VALUE", 6165)) + infSchema["SESSION_VARIABLES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("NON_UNIQUE", 265)) + cols = append(cols, createCol("INDEX_SCHEMA", 6165)) + cols = append(cols, createCol("INDEX_NAME", 6165)) + cols = append(cols, createCol("SEQ_IN_INDEX", 265)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("COLLATION", 6165)) + cols = append(cols, createCol("CARDINALITY", 265)) + cols = append(cols, createCol("SUB_PART", 265)) + cols = append(cols, createCol("PACKED", 6165)) + cols = append(cols, createCol("NULLABLE", 6165)) + cols = append(cols, createCol("INDEX_TYPE", 6165)) + cols = append(cols, createCol("COMMENT", 6165)) + cols = append(cols, createCol("INDEX_COMMENT", 6165)) + infSchema["STATISTICS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("CONSTRAINT_TYPE", 6165)) + infSchema["TABLE_CONSTRAINTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["TABLE_PRIVILEGES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("TABLE_TYPE", 6165)) + cols = append(cols, createCol("ENGINE", 6165)) + cols = append(cols, createCol("VERSION", 265)) + cols = append(cols, createCol("ROW_FORMAT", 6165)) + cols = append(cols, createCol("TABLE_ROWS", 265)) + cols = append(cols, createCol("AVG_ROW_LENGTH", 265)) + cols = append(cols, createCol("DATA_LENGTH", 265)) + cols = append(cols, createCol("MAX_DATA_LENGTH", 265)) + cols = append(cols, createCol("INDEX_LENGTH", 265)) + cols = append(cols, createCol("DATA_FREE", 265)) + cols = append(cols, createCol("AUTO_INCREMENT", 265)) + cols = append(cols, createCol("CREATE_TIME", 2064)) + cols = append(cols, createCol("UPDATE_TIME", 2064)) + cols = append(cols, createCol("CHECK_TIME", 2064)) + cols = append(cols, createCol("TABLE_COLLATION", 6165)) + cols = append(cols, createCol("CHECKSUM", 265)) + cols = append(cols, createCol("CREATE_OPTIONS", 6165)) + cols = append(cols, createCol("TABLE_COMMENT", 6165)) + infSchema["TABLES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLESPACE_NAME", 6165)) + cols = append(cols, createCol("ENGINE", 6165)) + cols = append(cols, createCol("TABLESPACE_TYPE", 6165)) + cols = append(cols, createCol("LOGFILE_GROUP_NAME", 6165)) + cols = append(cols, createCol("EXTENT_SIZE", 265)) + cols = append(cols, createCol("AUTOEXTEND_SIZE", 265)) + cols = append(cols, createCol("MAXIMUM_SIZE", 265)) + cols = append(cols, createCol("NODEGROUP_ID", 265)) + cols = append(cols, createCol("TABLESPACE_COMMENT", 6165)) + infSchema["TABLESPACES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TRIGGER_CATALOG", 6165)) + cols = append(cols, createCol("TRIGGER_SCHEMA", 6165)) + cols = append(cols, createCol("TRIGGER_NAME", 6165)) + cols = append(cols, createCol("EVENT_MANIPULATION", 6165)) + cols = append(cols, createCol("EVENT_OBJECT_CATALOG", 6165)) + cols = append(cols, createCol("EVENT_OBJECT_SCHEMA", 6165)) + cols = append(cols, createCol("EVENT_OBJECT_TABLE", 6165)) + cols = append(cols, createCol("ACTION_ORDER", 265)) + cols = append(cols, createCol("ACTION_CONDITION", 6163)) + cols = append(cols, createCol("ACTION_STATEMENT", 6163)) + cols = append(cols, createCol("ACTION_ORIENTATION", 6165)) + cols = append(cols, createCol("ACTION_TIMING", 6165)) + cols = append(cols, createCol("ACTION_REFERENCE_OLD_TABLE", 6165)) + cols = append(cols, createCol("ACTION_REFERENCE_NEW_TABLE", 6165)) + cols = append(cols, createCol("ACTION_REFERENCE_OLD_ROW", 6165)) + cols = append(cols, createCol("ACTION_REFERENCE_NEW_ROW", 6165)) + cols = append(cols, createCol("CREATED", 2064)) + cols = append(cols, createCol("SQL_MODE", 6165)) + cols = append(cols, createCol("DEFINER", 6165)) + cols = append(cols, createCol("CHARACTER_SET_CLIENT", 6165)) + cols = append(cols, createCol("COLLATION_CONNECTION", 6165)) + cols = append(cols, createCol("DATABASE_COLLATION", 6165)) + infSchema["TRIGGERS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["USER_PRIVILEGES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("VIEW_DEFINITION", 6163)) + cols = append(cols, createCol("CHECK_OPTION", 6165)) + cols = append(cols, createCol("IS_UPDATABLE", 6165)) + cols = append(cols, createCol("DEFINER", 6165)) + cols = append(cols, createCol("SECURITY_TYPE", 6165)) + cols = append(cols, createCol("CHARACTER_SET_CLIENT", 6165)) + cols = append(cols, createCol("COLLATION_CONNECTION", 6165)) + infSchema["VIEWS"] = cols + + return infSchema +} + +// getInfoSchema80 returns a map of all information_schema tables and their columns with types +// To recreate this information from MySQL, you can run the test in info_schema_gen_test.go +func getInfoSchema80() map[string][]vindexes.Column { + infSchema := map[string][]vindexes.Column{} + var cols []vindexes.Column + cols = append(cols, createCol("USER", 6165)) + cols = append(cols, createCol("HOST", 6165)) + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("GRANTEE_HOST", 6165)) + cols = append(cols, createCol("ROLE_NAME", 6165)) + cols = append(cols, createCol("ROLE_HOST", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + cols = append(cols, createCol("IS_DEFAULT", 6165)) + cols = append(cols, createCol("IS_MANDATORY", 6165)) + infSchema["ADMINISTRABLE_ROLE_AUTHORIZATIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("USER", 6165)) + cols = append(cols, createCol("HOST", 6165)) + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("GRANTEE_HOST", 6165)) + cols = append(cols, createCol("ROLE_NAME", 6165)) + cols = append(cols, createCol("ROLE_HOST", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + cols = append(cols, createCol("IS_DEFAULT", 6165)) + cols = append(cols, createCol("IS_MANDATORY", 6165)) + infSchema["APPLICABLE_ROLES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("DEFAULT_COLLATE_NAME", 6165)) + cols = append(cols, createCol("DESCRIPTION", 6165)) + cols = append(cols, createCol("MAXLEN", 776)) + infSchema["CHARACTER_SETS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("CHECK_CLAUSE", 6163)) + infSchema["CHECK_CONSTRAINTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + infSchema["COLLATION_CHARACTER_SET_APPLICABILITY"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("ID", 778)) + cols = append(cols, createCol("IS_DEFAULT", 6165)) + cols = append(cols, createCol("IS_COMPILED", 6165)) + cols = append(cols, createCol("SORTLEN", 776)) + cols = append(cols, createCol("PAD_ATTRIBUTE", 2074)) + infSchema["COLLATIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["COLUMN_PRIVILEGES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SCHEMA_NAME", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("HISTOGRAM", 2078)) + infSchema["COLUMN_STATISTICS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("ORDINAL_POSITION", 776)) + cols = append(cols, createCol("COLUMN_DEFAULT", 6163)) + cols = append(cols, createCol("IS_NULLABLE", 6165)) + cols = append(cols, createCol("DATA_TYPE", 6163)) + cols = append(cols, createCol("CHARACTER_MAXIMUM_LENGTH", 265)) + cols = append(cols, createCol("CHARACTER_OCTET_LENGTH", 265)) + cols = append(cols, createCol("NUMERIC_PRECISION", 778)) + cols = append(cols, createCol("NUMERIC_SCALE", 778)) + cols = append(cols, createCol("DATETIME_PRECISION", 776)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("COLUMN_TYPE", 6163)) + cols = append(cols, createCol("COLUMN_KEY", 2074)) + cols = append(cols, createCol("EXTRA", 6165)) + cols = append(cols, createCol("PRIVILEGES", 6165)) + cols = append(cols, createCol("COLUMN_COMMENT", 6163)) + cols = append(cols, createCol("GENERATION_EXPRESSION", 6163)) + cols = append(cols, createCol("SRS_ID", 776)) + infSchema["COLUMNS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("ENGINE_ATTRIBUTE", 2078)) + cols = append(cols, createCol("SECONDARY_ENGINE_ATTRIBUTE", 2078)) + infSchema["COLUMNS_EXTENSIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ROLE_NAME", 6165)) + cols = append(cols, createCol("ROLE_HOST", 6165)) + cols = append(cols, createCol("IS_DEFAULT", 6165)) + cols = append(cols, createCol("IS_MANDATORY", 6165)) + infSchema["ENABLED_ROLES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ENGINE", 6165)) + cols = append(cols, createCol("SUPPORT", 6165)) + cols = append(cols, createCol("COMMENT", 6165)) + cols = append(cols, createCol("TRANSACTIONS", 6165)) + cols = append(cols, createCol("XA", 6165)) + cols = append(cols, createCol("SAVEPOINTS", 6165)) + infSchema["ENGINES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("EVENT_CATALOG", 6165)) + cols = append(cols, createCol("EVENT_SCHEMA", 6165)) + cols = append(cols, createCol("EVENT_NAME", 6165)) + cols = append(cols, createCol("DEFINER", 6165)) + cols = append(cols, createCol("TIME_ZONE", 6165)) + cols = append(cols, createCol("EVENT_BODY", 6165)) + cols = append(cols, createCol("EVENT_DEFINITION", 6163)) + cols = append(cols, createCol("EVENT_TYPE", 6165)) + cols = append(cols, createCol("EXECUTE_AT", 2064)) + cols = append(cols, createCol("INTERVAL_VALUE", 6165)) + cols = append(cols, createCol("INTERVAL_FIELD", 2074)) + cols = append(cols, createCol("SQL_MODE", 2075)) + cols = append(cols, createCol("STARTS", 2064)) + cols = append(cols, createCol("ENDS", 2064)) + cols = append(cols, createCol("STATUS", 2074)) + cols = append(cols, createCol("ON_COMPLETION", 6165)) + cols = append(cols, createCol("CREATED", 2061)) + cols = append(cols, createCol("LAST_ALTERED", 2061)) + cols = append(cols, createCol("LAST_EXECUTED", 2064)) + cols = append(cols, createCol("EVENT_COMMENT", 6165)) + cols = append(cols, createCol("ORIGINATOR", 776)) + cols = append(cols, createCol("CHARACTER_SET_CLIENT", 6165)) + cols = append(cols, createCol("COLLATION_CONNECTION", 6165)) + cols = append(cols, createCol("DATABASE_COLLATION", 6165)) + infSchema["EVENTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("FILE_ID", 265)) + cols = append(cols, createCol("FILE_NAME", 6163)) + cols = append(cols, createCol("FILE_TYPE", 6165)) + cols = append(cols, createCol("TABLESPACE_NAME", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6167)) + cols = append(cols, createCol("TABLE_SCHEMA", 10264)) + cols = append(cols, createCol("TABLE_NAME", 10264)) + cols = append(cols, createCol("LOGFILE_GROUP_NAME", 6165)) + cols = append(cols, createCol("LOGFILE_GROUP_NUMBER", 265)) + cols = append(cols, createCol("ENGINE", 6165)) + cols = append(cols, createCol("FULLTEXT_KEYS", 10264)) + cols = append(cols, createCol("DELETED_ROWS", 10264)) + cols = append(cols, createCol("UPDATE_COUNT", 10264)) + cols = append(cols, createCol("FREE_EXTENTS", 265)) + cols = append(cols, createCol("TOTAL_EXTENTS", 265)) + cols = append(cols, createCol("EXTENT_SIZE", 265)) + cols = append(cols, createCol("INITIAL_SIZE", 265)) + cols = append(cols, createCol("MAXIMUM_SIZE", 265)) + cols = append(cols, createCol("AUTOEXTEND_SIZE", 265)) + cols = append(cols, createCol("CREATION_TIME", 10264)) + cols = append(cols, createCol("LAST_UPDATE_TIME", 10264)) + cols = append(cols, createCol("LAST_ACCESS_TIME", 10264)) + cols = append(cols, createCol("RECOVER_TIME", 10264)) + cols = append(cols, createCol("TRANSACTION_COUNTER", 10264)) + cols = append(cols, createCol("VERSION", 265)) + cols = append(cols, createCol("ROW_FORMAT", 6165)) + cols = append(cols, createCol("TABLE_ROWS", 10264)) + cols = append(cols, createCol("AVG_ROW_LENGTH", 10264)) + cols = append(cols, createCol("DATA_LENGTH", 10264)) + cols = append(cols, createCol("MAX_DATA_LENGTH", 10264)) + cols = append(cols, createCol("INDEX_LENGTH", 10264)) + cols = append(cols, createCol("DATA_FREE", 265)) + cols = append(cols, createCol("CREATE_TIME", 10264)) + cols = append(cols, createCol("UPDATE_TIME", 10264)) + cols = append(cols, createCol("CHECK_TIME", 10264)) + cols = append(cols, createCol("CHECKSUM", 10264)) + cols = append(cols, createCol("STATUS", 6165)) + cols = append(cols, createCol("EXTRA", 6165)) + infSchema["FILES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("POOL_ID", 778)) + cols = append(cols, createCol("BLOCK_ID", 778)) + cols = append(cols, createCol("SPACE", 778)) + cols = append(cols, createCol("PAGE_NUMBER", 778)) + cols = append(cols, createCol("PAGE_TYPE", 6165)) + cols = append(cols, createCol("FLUSH_TYPE", 778)) + cols = append(cols, createCol("FIX_COUNT", 778)) + cols = append(cols, createCol("IS_HASHED", 6165)) + cols = append(cols, createCol("NEWEST_MODIFICATION", 778)) + cols = append(cols, createCol("OLDEST_MODIFICATION", 778)) + cols = append(cols, createCol("ACCESS_TIME", 778)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("INDEX_NAME", 6165)) + cols = append(cols, createCol("NUMBER_RECORDS", 778)) + cols = append(cols, createCol("DATA_SIZE", 778)) + cols = append(cols, createCol("COMPRESSED_SIZE", 778)) + cols = append(cols, createCol("PAGE_STATE", 6165)) + cols = append(cols, createCol("IO_FIX", 6165)) + cols = append(cols, createCol("IS_OLD", 6165)) + cols = append(cols, createCol("FREE_PAGE_CLOCK", 778)) + cols = append(cols, createCol("IS_STALE", 6165)) + infSchema["INNODB_BUFFER_PAGE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("POOL_ID", 778)) + cols = append(cols, createCol("LRU_POSITION", 778)) + cols = append(cols, createCol("SPACE", 778)) + cols = append(cols, createCol("PAGE_NUMBER", 778)) + cols = append(cols, createCol("PAGE_TYPE", 6165)) + cols = append(cols, createCol("FLUSH_TYPE", 778)) + cols = append(cols, createCol("FIX_COUNT", 778)) + cols = append(cols, createCol("IS_HASHED", 6165)) + cols = append(cols, createCol("NEWEST_MODIFICATION", 778)) + cols = append(cols, createCol("OLDEST_MODIFICATION", 778)) + cols = append(cols, createCol("ACCESS_TIME", 778)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("INDEX_NAME", 6165)) + cols = append(cols, createCol("NUMBER_RECORDS", 778)) + cols = append(cols, createCol("DATA_SIZE", 778)) + cols = append(cols, createCol("COMPRESSED_SIZE", 778)) + cols = append(cols, createCol("COMPRESSED", 6165)) + cols = append(cols, createCol("IO_FIX", 6165)) + cols = append(cols, createCol("IS_OLD", 6165)) + cols = append(cols, createCol("FREE_PAGE_CLOCK", 778)) + infSchema["INNODB_BUFFER_PAGE_LRU"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("POOL_ID", 778)) + cols = append(cols, createCol("POOL_SIZE", 778)) + cols = append(cols, createCol("FREE_BUFFERS", 778)) + cols = append(cols, createCol("DATABASE_PAGES", 778)) + cols = append(cols, createCol("OLD_DATABASE_PAGES", 778)) + cols = append(cols, createCol("MODIFIED_DATABASE_PAGES", 778)) + cols = append(cols, createCol("PENDING_DECOMPRESS", 778)) + cols = append(cols, createCol("PENDING_READS", 778)) + cols = append(cols, createCol("PENDING_FLUSH_LRU", 778)) + cols = append(cols, createCol("PENDING_FLUSH_LIST", 778)) + cols = append(cols, createCol("PAGES_MADE_YOUNG", 778)) + cols = append(cols, createCol("PAGES_NOT_MADE_YOUNG", 778)) + cols = append(cols, createCol("PAGES_MADE_YOUNG_RATE", 1035)) + cols = append(cols, createCol("PAGES_MADE_NOT_YOUNG_RATE", 1035)) + cols = append(cols, createCol("NUMBER_PAGES_READ", 778)) + cols = append(cols, createCol("NUMBER_PAGES_CREATED", 778)) + cols = append(cols, createCol("NUMBER_PAGES_WRITTEN", 778)) + cols = append(cols, createCol("PAGES_READ_RATE", 1035)) + cols = append(cols, createCol("PAGES_CREATE_RATE", 1035)) + cols = append(cols, createCol("PAGES_WRITTEN_RATE", 1035)) + cols = append(cols, createCol("NUMBER_PAGES_GET", 778)) + cols = append(cols, createCol("HIT_RATE", 778)) + cols = append(cols, createCol("YOUNG_MAKE_PER_THOUSAND_GETS", 778)) + cols = append(cols, createCol("NOT_YOUNG_MAKE_PER_THOUSAND_GETS", 778)) + cols = append(cols, createCol("NUMBER_PAGES_READ_AHEAD", 778)) + cols = append(cols, createCol("NUMBER_READ_AHEAD_EVICTED", 778)) + cols = append(cols, createCol("READ_AHEAD_RATE", 1035)) + cols = append(cols, createCol("READ_AHEAD_EVICTED_RATE", 1035)) + cols = append(cols, createCol("LRU_IO_TOTAL", 778)) + cols = append(cols, createCol("LRU_IO_CURRENT", 778)) + cols = append(cols, createCol("UNCOMPRESS_TOTAL", 778)) + cols = append(cols, createCol("UNCOMPRESS_CURRENT", 778)) + infSchema["INNODB_BUFFER_POOL_STATS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPACE_ID", 776)) + cols = append(cols, createCol("INDEX_ID", 778)) + cols = append(cols, createCol("N_CACHED_PAGES", 778)) + infSchema["INNODB_CACHED_INDEXES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("page_size", 263)) + cols = append(cols, createCol("compress_ops", 263)) + cols = append(cols, createCol("compress_ops_ok", 263)) + cols = append(cols, createCol("compress_time", 263)) + cols = append(cols, createCol("uncompress_ops", 263)) + cols = append(cols, createCol("uncompress_time", 263)) + infSchema["INNODB_CMP"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("database_name", 6165)) + cols = append(cols, createCol("table_name", 6165)) + cols = append(cols, createCol("index_name", 6165)) + cols = append(cols, createCol("compress_ops", 263)) + cols = append(cols, createCol("compress_ops_ok", 263)) + cols = append(cols, createCol("compress_time", 263)) + cols = append(cols, createCol("uncompress_ops", 263)) + cols = append(cols, createCol("uncompress_time", 263)) + infSchema["INNODB_CMP_PER_INDEX"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("database_name", 6165)) + cols = append(cols, createCol("table_name", 6165)) + cols = append(cols, createCol("index_name", 6165)) + cols = append(cols, createCol("compress_ops", 263)) + cols = append(cols, createCol("compress_ops_ok", 263)) + cols = append(cols, createCol("compress_time", 263)) + cols = append(cols, createCol("uncompress_ops", 263)) + cols = append(cols, createCol("uncompress_time", 263)) + infSchema["INNODB_CMP_PER_INDEX_RESET"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("page_size", 263)) + cols = append(cols, createCol("compress_ops", 263)) + cols = append(cols, createCol("compress_ops_ok", 263)) + cols = append(cols, createCol("compress_time", 263)) + cols = append(cols, createCol("uncompress_ops", 263)) + cols = append(cols, createCol("uncompress_time", 263)) + infSchema["INNODB_CMP_RESET"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("page_size", 263)) + cols = append(cols, createCol("buffer_pool_instance", 263)) + cols = append(cols, createCol("pages_used", 263)) + cols = append(cols, createCol("pages_free", 263)) + cols = append(cols, createCol("relocation_ops", 265)) + cols = append(cols, createCol("relocation_time", 263)) + infSchema["INNODB_CMPMEM"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("page_size", 263)) + cols = append(cols, createCol("buffer_pool_instance", 263)) + cols = append(cols, createCol("pages_used", 263)) + cols = append(cols, createCol("pages_free", 263)) + cols = append(cols, createCol("relocation_ops", 265)) + cols = append(cols, createCol("relocation_time", 263)) + infSchema["INNODB_CMPMEM_RESET"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 778)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("POS", 778)) + cols = append(cols, createCol("MTYPE", 263)) + cols = append(cols, createCol("PRTYPE", 263)) + cols = append(cols, createCol("LEN", 263)) + cols = append(cols, createCol("HAS_DEFAULT", 263)) + cols = append(cols, createCol("DEFAULT_VALUE", 6163)) + infSchema["INNODB_COLUMNS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPACE", 10262)) + cols = append(cols, createCol("PATH", 6165)) + infSchema["INNODB_DATAFILES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("INDEX_ID", 10262)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("POS", 778)) + infSchema["INNODB_FIELDS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ID", 6165)) + cols = append(cols, createCol("FOR_NAME", 6165)) + cols = append(cols, createCol("REF_NAME", 6165)) + cols = append(cols, createCol("N_COLS", 265)) + cols = append(cols, createCol("TYPE", 778)) + infSchema["INNODB_FOREIGN"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ID", 6165)) + cols = append(cols, createCol("FOR_COL_NAME", 6165)) + cols = append(cols, createCol("REF_COL_NAME", 6165)) + cols = append(cols, createCol("POS", 776)) + infSchema["INNODB_FOREIGN_COLS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("DOC_ID", 778)) + infSchema["INNODB_FT_BEING_DELETED"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("KEY", 6165)) + cols = append(cols, createCol("VALUE", 6165)) + infSchema["INNODB_FT_CONFIG"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("value", 6165)) + infSchema["INNODB_FT_DEFAULT_STOPWORD"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("DOC_ID", 778)) + infSchema["INNODB_FT_DELETED"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("WORD", 6165)) + cols = append(cols, createCol("FIRST_DOC_ID", 778)) + cols = append(cols, createCol("LAST_DOC_ID", 778)) + cols = append(cols, createCol("DOC_COUNT", 778)) + cols = append(cols, createCol("DOC_ID", 778)) + cols = append(cols, createCol("POSITION", 778)) + infSchema["INNODB_FT_INDEX_CACHE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("WORD", 6165)) + cols = append(cols, createCol("FIRST_DOC_ID", 778)) + cols = append(cols, createCol("LAST_DOC_ID", 778)) + cols = append(cols, createCol("DOC_COUNT", 778)) + cols = append(cols, createCol("DOC_ID", 778)) + cols = append(cols, createCol("POSITION", 778)) + infSchema["INNODB_FT_INDEX_TABLE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("INDEX_ID", 778)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("TABLE_ID", 778)) + cols = append(cols, createCol("TYPE", 263)) + cols = append(cols, createCol("N_FIELDS", 263)) + cols = append(cols, createCol("PAGE_NO", 263)) + cols = append(cols, createCol("SPACE", 263)) + cols = append(cols, createCol("MERGE_THRESHOLD", 263)) + infSchema["INNODB_INDEXES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("SUBSYSTEM", 6165)) + cols = append(cols, createCol("COUNT", 265)) + cols = append(cols, createCol("MAX_COUNT", 265)) + cols = append(cols, createCol("MIN_COUNT", 265)) + cols = append(cols, createCol("AVG_COUNT", 1035)) + cols = append(cols, createCol("COUNT_RESET", 265)) + cols = append(cols, createCol("MAX_COUNT_RESET", 265)) + cols = append(cols, createCol("MIN_COUNT_RESET", 265)) + cols = append(cols, createCol("AVG_COUNT_RESET", 1035)) + cols = append(cols, createCol("TIME_ENABLED", 2064)) + cols = append(cols, createCol("TIME_DISABLED", 2064)) + cols = append(cols, createCol("TIME_ELAPSED", 265)) + cols = append(cols, createCol("TIME_RESET", 2064)) + cols = append(cols, createCol("STATUS", 6165)) + cols = append(cols, createCol("TYPE", 6165)) + cols = append(cols, createCol("COMMENT", 6165)) + infSchema["INNODB_METRICS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ID", 776)) + cols = append(cols, createCol("SPACE", 776)) + cols = append(cols, createCol("PATH", 6165)) + cols = append(cols, createCol("SIZE", 778)) + cols = append(cols, createCol("STATE", 6165)) + cols = append(cols, createCol("PURPOSE", 6165)) + infSchema["INNODB_SESSION_TEMP_TABLESPACES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 778)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("FLAG", 263)) + cols = append(cols, createCol("N_COLS", 263)) + cols = append(cols, createCol("SPACE", 265)) + cols = append(cols, createCol("ROW_FORMAT", 6165)) + cols = append(cols, createCol("ZIP_PAGE_SIZE", 776)) + cols = append(cols, createCol("SPACE_TYPE", 6165)) + cols = append(cols, createCol("INSTANT_COLS", 263)) + infSchema["INNODB_TABLES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPACE", 776)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("FLAG", 776)) + cols = append(cols, createCol("ROW_FORMAT", 6165)) + cols = append(cols, createCol("PAGE_SIZE", 776)) + cols = append(cols, createCol("ZIP_PAGE_SIZE", 776)) + cols = append(cols, createCol("SPACE_TYPE", 6165)) + cols = append(cols, createCol("FS_BLOCK_SIZE", 776)) + cols = append(cols, createCol("FILE_SIZE", 778)) + cols = append(cols, createCol("ALLOCATED_SIZE", 778)) + cols = append(cols, createCol("AUTOEXTEND_SIZE", 778)) + cols = append(cols, createCol("SERVER_VERSION", 6165)) + cols = append(cols, createCol("SPACE_VERSION", 776)) + cols = append(cols, createCol("ENCRYPTION", 6165)) + cols = append(cols, createCol("STATE", 6165)) + infSchema["INNODB_TABLESPACES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPACE", 10262)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("PATH", 6165)) + cols = append(cols, createCol("FLAG", 10262)) + cols = append(cols, createCol("SPACE_TYPE", 6165)) + infSchema["INNODB_TABLESPACES_BRIEF"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 778)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("STATS_INITIALIZED", 6165)) + cols = append(cols, createCol("NUM_ROWS", 778)) + cols = append(cols, createCol("CLUST_INDEX_SIZE", 778)) + cols = append(cols, createCol("OTHER_INDEX_SIZE", 778)) + cols = append(cols, createCol("MODIFIED_COUNTER", 778)) + cols = append(cols, createCol("AUTOINC", 778)) + cols = append(cols, createCol("REF_COUNT", 263)) + infSchema["INNODB_TABLESTATS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 778)) + cols = append(cols, createCol("NAME", 6165)) + cols = append(cols, createCol("N_COLS", 776)) + cols = append(cols, createCol("SPACE", 776)) + infSchema["INNODB_TEMP_TABLE_INFO"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("trx_id", 778)) + cols = append(cols, createCol("trx_state", 6165)) + cols = append(cols, createCol("trx_started", 2064)) + cols = append(cols, createCol("trx_requested_lock_id", 6165)) + cols = append(cols, createCol("trx_wait_started", 2064)) + cols = append(cols, createCol("trx_weight", 778)) + cols = append(cols, createCol("trx_mysql_thread_id", 778)) + cols = append(cols, createCol("trx_query", 6165)) + cols = append(cols, createCol("trx_operation_state", 6165)) + cols = append(cols, createCol("trx_tables_in_use", 778)) + cols = append(cols, createCol("trx_tables_locked", 778)) + cols = append(cols, createCol("trx_lock_structs", 778)) + cols = append(cols, createCol("trx_lock_memory_bytes", 778)) + cols = append(cols, createCol("trx_rows_locked", 778)) + cols = append(cols, createCol("trx_rows_modified", 778)) + cols = append(cols, createCol("trx_concurrency_tickets", 778)) + cols = append(cols, createCol("trx_isolation_level", 6165)) + cols = append(cols, createCol("trx_unique_checks", 263)) + cols = append(cols, createCol("trx_foreign_key_checks", 263)) + cols = append(cols, createCol("trx_last_foreign_key_error", 6165)) + cols = append(cols, createCol("trx_adaptive_hash_latched", 263)) + cols = append(cols, createCol("trx_adaptive_hash_timeout", 778)) + cols = append(cols, createCol("trx_is_read_only", 263)) + cols = append(cols, createCol("trx_autocommit_non_locking", 263)) + cols = append(cols, createCol("trx_schedule_weight", 778)) + infSchema["INNODB_TRX"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_ID", 778)) + cols = append(cols, createCol("POS", 776)) + cols = append(cols, createCol("BASE_POS", 776)) + infSchema["INNODB_VIRTUAL"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("ORDINAL_POSITION", 776)) + cols = append(cols, createCol("POSITION_IN_UNIQUE_CONSTRAINT", 776)) + cols = append(cols, createCol("REFERENCED_TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("REFERENCED_TABLE_NAME", 6165)) + cols = append(cols, createCol("REFERENCED_COLUMN_NAME", 6165)) + infSchema["KEY_COLUMN_USAGE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("WORD", 6165)) + cols = append(cols, createCol("RESERVED", 263)) + infSchema["KEYWORDS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("QUERY", 6165)) + cols = append(cols, createCol("TRACE", 6165)) + cols = append(cols, createCol("MISSING_BYTES_BEYOND_MAX_MEM_SIZE", 263)) + cols = append(cols, createCol("INSUFFICIENT_PRIVILEGES", 257)) + infSchema["OPTIMIZER_TRACE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPECIFIC_CATALOG", 6165)) + cols = append(cols, createCol("SPECIFIC_SCHEMA", 6165)) + cols = append(cols, createCol("SPECIFIC_NAME", 6165)) + cols = append(cols, createCol("ORDINAL_POSITION", 778)) + cols = append(cols, createCol("PARAMETER_MODE", 6165)) + cols = append(cols, createCol("PARAMETER_NAME", 6165)) + cols = append(cols, createCol("DATA_TYPE", 6163)) + cols = append(cols, createCol("CHARACTER_MAXIMUM_LENGTH", 265)) + cols = append(cols, createCol("CHARACTER_OCTET_LENGTH", 265)) + cols = append(cols, createCol("NUMERIC_PRECISION", 776)) + cols = append(cols, createCol("NUMERIC_SCALE", 265)) + cols = append(cols, createCol("DATETIME_PRECISION", 776)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("DTD_IDENTIFIER", 6163)) + cols = append(cols, createCol("ROUTINE_TYPE", 2074)) + infSchema["PARAMETERS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("PARTITION_NAME", 6165)) + cols = append(cols, createCol("SUBPARTITION_NAME", 6165)) + cols = append(cols, createCol("PARTITION_ORDINAL_POSITION", 776)) + cols = append(cols, createCol("SUBPARTITION_ORDINAL_POSITION", 776)) + cols = append(cols, createCol("PARTITION_METHOD", 6165)) + cols = append(cols, createCol("SUBPARTITION_METHOD", 6165)) + cols = append(cols, createCol("PARTITION_EXPRESSION", 6165)) + cols = append(cols, createCol("SUBPARTITION_EXPRESSION", 6165)) + cols = append(cols, createCol("PARTITION_DESCRIPTION", 6163)) + cols = append(cols, createCol("TABLE_ROWS", 778)) + cols = append(cols, createCol("AVG_ROW_LENGTH", 778)) + cols = append(cols, createCol("DATA_LENGTH", 778)) + cols = append(cols, createCol("MAX_DATA_LENGTH", 778)) + cols = append(cols, createCol("INDEX_LENGTH", 778)) + cols = append(cols, createCol("DATA_FREE", 778)) + cols = append(cols, createCol("CREATE_TIME", 2061)) + cols = append(cols, createCol("UPDATE_TIME", 2064)) + cols = append(cols, createCol("CHECK_TIME", 2064)) + cols = append(cols, createCol("CHECKSUM", 265)) + cols = append(cols, createCol("PARTITION_COMMENT", 6163)) + cols = append(cols, createCol("NODEGROUP", 6165)) + cols = append(cols, createCol("TABLESPACE_NAME", 6165)) + infSchema["PARTITIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("PLUGIN_NAME", 6165)) + cols = append(cols, createCol("PLUGIN_VERSION", 6165)) + cols = append(cols, createCol("PLUGIN_STATUS", 6165)) + cols = append(cols, createCol("PLUGIN_TYPE", 6165)) + cols = append(cols, createCol("PLUGIN_TYPE_VERSION", 6165)) + cols = append(cols, createCol("PLUGIN_LIBRARY", 6165)) + cols = append(cols, createCol("PLUGIN_LIBRARY_VERSION", 6165)) + cols = append(cols, createCol("PLUGIN_AUTHOR", 6165)) + cols = append(cols, createCol("PLUGIN_DESCRIPTION", 6165)) + cols = append(cols, createCol("PLUGIN_LICENSE", 6165)) + cols = append(cols, createCol("LOAD_OPTION", 6165)) + infSchema["PLUGINS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("ID", 778)) + cols = append(cols, createCol("USER", 6165)) + cols = append(cols, createCol("HOST", 6165)) + cols = append(cols, createCol("DB", 6165)) + cols = append(cols, createCol("COMMAND", 6165)) + cols = append(cols, createCol("TIME", 263)) + cols = append(cols, createCol("STATE", 6165)) + cols = append(cols, createCol("INFO", 6165)) + infSchema["PROCESSLIST"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("QUERY_ID", 263)) + cols = append(cols, createCol("SEQ", 263)) + cols = append(cols, createCol("STATE", 6165)) + cols = append(cols, createCol("DURATION", 18)) + cols = append(cols, createCol("CPU_USER", 18)) + cols = append(cols, createCol("CPU_SYSTEM", 18)) + cols = append(cols, createCol("CONTEXT_VOLUNTARY", 263)) + cols = append(cols, createCol("CONTEXT_INVOLUNTARY", 263)) + cols = append(cols, createCol("BLOCK_OPS_IN", 263)) + cols = append(cols, createCol("BLOCK_OPS_OUT", 263)) + cols = append(cols, createCol("MESSAGES_SENT", 263)) + cols = append(cols, createCol("MESSAGES_RECEIVED", 263)) + cols = append(cols, createCol("PAGE_FAULTS_MAJOR", 263)) + cols = append(cols, createCol("PAGE_FAULTS_MINOR", 263)) + cols = append(cols, createCol("SWAPS", 263)) + cols = append(cols, createCol("SOURCE_FUNCTION", 6165)) + cols = append(cols, createCol("SOURCE_FILE", 6165)) + cols = append(cols, createCol("SOURCE_LINE", 263)) + infSchema["PROFILING"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("UNIQUE_CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("UNIQUE_CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("UNIQUE_CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("MATCH_OPTION", 2074)) + cols = append(cols, createCol("UPDATE_RULE", 2074)) + cols = append(cols, createCol("DELETE_RULE", 2074)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("REFERENCED_TABLE_NAME", 6165)) + infSchema["REFERENTIAL_CONSTRAINTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("RESOURCE_GROUP_NAME", 6165)) + cols = append(cols, createCol("RESOURCE_GROUP_TYPE", 2074)) + cols = append(cols, createCol("RESOURCE_GROUP_ENABLED", 257)) + cols = append(cols, createCol("VCPU_IDS", 10260)) + cols = append(cols, createCol("THREAD_PRIORITY", 263)) + infSchema["RESOURCE_GROUPS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTOR", 6165)) + cols = append(cols, createCol("GRANTOR_HOST", 6165)) + cols = append(cols, createCol("GRANTEE", 6167)) + cols = append(cols, createCol("GRANTEE_HOST", 6167)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6167)) + cols = append(cols, createCol("TABLE_NAME", 6167)) + cols = append(cols, createCol("COLUMN_NAME", 6167)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 2075)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["ROLE_COLUMN_GRANTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTOR", 6165)) + cols = append(cols, createCol("GRANTOR_HOST", 6165)) + cols = append(cols, createCol("GRANTEE", 6167)) + cols = append(cols, createCol("GRANTEE_HOST", 6167)) + cols = append(cols, createCol("SPECIFIC_CATALOG", 6165)) + cols = append(cols, createCol("SPECIFIC_SCHEMA", 6167)) + cols = append(cols, createCol("SPECIFIC_NAME", 6167)) + cols = append(cols, createCol("ROUTINE_CATALOG", 6165)) + cols = append(cols, createCol("ROUTINE_SCHEMA", 6167)) + cols = append(cols, createCol("ROUTINE_NAME", 6167)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 2075)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["ROLE_ROUTINE_GRANTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTOR", 6165)) + cols = append(cols, createCol("GRANTOR_HOST", 6165)) + cols = append(cols, createCol("GRANTEE", 6167)) + cols = append(cols, createCol("GRANTEE_HOST", 6167)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6167)) + cols = append(cols, createCol("TABLE_NAME", 6167)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 2075)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["ROLE_TABLE_GRANTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SPECIFIC_NAME", 6165)) + cols = append(cols, createCol("ROUTINE_CATALOG", 6165)) + cols = append(cols, createCol("ROUTINE_SCHEMA", 6165)) + cols = append(cols, createCol("ROUTINE_NAME", 6165)) + cols = append(cols, createCol("ROUTINE_TYPE", 2074)) + cols = append(cols, createCol("DATA_TYPE", 6163)) + cols = append(cols, createCol("CHARACTER_MAXIMUM_LENGTH", 265)) + cols = append(cols, createCol("CHARACTER_OCTET_LENGTH", 265)) + cols = append(cols, createCol("NUMERIC_PRECISION", 776)) + cols = append(cols, createCol("NUMERIC_SCALE", 776)) + cols = append(cols, createCol("DATETIME_PRECISION", 776)) + cols = append(cols, createCol("CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("COLLATION_NAME", 6165)) + cols = append(cols, createCol("DTD_IDENTIFIER", 6163)) + cols = append(cols, createCol("ROUTINE_BODY", 6165)) + cols = append(cols, createCol("ROUTINE_DEFINITION", 6163)) + cols = append(cols, createCol("EXTERNAL_NAME", 10264)) + cols = append(cols, createCol("EXTERNAL_LANGUAGE", 6165)) + cols = append(cols, createCol("PARAMETER_STYLE", 6165)) + cols = append(cols, createCol("IS_DETERMINISTIC", 6165)) + cols = append(cols, createCol("SQL_DATA_ACCESS", 2074)) + cols = append(cols, createCol("SQL_PATH", 10264)) + cols = append(cols, createCol("SECURITY_TYPE", 2074)) + cols = append(cols, createCol("CREATED", 2061)) + cols = append(cols, createCol("LAST_ALTERED", 2061)) + cols = append(cols, createCol("SQL_MODE", 2075)) + cols = append(cols, createCol("ROUTINE_COMMENT", 6163)) + cols = append(cols, createCol("DEFINER", 6165)) + cols = append(cols, createCol("CHARACTER_SET_CLIENT", 6165)) + cols = append(cols, createCol("COLLATION_CONNECTION", 6165)) + cols = append(cols, createCol("DATABASE_COLLATION", 6165)) + infSchema["ROUTINES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["SCHEMA_PRIVILEGES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CATALOG_NAME", 6165)) + cols = append(cols, createCol("SCHEMA_NAME", 6165)) + cols = append(cols, createCol("DEFAULT_CHARACTER_SET_NAME", 6165)) + cols = append(cols, createCol("DEFAULT_COLLATION_NAME", 6165)) + cols = append(cols, createCol("SQL_PATH", 10264)) + cols = append(cols, createCol("DEFAULT_ENCRYPTION", 2074)) + infSchema["SCHEMATA"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CATALOG_NAME", 6165)) + cols = append(cols, createCol("SCHEMA_NAME", 6165)) + cols = append(cols, createCol("OPTIONS", 6165)) + infSchema["SCHEMATA_EXTENSIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("SRS_NAME", 6165)) + cols = append(cols, createCol("SRS_ID", 776)) + cols = append(cols, createCol("GEOMETRY_TYPE_NAME", 6163)) + infSchema["ST_GEOMETRY_COLUMNS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("SRS_NAME", 6165)) + cols = append(cols, createCol("SRS_ID", 776)) + cols = append(cols, createCol("ORGANIZATION", 6165)) + cols = append(cols, createCol("ORGANIZATION_COORDSYS_ID", 776)) + cols = append(cols, createCol("DEFINITION", 6165)) + cols = append(cols, createCol("DESCRIPTION", 6165)) + infSchema["ST_SPATIAL_REFERENCE_SYSTEMS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("UNIT_NAME", 6165)) + cols = append(cols, createCol("UNIT_TYPE", 6165)) + cols = append(cols, createCol("CONVERSION_FACTOR", 1036)) + cols = append(cols, createCol("DESCRIPTION", 6165)) + infSchema["ST_UNITS_OF_MEASURE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("NON_UNIQUE", 263)) + cols = append(cols, createCol("INDEX_SCHEMA", 6165)) + cols = append(cols, createCol("INDEX_NAME", 6165)) + cols = append(cols, createCol("SEQ_IN_INDEX", 776)) + cols = append(cols, createCol("COLUMN_NAME", 6165)) + cols = append(cols, createCol("COLLATION", 6165)) + cols = append(cols, createCol("CARDINALITY", 265)) + cols = append(cols, createCol("SUB_PART", 265)) + cols = append(cols, createCol("PACKED", 10264)) + cols = append(cols, createCol("NULLABLE", 6165)) + cols = append(cols, createCol("INDEX_TYPE", 6165)) + cols = append(cols, createCol("COMMENT", 6165)) + cols = append(cols, createCol("INDEX_COMMENT", 6165)) + cols = append(cols, createCol("IS_VISIBLE", 6165)) + cols = append(cols, createCol("EXPRESSION", 6163)) + infSchema["STATISTICS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("CONSTRAINT_TYPE", 6165)) + cols = append(cols, createCol("ENFORCED", 6165)) + infSchema["TABLE_CONSTRAINTS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("CONSTRAINT_CATALOG", 6165)) + cols = append(cols, createCol("CONSTRAINT_SCHEMA", 6165)) + cols = append(cols, createCol("CONSTRAINT_NAME", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("ENGINE_ATTRIBUTE", 2078)) + cols = append(cols, createCol("SECONDARY_ENGINE_ATTRIBUTE", 2078)) + infSchema["TABLE_CONSTRAINTS_EXTENSIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["TABLE_PRIVILEGES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("TABLE_TYPE", 2074)) + cols = append(cols, createCol("ENGINE", 6165)) + cols = append(cols, createCol("VERSION", 263)) + cols = append(cols, createCol("ROW_FORMAT", 2074)) + cols = append(cols, createCol("TABLE_ROWS", 778)) + cols = append(cols, createCol("AVG_ROW_LENGTH", 778)) + cols = append(cols, createCol("DATA_LENGTH", 778)) + cols = append(cols, createCol("MAX_DATA_LENGTH", 778)) + cols = append(cols, createCol("INDEX_LENGTH", 778)) + cols = append(cols, createCol("DATA_FREE", 778)) + cols = append(cols, createCol("AUTO_INCREMENT", 778)) + cols = append(cols, createCol("CREATE_TIME", 2061)) + cols = append(cols, createCol("UPDATE_TIME", 2064)) + cols = append(cols, createCol("CHECK_TIME", 2064)) + cols = append(cols, createCol("TABLE_COLLATION", 6165)) + cols = append(cols, createCol("CHECKSUM", 265)) + cols = append(cols, createCol("CREATE_OPTIONS", 6165)) + cols = append(cols, createCol("TABLE_COMMENT", 6163)) + infSchema["TABLES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("ENGINE_ATTRIBUTE", 2078)) + cols = append(cols, createCol("SECONDARY_ENGINE_ATTRIBUTE", 2078)) + infSchema["TABLES_EXTENSIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLESPACE_NAME", 6165)) + cols = append(cols, createCol("ENGINE", 6165)) + cols = append(cols, createCol("TABLESPACE_TYPE", 6165)) + cols = append(cols, createCol("LOGFILE_GROUP_NAME", 6165)) + cols = append(cols, createCol("EXTENT_SIZE", 778)) + cols = append(cols, createCol("AUTOEXTEND_SIZE", 778)) + cols = append(cols, createCol("MAXIMUM_SIZE", 778)) + cols = append(cols, createCol("NODEGROUP_ID", 778)) + cols = append(cols, createCol("TABLESPACE_COMMENT", 6165)) + infSchema["TABLESPACES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLESPACE_NAME", 6165)) + cols = append(cols, createCol("ENGINE_ATTRIBUTE", 2078)) + infSchema["TABLESPACES_EXTENSIONS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TRIGGER_CATALOG", 6165)) + cols = append(cols, createCol("TRIGGER_SCHEMA", 6165)) + cols = append(cols, createCol("TRIGGER_NAME", 6165)) + cols = append(cols, createCol("EVENT_MANIPULATION", 2074)) + cols = append(cols, createCol("EVENT_OBJECT_CATALOG", 6165)) + cols = append(cols, createCol("EVENT_OBJECT_SCHEMA", 6165)) + cols = append(cols, createCol("EVENT_OBJECT_TABLE", 6165)) + cols = append(cols, createCol("ACTION_ORDER", 776)) + cols = append(cols, createCol("ACTION_CONDITION", 10264)) + cols = append(cols, createCol("ACTION_STATEMENT", 6163)) + cols = append(cols, createCol("ACTION_ORIENTATION", 6165)) + cols = append(cols, createCol("ACTION_TIMING", 2074)) + cols = append(cols, createCol("ACTION_REFERENCE_OLD_TABLE", 10264)) + cols = append(cols, createCol("ACTION_REFERENCE_NEW_TABLE", 10264)) + cols = append(cols, createCol("ACTION_REFERENCE_OLD_ROW", 6165)) + cols = append(cols, createCol("ACTION_REFERENCE_NEW_ROW", 6165)) + cols = append(cols, createCol("CREATED", 2061)) + cols = append(cols, createCol("SQL_MODE", 2075)) + cols = append(cols, createCol("DEFINER", 6165)) + cols = append(cols, createCol("CHARACTER_SET_CLIENT", 6165)) + cols = append(cols, createCol("COLLATION_CONNECTION", 6165)) + cols = append(cols, createCol("DATABASE_COLLATION", 6165)) + infSchema["TRIGGERS"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("USER", 6167)) + cols = append(cols, createCol("HOST", 6167)) + cols = append(cols, createCol("ATTRIBUTE", 6163)) + infSchema["USER_ATTRIBUTES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("GRANTEE", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("PRIVILEGE_TYPE", 6165)) + cols = append(cols, createCol("IS_GRANTABLE", 6165)) + infSchema["USER_PRIVILEGES"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("SPECIFIC_CATALOG", 6165)) + cols = append(cols, createCol("SPECIFIC_SCHEMA", 6165)) + cols = append(cols, createCol("SPECIFIC_NAME", 6165)) + infSchema["VIEW_ROUTINE_USAGE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("VIEW_CATALOG", 6165)) + cols = append(cols, createCol("VIEW_SCHEMA", 6165)) + cols = append(cols, createCol("VIEW_NAME", 6165)) + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + infSchema["VIEW_TABLE_USAGE"] = cols + cols = []vindexes.Column{} + cols = append(cols, createCol("TABLE_CATALOG", 6165)) + cols = append(cols, createCol("TABLE_SCHEMA", 6165)) + cols = append(cols, createCol("TABLE_NAME", 6165)) + cols = append(cols, createCol("VIEW_DEFINITION", 6163)) + cols = append(cols, createCol("CHECK_OPTION", 2074)) + cols = append(cols, createCol("IS_UPDATABLE", 2074)) + cols = append(cols, createCol("DEFINER", 6165)) + cols = append(cols, createCol("SECURITY_TYPE", 6165)) + cols = append(cols, createCol("CHARACTER_SET_CLIENT", 6165)) + cols = append(cols, createCol("COLLATION_CONNECTION", 6165)) + infSchema["VIEWS"] = cols + + return infSchema +} + +type infoSchemaWithColumns struct { + inner SchemaInformation + infoSchemaData map[string][]vindexes.Column +} + +// newSchemaInfo returns a SchemaInformation that has the column information for all info_schema tables +func newSchemaInfo(inner SchemaInformation) SchemaInformation { + version := servenv.MySQLServerVersion() + var infoSchema map[string][]vindexes.Column + if strings.HasPrefix(version, "5.7") { + infoSchema = getInfoSchema57() + } else { + infoSchema = getInfoSchema80() + } + return &infoSchemaWithColumns{inner: inner, infoSchemaData: infoSchema} +} + +// FindTableOrVindex implements the SchemaInformation interface +func (i *infoSchemaWithColumns) FindTableOrVindex(tbl sqlparser.TableName) (*vindexes.Table, vindexes.Vindex, string, topodatapb.TabletType, key.Destination, error) { + if !strings.EqualFold(tbl.Qualifier.String(), "information_schema") { + return i.inner.FindTableOrVindex(tbl) + } + + ks := vindexes.Keyspace{ + Name: "information_schema", + Sharded: false, + } + cols := i.infoSchemaData[strings.ToUpper(tbl.Name.String())] + vtbl := &vindexes.Table{ + Type: "View", + Name: sqlparser.NewIdentifierCS(tbl.Name.String()), + Keyspace: &ks, + Columns: cols, + ColumnListAuthoritative: true, + } + return vtbl, nil, "", topodatapb.TabletType_UNKNOWN, nil, nil +} + +// ConnCollation implements the SchemaInformation interface +func (i *infoSchemaWithColumns) ConnCollation() collations.ID { + return i.inner.ConnCollation() +} diff --git a/go/vt/vtgate/semantics/info_schema_gen_test.go b/go/vt/vtgate/semantics/info_schema_gen_test.go new file mode 100644 index 00000000000..c5fe0123852 --- /dev/null +++ b/go/vt/vtgate/semantics/info_schema_gen_test.go @@ -0,0 +1,228 @@ +/* +Copyright 2022 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package semantics + +import ( + "database/sql" + "fmt" + "regexp" + "strings" + "testing" + + _ "github.com/go-sql-driver/mysql" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/sqlparser" +) + +func TestGenerateInfoSchemaMap(t *testing.T) { + t.Skip("run manually to re-create the content of the getInfoSchema functions") + b := new(strings.Builder) + + db, err := sql.Open("mysql", "root@tcp(127.0.0.1:3306)/test") + require.NoError(t, err) + defer db.Close() + + for _, tbl := range informationSchemaTables80 { + b.WriteString("cols = []vindexes.Column{}\n") + result, err := db.Query(fmt.Sprintf("show columns from information_schema.`%s`", tbl)) + require.NoError(t, err) + defer result.Close() + for result.Next() { + var r row + result.Scan(&r.Field, &r.Type, &r.Null, &r.Key, &r.Default, &r.Extra) + allString := re.FindStringSubmatch(r.Type) + var typ string + if allString == nil { + typ = r.Type + } else { + typ = allString[1] + } + unsigned := false + if idx := strings.Index(typ, "unsigned"); idx > 0 { + typ = typ[:idx-1] + unsigned = true + } + i2 := sqlparser.SQLTypeToQueryType(typ, unsigned) + if int(i2) == 0 { + t.Fatalf("%s %s", tbl, r.Field) + } + b.WriteString(fmt.Sprintf("cols = append(cols, createCol(\"%s\", %d))\n", r.Field, int(i2))) + } + b.WriteString(fmt.Sprintf("infSchema[\"%s\"] = cols\n", tbl)) + } + + fmt.Println(b.String()) +} + +var ( + informationSchemaTables57 = []string{ + "CHARACTER_SETS", + "COLLATION_CHARACTER_SET_APPLICABILITY", + "COLLATIONS", + "COLUMN_PRIVILEGES", + "COLUMNS", + "ENGINES", + "EVENTS", + "FILES", + "GLOBAL_STATUS", + "GLOBAL_VARIABLES", + "INNODB_BUFFER_PAGE", + "INNODB_BUFFER_PAGE_LRU", + "INNODB_BUFFER_POOL_STATS", + "INNODB_CMP", + "INNODB_CMP_PER_INDEX", + "INNODB_CMP_PER_INDEX_RESET", + "INNODB_CMP_RESET", + "INNODB_CMPMEM", + "INNODB_CMPMEM_RESET", + "INNODB_FT_BEING_DELETED", + "INNODB_FT_CONFIG", + "INNODB_FT_DEFAULT_STOPWORD", + "INNODB_FT_DELETED", + "INNODB_FT_INDEX_CACHE", + "INNODB_FT_INDEX_TABLE", + "INNODB_LOCK_WAITS", + "INNODB_LOCKS", + "INNODB_METRICS", + "INNODB_SYS_COLUMNS", + "INNODB_SYS_DATAFILES", + "INNODB_SYS_FIELDS", + "INNODB_SYS_FOREIGN", + "INNODB_SYS_FOREIGN_COLS", + "INNODB_SYS_INDEXES", + "INNODB_SYS_TABLES", + "INNODB_SYS_TABLESPACES", + "INNODB_SYS_TABLESTATS", + "INNODB_SYS_VIRTUAL", + "INNODB_TEMP_TABLE_INFO", + "INNODB_TRX", + "KEY_COLUMN_USAGE", + "OPTIMIZER_TRACE", + "PARAMETERS", + "PARTITIONS", + "PLUGINS", + "PROCESSLIST", + "PROFILING", + "REFERENTIAL_CONSTRAINTS", + "ROUTINES", + "SCHEMA_PRIVILEGES", + "SCHEMATA", + "SESSION_STATUS", + "SESSION_VARIABLES", + "STATISTICS", + "TABLE_CONSTRAINTS", + "TABLE_PRIVILEGES", + "TABLES", + "TABLESPACES", + "TRIGGERS", + "USER_PRIVILEGES", + "VIEWS", + } + informationSchemaTables80 = []string{ + "ADMINISTRABLE_ROLE_AUTHORIZATIONS", + "APPLICABLE_ROLES", + "CHARACTER_SETS", + "CHECK_CONSTRAINTS", + "COLLATION_CHARACTER_SET_APPLICABILITY", + "COLLATIONS", + "COLUMN_PRIVILEGES", + "COLUMN_STATISTICS", + "COLUMNS", + "COLUMNS_EXTENSIONS", + "ENABLED_ROLES", + "ENGINES", + "EVENTS", + "FILES", + "INNODB_BUFFER_PAGE", + "INNODB_BUFFER_PAGE_LRU", + "INNODB_BUFFER_POOL_STATS", + "INNODB_CACHED_INDEXES", + "INNODB_CMP", + "INNODB_CMP_PER_INDEX", + "INNODB_CMP_PER_INDEX_RESET", + "INNODB_CMP_RESET", + "INNODB_CMPMEM", + "INNODB_CMPMEM_RESET", + "INNODB_COLUMNS", + "INNODB_DATAFILES", + "INNODB_FIELDS", + "INNODB_FOREIGN", + "INNODB_FOREIGN_COLS", + "INNODB_FT_BEING_DELETED", + "INNODB_FT_CONFIG", + "INNODB_FT_DEFAULT_STOPWORD", + "INNODB_FT_DELETED", + "INNODB_FT_INDEX_CACHE", + "INNODB_FT_INDEX_TABLE", + "INNODB_INDEXES", + "INNODB_METRICS", + "INNODB_SESSION_TEMP_TABLESPACES", + "INNODB_TABLES", + "INNODB_TABLESPACES", + "INNODB_TABLESPACES_BRIEF", + "INNODB_TABLESTATS", + "INNODB_TEMP_TABLE_INFO", + "INNODB_TRX", + "INNODB_VIRTUAL", + "KEY_COLUMN_USAGE", + "KEYWORDS", + "OPTIMIZER_TRACE", + "PARAMETERS", + "PARTITIONS", + "PLUGINS", + "PROCESSLIST", + "PROFILING", + "REFERENTIAL_CONSTRAINTS", + "RESOURCE_GROUPS", + "ROLE_COLUMN_GRANTS", + "ROLE_ROUTINE_GRANTS", + "ROLE_TABLE_GRANTS", + "ROUTINES", + "SCHEMA_PRIVILEGES", + "SCHEMATA", + "SCHEMATA_EXTENSIONS", + "ST_GEOMETRY_COLUMNS", + "ST_SPATIAL_REFERENCE_SYSTEMS", + "ST_UNITS_OF_MEASURE", + "STATISTICS", + "TABLE_CONSTRAINTS", + "TABLE_CONSTRAINTS_EXTENSIONS", + "TABLE_PRIVILEGES", + "TABLES", + "TABLES_EXTENSIONS", + "TABLESPACES", + "TABLESPACES_EXTENSIONS", + "TRIGGERS", + "USER_ATTRIBUTES", + "USER_PRIVILEGES", + "VIEW_ROUTINE_USAGE", + "VIEW_TABLE_USAGE", + "VIEWS", + } +) + +type row struct { + Field string + Type string + Null string + Key any + Default any + Extra any +} + +var re = regexp.MustCompile(`(.*)\((.*)\)`) diff --git a/go/vt/vtgate/semantics/table_collector.go b/go/vt/vtgate/semantics/table_collector.go index aa8b4eebf99..8266287abe9 100644 --- a/go/vt/vtgate/semantics/table_collector.go +++ b/go/vt/vtgate/semantics/table_collector.go @@ -84,19 +84,16 @@ func (tc *tableCollector) up(cursor *sqlparser.Cursor) error { case sqlparser.TableName: var tbl *vindexes.Table var vindex vindexes.Vindex - var isInfSchema bool - if sqlparser.SystemSchema(t.Qualifier.String()) { - isInfSchema = true - } else { - var err error - tbl, vindex, _, _, _, err = tc.si.FindTableOrVindex(t) - if err != nil { - return err - } - if tbl == nil && vindex != nil { - tbl = newVindexTable(t.Name) - } + isInfSchema := sqlparser.SystemSchema(t.Qualifier.String()) + var err error + tbl, vindex, _, _, _, err = tc.si.FindTableOrVindex(t) + if err != nil { + return err } + if tbl == nil && vindex != nil { + tbl = newVindexTable(t.Name) + } + scope := tc.scoper.currentScope() tableInfo := tc.createTable(t, node, tbl, isInfSchema, vindex) From af42116c8a6fcfc466516c0fd3eabc8085ce4ca4 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 7 Mar 2023 16:08:08 +0200 Subject: [PATCH 30/53] [release-15.0] Tooling improvements backports (#12527) * Block merge if the `Do Not Merge` label is set (#12489) * Block Merge if the label is set Signed-off-by: Florent Poinsard * fix echo syntax Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard * Improve release process post `v16.0.0 GA` code freeze (#12487) * Update the release instructions document with pre-requisites for release team Signed-off-by: Florent Poinsard * Add Do Not Merge to release Pull Request upon creation Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard * fix typo Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard --- .github/workflows/release_notes_label.yml | 48 ++++++++++++++++------- doc/internal/ReleaseInstructions.md | 10 ++++- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/.github/workflows/release_notes_label.yml b/.github/workflows/release_notes_label.yml index 220bd07da30..becd44cdc7d 100644 --- a/.github/workflows/release_notes_label.yml +++ b/.github/workflows/release_notes_label.yml @@ -14,21 +14,12 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'vitessio/vitess' steps: - - uses: mheap/github-action-required-labels@v1 - name: Check release notes label - id: required_label - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - mode: exactly - count: 0 - labels: "release notes (needs details)" - - - name: Print helper - if: failure() && steps.required_label.outcome == 'failure' + - name: Release Notes label run: | - echo The "release notes (needs details)" label is set. The changes made in this Pull Request need to be documented in the release notes summary "('./doc/releasenotes/15_0_0_summary.md')". Once documented, the "release notes (needs details)" label can be removed. - exit 1 + if [[ "${{contains( github.event.pull_request.labels.*.name, 'release notes (needs details)')}}" == "true" ]]; then + echo The "release notes (needs details)" label is set. The changes made in this Pull Request need to be documented in the release notes summary "('./doc/releasenotes/16_0_0_summary.md')". Once documented, the "release notes (needs details)" label can be removed. + exit 1 + fi - name: Check type and component labels env: @@ -50,3 +41,32 @@ jobs: echo "Expecting PR to have label 'Type: ...'" exit 1 fi + + - name: Check NeedsWebsiteDocsUpdate and NeedsDescriptionUpdate are off + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + LABELS_JSON="/tmp/labels.json" + # Get labels for this pull request + curl -s \ + -H 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Content-type: application/json" \ + "https://api.github.com/repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/labels" \ + > "$LABELS_JSON" + if cat ${LABELS_JSON} | jq -r '.[].name ' | grep -q 'NeedsDescriptionUpdate' ; then + echo "Expecting PR to not have the NeedsDescriptionUpdate label, please update the PR's description and remove the label." + exit 1 + fi + if cat ${LABELS_JSON} | jq -r '.[].name ' | grep -q 'NeedsWebsiteDocsUpdate' ; then + echo "Expecting PR to not have the NeedsWebsiteDocsUpdate label, please update the documentation and remove the label." + exit 1 + fi + + + - name: Do Not Merge label + run: | + if [[ "${{contains( github.event.pull_request.labels.*.name, 'Do Not Merge')}}" == "true" ]]; then + echo "This PR should not be merged. The 'Do Not Merge' label is set. Please unset it if you wish to merge this PR." + exit 1 + fi \ No newline at end of file diff --git a/doc/internal/ReleaseInstructions.md b/doc/internal/ReleaseInstructions.md index bff6fa640d4..b2c3cf0fcf8 100644 --- a/doc/internal/ReleaseInstructions.md +++ b/doc/internal/ReleaseInstructions.md @@ -118,9 +118,17 @@ Create the `settings.xml` in the `$HOME/.m2/` directory as described in their [i ## Release Cutover -In this section we describe our current release process. We begin with a short [**overview**](#overview). +In this section we describe our current release process. We begin with a list of [**pre-requisites for the release team**](#pre-requisites) and with a short [**overview**](#overview). The release process is divided into three parts: [**Pre-Release**](#pre-release), [**Release**](#release), [**Post-Release**](#post-release), which are detailed after the overview. +### Pre-Requisites + +This section highlights the different pre-requisites the release team has to meet before releasing. + +- The tool `gh` must be installed locally and ready to be used. +- You must have access to the Java release, more information in the [**Java Packages**](#java-packages) section. +- You must be able to create branches and have admin right on the `vitessio/vitess` and `planetscale/vitess-operator` repositories. + ### Overview #### Schedule From 01e4d8e364fe7e8ec559765059f4b17605da06ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicent=20Mart=C3=AD?= <42793+vmg@users.noreply.github.com> Date: Wed, 8 Mar 2023 11:38:14 +0100 Subject: [PATCH 31/53] collations: fix sorting in UCA900 collations (#12555) (#12562) * collations: fix sorting in UCA900 collations When using the fast iterator to _compare_ two strings with an UCA collation, we need to keep in mind that the weights in the collation are in BIG ENDIAN (this is the output format for the weight strings, so we store the weights this way), so comparing them directly will not result in the proper collation order. They need to be byte-swapped before they can be compared with an arithmetic operation! * collations: comment --------- Signed-off-by: Vicent Marti --- .../collations/internal/uca/iter_fast_900.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/go/mysql/collations/internal/uca/iter_fast_900.go b/go/mysql/collations/internal/uca/iter_fast_900.go index 1d2aafe0f22..cbe32cfdb70 100644 --- a/go/mysql/collations/internal/uca/iter_fast_900.go +++ b/go/mysql/collations/internal/uca/iter_fast_900.go @@ -66,7 +66,7 @@ func (it *FastIterator900) FastForward32(it2 *FastIterator900) int { p1 := it.input p2 := it2.input - var w1, w2 uint32 + var w1, w2 uint16 for len(p1) >= 4 && len(p2) >= 4 { dword1 := *(*uint32)(unsafe.Pointer(&p1[0])) @@ -75,17 +75,20 @@ func (it *FastIterator900) FastForward32(it2 *FastIterator900) int { if nonascii == 0 { if dword1 != dword2 { + // Use the weight string fast tables for quick weight comparisons; + // see (*FastIterator900).NextWeightBlock64 for a description of + // the table format table := it.fastTable - if w1, w2 = table[p1[0]], table[p2[0]]; w1 != w2 { + if w1, w2 = uint16(table[p1[0]]), uint16(table[p2[0]]); w1 != w2 { goto mismatch } - if w1, w2 = table[p1[1]], table[p2[1]]; w1 != w2 { + if w1, w2 = uint16(table[p1[1]]), uint16(table[p2[1]]); w1 != w2 { goto mismatch } - if w1, w2 = table[p1[2]], table[p2[2]]; w1 != w2 { + if w1, w2 = uint16(table[p1[2]]), uint16(table[p2[2]]); w1 != w2 { goto mismatch } - if w1, w2 = table[p1[3]], table[p2[3]]; w1 != w2 { + if w1, w2 = uint16(table[p1[3]]), uint16(table[p2[3]]); w1 != w2 { goto mismatch } } @@ -114,7 +117,8 @@ mismatch: it.unicode++ return 0 } - return int(w1) - int(w2) + // The weights must be byte-swapped before comparison because they're stored in big endian + return int(bits.ReverseBytes16(w1)) - int(bits.ReverseBytes16(w2)) } // NextWeightBlock64 takes a byte slice of 16 bytes and fills it with the next From 2648cdb3978bb60c72cdce2d7aee335a4faac631 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Thu, 9 Mar 2023 06:08:29 +0000 Subject: [PATCH 32/53] handle filter on top of UNION (#12543) * handle filter on top of UNION Signed-off-by: Andres Taylor * fix: conflict Signed-off-by: Harshit Gangal --------- Signed-off-by: Andres Taylor Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- .../planbuilder/abstract/concatenate.go | 14 +++ .../testdata/systemtables_cases80.json | 95 +++++++++++++++++-- .../testdata/unsupported_cases.json | 12 +-- 3 files changed, 109 insertions(+), 12 deletions(-) diff --git a/go/vt/vtgate/planbuilder/abstract/concatenate.go b/go/vt/vtgate/planbuilder/abstract/concatenate.go index c3d8a1e7621..4dba7d33ac7 100644 --- a/go/vt/vtgate/planbuilder/abstract/concatenate.go +++ b/go/vt/vtgate/planbuilder/abstract/concatenate.go @@ -47,6 +47,20 @@ func (c *Concatenate) TableID() semantics.TableSet { // PushPredicate implements the Operator interface func (c *Concatenate) PushPredicate(expr sqlparser.Expr, semTable *semantics.SemTable) (LogicalOperator, error) { + op, err := c.tryPush(expr, semTable) + if err == nil { + return op, nil + } + + // if we fail to push down the predicate, we can always evaluate it at the vtgate level + filter := &Filter{ + Source: c, + Predicates: []sqlparser.Expr{expr}, + } + return filter, nil +} + +func (c *Concatenate) tryPush(expr sqlparser.Expr, semTable *semantics.SemTable) (LogicalOperator, error) { newSources := make([]LogicalOperator, 0, len(c.Sources)) for index, source := range c.Sources { if len(c.SelectStmts[index].SelectExprs) != 1 { diff --git a/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json index 9d4c8e81e8b..aaaa47879b3 100644 --- a/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json +++ b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json @@ -1741,12 +1741,6 @@ }, "gen4-plan": "symbol id not found" }, - { - "comment": "systable union query in derived table with constraint on outside (star projection)", - "query": "select * from (select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `constraint_name` = 'primary'", - "v3-plan": "symbol constraint_name not found in table or subquery", - "gen4-plan": "can't push predicates on concatenate" - }, { "comment": "table_schema OR predicate\n# It is unsupported because we do not route queries to multiple keyspaces right now", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", @@ -1783,5 +1777,94 @@ "information_schema.TABLES" ] } + }, + { + "comment": "Query from TypeORM", + "query": "SELECT * FROM ( SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'fuelings' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'order_payments' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'pools' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'orders' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'order_hops' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'markets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'market_outlets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'prefuel' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'billing_statements' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'perp_markets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'perp_market_outlets' ) `kcu` WHERE `CONSTRAINT_NAME` = 'PRIMARY'", + "v3-plan": "symbol CONSTRAINT_NAME not found in table or subquery", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM ( SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'fuelings' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'order_payments' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'pools' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'orders' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'order_hops' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'markets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'market_outlets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'prefuel' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'billing_statements' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'perp_markets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'perp_market_outlets' ) `kcu` WHERE `CONSTRAINT_NAME` = 'PRIMARY'", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "Inputs": [ + { + "OperatorType": "Filter", + "Predicate": "kcu.CONSTRAINT_NAME = 'PRIMARY'", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1", + "Query": "select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME2 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME3 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME4 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME5 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME6 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME7 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME8 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME9 union select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME10", + "SysTableTableName": "[kcu_TABLE_NAME10:VARCHAR(\"perp_market_outlets\"), kcu_TABLE_NAME1:VARCHAR(\"order_payments\"), kcu_TABLE_NAME2:VARCHAR(\"pools\"), kcu_TABLE_NAME3:VARCHAR(\"orders\"), kcu_TABLE_NAME4:VARCHAR(\"order_hops\"), kcu_TABLE_NAME5:VARCHAR(\"markets\"), kcu_TABLE_NAME6:VARCHAR(\"market_outlets\"), kcu_TABLE_NAME7:VARCHAR(\"prefuel\"), kcu_TABLE_NAME8:VARCHAR(\"billing_statements\"), kcu_TABLE_NAME9:VARCHAR(\"perp_markets\"), kcu_TABLE_NAME:VARCHAR(\"fuelings\")]", + "SysTableTableSchema": "[VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE" + } + ] + } + ] + }, + "TablesUsed": [ + "information_schema.KEY_COLUMN_USAGE" + ] + } + }, + { + "comment": "systable union query in derived table with constraint on outside (without star projection)", + "query": "select CONSTRAINT_NAME from (select CONSTRAINT_NAME from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select CONSTRAINT_NAME from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `CONSTRAINT_NAME` = 'primary'", + "v3-plan": "unsupported: filtering on results of cross-shard subquery", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select CONSTRAINT_NAME from (select CONSTRAINT_NAME from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select CONSTRAINT_NAME from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `CONSTRAINT_NAME` = 'primary'", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 0 + ], + "Inputs": [ + { + "OperatorType": "Filter", + "Predicate": "CONSTRAINT_NAME = 'primary'", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select CONSTRAINT_NAME from information_schema.key_column_usage as kcu where 1 != 1 union select CONSTRAINT_NAME from information_schema.key_column_usage as kcu where 1 != 1", + "Query": "select CONSTRAINT_NAME from information_schema.key_column_usage as kcu where kcu.table_schema = :__vtschemaname and kcu.table_name = :kcu_table_name union select CONSTRAINT_NAME from information_schema.key_column_usage as kcu where kcu.table_schema = :__vtschemaname and kcu.table_name = :kcu_table_name1", + "SysTableTableName": "[kcu_table_name1:VARCHAR(\"music\"), kcu_table_name:VARCHAR(\"user_extra\")]", + "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"user\")]", + "Table": "information_schema.key_column_usage" + } + ] + } + ] + }, + "TablesUsed": [ + "information_schema.key_column_usage" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 1c49a7368fd..5a8e11c7d4d 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -447,12 +447,6 @@ "v3-plan": "unsupported: cross-shard query with aggregates", "gen4-plan": "using aggregation on top of a *planbuilder.concatenateGen4 plan is not yet supported" }, - { - "comment": "systable union query in derived table with constraint on outside (without star projection)", - "query": "select id from (select id from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select id from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `id` = 'primary'", - "v3-plan": "unsupported: filtering on results of cross-shard subquery", - "gen4-plan": "symbol id not found" - }, { "comment": "insert having subquery in row values", "query": "insert into user(id, name) values ((select 1 from user where id = 1), 'A')", @@ -472,5 +466,11 @@ "comment": "mix lock with other expr", "query": "select get_lock('xyz', 10), 1 from dual", "plan": "unsupported: lock function and other expression in same select query" + }, + { + "comment": "systable union query in derived table with constraint on outside (star projection)", + "query": "select * from (select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `constraint_name` = 'primary'", + "v3-plan": "symbol constraint_name not found in table or subquery", + "gen4-plan": "unsupported: pushing projection 'constraint_name' on *sqlparser.Union" } ] From 1c2ed6b1b459ad6a4cfd62be4c0ce2d0e5a180b1 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 9 Mar 2023 13:31:19 +0200 Subject: [PATCH 33/53] [release-15.0] CI: extend timeouts in onlineddl_vrepl due to slow CI runners (#12583) (#12587) * CI: extend timeouts in onlineddl_vrepl due to slow CI runners Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * increase even further Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --------- Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go index c3364a94434..93420b0f326 100644 --- a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go +++ b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go @@ -46,8 +46,8 @@ var ( onlineDDLThrottlerAppName = "online-ddl" vstreamerThrottlerAppName = "vstreamer" - normalMigrationWait = 20 * time.Second - extendedMigrationWait = 20 * time.Second + normalMigrationWait = 45 * time.Second + extendedMigrationWait = 60 * time.Second hostname = "localhost" keyspaceName = "ks" From 5e9de1f9fec1648dcaff99b81e86613d288f87b5 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Thu, 9 Mar 2023 16:10:35 +0200 Subject: [PATCH 34/53] resolve conflict (#12591) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- test/config.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/config.json b/test/config.json index 6604456c064..b3d926ed016 100644 --- a/test/config.json +++ b/test/config.json @@ -261,7 +261,7 @@ }, "onlineddl_ghost": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/ghost"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/ghost", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_ghost", @@ -270,7 +270,7 @@ }, "onlineddl_vrepl": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/vrepl"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/vrepl", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_vrepl", @@ -306,7 +306,7 @@ }, "onlineddl_revert": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/revert"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/revert", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_revert", @@ -315,7 +315,7 @@ }, "onlineddl_revertible": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/revertible"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/revertible", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_revertible", @@ -324,7 +324,7 @@ }, "onlineddl_declarative": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/declarative"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/declarative", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_declarative", @@ -333,7 +333,7 @@ }, "onlineddl_singleton": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/singleton"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/singleton", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_singleton", @@ -342,7 +342,7 @@ }, "onlineddl_scheduler": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/scheduler"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/scheduler", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_scheduler", @@ -351,7 +351,7 @@ }, "schemadiff_vrepl": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/schemadiff/vrepl"], + "Args": ["vitess.io/vitess/go/test/endtoend/schemadiff/vrepl", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "schemadiff_vrepl", From ab1d0fe8886106cc7e6cd701580134c35258befa Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 13 Mar 2023 17:05:53 -0400 Subject: [PATCH 35/53] Purge logs without panicking (#12187) (#12617) * Purge logs without panicking * Purge logs without panicking * try moving the goroutine to the func itself --------- Signed-off-by: Andrew Mason --- go/cmd/query_analyzer/query_analyzer.go | 1 + go/cmd/rulesctl/cmd/main.go | 2 ++ go/cmd/vtadmin/main.go | 2 ++ go/cmd/vtclient/vtclient.go | 2 ++ go/cmd/vtctldclient/command/root.go | 2 ++ go/cmd/zk/zkcmd.go | 1 + go/vt/logutil/purge.go | 9 +++++--- go/vt/servenv/purgelogs.go | 28 ------------------------- go/vt/servenv/servenv.go | 4 ++++ 9 files changed, 20 insertions(+), 31 deletions(-) delete mode 100644 go/vt/servenv/purgelogs.go diff --git a/go/cmd/query_analyzer/query_analyzer.go b/go/cmd/query_analyzer/query_analyzer.go index 087c88fa5f3..2138bde2673 100644 --- a/go/cmd/query_analyzer/query_analyzer.go +++ b/go/cmd/query_analyzer/query_analyzer.go @@ -70,6 +70,7 @@ func main() { acl.RegisterFlags(fs) servenv.RegisterMySQLServerFlags(fs) _flag.Parse(fs) + logutil.PurgeLogs() for _, filename := range _flag.Args() { fmt.Printf("processing: %s\n", filename) if err := processFile(filename); err != nil { diff --git a/go/cmd/rulesctl/cmd/main.go b/go/cmd/rulesctl/cmd/main.go index d100b8c8680..1b5ab30acfd 100644 --- a/go/cmd/rulesctl/cmd/main.go +++ b/go/cmd/rulesctl/cmd/main.go @@ -4,6 +4,7 @@ import ( "github.com/spf13/cobra" _flag "vitess.io/vitess/go/internal/flag" + "vitess.io/vitess/go/vt/logutil" ) var configFile string @@ -14,6 +15,7 @@ func Main() *cobra.Command { Args: cobra.NoArgs, PreRun: func(cmd *cobra.Command, args []string) { _flag.TrickGlog() + logutil.PurgeLogs() }, Run: func(cmd *cobra.Command, _ []string) { cmd.Help() }, } diff --git a/go/cmd/vtadmin/main.go b/go/cmd/vtadmin/main.go index 4c1b3666ebd..210e2edb918 100644 --- a/go/cmd/vtadmin/main.go +++ b/go/cmd/vtadmin/main.go @@ -26,6 +26,7 @@ import ( "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/vtadmin" "vitess.io/vitess/go/vt/vtadmin/cache" @@ -58,6 +59,7 @@ var ( Use: "vtadmin", PreRun: func(cmd *cobra.Command, args []string) { _flag.TrickGlog() + logutil.PurgeLogs() if opts.EnableTracing || httpOpts.EnableTracing { startTracing(cmd) diff --git a/go/cmd/vtclient/vtclient.go b/go/cmd/vtclient/vtclient.go index 4295766723a..adc060d7737 100644 --- a/go/cmd/vtclient/vtclient.go +++ b/go/cmd/vtclient/vtclient.go @@ -184,6 +184,8 @@ func run() (*results, error) { _flag.Parse(fs) args := _flag.Args() + logutil.PurgeLogs() + if len(args) == 0 { pflag.Usage() return nil, errors.New("no arguments provided. See usage above") diff --git a/go/cmd/vtctldclient/command/root.go b/go/cmd/vtctldclient/command/root.go index aeff58f2986..0adce0774d7 100644 --- a/go/cmd/vtctldclient/command/root.go +++ b/go/cmd/vtctldclient/command/root.go @@ -26,6 +26,7 @@ import ( "github.com/spf13/cobra" "vitess.io/vitess/go/trace" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/vtctl/vtctldclient" ) @@ -49,6 +50,7 @@ var ( // We use PersistentPreRun to set up the tracer, grpc client, and // command context for every command. PersistentPreRunE: func(cmd *cobra.Command, args []string) (err error) { + logutil.PurgeLogs() traceCloser = trace.StartTracing("vtctldclient") if VtctldClientProtocol != "local" { if err := ensureServerArg(); err != nil { diff --git a/go/cmd/zk/zkcmd.go b/go/cmd/zk/zkcmd.go index 6b2c4a3840f..5cc736ea959 100644 --- a/go/cmd/zk/zkcmd.go +++ b/go/cmd/zk/zkcmd.go @@ -147,6 +147,7 @@ func main() { } pflag.Parse() + logutil.PurgeLogs() if help || pflag.Arg(0) == "help" { pflag.Usage() diff --git a/go/vt/logutil/purge.go b/go/vt/logutil/purge.go index 20f028d7187..8d85e15c5c9 100644 --- a/go/vt/logutil/purge.go +++ b/go/vt/logutil/purge.go @@ -127,7 +127,10 @@ func PurgeLogs() { logDir := f.Value.String() program := filepath.Base(os.Args[0]) ticker := time.NewTicker(purgeLogsInterval) - for range ticker.C { - purgeLogsOnce(time.Now(), logDir, program, keepLogsByCtime, keepLogsByMtime) - } + + go func() { + for range ticker.C { + purgeLogsOnce(time.Now(), logDir, program, keepLogsByCtime, keepLogsByMtime) + } + }() } diff --git a/go/vt/servenv/purgelogs.go b/go/vt/servenv/purgelogs.go deleted file mode 100644 index e5edc9e7be2..00000000000 --- a/go/vt/servenv/purgelogs.go +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright 2019 The Vitess Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package servenv - -import ( - "vitess.io/vitess/go/vt/logutil" -) - -func init() { - OnInit(func() { - go logutil.PurgeLogs() - }) - -} diff --git a/go/vt/servenv/servenv.go b/go/vt/servenv/servenv.go index 0b82c93a347..d86afd95e5a 100644 --- a/go/vt/servenv/servenv.go +++ b/go/vt/servenv/servenv.go @@ -319,6 +319,8 @@ func ParseFlags(cmd string) { _flag.Usage() log.Exitf("%s doesn't take any positional arguments, got '%s'", cmd, strings.Join(args, " ")) } + + logutil.PurgeLogs() } // GetFlagSetFor returns the flag set for a given command. @@ -348,6 +350,8 @@ func ParseFlagsWithArgs(cmd string) []string { log.Exitf("%s expected at least one positional argument", cmd) } + logutil.PurgeLogs() + return args } From e3d889be05e446eec86b30bd44edffcde7fad5fe Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 16 Mar 2023 14:37:08 +0200 Subject: [PATCH 36/53] Fix `panic` when executing a prepare statement with over `65,528` parameters (#12614) (#12629) * fix type conversion in query.go for the bitMap size * enhance the TestHighNumberOfParams test * fix test comment --------- Signed-off-by: Florent Poinsard --- go/mysql/query.go | 2 +- .../endtoend/vtgate/queries/misc/misc_test.go | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/go/mysql/query.go b/go/mysql/query.go index 0107e7606bc..f8adb91f60f 100644 --- a/go/mysql/query.go +++ b/go/mysql/query.go @@ -573,7 +573,7 @@ func (c *Conn) parseComStmtExecute(prepareData map[uint32]*PrepareData, data []b } if prepare.ParamsCount > 0 { - bitMap, pos, ok = readBytes(payload, pos, int((prepare.ParamsCount+7)/8)) + bitMap, pos, ok = readBytes(payload, pos, (int(prepare.ParamsCount)+7)/8) if !ok { return stmtID, 0, NewSQLError(CRMalformedPacket, SSUnknownSQLState, "reading NULL-bitmap failed") } diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index ac9cf7473b6..2f77d20b78e 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -17,8 +17,14 @@ limitations under the License. package misc import ( + "database/sql" + "fmt" + "strconv" + "strings" "testing" + _ "github.com/go-sql-driver/mysql" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/test/endtoend/cluster" @@ -113,3 +119,44 @@ func TestCast(t *testing.T) { mcmp.AssertMatches("select cast('3.2' as double)", `[[FLOAT64(3.2)]]`) mcmp.AssertMatches("select cast('3.2' as unsigned)", `[[UINT64(3)]]`) } + +// This test ensures that we support PREPARE statement with 65530 parameters. +// It opens a MySQL connection using the go-mysql driver and execute a select query +// it then checks the result contains the proper rows and that it's not failing. +func TestHighNumberOfParams(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into t1(id1) values (0), (1), (2), (3), (4)") + + paramCount := 65530 + + // create the value and argument slices used to build the prepare stmt + var vals []any + var params []string + for i := 0; i < paramCount; i++ { + vals = append(vals, strconv.Itoa(i)) + params = append(params, "?") + } + + // connect to the vitess cluster + db, err := sql.Open("mysql", fmt.Sprintf("@tcp(%s:%v)/%s", vtParams.Host, vtParams.Port, vtParams.DbName)) + require.NoError(t, err) + + // run the query + r, err := db.Query(fmt.Sprintf("SELECT /*vt+ QUERY_TIMEOUT_MS=10000 */ id1 FROM t1 WHERE id1 in (%s) ORDER BY id1 ASC", strings.Join(params, ", ")), vals...) + require.NoError(t, err) + + // check the results we got, we should get 5 rows with each: 0, 1, 2, 3, 4 + // count is the row number we are currently visiting, also correspond to the + // column value we expect. + count := 0 + for r.Next() { + j := -1 + err := r.Scan(&j) + require.NoError(t, err) + require.Equal(t, j, count) + count++ + } + require.Equal(t, 5, count) +} From 3b0ccd0a02765b1fc8184fd346891bd86b5e2a3b Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 10:35:10 +0200 Subject: [PATCH 37/53] Fix bug in vtexplain around JOINs (#12383) Signed-off-by: Andres Taylor Co-authored-by: Andres Taylor --- .../multi-output/unsharded-output.txt | 5 + go/vt/vtexplain/testdata/test-schema.sql | 6 + go/vt/vtexplain/testdata/test-vschema.json | 1 + .../vtexplain/testdata/unsharded-queries.sql | 1 + go/vt/vtexplain/vtexplain_vttablet.go | 353 ++++++++++-------- 5 files changed, 205 insertions(+), 161 deletions(-) diff --git a/go/vt/vtexplain/testdata/multi-output/unsharded-output.txt b/go/vt/vtexplain/testdata/multi-output/unsharded-output.txt index 8bb3ecef970..0adc5661077 100644 --- a/go/vt/vtexplain/testdata/multi-output/unsharded-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/unsharded-output.txt @@ -45,3 +45,8 @@ select ID from t1 1 ks_unsharded/-: select ID from t1 limit 10001 ---------------------------------------------------------------------- +select t1.id, t2.c2 from t1 join t2 on t1.id = t2.t1_id where t2.c2 in (1) + +1 ks_unsharded/-: select t1.id, t2.c2 from t1 join t2 on t1.id = t2.t1_id where t2.c2 in (1) limit 10001 + +---------------------------------------------------------------------- diff --git a/go/vt/vtexplain/testdata/test-schema.sql b/go/vt/vtexplain/testdata/test-schema.sql index 5b65334796f..d5f9fbad56f 100644 --- a/go/vt/vtexplain/testdata/test-schema.sql +++ b/go/vt/vtexplain/testdata/test-schema.sql @@ -4,6 +4,12 @@ create table t1 ( floatval float not null default 0, primary key (id) ); +create table t2 ( + id bigint(20) unsigned not null, + t1_id bigint(20) unsigned not null default 0, + c2 bigint(20) null, + primary key (id) +); create table user ( id bigint, diff --git a/go/vt/vtexplain/testdata/test-vschema.json b/go/vt/vtexplain/testdata/test-vschema.json index a50e11e92ae..f4350efa56d 100644 --- a/go/vt/vtexplain/testdata/test-vschema.json +++ b/go/vt/vtexplain/testdata/test-vschema.json @@ -3,6 +3,7 @@ "sharded": false, "tables": { "t1": {}, + "t2": {}, "table_not_in_schema": {} } }, diff --git a/go/vt/vtexplain/testdata/unsharded-queries.sql b/go/vt/vtexplain/testdata/unsharded-queries.sql index f0147ac5d6e..712245f3338 100644 --- a/go/vt/vtexplain/testdata/unsharded-queries.sql +++ b/go/vt/vtexplain/testdata/unsharded-queries.sql @@ -6,3 +6,4 @@ update t1 set floatval = 9.99; delete from t1 where id = 100; insert into t1 (id,intval,floatval) values (1,2,3.14) on duplicate key update intval=3, floatval=3.14; select ID from t1; +select t1.id, t2.c2 from t1 join t2 on t1.id = t2.t1_id where t2.c2 in (1); \ No newline at end of file diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index ee94946e5c1..05932f785a0 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -504,199 +504,230 @@ func (t *explainTablet) HandleQuery(c *mysql.Conn, query string, callback func(* } switch sqlparser.Preview(query) { case sqlparser.StmtSelect: - // Parse the select statement to figure out the table and columns - // that were referenced so that the synthetic response has the - // expected field names and types. - stmt, err := sqlparser.Parse(query) + var err error + result, err = t.handleSelect(query) if err != nil { return err } - - var selStmt *sqlparser.Select - switch stmt := stmt.(type) { - case *sqlparser.Select: - selStmt = stmt - case *sqlparser.Union: - selStmt = sqlparser.GetFirstSelect(stmt) - default: - return fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) + case sqlparser.StmtBegin, sqlparser.StmtCommit, sqlparser.StmtSet, + sqlparser.StmtSavepoint, sqlparser.StmtSRollback, sqlparser.StmtRelease: + result = &sqltypes.Result{} + case sqlparser.StmtShow: + result = &sqltypes.Result{Fields: sqltypes.MakeTestFields("", "")} + case sqlparser.StmtInsert, sqlparser.StmtReplace, sqlparser.StmtUpdate, sqlparser.StmtDelete: + result = &sqltypes.Result{ + RowsAffected: 1, } + default: + return fmt.Errorf("unsupported query %s", query) + } - // Gen4 supports more complex queries so we now need to - // handle multiple FROM clauses - tables := make([]*sqlparser.AliasedTableExpr, len(selStmt.From)) - for _, from := range selStmt.From { - tables = append(tables, getTables(from)...) - } + return callback(result) +} - tableColumnMap := map[sqlparser.IdentifierCS]map[string]querypb.Type{} - for _, table := range tables { - if table == nil { - continue - } +func (t *explainTablet) handleSelect(query string) (*sqltypes.Result, error) { + // Parse the select statement to figure out the table and columns + // that were referenced so that the synthetic response has the + // expected field names and types. + stmt, err := sqlparser.Parse(query) + if err != nil { + return nil, err + } - tableName := sqlparser.String(sqlparser.GetTableName(table.Expr)) - columns, exists := t.vte.getGlobalTabletEnv().tableColumns[tableName] - if !exists && tableName != "" && tableName != "dual" { - return fmt.Errorf("unable to resolve table name %s", tableName) - } + var selStmt *sqlparser.Select + switch stmt := stmt.(type) { + case *sqlparser.Select: + selStmt = stmt + case *sqlparser.Union: + selStmt = sqlparser.GetFirstSelect(stmt) + default: + return nil, fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) + } - colTypeMap := map[string]querypb.Type{} + // Gen4 supports more complex queries so we now need to + // handle multiple FROM clauses + tables := make([]*sqlparser.AliasedTableExpr, len(selStmt.From)) + for _, from := range selStmt.From { + tables = append(tables, getTables(from)...) + } - if table.As.IsEmpty() { - tableColumnMap[sqlparser.GetTableName(table.Expr)] = colTypeMap - } else { - tableColumnMap[table.As] = colTypeMap - } + tableColumnMap := map[sqlparser.IdentifierCS]map[string]querypb.Type{} + for _, table := range tables { + if table == nil { + continue + } - for k, v := range columns { - if colType, exists := colTypeMap[k]; exists { - if colType != v { - return fmt.Errorf("column type mismatch for column : %s, types: %d vs %d", k, colType, v) - } - continue - } - colTypeMap[k] = v - } + tableName := sqlparser.String(sqlparser.GetTableName(table.Expr)) + columns, exists := t.vte.getGlobalTabletEnv().tableColumns[tableName] + if !exists && tableName != "" && tableName != "dual" { + return nil, fmt.Errorf("unable to resolve table name %s", tableName) + } + + colTypeMap := map[string]querypb.Type{} + if table.As.IsEmpty() { + tableColumnMap[sqlparser.GetTableName(table.Expr)] = colTypeMap + } else { + tableColumnMap[table.As] = colTypeMap } - colNames := make([]string, 0, 4) - colTypes := make([]querypb.Type, 0, 4) - for _, node := range selStmt.SelectExprs { - switch node := node.(type) { - case *sqlparser.AliasedExpr: - colNames, colTypes = inferColTypeFromExpr(node.Expr, tableColumnMap, colNames, colTypes) - case *sqlparser.StarExpr: - if node.TableName.Name.IsEmpty() { - // SELECT * - for _, colTypeMap := range tableColumnMap { - for col, colType := range colTypeMap { - colNames = append(colNames, col) - colTypes = append(colTypes, colType) - } - } - } else { - // SELECT tableName.* - colTypeMap := tableColumnMap[node.TableName.Name] - for col, colType := range colTypeMap { - colNames = append(colNames, col) - colTypes = append(colTypes, colType) - } + for k, v := range columns { + if colType, exists := colTypeMap[k]; exists { + if colType != v { + return nil, fmt.Errorf("column type mismatch for column : %s, types: %d vs %d", k, colType, v) } + continue } + colTypeMap[k] = v } - // the query against lookup table is in-query, handle it specifically - var inColName string - inVal := make([]sqltypes.Value, 0, 10) - - rowCount := 1 - if selStmt.Where != nil { - switch v := selStmt.Where.Expr.(type) { - case *sqlparser.ComparisonExpr: - if v.Operator == sqlparser.InOp { - switch c := v.Left.(type) { - case *sqlparser.ColName: - colName := strings.ToLower(c.Name.String()) - colType := tableColumnMap[sqlparser.GetTableName(selStmt.From[0].(*sqlparser.AliasedTableExpr).Expr)][colName] - - switch values := v.Right.(type) { - case sqlparser.ValTuple: - for _, val := range values { - switch v := val.(type) { - case *sqlparser.Literal: - value, err := evalengine.LiteralToValue(v) - if err != nil { - return err - } - - // Cast the value in the tuple to the expected value of the column - castedValue, err := evalengine.Cast(value, colType) - if err != nil { - return err - } - - // Check if we have a duplicate value - isNewValue := true - for _, v := range inVal { - result, err := evalengine.NullsafeCompare(v, value, collations.Default()) - if err != nil { - return err - } - - if result == 0 { - isNewValue = false - break - } - } - - if isNewValue { - inVal = append(inVal, castedValue) - } - } - } - rowCount = len(inVal) - } - inColName = strings.ToLower(c.Name.String()) - } - } - } + } + + colNames, colTypes := t.analyzeExpressions(selStmt, tableColumnMap) + + inColName, inVal, rowCount, s, err := t.analyzeWhere(selStmt, tableColumnMap) + if err != nil { + return s, err + } + + fields := make([]*querypb.Field, len(colNames)) + rows := make([][]sqltypes.Value, 0, rowCount) + for i, col := range colNames { + colType := colTypes[i] + fields[i] = &querypb.Field{ + Name: col, + Type: colType, } + } - fields := make([]*querypb.Field, len(colNames)) - rows := make([][]sqltypes.Value, 0, rowCount) + for j := 0; j < rowCount; j++ { + values := make([]sqltypes.Value, len(colNames)) for i, col := range colNames { + // Generate a fake value for the given column. For the column in the IN clause, + // use the provided values in the query, For numeric types, + // use the column index. For all other types, just shortcut to using + // a string type that encodes the column name + index. colType := colTypes[i] - fields[i] = &querypb.Field{ - Name: col, - Type: colType, + if len(inVal) > j && col == inColName { + values[i], _ = sqltypes.NewValue(querypb.Type_VARBINARY, inVal[j].Raw()) + } else if sqltypes.IsIntegral(colType) { + values[i] = sqltypes.NewInt32(int32(i + 1)) + } else if sqltypes.IsFloat(colType) { + values[i] = sqltypes.NewFloat64(1.0 + float64(i)) + } else { + values[i] = sqltypes.NewVarChar(fmt.Sprintf("%s_val_%d", col, i+1)) } } + rows = append(rows, values) + } + result := &sqltypes.Result{ + Fields: fields, + InsertID: 0, + Rows: rows, + } - for j := 0; j < rowCount; j++ { - values := make([]sqltypes.Value, len(colNames)) - for i, col := range colNames { - // Generate a fake value for the given column. For the column in the IN clause, - // use the provided values in the query, For numeric types, - // use the column index. For all other types, just shortcut to using - // a string type that encodes the column name + index. - colType := colTypes[i] - if len(inVal) > j && col == inColName { - values[i], _ = sqltypes.NewValue(querypb.Type_VARBINARY, inVal[j].Raw()) - } else if sqltypes.IsIntegral(colType) { - values[i] = sqltypes.NewInt32(int32(i + 1)) - } else if sqltypes.IsFloat(colType) { - values[i] = sqltypes.NewFloat64(1.0 + float64(i)) - } else { - values[i] = sqltypes.NewVarChar(fmt.Sprintf("%s_val_%d", col, i+1)) - } + resultJSON, _ := json.MarshalIndent(result, "", " ") + log.V(100).Infof("query %s result %s\n", query, string(resultJSON)) + return result, nil +} + +func (t *explainTablet) analyzeWhere(selStmt *sqlparser.Select, tableColumnMap map[sqlparser.IdentifierCS]map[string]querypb.Type) (inColName string, inVal []sqltypes.Value, rowCount int, result *sqltypes.Result, err error) { + // the query against lookup table is in-query, handle it specifically + rowCount = 1 + if selStmt.Where == nil { + return + } + v, ok := selStmt.Where.Expr.(*sqlparser.ComparisonExpr) + if !ok || v.Operator != sqlparser.InOp { + return + } + c, ok := v.Left.(*sqlparser.ColName) + if !ok { + return + } + colName := strings.ToLower(c.Name.String()) + colType := querypb.Type_VARCHAR + tableExpr := selStmt.From[0] + expr, ok := tableExpr.(*sqlparser.AliasedTableExpr) + if ok { + m := tableColumnMap[sqlparser.GetTableName(expr.Expr)] + if m != nil { + t, found := m[colName] + if found { + colType = t } - rows = append(rows, values) } - result = &sqltypes.Result{ - Fields: fields, - InsertID: 0, - Rows: rows, + } + + values, ok := v.Right.(sqlparser.ValTuple) + if !ok { + return + } + for _, val := range values { + lit, ok := val.(*sqlparser.Literal) + if !ok { + continue + } + value, err := evalengine.LiteralToValue(lit) + if err != nil { + return "", nil, 0, nil, err } - resultJSON, _ := json.MarshalIndent(result, "", " ") - log.V(100).Infof("query %s result %s\n", query, string(resultJSON)) + // Cast the value in the tuple to the expected value of the column + castedValue, err := evalengine.Cast(value, colType) + if err != nil { + return "", nil, 0, nil, err + } - case sqlparser.StmtBegin, sqlparser.StmtCommit, sqlparser.StmtSet, - sqlparser.StmtSavepoint, sqlparser.StmtSRollback, sqlparser.StmtRelease: - result = &sqltypes.Result{} - case sqlparser.StmtShow: - result = &sqltypes.Result{Fields: sqltypes.MakeTestFields("", "")} - case sqlparser.StmtInsert, sqlparser.StmtReplace, sqlparser.StmtUpdate, sqlparser.StmtDelete: - result = &sqltypes.Result{ - RowsAffected: 1, + // Check if we have a duplicate value + isNewValue := true + for _, v := range inVal { + result, err := evalengine.NullsafeCompare(v, value, collations.Default()) + if err != nil { + return "", nil, 0, nil, err + } + + if result == 0 { + isNewValue = false + break + } + } + + if isNewValue { + inVal = append(inVal, castedValue) } - default: - return fmt.Errorf("unsupported query %s", query) } + inColName = strings.ToLower(c.Name.String()) + return inColName, inVal, rowCount, nil, nil +} - return callback(result) +func (t *explainTablet) analyzeExpressions(selStmt *sqlparser.Select, tableColumnMap map[sqlparser.IdentifierCS]map[string]querypb.Type) ([]string, []querypb.Type) { + colNames := make([]string, 0, 4) + colTypes := make([]querypb.Type, 0, 4) + for _, node := range selStmt.SelectExprs { + switch node := node.(type) { + case *sqlparser.AliasedExpr: + colNames, colTypes = inferColTypeFromExpr(node.Expr, tableColumnMap, colNames, colTypes) + case *sqlparser.StarExpr: + if node.TableName.Name.IsEmpty() { + // SELECT * + for _, colTypeMap := range tableColumnMap { + for col, colType := range colTypeMap { + colNames = append(colNames, col) + colTypes = append(colTypes, colType) + } + } + } else { + // SELECT tableName.* + colTypeMap := tableColumnMap[node.TableName.Name] + for col, colType := range colTypeMap { + colNames = append(colNames, col) + colTypes = append(colTypes, colType) + } + } + } + } + return colNames, colTypes } func getTables(node sqlparser.SQLNode) []*sqlparser.AliasedTableExpr { From f568a5ccb17a1df7c7bcadb04626cebae24eef8c Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Mon, 20 Mar 2023 14:42:34 +0200 Subject: [PATCH 38/53] Mysqld.GetSchema: tolerate tables being dropped while inspecting schema (#12641) (#12665) * Mysqld.GetSchema: tolerate tables being dropped while inspecting schema * lack of primary key columns in STATISTICS does not mean table is dropped. It can also mean the table does not have PRIMARY KEY * populate validTds rather than rely on nil hints * re-introdce earlier check * use validTds, sync * due to many tests consistently failing, trying a different approach: we keep the table, but with empty column/key/fields info * grammar --------- Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/mysqlctl/schema.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/go/vt/mysqlctl/schema.go b/go/vt/mysqlctl/schema.go index 9c7ed553a25..c5c10afdc7f 100644 --- a/go/vt/mysqlctl/schema.go +++ b/go/vt/mysqlctl/schema.go @@ -24,6 +24,7 @@ import ( "strings" "sync" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/vterrors" @@ -109,6 +110,15 @@ func (mysqld *Mysqld) GetSchema(ctx context.Context, dbName string, request *tab fields, columns, schema, err := mysqld.collectSchema(ctx, dbName, td.Name, td.Type, request.TableSchemaOnly) if err != nil { + // There's a possible race condition: it could happen that a table was dropped in between reading + // the list of tables (collectBasicTableData(), earlier) and the point above where we investigate + // the table. + // This is fine. We identify the situation and keep the table without any fields/columns/key information + sqlErr, isSQLErr := mysql.NewSQLErrorFromError(err).(*mysql.SQLError) + if isSQLErr && sqlErr != nil && sqlErr.Number() == mysql.ERNoSuchTable { + return + } + allErrors.RecordError(err) cancel() return @@ -121,6 +131,8 @@ func (mysqld *Mysqld) GetSchema(ctx context.Context, dbName string, request *tab } // Get primary columns concurrently. + // The below runs a single query on `INFORMATION_SCHEMA` and does not interact with the actual tables. + // It is therefore safe to run even if some tables are dropped in the interim. colMap := map[string][]string{} if len(tableNames) > 0 { wg.Add(1) From f0cfda7983df6a632f22acb29c198bc192c0b153 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 21 Mar 2023 12:20:14 +0200 Subject: [PATCH 39/53] [release-15.0] Re-organize the `releasenotes` directory into `changelog` (#12566) (#12659) * Re-organize the `releasenotes` directory into `changelog` (#12566) * Move all release related documents to ./release and add tool to generate READMEs Signed-off-by: Florent Poinsard * Addition of the release.go file Signed-off-by: Florent Poinsard * simplify release.go Signed-off-by: Florent Poinsard * generate the release notes in the proper place Signed-off-by: Florent Poinsard * modify previous mentions of docs/releasenotes Signed-off-by: Florent Poinsard * re-add v17.0.0 summary Signed-off-by: Florent Poinsard * add new release tool to release instruction and ci Signed-off-by: Florent Poinsard * apply review suggestions Signed-off-by: Florent Poinsard * simplify release notes document path Signed-off-by: Florent Poinsard * Apply review suggestions and fix team files Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard * update the changelog dir and release_notes_label workflow Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard --- .github/workflows/release_notes_label.yml | 2 +- .github/workflows/static_checks_etc.yml | 17 ++ .gitignore | 2 +- .../10.0/10.0.0/release_notes.md | 0 .../10.0/10.0.1/release_notes.md | 0 .../10.0/10.0.2/release_notes.md | 0 .../10.0/10.0.3/release_notes.md | 0 .../10.0/10.0.3/summary.md | 0 .../10.0/10.0.4/release_notes.md | 0 .../10.0/10.0.4/summary.md | 0 .../10.0/10.0.5/release_notes.md | 0 .../10.0/10.0.5/summary.md | 0 changelog/10.0/README.md | 18 ++ .../11.0/11.0.0/release_notes.md | 0 .../11.0/11.0.1/release_notes.md | 0 .../11.0/11.0.2/release_notes.md | 0 .../11.0/11.0.2/summary.md | 0 .../11.0/11.0.3/release_notes.md | 0 .../11.0/11.0.3/summary.md | 0 .../11.0/11.0.4/release_notes.md | 0 .../11.0/11.0.4/summary.md | 0 changelog/11.0/README.md | 15 ++ .../12.0/12.0.0/release_notes.md | 0 .../12.0/12.0.0/summary.md | 0 .../12.0/12.0.1/release_notes.md | 0 .../12.0/12.0.1/summary.md | 0 .../12.0/12.0.2/release_notes.md | 0 .../12.0/12.0.2/summary.md | 0 .../12.0/12.0.3/release_notes.md | 0 .../12.0/12.0.3/summary.md | 0 .../12.0/12.0.4/release_notes.md | 0 .../12.0/12.0.5/changelog.md | 0 .../12.0/12.0.5/release_notes.md | 2 +- .../12.0/12.0.6/changelog.md | 0 .../12.0/12.0.6/release_notes.md | 2 +- .../12.0/12.0.6/summary.md | 0 changelog/12.0/README.md | 23 +++ .../13.0/13.0.0/release_notes.md | 0 .../13.0/13.0.0/summary.md | 0 .../13.0/13.0.1/release_notes.md | 0 .../13.0/13.0.2/changelog.md | 0 .../13.0/13.0.2/release_notes.md | 2 +- .../13.0/13.0.2/summary.md | 0 .../13.0/13.0.3/changelog.md | 0 .../13.0/13.0.3/release_notes.md | 2 +- .../13.0/13.0.3/summary.md | 0 changelog/13.0/README.md | 14 ++ .../14.0/14.0.0/changelog.md | 0 .../14.0/14.0.0/release_notes.md | 2 +- .../14.0/14.0.0/summary.md | 0 .../14.0/14.0.1/changelog.md | 0 .../14.0/14.0.1/release_notes.md | 2 +- .../14.0/14.0.1/summary.md | 0 .../14.0/14.0.2/changelog.md | 0 .../14.0/14.0.2/release_notes.md | 2 +- .../14.0/14.0.2/summary.md | 0 .../14.0/14.0.3/changelog.md | 0 .../14.0/14.0.3/release_notes.md | 2 +- .../14.0/14.0.3/summary.md | 0 changelog/14.0/README.md | 16 ++ .../15.0/15.0.0/changelog.md | 0 .../15.0/15.0.0/release_notes.md | 2 +- .../15.0/15.0.0/summary.md | 0 .../15.0/15.0.1/changelog.md | 0 .../15.0/15.0.1/release_notes.md | 2 +- .../15.0/15.0.1/summary.md | 0 .../15.0/15.0.2/changelog.md | 0 .../15.0/15.0.2/release_notes.md | 2 +- .../15.0/15.0.2/summary.md | 0 changelog/15.0/README.md | 13 ++ changelog/15.0/team.md | 5 + .../7.0/7.0.0/release_notes.md | 0 .../7.0/7.0.1/release_notes.md | 0 .../7.0/7.0.2/release_notes.md | 0 .../7.0/7.0.3/release_notes.md | 0 changelog/7.0/README.md | 12 ++ .../8.0/8.0.0/release_notes.md | 0 changelog/8.0/README.md | 3 + .../9.0/9.0.0/release_notes.md | 0 .../9.0/9.0.1/release_notes.md | 0 .../9.0/9.0.2/release_notes.md | 0 changelog/9.0/README.md | 9 + changelog/README.md | 10 ++ doc/internal/ReleaseInstructions.md | 167 +++++++++++++----- go/tools/release-notes/release_notes.go | 28 ++- go/tools/release-notes/release_notes_test.go | 6 +- go/tools/releases/releases.go | 143 +++++++++++++++ 87 files changed, 461 insertions(+), 64 deletions(-) rename doc/releasenotes/10_0_0_release_notes.md => changelog/10.0/10.0.0/release_notes.md (100%) rename doc/releasenotes/10_0_1_release_notes.md => changelog/10.0/10.0.1/release_notes.md (100%) rename doc/releasenotes/10_0_2_release_notes.md => changelog/10.0/10.0.2/release_notes.md (100%) rename doc/releasenotes/10_0_3_release_notes.md => changelog/10.0/10.0.3/release_notes.md (100%) rename doc/releasenotes/10_0_3_summary.md => changelog/10.0/10.0.3/summary.md (100%) rename doc/releasenotes/10_0_4_release_notes.md => changelog/10.0/10.0.4/release_notes.md (100%) rename doc/releasenotes/10_0_4_summary.md => changelog/10.0/10.0.4/summary.md (100%) rename doc/releasenotes/10_0_5_release_notes.md => changelog/10.0/10.0.5/release_notes.md (100%) rename doc/releasenotes/10_0_5_summary.md => changelog/10.0/10.0.5/summary.md (100%) create mode 100644 changelog/10.0/README.md rename doc/releasenotes/11_0_0_release_notes.md => changelog/11.0/11.0.0/release_notes.md (100%) rename doc/releasenotes/11_0_1_release_notes.md => changelog/11.0/11.0.1/release_notes.md (100%) rename doc/releasenotes/11_0_2_release_notes.md => changelog/11.0/11.0.2/release_notes.md (100%) rename doc/releasenotes/11_0_2_summary.md => changelog/11.0/11.0.2/summary.md (100%) rename doc/releasenotes/11_0_3_release_notes.md => changelog/11.0/11.0.3/release_notes.md (100%) rename doc/releasenotes/11_0_3_summary.md => changelog/11.0/11.0.3/summary.md (100%) rename doc/releasenotes/11_0_4_release_notes.md => changelog/11.0/11.0.4/release_notes.md (100%) rename doc/releasenotes/11_0_4_summary.md => changelog/11.0/11.0.4/summary.md (100%) create mode 100644 changelog/11.0/README.md rename doc/releasenotes/12_0_0_release_notes.md => changelog/12.0/12.0.0/release_notes.md (100%) rename doc/releasenotes/12_0_0_summary.md => changelog/12.0/12.0.0/summary.md (100%) rename doc/releasenotes/12_0_1_release_notes.md => changelog/12.0/12.0.1/release_notes.md (100%) rename doc/releasenotes/12_0_1_summary.md => changelog/12.0/12.0.1/summary.md (100%) rename doc/releasenotes/12_0_2_release_notes.md => changelog/12.0/12.0.2/release_notes.md (100%) rename doc/releasenotes/12_0_2_summary.md => changelog/12.0/12.0.2/summary.md (100%) rename doc/releasenotes/12_0_3_release_notes.md => changelog/12.0/12.0.3/release_notes.md (100%) rename doc/releasenotes/12_0_3_summary.md => changelog/12.0/12.0.3/summary.md (100%) rename doc/releasenotes/12_0_4_release_notes.md => changelog/12.0/12.0.4/release_notes.md (100%) rename doc/releasenotes/12_0_5_changelog.md => changelog/12.0/12.0.5/changelog.md (100%) rename doc/releasenotes/12_0_5_release_notes.md => changelog/12.0/12.0.5/release_notes.md (92%) rename doc/releasenotes/12_0_6_changelog.md => changelog/12.0/12.0.6/changelog.md (100%) rename doc/releasenotes/12_0_6_release_notes.md => changelog/12.0/12.0.6/release_notes.md (93%) rename doc/releasenotes/12_0_6_summary.md => changelog/12.0/12.0.6/summary.md (100%) create mode 100644 changelog/12.0/README.md rename doc/releasenotes/13_0_0_release_notes.md => changelog/13.0/13.0.0/release_notes.md (100%) rename doc/releasenotes/13_0_0_summary.md => changelog/13.0/13.0.0/summary.md (100%) rename doc/releasenotes/13_0_1_release_notes.md => changelog/13.0/13.0.1/release_notes.md (100%) rename doc/releasenotes/13_0_2_changelog.md => changelog/13.0/13.0.2/changelog.md (100%) rename doc/releasenotes/13_0_2_release_notes.md => changelog/13.0/13.0.2/release_notes.md (93%) rename doc/releasenotes/13_0_2_summary.md => changelog/13.0/13.0.2/summary.md (100%) rename doc/releasenotes/13_0_3_changelog.md => changelog/13.0/13.0.3/changelog.md (100%) rename doc/releasenotes/13_0_3_release_notes.md => changelog/13.0/13.0.3/release_notes.md (93%) rename doc/releasenotes/13_0_3_summary.md => changelog/13.0/13.0.3/summary.md (100%) create mode 100644 changelog/13.0/README.md rename doc/releasenotes/14_0_0_changelog.md => changelog/14.0/14.0.0/changelog.md (100%) rename doc/releasenotes/14_0_0_release_notes.md => changelog/14.0/14.0.0/release_notes.md (99%) rename doc/releasenotes/14_0_0_summary.md => changelog/14.0/14.0.0/summary.md (100%) rename doc/releasenotes/14_0_1_changelog.md => changelog/14.0/14.0.1/changelog.md (100%) rename doc/releasenotes/14_0_1_release_notes.md => changelog/14.0/14.0.1/release_notes.md (94%) rename doc/releasenotes/14_0_1_summary.md => changelog/14.0/14.0.1/summary.md (100%) rename doc/releasenotes/14_0_2_changelog.md => changelog/14.0/14.0.2/changelog.md (100%) rename doc/releasenotes/14_0_2_release_notes.md => changelog/14.0/14.0.2/release_notes.md (95%) rename doc/releasenotes/14_0_2_summary.md => changelog/14.0/14.0.2/summary.md (100%) rename doc/releasenotes/14_0_3_changelog.md => changelog/14.0/14.0.3/changelog.md (100%) rename doc/releasenotes/14_0_3_release_notes.md => changelog/14.0/14.0.3/release_notes.md (93%) rename doc/releasenotes/14_0_3_summary.md => changelog/14.0/14.0.3/summary.md (100%) create mode 100644 changelog/14.0/README.md rename doc/releasenotes/15_0_0_changelog.md => changelog/15.0/15.0.0/changelog.md (100%) rename doc/releasenotes/15_0_0_release_notes.md => changelog/15.0/15.0.0/release_notes.md (99%) rename doc/releasenotes/15_0_0_summary.md => changelog/15.0/15.0.0/summary.md (100%) rename doc/releasenotes/15_0_1_changelog.md => changelog/15.0/15.0.1/changelog.md (100%) rename doc/releasenotes/15_0_1_release_notes.md => changelog/15.0/15.0.1/release_notes.md (93%) rename doc/releasenotes/15_0_1_summary.md => changelog/15.0/15.0.1/summary.md (100%) rename doc/releasenotes/15_0_2_changelog.md => changelog/15.0/15.0.2/changelog.md (100%) rename doc/releasenotes/15_0_2_release_notes.md => changelog/15.0/15.0.2/release_notes.md (91%) rename doc/releasenotes/15_0_2_summary.md => changelog/15.0/15.0.2/summary.md (100%) create mode 100644 changelog/15.0/README.md create mode 100644 changelog/15.0/team.md rename doc/releasenotes/7_0_0_release_notes.md => changelog/7.0/7.0.0/release_notes.md (100%) rename doc/releasenotes/7_0_1_release_notes.md => changelog/7.0/7.0.1/release_notes.md (100%) rename doc/releasenotes/7_0_2_release_notes.md => changelog/7.0/7.0.2/release_notes.md (100%) rename doc/releasenotes/7_0_3_release_notes.md => changelog/7.0/7.0.3/release_notes.md (100%) create mode 100644 changelog/7.0/README.md rename doc/releasenotes/8_0_0_release_notes.md => changelog/8.0/8.0.0/release_notes.md (100%) create mode 100644 changelog/8.0/README.md rename doc/releasenotes/9_0_0_release_notes.md => changelog/9.0/9.0.0/release_notes.md (100%) rename doc/releasenotes/9_0_1_release_notes.md => changelog/9.0/9.0.1/release_notes.md (100%) rename doc/releasenotes/9_0_2_release_notes.md => changelog/9.0/9.0.2/release_notes.md (100%) create mode 100644 changelog/9.0/README.md create mode 100644 changelog/README.md create mode 100644 go/tools/releases/releases.go diff --git a/.github/workflows/release_notes_label.yml b/.github/workflows/release_notes_label.yml index becd44cdc7d..703082afda6 100644 --- a/.github/workflows/release_notes_label.yml +++ b/.github/workflows/release_notes_label.yml @@ -17,7 +17,7 @@ jobs: - name: Release Notes label run: | if [[ "${{contains( github.event.pull_request.labels.*.name, 'release notes (needs details)')}}" == "true" ]]; then - echo The "release notes (needs details)" label is set. The changes made in this Pull Request need to be documented in the release notes summary "('./doc/releasenotes/16_0_0_summary.md')". Once documented, the "release notes (needs details)" label can be removed. + echo The "release notes (needs details)" label is set. The changes made in this Pull Request need to be documented in the release notes summary "('./changelog/15.0/15.0.3/summary.md')". Once documented, the "release notes (needs details)" label can be removed. exit 1 fi diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index e50a08fc0c5..3abab4f92f7 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -90,6 +90,9 @@ jobs: ci_config: - 'test/config.json' - '.github/workflows/static_checks_etc.yml' + release_notes: + - 'changelog/**' + - './go/tools/releases/**' - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && (steps.changes.outputs.go_files == 'true' || steps.changes.outputs.parser_changes == 'true' || steps.changes.outputs.proto_changes == 'true') @@ -199,3 +202,17 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && (steps.changes.outputs.go_files == 'true' || steps.changes.outputs.ci_config == 'true') run: | go run ./go/tools/ci-config/main.go || exit 1 + + - name: Check changelog + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.release_notes == 'true' + run: | + set -e + go run ./go/tools/releases/releases.go + output=$(git status -s) + if [ -z "${output}" ]; then + exit 0 + fi + echo 'We wish to maintain a consistent changelog directory, please run `go run ./go/tools/releases/releases.go`, commit and push again.' + echo 'Running `go run ./go/tools/releases/releases.go` on CI yields the following changes:' + echo "$output" + echo "" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6e48b17eca9..60b397f1ec6 100644 --- a/.gitignore +++ b/.gitignore @@ -70,7 +70,7 @@ _test/ /vendor/*/ # release folder -releases +/releases/ # Angular2 Bower Libs /web/vtctld2/.bowerrc~ diff --git a/doc/releasenotes/10_0_0_release_notes.md b/changelog/10.0/10.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_0_release_notes.md rename to changelog/10.0/10.0.0/release_notes.md diff --git a/doc/releasenotes/10_0_1_release_notes.md b/changelog/10.0/10.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_1_release_notes.md rename to changelog/10.0/10.0.1/release_notes.md diff --git a/doc/releasenotes/10_0_2_release_notes.md b/changelog/10.0/10.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_2_release_notes.md rename to changelog/10.0/10.0.2/release_notes.md diff --git a/doc/releasenotes/10_0_3_release_notes.md b/changelog/10.0/10.0.3/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_3_release_notes.md rename to changelog/10.0/10.0.3/release_notes.md diff --git a/doc/releasenotes/10_0_3_summary.md b/changelog/10.0/10.0.3/summary.md similarity index 100% rename from doc/releasenotes/10_0_3_summary.md rename to changelog/10.0/10.0.3/summary.md diff --git a/doc/releasenotes/10_0_4_release_notes.md b/changelog/10.0/10.0.4/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_4_release_notes.md rename to changelog/10.0/10.0.4/release_notes.md diff --git a/doc/releasenotes/10_0_4_summary.md b/changelog/10.0/10.0.4/summary.md similarity index 100% rename from doc/releasenotes/10_0_4_summary.md rename to changelog/10.0/10.0.4/summary.md diff --git a/doc/releasenotes/10_0_5_release_notes.md b/changelog/10.0/10.0.5/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_5_release_notes.md rename to changelog/10.0/10.0.5/release_notes.md diff --git a/doc/releasenotes/10_0_5_summary.md b/changelog/10.0/10.0.5/summary.md similarity index 100% rename from doc/releasenotes/10_0_5_summary.md rename to changelog/10.0/10.0.5/summary.md diff --git a/changelog/10.0/README.md b/changelog/10.0/README.md new file mode 100644 index 00000000000..304cc933a16 --- /dev/null +++ b/changelog/10.0/README.md @@ -0,0 +1,18 @@ +## v10.0 +* **[10.0.5](10.0.5)** + * [Release Notes](10.0.5/release_notes.md) + +* **[10.0.4](10.0.4)** + * [Release Notes](10.0.4/release_notes.md) + +* **[10.0.3](10.0.3)** + * [Release Notes](10.0.3/release_notes.md) + +* **[10.0.2](10.0.2)** + * [Release Notes](10.0.2/release_notes.md) + +* **[10.0.1](10.0.1)** + * [Release Notes](10.0.1/release_notes.md) + +* **[10.0.0](10.0.0)** + * [Release Notes](10.0.0/release_notes.md) diff --git a/doc/releasenotes/11_0_0_release_notes.md b/changelog/11.0/11.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_0_release_notes.md rename to changelog/11.0/11.0.0/release_notes.md diff --git a/doc/releasenotes/11_0_1_release_notes.md b/changelog/11.0/11.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_1_release_notes.md rename to changelog/11.0/11.0.1/release_notes.md diff --git a/doc/releasenotes/11_0_2_release_notes.md b/changelog/11.0/11.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_2_release_notes.md rename to changelog/11.0/11.0.2/release_notes.md diff --git a/doc/releasenotes/11_0_2_summary.md b/changelog/11.0/11.0.2/summary.md similarity index 100% rename from doc/releasenotes/11_0_2_summary.md rename to changelog/11.0/11.0.2/summary.md diff --git a/doc/releasenotes/11_0_3_release_notes.md b/changelog/11.0/11.0.3/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_3_release_notes.md rename to changelog/11.0/11.0.3/release_notes.md diff --git a/doc/releasenotes/11_0_3_summary.md b/changelog/11.0/11.0.3/summary.md similarity index 100% rename from doc/releasenotes/11_0_3_summary.md rename to changelog/11.0/11.0.3/summary.md diff --git a/doc/releasenotes/11_0_4_release_notes.md b/changelog/11.0/11.0.4/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_4_release_notes.md rename to changelog/11.0/11.0.4/release_notes.md diff --git a/doc/releasenotes/11_0_4_summary.md b/changelog/11.0/11.0.4/summary.md similarity index 100% rename from doc/releasenotes/11_0_4_summary.md rename to changelog/11.0/11.0.4/summary.md diff --git a/changelog/11.0/README.md b/changelog/11.0/README.md new file mode 100644 index 00000000000..51dfb2e5648 --- /dev/null +++ b/changelog/11.0/README.md @@ -0,0 +1,15 @@ +## v11.0 +* **[11.0.4](11.0.4)** + * [Release Notes](11.0.4/release_notes.md) + +* **[11.0.3](11.0.3)** + * [Release Notes](11.0.3/release_notes.md) + +* **[11.0.2](11.0.2)** + * [Release Notes](11.0.2/release_notes.md) + +* **[11.0.1](11.0.1)** + * [Release Notes](11.0.1/release_notes.md) + +* **[11.0.0](11.0.0)** + * [Release Notes](11.0.0/release_notes.md) diff --git a/doc/releasenotes/12_0_0_release_notes.md b/changelog/12.0/12.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_0_release_notes.md rename to changelog/12.0/12.0.0/release_notes.md diff --git a/doc/releasenotes/12_0_0_summary.md b/changelog/12.0/12.0.0/summary.md similarity index 100% rename from doc/releasenotes/12_0_0_summary.md rename to changelog/12.0/12.0.0/summary.md diff --git a/doc/releasenotes/12_0_1_release_notes.md b/changelog/12.0/12.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_1_release_notes.md rename to changelog/12.0/12.0.1/release_notes.md diff --git a/doc/releasenotes/12_0_1_summary.md b/changelog/12.0/12.0.1/summary.md similarity index 100% rename from doc/releasenotes/12_0_1_summary.md rename to changelog/12.0/12.0.1/summary.md diff --git a/doc/releasenotes/12_0_2_release_notes.md b/changelog/12.0/12.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_2_release_notes.md rename to changelog/12.0/12.0.2/release_notes.md diff --git a/doc/releasenotes/12_0_2_summary.md b/changelog/12.0/12.0.2/summary.md similarity index 100% rename from doc/releasenotes/12_0_2_summary.md rename to changelog/12.0/12.0.2/summary.md diff --git a/doc/releasenotes/12_0_3_release_notes.md b/changelog/12.0/12.0.3/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_3_release_notes.md rename to changelog/12.0/12.0.3/release_notes.md diff --git a/doc/releasenotes/12_0_3_summary.md b/changelog/12.0/12.0.3/summary.md similarity index 100% rename from doc/releasenotes/12_0_3_summary.md rename to changelog/12.0/12.0.3/summary.md diff --git a/doc/releasenotes/12_0_4_release_notes.md b/changelog/12.0/12.0.4/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_4_release_notes.md rename to changelog/12.0/12.0.4/release_notes.md diff --git a/doc/releasenotes/12_0_5_changelog.md b/changelog/12.0/12.0.5/changelog.md similarity index 100% rename from doc/releasenotes/12_0_5_changelog.md rename to changelog/12.0/12.0.5/changelog.md diff --git a/doc/releasenotes/12_0_5_release_notes.md b/changelog/12.0/12.0.5/release_notes.md similarity index 92% rename from doc/releasenotes/12_0_5_release_notes.md rename to changelog/12.0/12.0.5/release_notes.md index fc2c613e4da..dbff8a5aade 100644 --- a/doc/releasenotes/12_0_5_release_notes.md +++ b/changelog/12.0/12.0.5/release_notes.md @@ -9,7 +9,7 @@ Below is a summary of this patch release. You can learn more [here](https://go.d > go1.17.12 (released 2022-07-12) includes security fixes to the compress/gzip, encoding/gob, encoding/xml, go/parser, io/fs, net/http, and path/filepath packages, as well as bug fixes to the compiler, the go command, the runtime, and the runtime/metrics package. [See the Go 1.17.12 milestone](https://github.com/golang/go/issues?q=milestone%3AGo1.17.12+label%3ACherryPickApproved) on our issue tracker for details. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/12_0_5_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/12.0/12.0.5/changelog.md). The release includes 7 commits (excluding merges) diff --git a/doc/releasenotes/12_0_6_changelog.md b/changelog/12.0/12.0.6/changelog.md similarity index 100% rename from doc/releasenotes/12_0_6_changelog.md rename to changelog/12.0/12.0.6/changelog.md diff --git a/doc/releasenotes/12_0_6_release_notes.md b/changelog/12.0/12.0.6/release_notes.md similarity index 93% rename from doc/releasenotes/12_0_6_release_notes.md rename to changelog/12.0/12.0.6/release_notes.md index 8afbe0a4239..c9c743d95ea 100644 --- a/doc/releasenotes/12_0_6_release_notes.md +++ b/changelog/12.0/12.0.6/release_notes.md @@ -15,7 +15,7 @@ This change is documented on our website [here](https://vitess.io/docs/12.0/over ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/12_0_6_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/12.0/12.0.6/changelog.md). The release includes 11 commits (excluding merges) diff --git a/doc/releasenotes/12_0_6_summary.md b/changelog/12.0/12.0.6/summary.md similarity index 100% rename from doc/releasenotes/12_0_6_summary.md rename to changelog/12.0/12.0.6/summary.md diff --git a/changelog/12.0/README.md b/changelog/12.0/README.md new file mode 100644 index 00000000000..131b2df443d --- /dev/null +++ b/changelog/12.0/README.md @@ -0,0 +1,23 @@ +## v12.0 +* **[12.0.6](12.0.6)** + * [Changelog](12.0.6/changelog.md) + * [Release Notes](12.0.6/release_notes.md) + +* **[12.0.5](12.0.5)** + * [Changelog](12.0.5/changelog.md) + * [Release Notes](12.0.5/release_notes.md) + +* **[12.0.4](12.0.4)** + * [Release Notes](12.0.4/release_notes.md) + +* **[12.0.3](12.0.3)** + * [Release Notes](12.0.3/release_notes.md) + +* **[12.0.2](12.0.2)** + * [Release Notes](12.0.2/release_notes.md) + +* **[12.0.1](12.0.1)** + * [Release Notes](12.0.1/release_notes.md) + +* **[12.0.0](12.0.0)** + * [Release Notes](12.0.0/release_notes.md) diff --git a/doc/releasenotes/13_0_0_release_notes.md b/changelog/13.0/13.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/13_0_0_release_notes.md rename to changelog/13.0/13.0.0/release_notes.md diff --git a/doc/releasenotes/13_0_0_summary.md b/changelog/13.0/13.0.0/summary.md similarity index 100% rename from doc/releasenotes/13_0_0_summary.md rename to changelog/13.0/13.0.0/summary.md diff --git a/doc/releasenotes/13_0_1_release_notes.md b/changelog/13.0/13.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/13_0_1_release_notes.md rename to changelog/13.0/13.0.1/release_notes.md diff --git a/doc/releasenotes/13_0_2_changelog.md b/changelog/13.0/13.0.2/changelog.md similarity index 100% rename from doc/releasenotes/13_0_2_changelog.md rename to changelog/13.0/13.0.2/changelog.md diff --git a/doc/releasenotes/13_0_2_release_notes.md b/changelog/13.0/13.0.2/release_notes.md similarity index 93% rename from doc/releasenotes/13_0_2_release_notes.md rename to changelog/13.0/13.0.2/release_notes.md index 310eb5e633a..12692031e2a 100644 --- a/doc/releasenotes/13_0_2_release_notes.md +++ b/changelog/13.0/13.0.2/release_notes.md @@ -9,7 +9,7 @@ Below is a summary of this patch release. You can learn more [here](https://go.d > go1.17.12 (released 2022-07-12) includes security fixes to the compress/gzip, encoding/gob, encoding/xml, go/parser, io/fs, net/http, and path/filepath packages, as well as bug fixes to the compiler, the go command, the runtime, and the runtime/metrics package. [See the Go 1.17.12 milestone](https://github.com/golang/go/issues?q=milestone%3AGo1.17.12+label%3ACherryPickApproved) on our issue tracker for details. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/13_0_2_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/13.0/13.0.2/changelog.md). The release includes 28 commits (excluding merges) Thanks to all our contributors: @GuptaManan100, @aquarapid, @frouioui, @harshit-gangal, @mattlord, @rohit-nayak-ps, @systay, @vitess-bot[bot], @vmg \ No newline at end of file diff --git a/doc/releasenotes/13_0_2_summary.md b/changelog/13.0/13.0.2/summary.md similarity index 100% rename from doc/releasenotes/13_0_2_summary.md rename to changelog/13.0/13.0.2/summary.md diff --git a/doc/releasenotes/13_0_3_changelog.md b/changelog/13.0/13.0.3/changelog.md similarity index 100% rename from doc/releasenotes/13_0_3_changelog.md rename to changelog/13.0/13.0.3/changelog.md diff --git a/doc/releasenotes/13_0_3_release_notes.md b/changelog/13.0/13.0.3/release_notes.md similarity index 93% rename from doc/releasenotes/13_0_3_release_notes.md rename to changelog/13.0/13.0.3/release_notes.md index 3fee980f099..b04c0d69d20 100644 --- a/doc/releasenotes/13_0_3_release_notes.md +++ b/changelog/13.0/13.0.3/release_notes.md @@ -15,7 +15,7 @@ This change is documented on our website [here](https://vitess.io/docs/13.0/over ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/13_0_3_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/13.0/13.0.3/changelog.md). The release includes 17 commits(excluding merges) diff --git a/doc/releasenotes/13_0_3_summary.md b/changelog/13.0/13.0.3/summary.md similarity index 100% rename from doc/releasenotes/13_0_3_summary.md rename to changelog/13.0/13.0.3/summary.md diff --git a/changelog/13.0/README.md b/changelog/13.0/README.md new file mode 100644 index 00000000000..780625ef69a --- /dev/null +++ b/changelog/13.0/README.md @@ -0,0 +1,14 @@ +## v13.0 +* **[13.0.3](13.0.3)** + * [Changelog](13.0.3/changelog.md) + * [Release Notes](13.0.3/release_notes.md) + +* **[13.0.2](13.0.2)** + * [Changelog](13.0.2/changelog.md) + * [Release Notes](13.0.2/release_notes.md) + +* **[13.0.1](13.0.1)** + * [Release Notes](13.0.1/release_notes.md) + +* **[13.0.0](13.0.0)** + * [Release Notes](13.0.0/release_notes.md) diff --git a/doc/releasenotes/14_0_0_changelog.md b/changelog/14.0/14.0.0/changelog.md similarity index 100% rename from doc/releasenotes/14_0_0_changelog.md rename to changelog/14.0/14.0.0/changelog.md diff --git a/doc/releasenotes/14_0_0_release_notes.md b/changelog/14.0/14.0.0/release_notes.md similarity index 99% rename from doc/releasenotes/14_0_0_release_notes.md rename to changelog/14.0/14.0.0/release_notes.md index a7b4bcf4ef0..5f88f6975db 100644 --- a/doc/releasenotes/14_0_0_release_notes.md +++ b/changelog/14.0/14.0.0/release_notes.md @@ -319,7 +319,7 @@ Work has gone into making the advisory locks (`get_lock()`, `release_lock()`, et A long time ago, the sharding column and type were specified at the keyspace level. This syntax is now deprecated and will be removed in v15. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_0_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.0/changelog.md). The release includes 1101 commits (excluding merges) diff --git a/doc/releasenotes/14_0_0_summary.md b/changelog/14.0/14.0.0/summary.md similarity index 100% rename from doc/releasenotes/14_0_0_summary.md rename to changelog/14.0/14.0.0/summary.md diff --git a/doc/releasenotes/14_0_1_changelog.md b/changelog/14.0/14.0.1/changelog.md similarity index 100% rename from doc/releasenotes/14_0_1_changelog.md rename to changelog/14.0/14.0.1/changelog.md diff --git a/doc/releasenotes/14_0_1_release_notes.md b/changelog/14.0/14.0.1/release_notes.md similarity index 94% rename from doc/releasenotes/14_0_1_release_notes.md rename to changelog/14.0/14.0.1/release_notes.md index 57d68be31c2..639af4fce96 100644 --- a/doc/releasenotes/14_0_1_release_notes.md +++ b/changelog/14.0/14.0.1/release_notes.md @@ -13,7 +13,7 @@ Below is a summary of this patch release. You can learn more [here](https://go.d > go1.18.4 (released 2022-07-12) includes security fixes to the compress/gzip, encoding/gob, encoding/xml, go/parser, io/fs, net/http, and path/filepath packages, as well as bug fixes to the compiler, the go command, the linker, the runtime, and the runtime/metrics package. [See the Go 1.18.4 milestone](https://github.com/golang/go/issues?q=milestone%3AGo1.18.4+label%3ACherryPickApproved) on our issue tracker for details. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_1_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.1/changelog.md). The release includes 25 commits (excluding merges) diff --git a/doc/releasenotes/14_0_1_summary.md b/changelog/14.0/14.0.1/summary.md similarity index 100% rename from doc/releasenotes/14_0_1_summary.md rename to changelog/14.0/14.0.1/summary.md diff --git a/doc/releasenotes/14_0_2_changelog.md b/changelog/14.0/14.0.2/changelog.md similarity index 100% rename from doc/releasenotes/14_0_2_changelog.md rename to changelog/14.0/14.0.2/changelog.md diff --git a/doc/releasenotes/14_0_2_release_notes.md b/changelog/14.0/14.0.2/release_notes.md similarity index 95% rename from doc/releasenotes/14_0_2_release_notes.md rename to changelog/14.0/14.0.2/release_notes.md index d83b940f45c..724673af576 100644 --- a/doc/releasenotes/14_0_2_release_notes.md +++ b/changelog/14.0/14.0.2/release_notes.md @@ -18,7 +18,7 @@ Since the end-of-life of MariaDB 10.2, its Docker image is unavailable, and we d You can find more information on the list of supported databases on our documentation website, [here](https://vitess.io/docs/14.0/overview/supported-databases/). ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_2_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.2/changelog.md). The release includes 23 commits (excluding merges) diff --git a/doc/releasenotes/14_0_2_summary.md b/changelog/14.0/14.0.2/summary.md similarity index 100% rename from doc/releasenotes/14_0_2_summary.md rename to changelog/14.0/14.0.2/summary.md diff --git a/doc/releasenotes/14_0_3_changelog.md b/changelog/14.0/14.0.3/changelog.md similarity index 100% rename from doc/releasenotes/14_0_3_changelog.md rename to changelog/14.0/14.0.3/changelog.md diff --git a/doc/releasenotes/14_0_3_release_notes.md b/changelog/14.0/14.0.3/release_notes.md similarity index 93% rename from doc/releasenotes/14_0_3_release_notes.md rename to changelog/14.0/14.0.3/release_notes.md index 721c47640e2..5d5cc9b871c 100644 --- a/doc/releasenotes/14_0_3_release_notes.md +++ b/changelog/14.0/14.0.3/release_notes.md @@ -12,7 +12,7 @@ This problem could be resolved by restarting the VTOrc so that it discovers all frequently, this posed a greater challenge, since some pods when evicted and rescheduled on a different node, would sometimes fail to be discovered by VTOrc. This has problem has been addressed in this patch by the fix https://github.com/vitessio/vitess/pull/10662. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_3_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.3/changelog.md). The release includes 12 commits (excluding merges) diff --git a/doc/releasenotes/14_0_3_summary.md b/changelog/14.0/14.0.3/summary.md similarity index 100% rename from doc/releasenotes/14_0_3_summary.md rename to changelog/14.0/14.0.3/summary.md diff --git a/changelog/14.0/README.md b/changelog/14.0/README.md new file mode 100644 index 00000000000..0aaddf7abb6 --- /dev/null +++ b/changelog/14.0/README.md @@ -0,0 +1,16 @@ +## v14.0 +* **[14.0.3](14.0.3)** + * [Changelog](14.0.3/changelog.md) + * [Release Notes](14.0.3/release_notes.md) + +* **[14.0.2](14.0.2)** + * [Changelog](14.0.2/changelog.md) + * [Release Notes](14.0.2/release_notes.md) + +* **[14.0.1](14.0.1)** + * [Changelog](14.0.1/changelog.md) + * [Release Notes](14.0.1/release_notes.md) + +* **[14.0.0](14.0.0)** + * [Changelog](14.0.0/changelog.md) + * [Release Notes](14.0.0/release_notes.md) diff --git a/doc/releasenotes/15_0_0_changelog.md b/changelog/15.0/15.0.0/changelog.md similarity index 100% rename from doc/releasenotes/15_0_0_changelog.md rename to changelog/15.0/15.0.0/changelog.md diff --git a/doc/releasenotes/15_0_0_release_notes.md b/changelog/15.0/15.0.0/release_notes.md similarity index 99% rename from doc/releasenotes/15_0_0_release_notes.md rename to changelog/15.0/15.0.0/release_notes.md index 430100fa8f5..f60fd0547f1 100644 --- a/doc/releasenotes/15_0_0_release_notes.md +++ b/changelog/15.0/15.0.0/release_notes.md @@ -455,7 +455,7 @@ Below are the changes for each binary. - [zkctld](https://github.com/vitessio/vitess/blob/release-15.0/doc/flags/14.0-to-15.0-transition/zkctld.diff) ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/15_0_0_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/15.0/15.0.0/changelog.md). The release includes 595 commits (excluding merges) diff --git a/doc/releasenotes/15_0_0_summary.md b/changelog/15.0/15.0.0/summary.md similarity index 100% rename from doc/releasenotes/15_0_0_summary.md rename to changelog/15.0/15.0.0/summary.md diff --git a/doc/releasenotes/15_0_1_changelog.md b/changelog/15.0/15.0.1/changelog.md similarity index 100% rename from doc/releasenotes/15_0_1_changelog.md rename to changelog/15.0/15.0.1/changelog.md diff --git a/doc/releasenotes/15_0_1_release_notes.md b/changelog/15.0/15.0.1/release_notes.md similarity index 93% rename from doc/releasenotes/15_0_1_release_notes.md rename to changelog/15.0/15.0.1/release_notes.md index caeba725787..1737f0fd2f8 100644 --- a/doc/releasenotes/15_0_1_release_notes.md +++ b/changelog/15.0/15.0.1/release_notes.md @@ -16,7 +16,7 @@ This issue is fixed in 15.0.1. The full issue can be found [here](https://github ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/15_0_1_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/15.0/15.0.1/changelog.md). The release includes 25 commits (excluding merges) diff --git a/doc/releasenotes/15_0_1_summary.md b/changelog/15.0/15.0.1/summary.md similarity index 100% rename from doc/releasenotes/15_0_1_summary.md rename to changelog/15.0/15.0.1/summary.md diff --git a/doc/releasenotes/15_0_2_changelog.md b/changelog/15.0/15.0.2/changelog.md similarity index 100% rename from doc/releasenotes/15_0_2_changelog.md rename to changelog/15.0/15.0.2/changelog.md diff --git a/doc/releasenotes/15_0_2_release_notes.md b/changelog/15.0/15.0.2/release_notes.md similarity index 91% rename from doc/releasenotes/15_0_2_release_notes.md rename to changelog/15.0/15.0.2/release_notes.md index 92317b60dc4..33ece0e1c73 100644 --- a/doc/releasenotes/15_0_2_release_notes.md +++ b/changelog/15.0/15.0.2/release_notes.md @@ -12,7 +12,7 @@ Below is a summary of this patch release. You can learn more [here](https://grou ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/15_0_2_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/15.0/15.0.2/changelog.md). The release includes 14 commits (excluding merges) diff --git a/doc/releasenotes/15_0_2_summary.md b/changelog/15.0/15.0.2/summary.md similarity index 100% rename from doc/releasenotes/15_0_2_summary.md rename to changelog/15.0/15.0.2/summary.md diff --git a/changelog/15.0/README.md b/changelog/15.0/README.md new file mode 100644 index 00000000000..f6985e8252b --- /dev/null +++ b/changelog/15.0/README.md @@ -0,0 +1,13 @@ +## v15.0 +The dedicated team for this release can be found [here](team.md). +* **[15.0.2](15.0.2)** + * [Changelog](15.0.2/changelog.md) + * [Release Notes](15.0.2/release_notes.md) + +* **[15.0.1](15.0.1)** + * [Changelog](15.0.1/changelog.md) + * [Release Notes](15.0.1/release_notes.md) + +* **[15.0.0](15.0.0)** + * [Changelog](15.0.0/changelog.md) + * [Release Notes](15.0.0/release_notes.md) diff --git a/changelog/15.0/team.md b/changelog/15.0/team.md new file mode 100644 index 00000000000..b8cbdf809bf --- /dev/null +++ b/changelog/15.0/team.md @@ -0,0 +1,5 @@ +## Release Team for v15 + +- **Lead:** Rameez Sajwani ([rsajwani](https://github.com/rsajwani)) rameez@planetscale.com +- **Shadow:** Manan Gupta ([GuptaManan100](https://github.com/GuptaManan100)) manan@planetscale.com +- **Mentor:** Florent Poinsard ([frouioui](https://github.com/frouioui)) florent@planetscale.com \ No newline at end of file diff --git a/doc/releasenotes/7_0_0_release_notes.md b/changelog/7.0/7.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/7_0_0_release_notes.md rename to changelog/7.0/7.0.0/release_notes.md diff --git a/doc/releasenotes/7_0_1_release_notes.md b/changelog/7.0/7.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/7_0_1_release_notes.md rename to changelog/7.0/7.0.1/release_notes.md diff --git a/doc/releasenotes/7_0_2_release_notes.md b/changelog/7.0/7.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/7_0_2_release_notes.md rename to changelog/7.0/7.0.2/release_notes.md diff --git a/doc/releasenotes/7_0_3_release_notes.md b/changelog/7.0/7.0.3/release_notes.md similarity index 100% rename from doc/releasenotes/7_0_3_release_notes.md rename to changelog/7.0/7.0.3/release_notes.md diff --git a/changelog/7.0/README.md b/changelog/7.0/README.md new file mode 100644 index 00000000000..7177c6be673 --- /dev/null +++ b/changelog/7.0/README.md @@ -0,0 +1,12 @@ +## v7.0 +* **[7.0.3](7.0.3)** + * [Release Notes](7.0.3/release_notes.md) + +* **[7.0.2](7.0.2)** + * [Release Notes](7.0.2/release_notes.md) + +* **[7.0.1](7.0.1)** + * [Release Notes](7.0.1/release_notes.md) + +* **[7.0.0](7.0.0)** + * [Release Notes](7.0.0/release_notes.md) diff --git a/doc/releasenotes/8_0_0_release_notes.md b/changelog/8.0/8.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/8_0_0_release_notes.md rename to changelog/8.0/8.0.0/release_notes.md diff --git a/changelog/8.0/README.md b/changelog/8.0/README.md new file mode 100644 index 00000000000..fa359e7302f --- /dev/null +++ b/changelog/8.0/README.md @@ -0,0 +1,3 @@ +## v8.0 +* **[8.0.0](8.0.0)** + * [Release Notes](8.0.0/release_notes.md) diff --git a/doc/releasenotes/9_0_0_release_notes.md b/changelog/9.0/9.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/9_0_0_release_notes.md rename to changelog/9.0/9.0.0/release_notes.md diff --git a/doc/releasenotes/9_0_1_release_notes.md b/changelog/9.0/9.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/9_0_1_release_notes.md rename to changelog/9.0/9.0.1/release_notes.md diff --git a/doc/releasenotes/9_0_2_release_notes.md b/changelog/9.0/9.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/9_0_2_release_notes.md rename to changelog/9.0/9.0.2/release_notes.md diff --git a/changelog/9.0/README.md b/changelog/9.0/README.md new file mode 100644 index 00000000000..17f49aa3b47 --- /dev/null +++ b/changelog/9.0/README.md @@ -0,0 +1,9 @@ +## v9.0 +* **[9.0.2](9.0.2)** + * [Release Notes](9.0.2/release_notes.md) + +* **[9.0.1](9.0.1)** + * [Release Notes](9.0.1/release_notes.md) + +* **[9.0.0](9.0.0)** + * [Release Notes](9.0.0/release_notes.md) diff --git a/changelog/README.md b/changelog/README.md new file mode 100644 index 00000000000..7f7147b6fb1 --- /dev/null +++ b/changelog/README.md @@ -0,0 +1,10 @@ +## Releases +* [15.0](15.0) +* [14.0](14.0) +* [13.0](13.0) +* [12.0](12.0) +* [11.0](11.0) +* [10.0](10.0) +* [9.0](9.0) +* [8.0](8.0) +* [7.0](7.0) \ No newline at end of file diff --git a/doc/internal/ReleaseInstructions.md b/doc/internal/ReleaseInstructions.md index b2c3cf0fcf8..836ceb9e633 100644 --- a/doc/internal/ReleaseInstructions.md +++ b/doc/internal/ReleaseInstructions.md @@ -55,7 +55,7 @@ Pre-release versions should be labeled with a suffix like `-beta2` or `-rc1`. ## Release Branches Each major and minor releases (X.Y) should have a [release branch](https://github.com/vitessio/vitess/branches/all?query=release) named -`release-X.Y`. This branch should diverge from `main` when the code freeze when the release +`release-X.Y`. This branch should diverge from `main` when the release is declared, after which point only bugfix PRs should be cherry-picked onto the branch. All other activity on `main` will go out with a subsequent major or minor release. @@ -109,6 +109,7 @@ Therefore, file a JIRA ticket with Sonatype to get added ([example for a differe Follow [Sonatype's GPG instructions](https://central.sonatype.org/pages/working-with-pgp-signatures.html). Install `gpg-agent` (needed below) e.g. on Ubuntu via: `sudo apt-get install gnupg-agent`. +for Mac you need to install 'gnupg' via 'brew install gnupg' #### Login configuration @@ -118,7 +119,7 @@ Create the `settings.xml` in the `$HOME/.m2/` directory as described in their [i ## Release Cutover -In this section we describe our current release process. We begin with a list of [**pre-requisites for the release team**](#pre-requisites) and with a short [**overview**](#overview). +In this section we describe our current release process. We begin with a list of [**pre-requisite for the release team**](#pre-requisites) and with a short [**overview**](#overview). The release process is divided into three parts: [**Pre-Release**](#pre-release), [**Release**](#release), [**Post-Release**](#post-release), which are detailed after the overview. ### Pre-Requisites @@ -139,7 +140,8 @@ We usually create the RC1 during the first week of the month, and the GA version #### Code Freeze Before creating RC1, there is a code freeze. Assuming the release of RC1 happens on a Tuesday, the release branch will be frozen Friday of the previous week. -This allows us to test that the release branch can be released and avoid discovering unwanted events during the release day. Once the RC1 is released, there are three more weeks to backport bug fixes into the release branches. However, we also proceed to a code freeze the Friday before the GA release. (Assuming GA is on a Tuesday) +This allows us to test that the release branch can be released and avoid discovering unwanted events during the release day. Once the RC1 is released, there are three more weeks to backport bug fixes into the release branches. +However, we also proceed to a code freeze the Friday before the GA release. (Assuming GA is on a Tuesday) Regarding patch releases, no code freeze is planned. #### Tracking Issue for each Release @@ -159,8 +161,9 @@ That includes: > - This includes write access to the Vitess repository and to the Maven repository. - **Preparing and cleaning the release notes summary.** > - One or more Pull Requests have to be submitted in advance to create and update the release summary. - > - The summary files are located in: `./doc/releasenotes/*_*_*_summary.md`. + > - The summary files are located in: `./changelog/*.0/*.*.*/summary.md`. > - The summary file for a release candidate is the same as the one for the GA release. + > - Make sure to run `go run ./go/tools/releases/releases.go` to update the `changelog` directory with the latest release notes. - **Finishing the blog post, and coordinating with the different organizations for cross-posting. Usually CNCF and PlanetScale. This step applies only for GA releases.** > - The blog post must be finished and reviewed. > - A Pull Request on the website repository of Vitess has to be created so we can easily publish the blog during the release day. @@ -168,17 +171,29 @@ That includes: > - As soon as we go into code freeze, if we are doing an RC, create the release branch. > - If we are doing a GA release, do not merge any new Pull Requests. > - The guide on how to do a code freeze is available in the [How To Code Freeze](#how-to-code-freeze) section. + > - It is not advised to merge a PR during code freeze, but if it is deemed necessary by the release lead, then follow the steps in [How To Merge During Code Freeze](#how-to-merge-during-code-freeze) section. +- **Create the Vitess release.** + > - A guide on how to create a Vitess release is available in the [How to prepare the release of Vitess](#how-to-prepare-the-release-of-vitess) section. + > - This step will create a Release Pull Request, it must be reviewed and merged before the release day. The release commit will be used to tag the release. - **Preparing the Vitess Operator release.** > - While the Vitess Operator is located in a different repository, we also need to do a release for it. > - The Operator follows the same cycle: RC1 -> GA -> Patches. > - Documentation for the pre-release of the Vitess Operator is available [here](https://github.com/planetscale/vitess-operator/blob/main/docs/release-process.md#prepare-for-release). +- **Update the release notes on `main`.** + > - One Pull Request against `main` must be created, it will contain the new release notes that we are adding in the Release Pull Request. + > - We open this Pull Request now to avoid waiting on the CI during release day. + > - All future changes to the release notes during the code freeze will need to be ported to both PRs: the one on `main` and the Release Pull Request. ### Release On the release day, there are several things to do: -- **Create the Vitess release.** - > - A guide on how to create a Vitess release is available in the [How To Release Vitess](#how-to-release-vitess) section. +- **Merge the Release Pull Request.** + > - During the code freeze, we created a Release Pull Request. It must be merged. +- **Tag the Vitess release.** + > - A guide on how to tag a version is available in the [How To Release Vitess](#how-to-release-vitess) section. +- **Update the release notes on `main`.** + > - During the code freeze, we created a Pull Request against `main` to update the release notes. It must be merged. - **Create the corresponding Vitess operator release.** > - Applies only to versions greater or equal to `v14.0.0`. > - If we are doing an RC release, then we will need to create the Vitess Operator RC too. If we are doing a GA release, we're also doing a GA release in the Operator. @@ -200,10 +215,8 @@ On the release day, there are several things to do: > - After a while, those elements will finish their execution and their status will be green. > - This step is even more important for GA releases as we often include a link to _arewefastyet_ in the blog post. > - The benchmarks need to complete before announcing the blog posts or before they get cross-posted. -- **Update the release notes on the release branch and on `main`.** - > - Two new Pull Requests have to be created. - > - One against `main`, it will contain only the new release notes. - > - And another against the release branch, this one contains the release notes and the release commit. (The commit on which we did `git tag`) +- **Go back to dev mode on the release branch.** + > - The version constants across the codebase must be updated to `SNAPSHOT`. - **Build k8s Docker images and publish them** > - The docker image for `base`, `lite`, etc are built automatically by DockerHub. The k8s images however are dependent on these images and are required to be built manually. > - These images should be built after the `base` image has been built and available on DockerHub. @@ -214,6 +227,56 @@ On the release day, there are several things to do: Once the release is over, we need to announce it on both Slack and Twitter. We also want to make sure the blog post was cross-posted, if applicable. We need to verify that _arewefastyet_ has finished the benchmark too. +### How to prepare the release of Vitess + +> In this example our current version is `v14.0.3` and we release the version `v15.0.0`. +> Alongside Vitess' release, we also release a new version of the operator. +> Since we are releasing a release candidate here, the new version of the operator will also be a release candidate. +> In this example, the new operator version is `2.8.0`. +> +> It is important to note that before the RC, there is a code freeze during which we create the release branch. +> +> The release branch in this example is `release-15.0`. +> +> The example also assumes that `origin` is the `vitessio/vitess` remote. + +1. Fetch `github.com/vitessio/vitess`'s remote. + ```shell + git fetch origin + ``` + +2. Creation of the Release Pull Request. + > This step will create the Release Pull Request that will then be reviewed ahead of the release day. + > The merge commit of that Pull Request will be used during the release day to tag the release. + 1. Run the `create_release` script using the Makefile: + 1. Release Candidate: + ```shell + make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0-rc1" VTOP_VERSION="2.8.0-rc1" create_release + ``` + 2. General Availability: + ```shell + make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0" VTOP_VERSION="2.8.0" create_release + ``` + + The script will prompt you `Pausing so release notes can be added. Press enter to continue`. We are now going to generate the release notes, continue to the next sub-step. + + 2. Run the following command to generate the release notes: + 1. Release Candidate: + ```shell + make VERSION="v15.0.0-rc1" FROM="v14.0.3" TO="HEAD" SUMMARY="./changelog/15.0/15.0.0/summary.md" release-notes + ``` + 2. General Availability: + ```shell + make VERSION="v15.0.0-rc1" FROM="v14.0.3" TO="HEAD" SUMMARY="./changelog/15.0/15.0.0/summary.md" release-notes + ``` + This command will generate the release notes by looking at all the commits between the tag `v14.0.3` and the reference `HEAD`. + It will also use the file located in `./changelog/15.0/15.0.0/summary.md` to prefix the release notes with a text that the maintainers wrote before the release. + Please verify the generated release notes to make sure it is well-formatted and all the bookmarks are generated properly. + + +3. Follow the instruction prompted by the `create_release` Makefile command's output in order to push the newly created branch and create the Release Pull Request on GitHub. + +4. If we are doing an RC release it means we created a new branch from `main`. We need to update `main` with the next SNAPSHOT version. If `main` was on `15.0.0-SNAPSHOT`, we need to update it to `16.0.0-SNAPSHOT`. A simple find and replace in the IDE is sufficient, there only a handful of files that must be changed: `version.go` and several java files. ### How To Release Vitess This section is divided into two parts: @@ -222,7 +285,10 @@ This section is divided into two parts: #### Creation of the tags and release notes -> In this example our current version is `v14` and we release the version `v15.0.0`. +> This step implies that you have created a [Release Pull Request](#how-to-prepare-the-release-of-vitess) beforehand and that it has been reviewed. +> The merge commit of this Release Pull Request will be used to tag the release. +> +> In this example our current version is `v14.0.3` and we release the version `v15.0.0`. > Alongside Vitess' release, we also release a new version of the operator. > Since we are releasing a release candidate here, the new version of the operator will also be a release candidate. > In this example, the new operator version is `2.8.0`. @@ -238,37 +304,22 @@ This section is divided into two parts: git fetch origin ``` -2. Creation of the release notes and tags. - 1. Run the release script using the Makefile: - 1. Release Candidate: - ```shell - make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0-rc1" DEV_VERSION="15.0.0-SNAPSHOT" VTOP_VERSION="2.8.0-rc1" do_release - ``` - 2. General Availability: - ```shell - make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0" DEV_VERSION="15.0.1-SNAPSHOT" VTOP_VERSION="2.8.0" do_release - ``` - - The script will prompt you `Pausing so release notes can be added. Press enter to continue`. We are now going to generate the release notes, continue to the next sub-step. +2. Checkout to the merge commit of the Release Pull Request. - 2. Run the following command to generate the release notes: - 1. Release Candidate: - ```shell - make VERSION="v15.0.0-rc1" FROM="v14.0.0" TO="HEAD" SUMMARY="./doc/releasenotes/15_0_0_summary.md" release-notes - ``` - 2. General Availability: - ```shell - make VERSION="v15.0.0-rc1" FROM="v14.0.0" TO="HEAD" SUMMARY="./doc/releasenotes/15_0_0_summary.md" release-notes - ``` - This command will generate the release notes by looking at all the commits between the tag `v14.0.0` and the reference `HEAD`. - It will also use the file located in `./doc/releasenotes/15_0_0_summary.md` to prefix the release notes with a text that the maintainers wrote before the release. +3. Tag the release and push the tags + ```shell + git tag v15.0.0 && git tag v0.15.0 && git push origin v15.0.0 && git push origin v0.15.0 + ``` +4. Create a Pull Request against the `main` branch with the release notes found in `./changelog/15.0/15.0.0/15_0_0_*.md`. -3. Follow the instruction prompted by the `do_release` Makefile command's output in order to push the tags, branches and create the Pull Requests. - -4. Create a Pull Request against the `main` branch with the newly created release notes. - -5. Release the tag on GitHub UI as explained in the following section. +5. Run the back to dev mode tool. + ```shell + make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0-rc1" DEV_VERSION="15.0.0-SNAPSHOT" back_to_dev_mode + ``` + > You will then need to follow the instructions given by the output of the back_to_dev_mode Makefile command. You will need to push the newly created branch and open a Pull Request. + +6. Release the tag on GitHub UI as explained in the following section. #### Creating Release or Release Candidate on the GitHub UI @@ -313,6 +364,9 @@ git fetch --all git checkout -b release-15.0 origin/main ``` +> Important: after creating the new branch `release-15.0`, we need to create new branch protection rules on the GitHub UI. +> The rules can be copied from the rules that are on the `main` branch. + The new branch will be based on `origin/main`, here `origin` points to `vitessio/vitess`. If we are not doing a release candidate, then the branch already exists and we can checkout on it. Now, if we are doing a GA release, let's update the branch: @@ -329,6 +383,26 @@ Finally, let's run the code freeze script: The script will prompt the command that will allow you to push the code freeze change. Once pushed, open a PR that will be merged on `release-15.0`. +Remember, you should also disable the Launchable integration from the newly created release branch. + +### How To Merge During Code Freeze + +> **Warning:** It is not advised to merge a PR during code-freeze. If it is deemed absolutely necessary, then the following steps can be followed. + +The PR that needs to be merged will be failing on the `Code Freeze` CI. To merge this PR, we'll have to mark this CI action as not required. +You will need administrator privileges on the vitess repository to be able to make this change. + +1. Go to the GitHub repository and click on `Settings`. +2. Under the `Code and automation` section, select `Branches`. +3. Find the branch that you want to merge the PR against and then select `Edit`. +4. Scroll down to find the list of required checks. +5. Within this list find `Code Freeze` and click on the cross next to it to remove it from this list. +6. Save your changes on the bottom of the page. +7. Refresh the page of the PR, and you should be able to merge it. +8. After merging the PR, you need to do 2 more things - + 1. Add `Code Freeze` back as a required check. + 2. Check if the release PR has any merge conflicts. If it does, fix them and push. + ### Java Packages: Deploy & Release > **Warning:** This section's steps need to be executed only when releasing a new major version of Vitess, @@ -336,12 +410,12 @@ The script will prompt the command that will allow you to push the code freeze c > > For this example, we assume we juste released `v12.0.0`. -1. Checkout to the release commit. +1. Checkout to the release commit. ```shell git checkout v12.0.0 ``` -2. Run `gpg-agent` to avoid that Maven will constantly prompt you for the password of your private key. +2. Run `gpg-agent` to avoid that Maven will constantly prompt you for the password of your private key. Note that this can print error messages that can be ignored on Mac. ```bash eval $(gpg-agent --daemon --no-grab --write-env-file $HOME/.gpg-agent-info) @@ -349,11 +423,20 @@ The script will prompt the command that will allow you to push the code freeze c export GPG_AGENT_INFO ``` -3. Deploy (upload) the Java code to the oss.sonatype.org repository: +3. Export following to avoid any version conflicts + ```bash + export MAVEN_OPTS="--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED + --add-opens=java.desktop/java.awt.font=ALL-UNNAMED" + ``` + +4. Deploy (upload) the Java code to the oss.sonatype.org repository: > **Warning:** After the deployment, the Java packages will be automatically released. Once released, you cannot delete them. The only option is to upload a newer version (e.g. increment the patch level).

```bash + cd ./java/ mvn clean deploy -P release -DskipTests cd .. ``` + +5. It will take some time for artifacts to appear on [maven directory](https://mvnrepository.com/artifact/io.vitess/vitess-client) diff --git a/go/tools/release-notes/release_notes.go b/go/tools/release-notes/release_notes.go index 73b6fd200f2..e6e44e83e3e 100644 --- a/go/tools/release-notes/release_notes.go +++ b/go/tools/release-notes/release_notes.go @@ -76,14 +76,17 @@ type ( KnownIssues string AddDetails string PathToChangeLogFileOnGH, ChangeLog, ChangeMetrics string + SubDirPath string } ) -const ( - releaseNotesPath = `doc/releasenotes/` - releaseNotesPathGitHub = `https://github.com/vitessio/vitess/blob/main/` + releaseNotesPath +var ( + releaseNotesPath = `changelog/` +) - markdownTemplate = `# Release of Vitess {{.Version}} +const ( + releaseNotesPathGitHub = `https://github.com/vitessio/vitess/blob/main/` + markdownTemplate = `# Release of Vitess {{.Version}} {{- if or .Announcement .AddDetails }} {{ .Announcement }} @@ -138,9 +141,9 @@ The entire changelog for this release can be found [here]({{ .PathToChangeLogFil func (rn *releaseNote) generate(rnFile, changelogFile *os.File) error { var err error // Generate the release notes - rn.PathToChangeLogFileOnGH = fmt.Sprintf(releaseNotesPathGitHub+"%s_changelog.md", rn.VersionUnderscore) + rn.PathToChangeLogFileOnGH = releaseNotesPathGitHub + path.Join(rn.SubDirPath, "changelog.md") if rnFile == nil { - rnFile, err = os.OpenFile(fmt.Sprintf(path.Join(releaseNotesPath, "%s_release_notes.md"), rn.VersionUnderscore), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + rnFile, err = os.OpenFile(path.Join(rn.SubDirPath, "release_notes.md"), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return err } @@ -154,7 +157,7 @@ func (rn *releaseNote) generate(rnFile, changelogFile *os.File) error { // Generate the changelog if changelogFile == nil { - changelogFile, err = os.OpenFile(fmt.Sprintf(path.Join(releaseNotesPath, "%s_changelog.md"), rn.VersionUnderscore), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + changelogFile, err = os.OpenFile(path.Join(rn.SubDirPath, "changelog.md"), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return err } @@ -506,9 +509,20 @@ func main() { log.Fatal("The --version flag must be set using a valid format. Format: 'vX.X.X'.") } + // Define the path to the release notes folder + majorVersion := versionMatch[1] + "." + versionMatch[2] + patchVersion := versionMatch[0] + releaseNotesPath = path.Join(releaseNotesPath, majorVersion, patchVersion) + + err := os.MkdirAll(releaseNotesPath, os.ModePerm) + if err != nil { + log.Fatal(err) + } + releaseNotes := releaseNote{ Version: versionName, VersionUnderscore: fmt.Sprintf("%s_%s_%s", versionMatch[1], versionMatch[2], versionMatch[3]), // v14.0.0 -> 14_0_0, this is used to format filenames. + SubDirPath: releaseNotesPath, } // summary of the release diff --git a/go/tools/release-notes/release_notes_test.go b/go/tools/release-notes/release_notes_test.go index 0622d458d28..f80ee9097f9 100644 --- a/go/tools/release-notes/release_notes_test.go +++ b/go/tools/release-notes/release_notes_test.go @@ -160,11 +160,12 @@ func TestGenerateReleaseNotes(t *testing.T) { VersionUnderscore: "12_0_0", ChangeLog: "* PR 1\n* PR 2\n", ChangeMetrics: "optimization is the root of all evil", + SubDirPath: "changelog/12.0/12.0.0", }, expectedOut: "# Release of Vitess v12.0.0\n" + "This is the new release.\n\nNew features got added.\n" + "------------\n" + - "The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/12_0_0_changelog.md).\n" + + "The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/12.0/12.0.0/changelog.md).\n" + "optimization is the root of all evil\n", expectedOutChangeLog: "# Changelog of Vitess v12.0.0\n" + "* PR 1\n" + @@ -176,9 +177,10 @@ func TestGenerateReleaseNotes(t *testing.T) { VersionUnderscore: "12_0_0", ChangeLog: "* PR 1\n* PR 2\n", ChangeMetrics: "optimization is the root of all evil", + SubDirPath: "changelog/12.0/12.0.0", }, expectedOut: "# Release of Vitess v12.0.0\n" + - "The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/12_0_0_changelog.md).\n" + + "The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/12.0/12.0.0/changelog.md).\n" + "optimization is the root of all evil\n", expectedOutChangeLog: "# Changelog of Vitess v12.0.0\n" + "* PR 1\n" + diff --git a/go/tools/releases/releases.go b/go/tools/releases/releases.go new file mode 100644 index 00000000000..10c29233494 --- /dev/null +++ b/go/tools/releases/releases.go @@ -0,0 +1,143 @@ +/* +Copyright 2023 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +// The changelog directory is composed of a README that lists +// and links to all major releases of Vitess. It has one +// sub-directory for each major version. Each sub-directory is +// composed of another README that also lists and links all the +// patch releases of this major release. Those sub-directories +// are composed of one directory per patch release. Finally, +// the patch release directory contains the old files markdown: +// summary, release_notes, changelog. +// +// This tool is solely responsible for generating the READMEs +// and making sure they are up-to-date with the list of major +// and patch releases we have. + +import ( + "log" + "os" + "path" + "sort" + "strings" + "text/template" +) + +const ( + rootDir = "./changelog/" + + rootFileTmpl = `## Releases + +{{- range $r := .SubDirs }} +* [{{ $r.Name }}]({{ $r.Name }}) +{{- end -}} +` + + majorVersionTmpl = `## v{{ .Name }} + +{{- if .Team }} +The dedicated team for this release can be found [here]({{.Team}}).{{ end }} + +{{- range $r := .SubDirs }} +* **[{{ $r.Name }}]({{ $r.Name }})** +{{ if $r.Changelog }} * [Changelog]({{ $r.Name }}/{{ $r.Changelog }}) +{{ end -}} +{{ if $r.ReleaseNotes }} * [Release Notes]({{ $r.Name }}/{{ $r.ReleaseNotes }}) +{{ end -}} +{{- end -}} +` +) + +type dir struct { + Name string + Path string + Changelog string + ReleaseNotes string + Team string + SubDirs []dir +} + +func main() { + rootDir, err := getDirs(dir{Path: rootDir}) + if err != nil { + log.Fatal(err) + } + + err = execReadMeTemplateWithDir(rootDir, rootFileTmpl) + if err != nil { + log.Fatal(err) + } + + for _, subDir := range rootDir.SubDirs { + err := execReadMeTemplateWithDir(subDir, majorVersionTmpl) + if err != nil { + log.Fatal(err) + } + } +} + +func execReadMeTemplateWithDir(d dir, tmpl string) error { + rootRM, err := os.OpenFile(path.Join(d.Path, "README.md"), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0640) + if err != nil { + return err + } + + t := template.Must(template.New("root_readme").Parse(tmpl)) + err = t.ExecuteTemplate(rootRM, "root_readme", d) + if err != nil { + return err + } + return nil +} + +func getDirs(curDir dir) (dir, error) { + entries, err := os.ReadDir(curDir.Path) + if err != nil { + return dir{}, err + } + + for _, entry := range entries { + if entry.IsDir() { + subDir, err := getDirs(dir{ + Name: entry.Name(), + Path: path.Join(curDir.Path, entry.Name()), + }) + if err != nil { + return dir{}, err + } + curDir.SubDirs = append(curDir.SubDirs, subDir) + continue + } + + switch { + case strings.Contains(entry.Name(), "changelog.md"): + curDir.Changelog = entry.Name() + case strings.Contains(entry.Name(), "release_notes.md"): + curDir.ReleaseNotes = entry.Name() + case strings.Contains(entry.Name(), "team.md"): + curDir.Team = entry.Name() + } + } + sort.Slice(curDir.SubDirs, func(i, j int) bool { + if len(curDir.SubDirs[i].Name) < len(curDir.SubDirs[j].Name) { + return false + } + return curDir.SubDirs[i].Name > curDir.SubDirs[j].Name + }) + return curDir, nil +} From f56e64a5a61ad00627b54250379380359ec340ba Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 21 Mar 2023 15:28:03 +0200 Subject: [PATCH 40/53] [release-15.0] Make sure to not push down expressions when not possible (#12607) (#12647) * [gen4 planner] Make sure to not push down expressions when not possible (#12607) * Fix random aggregation to not select Null column * stop pushing down projections that should be evaluated at the vtgate level * undo changes to AggregateRandom * clean up code * fix executor test mock Signed-off-by: Florent Poinsard Signed-off-by: Andres Taylor * Fix schema error Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard Signed-off-by: Andres Taylor Co-authored-by: Andres Taylor --- .../queries/aggregation/aggregation_test.go | 12 ++- .../vtgate/queries/aggregation/schema.sql | 5 ++ .../vtgate/queries/aggregation/vschema.json | 8 ++ go/vt/vtgate/executor_select_test.go | 34 ++++++++ .../planbuilder/abstract/queryprojection.go | 81 +++++++++++++++++++ go/vt/vtgate/planbuilder/gen4_planner.go | 38 ++++----- go/vt/vtgate/planbuilder/horizon_planning.go | 26 +++++- .../planbuilder/testdata/aggr_cases.json | 40 +++++++++ 8 files changed, 222 insertions(+), 22 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index 8402914ceb4..29d94e42c77 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -33,7 +33,7 @@ func start(t *testing.T) (utils.MySQLCompare, func()) { deleteAll := func() { _, _ = utils.ExecAllowError(t, mcmp.VtConn, "set workload = oltp") - tables := []string{"t9", "aggr_test", "t3", "t7_xxhash", "aggr_test_dates", "t7_xxhash_idx", "t1", "t2"} + tables := []string{"t9", "aggr_test", "t3", "t7_xxhash", "aggr_test_dates", "t7_xxhash_idx", "t1", "t2", "t11"} for _, table := range tables { _, _ = mcmp.ExecAndIgnore("delete from " + table) } @@ -427,3 +427,13 @@ func TestScalarAggregate(t *testing.T) { mcmp.Exec("insert into aggr_test(id, val1, val2) values(1,'a',1), (2,'A',1), (3,'b',1), (4,'c',3), (5,'c',4)") mcmp.AssertMatches("select /*vt+ PLANNER=gen4 */ count(distinct val1) from aggr_test", `[[INT64(3)]]`) } + +func TestAggregationRandomOnAnAggregatedValue(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into t11(k, a, b) values (0, 100, 10), (10, 200, 20);") + + mcmp.AssertMatchesNoOrder("select /*vt+ PLANNER=gen4 */ A.a, A.b, (A.a / A.b) as d from (select sum(a) as a, sum(b) as b from t11 where a = 100) A;", + `[[DECIMAL(100) DECIMAL(10) DECIMAL(10.0000)]]`) +} diff --git a/go/test/endtoend/vtgate/queries/aggregation/schema.sql b/go/test/endtoend/vtgate/queries/aggregation/schema.sql index a6ce793b4e7..0b59819dda5 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/schema.sql +++ b/go/test/endtoend/vtgate/queries/aggregation/schema.sql @@ -70,3 +70,8 @@ CREATE TABLE t2 ( PRIMARY KEY (id) ) ENGINE InnoDB; +CREATE TABLE t11 ( + k BIGINT PRIMARY KEY, + a INT, + b INT +); diff --git a/go/test/endtoend/vtgate/queries/aggregation/vschema.json b/go/test/endtoend/vtgate/queries/aggregation/vschema.json index c2d3f133a35..727d6adc1d0 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/vschema.json +++ b/go/test/endtoend/vtgate/queries/aggregation/vschema.json @@ -123,6 +123,14 @@ "name": "hash" } ] + }, + "t11": { + "column_vindexes": [ + { + "column": "k", + "name": "hash" + } + ] } } } \ No newline at end of file diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index c95810cc209..d060e7dfa6c 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -3744,6 +3744,40 @@ func TestSelectHexAndBit(t *testing.T) { require.Equal(t, `[[UINT64(10) UINT64(10) UINT64(10) UINT64(10)]]`, fmt.Sprintf("%v", qr.Rows)) } +func TestSelectAggregationRandom(t *testing.T) { + cell := "aa" + hc := discovery.NewFakeHealthCheck(nil) + createSandbox(KsTestSharded).VSchema = executorVSchema + getSandbox(KsTestUnsharded).VSchema = unshardedVSchema + serv := newSandboxForCells([]string{cell}) + resolver := newTestResolver(hc, serv, cell) + shards := []string{"-20", "20-40", "40-60", "60-80", "80-a0", "a0-c0", "c0-e0", "e0-"} + var conns []*sandboxconn.SandboxConn + for _, shard := range shards { + sbc := hc.AddTestTablet(cell, shard, 1, KsTestSharded, shard, topodatapb.TabletType_PRIMARY, true, 1, nil) + conns = append(conns, sbc) + + sbc.SetResults([]*sqltypes.Result{sqltypes.MakeTestResult( + sqltypes.MakeTestFields("a|b", "int64|int64"), + "null|null", + )}) + } + + conns[0].SetResults([]*sqltypes.Result{sqltypes.MakeTestResult( + sqltypes.MakeTestFields("a|b", "int64|int64"), + "10|1", + )}) + + executor := createExecutor(serv, cell, resolver) + executor.pv = querypb.ExecuteOptions_Gen4 + session := NewAutocommitSession(&vtgatepb.Session{}) + + rs, err := executor.Execute(context.Background(), "TestSelectCFC", session, + "select /*vt+ PLANNER=gen4 */ A.a, A.b, (A.a / A.b) as c from (select sum(a) as a, sum(b) as b from user) A", nil) + require.NoError(t, err) + assert.Equal(t, `[[INT64(10) INT64(1) DECIMAL(10.0000)]]`, fmt.Sprintf("%v", rs.Rows)) +} + func TestMain(m *testing.M) { _flag.ParseFlagsForTest() os.Exit(m.Run()) diff --git a/go/vt/vtgate/planbuilder/abstract/queryprojection.go b/go/vt/vtgate/planbuilder/abstract/queryprojection.go index f3acdd3693c..26ad330d3b7 100644 --- a/go/vt/vtgate/planbuilder/abstract/queryprojection.go +++ b/go/vt/vtgate/planbuilder/abstract/queryprojection.go @@ -22,6 +22,8 @@ import ( "strings" "vitess.io/vitess/go/vt/vtgate/engine" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/sqlparser" @@ -575,6 +577,85 @@ func (qp *QueryProjection) GetColumnCount() int { return len(qp.SelectExprs) - qp.AddedColumn } +// NeedsProjecting returns true if we have projections that need to be evaluated at the vtgate level +// and can't be pushed down to MySQL +func (qp *QueryProjection) NeedsProjecting( + ctx *plancontext.PlanningContext, + pusher func(expr *sqlparser.AliasedExpr) (int, error), +) (needsVtGateEval bool, expressions []sqlparser.Expr, colNames []string, err error) { + for _, se := range qp.SelectExprs { + var ae *sqlparser.AliasedExpr + ae, err = se.GetAliasedExpr() + if err != nil { + return false, nil, nil, err + } + + expr := ae.Expr + colNames = append(colNames, ae.ColumnName()) + + if _, isCol := expr.(*sqlparser.ColName); isCol { + offset, err := pusher(ae) + if err != nil { + return false, nil, nil, err + } + expressions = append(expressions, sqlparser.NewOffset(offset, expr)) + continue + } + + rExpr := sqlparser.Rewrite(sqlparser.CloneExpr(expr), func(cursor *sqlparser.Cursor) bool { + col, isCol := cursor.Node().(*sqlparser.ColName) + if !isCol { + return true + } + var tableInfo semantics.TableInfo + tableInfo, err = ctx.SemTable.TableInfoForExpr(col) + if err != nil { + return true + } + _, isDT := tableInfo.(*semantics.DerivedTable) + if !isDT { + return true + } + + var rewritten sqlparser.Expr + rewritten, err = semantics.RewriteDerivedTableExpression(col, tableInfo) + if err != nil { + return false + } + if sqlparser.ContainsAggregation(rewritten) { + offset, tErr := pusher(&sqlparser.AliasedExpr{Expr: col}) + if tErr != nil { + err = tErr + return false + } + + cursor.Replace(sqlparser.NewOffset(offset, col)) + } + return true + }, nil).(sqlparser.Expr) + + if err != nil { + return + } + + if !sqlparser.EqualsExpr(rExpr, expr) { + // if we changed the expression, it means that we have to evaluate the rest at the vtgate level + expressions = append(expressions, rExpr) + needsVtGateEval = true + continue + } + + // we did not need to push any parts of this expression down. Let's check if we can push all of it + offset, err := pusher(ae) + if err != nil { + return false, nil, nil, err + } + expressions = append(expressions, sqlparser.NewOffset(offset, expr)) + } + + return +} + func checkForInvalidGroupingExpressions(expr sqlparser.Expr) error { return sqlparser.Walk(func(node sqlparser.SQLNode) (bool, error) { if _, isAggregate := node.(sqlparser.AggrFunc); isAggregate { diff --git a/go/vt/vtgate/planbuilder/gen4_planner.go b/go/vt/vtgate/planbuilder/gen4_planner.go index 924169fc966..67604f4e9be 100644 --- a/go/vt/vtgate/planbuilder/gen4_planner.go +++ b/go/vt/vtgate/planbuilder/gen4_planner.go @@ -222,13 +222,13 @@ func newBuildSelectPlan( return nil, nil, err } - plan = optimizePlan(plan) - plan, err = planHorizon(ctx, plan, selStmt, true) if err != nil { return nil, nil, err } + optimizePlan(plan) + sel, isSel := selStmt.(*sqlparser.Select) if isSel { if err := setMiscFunc(plan, sel); err != nil { @@ -249,25 +249,25 @@ func newBuildSelectPlan( } // optimizePlan removes unnecessary simpleProjections that have been created while planning -func optimizePlan(plan logicalPlan) logicalPlan { - newPlan, _ := visit(plan, func(plan logicalPlan) (bool, logicalPlan, error) { - this, ok := plan.(*simpleProjection) - if !ok { - return true, plan, nil - } +func optimizePlan(plan logicalPlan) { + for _, lp := range plan.Inputs() { + optimizePlan(lp) + } - input, ok := this.input.(*simpleProjection) - if !ok { - return true, plan, nil - } + this, ok := plan.(*simpleProjection) + if !ok { + return + } - for i, col := range this.eSimpleProj.Cols { - this.eSimpleProj.Cols[i] = input.eSimpleProj.Cols[col] - } - this.input = input.input - return true, this, nil - }) - return newPlan + input, ok := this.input.(*simpleProjection) + if !ok { + return + } + + for i, col := range this.eSimpleProj.Cols { + this.eSimpleProj.Cols[i] = input.eSimpleProj.Cols[col] + } + this.input = input.input } func gen4UpdateStmtPlanner( diff --git a/go/vt/vtgate/planbuilder/horizon_planning.go b/go/vt/vtgate/planbuilder/horizon_planning.go index 518860cdbda..1088aa357bc 100644 --- a/go/vt/vtgate/planbuilder/horizon_planning.go +++ b/go/vt/vtgate/planbuilder/horizon_planning.go @@ -59,7 +59,8 @@ func (hp *horizonPlanning) planHorizon(ctx *plancontext.PlanningContext, plan lo // a simpleProjection. We create a new Route that contains the derived table in the // FROM clause. Meaning that, when we push expressions to the select list of this // new Route, we do not want them to rewrite them. - if _, isSimpleProj := plan.(*simpleProjection); isSimpleProj { + sp, derivedTable := plan.(*simpleProjection) + if derivedTable { oldRewriteDerivedExpr := ctx.RewriteDerivedExpr defer func() { ctx.RewriteDerivedExpr = oldRewriteDerivedExpr @@ -74,10 +75,11 @@ func (hp *horizonPlanning) planHorizon(ctx *plancontext.PlanningContext, plan lo } needsOrdering := len(hp.qp.OrderExprs) > 0 - canShortcut := isRoute && hp.sel.Having == nil && !needsOrdering // If we still have a HAVING clause, it's because it could not be pushed to the WHERE, // so it probably has aggregations + canShortcut := isRoute && hp.sel.Having == nil && !needsOrdering + switch { case hp.qp.NeedsAggregation() || hp.sel.Having != nil: plan, err = hp.planAggregations(ctx, plan) @@ -91,6 +93,26 @@ func (hp *horizonPlanning) planHorizon(ctx *plancontext.PlanningContext, plan lo if err != nil { return nil, err } + case derivedTable: + pusher := func(ae *sqlparser.AliasedExpr) (int, error) { + offset, _, err := pushProjection(ctx, ae, sp.input, true, true, false) + return offset, err + } + needsVtGate, projections, colNames, err := hp.qp.NeedsProjecting(ctx, pusher) + if err != nil { + return nil, err + } + if !needsVtGate { + break + } + + // there were some expressions we could not push down entirely, + // so replace the simpleProjection with a real projection + plan = &projection{ + source: sp.input, + columns: projections, + columnNames: colNames, + } default: err = pushProjections(ctx, plan, hp.qp.SelectExprs) if err != nil { diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index 2e5b7a12ea2..1041fadba1d 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -4956,5 +4956,45 @@ "user.user_extra" ] } + }, + { + "comment": "Aggregations from derived table used in arithmetic outside derived table", + "query": "select A.a, A.b, (A.a / A.b) as d from (select sum(a) as a, sum(b) as b from user) A", + "v3-plan": "unsupported: expression on results of a cross-shard subquery", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select A.a, A.b, (A.a / A.b) as d from (select sum(a) as a, sum(b) as b from user) A", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "[COLUMN 0] as a", + "[COLUMN 1] as b", + "[COLUMN 0] / [COLUMN 1] as d" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum(0) AS a, sum(1) AS b", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select sum(a) as a, sum(b) as b from `user` where 1 != 1", + "Query": "select sum(a) as a, sum(b) as b from `user`", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } } ] \ No newline at end of file From d8c5160b4d37b6e561beddfd5b2eb9c990b93957 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 23 Mar 2023 12:38:05 +0530 Subject: [PATCH 41/53] Fix initialization code to also stop replication to prevent crash (#12534) (#12692) * feat: fix initialization code to also stop replication * feat: fix tests expectations * feat: fix wrangler tests --------- Signed-off-by: Manan Gupta --- .../reparent/newfeaturetest/reparent_test.go | 13 +++++++ .../endtoend/init_shard_primary_test.go | 2 + go/vt/vttablet/tabletmanager/tm_init.go | 2 +- go/vt/vttablet/tabletmanager/tm_init_test.go | 1 + go/vt/wrangler/testlib/backup_test.go | 21 +++++++--- .../testlib/copy_schema_shard_test.go | 6 +-- .../testlib/emergency_reparent_shard_test.go | 9 +++-- .../testlib/external_reparent_test.go | 12 +++--- go/vt/wrangler/testlib/permissions_test.go | 6 +-- .../testlib/planned_reparent_shard_test.go | 39 ++++++++++++------- go/vt/wrangler/testlib/reparent_utils_test.go | 6 ++- go/vt/wrangler/testlib/version_test.go | 3 +- 12 files changed, 83 insertions(+), 37 deletions(-) diff --git a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go index b450fb44420..4fb2b827539 100644 --- a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go +++ b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go @@ -169,3 +169,16 @@ func rowNumberFromPosition(pos string) int { rowNum, _ := strconv.Atoi(rowNumStr) return rowNum } + +// TestTabletRestart tests that a running tablet can be restarted and everything is still fine +func TestTabletRestart(t *testing.T) { + defer cluster.PanicHandler(t) + clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + defer utils.TeardownCluster(clusterInstance) + tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets + + utils.StopTablet(t, tablets[1], false) + tablets[1].VttabletProcess.ServingStatus = "SERVING" + err := tablets[1].VttabletProcess.Setup() + require.NoError(t, err) +} diff --git a/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go b/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go index 19a580c451c..6e3916c22a5 100644 --- a/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go +++ b/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go @@ -63,6 +63,7 @@ func TestInitShardPrimary(t *testing.T) { tablet2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -76,6 +77,7 @@ func TestInitShardPrimary(t *testing.T) { tablet2.FakeMysqlDaemon.SetReplicationSourceInputs = append(tablet2.FakeMysqlDaemon.SetReplicationSourceInputs, fmt.Sprintf("%v:%v", tablet1.Tablet.Hostname, tablet1.Tablet.MysqlPort)) tablet3.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index f2671b664d1..cf1ea9f3d62 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -919,7 +919,7 @@ func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType t log.Warningf("primary tablet in the shard record doesn't have mysql hostname specified. probably because that tablet shutdown.") return nil, nil } - if err := tm.MysqlDaemon.SetReplicationSource(ctx, currentPrimary.Tablet.MysqlHostname, int(currentPrimary.Tablet.MysqlPort), false /* stopReplicationBefore */, true /* startReplicationAfter */); err != nil { + if err := tm.MysqlDaemon.SetReplicationSource(ctx, currentPrimary.Tablet.MysqlHostname, int(currentPrimary.Tablet.MysqlPort), true /* stopReplicationBefore */, true /* startReplicationAfter */); err != nil { return nil, vterrors.Wrap(err, "MysqlDaemon.SetReplicationSource failed") } diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index 933a9501a55..fbf5566d2ed 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -382,6 +382,7 @@ func TestCheckPrimaryShip(t *testing.T) { fakeMysql := tm.MysqlDaemon.(*fakemysqldaemon.FakeMysqlDaemon) fakeMysql.SetReplicationSourceInputs = append(fakeMysql.SetReplicationSourceInputs, fmt.Sprintf("%v:%v", otherTablet.MysqlHostname, otherTablet.MysqlPort)) fakeMysql.ExpectedExecuteSuperQueryList = []string{ + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/wrangler/testlib/backup_test.go b/go/vt/wrangler/testlib/backup_test.go index 7cdb7172e19..408329b1a98 100644 --- a/go/vt/wrangler/testlib/backup_test.go +++ b/go/vt/wrangler/testlib/backup_test.go @@ -182,7 +182,8 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { }, } sourceTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -231,13 +232,15 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { }, } destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET SLAVE POSITION", + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -419,7 +422,8 @@ func TestBackupRestoreLagged(t *testing.T) { } sourceTablet.FakeMysqlDaemon.SetReplicationSourceInputs = []string{fmt.Sprintf("%s:%d", primary.Tablet.MysqlHostname, primary.Tablet.MysqlPort)} sourceTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -489,13 +493,15 @@ func TestBackupRestoreLagged(t *testing.T) { }, } destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET SLAVE POSITION", + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -642,7 +648,8 @@ func TestRestoreUnreachablePrimary(t *testing.T) { } sourceTablet.FakeMysqlDaemon.SetReplicationSourceInputs = []string{fmt.Sprintf("%s:%d", primary.Tablet.MysqlHostname, primary.Tablet.MysqlPort)} sourceTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -684,13 +691,15 @@ func TestRestoreUnreachablePrimary(t *testing.T) { }, } destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET SLAVE POSITION", + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/wrangler/testlib/copy_schema_shard_test.go b/go/vt/wrangler/testlib/copy_schema_shard_test.go index 8620d7e7565..2c59fbb16cf 100644 --- a/go/vt/wrangler/testlib/copy_schema_shard_test.go +++ b/go/vt/wrangler/testlib/copy_schema_shard_test.go @@ -17,14 +17,13 @@ limitations under the License. package testlib import ( + "context" "fmt" "testing" "time" "vitess.io/vitess/go/vt/discovery" - "context" - "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/logutil" @@ -74,7 +73,8 @@ func copySchema(t *testing.T, useShardAsSource bool) { sourceRdonly := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_RDONLY, sourceRdonlyDb, TabletKeyspaceShard(t, "ks", "-80")) sourceRdonly.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go index 014029504a9..466d1782f4b 100644 --- a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go @@ -137,7 +137,8 @@ func TestEmergencyReparentShard(t *testing.T) { goodReplica1.FakeMysqlDaemon.WaitPrimaryPositions = append(goodReplica1.FakeMysqlDaemon.WaitPrimaryPositions, goodReplica1.FakeMysqlDaemon.CurrentSourceFilePosition) goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -169,7 +170,8 @@ func TestEmergencyReparentShard(t *testing.T) { goodReplica2.FakeMysqlDaemon.WaitPrimaryPositions = append(goodReplica2.FakeMysqlDaemon.WaitPrimaryPositions, goodReplica2.FakeMysqlDaemon.CurrentSourceFilePosition) goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -271,7 +273,8 @@ func TestEmergencyReparentShardPrimaryElectNotBest(t *testing.T) { moreAdvancedReplica.FakeMysqlDaemon.WaitPrimaryPositions = append(moreAdvancedReplica.FakeMysqlDaemon.WaitPrimaryPositions, moreAdvancedReplica.FakeMysqlDaemon.CurrentSourceFilePosition) newPrimary.FakeMysqlDaemon.WaitPrimaryPositions = append(newPrimary.FakeMysqlDaemon.WaitPrimaryPositions, moreAdvancedReplica.FakeMysqlDaemon.CurrentPrimaryPosition) moreAdvancedReplica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/wrangler/testlib/external_reparent_test.go b/go/vt/wrangler/testlib/external_reparent_test.go index a0c065261a0..2acc250faa0 100644 --- a/go/vt/wrangler/testlib/external_reparent_test.go +++ b/go/vt/wrangler/testlib/external_reparent_test.go @@ -17,14 +17,13 @@ limitations under the License. package testlib import ( + "context" "flag" "testing" "time" "vitess.io/vitess/go/vt/discovery" - "context" - "github.com/stretchr/testify/assert" "vitess.io/vitess/go/vt/logutil" @@ -263,7 +262,8 @@ func TestTabletExternallyReparentedWithDifferentMysqlPort(t *testing.T) { // TabletActionReplicaWasRestarted and point to the new mysql port goodReplica.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -352,7 +352,8 @@ func TestTabletExternallyReparentedContinueOnUnexpectedPrimary(t *testing.T) { // TabletActionReplicaWasRestarted and point to a bad host goodReplica.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -437,7 +438,8 @@ func TestTabletExternallyReparentedRerun(t *testing.T) { // On the good replica, we will respond to // TabletActionReplicaWasRestarted. goodReplica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/wrangler/testlib/permissions_test.go b/go/vt/wrangler/testlib/permissions_test.go index 1a023355d99..fec85ca3124 100644 --- a/go/vt/wrangler/testlib/permissions_test.go +++ b/go/vt/wrangler/testlib/permissions_test.go @@ -17,6 +17,7 @@ limitations under the License. package testlib import ( + "context" "strings" "testing" "time" @@ -24,8 +25,6 @@ import ( "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/topo/topoproto" - "context" - "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/topo" @@ -564,7 +563,8 @@ func TestPermissions(t *testing.T) { } replica.FakeMysqlDaemon.SetReplicationSourceInputs = append(replica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) replica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/wrangler/testlib/planned_reparent_shard_test.go b/go/vt/wrangler/testlib/planned_reparent_shard_test.go index 50e27926cdd..7fb174652c1 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -117,7 +117,8 @@ func TestPlannedReparentShardNoPrimaryProvided(t *testing.T) { goodReplica1.FakeMysqlDaemon.Replicating = true goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -236,7 +237,8 @@ func TestPlannedReparentShardNoError(t *testing.T) { goodReplica1.FakeMysqlDaemon.Replicating = true goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -252,7 +254,8 @@ func TestPlannedReparentShardNoError(t *testing.T) { goodReplica2.FakeMysqlDaemon.ReadOnly = true goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -460,7 +463,8 @@ func TestPlannedReparentShardWaitForPositionFail(t *testing.T) { goodReplica1.FakeMysqlDaemon.Replicating = true goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -476,7 +480,8 @@ func TestPlannedReparentShardWaitForPositionFail(t *testing.T) { goodReplica2.FakeMysqlDaemon.ReadOnly = true goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -573,7 +578,8 @@ func TestPlannedReparentShardWaitForPositionTimeout(t *testing.T) { goodReplica1.FakeMysqlDaemon.Replicating = true goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -589,7 +595,8 @@ func TestPlannedReparentShardWaitForPositionTimeout(t *testing.T) { goodReplica2.FakeMysqlDaemon.ReadOnly = true goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -654,7 +661,8 @@ func TestPlannedReparentShardRelayLogError(t *testing.T) { goodReplica1.FakeMysqlDaemon.Replicating = true goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -739,7 +747,8 @@ func TestPlannedReparentShardRelayLogErrorStartReplication(t *testing.T) { goodReplica1.FakeMysqlDaemon.CurrentSourcePort = int(primary.Tablet.MysqlPort) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // simulate error that will trigger a call to RestartReplication - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -852,7 +861,8 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { goodReplica1.FakeMysqlDaemon.Replicating = true goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -868,7 +878,8 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { goodReplica2.FakeMysqlDaemon.ReadOnly = true goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -973,7 +984,8 @@ func TestPlannedReparentShardSamePrimary(t *testing.T) { goodReplica1.FakeMysqlDaemon.Replicating = true goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -989,7 +1001,8 @@ func TestPlannedReparentShardSamePrimary(t *testing.T) { goodReplica2.FakeMysqlDaemon.ReadOnly = true goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(oldPrimary.Tablet)) goodReplica2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/wrangler/testlib/reparent_utils_test.go b/go/vt/wrangler/testlib/reparent_utils_test.go index 315ebce9638..482705c1fe4 100644 --- a/go/vt/wrangler/testlib/reparent_utils_test.go +++ b/go/vt/wrangler/testlib/reparent_utils_test.go @@ -91,7 +91,8 @@ func TestShardReplicationStatuses(t *testing.T) { replica.FakeMysqlDaemon.CurrentSourcePort = int(primary.Tablet.MysqlPort) replica.FakeMysqlDaemon.SetReplicationSourceInputs = append(replica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) replica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -160,7 +161,8 @@ func TestReparentTablet(t *testing.T) { replica.FakeMysqlDaemon.IOThreadRunning = true replica.FakeMysqlDaemon.SetReplicationSourceInputs = append(replica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) replica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/wrangler/testlib/version_test.go b/go/vt/wrangler/testlib/version_test.go index fbd8610e437..18b29d61ac2 100644 --- a/go/vt/wrangler/testlib/version_test.go +++ b/go/vt/wrangler/testlib/version_test.go @@ -93,7 +93,8 @@ func TestVersion(t *testing.T) { sourceReplicaGitRev := "fake git rev" sourceReplica.FakeMysqlDaemon.SetReplicationSourceInputs = append(sourceReplica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(sourcePrimary.Tablet)) sourceReplica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 3 statements come from tablet startup + // These 4 statements come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", From 0fbe50f7a9e8c7a92db5dffb66210c222ddb155d Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 23 Mar 2023 09:33:52 +0200 Subject: [PATCH 42/53] Backport 12634 (#12680) Signed-off-by: Florent Poinsard --- go/vt/vtgate/planbuilder/physical/operator_funcs.go | 3 +-- go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/go/vt/vtgate/planbuilder/physical/operator_funcs.go b/go/vt/vtgate/planbuilder/physical/operator_funcs.go index e4ded531efc..1ea8d88822a 100644 --- a/go/vt/vtgate/planbuilder/physical/operator_funcs.go +++ b/go/vt/vtgate/planbuilder/physical/operator_funcs.go @@ -231,11 +231,10 @@ func PushOutputColumns(ctx *plancontext.PlanningContext, op abstract.PhysicalOpe var pos int op.ColumnsOffset, pos = addToIntSlice(op.ColumnsOffset, i) offsets = append(offsets, pos) - // skip adding to columns as it exists already. + op.Columns = append(op.Columns, col) if i > -1 { continue } - op.Columns = append(op.Columns, col) noQualifierNames = append(noQualifierNames, sqlparser.NewColName(col.Name.String())) } if len(noQualifierNames) > 0 { diff --git a/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json b/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json index 17441749e3f..a056ca24fec 100644 --- a/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json +++ b/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json @@ -1287,7 +1287,7 @@ "Instructions": { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "L:0", + "JoinColumnIndexes": "L:1", "JoinVars": { "x_COLUMN_NAME": 0 }, @@ -1300,8 +1300,8 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", - "Query": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a) as x", + "FieldQuery": "select x.COLUMN_NAME, x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.COLUMN_NAME, x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a) as x", "Table": "information_schema.key_column_usage" }, { From 32a374be3c5c4fe89c4d59aec54fb613c86ffa91 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 23 Mar 2023 09:35:03 +0200 Subject: [PATCH 43/53] [planner bugfix] add expressions to HAVING (#12668) (#12699) * [planner bugfix] add expressions to HAVING When a predicate contains aggregation, it should not be added to the WHERE clause. It should go to the * update test expecteations --------- Signed-off-by: Andres Taylor Signed-off-by: Florent Poinsard Co-authored-by: Andres Taylor --- go/vt/sqlparser/ast_funcs.go | 6 +-- go/vt/sqlparser/ast_test.go | 34 +++++------------ go/vt/vtgate/planbuilder/operator_to_query.go | 28 +++++++++++--- .../planbuilder/testdata/aggr_cases.json | 37 +++++++++++++++++++ 4 files changed, 72 insertions(+), 33 deletions(-) diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index b9a1ea1b6d3..afa130eb279 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -991,10 +991,8 @@ func (node *Select) AddHaving(expr Expr) { } return } - node.Having.Expr = &AndExpr{ - Left: node.Having.Expr, - Right: expr, - } + exprs := SplitAndExpression(nil, node.Having.Expr) + node.Having.Expr = AndExpressions(append(exprs, expr)...) } // AddGroupBy adds a grouping expression, unless it's already present diff --git a/go/vt/sqlparser/ast_test.go b/go/vt/sqlparser/ast_test.go index 71c56594875..3c518ee7886 100644 --- a/go/vt/sqlparser/ast_test.go +++ b/go/vt/sqlparser/ast_test.go @@ -57,32 +57,22 @@ func TestSelect(t *testing.T) { sel.AddWhere(expr) buf := NewTrackedBuffer(nil) sel.Where.Format(buf) - want := " where a = 1" - if buf.String() != want { - t.Errorf("where: %q, want %s", buf.String(), want) - } + assert.Equal(t, " where a = 1", buf.String()) sel.AddWhere(expr) buf = NewTrackedBuffer(nil) sel.Where.Format(buf) - want = " where a = 1" - if buf.String() != want { - t.Errorf("where: %q, want %s", buf.String(), want) - } + assert.Equal(t, " where a = 1", buf.String()) + sel = &Select{} sel.AddHaving(expr) buf = NewTrackedBuffer(nil) sel.Having.Format(buf) - want = " having a = 1" - if buf.String() != want { - t.Errorf("having: %q, want %s", buf.String(), want) - } + assert.Equal(t, " having a = 1", buf.String()) + sel.AddHaving(expr) buf = NewTrackedBuffer(nil) sel.Having.Format(buf) - want = " having a = 1 and a = 1" - if buf.String() != want { - t.Errorf("having: %q, want %s", buf.String(), want) - } + assert.Equal(t, " having a = 1", buf.String()) tree, err = Parse("select * from t where a = 1 or b = 1") require.NoError(t, err) @@ -91,18 +81,14 @@ func TestSelect(t *testing.T) { sel.AddWhere(expr) buf = NewTrackedBuffer(nil) sel.Where.Format(buf) - want = " where a = 1 or b = 1" - if buf.String() != want { - t.Errorf("where: %q, want %s", buf.String(), want) - } + assert.Equal(t, " where a = 1 or b = 1", buf.String()) + sel = &Select{} sel.AddHaving(expr) buf = NewTrackedBuffer(nil) sel.Having.Format(buf) - want = " having a = 1 or b = 1" - if buf.String() != want { - t.Errorf("having: %q, want %s", buf.String(), want) - } + assert.Equal(t, " having a = 1 or b = 1", buf.String()) + } func TestUpdate(t *testing.T) { diff --git a/go/vt/vtgate/planbuilder/operator_to_query.go b/go/vt/vtgate/planbuilder/operator_to_query.go index 87dec2d8526..1e2d4ff54c4 100644 --- a/go/vt/vtgate/planbuilder/operator_to_query.go +++ b/go/vt/vtgate/planbuilder/operator_to_query.go @@ -89,7 +89,7 @@ func buildQuery(op abstract.PhysicalOperator, qb *queryBuilder) { sel.Limit = opQuery.Limit sel.OrderBy = opQuery.OrderBy sel.GroupBy = opQuery.GroupBy - sel.Having = opQuery.Having + sel.Having = mergeHaving(sel.Having, opQuery.Having) sel.SelectExprs = opQuery.SelectExprs qb.addTableExpr(op.Alias, op.Alias, op.TableID(), &sqlparser.DerivedTable{ Select: sel, @@ -161,12 +161,16 @@ func (qb *queryBuilder) addPredicate(expr sqlparser.Expr) { } sel := qb.sel.(*sqlparser.Select) - if sel.Where == nil { - sel.AddWhere(expr) - return + _, isSubQuery := expr.(*sqlparser.ExtractedSubquery) + var addPred func(sqlparser.Expr) + + if sqlparser.ContainsAggregation(expr) && !isSubQuery { + addPred = sel.AddHaving + } else { + addPred = sel.AddWhere } for _, exp := range sqlparser.SplitAndExpression(nil, expr) { - sel.AddWhere(exp) + addPred(exp) } } @@ -288,3 +292,17 @@ func (ts *tableSorter) Less(i, j int) bool { func (ts *tableSorter) Swap(i, j int) { ts.sel.From[i], ts.sel.From[j] = ts.sel.From[j], ts.sel.From[i] } + +func mergeHaving(h1, h2 *sqlparser.Where) *sqlparser.Where { + switch { + case h1 == nil && h2 == nil: + return nil + case h1 == nil: + return h2 + case h2 == nil: + return h1 + default: + h1.Expr = sqlparser.AndExpressions(h1.Expr, h2.Expr) + return h1 + } +} diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index 1041fadba1d..d5b46f3eb12 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -4996,5 +4996,42 @@ "user.user" ] } + }, + { + "comment": "when pushing predicates into derived tables, make sure to put them in HAVING when they contain aggregations", + "query": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as count from user_extra where localDate > :v1 group by user_id, flowId order by null) as t1 where count >= :v2", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as count from user_extra where localDate > :v1 group by user_id, flowId order by null) as t1 where count >= :v2", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as `count` from user_extra where 1 != 1 group by user_id, flowId) as t1 where 1 != 1", + "Query": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as `count` from user_extra where localDate > :v1 group by user_id, flowId order by null) as t1 where `count` >= :v2", + "Table": "user_extra" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as count from user_extra where localDate > :v1 group by user_id, flowId order by null) as t1 where count >= :v2", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as `count` from user_extra where 1 != 1 group by user_id, flowId) as t1 where 1 != 1", + "Query": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as `count` from user_extra where localDate > :v1 group by user_id, flowId having count(*) >= :v2 order by null) as t1", + "Table": "user_extra" + }, + "TablesUsed": [ + "user.user_extra" + ] + } } ] \ No newline at end of file From b632186a2da812d2dfdc5205bc5969ea8d560076 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Fri, 24 Mar 2023 10:42:02 +0200 Subject: [PATCH 44/53] [release-15.0] Auto upgrade the Golang version (#12585) (#12708) * Auto upgrade the Golang version (#12585) * initial addition of the go_upgrade tool to detect and bump the golang version Signed-off-by: Florent Poinsard * update go.mod automatically Signed-off-by: Florent Poinsard * fix isSameMajor version issue Signed-off-by: Florent Poinsard * update the bootstrap version automatically Signed-off-by: Florent Poinsard * update the bootstrap docker image changelog Signed-off-by: Florent Poinsard * uncomment code Signed-off-by: Florent Poinsard * addition of workflow Signed-off-by: Florent Poinsard * addition of base to create-pull-request Signed-off-by: Florent Poinsard * test create PR alternative Signed-off-by: Florent Poinsard * add flags and getter methods Signed-off-by: Florent Poinsard * better PR message Signed-off-by: Florent Poinsard * fix no-workflow-update flag and better PR body msg Signed-off-by: Florent Poinsard * fix PR title, branch and body format Signed-off-by: Florent Poinsard * test matrix and pwd path Signed-off-by: Florent Poinsard * enhanced matrix Signed-off-by: Florent Poinsard * update_workflows option Signed-off-by: Florent Poinsard * update workflows independently Signed-off-by: Florent Poinsard * test without matrix Signed-off-by: Florent Poinsard * Add docs to go_upgrade and re-add matrix to the workflow Signed-off-by: Florent Poinsard * support major version upgrade Signed-off-by: Florent Poinsard * do not update bootstrap version if they are the same Signed-off-by: Florent Poinsard * migrate to cobra instead of pflags Signed-off-by: Florent Poinsard * remove redundant comment Signed-off-by: Florent Poinsard * safety net around replaceGoVersionInCodebase to avoid unrequired upgrade Signed-off-by: Florent Poinsard * Remove double negation in workflowUpdate flag Signed-off-by: Florent Poinsard * Use regexp instead of mere string comparison Signed-off-by: Florent Poinsard * Proper regexp for every string comparison Signed-off-by: Florent Poinsard * use better regex Signed-off-by: Florent Poinsard * remove useless flag and improve the auto-PR body description Signed-off-by: Florent Poinsard * add note in the tool usage to run the tool at the root of the repo Signed-off-by: Florent Poinsard * add comment in .github/workflows/update_golang_version.yml Signed-off-by: Florent Poinsard * Apply @mattlord code suggestion Signed-off-by: Florent Poinsard * replace usages of old filename Signed-off-by: Florent Poinsard * Apply suggestions from code review Co-authored-by: Matt Lord Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --------- Signed-off-by: Florent Poinsard Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Co-authored-by: Matt Lord * Fix regexp Signed-off-by: Florent Poinsard * remove the use of DateOnly Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Co-authored-by: Matt Lord --- .github/workflows/update_golang_version.yml | 74 +++ go.mod | 1 + go.sum | 2 + go/tools/go-upgrade/go-upgrade.go | 504 ++++++++++++++++++++ 4 files changed, 581 insertions(+) create mode 100644 .github/workflows/update_golang_version.yml create mode 100644 go/tools/go-upgrade/go-upgrade.go diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml new file mode 100644 index 00000000000..62f917adfd7 --- /dev/null +++ b/.github/workflows/update_golang_version.yml @@ -0,0 +1,74 @@ +name: Update Golang Version + +on: + schedule: + - cron: "0 0 * * *" # Runs every day at midnight UTC + workflow_dispatch: + +jobs: + update_golang_version: + strategy: + matrix: + branch: [ main, release-16.0, release-15.0, release-14.0 ] + name: Update Golang Version + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.20.2 + + - name: Check out code + uses: actions/checkout@v3 + with: + ref: ${{ matrix.branch }} + + - name: Detect new version and update codebase + id: detect-and-update + run: | + old_go_version=$(go run ./go/tools/go-upgrade/go-upgrade.go get go-version) + echo "old-go-version=${old_go_version}" >> $GITHUB_OUTPUT + + if [ ${{ matrix.branch }} == "main" ]; then + go run ./go/tools/go-upgrade/go-upgrade.go upgrade --workflow-update=false --main --allow-major-upgrade + else + go run ./go/tools/go-upgrade/go-upgrade.go upgrade --workflow-update=false + fi + + output=$(git status -s) + if [ -z "${output}" ]; then + exit 0 + fi + echo "create-pr=true" >> $GITHUB_OUTPUT + + go_version=$(go run ./go/tools/go-upgrade/go-upgrade.go get go-version) + bootstrap_version=$(go run ./go/tools/go-upgrade/go-upgrade.go get bootstrap-version) + echo "go-version=${go_version}" >> $GITHUB_OUTPUT + echo "bootstrap-version=${bootstrap_version}" >> $GITHUB_OUTPUT + + - name: Create Pull Request + if: steps.detect-and-update.outputs.create-pr == 'true' + uses: peter-evans/create-pull-request@v4 + with: + branch: "upgrade-go-to-${{steps.detect-and-update.outputs.go-version}}-on-${{ matrix.branch }}" + commit-message: "bump go version to go${{steps.detect-and-update.outputs.go-version}}" + signoff: true + delete-branch: true + title: "[${{ matrix.branch }}] Upgrade the Golang version to `go${{steps.detect-and-update.outputs.go-version}}`" + body: | + This Pull Request bumps the Golang version to `go${{steps.detect-and-update.outputs.go-version}}` and the bootstrap version to `${{steps.detect-and-update.outputs.bootstrap-version}}`. + + > Do not trust the bot blindly. A thorough code review must be done to ensure all the files have been correctly modified. + + There are a few manual steps remaining: + - [ ] Make sure you update the Golang version used in the previous and next release branches for the Upgrade/Downgrade tests. + - [ ] Build and Push the bootstrap images to Docker Hub, the bot cannot handle that. + - [ ] Update the `./.github/workflows/*.yml` files with the newer Golang version, the bot cannot handle that due to permissions. + - To accomplish this, run the following: `go run ./go/tools/go-upgrade/go-upgrade.go upgrade workflows --go-to=${{steps.detect-and-update.outputs.go-version}}` + base: ${{ matrix.branch }} + labels: | + Skip CI + go + Benchmark me + Component: General + Type: CI/Build diff --git a/go.mod b/go.mod index 799edc6be66..6ae8e1d6d45 100644 --- a/go.mod +++ b/go.mod @@ -117,6 +117,7 @@ require ( require ( github.com/bndr/gotabulate v1.1.2 + github.com/hashicorp/go-version v1.6.0 modernc.org/sqlite v1.20.3 ) diff --git a/go.sum b/go.sum index ae1bf014370..4771e29c54f 100644 --- a/go.sum +++ b/go.sum @@ -426,6 +426,8 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= diff --git a/go/tools/go-upgrade/go-upgrade.go b/go/tools/go-upgrade/go-upgrade.go new file mode 100644 index 00000000000..4083a7a8e30 --- /dev/null +++ b/go/tools/go-upgrade/go-upgrade.go @@ -0,0 +1,504 @@ +/* +Copyright 2023 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "io" + "log" + "net/http" + "os" + "path" + "regexp" + "strconv" + "strings" + "time" + + "encoding/json" + + "github.com/hashicorp/go-version" + "github.com/spf13/cobra" +) + +const ( + goDevAPI = "https://go.dev/dl/?mode=json" +) + +type latestGolangRelease struct { + Version string `json:"version"` + Stable bool `json:"stable"` +} + +var ( + workflowUpdate = true + allowMajorUpgrade = false + isMainBranch = false + goTo = "" + + rootCmd = &cobra.Command{ + Use: "go-upgrade", + Short: "Automates the Golang upgrade.", + Long: `go-upgrade allows us to automate some tasks required to bump the version of Golang used throughout our codebase. + +It mostly used by the update_golang_version.yml CI workflow that runs on a CRON. + +This tool is meant to be run at the root of the repository. +`, + Run: func(cmd *cobra.Command, args []string) { + _ = cmd.Help() + }, + Args: cobra.NoArgs, + } + + getCmd = &cobra.Command{ + Use: "get", + Short: "Command to get useful information about the codebase.", + Long: "Command to get useful information about the codebase.", + Run: func(cmd *cobra.Command, args []string) { + _ = cmd.Help() + }, + Args: cobra.NoArgs, + } + + getGoCmd = &cobra.Command{ + Use: "go-version", + Short: "go-version prints the Golang version used by the current codebase.", + Long: "go-version prints the Golang version used by the current codebase.", + Run: runGetGoCmd, + Args: cobra.NoArgs, + } + + getBootstrapCmd = &cobra.Command{ + Use: "bootstrap-version", + Short: "bootstrap-version prints the Docker Bootstrap version used by the current codebase.", + Long: "bootstrap-version prints the Docker Bootstrap version used by the current codebase.", + Run: runGetBootstrapCmd, + Args: cobra.NoArgs, + } + + upgradeCmd = &cobra.Command{ + Use: "upgrade", + Short: "upgrade will upgrade the Golang and Bootstrap versions of the codebase to the latest available version.", + Long: `This command bumps the Golang and Bootstrap versions of the codebase. + +The latest available version of Golang will be fetched and used instead of the old version. + +By default, we do not allow major Golang version upgrade such as 1.20 to 1.21 but this can be overridden using the +--allow-major-upgrade CLI flag. Usually, we only allow such upgrade on the main branch of the repository. + +In CI, particularly, we do not want to modify the workflow files before automatically creating a Pull Request to +avoid permission issues. The rewrite of workflow files can be disabled using the --workflow-update=false CLI flag. + +Moreover, this command automatically bumps the bootstrap version of our codebase. If we are on the main branch, we +want to use the CLI flag --main to remember to increment the bootstrap version by 1 instead of 0.1.`, + Run: runUpgradeCmd, + Args: cobra.NoArgs, + } + + upgradeWorkflowsCmd = &cobra.Command{ + Use: "workflows", + Short: "workflows will upgrade the Golang version used in our CI workflows files.", + Long: "This step is omitted by the bot since. We let the maintainers of Vitess manually upgrade the version used by the workflows using this command.", + Run: runUpgradeWorkflowsCmd, + Args: cobra.NoArgs, + } +) + +func init() { + rootCmd.AddCommand(getCmd) + rootCmd.AddCommand(upgradeCmd) + + getCmd.AddCommand(getGoCmd) + getCmd.AddCommand(getBootstrapCmd) + + upgradeCmd.AddCommand(upgradeWorkflowsCmd) + + upgradeCmd.Flags().BoolVar(&workflowUpdate, "workflow-update", workflowUpdate, "Whether or not the workflow files should be updated. Useful when using this script to auto-create PRs.") + upgradeCmd.Flags().BoolVar(&allowMajorUpgrade, "allow-major-upgrade", allowMajorUpgrade, "Defines if Golang major version upgrade are allowed.") + upgradeCmd.Flags().BoolVar(&isMainBranch, "main", isMainBranch, "Defines if the current branch is the main branch.") + + upgradeWorkflowsCmd.Flags().StringVar(&goTo, "go-to", goTo, "The Golang version we want to upgrade to.") +} + +func main() { + cobra.CheckErr(rootCmd.Execute()) +} + +func runGetGoCmd(_ *cobra.Command, _ []string) { + currentVersion, err := currentGolangVersion() + if err != nil { + log.Fatal(err) + } + fmt.Println(currentVersion.String()) +} + +func runGetBootstrapCmd(_ *cobra.Command, _ []string) { + currentVersion, err := currentBootstrapVersion() + if err != nil { + log.Fatal(err) + } + fmt.Println(currentVersion) +} + +func runUpgradeWorkflowsCmd(_ *cobra.Command, _ []string) { + err := updateWorkflowFilesOnly(goTo) + if err != nil { + log.Fatal(err) + } +} + +func runUpgradeCmd(_ *cobra.Command, _ []string) { + err := upgradePath(allowMajorUpgrade, workflowUpdate, isMainBranch) + if err != nil { + log.Fatal(err) + } +} + +func updateWorkflowFilesOnly(goTo string) error { + newV, err := version.NewVersion(goTo) + if err != nil { + return err + } + filesToChange, err := getListOfFilesInPaths([]string{"./.github/workflows"}) + if err != nil { + return err + } + + for _, fileToChange := range filesToChange { + err = replaceInFile( + []*regexp.Regexp{regexp.MustCompile(`go-version:[[:space:]]*([0-9.]+).*`)}, + []string{"go-version: " + newV.String()}, + fileToChange, + ) + if err != nil { + return err + } + } + return nil +} + +func upgradePath(allowMajorUpgrade, workflowUpdate, isMainBranch bool) error { + currentVersion, err := currentGolangVersion() + if err != nil { + return err + } + + availableVersions, err := getLatestStableGolangReleases() + if err != nil { + return err + } + + upgradeTo := chooseNewVersion(currentVersion, availableVersions, allowMajorUpgrade) + if upgradeTo == nil { + return nil + } + + err = replaceGoVersionInCodebase(currentVersion, upgradeTo, workflowUpdate) + if err != nil { + return err + } + + currentBootstrapVersionF, err := currentBootstrapVersion() + if err != nil { + return err + } + nextBootstrapVersionF := currentBootstrapVersionF + if isMainBranch { + nextBootstrapVersionF += 1 + } else { + nextBootstrapVersionF += 0.1 + } + err = updateBootstrapVersionInCodebase(currentBootstrapVersionF, nextBootstrapVersionF, upgradeTo) + if err != nil { + return err + } + return nil +} + +// currentGolangVersion gets the running version of Golang in Vitess +// and returns it as a *version.Version. +// +// The file `./build.env` describes which version of Golang is expected by Vitess. +// We use this file to detect the current Golang version of our codebase. +// The file contains `goversion_min x.xx.xx`, we will grep `goversion_min` to finally find +// the precise golang version we're using. +func currentGolangVersion() (*version.Version, error) { + contentRaw, err := os.ReadFile("build.env") + if err != nil { + return nil, err + } + content := string(contentRaw) + + versre := regexp.MustCompile("(?i).*goversion_min[[:space:]]*([0-9.]+).*") + versionStr := versre.FindStringSubmatch(content) + if len(versionStr) != 2 { + return nil, fmt.Errorf("malformatted error, got: %v", versionStr) + } + return version.NewVersion(versionStr[1]) +} + +func currentBootstrapVersion() (float64, error) { + contentRaw, err := os.ReadFile("Makefile") + if err != nil { + return 0, err + } + content := string(contentRaw) + + versre := regexp.MustCompile("(?i).*BOOTSTRAP_VERSION[[:space:]]*=[[:space:]]*([0-9.]+).*") + versionStr := versre.FindStringSubmatch(content) + if len(versionStr) != 2 { + return 0, fmt.Errorf("malformatted error, got: %v", versionStr) + } + f, err := strconv.ParseFloat(versionStr[1], 64) + if err != nil { + return 0, err + } + return f, nil +} + +// getLatestStableGolangReleases fetches the latest stable releases of Golang from +// the official website using the goDevAPI URL. +// Once fetched, the releases are returned as version.Collection. +func getLatestStableGolangReleases() (version.Collection, error) { + resp, err := http.Get(goDevAPI) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var latestGoReleases []latestGolangRelease + err = json.Unmarshal(body, &latestGoReleases) + if err != nil { + return nil, err + } + + var versions version.Collection + for _, release := range latestGoReleases { + if !release.Stable { + continue + } + if !strings.HasPrefix(release.Version, "go") { + return nil, fmt.Errorf("golang version malformatted: %s", release.Version) + } + newVersion, err := version.NewVersion(release.Version[2:]) + if err != nil { + return nil, err + } + versions = append(versions, newVersion) + } + return versions, nil +} + +// chooseNewVersion decides what will be the next version we're going to use in our codebase. +// Given the current Golang version, the available latest versions and whether we allow major upgrade or not, +// chooseNewVersion will return either the new version or nil if we cannot/don't need to upgrade. +func chooseNewVersion(curVersion *version.Version, latestVersions version.Collection, allowMajorUpgrade bool) *version.Version { + selectedVersion := curVersion + for _, latestVersion := range latestVersions { + if !allowMajorUpgrade && !isSameMajorMinorVersion(latestVersion, selectedVersion) { + continue + } + if latestVersion.GreaterThan(selectedVersion) { + selectedVersion = latestVersion + } + } + // No change detected, return nil meaning that we do not want to have a new Golang version. + if selectedVersion.Equal(curVersion) { + return nil + } + return selectedVersion +} + +// replaceGoVersionInCodebase goes through all the files in the codebase where the +// Golang version must be updated +func replaceGoVersionInCodebase(old, new *version.Version, workflowUpdate bool) error { + if old.Equal(new) { + return nil + } + explore := []string{ + "./test/templates", + "./build.env", + "./docker/bootstrap/Dockerfile.common", + } + if workflowUpdate { + explore = append(explore, "./.github/workflows") + } + filesToChange, err := getListOfFilesInPaths(explore) + if err != nil { + return err + } + + for _, fileToChange := range filesToChange { + err = replaceInFile( + []*regexp.Regexp{regexp.MustCompile(fmt.Sprintf(`(%s)`, old.String()))}, + []string{new.String()}, + fileToChange, + ) + if err != nil { + return err + } + } + + if !isSameMajorMinorVersion(old, new) { + err = replaceInFile( + []*regexp.Regexp{regexp.MustCompile(`go[[:space:]]*([0-9.]+)`)}, + []string{fmt.Sprintf("go %d.%d", new.Segments()[0], new.Segments()[1])}, + "./go.mod", + ) + if err != nil { + return err + } + } + return nil +} + +func updateBootstrapVersionInCodebase(old, new float64, newGoVersion *version.Version) error { + if old == new { + return nil + } + files, err := getListOfFilesInPaths([]string{ + "./docker/base", + "./docker/lite", + "./docker/local", + "./docker/vttestserver", + "./Makefile", + "./test/templates", + }) + if err != nil { + return err + } + + for _, file := range files { + err = replaceInFile( + []*regexp.Regexp{ + regexp.MustCompile(`ARG[[:space:]]*bootstrap_version[[:space:]]*=[[:space:]]*[0-9.]+`), // Dockerfile + regexp.MustCompile(`BOOTSTRAP_VERSION[[:space:]]*=[[:space:]]*[0-9.]+`), // Makefile + }, + []string{ + fmt.Sprintf("ARG bootstrap_version=%-1g", new), // Dockerfile + fmt.Sprintf("BOOTSTRAP_VERSION=%-1g", new), // Makefile + }, + file, + ) + if err != nil { + return err + } + } + + err = replaceInFile( + []*regexp.Regexp{regexp.MustCompile(`\"bootstrap-version\",[[:space:]]*\"([0-9.]+)\"`)}, + []string{fmt.Sprintf("\"bootstrap-version\", \"%-1g\"", new)}, + "./test.go", + ) + if err != nil { + return err + } + + err = updateBootstrapChangelog(new, newGoVersion) + if err != nil { + return err + } + + return nil +} + +func updateBootstrapChangelog(new float64, goVersion *version.Version) error { + file, err := os.OpenFile("./docker/bootstrap/CHANGELOG.md", os.O_RDWR, 0600) + if err != nil { + return err + } + defer file.Close() + + s, err := file.Stat() + if err != nil { + return err + } + newContent := fmt.Sprintf(` + +## [%-1g] - %s +### Changes +- Update build to golang %s`, new, time.Now().Format("2006-01-02"), goVersion.String()) + + _, err = file.WriteAt([]byte(newContent), s.Size()) + if err != nil { + return err + } + return nil +} + +func isSameMajorMinorVersion(a, b *version.Version) bool { + return a.Segments()[0] == b.Segments()[0] && a.Segments()[1] == b.Segments()[1] +} + +func getListOfFilesInPaths(pathsToExplore []string) ([]string, error) { + var filesToChange []string + for _, pathToExplore := range pathsToExplore { + stat, err := os.Stat(pathToExplore) + if err != nil { + return nil, err + } + if stat.IsDir() { + dirEntries, err := os.ReadDir(pathToExplore) + if err != nil { + return nil, err + } + for _, entry := range dirEntries { + if entry.IsDir() { + continue + } + filesToChange = append(filesToChange, path.Join(pathToExplore, entry.Name())) + } + } else { + filesToChange = append(filesToChange, pathToExplore) + } + } + return filesToChange, nil +} + +// replaceInFile replaces old with new in the given file. +func replaceInFile(oldexps []*regexp.Regexp, new []string, fileToChange string) error { + if len(oldexps) != len(new) { + panic("old and new should be of the same length") + } + + f, err := os.OpenFile(fileToChange, os.O_RDWR, 0600) + if err != nil { + return err + } + defer f.Close() + + content, err := io.ReadAll(f) + if err != nil { + return err + } + contentStr := string(content) + + for i, oldex := range oldexps { + contentStr = oldex.ReplaceAllString(contentStr, new[i]) + } + + _, err = f.WriteAt([]byte(contentStr), 0) + if err != nil { + return err + } + return nil +} From 6998097494e56ea76be1a5a68dcb894ed4ebbc8a Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:25:23 +0200 Subject: [PATCH 45/53] [release-15.0] VReplication Last Error: retry error if it happens after timeout (#12114) (#12302) * Retry error if it happens after timeout Signed-off-by: Rohit Nayak * Address review comments Signed-off-by: Rohit Nayak * Address review comments Signed-off-by: Rohit Nayak * Improve unit tests Signed-off-by: Rohit Nayak --------- Signed-off-by: Rohit Nayak Co-authored-by: Rohit Nayak --- .../tabletmanager/vreplication/controller.go | 14 ++-- .../tabletmanager/vreplication/last_error.go | 18 +++- .../vreplication/last_error_test.go | 83 +++++++++++++------ 3 files changed, 80 insertions(+), 35 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/vreplication/controller.go b/go/vt/vttablet/tabletmanager/vreplication/controller.go index 7425427ac53..60c478a078c 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/controller.go +++ b/go/vt/vttablet/tabletmanager/vreplication/controller.go @@ -72,13 +72,12 @@ func newController(ctx context.Context, params map[string]string, dbClientFactor } ct := &controller{ - vre: vre, - dbClientFactory: dbClientFactory, - mysqld: mysqld, - blpStats: blpStats, - done: make(chan struct{}), - source: &binlogdatapb.BinlogSource{}, - lastWorkflowError: newLastError("VReplication Controller", maxTimeToRetryError), + vre: vre, + dbClientFactory: dbClientFactory, + mysqld: mysqld, + blpStats: blpStats, + done: make(chan struct{}), + source: &binlogdatapb.BinlogSource{}, } log.Infof("creating controller with cell: %v, tabletTypes: %v, and params: %v", cell, tabletTypesStr, params) @@ -89,6 +88,7 @@ func newController(ctx context.Context, params map[string]string, dbClientFactor } ct.id = uint32(id) ct.workflow = params["workflow"] + ct.lastWorkflowError = newLastError(fmt.Sprintf("VReplication controller %d for workflow %q", ct.id, ct.workflow), maxTimeToRetryError) state := params["state"] blpStats.State.Set(state) diff --git a/go/vt/vttablet/tabletmanager/vreplication/last_error.go b/go/vt/vttablet/tabletmanager/vreplication/last_error.go index e3a73d5b062..5d51fc44f06 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/last_error.go +++ b/go/vt/vttablet/tabletmanager/vreplication/last_error.go @@ -26,18 +26,20 @@ import ( /* * lastError tracks the most recent error for any ongoing process and how long it has persisted. - * The err field should be a vterror so as to ensure we have meaningful error codes, causes, stack + * The err field should be a vterror to ensure we have meaningful error codes, causes, stack * traces, etc. */ type lastError struct { name string err error firstSeen time.Time + lastSeen time.Time mu sync.Mutex maxTimeInError time.Duration // if error persists for this long, shouldRetry() will return false } func newLastError(name string, maxTimeInError time.Duration) *lastError { + log.Infof("Created last error: %s, with maxTimeInError: %s", name, maxTimeInError) return &lastError{ name: name, maxTimeInError: maxTimeInError, @@ -48,15 +50,27 @@ func (le *lastError) record(err error) { le.mu.Lock() defer le.mu.Unlock() if err == nil { + log.Infof("Resetting last error: %s", le.name) le.err = nil le.firstSeen = time.Time{} + le.lastSeen = time.Time{} return } if !vterrors.Equals(err, le.err) { + log.Infof("Got new last error %+v for %s, was %+v", err, le.name, le.err) le.firstSeen = time.Now() + le.lastSeen = time.Now() le.err = err + } else { + // same error seen + log.Infof("Got the same last error for %q: %+v ; first seen at %s and last seen %dms ago", le.name, le.err, le.firstSeen, int(time.Since(le.lastSeen).Milliseconds())) + if time.Since(le.lastSeen) > le.maxTimeInError { + // reset firstSeen, since it has been long enough since the last time we saw this error + log.Infof("Resetting firstSeen for %s, since it is too long since the last one", le.name) + le.firstSeen = time.Now() + } + le.lastSeen = time.Now() } - // The error is unchanged so we don't need to do anything } func (le *lastError) shouldRetry() bool { diff --git a/go/vt/vttablet/tabletmanager/vreplication/last_error_test.go b/go/vt/vttablet/tabletmanager/vreplication/last_error_test.go index 8d0e353478a..08eaa67f3be 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/last_error_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/last_error_test.go @@ -24,32 +24,63 @@ import ( "github.com/stretchr/testify/require" ) -func TestLastError(t *testing.T) { - le := newLastError("test", 100*time.Millisecond) +const shortWait = 1 * time.Millisecond +const longWait = 150 * time.Millisecond +const maxTimeInError = 100 * time.Millisecond - t.Run("long running error", func(t *testing.T) { - err1 := fmt.Errorf("test1") +// TestLastErrorZeroMaxTime tests maxTimeInError = 0, should always retry +func TestLastErrorZeroMaxTime(t *testing.T) { + le := newLastError("test", 0) + err1 := fmt.Errorf("error1") + le.record(err1) + require.True(t, le.shouldRetry()) + time.Sleep(shortWait) + require.True(t, le.shouldRetry()) + time.Sleep(longWait) + require.True(t, le.shouldRetry()) +} + +// TestLastErrorNoError ensures that an uninitialized lastError always retries +func TestLastErrorNoError(t *testing.T) { + le := newLastError("test", maxTimeInError) + require.True(t, le.shouldRetry()) + err1 := fmt.Errorf("error1") + le.record(err1) + require.True(t, le.shouldRetry()) + le.record(nil) + require.True(t, le.shouldRetry()) +} + +// TestLastErrorOneError validates that we retry an error if happening within the maxTimeInError, but not after +func TestLastErrorOneError(t *testing.T) { + le := newLastError("test", maxTimeInError) + err1 := fmt.Errorf("error1") + le.record(err1) + require.True(t, le.shouldRetry()) + time.Sleep(shortWait) + require.True(t, le.shouldRetry()) + time.Sleep(shortWait) + require.True(t, le.shouldRetry()) + time.Sleep(longWait) + require.False(t, le.shouldRetry()) +} + +// TestLastErrorRepeatedError confirms that if same error is repeated we don't retry +// unless it happens after maxTimeInError +func TestLastErrorRepeatedError(t *testing.T) { + le := newLastError("test", maxTimeInError) + err1 := fmt.Errorf("error1") + le.record(err1) + require.True(t, le.shouldRetry()) + for i := 1; i < 10; i++ { le.record(err1) - require.True(t, le.shouldRetry()) - time.Sleep(150 * time.Millisecond) - require.False(t, le.shouldRetry()) - }) - - t.Run("new long running error", func(t *testing.T) { - err2 := fmt.Errorf("test2") - le.record(err2) - require.True(t, le.shouldRetry()) - for i := 1; i < 10; i++ { - le.record(err2) - } - require.True(t, le.shouldRetry()) - time.Sleep(150 * time.Millisecond) - le.record(err2) - require.False(t, le.shouldRetry()) - }) - - t.Run("no error", func(t *testing.T) { - le.record(nil) - require.True(t, le.shouldRetry()) - }) + time.Sleep(shortWait) + } + require.True(t, le.shouldRetry()) + + // same error happens after maxTimeInError, so it should retry + time.Sleep(longWait) + require.False(t, le.shouldRetry()) + le.record(err1) + require.True(t, le.shouldRetry()) } From cf41ae7edf046f8093aabe34ca0009974b7d18e0 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 13:49:35 +0200 Subject: [PATCH 46/53] properly escape sequence table names (#12598) Signed-off-by: Hormoz Kheradmand Co-authored-by: Hormoz Kheradmand --- go/vt/topotools/vschema_ddl.go | 9 +-------- go/vt/vtgate/executor_vschema_ddl_test.go | 4 ++-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/go/vt/topotools/vschema_ddl.go b/go/vt/topotools/vschema_ddl.go index 30cce3bd5db..e8da2734b4f 100644 --- a/go/vt/topotools/vschema_ddl.go +++ b/go/vt/topotools/vschema_ddl.go @@ -17,7 +17,6 @@ limitations under the License. package topotools import ( - "fmt" "reflect" "vitess.io/vitess/go/vt/sqlparser" @@ -226,15 +225,9 @@ func ApplyVSchemaDDL(ksName string, ks *vschemapb.Keyspace, alterVschema *sqlpar return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "vschema already contains auto inc %v on table %s in keyspace %s", table.AutoIncrement, name, ksName) } - sequence := alterVschema.AutoIncSpec.Sequence - sequenceFqn := sequence.Name.String() - if sequence.Qualifier.String() != "" { - sequenceFqn = fmt.Sprintf("%s.%s", sequence.Qualifier.String(), sequenceFqn) - } - table.AutoIncrement = &vschemapb.AutoIncrement{ Column: alterVschema.AutoIncSpec.Column.String(), - Sequence: sequenceFqn, + Sequence: sqlparser.String(alterVschema.AutoIncSpec.Sequence), } return ks, nil diff --git a/go/vt/vtgate/executor_vschema_ddl_test.go b/go/vt/vtgate/executor_vschema_ddl_test.go index a1b387e2ad5..f6aa8d70572 100644 --- a/go/vt/vtgate/executor_vschema_ddl_test.go +++ b/go/vt/vtgate/executor_vschema_ddl_test.go @@ -373,13 +373,13 @@ func TestExecutorAddSequenceDDL(t *testing.T) { } time.Sleep(10 * time.Millisecond) - stmt = "alter vschema on test_table add auto_increment id using test_seq" + stmt = "alter vschema on test_table add auto_increment id using `db-name`.`test_seq`" if _, err = executor.Execute(context.Background(), "TestExecute", session, stmt, nil); err != nil { t.Error(err) } time.Sleep(10 * time.Millisecond) - wantAutoInc := &vschemapb.AutoIncrement{Column: "id", Sequence: "test_seq"} + wantAutoInc := &vschemapb.AutoIncrement{Column: "id", Sequence: "`db-name`.test_seq"} gotAutoInc := executor.vm.GetCurrentSrvVschema().Keyspaces[ksSharded].Tables["test_table"].AutoIncrement if !reflect.DeepEqual(wantAutoInc, gotAutoInc) { From ca73cabc446fcd04620735be7a5a14fe7d608e07 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Mon, 27 Mar 2023 14:50:06 +0300 Subject: [PATCH 47/53] Online DDL: ensure requested_timestamp isn't zero, before initializing table schema (#12263) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/vttablet/onlineddl/schema.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index 3022b3736bc..cbae743ac7f 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -393,6 +393,12 @@ const ( AND cleanup_timestamp IS NULL AND completed_timestamp IS NULL ` + sqlFixRequestedTimestamp = `UPDATE _vt.schema_migrations + SET + requested_timestamp = added_timestamp + WHERE + requested_timestamp < added_timestamp; + ` sqlSelectMigration = `SELECT id, migration_uuid, @@ -612,6 +618,13 @@ var ( var ApplyDDL = []string{ sqlCreateSidecarDB, sqlCreateSchemaMigrationsTable, + // Fixing a historical issue: past values of requested_timestamp could be '0000-00-00 00:00:00'. + // In turn, those cause `ERROR 1292 (22007): Incorrect datetime value` when attempting to + // make any DDL on the table. + // We trust added_timestamp to be non-zero (it defaults CURRENT_TIMESTAMP and never modified), + // and so we set requested_timestamp to that value. + // The query makes a full table scan, because neither column is indexed. + sqlFixRequestedTimestamp, // end of fix alterSchemaMigrationsTableRetries, alterSchemaMigrationsTableTablet, alterSchemaMigrationsTableArtifacts, From ddeabc7598f8e73c1014469e4dc77eb0309025ea Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 27 Mar 2023 13:50:51 +0200 Subject: [PATCH 48/53] [planner fix] make unknown column an error only for sharded queries (#12704) (#12726) Signed-off-by: Andres Taylor --- .../planbuilder/testdata/from_cases.json | 84 ++++++++++++++++++- .../testdata/systemtables_cases80.json | 6 +- .../planbuilder/testdata/union_cases.json | 37 ++++++++ go/vt/vtgate/semantics/analyzer.go | 12 +-- go/vt/vtgate/semantics/analyzer_test.go | 69 ++++++++++----- go/vt/vtgate/semantics/binder.go | 2 +- 6 files changed, 176 insertions(+), 34 deletions(-) diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index bfef302f982..49b0cf5a3da 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -4588,7 +4588,25 @@ { "comment": "verify ',' vs JOIN precedence", "query": "select u1.a from unsharded u1, unsharded u2 join unsharded u3 on u1.a = u2.a", - "plan": "symbol u1.a not found" + "v3-plan": "symbol u1.a not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select u1.a from unsharded u1, unsharded u2 join unsharded u3 on u1.a = u2.a", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select u1.a from unsharded as u1, unsharded as u2 join unsharded as u3 on u1.a = u2.a where 1 != 1", + "Query": "select u1.a from unsharded as u1, unsharded as u2 join unsharded as u3 on u1.a = u2.a", + "Table": "unsharded" + }, + "TablesUsed": [ + "main.unsharded" + ] + } }, { "comment": "first expression fails for ',' join (code coverage: ensure error is returned)", @@ -4598,7 +4616,25 @@ { "comment": "table names should be case-sensitive", "query": "select unsharded.id from unsharded where Unsharded.val = 1", - "plan": "symbol Unsharded.val not found" + "v3-plan": "symbol Unsharded.val not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select unsharded.id from unsharded where Unsharded.val = 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select unsharded.id from unsharded where 1 != 1", + "Query": "select unsharded.id from unsharded where Unsharded.val = 1", + "Table": "unsharded" + }, + "TablesUsed": [ + "main.unsharded" + ] + } }, { "comment": "implicit table reference for sharded keyspace", @@ -6207,5 +6243,49 @@ "user.user" ] } + }, + { + "comment": "missing and ambiguous column info is OK as long as we can send the query to a single unsharded keyspace", + "query": "select missing_column from unsharded, unsharded_a", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select missing_column from unsharded, unsharded_a", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select missing_column from unsharded, unsharded_a where 1 != 1", + "Query": "select missing_column from unsharded, unsharded_a", + "Table": "unsharded, unsharded_a" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select missing_column from unsharded, unsharded_a", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select missing_column from unsharded, unsharded_a where 1 != 1", + "Query": "select missing_column from unsharded, unsharded_a", + "Table": "unsharded, unsharded_a" + }, + "TablesUsed": [ + "main.unsharded", + "main.unsharded_a" + ] + } + }, + { + "comment": "missing and ambiguous column info is not valid when we have two different unsharded keyspaces in the query", + "query": "select missing_column from unsharded, unsharded_tab", + "v3-plan": "symbol missing_column not found", + "gen4-plan": "Column 'missing_column' in field list is ambiguous" } ] diff --git a/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json index aaaa47879b3..41b30d32151 100644 --- a/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json +++ b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json @@ -37,7 +37,7 @@ "Table": "information_schema.a, information_schema.b" } }, - "gen4-plan": "symbol a.id not found" + "gen4-plan": "symbol b.id not found" }, { "comment": "information schema query that uses table_schema", @@ -382,7 +382,7 @@ ] } }, - "gen4-plan": "symbol KCU.DELETE_RULE not found" + "gen4-plan": "symbol S.TABLE_NAME not found" }, { "comment": "information_schema.routines", @@ -1182,7 +1182,7 @@ "Table": "INFORMATION_SCHEMA.`TABLES`" } }, - "gen4-plan": "symbol other_column not found" + "gen4-plan": "symbol foobar not found" }, { "comment": "expand star with information schema", diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.json b/go/vt/vtgate/planbuilder/testdata/union_cases.json index c527b69de7c..62970b1b2b1 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.json @@ -2342,5 +2342,42 @@ "user.user" ] } + }, + { + "comment": "unknown columns are OK as long as the whole query is unsharded", + "query": "(SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'FAILED' ORDER BY buildNumber DESC LIMIT 1) AS last_failed) UNION ALL (SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'SUCCEEDED' ORDER BY buildNumber DESC LIMIT 1) AS last_succeeded) ORDER BY buildNumber DESC LIMIT 1", + "v3-plan": { + "QueryType": "SELECT", + "Original": "(SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'FAILED' ORDER BY buildNumber DESC LIMIT 1) AS last_failed) UNION ALL (SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'SUCCEEDED' ORDER BY buildNumber DESC LIMIT 1) AS last_succeeded) ORDER BY buildNumber DESC LIMIT 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from (select * from unsharded where 1 != 1) as last_failed where 1 != 1 union all select * from (select * from unsharded where 1 != 1) as last_succeeded where 1 != 1", + "Query": "select * from (select * from unsharded where branchId = 203622 and buildNumber <= 113893 and state = 'FAILED' order by buildNumber desc limit 1) as last_failed union all select * from (select * from unsharded where branchId = 203622 and buildNumber <= 113893 and state = 'SUCCEEDED' order by buildNumber desc limit 1) as last_succeeded order by buildNumber desc limit 1", + "Table": "unsharded" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "(SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'FAILED' ORDER BY buildNumber DESC LIMIT 1) AS last_failed) UNION ALL (SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'SUCCEEDED' ORDER BY buildNumber DESC LIMIT 1) AS last_succeeded) ORDER BY buildNumber DESC LIMIT 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from (select * from unsharded where 1 != 1) as last_failed where 1 != 1 union all select * from (select * from unsharded where 1 != 1) as last_succeeded where 1 != 1", + "Query": "select * from (select * from unsharded where branchId = 203622 and buildNumber <= 113893 and state = 'FAILED' order by buildNumber desc limit 1) as last_failed union all select * from (select * from unsharded where branchId = 203622 and buildNumber <= 113893 and state = 'SUCCEEDED' order by buildNumber desc limit 1) as last_succeeded order by buildNumber desc limit 1", + "Table": "unsharded" + }, + "TablesUsed": [ + "main.unsharded" + ] + } } ] diff --git a/go/vt/vtgate/semantics/analyzer.go b/go/vt/vtgate/semantics/analyzer.go index a0e1ec2eba6..c68952143a3 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -105,7 +105,7 @@ func (a *analyzer) setError(err error) { switch err := err.(type) { case ProjError: a.projErr = err.Inner - case UnshardedError: + case ShardedError: a.unshardedErr = err.Inner default: if a.inProjection > 0 && vterrors.ErrState(err) == vterrors.NonUniqError { @@ -256,11 +256,11 @@ func (a *analyzer) checkForInvalidConstructs(cursor *sqlparser.Cursor) error { switch node := cursor.Node().(type) { case *sqlparser.Update: if len(node.TableExprs) != 1 { - return UnshardedError{Inner: vterrors.New(vtrpcpb.Code_UNIMPLEMENTED, "unsupported: multiple tables in update")} + return ShardedError{Inner: vterrors.New(vtrpcpb.Code_UNIMPLEMENTED, "unsupported: multiple tables in update")} } alias, isAlias := node.TableExprs[0].(*sqlparser.AliasedTableExpr) if !isAlias { - return UnshardedError{Inner: vterrors.New(vtrpcpb.Code_UNIMPLEMENTED, "unsupported: multiple tables in update")} + return ShardedError{Inner: vterrors.New(vtrpcpb.Code_UNIMPLEMENTED, "unsupported: multiple tables in update")} } _, isDerived := alias.Expr.(*sqlparser.DerivedTable) if isDerived { @@ -353,12 +353,12 @@ func (p ProjError) Error() string { return p.Inner.Error() } -// UnshardedError is used to mark an error as something that should only be returned +// ShardedError is used to mark an error as something that should only be returned // if the query is not unsharded -type UnshardedError struct { +type ShardedError struct { Inner error } -func (p UnshardedError) Error() string { +func (p ShardedError) Error() string { return p.Inner.Error() } diff --git a/go/vt/vtgate/semantics/analyzer_test.go b/go/vt/vtgate/semantics/analyzer_test.go index d67a960fd95..07826fd7a9d 100644 --- a/go/vt/vtgate/semantics/analyzer_test.go +++ b/go/vt/vtgate/semantics/analyzer_test.go @@ -124,10 +124,10 @@ func TestBindingSingleTableNegative(t *testing.T) { t.Run(query, func(t *testing.T) { parse, err := sqlparser.Parse(query) require.NoError(t, err) - _, err = Analyze(parse.(sqlparser.SelectStatement), "d", &FakeSI{}) - require.Error(t, err) - require.Contains(t, err.Error(), "symbol") - require.Contains(t, err.Error(), "not found") + st, err := Analyze(parse.(sqlparser.SelectStatement), "d", &FakeSI{}) + require.NoError(t, err) + require.ErrorContains(t, st.NotUnshardedErr, "symbol") + require.ErrorContains(t, st.NotUnshardedErr, "not found") }) } } @@ -144,12 +144,13 @@ func TestBindingSingleAliasedTableNegative(t *testing.T) { t.Run(query, func(t *testing.T) { parse, err := sqlparser.Parse(query) require.NoError(t, err) - _, err = Analyze(parse.(sqlparser.SelectStatement), "", &FakeSI{ + st, err := Analyze(parse.(sqlparser.SelectStatement), "", &FakeSI{ Tables: map[string]*vindexes.Table{ "t": {Name: sqlparser.NewIdentifierCS("t")}, }, }) - require.Error(t, err) + require.NoError(t, err) + require.Error(t, st.NotUnshardedErr) }) } } @@ -310,9 +311,9 @@ func TestMissingTable(t *testing.T) { for _, query := range queries { t.Run(query, func(t *testing.T) { parse, _ := sqlparser.Parse(query) - _, err := Analyze(parse.(sqlparser.SelectStatement), "", &FakeSI{}) - require.Error(t, err) - require.Contains(t, err.Error(), "symbol t.col not found") + st, err := Analyze(parse.(sqlparser.SelectStatement), "", &FakeSI{}) + require.NoError(t, err) + require.ErrorContains(t, st.NotUnshardedErr, "symbol t.col not found") }) } } @@ -470,16 +471,13 @@ func TestScoping(t *testing.T) { t.Run(query.query, func(t *testing.T) { parse, err := sqlparser.Parse(query.query) require.NoError(t, err) - _, err = Analyze(parse.(sqlparser.SelectStatement), "user", &FakeSI{ + st, err := Analyze(parse.(sqlparser.SelectStatement), "user", &FakeSI{ Tables: map[string]*vindexes.Table{ "t": {Name: sqlparser.NewIdentifierCS("t")}, }, }) - if query.errorMessage == "" { - require.NoError(t, err) - } else { - require.EqualError(t, err, query.errorMessage) - } + require.NoError(t, err) + require.EqualError(t, st.NotUnshardedErr, query.errorMessage) }) } } @@ -871,8 +869,9 @@ func TestUnionOrderByRewrite(t *testing.T) { func TestInvalidQueries(t *testing.T) { tcases := []struct { - sql string - err string + sql string + err string + shardedErr string }{{ sql: "select t1.id, t1.col1 from t1 union select t2.uid from t2", err: "The used SELECT statements have a different number of columns", @@ -900,15 +899,37 @@ func TestInvalidQueries(t *testing.T) { }, { sql: "select (select sql_calc_found_rows id from a) as t", err: "Incorrect usage/placement of 'SQL_CALC_FOUND_ROWS'", + }, { + sql: "select id from t1 natural join t2", + err: "unsupported: natural join", + }, { + sql: "select * from music where user_id IN (select sql_calc_found_rows * from music limit 10)", + err: "Incorrect usage/placement of 'SQL_CALC_FOUND_ROWS'", + }, { + sql: "select is_free_lock('xyz') from user", + err: "is_free_lock('xyz') allowed only with dual", + }, { + sql: "SELECT * FROM JSON_TABLE('[ {\"c1\": null} ]','$[*]' COLUMNS( c1 INT PATH '$.c1' ERROR ON ERROR )) as jt", + err: "unsupported: json_table expressions", + }, { + sql: "select does_not_exist from t1", + shardedErr: "symbol does_not_exist not found", + }, { + sql: "select t1.does_not_exist from t1, t2", + shardedErr: "symbol t1.does_not_exist not found", }} for _, tc := range tcases { t.Run(tc.sql, func(t *testing.T) { parse, err := sqlparser.Parse(tc.sql) require.NoError(t, err) - _, err = Analyze(parse.(sqlparser.SelectStatement), "dbName", fakeSchemaInfo()) - require.Error(t, err) - require.Equal(t, tc.err, err.Error()) + st, err := Analyze(parse.(sqlparser.SelectStatement), "dbName", fakeSchemaInfo()) + if tc.err != "" { + require.EqualError(t, err, tc.err) + } else { + require.NoError(t, err, tc.err) + require.EqualError(t, st.NotUnshardedErr, tc.shardedErr) + } }) } } @@ -1021,9 +1042,13 @@ func TestScopingWDerivedTables(t *testing.T) { "t": {Name: sqlparser.NewIdentifierCS("t")}, }, }) - if query.errorMessage != "" { + + switch { + case query.errorMessage != "" && err != nil: require.EqualError(t, err, query.errorMessage) - } else { + case query.errorMessage != "": + require.EqualError(t, st.NotUnshardedErr, query.errorMessage) + default: require.NoError(t, err) sel := parse.(*sqlparser.Select) assert.Equal(t, query.recursiveExpectation, st.RecursiveDeps(extract(sel, 0)), "RecursiveDeps") diff --git a/go/vt/vtgate/semantics/binder.go b/go/vt/vtgate/semantics/binder.go index 99e65d87ab4..8d1e2c434f6 100644 --- a/go/vt/vtgate/semantics/binder.go +++ b/go/vt/vtgate/semantics/binder.go @@ -260,7 +260,7 @@ func (b *binder) resolveColumn(colName *sqlparser.ColName, current *scope, allow } current = current.parent } - return dependency{}, vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.BadFieldError, "symbol %s not found", sqlparser.String(colName)) + return dependency{}, ShardedError{Inner: vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.BadFieldError, "symbol %s not found", sqlparser.String(colName))} } func (b *binder) resolveColumnInScope(current *scope, expr *sqlparser.ColName, allowMulti bool) (dependencies, error) { From 99b88e8ff46a10015e392dabe76f84b16a30a3e7 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 09:55:33 +0200 Subject: [PATCH 49/53] [release-15.0] Use a left join to make sure that tables with tablespace=innodb_system are included in the schema (#12672) (#12734) * Use a left join to make sure that tables with tablespace=innodb_system are not skipped when loading the schema (fixes #12669) Signed-off-by: Oleksiy Kovyrin * Set tablespace on a test table to see if it breaks vstreamer Signed-off-by: Oleksiy Kovyrin --------- Signed-off-by: Oleksiy Kovyrin Co-authored-by: Oleksiy Kovyrin --- go/mysql/flavor_mysql.go | 2 +- go/test/endtoend/vreplication/vstream_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index ba4982db4d3..62d07ba796a 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -348,7 +348,7 @@ const TablesWithSize80 = `SELECT t.table_name, SUM(i.file_size), SUM(i.allocated_size) FROM information_schema.tables t -INNER JOIN information_schema.innodb_tablespaces i +LEFT JOIN information_schema.innodb_tablespaces i ON i.name LIKE CONCAT(database(), '/%') AND (i.name = CONCAT(t.table_schema, '/', t.table_name) OR i.name LIKE CONCAT(t.table_schema, '/', t.table_name, '#p#%')) WHERE t.table_schema = database() GROUP BY t.table_name, t.table_type, t.create_time, t.table_comment` diff --git a/go/test/endtoend/vreplication/vstream_test.go b/go/test/endtoend/vreplication/vstream_test.go index c596ed084f7..e9d71898324 100644 --- a/go/test/endtoend/vreplication/vstream_test.go +++ b/go/test/endtoend/vreplication/vstream_test.go @@ -188,7 +188,7 @@ const vschemaUnsharded = ` } ` const schemaSharded = ` -create table customer(cid int, name varbinary(128), primary key(cid)) CHARSET=utf8mb4; +create table customer(cid int, name varbinary(128), primary key(cid)) TABLESPACE innodb_system CHARSET=utf8mb4; ` const vschemaSharded = ` { From 7455d4e0e0ee90d08721c26fdaac6760c8a6a6c3 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 29 Mar 2023 08:46:26 +0200 Subject: [PATCH 50/53] Reset the current lag when closing the replication lag reader. (#12683) (#12744) * Reset the current lag when closing the replication lag reader. * Fix tests. --------- Signed-off-by: Johan Stenberg Signed-off-by: Florent Poinsard Co-authored-by: Johan Stenberg --- .../tabletserver/repltracker/reader.go | 3 ++ .../tabletserver/repltracker/reader_test.go | 51 +++++++++++++++++-- .../tabletserver/repltracker/writer_test.go | 26 +++++----- 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/go/vt/vttablet/tabletserver/repltracker/reader.go b/go/vt/vttablet/tabletserver/repltracker/reader.go index e58565c9147..f9bd07fceb3 100644 --- a/go/vt/vttablet/tabletserver/repltracker/reader.go +++ b/go/vt/vttablet/tabletserver/repltracker/reader.go @@ -122,6 +122,9 @@ func (r *heartbeatReader) Close() { } r.ticks.Stop() r.pool.Close() + + currentLagNs.Set(0) + r.isOpen = false log.Info("Heartbeat Reader: closed") } diff --git a/go/vt/vttablet/tabletserver/repltracker/reader_test.go b/go/vt/vttablet/tabletserver/repltracker/reader_test.go index c4a8be6e692..87c5853f603 100644 --- a/go/vt/vttablet/tabletserver/repltracker/reader_test.go +++ b/go/vt/vttablet/tabletserver/repltracker/reader_test.go @@ -39,9 +39,13 @@ import ( func TestReaderReadHeartbeat(t *testing.T) { db := fakesqldb.New(t) defer db.Close() - tr := newReader(db, mockNowFunc) + + now := time.Now() + tr := newReader(db, &now) defer tr.Close() + tr.pool.Open(tr.env.Config().DB.AppWithDB(), tr.env.Config().DB.DbaWithDB(), tr.env.Config().DB.AppDebugWithDB()) + db.AddQuery(fmt.Sprintf("SELECT ts FROM %s.heartbeat WHERE keyspaceShard='%s'", "_vt", tr.keyspaceShard), &sqltypes.Result{ Fields: []*querypb.Field{ {Name: "ts", Type: sqltypes.Int64}, @@ -79,14 +83,46 @@ func TestReaderReadHeartbeat(t *testing.T) { utils.MustMatch(t, expectedHisto, heartbeatLagNsHistogram.Counts(), "wrong counts in histogram") } +// TestReaderCloseSetsCurrentLagToZero tests that when closing the heartbeat reader, the current lag is +// set to zero. +func TestReaderCloseSetsCurrentLagToZero(t *testing.T) { + db := fakesqldb.New(t) + defer db.Close() + tr := newReader(db, nil) + + db.AddQuery(fmt.Sprintf("SELECT ts FROM %s.heartbeat WHERE keyspaceShard='%s'", "_vt", tr.keyspaceShard), &sqltypes.Result{ + Fields: []*querypb.Field{ + {Name: "ts", Type: sqltypes.Int64}, + }, + Rows: [][]sqltypes.Value{{ + sqltypes.NewInt64(time.Now().Add(-10 * time.Second).UnixNano()), + }}, + }) + + currentLagNs.Reset() + + tr.Open() + time.Sleep(2 * time.Second) + + assert.Greater(t, currentLagNs.Get(), int64(0), "lag should be greater than zero") + + tr.Close() + + assert.Equal(t, int64(0), currentLagNs.Get(), "lag should be be zero after closing the reader.") +} + // TestReaderReadHeartbeatError tests that we properly account for errors // encountered in the reading of heartbeat. func TestReaderReadHeartbeatError(t *testing.T) { db := fakesqldb.New(t) defer db.Close() - tr := newReader(db, mockNowFunc) + + now := time.Now() + tr := newReader(db, &now) defer tr.Close() + tr.pool.Open(tr.env.Config().DB.AppWithDB(), tr.env.Config().DB.DbaWithDB(), tr.env.Config().DB.AppDebugWithDB()) + cumulativeLagNs.Reset() readErrors.Reset() @@ -100,18 +136,23 @@ func TestReaderReadHeartbeatError(t *testing.T) { assert.Equal(t, int64(1), readErrors.Get(), "wrong read error count") } -func newReader(db *fakesqldb.DB, nowFunc func() time.Time) *heartbeatReader { +func newReader(db *fakesqldb.DB, frozenTime *time.Time) *heartbeatReader { config := tabletenv.NewDefaultConfig() config.ReplicationTracker.Mode = tabletenv.Heartbeat config.ReplicationTracker.HeartbeatIntervalSeconds = 1 params, _ := db.ConnParams().MysqlParams() cp := *params dbc := dbconfigs.NewTestDBConfigs(cp, cp, "") + config.DB = dbc tr := newHeartbeatReader(tabletenv.NewEnv(config, "ReaderTest")) tr.keyspaceShard = "test:0" - tr.now = nowFunc - tr.pool.Open(dbc.AppWithDB(), dbc.DbaWithDB(), dbc.AppDebugWithDB()) + + if frozenTime != nil { + tr.now = func() time.Time { + return *frozenTime + } + } return tr } diff --git a/go/vt/vttablet/tabletserver/repltracker/writer_test.go b/go/vt/vttablet/tabletserver/repltracker/writer_test.go index f678381ec2b..1c7b926f28b 100644 --- a/go/vt/vttablet/tabletserver/repltracker/writer_test.go +++ b/go/vt/vttablet/tabletserver/repltracker/writer_test.go @@ -32,17 +32,11 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" ) -var ( - now = time.Now() - mockNowFunc = func() time.Time { - return now - } -) - func TestCreateSchema(t *testing.T) { db := fakesqldb.New(t) defer db.Close() - tw := newTestWriter(db, mockNowFunc) + now := time.Now() + tw := newTestWriter(db, &now) defer tw.Close() writes.Reset() @@ -66,7 +60,8 @@ func TestWriteHeartbeat(t *testing.T) { db := fakesqldb.New(t) defer db.Close() - tw := newTestWriter(db, mockNowFunc) + now := time.Now() + tw := newTestWriter(db, &now) upsert := fmt.Sprintf("INSERT INTO %s.heartbeat (ts, tabletUid, keyspaceShard) VALUES (%d, %d, '%s') ON DUPLICATE KEY UPDATE ts=VALUES(ts), tabletUid=VALUES(tabletUid)", "_vt", now.UnixNano(), tw.tabletAlias.Uid, tw.keyspaceShard) db.AddQuery(upsert, &sqltypes.Result{}) @@ -83,7 +78,8 @@ func TestWriteHeartbeatError(t *testing.T) { db := fakesqldb.New(t) defer db.Close() - tw := newTestWriter(db, mockNowFunc) + now := time.Now() + tw := newTestWriter(db, &now) writes.Reset() writeErrors.Reset() @@ -93,7 +89,7 @@ func TestWriteHeartbeatError(t *testing.T) { assert.Equal(t, int64(1), writeErrors.Get()) } -func newTestWriter(db *fakesqldb.DB, nowFunc func() time.Time) *heartbeatWriter { +func newTestWriter(db *fakesqldb.DB, frozenTime *time.Time) *heartbeatWriter { config := tabletenv.NewDefaultConfig() config.ReplicationTracker.Mode = tabletenv.Heartbeat config.ReplicationTracker.HeartbeatIntervalSeconds = 1 @@ -104,7 +100,13 @@ func newTestWriter(db *fakesqldb.DB, nowFunc func() time.Time) *heartbeatWriter tw := newHeartbeatWriter(tabletenv.NewEnv(config, "WriterTest"), &topodatapb.TabletAlias{Cell: "test", Uid: 1111}) tw.keyspaceShard = "test:0" - tw.now = nowFunc + + if frozenTime != nil { + tw.now = func() time.Time { + return *frozenTime + } + } + tw.appPool.Open(dbc.AppWithDB()) tw.allPrivsPool.Open(dbc.AllPrivsWithDB()) From 295e22a3312fe7e83bcb46820567ffa600ce8aad Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 29 Mar 2023 08:51:50 +0200 Subject: [PATCH 51/53] vschema ddl: add grammar to accept qualified tables (#12577) (#12747) Signed-off-by: Hormoz Kheradmand Signed-off-by: Florent Poinsard Co-authored-by: Hormoz Kheradmand --- go/vt/sqlparser/sql.go | 9367 ++++++++++----------- go/vt/sqlparser/sql.y | 6 +- go/vt/vtgate/executor_vschema_ddl_test.go | 12 + 3 files changed, 4670 insertions(+), 4715 deletions(-) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 2852508634b..54beb69d7c3 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1365,19 +1365,19 @@ var yyExca = [...]int{ 135, 155, 176, 155, 339, 155, - -2, 505, + -2, 506, -1, 57, - 36, 751, - 238, 751, - 249, 751, - 284, 765, - 285, 765, - -2, 753, + 36, 752, + 238, 752, + 249, 752, + 284, 766, + 285, 766, + -2, 754, -1, 62, - 240, 782, - -2, 780, + 240, 783, + -2, 781, -1, 116, - 237, 1438, + 237, 1439, -2, 121, -1, 118, 1, 148, @@ -1386,42 +1386,42 @@ var yyExca = [...]int{ -1, 129, 136, 391, 243, 391, - -2, 494, + -2, 495, -1, 148, 135, 155, 176, 155, 339, 155, - -2, 514, + -2, 515, -1, 798, - 87, 1455, - -2, 1300, - -1, 799, 87, 1456, - 221, 1460, -2, 1301, + -1, 799, + 87, 1457, + 221, 1461, + -2, 1302, -1, 800, - 221, 1459, + 221, 1460, -2, 39, -1, 880, - 60, 851, - -2, 866, + 60, 852, + -2, 867, -1, 966, 248, 40, 253, 40, -2, 402, -1, 1051, - 1, 562, - 657, 562, + 1, 563, + 657, 563, -2, 155, -1, 1340, - 221, 1460, - -2, 1301, + 221, 1461, + -2, 1302, -1, 1488, - 60, 852, - -2, 871, - -1, 1489, 60, 853, -2, 872, + -1, 1489, + 60, 854, + -2, 873, -1, 1540, 135, 155, 176, 155, @@ -1430,17 +1430,17 @@ var yyExca = [...]int{ -1, 1619, 136, 391, 243, 391, - -2, 494, + -2, 495, -1, 1628, 248, 41, 253, 41, -2, 403, -1, 1982, - 221, 1464, - -2, 1458, + 221, 1465, + -2, 1459, -1, 1983, - 221, 1460, - -2, 1456, + 221, 1461, + -2, 1457, -1, 2083, 135, 155, 176, 155, @@ -1452,1039 +1452,967 @@ var yyExca = [...]int{ -1, 2451, 78, 95, 88, 95, - -2, 930, + -2, 931, -1, 2519, - 632, 678, - -2, 652, + 632, 679, + -2, 653, -1, 2686, - 50, 1397, - -2, 1391, + 50, 1398, + -2, 1392, -1, 3338, - 632, 678, - -2, 666, - -1, 3426, - 23, 1816, - 33, 1816, - 177, 1816, - 260, 1816, - 319, 1816, - 320, 1816, - 321, 1816, - 322, 1816, - 323, 1816, - 324, 1816, - 325, 1816, - 327, 1816, - 328, 1816, - 329, 1816, - 330, 1816, - 331, 1816, - 332, 1816, - 333, 1816, - 334, 1816, - 335, 1816, - 336, 1816, - 337, 1816, - 338, 1816, - 340, 1816, - 342, 1816, - 343, 1816, - 344, 1816, - 345, 1816, - 346, 1816, - 347, 1816, - 348, 1816, - 349, 1816, - 350, 1816, - 353, 1816, - 354, 1816, - 355, 1816, - 356, 1816, - 357, 1816, - 359, 1816, - 360, 1816, - 361, 1816, - 362, 1816, - 503, 1816, - -2, 610, + 632, 679, + -2, 667, + -1, 3427, + 23, 1817, + 33, 1817, + 177, 1817, + 260, 1817, + 319, 1817, + 320, 1817, + 321, 1817, + 322, 1817, + 323, 1817, + 324, 1817, + 325, 1817, + 327, 1817, + 328, 1817, + 329, 1817, + 330, 1817, + 331, 1817, + 332, 1817, + 333, 1817, + 334, 1817, + 335, 1817, + 336, 1817, + 337, 1817, + 338, 1817, + 340, 1817, + 342, 1817, + 343, 1817, + 344, 1817, + 345, 1817, + 346, 1817, + 347, 1817, + 348, 1817, + 349, 1817, + 350, 1817, + 353, 1817, + 354, 1817, + 355, 1817, + 356, 1817, + 357, 1817, + 359, 1817, + 360, 1817, + 361, 1817, + 362, 1817, + 503, 1817, + -2, 611, } const yyPrivate = 57344 -const yyLast = 47864 +const yyLast = 47193 var yyAct = [...]int{ - 1496, 3085, 3497, 3086, 3087, 3319, 3467, 3424, 3508, 3466, - 802, 672, 3403, 3056, 1543, 651, 2913, 3369, 809, 2031, - 801, 2835, 3392, 1849, 2738, 2745, 2011, 3303, 3251, 2795, - 2080, 2800, 2797, 2796, 2794, 2799, 2798, 5, 2786, 3301, - 2351, 3043, 1114, 2699, 3115, 873, 2703, 2702, 2645, 3291, - 2385, 2815, 2013, 2150, 654, 2814, 2700, 2952, 2424, 2580, - 3120, 764, 2946, 2051, 2753, 682, 2035, 1503, 2972, 2817, - 2697, 763, 762, 2687, 2411, 2938, 1973, 1063, 650, 2485, - 2516, 2484, 769, 2113, 2138, 2564, 2118, 2054, 2486, 2841, - 1597, 652, 2181, 768, 157, 928, 39, 2068, 2436, 2056, - 1644, 2403, 40, 998, 2387, 2417, 974, 1944, 38, 1845, - 1864, 896, 897, 875, 2055, 1490, 1092, 1803, 2556, 1970, - 2159, 2137, 2043, 1626, 2198, 143, 2120, 956, 2478, 1532, - 2453, 1512, 94, 2058, 664, 1470, 961, 1352, 647, 1868, - 1822, 1743, 1280, 1978, 1633, 935, 967, 1725, 932, 2135, - 936, 962, 98, 99, 2109, 963, 1531, 1116, 964, 887, - 659, 914, 916, 1517, 1940, 93, 1747, 1336, 1979, 1312, - 10, 884, 101, 877, 79, 881, 9, 8, 1106, 1752, - 2036, 161, 121, 1112, 883, 119, 120, 126, 1592, 1618, - 882, 127, 1047, 909, 899, 885, 658, 87, 1356, 3328, - 2509, 92, 641, 3498, 2152, 2153, 2154, 3354, 1360, 3044, - 2783, 100, 2152, 2539, 2538, 78, 904, 908, 2507, 2196, - 1281, 1710, 3036, 89, 3450, 1943, 890, 2999, 89, 89, - 2572, 122, 2573, 3355, 3349, 3090, 2805, 978, 588, 3090, - 128, 900, 1825, 1003, 906, 906, 1877, 3350, 627, 1000, - 929, 2239, 621, 922, 766, 767, 1810, 1281, 1809, 1011, - 891, 1808, 1017, 1018, 1019, 1807, 1022, 1023, 1024, 1025, - 642, 923, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, - 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 977, - 874, 924, 2803, 954, 2, 876, 1497, 621, 898, 1806, - 122, 952, 1805, 953, 951, 950, 2008, 2009, 1004, 1007, - 1008, 2805, 627, 1783, 644, 184, 645, 2383, 2809, 818, - 819, 820, 3089, 3445, 2802, 2683, 3089, 1291, 3470, 922, - 766, 767, 1297, 3350, 2529, 2185, 105, 106, 107, 123, - 110, 145, 1020, 116, 945, 940, 185, 2649, 3518, 583, - 3465, 3454, 166, 89, 2413, 3488, 621, 818, 819, 820, - 640, 3452, 2918, 2917, 1291, 2532, 3304, 2803, 122, 869, - 870, 871, 872, 621, 2352, 880, 3453, 2183, 1815, 2184, - 1466, 2860, 3247, 156, 2129, 3246, 3451, 3049, 1002, 144, - 3050, 3479, 1001, 2809, 80, 80, 3257, 2248, 618, 80, - 3448, 3068, 3057, 911, 912, 621, 3404, 2123, 163, 80, - 3393, 164, 82, 3333, 3400, 2178, 3256, 3067, 1854, 2427, - 3429, 2880, 1607, 1533, 3434, 1534, 2546, 2547, 1287, 2806, - 132, 133, 155, 154, 183, 2462, 2735, 2736, 2461, 2075, - 2076, 2463, 3432, 3410, 2428, 2741, 604, 2039, 3133, 2384, - 646, 3438, 3439, 2734, 2571, 2245, 622, 1050, 602, 2755, - 2756, 2074, 2246, 2555, 1082, 1287, 3433, 1294, 1279, 1295, - 1296, 867, 89, 89, 866, 915, 1109, 89, 1087, 1088, - 1070, 3410, 2510, 3320, 2474, 1071, 949, 89, 1056, 1057, - 2742, 1070, 1083, 1069, 2949, 1068, 1071, 621, 599, 1076, - 621, 622, 2093, 2092, 2806, 2837, 2868, 613, 2240, 2241, - 2243, 2242, 2010, 633, 2744, 2614, 621, 3471, 2420, 2421, - 1059, 2866, 609, 635, 1530, 1791, 639, 2842, 944, 2557, - 1046, 946, 2739, 149, 130, 152, 137, 129, 3472, 150, - 151, 1021, 1474, 2517, 947, 167, 3279, 2160, 3280, 2755, - 2756, 2830, 2542, 2122, 173, 138, 2740, 2199, 2039, 2831, - 622, 3500, 1726, 925, 919, 917, 2754, 2204, 1103, 141, - 139, 134, 135, 136, 140, 1089, 1731, 622, 2757, 1084, - 1091, 131, 1052, 1700, 1108, 1090, 1077, 1085, 1086, 2746, - 142, 2559, 2838, 589, 3038, 591, 605, 3037, 624, 2222, - 623, 595, 1027, 593, 597, 606, 598, 1026, 592, 622, - 603, 949, 1045, 594, 607, 608, 611, 614, 615, 616, - 612, 610, 2205, 601, 625, 3231, 2839, 1701, 949, 1702, - 941, 2201, 2163, 2037, 2038, 2203, 3034, 943, 942, 925, - 919, 917, 1099, 3094, 1101, 2052, 987, 3446, 2211, 2207, - 2209, 2210, 2208, 2212, 2213, 958, 2754, 1286, 1283, 1284, - 1285, 1290, 1292, 1289, 948, 1288, 996, 1066, 2757, 1072, - 1073, 1074, 1075, 158, 2615, 1282, 1049, 2202, 985, 184, - 957, 995, 1098, 1100, 958, 2648, 947, 1611, 994, 1348, - 993, 992, 1110, 1111, 1286, 1283, 1284, 1285, 1290, 1292, - 1289, 622, 1288, 123, 622, 2219, 1477, 2220, 1313, 2221, - 991, 990, 1282, 989, 984, 997, 166, 1327, 3327, 2508, - 622, 2757, 1327, 933, 969, 1104, 3519, 3477, 970, 1338, - 2857, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, - 1323, 1324, 933, 1632, 2037, 2038, 1529, 2246, 955, 3033, - 1744, 153, 1330, 1331, 1332, 1333, 2544, 1080, 976, 2467, - 2136, 815, 1344, 910, 2563, 933, 815, 815, 2511, 931, - 2560, 1267, 163, 918, 1048, 164, 2189, 2188, 2182, 2743, - 3512, 1096, 2476, 1740, 2950, 1097, 2776, 1298, 1734, 948, - 1732, 1733, 988, 1735, 1736, 1102, 1272, 1014, 183, 2541, - 1605, 1334, 2576, 1268, 1269, 976, 948, 2260, 2388, 2390, - 1604, 2126, 146, 1603, 2527, 147, 1353, 3406, 3088, 1095, - 1741, 1601, 3088, 976, 986, 2807, 2808, 1712, 1711, 1713, - 1714, 1715, 626, 2997, 2998, 1013, 587, 582, 2811, 2554, - 3316, 2180, 2553, 83, 2986, 159, 3066, 3405, 2968, 918, - 1631, 2127, 171, 619, 2531, 3406, 2458, 1730, 2125, 975, - 976, 1328, 1329, 2423, 2360, 969, 972, 973, 620, 933, - 1857, 1006, 1521, 966, 970, 3437, 1429, 969, 1061, 2247, - 1358, 1005, 1359, 1498, 1500, 3405, 2418, 118, 2081, 1327, - 88, 88, 2128, 179, 1362, 88, 2733, 1324, 2530, 893, - 2807, 2808, 2124, 1093, 1753, 88, 975, 1107, 1464, 167, - 2566, 979, 969, 2811, 113, 2565, 981, 1297, 173, 3436, - 982, 980, 1481, 1465, 975, 2902, 1918, 2566, 1058, 1055, - 3341, 2600, 2565, 1878, 160, 165, 162, 168, 169, 170, - 172, 174, 175, 176, 177, 1067, 976, 1879, 1065, 999, - 178, 180, 181, 182, 2747, 3029, 2962, 2200, 2751, 1079, - 2500, 975, 1800, 1737, 1535, 2750, 979, 969, 1480, 1869, - 1081, 981, 1484, 3480, 2389, 982, 980, 1296, 877, 1435, - 1436, 1437, 1438, 1439, 2581, 1478, 114, 1465, 1295, 1296, - 1482, 1483, 3129, 3004, 98, 99, 983, 3003, 3510, 2752, - 1471, 3511, 2167, 3509, 2748, 1727, 1458, 1728, 1641, 2749, - 1729, 1869, 1640, 2277, 101, 1910, 1899, 1900, 1901, 1902, - 1912, 1903, 1904, 1905, 1917, 1913, 1906, 1907, 1914, 1915, - 1916, 1908, 1909, 1911, 1297, 2179, 1630, 158, 2177, 1638, - 1513, 1319, 1320, 1322, 1321, 1323, 1324, 975, 1499, 1012, - 1094, 1754, 1294, 1009, 1295, 1296, 2175, 1608, 1609, 1610, - 1624, 2602, 2172, 2172, 987, 985, 1673, 2583, 1468, 1676, - 3371, 1678, 1479, 2858, 1051, 1297, 1876, 1599, 3309, 1634, - 1634, 3520, 1502, 1695, 3473, 1646, 1617, 1647, 874, 1649, - 1651, 1064, 2987, 1655, 1657, 1659, 1661, 1663, 1636, 889, - 876, 2176, 2174, 3514, 1677, 1526, 1527, 3239, 3238, 1817, - 1819, 1820, 1827, 976, 3063, 3372, 3064, 1297, 1635, 1497, - 818, 819, 820, 3310, 1685, 1686, 1828, 1325, 1326, 1826, - 1691, 1692, 1600, 1818, 2593, 2592, 2591, 2585, 3229, 2589, - 1975, 2584, 1297, 2582, 1972, 1975, 1297, 1615, 2587, 1614, - 3079, 1613, 3078, 1974, 1757, 1627, 3011, 2586, 3010, 3484, - 1497, 1761, 3000, 1763, 1764, 1765, 1766, 813, 3521, 1294, - 1770, 1295, 1296, 2784, 1485, 2588, 2590, 2252, 2253, 2254, - 2772, 1720, 1782, 1718, 1707, 1755, 1756, 1317, 1318, 1319, - 1320, 1322, 1321, 1323, 1324, 1681, 2482, 2834, 2481, 1760, - 1745, 3482, 1497, 2132, 1751, 1721, 1767, 1768, 1769, 159, - 1294, 1705, 1295, 1296, 975, 1704, 171, 1297, 1703, 1749, - 969, 972, 973, 1693, 933, 1687, 3416, 1497, 966, 970, - 3414, 1497, 1684, 122, 952, 1297, 1683, 951, 950, 2304, - 1606, 1313, 1682, 1497, 1309, 1719, 1310, 1717, 1706, 965, - 1874, 1653, 1294, 1271, 1295, 1296, 627, 179, 1759, 1875, - 1311, 1325, 1326, 1308, 1314, 1315, 1316, 1317, 1318, 1319, - 1320, 1322, 1321, 1323, 1324, 1530, 1297, 1294, 3474, 1295, - 1296, 1294, 1781, 1295, 1296, 1297, 1780, 1314, 1315, 1316, - 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 160, 165, - 162, 168, 169, 170, 172, 174, 175, 176, 177, 2044, - 2045, 2994, 627, 1796, 178, 180, 181, 182, 1301, 1302, - 1303, 1304, 1305, 1306, 1307, 1299, 1830, 1297, 1832, 1833, - 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, - 1844, 2465, 627, 2148, 2147, 3336, 2875, 1852, 1852, 1850, - 1850, 1506, 1294, 1853, 1295, 1296, 3335, 1313, 1872, 2575, - 3412, 1497, 1873, 104, 1297, 2146, 2145, 2144, 2143, 39, - 1294, 1497, 1295, 1296, 103, 2274, 102, 2409, 3499, 1821, - 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, - 1324, 1823, 3313, 104, 95, 3312, 1936, 1507, 2314, 1338, - 3311, 97, 3234, 1831, 103, 96, 102, 1932, 1293, 1497, - 95, 1294, 1497, 1295, 1296, 97, 1870, 3461, 1497, 3329, - 1294, 96, 1295, 1296, 1968, 1293, 1497, 2409, 3399, 2409, - 3379, 3265, 1811, 1812, 1813, 1814, 2409, 3375, 3362, 1497, - 3264, 1464, 3218, 1824, 1497, 3222, 1799, 79, 2273, 1997, - 1788, 1789, 1797, 1798, 3047, 3326, 1465, 3242, 1497, 3221, - 1497, 3055, 1294, 3217, 1295, 1296, 1498, 2004, 2409, 3230, - 1297, 3128, 1980, 3126, 1497, 2518, 1497, 2961, 3075, 1829, - 1463, 1858, 1859, 1462, 1461, 3008, 1861, 2993, 906, 906, - 1866, 2843, 2265, 2840, 1871, 3047, 1497, 1971, 2775, 1294, - 2028, 1295, 1296, 2409, 3045, 1856, 2774, 1884, 1885, 1886, - 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1297, 1863, 1865, - 2491, 1919, 1920, 1921, 1922, 1923, 1924, 1926, 2479, 1931, - 1460, 1933, 1934, 1935, 2194, 1937, 1938, 1939, 2193, 1945, - 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, - 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, - 1966, 1967, 2034, 1969, 1980, 1976, 1977, 906, 2016, 906, - 906, 906, 906, 906, 2090, 1985, 1986, 98, 99, 1989, - 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1982, 1998, 1999, - 2000, 2001, 2002, 2021, 97, 2022, 1981, 98, 99, 1984, - 2133, 3260, 1987, 1988, 1784, 1294, 2027, 1295, 1296, 2172, - 1497, 1880, 1881, 1882, 1883, 2966, 1497, 2325, 1497, 2698, - 2062, 2099, 2100, 2101, 2102, 1894, 906, 1297, 2765, 2764, - 2961, 2003, 890, 2761, 2762, 2084, 1750, 2085, 2015, 2094, - 1313, 2095, 2096, 2097, 2098, 2066, 2761, 2760, 2040, 2041, - 1716, 1297, 1294, 1497, 1295, 1296, 2026, 2105, 2106, 2107, - 2108, 2029, 2316, 1314, 1315, 1316, 1317, 1318, 1319, 1320, - 1322, 1321, 1323, 1324, 2079, 2115, 1708, 2161, 2088, 1982, - 2121, 1698, 2047, 2433, 1497, 2496, 2072, 1694, 2049, 923, - 2071, 2070, 1690, 2087, 1297, 2246, 2540, 2086, 1315, 1316, - 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1689, 924, - 2454, 3288, 1497, 1596, 2521, 2514, 2515, 2409, 2408, 2158, - 2131, 2270, 1497, 103, 2454, 1855, 1497, 2405, 1688, 978, - 1508, 1596, 1595, 2117, 184, 3286, 1497, 1541, 1540, 1634, - 1105, 2116, 97, 2111, 2112, 2728, 2432, 2130, 2134, 2089, - 1293, 2963, 3367, 3340, 2166, 2246, 2142, 2169, 123, 2170, - 1297, 2409, 1294, 2425, 1295, 1296, 1297, 2425, 2433, 2922, - 1930, 166, 2186, 2455, 2164, 2165, 2116, 2168, 3283, 1497, - 1941, 977, 1313, 2457, 2259, 2763, 1294, 2455, 1295, 1296, - 2671, 2190, 1293, 1313, 2173, 2191, 2192, 2246, 2187, 2073, - 2270, 2433, 2270, 2325, 2301, 1314, 1315, 1316, 1317, 1318, - 1319, 1320, 1322, 1321, 1323, 1324, 1314, 1315, 1316, 1317, - 1318, 1319, 1320, 1322, 1321, 1323, 1324, 163, 1297, 1294, - 164, 1295, 1296, 2232, 2233, 2433, 2300, 2172, 2235, 2961, - 2155, 2197, 2042, 2256, 2981, 2258, 1501, 2236, 2005, 2006, - 3269, 1497, 2172, 183, 1941, 1297, 1855, 2263, 1801, 1739, - 1528, 2268, 960, 959, 2271, 89, 2272, 879, 3442, 3382, - 3253, 2279, 1504, 3219, 3140, 2281, 2282, 2283, 3028, 3025, - 3006, 2885, 2884, 2225, 1598, 2289, 2290, 2291, 2292, 2293, - 2294, 2295, 2296, 2297, 2298, 1294, 1297, 1295, 1296, 2114, - 2264, 1294, 2832, 1295, 1296, 2789, 2785, 2522, 2110, 1823, - 1297, 2487, 2937, 1497, 2104, 2103, 1297, 2262, 1723, 1629, - 2257, 2305, 2306, 2307, 2308, 2309, 1625, 2311, 1594, 115, - 2787, 2313, 2488, 1297, 1050, 2318, 2319, 2836, 2320, 2930, - 1497, 2323, 1297, 2324, 2244, 89, 3254, 2327, 2973, 2974, - 1297, 2331, 2129, 2019, 2979, 2336, 2337, 2338, 2339, 2488, - 3494, 1824, 3016, 1294, 167, 1295, 1296, 2255, 2350, 2978, - 2353, 2354, 1297, 173, 3492, 1786, 1297, 3012, 2356, 2358, - 2927, 1497, 3468, 2717, 1297, 2361, 2362, 2363, 2364, 2365, - 1294, 1297, 1295, 1296, 2925, 1497, 2372, 2373, 1297, 2374, - 2890, 1497, 2377, 2379, 2028, 3348, 2381, 2276, 2278, 3017, - 3018, 3019, 1297, 3274, 2976, 1982, 2393, 2873, 1497, 2285, - 2286, 2287, 2288, 2312, 1981, 2781, 2380, 1497, 3013, 3014, - 3015, 1294, 2780, 1295, 1296, 3475, 1852, 1787, 1850, 2779, - 2698, 2394, 1297, 2501, 2226, 1294, 2716, 1295, 1296, 3344, - 1297, 1294, 1669, 1295, 1296, 1297, 2378, 1497, 3255, 2033, - 2357, 1497, 1297, 2310, 1353, 1505, 2025, 2392, 1294, 3324, - 1295, 1296, 2967, 1510, 1297, 2340, 1497, 1294, 3308, 1295, - 1296, 1297, 2332, 1497, 3119, 1294, 2720, 1295, 1296, 2429, - 1297, 2721, 158, 2718, 2395, 2676, 2397, 1497, 2719, 2675, - 3121, 2410, 1297, 1670, 1671, 1672, 3110, 1294, 3109, 1295, - 1296, 1294, 2954, 1295, 1296, 2957, 2685, 1297, 1738, 1294, - 2953, 1295, 1296, 1665, 2267, 865, 1294, 3226, 1295, 1296, - 894, 1016, 2759, 1294, 2266, 1295, 1296, 2472, 895, 1509, - 1471, 2492, 2382, 2406, 2419, 39, 2932, 1294, 2448, 1295, - 1296, 1015, 2688, 2690, 2447, 2851, 3108, 2449, 2928, 2402, - 1297, 2691, 2475, 2477, 1472, 2407, 3030, 2487, 2569, 1465, - 1666, 1667, 1668, 1297, 2422, 2483, 2513, 1294, 2468, 1295, - 1296, 1513, 1297, 2452, 95, 1294, 2900, 1295, 1296, 2528, - 1294, 97, 1295, 1296, 1297, 96, 1270, 1294, 2456, 1295, - 1296, 2896, 95, 2459, 2121, 2722, 123, 2442, 2443, 1294, - 2466, 1295, 1296, 96, 2959, 97, 1294, 3421, 1295, 1296, - 585, 2537, 2469, 2044, 2045, 1294, 2490, 1295, 1296, 1297, - 3506, 2493, 2494, 2480, 1878, 2777, 3325, 1294, 868, 1295, - 1296, 1297, 2229, 3249, 2882, 2758, 2489, 2446, 1879, 1297, - 2535, 2939, 1294, 2030, 1295, 1296, 2497, 2881, 2284, 2498, - 2218, 2502, 2503, 2504, 159, 2217, 2878, 2216, 2534, 3296, - 2215, 171, 902, 903, 2674, 2299, 2214, 2579, 2376, 934, - 2250, 1617, 2673, 104, 102, 2604, 2605, 2606, 2607, 2608, - 104, 2523, 2524, 3295, 103, 1294, 102, 1295, 1296, 1297, - 3277, 103, 103, 102, 2613, 97, 3127, 2533, 1294, 1297, - 1295, 1296, 179, 2375, 3125, 1297, 3124, 1294, 3117, 1295, - 1296, 3026, 2958, 2956, 2790, 2371, 2594, 2156, 1612, 1294, - 104, 1295, 1296, 2370, 901, 3116, 2558, 2947, 2577, 2425, - 3098, 103, 2405, 2561, 2616, 2609, 3496, 3495, 2567, 2302, - 2017, 2568, 2578, 160, 165, 162, 168, 169, 170, 172, - 174, 175, 176, 177, 1294, 1522, 1295, 1296, 1514, 178, - 180, 181, 182, 108, 109, 3495, 1294, 2595, 1295, 1296, - 3496, 2597, 3314, 2369, 1294, 2992, 1295, 1296, 892, 3, - 2574, 91, 1, 2368, 2996, 2650, 3431, 600, 2007, 2367, - 1469, 3469, 3427, 2655, 3428, 2652, 1709, 1699, 3058, 906, - 1942, 3250, 2598, 2599, 2793, 2162, 2601, 3024, 2119, 2603, - 968, 148, 2082, 2083, 2618, 3395, 112, 1971, 926, 1971, - 111, 2707, 971, 2624, 1294, 1078, 1295, 1296, 2157, 2610, - 2611, 2612, 3048, 2473, 1294, 2091, 1295, 1296, 1547, 2725, - 1294, 2617, 1295, 1296, 2619, 2620, 2621, 1545, 1546, 1544, - 2622, 2623, 2678, 1549, 1945, 2625, 2655, 1548, 2627, 2859, - 2303, 2629, 2630, 2631, 2632, 2651, 2710, 2653, 2727, 2633, - 1945, 1945, 1945, 1945, 1945, 2901, 1790, 634, 2445, 2701, - 628, 2666, 2670, 2679, 2701, 2667, 2668, 2669, 906, 2062, - 186, 1536, 1515, 2654, 2677, 2656, 2657, 2658, 2659, 2660, - 2661, 2704, 2914, 1010, 2662, 2663, 590, 2664, 2766, 2665, - 2692, 2693, 2680, 2195, 881, 596, 1345, 2062, 2062, 2062, - 2062, 2062, 2709, 883, 2712, 2713, 2695, 2715, 1785, 882, - 2672, 2729, 2813, 2723, 2730, 2460, 921, 2062, 2711, 913, - 2062, 2714, 2018, 2396, 920, 2731, 3227, 2706, 2951, 2684, - 98, 99, 2737, 2686, 2696, 2412, 2769, 2634, 2635, 2636, - 2637, 2638, 2689, 2682, 2768, 2853, 2767, 3307, 3118, 2792, - 3380, 2438, 2441, 2442, 2443, 2439, 1297, 2440, 2444, 2726, - 2470, 2770, 2771, 1511, 2921, 2870, 2871, 2872, 2275, 2874, - 2876, 2820, 2821, 799, 1867, 1297, 2121, 1335, 2812, 2059, - 2791, 3093, 1816, 2883, 2827, 656, 1749, 655, 2887, 2888, - 2889, 2891, 2892, 2893, 2894, 653, 2398, 2895, 1297, 2897, - 2898, 2899, 2426, 1300, 2903, 2904, 2905, 2906, 2907, 2908, - 2909, 2910, 2911, 2912, 2847, 2849, 2850, 2846, 2844, 2788, - 2596, 803, 2919, 2386, 2854, 2923, 189, 2924, 2926, 189, - 2929, 2931, 632, 2933, 2934, 2935, 2936, 638, 2855, 2864, - 2366, 2942, 2861, 2862, 1523, 2863, 2437, 189, 2865, 2435, - 2867, 2434, 2869, 1297, 2227, 2067, 2916, 2975, 1297, 2355, - 2971, 3423, 189, 2920, 2061, 2057, 2404, 754, 753, 665, - 1297, 657, 649, 752, 751, 2989, 2964, 2965, 2819, 2626, - 2969, 2628, 2349, 1297, 3407, 2543, 2833, 638, 189, 638, - 2545, 1294, 2471, 1295, 1296, 2829, 1278, 2639, 2640, 2641, - 2642, 1487, 643, 1297, 939, 2856, 2945, 3331, 2249, 2879, - 1294, 2877, 1295, 1296, 2940, 2941, 1297, 1054, 2943, 1060, - 1486, 1897, 1062, 1898, 3338, 2886, 1297, 2948, 1495, 1491, - 2955, 2801, 1297, 1294, 3042, 1295, 1296, 2348, 1297, 2970, - 2960, 2782, 2347, 1492, 2519, 2438, 2441, 2442, 2443, 2439, - 1297, 2440, 2444, 2977, 2346, 2973, 2974, 2149, 2984, 2985, - 1297, 2982, 2980, 65, 43, 1297, 3302, 2345, 2023, 2024, - 1494, 1297, 1493, 3368, 750, 1274, 1297, 2990, 747, 3031, - 3032, 2991, 3095, 2820, 2821, 3046, 2983, 2344, 1294, 3096, - 1295, 1296, 2062, 1294, 3097, 1295, 1296, 3007, 2646, 3009, - 2343, 2647, 3351, 3052, 3053, 1294, 1297, 1295, 1296, 3352, - 2342, 746, 1297, 3353, 1925, 1275, 2341, 1297, 1294, 3444, - 1295, 1296, 2335, 1792, 90, 3001, 3002, 3065, 1297, 34, - 3069, 33, 32, 31, 2334, 30, 25, 24, 1294, 1297, - 1295, 1296, 23, 22, 2333, 21, 27, 20, 19, 2330, - 18, 1294, 2804, 1295, 1296, 2329, 3464, 3080, 3505, 117, - 2328, 1294, 52, 1295, 1296, 49, 3054, 1294, 47, 1295, - 1296, 125, 3084, 1294, 124, 1295, 1296, 3035, 1495, 1491, - 50, 3039, 3040, 3041, 3092, 1294, 46, 1295, 1296, 1053, - 2326, 44, 3099, 1492, 3027, 1294, 2322, 1295, 1296, 3070, - 1294, 2321, 1295, 1296, 29, 28, 1294, 17, 1295, 1296, - 16, 1294, 2317, 1295, 1296, 15, 14, 13, 1488, 1489, - 1494, 12, 1493, 2315, 11, 7, 6, 3051, 37, 36, - 1297, 35, 3091, 1795, 26, 4, 2506, 2151, 0, 3113, - 0, 1294, 0, 1295, 1296, 0, 0, 1294, 0, 1295, - 1296, 1297, 1294, 0, 1295, 1296, 0, 0, 0, 0, - 0, 3074, 0, 1294, 0, 1295, 1296, 0, 0, 0, - 1852, 0, 1850, 3134, 1294, 3142, 1295, 1296, 3114, 3123, - 3132, 3122, 3071, 0, 3072, 3136, 3138, 3073, 3130, 0, - 3076, 3077, 0, 2701, 0, 0, 0, 0, 0, 3081, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3083, - 0, 3143, 3144, 3241, 2280, 0, 2704, 3146, 3228, 0, - 2704, 0, 3248, 0, 0, 0, 0, 0, 0, 39, - 0, 3100, 0, 0, 3101, 2269, 3102, 3103, 0, 3104, - 0, 3105, 3258, 3259, 1525, 3261, 3106, 3262, 3263, 0, - 3225, 3224, 3266, 3267, 3268, 0, 3270, 3273, 3223, 3271, - 3272, 0, 1542, 0, 3240, 1294, 0, 1295, 1296, 3245, - 3252, 3131, 3282, 3284, 3285, 3287, 3289, 3290, 3292, 1852, - 3244, 1850, 3139, 0, 3275, 3141, 1294, 3232, 1295, 1296, - 0, 0, 0, 0, 0, 0, 0, 3145, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3276, - 3235, 3236, 3237, 0, 3278, 3220, 3322, 0, 3281, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3300, - 3318, 3297, 3298, 0, 3299, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1679, 0, 0, 0, 0, - 0, 3315, 0, 0, 0, 0, 189, 0, 189, 3321, - 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1724, 0, 0, 0, 0, 0, 2704, 0, 0, 0, - 0, 638, 0, 638, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3323, - 0, 0, 1758, 638, 189, 0, 0, 0, 0, 1762, - 3317, 0, 0, 0, 0, 3305, 0, 0, 0, 0, - 1773, 1774, 1775, 1776, 1777, 1778, 1779, 0, 0, 0, - 0, 1340, 3347, 3342, 0, 0, 0, 3082, 0, 0, - 0, 0, 0, 0, 3337, 0, 0, 3339, 3334, 0, + 1496, 3085, 3086, 809, 1849, 3087, 3500, 3319, 801, 802, + 3511, 672, 3404, 3468, 2080, 3469, 2913, 3425, 3056, 2031, + 1116, 1543, 3369, 2835, 1747, 3392, 2011, 2738, 651, 2745, + 3303, 3251, 2795, 2699, 2800, 2797, 2796, 2794, 1114, 2799, + 2786, 3301, 2798, 2351, 873, 3043, 896, 3115, 2814, 2815, + 2013, 2645, 3291, 2150, 2385, 764, 2702, 654, 2952, 2703, + 5, 2424, 2580, 2700, 2753, 2946, 682, 3120, 2051, 1503, + 2972, 763, 762, 2697, 769, 2817, 2687, 2411, 2938, 1063, + 650, 2484, 2516, 768, 2564, 652, 39, 2054, 2035, 2113, + 2485, 2841, 2138, 2118, 928, 998, 2486, 2181, 1597, 2068, + 897, 875, 2436, 1644, 1973, 40, 2403, 38, 1978, 2055, + 2417, 2387, 1943, 1944, 1970, 2056, 1864, 1490, 1845, 1092, + 2556, 2159, 143, 2137, 2043, 2198, 1803, 2120, 2478, 1532, + 961, 956, 2453, 664, 1512, 94, 157, 1868, 1626, 2058, + 98, 99, 1352, 1470, 1280, 1822, 1633, 935, 932, 2135, + 967, 936, 964, 1743, 1725, 2109, 962, 963, 914, 1531, + 1517, 916, 887, 877, 1940, 881, 1877, 1979, 1336, 974, + 1312, 659, 10, 1106, 161, 101, 2036, 884, 1112, 1752, + 79, 9, 8, 1592, 899, 1618, 121, 883, 119, 882, + 120, 93, 126, 127, 1047, 909, 87, 885, 658, 1360, + 3328, 78, 92, 2509, 1356, 3501, 2152, 2153, 2154, 3354, + 100, 3044, 2783, 2152, 2539, 2538, 2196, 2507, 3036, 89, + 1710, 1281, 904, 908, 122, 2999, 89, 89, 641, 890, + 3452, 818, 819, 820, 588, 3355, 128, 2572, 2573, 3090, + 3350, 1000, 1281, 627, 929, 1825, 818, 819, 820, 3349, + 1810, 2008, 2009, 3090, 1017, 1018, 1019, 2239, 1022, 1023, + 1024, 1025, 2805, 1809, 1028, 1029, 1030, 1031, 1032, 1033, + 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, + 1044, 876, 923, 977, 1808, 1003, 891, 924, 184, 874, + 2, 1807, 1806, 122, 621, 3405, 642, 898, 1805, 953, + 978, 1783, 1004, 1007, 1008, 952, 644, 951, 645, 950, + 1497, 3446, 123, 2383, 2683, 627, 2185, 184, 2803, 3472, + 1466, 945, 1011, 3521, 3467, 166, 3089, 3456, 1291, 922, + 766, 767, 105, 106, 107, 954, 110, 1297, 1020, 116, + 3089, 123, 185, 145, 2809, 583, 3491, 940, 3350, 1291, + 3454, 2649, 3455, 2918, 166, 3411, 640, 2413, 2917, 621, + 2184, 122, 2532, 3304, 2352, 869, 870, 871, 872, 2529, + 3411, 880, 2183, 621, 2805, 3453, 1815, 2860, 3247, 2129, + 3246, 163, 80, 3049, 164, 156, 3050, 2802, 1002, 1001, + 646, 144, 3482, 3257, 2248, 1313, 3450, 3068, 80, 911, + 912, 618, 2123, 3057, 3333, 80, 2427, 183, 82, 3393, + 163, 3401, 3256, 164, 2178, 3067, 89, 2857, 1314, 1315, + 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1287, + 2803, 2428, 132, 133, 155, 154, 183, 1854, 3430, 621, + 2880, 1607, 2546, 2547, 1533, 2462, 1534, 3133, 2461, 604, + 1287, 2463, 2384, 1279, 80, 2806, 2809, 2010, 2074, 2246, + 89, 602, 2735, 2736, 2734, 922, 766, 767, 2075, 2076, + 2571, 2555, 1294, 2245, 1295, 1296, 89, 1109, 1082, 1050, + 867, 2039, 866, 89, 1087, 1088, 3320, 2474, 1070, 2093, + 2092, 1070, 949, 1071, 1056, 1057, 1071, 2510, 622, 1083, + 1076, 599, 2837, 621, 1069, 2949, 1068, 1046, 3473, 621, + 613, 2420, 2421, 621, 2240, 2241, 2243, 2242, 167, 2614, + 621, 635, 2868, 2866, 1791, 609, 1059, 173, 639, 3474, + 1530, 633, 89, 1474, 2557, 149, 130, 152, 137, 129, + 2842, 150, 151, 2517, 1700, 2039, 2160, 167, 2122, 2542, + 947, 915, 2199, 1099, 1021, 1101, 173, 138, 3279, 2204, + 3280, 2830, 2219, 622, 2220, 3503, 2221, 2806, 1103, 2831, + 1726, 141, 139, 134, 135, 136, 140, 622, 1085, 1086, + 1091, 1089, 1052, 131, 2559, 1108, 1084, 1077, 1701, 2838, + 1702, 1090, 142, 1098, 1100, 3038, 589, 2839, 591, 605, + 3037, 624, 2222, 623, 595, 1027, 593, 597, 606, 598, + 3231, 592, 1026, 603, 2205, 2201, 594, 607, 608, 611, + 614, 615, 616, 612, 610, 3034, 601, 625, 2163, 3094, + 2052, 958, 987, 949, 1045, 3447, 985, 996, 957, 925, + 919, 917, 958, 622, 1611, 995, 158, 2211, 2207, 2209, + 2210, 2208, 2212, 2213, 994, 993, 992, 2203, 1286, 1283, + 1284, 1285, 1290, 1292, 1289, 1472, 1288, 2037, 2038, 1066, + 948, 1072, 1073, 1074, 1075, 158, 1282, 991, 2615, 1286, + 1283, 1284, 1285, 1290, 1292, 1289, 647, 1288, 184, 2648, + 990, 989, 1096, 1477, 1110, 1111, 1097, 1282, 1049, 2202, + 984, 997, 1348, 1327, 2246, 2563, 1102, 622, 3522, 1327, + 2757, 3515, 123, 622, 933, 933, 3479, 622, 931, 3327, + 970, 585, 2508, 1338, 622, 166, 933, 3435, 1104, 3407, + 1095, 2037, 2038, 1632, 969, 1744, 2388, 2390, 3033, 868, + 2136, 910, 2560, 2189, 3407, 3433, 1330, 1331, 1332, 1333, + 2188, 1740, 1529, 153, 3439, 3440, 1344, 815, 1272, 3406, + 2858, 1014, 2755, 2756, 815, 815, 1267, 1080, 2467, 3434, + 2776, 2541, 2544, 2182, 3406, 925, 919, 917, 988, 976, + 934, 163, 986, 2511, 164, 1731, 1605, 1604, 2576, 900, + 955, 1006, 906, 906, 2260, 2950, 1048, 969, 1268, 1269, + 1334, 1005, 1603, 2527, 1741, 1601, 2126, 183, 587, 582, + 2554, 948, 3448, 2553, 146, 2180, 2476, 147, 159, 1328, + 1329, 3316, 3088, 2986, 2968, 171, 1712, 1711, 1713, 1714, + 1715, 2997, 2998, 2458, 2423, 626, 3088, 118, 2081, 83, + 1631, 1730, 2360, 1857, 3066, 1521, 2127, 159, 1429, 918, + 1061, 2807, 2808, 2125, 171, 1327, 619, 944, 2418, 1324, + 946, 2733, 893, 113, 2811, 1107, 179, 2566, 2566, 2754, + 3341, 620, 2565, 2565, 1093, 999, 2247, 3029, 88, 1878, + 975, 2757, 2600, 1498, 1500, 1362, 1358, 2128, 1359, 2531, + 1753, 2962, 1065, 1879, 88, 179, 2200, 2124, 1464, 1800, + 1737, 88, 2389, 976, 1535, 1058, 1869, 160, 165, 162, + 168, 169, 170, 172, 174, 175, 176, 177, 167, 3483, + 1478, 1481, 1465, 178, 180, 181, 182, 173, 2500, 3513, + 2902, 1055, 3514, 2530, 3512, 114, 160, 165, 162, 168, + 169, 170, 172, 174, 175, 176, 177, 1869, 1067, 2277, + 88, 2741, 178, 180, 181, 182, 1296, 949, 1480, 941, + 3129, 1013, 1484, 2807, 2808, 3004, 943, 942, 877, 1079, + 1435, 1436, 1437, 1438, 1439, 3003, 2811, 1297, 1482, 1483, + 1081, 2167, 98, 99, 1641, 918, 1465, 1295, 1296, 1727, + 1640, 1728, 1297, 1630, 1729, 2177, 2742, 1734, 2175, 1732, + 1733, 2172, 1735, 1736, 975, 2172, 1471, 987, 1458, 2179, + 969, 972, 973, 985, 933, 947, 3371, 101, 966, 970, + 2744, 1094, 1876, 3475, 1051, 976, 1319, 1320, 1322, 1321, + 1323, 1324, 889, 1638, 2987, 1064, 3517, 1754, 2739, 965, + 2176, 2252, 2253, 2254, 2174, 1297, 158, 1720, 3239, 1608, + 1609, 1610, 1827, 3238, 3229, 2755, 2756, 3523, 3079, 1624, + 1673, 3372, 2740, 1676, 2581, 1678, 1828, 1325, 1326, 1826, + 1297, 1479, 976, 3309, 1499, 1718, 3487, 1497, 1817, 1819, + 1820, 1695, 1749, 1617, 1502, 976, 876, 874, 1646, 3063, + 1647, 3064, 1649, 1651, 1468, 2746, 1655, 1657, 1659, 1661, + 1663, 3078, 1818, 1677, 3011, 3010, 1975, 1526, 1527, 3000, + 1972, 1719, 1294, 1636, 1295, 1296, 1685, 1686, 3310, 1974, + 1635, 2602, 1691, 1692, 1297, 2784, 975, 1294, 976, 1295, + 1296, 979, 969, 813, 1600, 948, 981, 1975, 2772, 1717, + 982, 980, 1634, 1634, 3524, 1614, 2482, 2583, 2044, 2045, + 1627, 2481, 1615, 1613, 3485, 1497, 1757, 818, 819, 820, + 1707, 983, 2754, 1761, 2132, 1763, 1764, 1765, 1766, 1497, + 1485, 1721, 1770, 975, 2757, 1012, 1874, 1705, 3438, 1009, + 1294, 1704, 1295, 1296, 1782, 1875, 975, 1703, 1755, 1756, + 1693, 1681, 969, 972, 973, 1687, 933, 1918, 1684, 3476, + 966, 970, 1760, 1683, 1682, 1294, 1653, 1295, 1296, 1767, + 1768, 1769, 1745, 2834, 2593, 2592, 2591, 2585, 159, 2589, + 627, 2584, 3437, 2582, 1706, 171, 122, 1271, 2587, 975, + 2994, 627, 2465, 627, 979, 969, 1606, 2586, 952, 981, + 951, 1530, 950, 982, 980, 2148, 2147, 3336, 1054, 3335, + 1060, 2146, 2145, 1062, 95, 2588, 2590, 3313, 1759, 1294, + 3312, 1295, 1296, 2144, 2143, 96, 179, 1315, 1316, 1317, + 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1781, 1297, 2409, + 3502, 1780, 3463, 1497, 1497, 2743, 1910, 1899, 1900, 1901, + 1902, 1912, 1903, 1904, 1905, 1917, 1913, 1906, 1907, 1914, + 1915, 1916, 1908, 1909, 1911, 3311, 1274, 160, 165, 162, + 168, 169, 170, 172, 174, 175, 176, 177, 2314, 3234, + 1497, 97, 3218, 178, 180, 181, 182, 1506, 1293, 1497, + 1293, 1497, 1852, 1852, 1853, 1298, 1796, 1850, 1850, 1830, + 1297, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, + 1841, 1842, 1843, 1844, 2409, 3400, 2409, 3379, 1872, 39, + 2409, 3375, 1873, 1497, 1353, 1317, 1318, 1319, 1320, 1322, + 1321, 1323, 1324, 1507, 3217, 1313, 1297, 2575, 3362, 1497, + 1497, 1821, 3128, 1823, 1301, 1302, 1303, 1304, 1305, 1306, + 1307, 1299, 3126, 1338, 3075, 2875, 1936, 1831, 1314, 1315, + 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 3329, + 1870, 3047, 3326, 1294, 1463, 1295, 1296, 104, 3242, 1497, + 1932, 2409, 3230, 104, 1968, 3477, 2961, 1462, 103, 1461, + 102, 1464, 3047, 1497, 103, 1297, 102, 2409, 3045, 97, + 3008, 2993, 1824, 2843, 1297, 1788, 1789, 2840, 1799, 1997, + 1982, 2172, 1497, 79, 1981, 1465, 2775, 1797, 1798, 1313, + 2747, 1497, 2966, 1497, 2751, 2774, 1498, 2004, 1980, 2325, + 1497, 2750, 2491, 2765, 2764, 1294, 2479, 1295, 1296, 1460, + 1829, 2316, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, + 1321, 1323, 1324, 1297, 2761, 2762, 95, 1971, 1497, 3265, + 2028, 2405, 1297, 97, 1497, 2752, 1856, 96, 2761, 2760, + 2748, 1294, 2194, 1295, 1296, 2749, 97, 1863, 1865, 3417, + 1497, 1297, 2433, 1497, 1313, 1297, 2259, 2193, 2021, 3324, + 2022, 1880, 1881, 1882, 1883, 2034, 2274, 2016, 2246, 2540, + 1985, 1986, 1982, 1596, 2521, 1894, 2049, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 2090, 1784, + 1980, 2454, 1497, 2514, 2515, 98, 99, 2409, 2408, 2454, + 1294, 1750, 1295, 1296, 2270, 1525, 3264, 3415, 1497, 1294, + 1716, 1295, 1296, 2270, 1497, 98, 99, 3226, 1513, 1313, + 1855, 1497, 3222, 1542, 1708, 1698, 1694, 1690, 1984, 1689, + 2133, 1987, 1988, 1688, 1508, 3413, 1497, 3221, 2027, 2273, + 2062, 2425, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, + 1321, 1323, 1324, 1105, 2455, 1599, 1596, 1595, 1294, 3055, + 1295, 1296, 2455, 103, 2457, 890, 2085, 1294, 2015, 1295, + 1296, 2425, 2246, 2099, 2100, 2101, 2102, 2094, 1297, 2095, + 2096, 2097, 2098, 2432, 2066, 2026, 1294, 2003, 1295, 1296, + 1294, 2728, 1295, 1296, 2029, 2105, 2106, 2107, 2108, 2698, + 2304, 2246, 2088, 1541, 1540, 2161, 1679, 2084, 2518, 2047, + 2961, 2115, 2496, 2433, 2173, 2089, 1293, 2071, 2121, 2072, + 2070, 2963, 3367, 3340, 2409, 2433, 1297, 2922, 2087, 2086, + 923, 2763, 1293, 2671, 1313, 924, 1297, 1309, 2433, 1310, + 1930, 1724, 2073, 2961, 2270, 2325, 2301, 2300, 2158, 2172, + 1941, 2155, 2131, 1311, 1325, 1326, 1308, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 2042, 1501, + 2006, 2116, 2172, 1758, 2111, 2112, 1297, 1855, 2130, 1801, + 1762, 1739, 1751, 1528, 879, 2134, 2142, 960, 959, 89, + 3443, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1297, 2166, + 3012, 2186, 2169, 3382, 2170, 977, 2116, 2165, 2164, 2168, + 3288, 1497, 1297, 1294, 3253, 1295, 1296, 1504, 2005, 2787, + 3286, 1497, 978, 2312, 1941, 1297, 3219, 3140, 3028, 2187, + 2190, 3025, 1634, 3006, 2191, 2192, 1314, 1315, 1316, 1317, + 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1669, 2885, 2884, + 2267, 3013, 3014, 3015, 1297, 2488, 1598, 2114, 1297, 1050, + 2266, 1294, 89, 1295, 1296, 2232, 2233, 2832, 1297, 2789, + 2235, 1294, 2785, 1295, 1296, 2522, 2110, 2104, 2103, 2236, + 2197, 3016, 3283, 1497, 1723, 1297, 2256, 2263, 2258, 1629, + 2265, 2268, 1625, 1594, 2271, 2836, 2272, 1497, 1670, 1671, + 1672, 2279, 3254, 115, 2129, 2281, 2282, 2283, 1982, 3269, + 1497, 1294, 1981, 1295, 1296, 2289, 2290, 2291, 2292, 2293, + 2294, 2295, 2296, 2297, 2298, 2225, 2264, 2979, 3017, 3018, + 3019, 1823, 2487, 1294, 2019, 1295, 1296, 1786, 2937, 1497, + 1297, 2262, 2930, 1497, 2257, 3497, 1297, 1294, 3495, 1295, + 1296, 2305, 2306, 2307, 2308, 2309, 3470, 2311, 2978, 3348, + 1294, 2313, 1295, 1296, 3274, 2318, 2319, 2976, 2320, 2927, + 1497, 2323, 2781, 2324, 2780, 1804, 2244, 2327, 2973, 2974, + 2488, 2331, 2779, 2698, 2501, 2336, 2337, 2338, 2339, 1294, + 1824, 1295, 1296, 1294, 2226, 1295, 1296, 2717, 2350, 1787, + 2353, 2354, 2255, 1294, 2716, 1295, 1296, 3344, 2356, 2358, + 1811, 1812, 1813, 1814, 3255, 2361, 2362, 2363, 2364, 2365, + 1294, 2033, 1295, 1296, 2925, 1497, 2372, 2373, 1505, 2374, + 2890, 1497, 2377, 2379, 2028, 2276, 2381, 2438, 2441, 2442, + 2443, 2439, 2967, 2440, 2444, 2720, 2393, 2973, 2974, 2718, + 2721, 1852, 2394, 2025, 2719, 2722, 1850, 2442, 2443, 1858, + 1859, 2676, 1297, 2675, 1861, 2954, 906, 906, 1866, 3308, + 2688, 2690, 1871, 2953, 3119, 1294, 3121, 1295, 1296, 2691, + 1510, 1294, 2957, 1295, 1296, 1884, 1885, 1886, 1887, 1888, + 1889, 1890, 1891, 1892, 1893, 2392, 2685, 1738, 2310, 1919, + 1920, 1921, 1922, 1923, 1924, 1926, 3110, 1931, 3109, 1933, + 1934, 1935, 865, 1937, 1938, 1939, 2759, 1945, 1946, 1947, + 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, + 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, + 1665, 1969, 2429, 1976, 1977, 906, 1509, 906, 906, 906, + 906, 906, 2395, 2410, 2397, 2472, 3108, 1989, 1990, 1991, + 1992, 1993, 1994, 1995, 1996, 39, 1998, 1999, 2000, 2001, + 2002, 2492, 1297, 894, 2447, 2406, 1471, 2449, 2448, 2419, + 2382, 895, 1878, 1016, 1015, 2851, 1297, 1666, 1667, 1668, + 2487, 1297, 2402, 2569, 2407, 1297, 1879, 1294, 1465, 1295, + 1296, 95, 95, 1270, 906, 2528, 2513, 2422, 97, 123, + 2046, 1297, 96, 96, 2475, 2477, 2959, 1297, 2050, 97, + 2053, 3509, 2452, 1804, 1495, 1491, 2040, 2041, 2284, 1297, + 2456, 2044, 2045, 2459, 3422, 2537, 104, 2777, 2229, 1492, + 3325, 3249, 2121, 2758, 2466, 2299, 2469, 103, 2490, 102, + 2468, 1297, 2079, 2493, 2494, 2446, 2873, 1497, 97, 1297, + 2030, 902, 903, 2480, 2023, 2024, 1494, 2218, 1493, 1297, + 2380, 1497, 2217, 1297, 2535, 2378, 1497, 2489, 2216, 2357, + 1497, 2674, 2215, 2214, 2939, 1297, 799, 2250, 2497, 2673, + 2498, 102, 104, 2502, 2503, 2504, 3030, 3296, 3295, 3277, + 2534, 2340, 1497, 103, 103, 102, 1297, 1294, 1617, 1295, + 1296, 2117, 3127, 2332, 1497, 2604, 2605, 2606, 2607, 2608, + 2579, 1294, 3116, 1295, 1296, 3125, 1294, 1297, 1295, 1296, + 1294, 3124, 1295, 1296, 2613, 3260, 2523, 2524, 2533, 189, + 1297, 3117, 189, 2981, 3026, 632, 1294, 2958, 1295, 1296, + 638, 2956, 1294, 2932, 1295, 1296, 1297, 2928, 2790, 2594, + 189, 2156, 1612, 901, 1294, 2947, 1295, 1296, 2558, 2900, + 2577, 2425, 104, 3098, 2609, 189, 2578, 2405, 3499, 3498, + 3498, 2567, 2561, 103, 2568, 2616, 1294, 2302, 1295, 1296, + 2896, 2017, 1297, 1522, 1294, 1514, 1295, 1296, 3499, 1297, + 638, 189, 638, 3314, 1294, 1297, 1295, 1296, 1294, 2992, + 1295, 1296, 2483, 108, 109, 892, 2595, 2597, 3, 1804, + 1294, 91, 1295, 1296, 2882, 1, 2206, 2996, 2650, 2655, + 1495, 1491, 3432, 600, 2007, 2223, 2224, 1469, 2652, 2228, + 2881, 1294, 3471, 1295, 1296, 1492, 3428, 1297, 2231, 3429, + 1709, 1699, 3058, 1942, 3250, 2234, 2793, 1971, 2162, 1971, + 3024, 2707, 1294, 2618, 1295, 1296, 2119, 968, 148, 2624, + 1488, 1489, 1494, 2082, 1493, 1294, 2878, 1295, 1296, 2725, + 1297, 2237, 2083, 2376, 2634, 2635, 2636, 2637, 2638, 2375, + 3395, 1294, 2655, 1295, 1296, 2678, 2710, 112, 2654, 926, + 2651, 2695, 2653, 111, 971, 1078, 2157, 3048, 2727, 1749, + 2473, 2091, 1547, 2701, 1545, 1546, 1544, 1549, 2701, 2062, + 1548, 2859, 2303, 2679, 2901, 2670, 1790, 1294, 2666, 1295, + 1296, 2371, 634, 2704, 1294, 2445, 1295, 1296, 628, 2677, + 1294, 186, 1295, 1296, 881, 1536, 1515, 2062, 2062, 2062, + 2062, 2062, 2914, 1010, 2680, 2692, 2693, 590, 2766, 2195, + 596, 1345, 1785, 2672, 2370, 2709, 883, 2062, 882, 2460, + 2062, 2729, 2813, 2711, 2730, 921, 2714, 2723, 98, 99, + 2712, 2713, 1294, 2715, 1295, 1296, 2278, 2731, 2667, 2668, + 2669, 913, 2018, 2396, 920, 3227, 2706, 2285, 2286, 2287, + 2288, 2951, 2684, 2792, 2686, 2853, 2412, 2769, 2689, 2682, + 3307, 2767, 2768, 2770, 2771, 1294, 3118, 1295, 1296, 1297, + 2596, 3380, 2470, 1511, 2921, 2870, 2871, 2872, 1297, 2874, + 2876, 2820, 2821, 1297, 2737, 2275, 1867, 1297, 1335, 2791, + 2059, 3093, 1353, 2883, 2121, 2812, 2827, 1297, 2887, 2888, + 2889, 2891, 2892, 2893, 2894, 1816, 656, 2895, 655, 2897, + 2898, 2899, 1297, 653, 2903, 2904, 2905, 2906, 2907, 2908, + 2909, 2910, 2911, 2912, 2847, 2398, 2846, 2849, 2850, 2626, + 2844, 2628, 2919, 2426, 1300, 2923, 2854, 2924, 2926, 803, + 2929, 2931, 2855, 2933, 2934, 2935, 2936, 2639, 2640, 2641, + 2642, 2942, 2386, 2369, 1523, 2864, 2437, 2435, 2434, 2227, + 2861, 2862, 2368, 2863, 1297, 2067, 2865, 2367, 2867, 2916, + 2869, 2366, 2975, 1297, 2971, 3424, 2920, 2061, 2057, 1297, + 2404, 2355, 754, 753, 665, 1297, 2964, 2965, 657, 649, + 2969, 752, 751, 2989, 2819, 1297, 2349, 3408, 2543, 2833, + 2545, 1297, 2471, 2829, 1294, 1278, 1295, 1296, 1487, 1513, + 643, 2451, 939, 1294, 2856, 1295, 1296, 3331, 1294, 2945, + 1295, 1296, 1294, 1297, 1295, 1296, 2249, 2940, 2941, 2879, + 1486, 1297, 1294, 1897, 1295, 1296, 1898, 3338, 2801, 3042, + 2948, 2782, 2519, 2955, 2149, 65, 43, 1294, 2348, 1295, + 1296, 1297, 2970, 2960, 3302, 3368, 2943, 2347, 1297, 750, + 747, 3095, 1297, 2346, 3096, 2977, 3097, 2646, 2647, 2345, + 3351, 2984, 2985, 3352, 2980, 1297, 2982, 746, 3353, 2344, + 1925, 2499, 1275, 3445, 1792, 2343, 1297, 90, 2990, 3031, + 3032, 1297, 2062, 2820, 2821, 3046, 2983, 2991, 34, 1294, + 33, 1295, 1296, 32, 31, 30, 25, 2342, 1294, 24, + 1295, 1296, 3052, 3053, 1294, 2341, 1295, 1296, 23, 189, + 1294, 189, 1295, 1296, 189, 1297, 22, 3001, 3002, 3007, + 1294, 3009, 1295, 1296, 21, 2335, 1294, 3065, 1295, 1296, + 3069, 27, 2334, 1297, 20, 19, 2333, 2548, 2549, 2550, + 2551, 2552, 18, 2804, 638, 3466, 638, 638, 1294, 2330, + 1295, 1296, 3508, 117, 52, 49, 1294, 3080, 1295, 1296, + 2329, 1804, 2562, 47, 125, 2328, 638, 189, 3054, 3035, + 124, 50, 3084, 3039, 3040, 3041, 1294, 46, 1295, 1296, + 1053, 44, 2570, 1294, 3092, 1295, 1296, 1294, 29, 1295, + 1296, 28, 3099, 17, 1340, 16, 3074, 15, 14, 2326, + 1294, 13, 1295, 1296, 12, 11, 7, 6, 2574, 37, + 36, 1294, 35, 1295, 1296, 1795, 1294, 2322, 1295, 1296, + 26, 3070, 2438, 2441, 2442, 2443, 2439, 906, 2440, 2444, + 2598, 2599, 4, 1297, 2601, 3091, 2506, 2603, 2151, 3113, + 0, 0, 0, 0, 0, 0, 1297, 0, 0, 0, + 1294, 0, 1295, 1296, 1297, 1852, 3142, 2610, 2611, 2612, + 1850, 0, 0, 0, 0, 0, 0, 0, 1294, 2617, + 1295, 1296, 2619, 2620, 2621, 0, 0, 0, 2622, 2623, + 3123, 3114, 1945, 2625, 0, 3138, 2627, 2701, 3122, 2629, + 2630, 2631, 2632, 3132, 3136, 3130, 3134, 2633, 1945, 1945, + 1945, 1945, 1945, 0, 1297, 0, 0, 0, 2704, 0, + 0, 0, 2704, 3241, 3143, 3144, 906, 2321, 3228, 39, + 3146, 0, 3248, 2656, 2657, 2658, 2659, 2660, 2661, 0, + 2317, 1297, 2662, 2663, 0, 2664, 1340, 2665, 2315, 0, + 0, 0, 3258, 3259, 3224, 3261, 0, 3262, 3263, 0, + 3225, 0, 3266, 3267, 3268, 0, 3270, 3273, 3271, 0, + 3223, 3272, 3240, 0, 1852, 3275, 3252, 3245, 1294, 1850, + 1295, 1296, 3282, 3284, 3285, 3287, 3289, 3290, 3292, 3232, + 3244, 1294, 2696, 1295, 1296, 0, 0, 0, 2280, 1294, + 0, 1295, 1296, 189, 0, 0, 0, 638, 638, 0, + 0, 0, 3235, 3236, 3237, 0, 0, 2726, 3276, 0, + 0, 0, 0, 189, 0, 2269, 3322, 3278, 0, 0, + 0, 3281, 0, 0, 0, 0, 0, 0, 0, 0, + 3318, 0, 3300, 638, 3297, 3298, 189, 2778, 3299, 1294, + 0, 1295, 1296, 0, 0, 0, 0, 0, 638, 0, + 0, 0, 0, 0, 189, 3317, 0, 0, 3321, 0, + 3315, 0, 0, 2816, 0, 0, 1294, 2788, 1295, 1296, + 0, 0, 0, 0, 0, 0, 0, 2828, 2704, 0, + 0, 0, 0, 0, 0, 0, 0, 3082, 0, 0, + 0, 638, 0, 0, 0, 0, 2845, 0, 0, 2848, + 0, 0, 0, 0, 1340, 0, 0, 0, 0, 3323, + 638, 638, 0, 638, 0, 638, 638, 0, 638, 638, + 638, 638, 638, 638, 0, 0, 0, 0, 0, 0, + 0, 1340, 0, 0, 1340, 638, 1340, 189, 0, 0, + 0, 0, 3347, 3342, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3334, 189, 3337, 2877, 0, 0, 3363, 0, 0, 0, 0, 0, 3364, 3365, + 638, 0, 189, 2886, 0, 0, 3330, 0, 0, 0, + 3339, 0, 0, 0, 0, 0, 638, 0, 189, 0, + 3376, 0, 3357, 0, 0, 3358, 0, 0, 0, 0, + 0, 0, 0, 39, 189, 0, 0, 0, 2944, 0, + 0, 189, 3366, 0, 0, 0, 3402, 3403, 3373, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 638, + 3412, 3414, 3416, 3409, 0, 3410, 0, 0, 3378, 3383, + 2701, 3386, 3394, 3391, 3388, 3387, 3385, 0, 3390, 3252, + 3397, 3389, 0, 0, 0, 3444, 3381, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3420, 0, + 0, 0, 0, 3423, 0, 0, 0, 3441, 3431, 39, + 3436, 0, 0, 0, 0, 3409, 0, 3410, 3451, 0, + 0, 0, 0, 3005, 3449, 3462, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3306, 0, + 1348, 0, 3020, 0, 3460, 3021, 3022, 3023, 3465, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3484, 3486, + 3488, 0, 0, 3478, 0, 0, 0, 0, 3481, 1749, + 1852, 3493, 3027, 3480, 0, 1850, 0, 0, 3489, 0, + 3492, 3490, 0, 3496, 3494, 0, 0, 0, 0, 0, + 3507, 0, 0, 3409, 0, 3410, 3504, 0, 0, 0, + 0, 3510, 0, 0, 0, 3051, 3519, 3520, 0, 3518, + 3516, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 638, 1852, 3525, 3526, 3527, 3528, + 1850, 638, 3272, 0, 0, 0, 189, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3071, 0, 3072, 0, 0, 3073, 0, 0, 3076, 3077, + 0, 0, 0, 0, 0, 0, 0, 3081, 0, 0, + 0, 0, 0, 0, 638, 0, 0, 3083, 0, 0, + 3346, 0, 0, 0, 1340, 0, 0, 0, 3356, 0, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 3100, + 0, 1340, 3101, 0, 3102, 3103, 0, 3104, 0, 3105, + 0, 0, 0, 0, 3106, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 638, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3139, 0, 0, 3141, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3145, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1983, 0, 0, 0, + 0, 0, 0, 3220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3330, 0, 0, 0, 0, 3357, - 3376, 0, 3358, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3366, 0, 0, 39, 0, 0, 3401, 3402, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3373, 0, - 3411, 3413, 3415, 3381, 3408, 3409, 0, 3383, 3386, 3394, - 3391, 3388, 3387, 3385, 3390, 3389, 2701, 0, 0, 0, - 0, 0, 0, 3252, 3396, 3443, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3419, 0, 0, 0, 3345, - 0, 0, 0, 3422, 3440, 3430, 3435, 0, 0, 0, - 0, 0, 0, 1340, 0, 3408, 3409, 3449, 0, 39, - 0, 3447, 3359, 0, 3460, 3360, 1348, 3361, 0, 0, - 0, 0, 0, 3378, 0, 0, 0, 0, 3458, 0, - 3463, 0, 0, 0, 1804, 0, 0, 0, 0, 3462, - 0, 0, 0, 0, 0, 0, 3481, 3483, 3485, 1564, - 0, 3478, 3476, 0, 0, 0, 0, 0, 0, 3487, - 189, 0, 0, 3491, 638, 638, 3486, 3493, 0, 0, - 0, 0, 0, 1852, 0, 1850, 0, 3504, 3490, 0, - 189, 3408, 3409, 3501, 3489, 0, 3507, 0, 3306, 0, - 0, 0, 3515, 3516, 3517, 3513, 0, 0, 0, 0, - 638, 0, 0, 189, 0, 0, 0, 0, 0, 0, - 0, 3441, 0, 0, 3523, 638, 3524, 3525, 3272, 0, - 0, 189, 0, 0, 0, 0, 0, 1852, 0, 1850, - 0, 0, 3522, 0, 0, 0, 0, 0, 0, 0, - 0, 3455, 0, 3456, 0, 3457, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1340, 0, 0, 0, 0, 0, 638, 638, 0, - 638, 0, 638, 638, 0, 638, 638, 638, 638, 638, - 638, 0, 0, 1552, 0, 0, 0, 0, 1340, 0, - 0, 1340, 638, 1340, 189, 0, 184, 0, 0, 0, - 0, 3502, 0, 3503, 0, 0, 0, 2512, 0, 0, - 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, - 123, 0, 145, 0, 0, 0, 0, 638, 0, 189, - 3346, 0, 0, 166, 0, 0, 0, 0, 3356, 0, - 0, 0, 0, 638, 0, 189, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2046, - 0, 189, 0, 0, 156, 0, 1565, 2050, 189, 2053, - 144, 0, 1804, 0, 0, 0, 0, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 638, 0, 1564, 163, - 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1620, 1621, 155, 154, 183, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1578, 1581, 1582, 1583, 1584, - 1585, 1586, 0, 1587, 1588, 1589, 1590, 1591, 1566, 1567, - 1568, 1569, 1550, 1551, 1579, 0, 1553, 0, 1554, 1555, - 1556, 1557, 1558, 1559, 1560, 1561, 1562, 0, 0, 1563, - 1570, 1571, 1572, 1573, 0, 1574, 1575, 1576, 1577, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 814, - 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 149, 1622, 152, 0, 1619, 0, - 150, 151, 0, 0, 0, 0, 167, 0, 0, 0, - 0, 0, 1552, 0, 0, 173, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 638, 638, 0, 0, 0, 0, 0, 0, 638, 878, - 0, 81, 0, 189, 0, 0, 0, 0, 1804, 0, - 0, 0, 0, 0, 0, 2206, 0, 0, 0, 0, - 878, 0, 0, 0, 2223, 2224, 0, 0, 2228, 0, - 0, 0, 0, 0, 0, 938, 0, 2231, 0, 0, - 0, 0, 0, 0, 2234, 0, 0, 0, 0, 1580, - 0, 638, 0, 0, 0, 1565, 0, 0, 0, 0, - 0, 1340, 0, 0, 0, 0, 0, 0, 0, 0, - 2237, 0, 638, 0, 0, 0, 0, 0, 1340, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, - 0, 0, 0, 638, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1578, 1581, 1582, 1583, 1584, 1585, - 1586, 0, 1587, 1588, 1589, 1590, 1591, 1566, 1567, 1568, - 1569, 1550, 1551, 1579, 0, 1553, 0, 1554, 1555, 1556, - 1557, 1558, 1559, 1560, 1561, 1562, 0, 0, 1563, 1570, - 1571, 1572, 1573, 1983, 1574, 1575, 1576, 1577, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, + 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 189, 0, 0, 0, 638, 0, 0, 1983, 189, + 0, 189, 0, 189, 189, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, + 0, 0, 0, 3305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 0, 0, 638, 0, - 0, 0, 0, 146, 0, 0, 147, 0, 189, 0, - 0, 0, 638, 0, 0, 1983, 189, 0, 189, 0, - 189, 189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 638, 159, 0, 0, 0, - 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1580, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 2451, 0, 0, 638, 0, 160, 165, 162, 168, 169, - 170, 172, 174, 175, 176, 177, 0, 0, 0, 0, - 0, 178, 180, 181, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3164, 3166, 3165, 3183, 3184, 3185, + 3186, 3187, 3188, 3189, 704, 0, 0, 0, 798, 0, + 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 638, 0, 0, 0, 638, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2499, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, - 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, - 0, 0, 0, 189, 189, 0, 0, 189, 0, 189, + 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, + 3343, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 0, 0, 0, 0, 638, 0, + 0, 0, 638, 638, 0, 0, 0, 3345, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 637, 0, 0, 0, 0, 0, + 3359, 0, 0, 3360, 0, 3361, 0, 0, 0, 0, + 189, 0, 0, 0, 0, 0, 0, 189, 0, 0, + 0, 0, 0, 0, 0, 0, 189, 189, 0, 0, + 189, 0, 189, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, - 0, 0, 0, 189, 0, 0, 2548, 2549, 2550, 2551, - 2552, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 1804, 2562, 0, 0, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2570, 0, 0, 0, 0, 0, 1113, 0, 1113, - 1113, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1340, - 0, 1983, 0, 0, 0, 0, 878, 1337, 1342, 1343, - 0, 1346, 0, 1347, 1349, 1350, 1351, 0, 1354, 1355, - 1357, 1357, 0, 1357, 1361, 1361, 1363, 1364, 1365, 1366, - 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, - 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, - 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, - 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, - 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, - 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, - 1427, 0, 0, 0, 0, 1428, 0, 1430, 1431, 1432, - 1433, 1434, 0, 0, 0, 0, 0, 0, 0, 0, - 1361, 1361, 1361, 1361, 1361, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1440, 1441, 1442, 1443, 1444, 1445, - 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 0, 0, 0, 0, 1467, 0, 0, 189, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, - 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 1616, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 123, 0, 145, - 0, 0, 0, 0, 189, 0, 2778, 0, 1473, 189, - 166, 0, 0, 0, 878, 0, 0, 0, 878, 0, - 0, 0, 0, 0, 878, 0, 0, 0, 0, 0, - 0, 0, 2816, 0, 0, 0, 0, 0, 0, 0, - 0, 156, 0, 0, 0, 0, 2828, 144, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2845, 163, 0, 2848, 164, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 189, - 0, 0, 0, 0, 0, 0, 189, 0, 1620, 1621, - 155, 154, 183, 0, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1340, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 189, 189, 189, 189, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 189, 0, 0, 0, 0, 0, 0, 2944, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 149, 1622, 152, 0, 1619, 0, 150, 151, 0, - 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, - 0, 638, 173, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1113, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 3005, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3020, 0, 0, 3021, 3022, 3023, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, - 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 41, - 42, 82, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 158, 0, 0, 0, 638, 0, 0, 86, 0, - 798, 0, 45, 71, 72, 0, 69, 73, 0, 189, - 0, 0, 0, 638, 0, 70, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 0, 1340, 0, 0, 638, 638, 1340, 189, 189, 189, - 189, 189, 0, 0, 58, 0, 0, 0, 0, 189, - 0, 0, 0, 0, 0, 189, 89, 189, 617, 0, - 189, 189, 189, 0, 637, 0, 1113, 1113, 0, 153, - 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 637, 0, 638, 0, - 0, 1340, 0, 0, 0, 0, 638, 0, 0, 0, - 146, 189, 0, 147, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 159, 189, 0, 0, 189, 0, 0, - 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 189, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 48, 51, 54, 53, 56, 0, - 68, 0, 0, 77, 74, 0, 0, 0, 0, 0, - 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 57, 85, 84, 0, - 0, 66, 67, 55, 0, 0, 0, 0, 0, 75, - 76, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 0, 0, 160, 165, 162, 168, 169, 170, 172, 174, - 175, 176, 177, 0, 0, 0, 0, 0, 178, 180, - 181, 182, 0, 0, 0, 0, 189, 0, 0, 0, - 59, 60, 0, 61, 62, 63, 64, 0, 0, 0, + 0, 0, 3170, 0, 0, 0, 0, 0, 0, 3442, + 0, 0, 0, 0, 0, 0, 0, 3178, 3179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3457, 0, 3458, 0, 3459, 0, 0, 0, 0, 0, + 0, 0, 1340, 0, 1983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2060, 0, 0, 0, - 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 770, + 0, 683, 774, 685, 771, 772, 0, 681, 684, 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3505, 0, 3506, 702, 703, 3163, 3167, 3168, + 3169, 3180, 3181, 3182, 3190, 3192, 735, 3191, 3193, 3194, + 3195, 3198, 3199, 3200, 3201, 3196, 3197, 3202, 3147, 3151, + 3148, 3149, 3150, 3162, 3152, 3153, 3154, 3155, 3156, 3157, + 3158, 3159, 3160, 3161, 3203, 3204, 3205, 3206, 3207, 3208, + 3173, 3177, 3176, 3174, 3175, 3171, 3172, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 775, + 0, 776, 0, 0, 780, 816, 0, 1975, 782, 781, + 817, 783, 749, 748, 0, 3464, 777, 778, 0, 779, + 1851, 0, 0, 189, 0, 1564, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 0, 0, 189, 189, 189, 0, 0, 0, 0, - 0, 0, 0, 638, 638, 0, 938, 0, 89, 0, - 0, 816, 0, 0, 0, 804, 817, 818, 819, 820, - 805, 0, 83, 806, 807, 0, 808, 0, 0, 3343, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 938, - 813, 821, 822, 0, 0, 0, 0, 0, 0, 0, - 638, 638, 638, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 0, 0, 2822, 2823, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, - 638, 2824, 638, 0, 0, 0, 0, 0, 0, 0, - 0, 816, 0, 1975, 0, 0, 817, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1851, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2251, 0, 0, 637, 1266, - 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, - 637, 0, 0, 2825, 2826, 189, 0, 0, 638, 0, - 0, 0, 0, 0, 2261, 0, 0, 0, 0, 0, - 0, 638, 0, 0, 0, 0, 0, 0, 1339, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 638, 0, 0, 0, 638, 638, 0, 0, 0, - 0, 0, 0, 0, 770, 0, 0, 774, 0, 771, - 772, 0, 0, 0, 773, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, + 0, 0, 189, 0, 3209, 3210, 3211, 3212, 3213, 3214, + 3215, 3216, 0, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 638, 0, 0, 0, + 0, 2512, 189, 0, 0, 0, 0, 0, 0, 189, + 0, 0, 0, 0, 123, 0, 145, 0, 0, 1552, + 0, 0, 0, 638, 0, 0, 0, 166, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1340, 0, 0, 156, 0, + 0, 0, 0, 0, 144, 0, 0, 0, 189, 189, + 189, 189, 189, 0, 0, 0, 637, 1266, 637, 637, + 0, 0, 0, 163, 0, 0, 164, 0, 0, 0, + 0, 0, 189, 189, 0, 0, 0, 0, 637, 0, + 0, 0, 1565, 0, 0, 1620, 1621, 155, 154, 183, + 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1339, 0, 0, 0, + 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2359, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1578, 1581, 1582, 1583, 1584, 1585, 1586, 0, 1587, + 1588, 1589, 1590, 1591, 1566, 1567, 1568, 1569, 1550, 1551, + 1579, 638, 1553, 0, 1554, 1555, 1556, 1557, 1558, 1559, + 1560, 1561, 1562, 0, 0, 1563, 1570, 1571, 1572, 1573, + 0, 1574, 1575, 1576, 1577, 0, 0, 0, 149, 1622, + 152, 0, 1619, 0, 150, 151, 0, 0, 0, 638, + 167, 0, 0, 0, 0, 0, 0, 638, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1339, 0, 2391, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 878, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, - 0, 2430, 2431, 0, 0, 0, 0, 638, 189, 0, - 2060, 0, 0, 878, 2450, 0, 0, 0, 0, 0, - 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 930, - 0, 937, 0, 0, 0, 0, 0, 637, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1340, 0, - 638, 0, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1593, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1602, 0, 638, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 638, 1628, 0, 0, - 0, 0, 0, 2526, 0, 1637, 0, 0, 1339, 1639, - 189, 638, 1642, 1643, 637, 637, 0, 637, 0, 637, - 637, 0, 637, 637, 637, 637, 637, 637, 0, 0, - 0, 0, 0, 0, 0, 1339, 1674, 1675, 1339, 637, - 1339, 0, 1680, 0, 0, 0, 0, 0, 89, 0, - 0, 816, 0, 0, 638, 804, 817, 818, 819, 820, - 805, 0, 0, 806, 807, 0, 808, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 638, 0, 0, 0, - 813, 821, 822, 0, 0, 0, 0, 1742, 0, 0, - 637, 0, 0, 638, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2822, 2823, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 0, 2643, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 816, 0, - 0, 2824, 0, 817, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1851, 0, 2060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2705, 0, - 81, 0, 0, 2060, 2060, 2060, 2060, 2060, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2060, 0, 0, 2060, 0, 0, 0, - 0, 0, 0, 2825, 2826, 0, 0, 637, 637, 0, - 0, 0, 0, 0, 0, 637, 823, 824, 825, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, - 857, 858, 859, 860, 861, 862, 863, 864, 0, 2810, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 2818, + 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1339, 0, - 0, 0, 0, 0, 0, 0, 0, 1860, 0, 637, - 0, 0, 0, 0, 0, 1339, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 189, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1115, 0, 1115, 1115, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1273, 0, 0, 0, 0, + 638, 0, 0, 0, 1340, 0, 0, 638, 638, 1340, + 189, 189, 189, 189, 189, 0, 0, 0, 0, 0, + 0, 0, 189, 0, 0, 0, 0, 0, 189, 0, + 189, 0, 0, 189, 189, 189, 0, 0, 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1580, 0, 0, 158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 637, 0, 0, 189, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 637, 638, 0, 0, 1340, 0, 0, 0, 0, 638, + 1593, 0, 0, 0, 189, 0, 0, 0, 0, 0, + 1602, 0, 0, 0, 0, 0, 0, 0, 189, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 637, 0, 1628, 153, 189, 0, 0, + 189, 0, 0, 1637, 0, 0, 1339, 1639, 0, 0, + 1642, 1643, 637, 637, 0, 637, 0, 637, 637, 0, + 637, 637, 637, 637, 637, 637, 0, 0, 0, 0, + 0, 0, 0, 1339, 1674, 1675, 1339, 637, 1339, 0, + 1680, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 1742, 0, 0, 637, 0, + 159, 0, 0, 0, 0, 0, 0, 171, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 0, 0, 637, 0, 0, 0, 0, 0, 2060, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2988, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 0, 0, 2139, 2140, 2141, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, - 637, 1637, 0, 0, 1637, 0, 1637, 0, 0, 0, - 0, 0, 2171, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1475, 1476, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 637, 0, 0, 0, 637, 637, 0, 0, - 0, 0, 1519, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1537, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3107, 0, - 3111, 3112, 0, 0, 0, 0, 0, 0, 0, 0, - 930, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2705, 0, 81, 0, 2705, 0, 1645, - 1645, 0, 1645, 0, 1645, 1645, 0, 1654, 1645, 1645, - 1645, 1645, 1645, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 0, 0, 930, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1722, - 0, 0, 0, 0, 3233, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1746, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1339, 0, 637, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1115, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 637, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, + 165, 162, 168, 169, 170, 172, 174, 175, 176, 177, + 0, 0, 0, 0, 189, 178, 180, 181, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 189, 0, 0, 189, 189, 189, 0, + 1616, 0, 0, 0, 0, 0, 638, 638, 0, 0, + 0, 0, 0, 123, 814, 145, 0, 81, 0, 0, + 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 638, 638, 638, 156, 0, 0, + 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, + 0, 0, 1564, 0, 0, 637, 637, 0, 0, 0, + 0, 0, 163, 637, 0, 164, 0, 0, 0, 0, + 0, 0, 0, 0, 878, 0, 81, 0, 0, 0, + 0, 0, 0, 0, 1620, 1621, 155, 154, 183, 0, + 0, 0, 0, 0, 0, 878, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 938, 0, 0, 0, 0, 0, 637, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1339, 0, 0, 0, + 0, 0, 0, 0, 0, 1860, 0, 637, 0, 189, + 0, 0, 0, 1339, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1340, 0, + 0, 0, 0, 638, 0, 638, 0, 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2705, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1363, 1364, 1365, - 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, - 1376, 1377, 1378, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, - 1409, 1410, 1411, 1413, 1414, 1415, 1416, 1417, 1418, 1419, - 1420, 1421, 1422, 1440, 1441, 1442, 1443, 1444, 1445, 1446, - 1447, 1448, 1449, 1450, 1451, 1452, 1453, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 149, 1622, 152, + 0, 1619, 0, 150, 151, 0, 1552, 0, 0, 167, + 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, + 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, - 0, 3332, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, - 0, 0, 1115, 1115, 0, 0, 0, 0, 0, 0, - 1793, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2464, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1846, 0, 0, 0, 0, 0, 0, - 3377, 0, 0, 0, 0, 81, 0, 0, 0, 756, - 637, 0, 0, 0, 1862, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 0, 0, 637, 1895, 1896, 0, 1637, 1637, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 187, 0, 0, 586, 0, 0, 0, 1339, - 2536, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1115, 0, 0, 888, 0, - 0, 3459, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 907, 907, 0, 0, 0, - 0, 0, 0, 0, 586, 3164, 3166, 3165, 3183, 3184, - 3185, 3186, 3187, 3188, 3189, 704, 0, 0, 0, 0, - 0, 0, 0, 2020, 0, 0, 0, 0, 637, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1519, 0, 0, 1115, 0, 0, - 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 930, 0, 0, + 0, 0, 0, 0, 638, 0, 0, 637, 638, 638, + 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 158, 0, 0, + 637, 0, 0, 0, 0, 0, 0, 638, 1578, 1581, + 1582, 1583, 1584, 1585, 1586, 0, 1587, 1588, 1589, 1590, + 1591, 1566, 1567, 1568, 1569, 1550, 1551, 1579, 0, 1553, + 0, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, + 0, 0, 1563, 1570, 1571, 1572, 1573, 0, 1574, 1575, + 1576, 1577, 0, 0, 0, 637, 0, 0, 0, 0, + 0, 0, 2139, 2140, 2141, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 638, 0, 637, 1637, + 0, 0, 1637, 0, 1637, 0, 0, 0, 0, 0, + 2171, 0, 189, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 189, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 637, 146, 0, 0, 147, + 637, 0, 0, 0, 637, 637, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, + 0, 638, 0, 0, 0, 0, 171, 0, 0, 0, + 0, 1340, 0, 638, 0, 0, 0, 0, 0, 0, + 0, 0, 1580, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 638, 1983, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 189, 638, 0, 0, 0, 0, 637, + 0, 0, 0, 0, 0, 0, 0, 0, 160, 165, + 162, 168, 169, 170, 172, 174, 175, 176, 177, 0, + 0, 0, 0, 0, 178, 180, 181, 182, 0, 0, + 0, 0, 1113, 0, 1113, 1113, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, - 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 930, - 637, 0, 0, 0, 0, 937, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 0, 0, 1339, 0, - 0, 637, 637, 1339, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 1339, 189, 637, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, + 638, 878, 1337, 1342, 1343, 0, 1346, 0, 1347, 1349, + 1350, 1351, 0, 1354, 1355, 1357, 1357, 0, 1357, 1361, + 1361, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, + 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, + 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, + 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, + 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, + 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, + 1422, 1423, 1424, 1425, 1426, 1427, 0, 0, 0, 0, + 1428, 0, 1430, 1431, 1432, 1433, 1434, 0, 0, 0, + 0, 0, 0, 0, 0, 1361, 1361, 1361, 1361, 1361, + 0, 0, 0, 0, 0, 80, 41, 42, 82, 1440, + 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, + 1451, 1452, 1453, 0, 0, 86, 0, 0, 0, 45, + 71, 72, 0, 69, 73, 0, 0, 0, 0, 0, + 1467, 0, 70, 0, 637, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 756, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1473, 0, 0, 0, 0, 0, 878, + 2464, 0, 0, 878, 0, 0, 0, 0, 0, 878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 930, 0, 0, 0, 0, 1846, 0, 0, - 0, 1846, 1846, 3170, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3178, 3179, - 0, 0, 0, 2773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 0, 0, 1339, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 187, 0, 0, 586, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 888, 0, 0, 0, 637, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 1637, 1637, 907, 907, + 0, 637, 0, 0, 0, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1339, 2536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 770, 0, 683, 774, 685, 771, 772, 0, 681, 684, - 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2852, 0, 2238, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 702, 703, 3163, 3167, - 3168, 3169, 3180, 3181, 3182, 3190, 3192, 735, 3191, 3193, - 3194, 3195, 3198, 3199, 3200, 3201, 3196, 3197, 3202, 3147, - 3151, 3148, 3149, 3150, 3162, 3152, 3153, 3154, 3155, 3156, - 3157, 3158, 3159, 3160, 3161, 3203, 3204, 3205, 3206, 3207, - 3208, 3173, 3177, 3176, 3174, 3175, 3171, 3172, 0, 0, - 0, 0, 0, 1115, 637, 0, 0, 0, 0, 0, - 775, 0, 776, 0, 0, 780, 0, 0, 0, 782, - 781, 0, 783, 749, 748, 0, 0, 777, 778, 0, - 779, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 51, 54, 53, 56, 0, 68, 0, 0, + 77, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 85, 84, 0, 0, 66, 67, + 55, 0, 0, 0, 0, 0, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 586, 0, 586, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 59, 60, 0, + 61, 62, 63, 64, 0, 0, 0, 0, 0, 755, + 0, 0, 0, 0, 0, 0, 0, 1113, 0, 0, + 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3209, 3210, 3211, 3212, 3213, - 3214, 3215, 3216, 0, 0, 0, 0, 2995, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 637, 0, 0, 0, 0, 0, 0, 0, 637, + 0, 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 637, 0, 0, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2399, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2414, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 637, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 0, 930, 0, 937, 0, 0, 0, 83, + 0, 0, 637, 0, 0, 0, 1339, 0, 0, 637, + 637, 1339, 89, 0, 0, 816, 0, 0, 0, 804, + 817, 818, 819, 820, 805, 0, 0, 806, 807, 0, + 808, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 813, 821, 822, 0, 0, 0, + 0, 1113, 1113, 0, 0, 0, 0, 0, 0, 0, + 81, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2822, 2823, 637, 0, 0, 1339, 0, 0, 0, + 0, 637, 0, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 0, 0, 0, 0, 0, + 0, 0, 2852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2495, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 586, 0, 586, 0, 0, + 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1341, - 0, 0, 2032, 0, 0, 0, 0, 0, 0, 2520, - 0, 0, 0, 0, 0, 0, 0, 0, 2525, 0, - 0, 0, 1339, 0, 0, 0, 0, 637, 0, 637, + 0, 0, 0, 0, 0, 0, 0, 2825, 2826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, + 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 888, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, - 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, - 0, 0, 0, 1846, 0, 0, 0, 586, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1341, 2060, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2995, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 770, 0, + 0, 774, 0, 771, 772, 0, 0, 0, 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 89, 0, 0, 816, 637, 637, + 0, 804, 817, 818, 819, 820, 805, 0, 0, 806, + 807, 938, 808, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 813, 821, 822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 938, 637, 637, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1846, 0, 0, 0, 0, 0, 0, 1341, 637, 0, - 0, 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1341, 0, 0, 1341, 2644, 1341, - 586, 637, 0, 0, 0, 0, 1115, 0, 0, 0, + 0, 0, 0, 2822, 2823, 0, 0, 0, 0, 0, + 0, 0, 1341, 0, 0, 823, 824, 825, 826, 827, + 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, + 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, + 858, 859, 860, 861, 862, 863, 864, 1115, 0, 1115, + 1115, 0, 0, 0, 0, 0, 0, 0, 0, 586, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1273, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 888, + 0, 0, 0, 0, 0, 0, 0, 2824, 0, 0, + 1339, 0, 0, 0, 0, 637, 0, 637, 0, 0, + 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 0, 1645, 0, 0, + 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1748, 0, 0, 0, 2681, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 586, 0, 1115, - 0, 0, 0, 0, 586, 0, 2708, 1645, 0, 0, - 637, 0, 0, 1771, 1772, 586, 586, 586, 586, 586, - 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, + 2251, 0, 0, 0, 0, 0, 0, 637, 0, 2825, + 2826, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1341, 0, 0, 637, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 637, 0, 0, 2261, + 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, + 1341, 0, 1341, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 637, 0, 586, 0, + 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1748, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, + 586, 0, 0, 0, 0, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 0, 0, 1771, 1772, 586, 586, + 586, 586, 586, 586, 586, 0, 0, 0, 0, 0, + 1475, 1476, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1519, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2391, 637, 0, + 0, 1537, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 2430, 2431, 0, 0, + 0, 0, 0, 0, 930, 2060, 0, 0, 878, 2450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 930, 0, 0, 0, 0, 637, 0, 0, 2032, 0, - 0, 0, 0, 0, 0, 1339, 0, 637, 0, 0, + 0, 0, 0, 1645, 1645, 0, 1645, 0, 1645, 1645, + 0, 1654, 1645, 1645, 1645, 1645, 1645, 0, 0, 0, + 0, 0, 0, 637, 0, 0, 0, 0, 930, 0, + 0, 0, 0, 1339, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, + 637, 0, 586, 1722, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1746, + 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 637, 0, 2526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, + 1341, 0, 1115, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 907, 907, 0, 0, 0, 1341, 0, 0, + 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, + 637, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 0, 0, 0, 0, 0, 0, 0, 2915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, + 0, 907, 1748, 907, 907, 907, 907, 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 0, 637, 0, 0, 0, 0, 1341, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 907, - 907, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 907, 0, 0, 0, 0, 0, 0, 2643, 0, 0, + 0, 0, 0, 0, 888, 0, 1115, 1115, 0, 0, + 0, 0, 0, 0, 1793, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 1748, 586, 0, 586, 0, 586, + 2069, 0, 0, 816, 0, 0, 0, 0, 817, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1851, 0, + 2060, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1846, 0, 0, + 0, 0, 0, 2705, 0, 81, 0, 0, 2060, 2060, + 2060, 2060, 2060, 0, 0, 0, 0, 0, 1862, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2060, 0, + 0, 2060, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1895, + 1896, 823, 824, 825, 826, 827, 828, 829, 830, 831, + 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, + 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, + 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, + 862, 863, 864, 0, 2810, 0, 0, 0, 0, 1115, + 0, 0, 0, 0, 2818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 907, 1748, - 907, 907, 907, 907, 907, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2032, 2032, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2020, 0, 0, + 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, + 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, + 0, 0, 586, 586, 2032, 0, 586, 0, 2230, 0, + 0, 0, 0, 0, 0, 586, 0, 0, 1519, 0, + 0, 1115, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 930, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 907, 0, 0, - 0, 0, 3059, 3060, 3061, 3062, 0, 0, 0, 0, - 0, 888, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, - 0, 1748, 586, 0, 586, 0, 586, 2069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1341, 0, + 1748, 0, 0, 930, 0, 0, 0, 0, 0, 937, + 0, 0, 0, 2060, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 930, 0, 0, 0, + 0, 1846, 0, 0, 0, 1846, 1846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3135, 0, 3137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, + 0, 0, 0, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, + 2238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3243, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 0, 0, 0, 0, 0, 0, 586, - 586, 0, 0, 586, 0, 2230, 0, 0, 0, 0, - 0, 0, 586, 0, 0, 0, 0, 0, 0, 586, - 0, 0, 0, 3293, 0, 0, 0, 3293, 3293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2032, 0, 0, 0, + 0, 0, 0, 586, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3107, 0, 3111, 3112, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2705, 0, + 81, 0, 2705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, + 0, 0, 0, 0, 0, 2505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1341, 0, 1748, 0, 0, + 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 586, 586, 586, 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2032, + 0, 0, 0, 0, 0, 2399, 0, 0, 0, 0, + 0, 0, 0, 907, 0, 0, 2414, 0, 2705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, + 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1382, 1383, + 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, + 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, + 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1413, 1414, + 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1440, 1441, + 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, + 1452, 1453, 907, 0, 0, 0, 0, 0, 0, 2495, + 0, 0, 0, 0, 0, 0, 3332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 0, 2032, 0, 0, 0, + 0, 0, 0, 2520, 0, 0, 0, 0, 586, 0, + 0, 0, 2525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1341, 0, 0, 0, 0, 1341, 586, 586, 586, 586, + 586, 0, 0, 0, 0, 0, 0, 0, 2724, 0, + 0, 0, 0, 0, 1696, 0, 586, 0, 0, 586, + 2732, 1748, 0, 0, 0, 3377, 0, 0, 0, 0, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3370, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3374, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 586, 0, 0, 1846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1115, 1115, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, - 0, 0, 0, 0, 1696, 0, 0, 0, 3417, 0, + 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1846, 0, 0, 0, 0, 0, + 0, 0, 0, 586, 0, 0, 586, 3461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2644, 0, 0, 0, 0, 0, 0, 0, + 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 0, 0, 586, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2032, 0, + 0, 1645, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2915, 0, 3425, 0, 0, + 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, + 2708, 1645, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, - 0, 0, 2505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 586, 586, 586, 586, 586, 0, 0, 0, 0, + 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 586, 0, 0, 0, + 0, 0, 0, 0, 930, 0, 0, 0, 0, 0, + 586, 0, 2032, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, + 0, 0, 586, 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, - 0, 0, 1341, 586, 586, 586, 586, 586, 0, 0, - 0, 0, 0, 0, 0, 2724, 0, 0, 0, 0, - 0, 1696, 0, 586, 0, 0, 586, 2732, 1748, 0, + 0, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2032, + 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3059, 3060, 3061, 3062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2494,333 +2422,142 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3135, 0, 3137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 586, - 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3243, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3396, 0, 0, 3293, 0, 0, + 0, 3293, 3293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1696, + 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1748, 0, 0, 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3370, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1115, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3418, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 380, 2915, 0, 3426, 1249, 1234, 496, 0, 1177, 1252, + 1146, 1165, 1262, 1168, 1171, 1213, 1125, 1191, 399, 1162, + 1118, 1150, 1120, 1157, 1121, 1148, 1179, 257, 1145, 1236, + 1195, 1251, 350, 254, 1127, 1151, 413, 1167, 196, 1215, + 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, + 369, 411, 486, 405, 1258, 354, 1201, 0, 476, 384, + 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, 1135, + 1200, 1253, 1163, 1210, 1254, 309, 237, 311, 195, 396, + 477, 273, 0, 0, 0, 0, 3398, 800, 0, 0, + 0, 0, 3399, 0, 0, 0, 0, 228, 0, 0, + 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, + 329, 334, 341, 347, 1159, 1207, 1248, 1160, 1209, 252, + 307, 259, 251, 501, 1259, 1239, 1124, 1188, 1247, 0, + 0, 219, 1250, 1183, 0, 1212, 0, 1265, 1119, 1203, + 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, 0, + 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, 0, + 0, 0, 0, 0, 0, 0, 1152, 0, 1199, 0, + 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 380, 0, 0, 0, 1249, 1234, 496, 0, 1177, - 1252, 1146, 1165, 1262, 1168, 1171, 1213, 1125, 1191, 399, - 1162, 1118, 1150, 1120, 1157, 1121, 1148, 1179, 257, 1145, - 1236, 1195, 1251, 350, 254, 1127, 1151, 413, 1167, 196, - 1215, 466, 241, 361, 358, 504, 269, 260, 256, 239, - 303, 369, 411, 486, 405, 1258, 354, 1201, 0, 476, - 384, 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, - 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 1696, 0, 3397, 627, 0, - 0, 0, 0, 3398, 0, 0, 0, 0, 228, 0, - 0, 235, 0, 0, 586, 335, 344, 343, 324, 325, - 327, 329, 334, 341, 347, 1159, 1207, 1248, 1160, 1209, - 252, 307, 259, 251, 501, 1259, 1239, 1124, 1188, 1247, - 0, 0, 219, 1250, 1183, 0, 1212, 0, 1265, 1119, - 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, - 0, 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, - 0, 0, 0, 0, 1341, 0, 0, 1152, 0, 1199, - 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1178, 0, 0, - 0, 0, 1134, 0, 1153, 1225, 1696, 1117, 284, 1128, - 385, 244, 0, 1232, 1242, 1175, 541, 1246, 1173, 1172, - 1219, 1132, 1238, 1166, 349, 1130, 316, 191, 215, 0, - 1164, 395, 441, 453, 1237, 1149, 1158, 242, 1156, 451, - 409, 520, 223, 271, 438, 415, 449, 422, 274, 1198, - 1217, 450, 356, 506, 432, 517, 542, 543, 250, 389, - 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, - 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, - 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, - 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, - 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, - 511, 243, 561, 218, 536, 210, 1129, 535, 391, 505, - 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, - 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, - 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, - 227, 1144, 266, 270, 278, 281, 289, 290, 299, 351, - 402, 428, 424, 433, 1233, 500, 518, 530, 540, 546, - 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, - 474, 319, 357, 1222, 1264, 408, 452, 230, 522, 475, - 1139, 1143, 1137, 1204, 1138, 1193, 1194, 1140, 1255, 1256, - 1257, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, - 1226, 1133, 0, 1141, 1142, 1235, 1244, 1245, 581, 368, - 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, - 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, - 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, - 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, - 528, 295, 448, 447, 317, 318, 363, 431, 1197, 190, - 211, 352, 1260, 434, 275, 559, 532, 527, 197, 213, - 1136, 249, 1147, 1155, 0, 1161, 1169, 1170, 1182, 1184, - 1185, 1186, 1187, 1205, 1206, 1208, 1216, 1218, 1221, 1223, - 1230, 1241, 1263, 192, 193, 200, 212, 222, 226, 233, - 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, - 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, - 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, - 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, - 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, - 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, - 301, 556, 557, 286, 516, 545, 0, 0, 362, 1196, - 1202, 365, 268, 291, 306, 1211, 531, 481, 217, 446, - 277, 240, 1229, 1231, 202, 236, 220, 246, 261, 264, - 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, - 464, 487, 488, 489, 491, 379, 253, 416, 1192, 1220, - 360, 497, 498, 302, 380, 0, 0, 0, 1249, 1234, - 496, 0, 1177, 1252, 1146, 1165, 1262, 1168, 1171, 1213, - 1125, 1191, 399, 1162, 1118, 1150, 1120, 1157, 1121, 1148, - 1179, 257, 1145, 1236, 1195, 1251, 350, 254, 1127, 1151, - 413, 1167, 196, 1215, 466, 241, 361, 358, 504, 269, - 260, 256, 239, 303, 369, 411, 486, 405, 1258, 354, - 1201, 0, 476, 384, 0, 0, 0, 1181, 1240, 1189, - 1227, 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, 309, - 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, - 343, 324, 325, 327, 329, 334, 341, 347, 1159, 1207, - 1248, 1160, 1209, 252, 307, 259, 251, 501, 1259, 1239, - 1124, 1188, 1247, 0, 0, 219, 1250, 1183, 0, 1212, - 0, 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, - 262, 0, 0, 0, 0, 0, 0, 0, 1180, 1190, - 1224, 1228, 1174, 0, 0, 0, 0, 0, 2733, 0, - 1152, 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1178, 0, 0, 0, 0, 1134, 0, 1153, 1225, 0, - 1117, 284, 1128, 385, 244, 0, 1232, 1242, 1175, 541, - 1246, 1173, 1172, 1219, 1132, 1238, 1166, 349, 1130, 316, - 191, 215, 0, 1164, 395, 441, 453, 1237, 1149, 1158, - 242, 1156, 451, 409, 520, 223, 271, 438, 415, 449, - 422, 274, 1198, 1217, 450, 356, 506, 432, 517, 542, - 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, - 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, - 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, - 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, - 513, 482, 377, 312, 313, 204, 0, 437, 255, 280, - 245, 398, 510, 511, 243, 561, 218, 536, 210, 1129, - 535, 391, 505, 514, 378, 367, 209, 512, 376, 366, - 320, 339, 340, 267, 293, 429, 359, 430, 292, 294, - 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, - 562, 224, 225, 227, 1144, 266, 270, 278, 281, 289, - 290, 299, 351, 402, 428, 424, 433, 1233, 500, 518, - 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, - 554, 390, 297, 474, 319, 357, 1222, 1264, 408, 452, - 230, 522, 475, 1139, 1143, 1137, 1204, 1138, 1193, 1194, - 1140, 1255, 1256, 1257, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 0, 1226, 1133, 0, 1141, 1142, 1235, 1244, - 1245, 581, 368, 465, 519, 321, 333, 336, 326, 345, - 0, 346, 322, 323, 328, 330, 331, 332, 337, 338, - 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, - 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, - 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, - 431, 1197, 190, 211, 352, 1260, 434, 275, 559, 532, - 527, 197, 213, 1136, 249, 1147, 1155, 0, 1161, 1169, - 1170, 1182, 1184, 1185, 1186, 1187, 1205, 1206, 1208, 1216, - 1218, 1221, 1223, 1230, 1241, 1263, 192, 193, 200, 212, - 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, - 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, - 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, - 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, - 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, - 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, - 426, 427, 300, 301, 556, 557, 286, 516, 545, 0, - 0, 362, 1196, 1202, 365, 268, 291, 306, 1211, 531, - 481, 217, 446, 277, 240, 1229, 1231, 202, 236, 220, - 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, - 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, - 416, 1192, 1220, 360, 497, 498, 302, 380, 0, 0, - 0, 1249, 1234, 496, 0, 1177, 1252, 1146, 1165, 1262, - 1168, 1171, 1213, 1125, 1191, 399, 1162, 1118, 1150, 1120, - 1157, 1121, 1148, 1179, 257, 1145, 1236, 1195, 1251, 350, - 254, 1127, 1151, 413, 1167, 196, 1215, 466, 241, 361, - 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, - 405, 1258, 354, 1201, 0, 476, 384, 0, 0, 0, - 1181, 1240, 1189, 1227, 1176, 1214, 1135, 1200, 1253, 1163, - 1210, 1254, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, - 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, - 347, 1159, 1207, 1248, 1160, 1209, 252, 307, 259, 251, - 501, 1259, 1239, 1124, 1188, 1247, 0, 0, 219, 1250, - 1183, 0, 1212, 0, 1265, 1119, 1203, 0, 1122, 1126, - 1261, 1243, 1154, 262, 0, 0, 0, 0, 0, 0, - 0, 1180, 1190, 1224, 1228, 1174, 0, 0, 0, 0, - 0, 2694, 0, 1152, 0, 1199, 0, 0, 0, 1131, - 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1178, 0, 0, 0, 0, 1134, 0, - 1153, 1225, 0, 1117, 284, 1128, 385, 244, 0, 1232, - 1242, 1175, 541, 1246, 1173, 1172, 1219, 1132, 1238, 1166, - 349, 1130, 316, 191, 215, 0, 1164, 395, 441, 453, - 1237, 1149, 1158, 242, 1156, 451, 409, 520, 223, 271, - 438, 415, 449, 422, 274, 1198, 1217, 450, 356, 506, - 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, - 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, - 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, - 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, - 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, - 437, 255, 280, 245, 398, 510, 511, 243, 561, 218, - 536, 210, 1129, 535, 391, 505, 514, 378, 367, 209, - 512, 376, 366, 320, 339, 340, 267, 293, 429, 359, - 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, - 0, 478, 525, 562, 224, 225, 227, 1144, 266, 270, - 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, - 1233, 500, 518, 530, 540, 546, 547, 549, 550, 551, - 552, 553, 555, 554, 390, 297, 474, 319, 357, 1222, - 1264, 408, 452, 230, 522, 475, 1139, 1143, 1137, 1204, - 1138, 1193, 1194, 1140, 1255, 1256, 1257, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 0, 1226, 1133, 0, 1141, - 1142, 1235, 1244, 1245, 581, 368, 465, 519, 321, 333, - 336, 326, 345, 0, 346, 322, 323, 328, 330, 331, - 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, - 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, - 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, - 317, 318, 363, 431, 1197, 190, 211, 352, 1260, 434, - 275, 559, 532, 527, 197, 213, 1136, 249, 1147, 1155, - 0, 1161, 1169, 1170, 1182, 1184, 1185, 1186, 1187, 1205, - 1206, 1208, 1216, 1218, 1221, 1223, 1230, 1241, 1263, 192, - 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, - 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, - 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, - 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, - 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, - 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, - 460, 287, 288, 426, 427, 300, 301, 556, 557, 286, - 516, 545, 0, 0, 362, 1196, 1202, 365, 268, 291, - 306, 1211, 531, 481, 217, 446, 277, 240, 1229, 1231, - 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, - 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, - 491, 379, 253, 416, 1192, 1220, 360, 497, 498, 302, - 380, 0, 0, 0, 1249, 1234, 496, 0, 1177, 1252, - 1146, 1165, 1262, 1168, 1171, 1213, 1125, 1191, 399, 1162, - 1118, 1150, 1120, 1157, 1121, 1148, 1179, 257, 1145, 1236, - 1195, 1251, 350, 254, 1127, 1151, 413, 1167, 196, 1215, - 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, - 369, 411, 486, 405, 1258, 354, 1201, 0, 476, 384, - 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, 1135, - 1200, 1253, 1163, 1210, 1254, 309, 237, 311, 195, 396, - 477, 273, 0, 0, 0, 0, 0, 800, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, - 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, - 329, 334, 341, 347, 1159, 1207, 1248, 1160, 1209, 252, - 307, 259, 251, 501, 1259, 1239, 1124, 1188, 1247, 0, - 0, 219, 1250, 1183, 0, 1212, 0, 1265, 1119, 1203, - 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, 0, - 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, 0, - 0, 0, 0, 0, 2048, 0, 1152, 0, 1199, 0, - 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1178, 0, 0, 0, - 0, 1134, 0, 1153, 1225, 0, 1117, 284, 1128, 385, - 244, 0, 1232, 1242, 1175, 541, 1246, 1173, 1172, 1219, - 1132, 1238, 1166, 349, 1130, 316, 191, 215, 0, 1164, - 395, 441, 453, 1237, 1149, 1158, 242, 1156, 451, 409, - 520, 223, 271, 438, 415, 449, 422, 274, 1198, 1217, - 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, - 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, - 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, - 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, - 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, - 313, 204, 0, 437, 255, 280, 245, 398, 510, 511, - 243, 561, 218, 536, 210, 1129, 535, 391, 505, 514, - 378, 367, 209, 512, 376, 366, 320, 339, 340, 267, - 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, - 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, - 1144, 266, 270, 278, 281, 289, 290, 299, 351, 402, - 428, 424, 433, 1233, 500, 518, 530, 540, 546, 547, - 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, - 319, 357, 1222, 1264, 408, 452, 230, 522, 475, 1139, - 1143, 1137, 1204, 1138, 1193, 1194, 1140, 1255, 1256, 1257, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 0, 1226, - 1133, 0, 1141, 1142, 1235, 1244, 1245, 581, 368, 465, - 519, 321, 333, 336, 326, 345, 0, 346, 322, 323, - 328, 330, 331, 332, 337, 338, 342, 348, 238, 201, - 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, - 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, - 295, 448, 447, 317, 318, 363, 431, 1197, 190, 211, - 352, 1260, 434, 275, 559, 532, 527, 197, 213, 1136, - 249, 1147, 1155, 0, 1161, 1169, 1170, 1182, 1184, 1185, - 1186, 1187, 1205, 1206, 1208, 1216, 1218, 1221, 1223, 1230, - 1241, 1263, 192, 193, 200, 212, 222, 226, 233, 248, - 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, - 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, - 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, - 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, - 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, - 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, - 556, 557, 286, 516, 545, 0, 0, 362, 1196, 1202, - 365, 268, 291, 306, 1211, 531, 481, 217, 446, 277, - 240, 1229, 1231, 202, 236, 220, 246, 261, 264, 310, - 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, - 487, 488, 489, 491, 379, 253, 416, 1192, 1220, 360, - 497, 498, 302, 380, 0, 0, 0, 1249, 1234, 496, - 0, 1177, 1252, 1146, 1165, 1262, 1168, 1171, 1213, 1125, - 1191, 399, 1162, 1118, 1150, 1120, 1157, 1121, 1148, 1179, - 257, 1145, 1236, 1195, 1251, 350, 254, 1127, 1151, 413, - 1167, 196, 1215, 466, 241, 361, 358, 504, 269, 260, - 256, 239, 303, 369, 411, 486, 405, 1258, 354, 1201, - 0, 476, 384, 0, 0, 0, 1181, 1240, 1189, 1227, - 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, - 311, 195, 396, 477, 273, 0, 89, 0, 0, 0, - 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, - 324, 325, 327, 329, 334, 341, 347, 1159, 1207, 1248, - 1160, 1209, 252, 307, 259, 251, 501, 1259, 1239, 1124, - 1188, 1247, 0, 0, 219, 1250, 1183, 0, 1212, 0, - 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, - 0, 0, 0, 0, 0, 0, 0, 1180, 1190, 1224, - 1228, 1174, 0, 0, 0, 0, 0, 0, 0, 1152, - 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1178, 0, 0, 0, + 0, 1134, 0, 1153, 1225, 0, 1117, 284, 1128, 385, + 244, 0, 1232, 1242, 1175, 541, 1246, 1173, 1172, 1219, + 1132, 1238, 1166, 349, 1130, 316, 191, 215, 0, 1164, + 395, 441, 453, 1237, 1149, 1158, 242, 1156, 451, 409, + 520, 223, 271, 438, 415, 449, 422, 274, 1198, 1217, + 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, + 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, + 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, + 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, + 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, + 313, 204, 0, 437, 255, 280, 245, 398, 510, 511, + 243, 561, 218, 536, 210, 1129, 535, 391, 505, 514, + 378, 367, 209, 512, 376, 366, 320, 339, 340, 267, + 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, + 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, + 1144, 266, 270, 278, 281, 289, 290, 299, 351, 402, + 428, 424, 433, 1233, 500, 518, 530, 540, 546, 547, + 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, + 319, 357, 1222, 1264, 408, 452, 230, 522, 475, 1139, + 1143, 1137, 1204, 1138, 1193, 1194, 1140, 1255, 1256, 1257, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 0, 1226, + 1133, 0, 1141, 1142, 1235, 1244, 1245, 581, 368, 465, + 519, 321, 333, 336, 326, 345, 0, 346, 322, 323, + 328, 330, 331, 332, 337, 338, 342, 348, 238, 201, + 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, + 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, + 295, 448, 447, 317, 318, 363, 431, 1197, 190, 211, + 352, 1260, 434, 275, 559, 532, 527, 197, 213, 1136, + 249, 1147, 1155, 0, 1161, 1169, 1170, 1182, 1184, 1185, + 1186, 1187, 1205, 1206, 1208, 1216, 1218, 1221, 1223, 1230, + 1241, 1263, 192, 193, 200, 212, 222, 226, 233, 248, + 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, + 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, + 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, + 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, + 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, + 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, + 556, 557, 286, 516, 545, 0, 0, 362, 1196, 1202, + 365, 268, 291, 306, 1211, 531, 481, 217, 446, 277, + 240, 1229, 1231, 202, 236, 220, 246, 261, 264, 310, + 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, + 487, 488, 489, 491, 379, 253, 416, 1192, 1220, 360, + 497, 498, 302, 380, 0, 0, 0, 1249, 1234, 496, + 0, 1177, 1252, 1146, 1165, 1262, 1168, 1171, 1213, 1125, + 1191, 399, 1162, 1118, 1150, 1120, 1157, 1121, 1148, 1179, + 257, 1145, 1236, 1195, 1251, 350, 254, 1127, 1151, 413, + 1167, 196, 1215, 466, 241, 361, 358, 504, 269, 260, + 256, 239, 303, 369, 411, 486, 405, 1258, 354, 1201, + 0, 476, 384, 0, 0, 0, 1181, 1240, 1189, 1227, + 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, + 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, + 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, + 324, 325, 327, 329, 334, 341, 347, 1159, 1207, 1248, + 1160, 1209, 252, 307, 259, 251, 501, 1259, 1239, 1124, + 1188, 1247, 0, 0, 219, 1250, 1183, 0, 1212, 0, + 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, + 0, 0, 0, 0, 0, 0, 0, 1180, 1190, 1224, + 1228, 1174, 0, 0, 0, 0, 0, 2733, 0, 1152, + 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2885,7 +2622,7 @@ var yyAct = [...]int{ 0, 1212, 0, 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, 0, 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, 0, 0, 0, 0, 0, - 0, 0, 1152, 0, 1199, 0, 0, 0, 1131, 1123, + 2694, 0, 1152, 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2950,7 +2687,7 @@ var yyAct = [...]int{ 219, 1250, 1183, 0, 1212, 0, 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, 0, 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, 0, 0, - 0, 0, 0, 0, 0, 1152, 0, 1199, 0, 0, + 0, 0, 0, 2048, 0, 1152, 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3007,7 +2744,7 @@ var yyAct = [...]int{ 239, 303, 369, 411, 486, 405, 1258, 354, 1201, 0, 476, 384, 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, 311, - 195, 396, 477, 273, 0, 0, 0, 0, 0, 188, + 195, 396, 477, 273, 0, 89, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 1159, 1207, 1248, 1160, @@ -3064,266 +2801,203 @@ var yyAct = [...]int{ 446, 277, 240, 1229, 1231, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 1192, - 1220, 360, 497, 498, 302, 380, 0, 0, 0, 0, - 0, 496, 0, 679, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 399, 0, 0, 0, 0, 666, 0, - 0, 0, 257, 671, 0, 0, 0, 350, 254, 0, - 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, - 269, 260, 256, 239, 303, 369, 411, 486, 405, 678, - 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, - 674, 675, 0, 0, 0, 0, 0, 0, 0, 0, - 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, - 0, 816, 800, 766, 767, 804, 817, 818, 819, 820, - 805, 0, 228, 806, 807, 235, 808, 0, 765, 706, - 708, 707, 725, 726, 727, 728, 729, 730, 731, 704, - 813, 821, 822, 0, 252, 307, 259, 251, 501, 0, - 0, 1927, 1928, 1929, 0, 0, 219, 0, 0, 0, - 0, 0, 0, 0, 648, 663, 0, 677, 0, 0, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, - 0, 0, 0, 760, 0, 662, 0, 0, 670, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 673, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 284, 0, 385, 244, 0, 759, 0, 0, - 541, 0, 0, 757, 0, 0, 0, 0, 349, 0, - 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, - 0, 810, 0, 451, 409, 520, 223, 271, 438, 415, - 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, + 1220, 360, 497, 498, 302, 380, 0, 0, 0, 1249, + 1234, 496, 0, 1177, 1252, 1146, 1165, 1262, 1168, 1171, + 1213, 1125, 1191, 399, 1162, 1118, 1150, 1120, 1157, 1121, + 1148, 1179, 257, 1145, 1236, 1195, 1251, 350, 254, 1127, + 1151, 413, 1167, 196, 1215, 466, 241, 361, 358, 504, + 269, 260, 256, 239, 303, 369, 411, 486, 405, 1258, + 354, 1201, 0, 476, 384, 0, 0, 0, 1181, 1240, + 1189, 1227, 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, + 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, + 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, + 344, 343, 324, 325, 327, 329, 334, 341, 347, 1159, + 1207, 1248, 1160, 1209, 252, 307, 259, 251, 501, 1259, + 1239, 1124, 1188, 1247, 0, 0, 219, 1250, 1183, 0, + 1212, 0, 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, + 1154, 262, 0, 0, 0, 0, 0, 0, 0, 1180, + 1190, 1224, 1228, 1174, 0, 0, 0, 0, 0, 0, + 0, 1152, 0, 1199, 0, 0, 0, 1131, 1123, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1178, 0, 0, 0, 0, 1134, 0, 1153, 1225, + 0, 1117, 284, 1128, 385, 244, 0, 1232, 1242, 1175, + 541, 1246, 1173, 1172, 1219, 1132, 1238, 1166, 349, 1130, + 316, 191, 215, 0, 1164, 395, 441, 453, 1237, 1149, + 1158, 242, 1156, 451, 409, 520, 223, 271, 438, 415, + 449, 422, 274, 1198, 1217, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, 437, 255, - 280, 245, 398, 811, 812, 243, 561, 712, 536, 210, - 0, 535, 391, 505, 514, 378, 367, 209, 512, 376, - 366, 320, 720, 721, 267, 293, 429, 359, 430, 292, + 280, 245, 398, 510, 511, 243, 561, 218, 536, 210, + 1129, 535, 391, 505, 514, 378, 367, 209, 512, 376, + 366, 320, 339, 340, 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, - 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, - 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, + 525, 562, 224, 225, 227, 1144, 266, 270, 278, 281, + 289, 290, 299, 351, 402, 428, 424, 433, 1233, 500, 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, - 555, 554, 390, 297, 474, 319, 357, 0, 0, 408, - 452, 230, 522, 475, 770, 758, 683, 774, 685, 771, - 772, 680, 681, 684, 773, 563, 564, 565, 566, 567, + 555, 554, 390, 297, 474, 319, 357, 1222, 1264, 408, + 452, 230, 522, 475, 1139, 1143, 1137, 1204, 1138, 1193, + 1194, 1140, 1255, 1256, 1257, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 0, 761, 669, 668, 0, 676, 0, - 702, 703, 705, 709, 710, 711, 722, 723, 724, 732, - 734, 735, 733, 736, 737, 738, 741, 742, 743, 744, - 739, 740, 745, 686, 690, 687, 688, 689, 701, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 784, - 785, 786, 787, 788, 789, 715, 719, 718, 716, 717, - 713, 714, 667, 190, 211, 352, 0, 434, 275, 559, - 532, 527, 197, 213, 775, 249, 776, 0, 0, 780, - 0, 0, 0, 782, 781, 0, 783, 749, 748, 0, - 0, 777, 778, 0, 779, 0, 0, 192, 193, 200, + 578, 579, 580, 0, 1226, 1133, 0, 1141, 1142, 1235, + 1244, 1245, 581, 368, 465, 519, 321, 333, 336, 326, + 345, 0, 346, 322, 323, 328, 330, 331, 332, 337, + 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, + 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, + 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, + 363, 431, 1197, 190, 211, 352, 1260, 434, 275, 559, + 532, 527, 197, 213, 1136, 249, 1147, 1155, 0, 1161, + 1169, 1170, 1182, 1184, 1185, 1186, 1187, 1205, 1206, 1208, + 1216, 1218, 1221, 1223, 1230, 1241, 1263, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, - 479, 480, 484, 507, 509, 521, 539, 544, 460, 790, - 791, 792, 793, 794, 795, 796, 797, 286, 516, 545, - 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, - 531, 481, 217, 446, 277, 240, 815, 0, 202, 236, + 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, + 288, 426, 427, 300, 301, 556, 557, 286, 516, 545, + 0, 0, 362, 1196, 1202, 365, 268, 291, 306, 1211, + 531, 481, 217, 446, 277, 240, 1229, 1231, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, - 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, - 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 399, 0, 0, 0, 0, 666, 0, 0, 0, 257, - 671, 0, 0, 0, 350, 254, 0, 0, 413, 0, - 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, - 239, 303, 369, 411, 486, 405, 678, 354, 0, 0, - 476, 384, 0, 0, 0, 0, 0, 674, 675, 0, - 0, 0, 0, 0, 0, 2077, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 89, 0, 0, 816, 800, - 766, 767, 804, 817, 818, 819, 820, 805, 0, 228, - 806, 807, 235, 808, 0, 765, 706, 708, 707, 725, - 726, 727, 728, 729, 730, 731, 704, 813, 821, 822, - 2078, 252, 307, 259, 251, 501, 0, 0, 0, 0, - 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, - 0, 648, 663, 0, 677, 0, 0, 0, 262, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 660, 661, 0, 0, 0, 0, - 760, 0, 662, 0, 0, 670, 823, 824, 825, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, - 857, 858, 859, 860, 861, 862, 863, 864, 673, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 0, 385, 244, 0, 759, 0, 0, 541, 0, 0, - 757, 0, 0, 0, 0, 349, 0, 316, 191, 215, - 0, 0, 395, 441, 453, 0, 0, 0, 810, 0, - 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, - 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, - 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, - 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, - 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, - 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, - 377, 312, 313, 204, 0, 437, 255, 280, 245, 398, - 811, 812, 243, 561, 712, 536, 210, 0, 535, 391, - 505, 514, 378, 367, 209, 512, 376, 366, 320, 720, - 721, 267, 293, 429, 359, 430, 292, 294, 387, 386, - 388, 198, 524, 0, 199, 0, 478, 525, 562, 224, - 225, 227, 0, 266, 270, 278, 281, 289, 290, 299, - 351, 402, 428, 424, 433, 0, 500, 518, 530, 540, - 546, 547, 549, 550, 551, 552, 553, 555, 554, 390, - 297, 474, 319, 357, 0, 0, 408, 452, 230, 522, - 475, 770, 758, 683, 774, 685, 771, 772, 680, 681, - 684, 773, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, - 0, 761, 669, 668, 0, 676, 0, 702, 703, 705, - 709, 710, 711, 722, 723, 724, 732, 734, 735, 733, - 736, 737, 738, 741, 742, 743, 744, 739, 740, 745, - 686, 690, 687, 688, 689, 701, 691, 692, 693, 694, - 695, 696, 697, 698, 699, 700, 784, 785, 786, 787, - 788, 789, 715, 719, 718, 716, 717, 713, 714, 667, - 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, - 213, 775, 249, 776, 0, 0, 780, 0, 0, 0, - 782, 781, 0, 783, 749, 748, 0, 0, 777, 778, - 0, 779, 0, 0, 192, 193, 200, 212, 222, 226, - 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, - 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, - 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, - 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, - 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, - 507, 509, 521, 539, 544, 460, 790, 791, 792, 793, - 794, 795, 796, 797, 286, 516, 545, 0, 0, 362, - 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, - 446, 277, 240, 815, 0, 202, 236, 220, 246, 261, - 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, - 231, 464, 487, 488, 489, 491, 379, 253, 416, 0, - 380, 360, 497, 498, 302, 80, 496, 0, 679, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, - 0, 0, 0, 666, 0, 0, 0, 257, 671, 0, - 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, - 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, - 369, 411, 486, 405, 678, 354, 0, 0, 476, 384, - 0, 0, 0, 0, 0, 674, 675, 0, 0, 0, - 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 89, 0, 0, 816, 800, 766, 767, - 804, 817, 818, 819, 820, 805, 0, 228, 806, 807, - 235, 808, 0, 765, 706, 708, 707, 725, 726, 727, - 728, 729, 730, 731, 704, 813, 821, 822, 0, 252, - 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, - 0, 219, 0, 0, 0, 0, 0, 0, 0, 648, - 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 660, 661, 0, 0, 0, 0, 760, 0, - 662, 0, 0, 670, 823, 824, 825, 826, 827, 828, - 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, - 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, - 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 673, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, - 244, 0, 759, 0, 0, 541, 0, 0, 757, 0, - 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, - 395, 441, 453, 0, 0, 0, 810, 0, 451, 409, - 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, - 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, - 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, - 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, - 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, - 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, - 313, 204, 0, 437, 255, 280, 245, 398, 811, 812, - 243, 561, 712, 536, 210, 0, 535, 391, 505, 514, - 378, 367, 209, 512, 376, 366, 320, 720, 721, 267, - 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, - 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, - 0, 266, 270, 278, 281, 289, 290, 299, 351, 402, - 428, 424, 433, 0, 500, 518, 530, 540, 546, 547, - 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, - 319, 357, 0, 0, 408, 452, 230, 522, 475, 770, - 758, 683, 774, 685, 771, 772, 680, 681, 684, 773, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 0, 761, - 669, 668, 0, 676, 0, 702, 703, 705, 709, 710, - 711, 722, 723, 724, 732, 734, 735, 733, 736, 737, - 738, 741, 742, 743, 744, 739, 740, 745, 686, 690, - 687, 688, 689, 701, 691, 692, 693, 694, 695, 696, - 697, 698, 699, 700, 784, 785, 786, 787, 788, 789, - 715, 719, 718, 716, 717, 713, 714, 667, 190, 211, - 352, 88, 434, 275, 559, 532, 527, 197, 213, 775, - 249, 776, 0, 0, 780, 0, 0, 0, 782, 781, - 0, 783, 749, 748, 0, 0, 777, 778, 0, 779, - 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, - 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, - 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, - 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, - 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, - 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, - 521, 539, 544, 460, 790, 791, 792, 793, 794, 795, - 796, 797, 286, 516, 545, 0, 0, 362, 0, 0, - 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, - 240, 815, 0, 202, 236, 220, 246, 261, 264, 310, - 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, - 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, - 497, 498, 302, 496, 0, 679, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, - 666, 0, 0, 0, 257, 671, 0, 0, 0, 350, - 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, - 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, - 405, 678, 354, 0, 0, 476, 384, 0, 0, 0, - 0, 0, 674, 675, 0, 0, 0, 0, 0, 0, - 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 89, 0, 0, 816, 800, 766, 767, 804, 817, 818, - 819, 820, 805, 0, 228, 806, 807, 235, 808, 0, - 765, 706, 708, 707, 725, 726, 727, 728, 729, 730, - 731, 704, 813, 821, 822, 0, 252, 307, 259, 251, - 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, - 0, 0, 0, 0, 0, 0, 648, 663, 0, 677, - 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, - 661, 0, 0, 0, 0, 760, 0, 662, 0, 0, - 670, 823, 824, 825, 826, 827, 828, 829, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, - 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, - 862, 863, 864, 673, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 0, 385, 244, 0, 759, - 0, 0, 541, 0, 0, 757, 0, 0, 0, 0, - 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, - 0, 0, 0, 810, 0, 451, 409, 520, 223, 271, - 438, 415, 449, 422, 274, 3384, 0, 450, 356, 506, - 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, - 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, - 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, - 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, - 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, - 437, 255, 280, 245, 398, 811, 812, 243, 561, 712, - 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, - 512, 376, 366, 320, 720, 721, 267, 293, 429, 359, - 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, - 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, - 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, - 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, - 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, - 0, 408, 452, 230, 522, 475, 770, 758, 683, 774, - 685, 771, 772, 680, 681, 684, 773, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 0, 761, 669, 668, 0, - 676, 0, 702, 703, 705, 709, 710, 711, 722, 723, - 724, 732, 734, 735, 733, 736, 737, 738, 741, 742, - 743, 744, 739, 740, 745, 686, 690, 687, 688, 689, - 701, 691, 692, 693, 694, 695, 696, 697, 698, 699, - 700, 784, 785, 786, 787, 788, 789, 715, 719, 718, - 716, 717, 713, 714, 667, 190, 211, 352, 0, 434, - 275, 559, 532, 527, 197, 213, 775, 249, 776, 0, - 0, 780, 0, 0, 0, 782, 781, 0, 783, 749, - 748, 0, 0, 777, 778, 0, 779, 0, 0, 192, - 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, - 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, - 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, - 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, - 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, - 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, - 460, 790, 791, 792, 793, 794, 795, 796, 797, 286, - 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, - 306, 0, 531, 481, 217, 446, 277, 240, 815, 0, - 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, - 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, - 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, + 253, 416, 1192, 1220, 360, 497, 498, 302, 380, 0, + 0, 0, 1249, 1234, 496, 0, 1177, 1252, 1146, 1165, + 1262, 1168, 1171, 1213, 1125, 1191, 399, 1162, 1118, 1150, + 1120, 1157, 1121, 1148, 1179, 257, 1145, 1236, 1195, 1251, + 350, 254, 1127, 1151, 413, 1167, 196, 1215, 466, 241, + 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, + 486, 405, 1258, 354, 1201, 0, 476, 384, 0, 0, + 0, 1181, 1240, 1189, 1227, 1176, 1214, 1135, 1200, 1253, + 1163, 1210, 1254, 309, 237, 311, 195, 396, 477, 273, + 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, + 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, + 341, 347, 1159, 1207, 1248, 1160, 1209, 252, 307, 259, + 251, 501, 1259, 1239, 1124, 1188, 1247, 0, 0, 219, + 1250, 1183, 0, 1212, 0, 1265, 1119, 1203, 0, 1122, + 1126, 1261, 1243, 1154, 262, 0, 0, 0, 0, 0, + 0, 0, 1180, 1190, 1224, 1228, 1174, 0, 0, 0, + 0, 0, 0, 0, 1152, 0, 1199, 0, 0, 0, + 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1178, 0, 0, 0, 0, 1134, + 0, 1153, 1225, 0, 1117, 284, 1128, 385, 244, 0, + 1232, 1242, 1175, 541, 1246, 1173, 1172, 1219, 1132, 1238, + 1166, 349, 1130, 316, 191, 215, 0, 1164, 395, 441, + 453, 1237, 1149, 1158, 242, 1156, 451, 409, 520, 223, + 271, 438, 415, 449, 422, 274, 1198, 1217, 450, 356, + 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, + 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, + 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, + 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, + 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, + 0, 437, 255, 280, 245, 398, 510, 511, 243, 561, + 218, 536, 210, 1129, 535, 391, 505, 514, 378, 367, + 209, 512, 376, 366, 320, 339, 340, 267, 293, 429, + 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, + 199, 0, 478, 525, 562, 224, 225, 227, 1144, 266, + 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, + 433, 1233, 500, 518, 530, 540, 546, 547, 549, 550, + 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, + 1222, 1264, 408, 452, 230, 522, 475, 1139, 1143, 1137, + 1204, 1138, 1193, 1194, 1140, 1255, 1256, 1257, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 0, 1226, 1133, 0, + 1141, 1142, 1235, 1244, 1245, 581, 368, 465, 519, 321, + 333, 336, 326, 345, 0, 346, 322, 323, 328, 330, + 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, + 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, + 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, + 447, 317, 318, 363, 431, 1197, 190, 211, 352, 1260, + 434, 275, 559, 532, 527, 197, 213, 1136, 249, 1147, + 1155, 0, 1161, 1169, 1170, 1182, 1184, 1185, 1186, 1187, + 1205, 1206, 1208, 1216, 1218, 1221, 1223, 1230, 1241, 1263, + 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, + 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, + 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, + 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, + 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, + 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, + 544, 460, 287, 288, 426, 427, 300, 301, 556, 557, + 286, 516, 545, 0, 0, 362, 1196, 1202, 365, 268, + 291, 306, 1211, 531, 481, 217, 446, 277, 240, 1229, + 1231, 202, 236, 220, 246, 261, 264, 310, 375, 383, + 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, + 489, 491, 379, 253, 416, 1192, 1220, 360, 497, 498, + 302, 380, 0, 0, 0, 1249, 1234, 496, 0, 1177, + 1252, 1146, 1165, 1262, 1168, 1171, 1213, 1125, 1191, 399, + 1162, 1118, 1150, 1120, 1157, 1121, 1148, 1179, 257, 1145, + 1236, 1195, 1251, 350, 254, 1127, 1151, 413, 1167, 196, + 1215, 466, 241, 361, 358, 504, 269, 260, 256, 239, + 303, 369, 411, 486, 405, 1258, 354, 1201, 0, 476, + 384, 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, + 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, 311, 195, + 396, 477, 273, 0, 0, 0, 0, 0, 800, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, + 327, 329, 334, 341, 347, 1159, 1207, 1248, 1160, 1209, + 252, 307, 259, 251, 501, 1259, 1239, 1124, 1188, 1247, + 0, 0, 219, 1250, 1183, 0, 1212, 0, 1265, 1119, + 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, + 0, 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, + 0, 0, 0, 0, 0, 0, 0, 1152, 0, 1199, + 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1178, 0, 0, + 0, 0, 1134, 0, 1153, 1225, 0, 1117, 284, 1128, + 385, 244, 0, 1232, 1242, 1175, 541, 1246, 1173, 1172, + 1219, 1132, 1238, 1166, 349, 1130, 316, 191, 215, 0, + 1164, 395, 441, 453, 1237, 1149, 1158, 242, 1156, 451, + 409, 520, 223, 271, 438, 415, 449, 422, 274, 1198, + 1217, 450, 356, 506, 432, 517, 542, 543, 250, 389, + 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, + 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, + 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, + 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, + 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, + 511, 243, 561, 218, 536, 210, 1129, 535, 391, 505, + 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, + 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, + 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, + 227, 1144, 266, 270, 278, 281, 289, 290, 299, 351, + 402, 428, 424, 433, 1233, 500, 518, 530, 540, 546, + 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, + 474, 319, 357, 1222, 1264, 408, 452, 230, 522, 475, + 1139, 1143, 1137, 1204, 1138, 1193, 1194, 1140, 1255, 1256, + 1257, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, + 1226, 1133, 0, 1141, 1142, 1235, 1244, 1245, 581, 368, + 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, + 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, + 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, + 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, + 528, 295, 448, 447, 317, 318, 363, 431, 1197, 190, + 211, 352, 1260, 434, 275, 559, 532, 527, 197, 213, + 1136, 249, 1147, 1155, 0, 1161, 1169, 1170, 1182, 1184, + 1185, 1186, 1187, 1205, 1206, 1208, 1216, 1218, 1221, 1223, + 1230, 1241, 1263, 192, 193, 200, 212, 222, 226, 233, + 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, + 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, + 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, + 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, + 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, + 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, + 301, 556, 557, 286, 516, 545, 0, 0, 362, 1196, + 1202, 365, 268, 291, 306, 1211, 531, 481, 217, 446, + 277, 240, 1229, 1231, 202, 236, 220, 246, 261, 264, + 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, + 464, 487, 488, 489, 491, 379, 253, 416, 1192, 1220, + 360, 497, 498, 302, 380, 0, 0, 0, 0, 0, 496, 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 666, 0, 0, 0, 257, 671, 0, 0, 0, 350, 254, 0, 0, @@ -3331,12 +3005,12 @@ var yyAct = [...]int{ 260, 256, 239, 303, 369, 411, 486, 405, 678, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 674, 675, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 89, 0, 1497, + 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, 816, 800, 766, 767, 804, 817, 818, 819, 820, 805, 0, 228, 806, 807, 235, 808, 0, 765, 706, 708, 707, 725, 726, 727, 728, 729, 730, 731, 704, 813, 821, 822, 0, 252, 307, 259, 251, 501, 0, 0, - 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, + 1927, 1928, 1929, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 648, 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, 0, @@ -3395,16 +3069,16 @@ var yyAct = [...]int{ 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 678, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 674, 675, 0, 0, - 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, + 0, 0, 0, 0, 2077, 0, 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, 816, 800, 766, 767, 804, 817, 818, 819, 820, 805, 0, 228, 806, 807, 235, 808, 0, 765, 706, 708, 707, 725, 726, - 727, 728, 729, 730, 731, 704, 813, 821, 822, 0, + 727, 728, 729, 730, 731, 704, 813, 821, 822, 2078, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 648, 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 660, 661, 905, 0, 0, 0, 760, + 0, 0, 0, 660, 661, 0, 0, 0, 0, 760, 0, 662, 0, 0, 670, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, @@ -3452,461 +3126,914 @@ var yyAct = [...]int{ 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, 815, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, - 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, - 360, 497, 498, 302, 496, 0, 679, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, - 0, 666, 0, 0, 0, 257, 671, 0, 0, 0, - 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, - 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, - 486, 405, 678, 354, 0, 0, 476, 384, 0, 0, - 0, 0, 0, 674, 675, 0, 0, 0, 0, 0, - 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 89, 0, 0, 816, 800, 766, 767, 804, 817, - 818, 819, 820, 805, 0, 228, 806, 807, 235, 808, - 0, 765, 706, 708, 707, 725, 726, 727, 728, 729, - 730, 731, 704, 813, 821, 822, 0, 252, 307, 259, - 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, - 0, 0, 0, 0, 0, 0, 0, 648, 663, 0, - 677, 0, 0, 0, 262, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 660, 661, 0, 0, 0, 0, 760, 0, 662, 0, - 0, 670, 823, 824, 825, 826, 827, 828, 829, 830, - 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, - 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, - 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 673, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, - 759, 0, 0, 541, 0, 0, 757, 0, 0, 0, - 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, - 453, 0, 0, 0, 810, 0, 451, 409, 520, 223, - 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, - 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, - 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, - 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, - 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, - 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, - 0, 437, 255, 280, 245, 398, 811, 812, 243, 561, - 712, 536, 210, 0, 535, 391, 505, 514, 378, 367, - 209, 512, 376, 366, 320, 720, 721, 267, 293, 429, - 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, - 199, 0, 478, 525, 562, 224, 225, 227, 0, 266, - 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, - 433, 0, 500, 518, 530, 540, 546, 547, 549, 550, - 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, - 0, 0, 408, 452, 230, 522, 475, 770, 758, 683, - 774, 685, 771, 772, 680, 681, 684, 773, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 0, 761, 669, 668, - 0, 676, 0, 702, 703, 705, 709, 710, 711, 722, - 723, 724, 732, 734, 735, 733, 736, 737, 738, 741, - 742, 743, 744, 739, 740, 745, 686, 690, 687, 688, - 689, 701, 691, 692, 693, 694, 695, 696, 697, 698, - 699, 700, 784, 785, 786, 787, 788, 789, 715, 719, - 718, 716, 717, 713, 714, 667, 190, 211, 352, 0, - 434, 275, 559, 532, 527, 197, 213, 775, 249, 776, - 0, 0, 780, 0, 0, 0, 782, 781, 0, 783, - 749, 748, 0, 0, 777, 778, 0, 779, 0, 0, - 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, - 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, - 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, - 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, - 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, - 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, - 544, 460, 790, 791, 792, 793, 794, 795, 796, 797, - 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, - 291, 306, 0, 531, 481, 217, 446, 277, 240, 815, - 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, - 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, - 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, - 302, 496, 0, 679, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 399, 0, 0, 0, 0, 666, 0, - 0, 0, 257, 671, 0, 0, 0, 350, 254, 0, - 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, - 269, 260, 256, 239, 303, 369, 411, 486, 405, 678, - 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, - 674, 675, 0, 0, 0, 0, 0, 0, 0, 0, - 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, - 0, 816, 800, 766, 767, 804, 817, 818, 819, 820, - 805, 0, 228, 806, 807, 235, 808, 0, 765, 706, - 708, 707, 725, 726, 727, 728, 729, 730, 731, 704, - 813, 821, 822, 0, 252, 307, 259, 251, 501, 0, - 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, - 0, 0, 0, 0, 0, 663, 0, 677, 0, 0, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, - 0, 0, 0, 760, 0, 662, 0, 0, 670, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 673, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 284, 0, 385, 244, 0, 759, 0, 0, - 541, 0, 0, 757, 0, 0, 0, 0, 349, 0, - 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, - 0, 810, 0, 451, 409, 520, 223, 271, 438, 415, - 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, - 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, - 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, - 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, - 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, - 205, 513, 482, 377, 312, 313, 204, 0, 437, 255, - 280, 245, 398, 811, 812, 243, 561, 712, 536, 210, - 0, 535, 391, 505, 514, 378, 367, 209, 512, 376, - 366, 320, 720, 721, 267, 293, 429, 359, 430, 292, - 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, - 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, - 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, - 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, - 555, 554, 390, 297, 474, 319, 357, 0, 0, 408, - 452, 230, 522, 475, 770, 758, 683, 774, 685, 771, - 772, 680, 681, 684, 773, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 0, 761, 669, 668, 0, 676, 0, - 702, 703, 705, 709, 710, 711, 722, 723, 724, 732, - 734, 735, 733, 736, 737, 738, 741, 742, 743, 744, - 739, 740, 745, 686, 690, 687, 688, 689, 701, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 784, - 785, 786, 787, 788, 789, 715, 719, 718, 716, 717, - 713, 714, 667, 190, 211, 352, 0, 434, 275, 559, - 532, 527, 197, 213, 775, 249, 776, 0, 0, 780, - 0, 0, 0, 782, 781, 0, 783, 749, 748, 0, - 0, 777, 778, 0, 779, 0, 0, 192, 193, 200, - 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, - 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, - 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, - 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, - 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, - 479, 480, 484, 507, 509, 521, 539, 544, 460, 790, - 791, 792, 793, 794, 795, 796, 797, 286, 516, 545, - 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, - 531, 481, 217, 446, 277, 240, 815, 0, 202, 236, - 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, - 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, - 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, - 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, - 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, - 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, - 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 0, 0, 0, 0, 627, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, - 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, - 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, - 0, 0, 0, 219, 0, 0, 0, 0, 1313, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, - 1323, 1324, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, - 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, - 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, - 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, - 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, - 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, - 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, - 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, - 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, - 377, 312, 313, 204, 0, 437, 255, 280, 245, 398, - 510, 511, 243, 561, 218, 536, 210, 0, 535, 391, - 505, 514, 378, 367, 209, 512, 376, 366, 320, 339, - 340, 267, 293, 429, 359, 430, 292, 294, 387, 386, - 388, 198, 524, 0, 199, 0, 478, 525, 562, 224, - 225, 227, 0, 266, 270, 278, 281, 289, 290, 299, - 351, 402, 428, 424, 433, 0, 500, 518, 530, 540, - 546, 547, 549, 550, 551, 552, 553, 555, 554, 390, - 297, 474, 319, 357, 0, 0, 408, 452, 230, 522, - 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, - 368, 465, 519, 321, 333, 336, 326, 345, 0, 346, - 322, 323, 328, 330, 331, 332, 337, 338, 342, 348, - 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, - 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, - 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, - 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, - 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, - 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, - 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, - 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, - 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, - 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, - 507, 509, 521, 539, 544, 460, 287, 288, 426, 427, - 300, 301, 556, 557, 286, 516, 545, 0, 0, 362, - 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, - 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, - 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, - 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, - 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, + 464, 487, 488, 489, 491, 379, 253, 416, 0, 380, + 360, 497, 498, 302, 80, 496, 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, - 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, + 0, 0, 666, 0, 0, 0, 257, 671, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, - 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 486, 405, 678, 354, 0, 0, 476, 384, 0, + 0, 0, 0, 0, 674, 675, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, - 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, - 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, + 273, 0, 89, 0, 0, 816, 800, 766, 767, 804, + 817, 818, 819, 820, 805, 0, 228, 806, 807, 235, + 808, 0, 765, 706, 708, 707, 725, 726, 727, 728, + 729, 730, 731, 704, 813, 821, 822, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, - 219, 0, 976, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 219, 0, 0, 0, 0, 0, 0, 0, 648, 663, + 0, 677, 0, 0, 0, 262, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 660, 661, 0, 0, 0, 0, 760, 0, 662, + 0, 0, 670, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, - 0, 0, 0, 975, 541, 0, 0, 0, 0, 0, - 972, 973, 349, 933, 316, 191, 215, 966, 970, 395, - 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, + 0, 759, 0, 0, 541, 0, 0, 757, 0, 0, + 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, + 441, 453, 0, 0, 0, 810, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, 313, - 204, 0, 437, 255, 280, 245, 398, 510, 511, 243, - 561, 218, 536, 210, 0, 535, 391, 505, 514, 378, - 367, 209, 512, 376, 366, 320, 339, 340, 267, 293, + 204, 0, 437, 255, 280, 245, 398, 811, 812, 243, + 561, 712, 536, 210, 0, 535, 391, 505, 514, 378, + 367, 209, 512, 376, 366, 320, 720, 721, 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, 319, - 357, 0, 0, 408, 452, 230, 522, 475, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 563, + 357, 0, 0, 408, 452, 230, 522, 475, 770, 758, + 683, 774, 685, 771, 772, 680, 681, 684, 773, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 575, 576, 577, 578, 579, 580, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 581, 368, 465, 519, - 321, 333, 336, 326, 345, 0, 346, 322, 323, 328, - 330, 331, 332, 337, 338, 342, 348, 238, 201, 374, - 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, - 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, - 448, 447, 317, 318, 363, 431, 0, 190, 211, 352, - 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 574, 575, 576, 577, 578, 579, 580, 0, 761, 669, + 668, 0, 676, 0, 702, 703, 705, 709, 710, 711, + 722, 723, 724, 732, 734, 735, 733, 736, 737, 738, + 741, 742, 743, 744, 739, 740, 745, 686, 690, 687, + 688, 689, 701, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 784, 785, 786, 787, 788, 789, 715, + 719, 718, 716, 717, 713, 714, 667, 190, 211, 352, + 88, 434, 275, 559, 532, 527, 197, 213, 775, 249, + 776, 0, 0, 780, 0, 0, 0, 782, 781, 0, + 783, 749, 748, 0, 0, 777, 778, 0, 779, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, 521, - 539, 544, 460, 287, 288, 426, 427, 300, 301, 556, - 557, 286, 516, 545, 0, 0, 362, 0, 0, 365, + 539, 544, 460, 790, 791, 792, 793, 794, 795, 796, + 797, 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, - 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, + 815, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, - 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, - 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, + 498, 302, 496, 0, 679, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 399, 0, 0, 0, 0, 666, + 0, 0, 0, 257, 671, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, - 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, - 0, 0, 1460, 800, 0, 0, 1457, 0, 0, 0, - 0, 1455, 0, 228, 1456, 1454, 235, 1459, 0, 765, - 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, - 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, + 678, 354, 0, 0, 476, 384, 0, 0, 0, 0, + 0, 674, 675, 0, 0, 0, 0, 0, 0, 0, + 0, 309, 237, 311, 195, 396, 477, 273, 0, 89, + 0, 0, 816, 800, 766, 767, 804, 817, 818, 819, + 820, 805, 0, 228, 806, 807, 235, 808, 0, 765, + 706, 708, 707, 725, 726, 727, 728, 729, 730, 731, + 704, 813, 821, 822, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 648, 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, - 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 661, + 0, 0, 0, 0, 760, 0, 662, 0, 0, 670, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, + 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, + 863, 864, 673, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 284, 0, 385, 244, 0, 759, 0, + 0, 541, 0, 0, 757, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, - 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, - 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, + 0, 0, 810, 0, 451, 409, 520, 223, 271, 438, + 415, 449, 422, 274, 3384, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, 437, - 255, 280, 245, 398, 510, 511, 243, 561, 218, 536, + 255, 280, 245, 398, 811, 812, 243, 561, 712, 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, 512, - 376, 366, 320, 339, 340, 267, 293, 429, 359, 430, + 376, 366, 320, 720, 721, 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, 0, - 408, 452, 230, 522, 475, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 563, 564, 565, 566, + 408, 452, 230, 522, 475, 770, 758, 683, 774, 685, + 771, 772, 680, 681, 684, 773, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, - 577, 578, 579, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 581, 368, 465, 519, 321, 333, 336, - 326, 345, 0, 346, 322, 323, 328, 330, 331, 332, - 337, 338, 342, 348, 238, 201, 374, 382, 499, 298, - 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, - 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, - 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, - 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, + 577, 578, 579, 580, 0, 761, 669, 668, 0, 676, + 0, 702, 703, 705, 709, 710, 711, 722, 723, 724, + 732, 734, 735, 733, 736, 737, 738, 741, 742, 743, + 744, 739, 740, 745, 686, 690, 687, 688, 689, 701, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 784, 785, 786, 787, 788, 789, 715, 719, 718, 716, + 717, 713, 714, 667, 190, 211, 352, 0, 434, 275, + 559, 532, 527, 197, 213, 775, 249, 776, 0, 0, + 780, 0, 0, 0, 782, 781, 0, 783, 749, 748, + 0, 0, 777, 778, 0, 779, 0, 0, 192, 193, + 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, + 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, + 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, + 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, + 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, + 471, 479, 480, 484, 507, 509, 521, 539, 544, 460, + 790, 791, 792, 793, 794, 795, 796, 797, 286, 516, + 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, + 0, 531, 481, 217, 446, 277, 240, 815, 0, 202, + 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, + 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, + 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, + 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 399, 0, 0, 0, 0, 666, 0, 0, 0, + 257, 671, 0, 0, 0, 350, 254, 0, 0, 413, + 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, + 256, 239, 303, 369, 411, 486, 405, 678, 354, 0, + 0, 476, 384, 0, 0, 0, 0, 0, 674, 675, + 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, + 311, 195, 396, 477, 273, 0, 89, 0, 1497, 816, + 800, 766, 767, 804, 817, 818, 819, 820, 805, 0, + 228, 806, 807, 235, 808, 0, 765, 706, 708, 707, + 725, 726, 727, 728, 729, 730, 731, 704, 813, 821, + 822, 0, 252, 307, 259, 251, 501, 0, 0, 0, + 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, + 0, 0, 648, 663, 0, 677, 0, 0, 0, 262, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 660, 661, 0, 0, 0, + 0, 760, 0, 662, 0, 0, 670, 823, 824, 825, + 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, + 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, + 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, + 856, 857, 858, 859, 860, 861, 862, 863, 864, 673, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 284, 0, 385, 244, 0, 759, 0, 0, 541, 0, + 0, 757, 0, 0, 0, 0, 349, 0, 316, 191, + 215, 0, 0, 395, 441, 453, 0, 0, 0, 810, + 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, + 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, + 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, + 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, + 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, + 203, 485, 515, 229, 463, 0, 0, 560, 205, 513, + 482, 377, 312, 313, 204, 0, 437, 255, 280, 245, + 398, 811, 812, 243, 561, 712, 536, 210, 0, 535, + 391, 505, 514, 378, 367, 209, 512, 376, 366, 320, + 720, 721, 267, 293, 429, 359, 430, 292, 294, 387, + 386, 388, 198, 524, 0, 199, 0, 478, 525, 562, + 224, 225, 227, 0, 266, 270, 278, 281, 289, 290, + 299, 351, 402, 428, 424, 433, 0, 500, 518, 530, + 540, 546, 547, 549, 550, 551, 552, 553, 555, 554, + 390, 297, 474, 319, 357, 0, 0, 408, 452, 230, + 522, 475, 770, 758, 683, 774, 685, 771, 772, 680, + 681, 684, 773, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 0, 761, 669, 668, 0, 676, 0, 702, 703, + 705, 709, 710, 711, 722, 723, 724, 732, 734, 735, + 733, 736, 737, 738, 741, 742, 743, 744, 739, 740, + 745, 686, 690, 687, 688, 689, 701, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 784, 785, 786, + 787, 788, 789, 715, 719, 718, 716, 717, 713, 714, + 667, 190, 211, 352, 0, 434, 275, 559, 532, 527, + 197, 213, 775, 249, 776, 0, 0, 780, 0, 0, + 0, 782, 781, 0, 783, 749, 748, 0, 0, 777, + 778, 0, 779, 0, 0, 192, 193, 200, 212, 222, + 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, + 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, + 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, + 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, + 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, + 484, 507, 509, 521, 539, 544, 460, 790, 791, 792, + 793, 794, 795, 796, 797, 286, 516, 545, 0, 0, + 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, + 217, 446, 277, 240, 815, 0, 202, 236, 220, 246, + 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, + 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, + 380, 0, 360, 497, 498, 302, 496, 0, 679, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, + 0, 0, 0, 666, 0, 0, 0, 257, 671, 0, + 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, + 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, + 369, 411, 486, 405, 678, 354, 0, 0, 476, 384, + 0, 0, 0, 0, 0, 674, 675, 0, 0, 0, + 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, + 477, 273, 0, 89, 0, 0, 816, 800, 766, 767, + 804, 817, 818, 819, 820, 805, 0, 228, 806, 807, + 235, 808, 0, 765, 706, 708, 707, 725, 726, 727, + 728, 729, 730, 731, 704, 813, 821, 822, 0, 252, + 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, + 0, 219, 0, 0, 0, 0, 0, 0, 0, 648, + 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 661, 905, 0, 0, 0, 760, 0, + 662, 0, 0, 670, 823, 824, 825, 826, 827, 828, + 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, + 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, + 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 673, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, + 244, 0, 759, 0, 0, 541, 0, 0, 757, 0, + 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, + 395, 441, 453, 0, 0, 0, 810, 0, 451, 409, + 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, + 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, + 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, + 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, + 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, + 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, + 313, 204, 0, 437, 255, 280, 245, 398, 811, 812, + 243, 561, 712, 536, 210, 0, 535, 391, 505, 514, + 378, 367, 209, 512, 376, 366, 320, 720, 721, 267, + 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, + 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, + 0, 266, 270, 278, 281, 289, 290, 299, 351, 402, + 428, 424, 433, 0, 500, 518, 530, 540, 546, 547, + 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, + 319, 357, 0, 0, 408, 452, 230, 522, 475, 770, + 758, 683, 774, 685, 771, 772, 680, 681, 684, 773, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 0, 761, + 669, 668, 0, 676, 0, 702, 703, 705, 709, 710, + 711, 722, 723, 724, 732, 734, 735, 733, 736, 737, + 738, 741, 742, 743, 744, 739, 740, 745, 686, 690, + 687, 688, 689, 701, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 784, 785, 786, 787, 788, 789, + 715, 719, 718, 716, 717, 713, 714, 667, 190, 211, + 352, 0, 434, 275, 559, 532, 527, 197, 213, 775, + 249, 776, 0, 0, 780, 0, 0, 0, 782, 781, + 0, 783, 749, 748, 0, 0, 777, 778, 0, 779, + 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, + 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, + 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, + 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, + 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, + 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, + 521, 539, 544, 460, 790, 791, 792, 793, 794, 795, + 796, 797, 286, 516, 545, 0, 0, 362, 0, 0, + 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, + 240, 815, 0, 202, 236, 220, 246, 261, 264, 310, + 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, + 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, + 497, 498, 302, 496, 0, 679, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, + 666, 0, 0, 0, 257, 671, 0, 0, 0, 350, + 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, + 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, + 405, 678, 354, 0, 0, 476, 384, 0, 0, 0, + 0, 0, 674, 675, 0, 0, 0, 0, 0, 0, + 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, + 89, 0, 0, 816, 800, 766, 767, 804, 817, 818, + 819, 820, 805, 0, 228, 806, 807, 235, 808, 0, + 765, 706, 708, 707, 725, 726, 727, 728, 729, 730, + 731, 704, 813, 821, 822, 0, 252, 307, 259, 251, + 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, + 0, 0, 0, 0, 0, 0, 648, 663, 0, 677, + 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, + 661, 0, 0, 0, 0, 760, 0, 662, 0, 0, + 670, 823, 824, 825, 826, 827, 828, 829, 830, 831, + 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, + 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, + 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, + 862, 863, 864, 673, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 284, 0, 385, 244, 0, 759, + 0, 0, 541, 0, 0, 757, 0, 0, 0, 0, + 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, + 0, 0, 0, 810, 0, 451, 409, 520, 223, 271, + 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, + 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, + 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, + 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, + 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, + 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, + 437, 255, 280, 245, 398, 811, 812, 243, 561, 712, + 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, + 512, 376, 366, 320, 720, 721, 267, 293, 429, 359, + 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, + 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, + 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, + 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, + 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, + 0, 408, 452, 230, 522, 475, 770, 758, 683, 774, + 685, 771, 772, 680, 681, 684, 773, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 0, 761, 669, 668, 0, + 676, 0, 702, 703, 705, 709, 710, 711, 722, 723, + 724, 732, 734, 735, 733, 736, 737, 738, 741, 742, + 743, 744, 739, 740, 745, 686, 690, 687, 688, 689, + 701, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 784, 785, 786, 787, 788, 789, 715, 719, 718, + 716, 717, 713, 714, 667, 190, 211, 352, 0, 434, + 275, 559, 532, 527, 197, 213, 775, 249, 776, 0, + 0, 780, 0, 0, 0, 782, 781, 0, 783, 749, + 748, 0, 0, 777, 778, 0, 779, 0, 0, 192, + 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, + 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, + 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, + 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, + 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, + 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, + 460, 790, 791, 792, 793, 794, 795, 796, 797, 286, + 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, + 306, 0, 531, 481, 217, 446, 277, 240, 815, 0, + 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, + 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, + 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, + 496, 0, 679, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 399, 0, 0, 0, 0, 666, 0, 0, + 0, 257, 671, 0, 0, 0, 350, 254, 0, 0, + 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, + 260, 256, 239, 303, 369, 411, 486, 405, 678, 354, + 0, 0, 476, 384, 0, 0, 0, 0, 0, 674, + 675, 0, 0, 0, 0, 0, 0, 0, 0, 309, + 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, + 816, 800, 766, 767, 804, 817, 818, 819, 820, 805, + 0, 228, 806, 807, 235, 808, 0, 765, 706, 708, + 707, 725, 726, 727, 728, 729, 730, 731, 704, 813, + 821, 822, 0, 252, 307, 259, 251, 501, 0, 0, + 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, + 0, 0, 0, 0, 663, 0, 677, 0, 0, 0, + 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 661, 0, 0, + 0, 0, 760, 0, 662, 0, 0, 670, 823, 824, + 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, + 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, + 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, + 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 284, 0, 385, 244, 0, 759, 0, 0, 541, + 0, 0, 757, 0, 0, 0, 0, 349, 0, 316, + 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, + 810, 0, 451, 409, 520, 223, 271, 438, 415, 449, + 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, + 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, + 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, + 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, + 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, + 513, 482, 377, 312, 313, 204, 0, 437, 255, 280, + 245, 398, 811, 812, 243, 561, 712, 536, 210, 0, + 535, 391, 505, 514, 378, 367, 209, 512, 376, 366, + 320, 720, 721, 267, 293, 429, 359, 430, 292, 294, + 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, + 562, 224, 225, 227, 0, 266, 270, 278, 281, 289, + 290, 299, 351, 402, 428, 424, 433, 0, 500, 518, + 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, + 554, 390, 297, 474, 319, 357, 0, 0, 408, 452, + 230, 522, 475, 770, 758, 683, 774, 685, 771, 772, + 680, 681, 684, 773, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 0, 761, 669, 668, 0, 676, 0, 702, + 703, 705, 709, 710, 711, 722, 723, 724, 732, 734, + 735, 733, 736, 737, 738, 741, 742, 743, 744, 739, + 740, 745, 686, 690, 687, 688, 689, 701, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 784, 785, + 786, 787, 788, 789, 715, 719, 718, 716, 717, 713, + 714, 667, 190, 211, 352, 0, 434, 275, 559, 532, + 527, 197, 213, 775, 249, 776, 0, 0, 780, 0, + 0, 0, 782, 781, 0, 783, 749, 748, 0, 0, + 777, 778, 0, 779, 0, 0, 192, 193, 200, 212, + 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, + 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, + 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, + 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, + 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, + 480, 484, 507, 509, 521, 539, 544, 460, 790, 791, + 792, 793, 794, 795, 796, 797, 286, 516, 545, 0, + 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, + 481, 217, 446, 277, 240, 815, 0, 202, 236, 220, + 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, + 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, + 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, + 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, + 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, + 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, + 396, 477, 273, 0, 0, 0, 0, 0, 627, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, + 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, + 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, + 0, 0, 219, 0, 0, 0, 0, 1313, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, + 1324, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, + 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, + 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, + 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, + 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, + 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, + 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, + 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, + 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, + 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, + 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, + 511, 243, 561, 218, 536, 210, 0, 535, 391, 505, + 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, + 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, + 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, + 227, 0, 266, 270, 278, 281, 289, 290, 299, 351, + 402, 428, 424, 433, 0, 500, 518, 530, 540, 546, + 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, + 474, 319, 357, 0, 0, 408, 452, 230, 522, 475, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 581, 368, + 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, + 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, + 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, + 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, + 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, + 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, + 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, + 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, + 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, + 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, + 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, + 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, + 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, + 301, 556, 557, 286, 516, 545, 0, 0, 362, 0, + 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, + 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, + 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, + 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, + 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, + 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, + 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, + 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, + 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, + 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, + 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, + 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, + 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, + 0, 976, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, + 0, 0, 975, 541, 0, 0, 0, 0, 0, 972, + 973, 349, 933, 316, 191, 215, 966, 970, 395, 441, + 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, + 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, + 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, + 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, + 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, + 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, + 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, + 0, 437, 255, 280, 245, 398, 510, 511, 243, 561, + 218, 536, 210, 0, 535, 391, 505, 514, 378, 367, + 209, 512, 376, 366, 320, 339, 340, 267, 293, 429, + 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, + 199, 0, 478, 525, 562, 224, 225, 227, 0, 266, + 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, + 433, 0, 500, 518, 530, 540, 546, 547, 549, 550, + 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, + 0, 0, 408, 452, 230, 522, 475, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 581, 368, 465, 519, 321, + 333, 336, 326, 345, 0, 346, 322, 323, 328, 330, + 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, + 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, + 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, + 447, 317, 318, 363, 431, 0, 190, 211, 352, 0, + 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, + 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, + 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, + 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, + 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, + 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, + 544, 460, 287, 288, 426, 427, 300, 301, 556, 557, + 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, + 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, + 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, + 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, + 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, + 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, + 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, + 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, + 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, + 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, + 0, 1460, 800, 0, 0, 1457, 0, 0, 0, 0, + 1455, 0, 228, 1456, 1454, 235, 1459, 0, 765, 335, + 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, + 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, + 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, + 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, + 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, + 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, + 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, + 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, + 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, + 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, + 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, + 205, 513, 482, 377, 312, 313, 204, 0, 437, 255, + 280, 245, 398, 510, 511, 243, 561, 218, 536, 210, + 0, 535, 391, 505, 514, 378, 367, 209, 512, 376, + 366, 320, 339, 340, 267, 293, 429, 359, 430, 292, + 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, + 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, + 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, + 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, + 555, 554, 390, 297, 474, 319, 357, 0, 0, 408, + 452, 230, 522, 475, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 581, 368, 465, 519, 321, 333, 336, 326, + 345, 0, 346, 322, 323, 328, 330, 331, 332, 337, + 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, + 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, + 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, + 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, + 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, + 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, + 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, + 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, + 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, + 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, + 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, + 288, 426, 427, 300, 301, 556, 557, 286, 516, 545, + 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, + 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, + 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, + 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, + 253, 416, 0, 380, 360, 497, 498, 302, 80, 496, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, + 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, + 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, + 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, + 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, + 311, 195, 396, 477, 273, 0, 89, 0, 0, 0, + 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, + 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, + 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, + 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, + 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, + 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, + 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, + 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, + 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, + 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, + 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, + 203, 485, 515, 229, 463, 0, 0, 560, 205, 513, + 482, 377, 312, 313, 204, 0, 437, 255, 280, 245, + 398, 510, 511, 243, 561, 218, 536, 210, 0, 535, + 391, 505, 514, 378, 367, 209, 512, 376, 366, 320, + 339, 340, 267, 293, 429, 359, 430, 292, 294, 387, + 386, 388, 198, 524, 0, 199, 0, 478, 525, 562, + 224, 225, 227, 0, 266, 270, 278, 281, 289, 290, + 299, 351, 402, 428, 424, 433, 0, 500, 518, 530, + 540, 546, 547, 549, 550, 551, 552, 553, 555, 554, + 390, 297, 474, 319, 357, 0, 0, 408, 452, 230, + 522, 475, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 581, 368, 465, 519, 321, 333, 336, 326, 345, 0, + 346, 322, 323, 328, 330, 331, 332, 337, 338, 342, + 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, + 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, + 445, 279, 528, 295, 448, 447, 317, 318, 363, 431, + 0, 190, 211, 352, 88, 434, 275, 559, 532, 527, + 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, + 2064, 0, 0, 2063, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, + 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, + 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, + 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, + 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, + 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, + 484, 507, 509, 521, 539, 544, 460, 287, 288, 426, + 427, 300, 301, 556, 557, 286, 516, 545, 0, 0, + 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, + 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, + 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, + 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, + 1516, 0, 360, 497, 498, 302, 496, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, + 0, 0, 1518, 0, 0, 0, 0, 257, 0, 0, + 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, + 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, + 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, + 477, 273, 0, 0, 0, 0, 1520, 627, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, + 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, + 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, + 0, 219, 0, 0, 0, 1294, 0, 1295, 1296, 0, + 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, + 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, + 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, + 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, + 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, + 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, + 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, + 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, + 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, + 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, + 313, 204, 0, 437, 255, 280, 245, 398, 510, 511, + 243, 561, 218, 536, 210, 0, 535, 391, 505, 514, + 378, 367, 209, 512, 376, 366, 320, 339, 340, 267, + 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, + 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, + 0, 266, 270, 278, 281, 289, 290, 299, 351, 402, + 428, 424, 433, 0, 500, 518, 530, 540, 546, 547, + 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, + 319, 357, 0, 0, 408, 452, 230, 522, 475, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 581, 368, 465, + 519, 321, 333, 336, 326, 345, 0, 346, 322, 323, + 328, 330, 331, 332, 337, 338, 342, 348, 238, 201, + 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, + 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, + 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, + 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, + 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, + 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, + 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, + 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, + 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, + 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, + 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, + 556, 557, 286, 516, 545, 0, 0, 362, 0, 0, + 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, + 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, + 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, + 487, 488, 489, 491, 379, 253, 416, 0, 380, 360, + 497, 498, 302, 80, 496, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, + 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, + 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, + 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, + 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, + 0, 89, 0, 1497, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, + 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, + 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, + 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, + 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, + 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, + 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, + 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, + 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, + 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, + 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, + 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, + 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, + 0, 437, 255, 280, 245, 398, 510, 511, 243, 561, + 218, 536, 210, 0, 535, 391, 505, 514, 378, 367, + 209, 512, 376, 366, 320, 339, 340, 267, 293, 429, + 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, + 199, 0, 478, 525, 562, 224, 225, 227, 0, 266, + 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, + 433, 0, 500, 518, 530, 540, 546, 547, 549, 550, + 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, + 0, 0, 408, 452, 230, 522, 475, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 581, 368, 465, 519, 321, + 333, 336, 326, 345, 0, 346, 322, 323, 328, 330, + 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, + 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, + 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, + 447, 317, 318, 363, 431, 0, 190, 211, 352, 88, + 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, - 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, - 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, - 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, - 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, - 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, - 471, 479, 480, 484, 507, 509, 521, 539, 544, 460, - 287, 288, 426, 427, 300, 301, 556, 557, 286, 516, - 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, - 0, 531, 481, 217, 446, 277, 240, 0, 0, 202, - 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, - 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, - 379, 253, 416, 0, 380, 360, 497, 498, 302, 80, - 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, - 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, - 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, - 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, - 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, - 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, - 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, - 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, - 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, + 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, + 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, + 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, + 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, + 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, + 544, 460, 287, 288, 426, 427, 300, 301, 556, 557, + 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, + 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, + 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, + 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, + 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, + 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, + 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, + 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, + 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, + 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, + 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, + 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, + 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, + 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, - 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, - 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, - 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, - 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, - 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, - 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, - 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, - 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, - 513, 482, 377, 312, 313, 204, 0, 437, 255, 280, - 245, 398, 510, 511, 243, 561, 218, 536, 210, 0, - 535, 391, 505, 514, 378, 367, 209, 512, 376, 366, - 320, 339, 340, 267, 293, 429, 359, 430, 292, 294, - 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, - 562, 224, 225, 227, 0, 266, 270, 278, 281, 289, - 290, 299, 351, 402, 428, 424, 433, 0, 500, 518, - 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, - 554, 390, 297, 474, 319, 357, 0, 0, 408, 452, - 230, 522, 475, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 581, 368, 465, 519, 321, 333, 336, 326, 345, - 0, 346, 322, 323, 328, 330, 331, 332, 337, 338, - 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, - 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, - 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, - 431, 0, 190, 211, 352, 88, 434, 275, 559, 532, - 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, - 0, 2064, 0, 0, 2063, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, - 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, - 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, - 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, - 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, - 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, - 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, - 426, 427, 300, 301, 556, 557, 286, 516, 545, 0, - 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, - 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, - 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, - 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, - 416, 1516, 0, 360, 497, 498, 302, 496, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 0, 0, 1518, 0, 0, 0, 0, 257, 0, - 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, - 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, - 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, - 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 1520, 627, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, - 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, - 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, - 0, 0, 219, 0, 0, 0, 1294, 0, 1295, 1296, - 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, + 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, + 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, + 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, + 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, + 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, + 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, + 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, + 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, + 205, 513, 482, 377, 312, 313, 204, 0, 437, 255, + 280, 245, 398, 510, 511, 243, 561, 218, 536, 210, + 0, 535, 391, 505, 514, 378, 367, 209, 512, 376, + 366, 320, 339, 340, 267, 293, 429, 359, 430, 292, + 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, + 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, + 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, + 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, + 555, 554, 390, 297, 474, 319, 357, 0, 0, 408, + 452, 230, 522, 475, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 581, 368, 465, 519, 321, 333, 336, 326, + 345, 0, 346, 322, 323, 328, 330, 331, 332, 337, + 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, + 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, + 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, + 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, + 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, + 0, 0, 2064, 0, 0, 2063, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, + 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, + 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, + 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, + 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, + 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, + 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, + 288, 426, 427, 300, 301, 556, 557, 286, 516, 545, + 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, + 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, + 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, + 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, + 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 399, 0, 0, 0, 2014, 0, 0, 0, 0, 257, + 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, + 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, + 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, + 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, + 195, 396, 477, 273, 0, 0, 0, 0, 1697, 188, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, + 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, + 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, + 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, - 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, - 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, - 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, - 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, - 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, - 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, - 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, - 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, - 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, - 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, - 511, 243, 561, 218, 536, 210, 0, 535, 391, 505, - 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, - 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, - 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, - 227, 0, 266, 270, 278, 281, 289, 290, 299, 351, - 402, 428, 424, 433, 0, 500, 518, 530, 540, 546, - 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, - 474, 319, 357, 0, 0, 408, 452, 230, 522, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 581, 368, - 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, - 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, - 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, - 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, - 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, - 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, - 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, + 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, + 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, + 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, + 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, + 0, 2012, 450, 356, 506, 432, 517, 542, 543, 250, + 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, + 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, + 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, + 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, + 377, 312, 313, 204, 0, 437, 255, 280, 245, 398, + 510, 511, 243, 561, 218, 536, 210, 0, 535, 391, + 505, 514, 378, 367, 209, 512, 376, 366, 320, 339, + 340, 267, 293, 429, 359, 430, 292, 294, 387, 386, + 388, 198, 524, 0, 199, 0, 478, 525, 562, 224, + 225, 227, 0, 266, 270, 278, 281, 289, 290, 299, + 351, 402, 428, 424, 433, 0, 500, 518, 530, 540, + 546, 547, 549, 550, 551, 552, 553, 555, 554, 390, + 297, 474, 319, 357, 0, 0, 408, 452, 230, 522, + 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, + 368, 465, 519, 321, 333, 336, 326, 345, 0, 346, + 322, 323, 328, 330, 331, 332, 337, 338, 342, 348, + 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, + 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, + 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, + 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, + 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, - 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, - 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, - 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, - 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, - 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, - 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, - 301, 556, 557, 286, 516, 545, 0, 0, 362, 0, - 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, - 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, - 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, - 464, 487, 488, 489, 491, 379, 253, 416, 0, 380, - 360, 497, 498, 302, 80, 496, 0, 0, 0, 0, + 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, + 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, + 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, + 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, + 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, + 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, + 507, 509, 521, 539, 544, 460, 287, 288, 426, 427, + 300, 301, 556, 557, 286, 516, 545, 0, 0, 362, + 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, + 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, + 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, + 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, + 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, @@ -3914,14 +4041,14 @@ var yyAct = [...]int{ 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 89, 0, 1497, 0, 627, 0, 0, 0, + 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3930,7 +4057,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, - 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, + 0, 0, 349, 933, 316, 191, 215, 931, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, @@ -3956,7 +4083,7 @@ var yyAct = [...]int{ 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, 352, - 88, 434, 275, 559, 532, 527, 197, 213, 0, 249, + 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, @@ -3972,14 +4099,14 @@ var yyAct = [...]int{ 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 399, 0, 0, 0, 2014, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 309, 237, 311, 195, 396, 477, 273, 0, 89, - 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, + 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, + 0, 0, 1697, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, @@ -4022,7 +4149,7 @@ var yyAct = [...]int{ 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, - 0, 0, 0, 2064, 0, 0, 2063, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, @@ -4037,14 +4164,14 @@ var yyAct = [...]int{ 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 399, 0, 0, 0, 2014, 0, 0, 0, 0, + 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, - 311, 195, 396, 477, 273, 0, 0, 0, 0, 1697, - 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 311, 195, 396, 477, 273, 0, 0, 0, 1497, 0, + 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, @@ -4059,10 +4186,10 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, - 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, + 0, 0, 3294, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, - 274, 0, 2012, 450, 356, 506, 432, 517, 542, 543, + 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, @@ -4108,23 +4235,23 @@ var yyAct = [...]int{ 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 0, 0, 0, 0, 627, 0, 0, + 477, 273, 0, 0, 0, 0, 1847, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, - 0, 0, 0, 0, 0, 927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, - 0, 0, 0, 349, 933, 316, 191, 215, 931, 0, + 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, @@ -4166,14 +4293,14 @@ var yyAct = [...]int{ 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 0, 0, 2014, + 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 0, 1697, 188, 0, 0, 0, 0, 0, + 0, 0, 0, 2415, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, @@ -4182,7 +4309,7 @@ var yyAct = [...]int{ 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4237,9 +4364,9 @@ var yyAct = [...]int{ 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 0, 0, 1497, - 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, + 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, + 0, 627, 0, 0, 0, 0, 2400, 0, 0, 0, + 0, 228, 0, 0, 235, 2401, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, @@ -4253,7 +4380,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, - 0, 0, 0, 3294, 0, 0, 0, 349, 0, 316, + 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, @@ -4296,13 +4423,13 @@ var yyAct = [...]int{ 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 1539, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 1847, 627, 0, + 396, 477, 273, 0, 0, 0, 0, 1538, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, @@ -4311,7 +4438,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1848, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4367,7 +4494,7 @@ var yyAct = [...]int{ 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 0, 0, 0, 2415, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 629, 630, 631, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, @@ -4376,7 +4503,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2416, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4432,8 +4559,8 @@ var yyAct = [...]int{ 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, - 0, 0, 627, 0, 0, 0, 0, 2400, 0, 0, - 0, 0, 228, 0, 0, 235, 2401, 0, 0, 335, + 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, @@ -4447,7 +4574,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, - 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, + 541, 0, 0, 0, 3419, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, @@ -4491,12 +4618,12 @@ var yyAct = [...]int{ 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, - 1539, 0, 0, 0, 350, 254, 0, 0, 413, 0, + 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 0, 0, 0, 1538, 627, + 195, 396, 477, 273, 0, 0, 0, 0, 1697, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, @@ -4561,7 +4688,7 @@ var yyAct = [...]int{ 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 0, 0, 0, 0, 629, 630, 631, 0, + 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, @@ -4576,7 +4703,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, - 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 541, 0, 0, 0, 3294, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, @@ -4625,7 +4752,7 @@ var yyAct = [...]int{ 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, + 0, 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, @@ -4641,7 +4768,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, - 0, 541, 0, 0, 0, 3418, 0, 0, 0, 349, + 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, @@ -4683,14 +4810,14 @@ var yyAct = [...]int{ 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2065, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, - 311, 195, 396, 477, 273, 0, 0, 0, 0, 1697, + 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, @@ -4755,7 +4882,7 @@ var yyAct = [...]int{ 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 0, 0, 0, 0, 627, 0, 0, + 477, 273, 0, 0, 0, 0, 1520, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, @@ -4770,7 +4897,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, - 244, 0, 0, 0, 0, 541, 0, 0, 0, 3294, + 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, @@ -4820,7 +4947,7 @@ var yyAct = [...]int{ 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 89, 0, 0, 0, 627, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, @@ -4861,7 +4988,7 @@ var yyAct = [...]int{ 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, - 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, + 317, 318, 363, 431, 0, 190, 211, 352, 1802, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, @@ -4877,7 +5004,7 @@ var yyAct = [...]int{ 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, - 496, 0, 0, 0, 0, 2065, 0, 0, 0, 0, + 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, @@ -4885,7 +5012,7 @@ var yyAct = [...]int{ 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, + 1794, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, @@ -4943,13 +5070,13 @@ var yyAct = [...]int{ 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 1664, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 1520, 627, 0, + 396, 477, 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, @@ -5007,14 +5134,14 @@ var yyAct = [...]int{ 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 399, 0, 1662, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, @@ -5055,7 +5182,7 @@ var yyAct = [...]int{ 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, - 447, 317, 318, 363, 431, 0, 190, 211, 352, 1802, + 447, 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5072,14 +5199,14 @@ var yyAct = [...]int{ 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 399, 0, 1660, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, - 0, 1794, 627, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, @@ -5137,7 +5264,7 @@ var yyAct = [...]int{ 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 399, 0, 1664, 0, 0, 0, 0, 0, 0, 257, + 399, 0, 1658, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, @@ -5201,7 +5328,7 @@ var yyAct = [...]int{ 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 399, 0, 1662, + 0, 0, 0, 0, 0, 0, 0, 399, 0, 1656, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, @@ -5266,7 +5393,7 @@ var yyAct = [...]int{ 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 399, 0, 1660, 0, 0, 0, + 0, 0, 0, 0, 399, 0, 1652, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, @@ -5331,7 +5458,7 @@ var yyAct = [...]int{ 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 399, 0, 1658, 0, 0, 0, 0, 0, 0, + 0, 399, 0, 1650, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, @@ -5396,7 +5523,7 @@ var yyAct = [...]int{ 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, - 1656, 0, 0, 0, 0, 0, 0, 257, 0, 0, + 1648, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, @@ -5460,14 +5587,14 @@ var yyAct = [...]int{ 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 1652, 0, 0, + 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, + 1623, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, @@ -5525,14 +5652,14 @@ var yyAct = [...]int{ 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 399, 0, 1650, 0, 0, 0, 0, 0, - 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, + 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, + 1524, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, @@ -5590,13 +5717,13 @@ var yyAct = [...]int{ 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 1648, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 0, 627, 0, + 396, 477, 273, 0, 89, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, @@ -5661,7 +5788,7 @@ var yyAct = [...]int{ 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 1623, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, @@ -5675,7 +5802,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, + 0, 0, 0, 1277, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, @@ -5713,14 +5840,14 @@ var yyAct = [...]int{ 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, 556, 557, - 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, + 1276, 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, - 0, 1524, 257, 0, 0, 0, 0, 350, 254, 0, + 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, @@ -5770,7 +5897,7 @@ var yyAct = [...]int{ 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, + 0, 0, 0, 886, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, @@ -5790,7 +5917,7 @@ var yyAct = [...]int{ 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 89, 0, 0, 0, 800, + 195, 396, 477, 273, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, @@ -5805,7 +5932,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, + 0, 385, 244, 0, 0, 584, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, @@ -5855,7 +5982,7 @@ var yyAct = [...]int{ 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 0, 0, 0, 0, 188, 0, 0, 0, + 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, @@ -5869,7 +5996,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1277, 0, 284, 0, 385, 244, + 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, @@ -5902,12 +6029,12 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, - 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, + 371, 372, 373, 3427, 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, 556, - 557, 1276, 516, 545, 0, 0, 362, 0, 0, 365, + 557, 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, @@ -5920,7 +6047,7 @@ var yyAct = [...]int{ 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, - 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, @@ -5964,7 +6091,7 @@ var yyAct = [...]int{ 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 886, 0, 0, 0, 192, 193, + 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, @@ -5985,7 +6112,7 @@ var yyAct = [...]int{ 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, - 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, @@ -5999,7 +6126,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 284, 0, 385, 244, 0, 0, 584, 0, 541, 0, + 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, @@ -6049,7 +6176,7 @@ var yyAct = [...]int{ 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 0, 0, 0, 0, 627, 0, 0, + 477, 273, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, @@ -6089,240 +6216,46 @@ var yyAct = [...]int{ 519, 321, 333, 336, 326, 345, 0, 346, 322, 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, - 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, - 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, - 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, - 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, - 370, 371, 372, 373, 3426, 393, 394, 397, 400, 401, - 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, - 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, - 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, - 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, - 556, 557, 286, 516, 545, 0, 0, 362, 0, 0, - 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, - 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, - 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, - 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, - 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, - 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, - 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, - 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, - 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, - 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, - 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, - 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, - 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, - 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, - 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, - 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, - 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, - 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, - 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, - 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, - 437, 255, 280, 245, 398, 510, 511, 243, 561, 218, - 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, - 512, 376, 366, 320, 339, 340, 267, 293, 429, 359, - 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, - 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, - 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, - 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, - 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, - 0, 408, 452, 230, 522, 475, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 581, 368, 465, 519, 321, 333, - 336, 326, 345, 0, 346, 322, 323, 328, 330, 331, - 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, - 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, - 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, - 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, - 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, - 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, - 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, - 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, - 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, - 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, - 460, 287, 288, 426, 427, 300, 301, 556, 557, 286, - 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, - 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, - 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, - 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, - 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, - 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, - 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, - 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, - 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, - 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, - 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, - 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, - 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, - 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, - 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, - 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, - 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, - 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, - 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, - 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, - 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, - 513, 482, 377, 312, 313, 204, 0, 437, 255, 280, - 245, 398, 510, 511, 243, 561, 218, 536, 210, 0, - 535, 391, 505, 514, 378, 367, 209, 512, 376, 366, - 320, 339, 340, 267, 293, 429, 359, 430, 292, 294, - 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, - 562, 224, 225, 227, 0, 266, 270, 278, 281, 289, - 290, 299, 351, 402, 428, 424, 433, 0, 500, 518, - 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, - 554, 390, 297, 474, 319, 357, 0, 0, 408, 452, - 230, 522, 475, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 581, 368, 465, 519, 321, 333, 336, 326, 345, - 0, 346, 322, 323, 328, 330, 331, 332, 337, 338, - 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, - 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, - 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, - 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, - 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, - 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, - 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, - 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, - 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, - 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, - 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, - 426, 427, 300, 301, 556, 557, 286, 516, 545, 0, - 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, - 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, - 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, - 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, - 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, - 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, - 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, - 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, - 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 0, 188, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, - 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, - 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, - 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, - 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, - 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, - 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, - 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, - 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, - 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, - 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, - 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, - 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, - 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, - 511, 243, 561, 218, 536, 210, 0, 535, 391, 505, - 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, - 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, - 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, - 227, 0, 266, 270, 278, 281, 289, 290, 299, 351, - 402, 428, 424, 433, 0, 500, 518, 530, 540, 546, - 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, - 474, 319, 357, 0, 0, 408, 452, 230, 522, 475, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 581, 368, - 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, - 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, - 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, - 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, - 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, - 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, - 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, - 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, - 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, - 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, - 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, - 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, - 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, - 301, 556, 557, 286, 516, 545, 0, 0, 362, 0, - 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, - 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, - 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, - 464, 487, 488, 489, 491, 379, 253, 416, 0, 0, - 360, 497, 498, 302, + 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, + 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, + 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, + 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, + 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, + 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, + 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, + 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, + 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, + 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, + 556, 557, 286, 516, 545, 0, 0, 362, 0, 0, + 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, + 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, + 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, + 487, 488, 489, 491, 379, 253, 416, 0, 0, 360, + 497, 498, 302, } var yyPact = [...]int{ - -1000, -1000, 4969, -1000, -456, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 5826, -1000, -455, -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, 2161, 2275, - -1000, -1000, -1000, -1000, 2360, -1000, 827, 1842, -1000, 2174, - 307, -1000, 47207, 600, -1000, 44619, 599, 221, 30385, -1000, - 200, -1000, 205, 45913, 210, -1000, -1000, -1000, -297, 19384, - 2080, 86, 83, 47207, -1000, -1000, -1000, -1000, 2322, 1858, - -1000, 385, -1000, -1000, -1000, -1000, -1000, -1000, 43972, -1000, - 999, -1000, -1000, 2185, 2179, 2375, 737, 2087, -1000, 2263, - 1858, -1000, 19384, 2314, 2248, 18737, 18737, 522, -1000, -1000, - 162, -1000, -1000, 25856, 47207, 32973, 392, -1000, 2174, -1000, - -1000, -1000, 117, -1000, 411, 1775, -1000, 1774, -1000, 976, - 723, 441, 551, 519, 440, 438, 437, 418, 417, 415, - 408, 393, 447, -1000, 798, 798, -117, -121, 1726, 633, - 480, 480, 809, 557, 2115, 2095, -1000, -1000, 798, 798, - 798, 365, 798, 798, 798, 798, 326, 321, 798, 798, - 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, - 798, 798, 798, 798, 798, 375, 2174, 299, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2148, 2198, + -1000, -1000, -1000, -1000, 2370, -1000, 776, 1786, -1000, 2147, + 309, -1000, 46536, 572, -1000, 43948, 571, 224, 29714, -1000, + 218, -1000, 203, 45242, 212, -1000, -1000, -1000, -305, 18713, + 2037, 94, 92, 46536, -1000, -1000, -1000, -1000, 2334, 1745, + -1000, 445, -1000, -1000, -1000, -1000, -1000, -1000, 43301, -1000, + 932, -1000, -1000, 2159, 2149, 2372, 700, 2100, -1000, 2240, + 1745, -1000, 18713, 2313, 2207, 18066, 18066, 500, -1000, -1000, + 238, -1000, -1000, 25185, 46536, 32302, 721, -1000, 2147, -1000, + -1000, -1000, 159, -1000, 369, 1670, -1000, 1669, -1000, 766, + 888, 427, 509, 505, 418, 417, 404, 383, 382, 381, + 372, 364, 433, -1000, 724, 724, -120, -121, 280, 553, + 490, 490, 935, 521, 2118, 2117, -1000, -1000, 724, 724, + 724, 378, 724, 724, 724, 724, 331, 324, 724, 724, + 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, + 724, 724, 724, 724, 724, 397, 2147, 299, -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, @@ -6362,59 +6295,59 @@ 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, 47207, 250, 47207, -1000, 657, 47207, 932, 932, - 107, 932, 932, 932, 932, 215, 721, 76, -1000, 208, - 303, 194, 296, 888, 405, -1000, -1000, 283, 888, 1650, - -1000, 748, 196, -1000, 932, 932, -1000, 12889, 157, 12889, - 12889, -1000, 2163, -1000, -1000, -1000, -1000, -1000, 1161, -1000, - -1000, -1000, -1000, -1000, 556, -1000, -1000, -1000, -1000, 45913, - 43325, -1000, -1000, 80, -1000, -1000, 1662, 1231, 19384, 1167, - -1000, 1101, 713, -1000, -1000, -1000, -1000, -1000, 638, -1000, - 20031, 20031, 20031, 20031, -1000, -1000, 1778, 42678, 1778, 1778, - 20031, 1778, -1000, 20031, 1778, 1778, 1778, 19384, 1778, 1778, - 1778, 1778, -1000, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, -1000, -1000, -1000, -1000, 1778, 655, 1778, 1778, 1778, - 1778, 1778, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1778, 1778, 1778, 1778, 1778, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21972, - 1394, 1393, 1390, -1000, 16796, 1778, -1000, -1000, -1000, -1000, + -1000, -1000, 46536, 256, 46536, -1000, 629, 46536, 876, 876, + 118, 876, 876, 876, 876, 216, 731, 90, -1000, 215, + 294, 200, 296, 859, 316, -1000, -1000, 283, 859, 1533, + -1000, 706, 197, -1000, 876, 876, -1000, 12218, 152, 12218, + 12218, -1000, 2140, -1000, -1000, -1000, -1000, -1000, 1135, -1000, + -1000, -1000, -1000, -1000, 518, -1000, -1000, -1000, -1000, 45242, + 42654, -1000, -1000, 65, -1000, -1000, 1598, 1041, 18713, 1233, + -1000, 1564, 679, -1000, -1000, -1000, -1000, -1000, 596, -1000, + 19360, 19360, 19360, 19360, -1000, -1000, 1672, 42007, 1672, 1672, + 19360, 1672, -1000, 19360, 1672, 1672, 1672, 18713, 1672, 1672, + 1672, 1672, -1000, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, -1000, -1000, -1000, -1000, 1672, 627, 1672, 1672, 1672, + 1672, 1672, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1672, 1672, 1672, 1672, 1672, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21301, + 1339, 1337, 1324, -1000, 16125, 1672, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 47207, -1000, 1778, 241, - 45913, 45913, 436, 2263, 1858, -1000, 2322, 2282, 385, -1000, - 2884, 1385, 1371, 1282, 1858, 1758, 47207, -1000, 1785, -1000, - -1000, -1000, -1000, 2003, 1307, 1640, -1000, -1000, -1000, -1000, - 2051, 19384, -1000, -1000, 2353, -1000, 23267, 651, 2350, 42031, - -1000, 522, 522, 1772, 433, 19, -1000, -1000, -1000, -1000, - 813, 29738, -1000, -1000, -1000, -1000, 1649, 47207, -1000, -1000, - 3675, 1165, -1000, 1841, -1000, 1643, -1000, 1797, 19384, 1852, - 584, 1165, 575, 572, 562, -1000, -21, -1000, -1000, -1000, - -1000, -1000, -1000, 798, 798, 798, -1000, 419, 2308, 307, - 4625, -1000, -1000, -1000, 41384, 1839, 1165, -1000, 1832, -1000, - 899, 607, 686, 686, 1165, -1000, -1000, 46560, 1165, 875, - 871, 1165, 1165, 45913, 45913, -1000, 40737, -1000, 40090, 39443, - 1155, 45913, 38796, 38149, 37502, 36855, 36208, -1000, 2091, -1000, - 2020, -1000, -1000, -1000, 46560, 1165, 1165, 46560, 45913, 46560, - 47207, 1165, -1000, -1000, 362, -1000, -1000, 1146, 1140, 1136, - 798, 798, 1129, 1638, 1618, 1602, 798, 798, 1127, 1597, - 31679, 1591, 329, 1122, 1119, 1115, 1152, 1586, 189, 1560, - 1151, 1149, 1109, 45913, 1831, 47207, -1000, 274, 780, 486, - 812, 2174, 2073, 1771, 543, 583, 1165, 508, 508, 45913, - -1000, 14848, -1000, -1000, 1546, 19384, -1000, 889, 888, 888, - -1000, -1000, -1000, -1000, -1000, -1000, 932, 47207, 889, -1000, - -1000, -1000, 888, 932, 47207, 932, 932, 932, 932, 888, - 888, 888, 932, 47207, 47207, 47207, 47207, 47207, 47207, 47207, - 47207, 47207, 12889, 748, 932, -301, -1000, 1514, -1000, 1960, + -1000, -1000, -1000, -1000, -1000, -1000, 46536, -1000, 1672, 232, + 45242, 45242, 423, 2240, 1745, -1000, 2334, 2254, 445, -1000, + 2376, 1409, 1473, 1195, 1745, 1651, 46536, -1000, 1700, -1000, + -1000, -1000, -1000, 1936, 1283, 1514, -1000, -1000, -1000, -1000, + 2028, 18713, -1000, -1000, 2350, -1000, 22596, 624, 2348, 41360, + -1000, 500, 500, 1665, 439, 40, -1000, -1000, -1000, -1000, + 753, 29067, -1000, -1000, -1000, -1000, 1585, 46536, -1000, -1000, + 5079, 1129, -1000, 1776, -1000, 1538, -1000, 1739, 18713, 1747, + 568, 1129, 564, 549, 548, -1000, -2, -1000, -1000, -1000, + -1000, -1000, -1000, 724, 724, 724, -1000, 376, 2312, 309, + 5021, -1000, -1000, -1000, 40713, 1775, 1129, -1000, 1772, -1000, + 856, 597, 642, 642, 1129, -1000, -1000, 45889, 1129, 853, + 847, 1129, 1129, 45242, 45242, -1000, 40066, -1000, 39419, 38772, + 1110, 45242, 38125, 37478, 36831, 36184, 35537, -1000, 2078, -1000, + 1785, -1000, -1000, -1000, 45889, 1129, 1129, 45889, 45242, 45889, + 46536, 1129, -1000, -1000, 385, -1000, -1000, 1108, 1107, 1102, + 724, 724, 1099, 1513, 1509, 1507, 724, 724, 1094, 1506, + 31008, 1505, 290, 1091, 1085, 1081, 1128, 1504, 188, 1490, + 1043, 1015, 1075, 45242, 1767, 46536, -1000, 282, 764, 695, + 749, 2147, 2022, 1663, 511, 567, 1129, 493, 493, 45242, + -1000, 12871, -1000, -1000, 1481, 18713, -1000, 875, 859, 859, + -1000, -1000, -1000, -1000, -1000, -1000, 876, 46536, 875, -1000, + -1000, -1000, 859, 876, 46536, 876, 876, 876, 876, 859, + 859, 859, 876, 46536, 46536, 46536, 46536, 46536, 46536, 46536, + 46536, 46536, 12218, 706, 876, -313, -1000, 1469, -1000, 1892, -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, @@ -6430,281 +6363,281 @@ 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, 12889, 12889, -1000, -1000, - -1000, -1000, 209, -1000, 35561, 400, 811, -1000, 1770, 34914, - -1000, -312, -315, -349, -353, -1000, -1000, -1000, -356, -358, - -1000, -1000, -1000, 19384, 19384, 19384, 19384, -150, -1000, 990, - 20031, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 136, 967, - 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, - 20031, 20031, 20031, 20031, 20031, -1000, -1000, 27797, 6098, 6098, - 713, 713, 713, 713, -1000, -84, 1768, 46560, -1000, -1000, - -1000, 649, 19384, 19384, 713, -1000, 1165, 16796, 20678, 18737, - 18737, 19384, 822, 1231, 46560, 19384, -1000, 1282, -1000, -1000, - -1000, 1154, -1000, 908, 2209, 2209, 2209, 2209, 19384, 19384, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 2209, 45913, - 45913, 591, 19384, 19384, 19384, 19384, 19384, 19384, 15501, 19384, - 19384, 20031, 19384, 19384, 19384, 1282, 19384, 19384, 19384, 19384, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, - 19384, 19384, 19384, 1282, 19384, 1048, 19384, 19384, 18737, 14195, - 18737, 18737, 18737, 18737, 18737, -1000, -1000, -1000, -1000, -1000, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 1282, 19384, - 19384, 19384, 19384, 19384, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1355, 1387, 1337, 19384, -1000, 1761, - -1000, -100, 25209, 19384, 1478, 2335, 1875, 45913, -1000, -1000, - -1000, 2263, -1000, 2263, 1355, 2734, 2006, 18737, -1000, -1000, - 2734, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1564, - -1000, 47207, 1758, 2227, 45913, 1996, 1472, 381, -1000, 19384, - 19384, 1754, -1000, 1281, 47207, -1000, -150, -1000, 34267, -1000, - -1000, 12236, 47207, 372, 47207, -1000, 24562, 33620, 238, 19, - -1000, 1711, -1000, 56, 32, 16148, 712, -1000, -1000, -1000, - 1726, 21325, 1660, 712, 134, -1000, -1000, -1000, 1797, -1000, - 1797, 1797, 1797, 1797, 381, 381, 381, 381, -1000, -1000, - -1000, -1000, -1000, 1828, 1827, -1000, 1797, 1797, 1797, 1797, + -1000, -1000, -1000, -1000, -1000, -1000, 12218, 12218, -1000, -1000, + -1000, -1000, 208, -1000, 34890, 396, 748, -1000, 1661, 34243, + -1000, -316, -322, -323, -330, -1000, -1000, -1000, -351, -364, + -1000, -1000, -1000, 18713, 18713, 18713, 18713, -152, -1000, 959, + 19360, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 139, 907, + 19360, 19360, 19360, 19360, 19360, 19360, 19360, 19360, 19360, 19360, + 19360, 19360, 19360, 19360, 19360, -1000, -1000, 27126, 7353, 7353, + 679, 679, 679, 679, -1000, -65, 1659, 45889, -1000, -1000, + -1000, 622, 18713, 18713, 679, -1000, 1129, 16125, 20007, 18066, + 18066, 18713, 759, 1041, 45889, 18713, -1000, 1195, -1000, -1000, + -1000, 1080, -1000, 854, 2127, 2127, 2127, 2127, 18713, 18713, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 2127, 45242, + 45242, 862, 18713, 18713, 18713, 18713, 18713, 18713, 14830, 18713, + 18713, 19360, 18713, 18713, 18713, 1195, 18713, 18713, 18713, 18713, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, + 18713, 18713, 18713, 1195, 18713, 1014, 18713, 18713, 18066, 14177, + 18066, 18066, 18066, 18066, 18066, -1000, -1000, -1000, -1000, -1000, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 1195, 18713, + 18713, 18713, 18713, 18713, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1415, 1231, 1242, 18713, -1000, 1652, + -1000, -155, 24538, 18713, 1447, 2346, 1826, 45242, -1000, -1000, + -1000, 2240, -1000, 2240, 1415, 2170, 1963, 18066, -1000, -1000, + 2170, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1291, + -1000, 46536, 1651, 2204, 45242, 1928, 1445, 368, -1000, 18713, + 18713, 1650, -1000, 1120, 46536, -1000, -152, -1000, 33596, -1000, + -1000, 11565, 46536, 357, 46536, -1000, 23891, 32949, 374, 40, + -1000, 1624, -1000, 53, 61, 15477, 662, -1000, -1000, -1000, + 280, 20654, 1596, 662, 121, -1000, -1000, -1000, 1739, -1000, + 1739, 1739, 1739, 1739, 368, 368, 368, 368, -1000, -1000, + -1000, -1000, -1000, 1761, 1760, -1000, 1739, 1739, 1739, 1739, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1821, 1821, 1821, - 1812, 1812, 494, -1000, 19384, 306, 32973, 2195, 1107, 1030, - 274, 518, 1874, 1165, 1165, 1165, 518, -1000, 1277, 1275, - 1253, -1000, -447, 1752, -1000, -1000, 2307, -1000, -1000, 621, - 938, 937, 668, 45913, 249, 359, -1000, 475, -1000, 32973, - 1165, 865, 686, 1165, -1000, 1165, -1000, -1000, -1000, -1000, - -1000, 1165, -1000, -1000, 1749, -1000, 1764, 975, 929, 974, - 911, 1749, -1000, -1000, -90, 1749, -1000, 1749, -1000, 1749, - -1000, 1749, -1000, 1749, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 808, 234, -217, 45913, 249, 537, -1000, - 536, 27797, -1000, -1000, -1000, 27797, 27797, -1000, -1000, -1000, - -1000, 1448, 1444, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1759, 1759, 1759, + 1740, 1740, 478, -1000, 18713, 301, 32302, 2173, 1068, 1274, + 282, 498, 1796, 1129, 1129, 1129, 498, -1000, 1173, 1161, + 1155, -1000, -445, 1633, -1000, -1000, 2311, -1000, -1000, 948, + 886, 880, 991, 45242, 248, 355, -1000, 467, -1000, 32302, + 1129, 844, 642, 1129, -1000, 1129, -1000, -1000, -1000, -1000, + -1000, 1129, -1000, -1000, 1631, -1000, 1654, 917, 871, 913, + 868, 1631, -1000, -1000, -91, 1631, -1000, 1631, -1000, 1631, + -1000, 1631, -1000, 1631, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 782, 229, -236, 45242, 248, 510, -1000, + 503, 27126, -1000, -1000, -1000, 27126, 27126, -1000, -1000, -1000, + -1000, 1437, 1422, -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, -428, 47207, -1000, 267, 806, 352, 398, 330, - 47207, 346, 2252, 2246, 2243, 2241, 2236, 414, 318, 47207, - 47207, 508, 1967, 47207, 2215, 47207, -1000, -1000, -1000, -1000, - -1000, 1231, 47207, -1000, -1000, 932, 932, -1000, -1000, 47207, - 932, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 932, + -1000, -1000, -431, 46536, -1000, 262, 745, 336, 420, 322, + 46536, 345, 2229, 2228, 2224, 2218, 2213, 271, 321, 46536, + 46536, 493, 1887, 46536, 2181, 46536, -1000, -1000, -1000, -1000, + -1000, 1041, 46536, -1000, -1000, 876, 876, -1000, -1000, 46536, + 876, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 876, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 47207, -1000, -1000, -1000, -1000, - 45913, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -99, 43, 49, 374, -1000, -1000, -1000, -1000, -1000, 2257, - -1000, 1231, 847, 835, -1000, 1778, -1000, -1000, 1058, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 136, 20031, 20031, 20031, - 1642, 546, 1653, 1124, 1534, 1021, 1021, 873, 873, 724, - 724, 724, 724, 724, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1440, -1000, 1778, 46560, 1637, 14195, 1466, 2046, - 1282, 2977, -1000, 1633, -1000, 1633, 1360, 864, -1000, 19384, - 1282, 2956, -1000, -1000, 1282, 1282, 1282, 19384, -1000, -1000, - 19384, 19384, 19384, 19384, 1030, 1030, 1030, 1030, 1030, 1030, - 1030, 1030, 1030, 1030, 19384, 1748, 1716, 2334, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 46536, -1000, -1000, -1000, -1000, + 45242, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -93, 44, 67, 371, -1000, -1000, -1000, -1000, -1000, 2234, + -1000, 1041, 846, 814, -1000, 1672, -1000, -1000, 922, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 139, 19360, 19360, 19360, + 1384, 533, 1449, 1643, 1103, 1199, 1199, 858, 858, 686, + 686, 686, 686, 686, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1389, -1000, 1672, 45889, 1502, 14177, 1834, 1742, + 1195, 3057, -1000, 1495, -1000, 1495, 1521, 800, -1000, 18713, + 1195, 3030, -1000, -1000, 1195, 1195, 1195, 18713, -1000, -1000, + 18713, 18713, 18713, 18713, 1274, 1274, 1274, 1274, 1274, 1274, + 1274, 1274, 1274, 1274, 18713, 1629, 1628, 2342, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1213, - 1030, 1030, 1030, 1030, 1030, 19384, 2008, -1000, -1000, -1000, - 1320, 2865, 1500, 2854, 1030, 1030, -1000, 1030, 2843, 2838, - 1282, 1662, 1282, 1715, -1000, 2832, 1030, 2802, 2797, 2791, - 1994, 2786, 2776, 2764, 1030, 1030, 1030, 1987, 2758, 2752, - 2742, 2729, 2709, 2696, 2684, 2679, 2624, 1030, -155, 1030, - 1282, -1000, -1000, -1000, -1000, -1000, 2601, 1972, 1282, 1714, - 1778, 643, -1000, -1000, 1633, 1282, 1282, 1633, 1633, 2582, - 2311, 2305, 2295, 2245, 2237, 1030, 1030, -1000, 1030, 2225, - 2190, 1968, 1938, 1282, -1000, 1337, 47207, -1000, -294, -1000, - 42, 733, 1778, -1000, 31679, 1282, -1000, 5491, -1000, 1053, - -1000, -1000, -1000, -1000, -1000, 29091, 1712, 2734, -1000, -1000, - 1778, 1629, -1000, -1000, 381, 118, 28444, 709, 709, 155, - 1231, 1231, 19384, -1000, -1000, -1000, -1000, -1000, -1000, 642, - 2323, 386, 1778, -1000, 1713, 2514, -1000, -1000, -1000, 2221, - 22620, -1000, -1000, 1778, 1778, 47207, 1709, 1695, -1000, 635, - -1000, 1184, 1711, 19, 29, -1000, -1000, -1000, -1000, 1231, - -1000, 1251, 382, 671, -1000, 517, -1000, -1000, -1000, -1000, - 2096, 114, -1000, -1000, -1000, 270, 381, -1000, -1000, -1000, - -1000, -1000, -1000, 1438, 1438, -1000, -1000, -1000, -1000, -1000, - 1102, -1000, -1000, -1000, 1100, -1000, -1000, 2086, 1877, 306, - -1000, -1000, 798, 1430, -1000, -1000, 2101, 798, 798, 45913, - -1000, -1000, 1596, 2195, 267, 47207, 817, 1966, -1000, 1874, - 1874, 1874, 47207, -1000, -1000, -1000, -1000, -1000, -1000, -432, - 63, 395, -1000, -1000, -1000, 3608, 45913, 1627, -1000, 244, - -1000, 1386, -1000, 45913, -1000, 1625, 1820, 1165, 1165, -1000, - -1000, -1000, 45913, 1778, -1000, -1000, -1000, -1000, 577, 2157, - 302, -1000, -1000, -179, -1000, -1000, 249, 244, 46560, 1165, - 712, -1000, -1000, -1000, -1000, -1000, -435, 1607, 560, 255, - 336, 47207, 47207, 47207, 47207, 47207, 612, -1000, -1000, 67, - -1000, -1000, 220, -1000, -1000, -1000, -1000, 220, -1000, -1000, - -1000, -1000, 309, 530, -1000, 47207, 47207, 676, -1000, -1000, - -1000, 888, -1000, -1000, 888, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 2134, 47207, 48, -393, -1000, - -389, 19384, -1000, -1000, -1000, -1000, 1217, 541, 1653, 20031, - 20031, 20031, -1000, -1000, -1000, 807, 807, 27797, -1000, 19384, - 18737, -1000, -1000, 19384, 19384, 781, -1000, 19384, 913, -1000, - 19384, -1000, -1000, -1000, 1337, 1030, 1030, 1030, 1030, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1704, - 19384, 19384, 19384, 1282, 338, -1000, -1000, -1000, -1000, -1000, - 2329, -1000, 19384, -1000, 27797, 19384, 19384, 19384, -1000, -1000, - -1000, 19384, 19384, -1000, -1000, 19384, 19384, -1000, 19384, 19384, - 19384, -1000, 19384, 19384, 19384, 19384, -1000, -1000, -1000, -1000, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, - -1000, -1000, 32973, 106, -155, 1048, 106, 1048, -1000, 18737, - 13542, -1000, -1000, -1000, -1000, -1000, 19384, 19384, 19384, 19384, - 19384, 19384, -1000, -1000, -1000, 19384, 19384, -1000, 19384, -1000, - 19384, -1000, -1000, -1000, -1000, -1000, 733, -1000, 686, 686, - 686, 45913, -1000, -1000, -1000, -1000, 1702, -1000, 2259, -1000, - 2041, 2037, 2327, 2323, -1000, 24562, 2734, -1000, -1000, 45913, - -281, -1000, 2069, 2104, 709, 709, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 11583, 2263, 19384, 1963, 46560, 142, -1000, - 23915, 45913, 46560, 24562, 24562, 24562, 24562, 24562, -1000, 1979, - 1916, -1000, 2026, 2019, 2138, 47207, -1000, 1355, 1595, -1000, - 19384, 26503, 1667, 24562, -1000, -1000, 24562, 47207, 10930, -1000, - -1000, 47, 26, -1000, -1000, -1000, -1000, 1726, -1000, -1000, - 413, 2219, 2090, -1000, -1000, -1000, -1000, -1000, 1558, -1000, - 1545, 1697, 1540, 234, -1000, 1850, 2133, 798, 798, -1000, - 1084, -1000, 1165, 1416, 1408, -1000, -1000, -1000, 547, -1000, - 2208, 47207, 1962, 1955, 1948, -1000, -444, 1077, 1819, 1848, - 19384, 1818, 2304, 1673, 45913, -1000, -1000, 46560, -1000, 266, - -1000, 306, 45913, -1000, -1000, -1000, 359, 47207, -1000, 5931, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1644, + 1274, 1274, 1274, 1274, 1274, 18713, 1778, -1000, -1000, -1000, + 1240, 2980, 1319, 2972, 1274, 1274, -1000, 1274, 2959, 2859, + 1195, 1598, 1195, 1627, -1000, 2841, 1274, 2807, 2802, 2791, + 2195, 2778, 2774, 2767, 1274, 1274, 1274, 2183, 2747, 2739, + 2717, 2711, 2701, 2695, 2689, 2680, 2628, 1274, -165, 1274, + 1195, -1000, -1000, -1000, -1000, -1000, 2613, 2161, 1195, 1626, + 1672, 621, -1000, -1000, 1495, 1195, 1195, 1495, 1495, 2603, + 2599, 2594, 2585, 2446, 2413, 1274, 1274, -1000, 1274, 2371, + 2365, 2157, 2152, 1195, -1000, 1242, 46536, -1000, -298, -1000, + 45, 661, 1672, -1000, 31008, 1195, -1000, 4155, -1000, 1045, + -1000, -1000, -1000, -1000, -1000, 28420, 1486, 2170, -1000, -1000, + 1672, 1479, -1000, -1000, 368, 115, 27773, 681, 681, 148, + 1041, 1041, 18713, -1000, -1000, -1000, -1000, -1000, -1000, 613, + 2325, 373, 1672, -1000, 1620, 2885, -1000, -1000, -1000, 2199, + 21949, -1000, -1000, 1672, 1672, 46536, 1554, 1546, -1000, 612, + -1000, 1150, 1624, 40, 39, -1000, -1000, -1000, -1000, 1041, + -1000, 1142, 358, 680, -1000, 466, -1000, -1000, -1000, -1000, + 2084, 117, -1000, -1000, -1000, 304, 368, -1000, -1000, -1000, + -1000, -1000, -1000, 1386, 1386, -1000, -1000, -1000, -1000, -1000, + 1055, -1000, -1000, -1000, 1050, -1000, -1000, 2293, 1868, 301, + -1000, -1000, 724, 1382, -1000, -1000, 2101, 724, 724, 45242, + -1000, -1000, 1593, 2173, 262, 46536, 785, 1877, -1000, 1796, + 1796, 1796, 46536, -1000, -1000, -1000, -1000, -1000, -1000, -433, + 66, 410, -1000, -1000, -1000, 4372, 45242, 1475, -1000, 244, + -1000, 1589, -1000, 45242, -1000, 1455, 1758, 1129, 1129, -1000, + -1000, -1000, 45242, 1672, -1000, -1000, -1000, -1000, 566, 2143, + 337, -1000, -1000, -182, -1000, -1000, 248, 244, 45889, 1129, + 662, -1000, -1000, -1000, -1000, -1000, -434, 1450, 532, 252, + 352, 46536, 46536, 46536, 46536, 46536, 583, -1000, -1000, 75, + -1000, -1000, 225, -1000, -1000, -1000, -1000, 225, -1000, -1000, + -1000, -1000, 302, 502, -1000, 46536, 46536, 617, -1000, -1000, + -1000, 859, -1000, -1000, 859, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 2129, 46536, 64, -386, -1000, + -383, 18713, -1000, -1000, -1000, -1000, 1235, 527, 1449, 19360, + 19360, 19360, -1000, -1000, -1000, 887, 887, 27126, -1000, 18713, + 18066, -1000, -1000, 18713, 18713, 732, -1000, 18713, 973, -1000, + 18713, -1000, -1000, -1000, 1242, 1274, 1274, 1274, 1274, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1614, + 18713, 18713, 18713, 1195, 342, -1000, -1000, -1000, -1000, -1000, + 2340, -1000, 18713, -1000, 27126, 18713, 18713, 18713, -1000, -1000, + -1000, 18713, 18713, -1000, -1000, 18713, 18713, -1000, 18713, 18713, + 18713, -1000, 18713, 18713, 18713, 18713, -1000, -1000, -1000, -1000, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, + -1000, -1000, 32302, 110, -165, 1014, 110, 1014, -1000, 18066, + 13524, -1000, -1000, -1000, -1000, -1000, 18713, 18713, 18713, 18713, + 18713, 18713, -1000, -1000, -1000, 18713, 18713, -1000, 18713, -1000, + 18713, -1000, -1000, -1000, -1000, -1000, 661, -1000, 642, 642, + 642, 45242, -1000, -1000, -1000, -1000, 1615, -1000, 2236, -1000, + 1975, 1973, 2332, 2325, -1000, 23891, 2170, -1000, -1000, 45242, + -292, -1000, 2019, 1992, 681, 681, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 10912, 2240, 18713, 1876, 45889, 140, -1000, + 23244, 45242, 45889, 23891, 23891, 23891, 23891, 23891, -1000, 1907, + 1900, -1000, 1952, 1948, 1958, 46536, -1000, 1415, 1434, -1000, + 18713, 25832, 1583, 23891, -1000, -1000, 23891, 46536, 10259, -1000, + -1000, 58, 52, -1000, -1000, -1000, -1000, 280, -1000, -1000, + 919, 2187, 2044, -1000, -1000, -1000, -1000, -1000, 1420, -1000, + 1406, 1613, 1385, 229, -1000, 1743, 2126, 724, 724, -1000, + 1042, -1000, 1129, 1375, 1366, -1000, -1000, -1000, 531, -1000, + 2180, 46536, 1875, 1867, 1865, -1000, -442, 1029, 1755, 1707, + 18713, 1752, 2308, 1606, 45242, -1000, -1000, 45889, -1000, 329, + -1000, 301, 45242, -1000, -1000, -1000, 355, 46536, -1000, 6547, -1000, -1000, -1000, 244, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 47207, 263, -1000, 1815, 1105, -1000, -1000, 1859, -1000, - -1000, -1000, -1000, 226, 347, 1403, 217, 1401, 217, -1000, - 47207, 659, 1877, 47207, -1000, -1000, -1000, 932, 932, -1000, - -1000, 2121, -1000, 1165, 1030, 20031, 20031, -1000, 713, 568, - -130, 1797, 1797, -1000, 1797, 1812, -1000, 1797, 197, 1797, - 182, 1797, -1000, -1000, 1282, 1282, 1337, -1000, 1929, 1323, - -1000, 1231, 19384, 2178, -1000, -1000, -1000, -1000, -1000, -27, - 2169, 2156, 1030, -1000, 1795, 1794, 19384, 1030, 1282, 1912, - 1030, 1030, 1030, 1030, -1000, 1231, 1337, 2113, 1337, 1030, - 1030, 2098, 328, 1030, 1529, 1529, 1529, 1529, 1529, 1337, - 1337, 1337, 1337, 45913, -1000, -155, -1000, -1000, -198, -199, - -1000, 1282, -155, 1681, 1282, -1000, 1906, 1892, 2070, 1851, - 1030, 2058, 1030, 1030, 1030, 1824, -1000, 2228, 2228, 2228, - 1521, 1053, 47207, -1000, -1000, -1000, -1000, 2323, 2320, 1680, - -1000, -1000, 118, 442, -1000, 2064, 2104, -1000, 2303, 2065, - 2302, -1000, -1000, -1000, -1000, -1000, 1231, -1000, 2183, 1542, - -1000, 805, 1663, -1000, -1000, 18090, 1527, 2014, 627, 1521, - 1751, 2514, 1871, 1937, 2708, -1000, -1000, -1000, -1000, 1902, - -1000, 1887, -1000, -1000, 1785, -1000, 1756, 372, 24562, 1747, - 1747, -1000, 623, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 973, 5311, 2372, -1000, 1397, -1000, 1221, 195, 1066, -1000, - -1000, 798, 798, -1000, 860, 856, -1000, 47207, 1793, -1000, - 381, 1395, 381, 1062, -1000, 1060, -1000, -1000, -1000, -1000, - 1945, 1930, -1000, -1000, -1000, -1000, 47207, -1000, -1000, 47207, - 47207, 47207, 1792, 2301, -1000, 19384, 1791, 804, 2077, 45913, - 45913, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 474, 798, -410, 316, 313, 798, 798, 798, - -445, -1000, -1000, 1415, 1407, -1000, -118, -1000, 19384, -1000, - -1000, -1000, 1024, 1024, 1394, 1393, 1390, -1000, 1785, -1000, - -1000, -1000, 1372, -1000, -1000, -103, 45913, 45913, 45913, 45913, - -1000, -1000, 1018, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 713, 1282, 343, -105, 1282, - -1000, -1000, 381, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 19384, -1000, 19384, -1000, 1231, 19384, 2263, - 1388, 19384, 19384, -1000, 1056, 1054, 1030, -1000, -1000, -1000, - 19384, -1000, -1000, -1000, -1000, -1000, 19384, -1000, -1000, -1000, - 19384, 207, 807, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 1282, 370, -1000, -1000, -1000, -1000, 2325, - -1000, 1282, 19384, -1000, -1000, 19384, -1000, 19384, 19384, -1000, - 19384, -1000, 19384, -1000, -1000, -1000, -1000, 19384, 1778, 2089, - 1778, 1778, 26503, -1000, -1000, 2320, 2317, 2298, 2030, 2047, - 2047, 2064, -1000, 2296, 2294, -1000, 1383, 2286, 1381, 855, - -1000, 46560, 19384, 142, -1000, 390, 45913, 142, 45913, -1000, - 2283, -1000, -1000, 19384, 1787, -1000, 19384, -1000, -1000, -1000, - -1000, 6098, 2323, 1747, -1000, -1000, 728, -1000, 19384, -1000, - -1000, -1000, 7137, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1373, 1352, -1000, -1000, 1786, 19384, -1000, -1000, -1000, - 1370, 1356, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1785, -1000, -1000, -1000, -1000, 359, -439, 2038, 45913, 1042, - -1000, 1380, 1673, 349, 142, 1312, 798, 798, 798, 1012, - 1011, 31679, 1369, -1000, 45913, 466, -1000, 359, -1000, -124, - -127, 1030, -1000, -1000, 2217, -1000, -1000, 13542, -1000, -1000, - 1783, 1868, -1000, -1000, -1000, -1000, 1995, -88, -111, -1000, - -1000, 1030, 1030, 1513, 1282, -1000, 1030, 1030, 1351, 1342, - -1000, 1030, 1337, 1762, -1000, 207, 1282, 1936, -1000, -1000, - 6098, -1000, -1000, 2283, 2280, 106, -1000, -1000, 248, 106, - 1231, 1690, 1030, 1647, 1623, 1030, 1030, 27150, -1000, 2273, - 2249, 32326, 32326, 733, 2317, -169, 19384, 19384, 2023, 1001, - -1000, -1000, -1000, -1000, 1310, 1305, -1000, 1302, -1000, 2369, - -1000, 1231, -1000, 142, -1000, 619, 1663, -1000, 2263, 1231, - 45913, 1231, 110, 2283, -1000, 1030, -1000, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, - 1778, 1778, 1778, 1778, 1778, 1778, 1778, -1000, -1000, 45913, - 1980, -1000, -1000, 2210, 1366, 62, -1000, 1330, 1673, -1000, - -1000, 141, -1000, 19384, -1000, 31679, 1266, 1255, -1000, -1000, - -1000, -1000, -445, -1000, -1000, -1000, -1000, -1000, -1000, 385, - 1665, -1000, 779, 45913, 47207, -1000, 1986, -1000, -1000, -1000, - 19384, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 19384, - -1000, 1282, 1928, -1000, -282, -1000, -419, 19384, -155, -1000, - -1000, -155, -1000, 19384, -1000, -1000, 19384, -1000, 19384, -1000, - -1000, 1350, -1000, -1000, -1000, -1000, -1000, 1350, 1350, -1000, - -169, -1000, 1664, -1000, 45913, 1231, 1662, -1000, 993, -1000, - -1000, -1000, -1000, -1000, 46560, 1663, 45913, -1000, 1348, 1282, - 1778, 2263, -1000, 1341, -1000, 385, -1000, 1782, 1848, -1000, - -1000, -1000, 17443, -1000, -1000, -1000, -1000, -1000, 191, -95, - 13542, 10277, 1339, -1000, -91, 1030, 1337, -1000, -368, -1000, - -1000, -1000, -1000, 261, -1000, -1000, 1662, -1000, -1000, 1272, - 1142, 1138, 31032, -1000, -1000, -1000, -1000, -169, -1000, -1000, - 2191, -1000, -1000, 1389, -1000, -1000, 26503, 45266, -1000, -81, - 323, -95, 19384, 1781, 1282, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 36, -1000, -1000, -1000, -1000, -1000, 1859, - -106, -1000, -1000, -1000, 223, -401, -186, -196, -1000, -1000, - 20031, -1000, 19384, -1000, 19384, -1000, 19384, -1000, -1000, -1000, - 45913, 1778, -1000, 1329, -1000, 3426, -219, 1905, -1000, -51, - -1000, -1000, -1000, 965, 1188, -1000, -1000, -1000, -1000, -1000, - -1000, 1946, 45913, -1000, 479, -1000, -1000, -103, -116, 831, - -1000, -1000, -1000, -1000, -1000, 1113, 1071, 1030, -1000, 45913, - -1000, 45266, -210, 712, 6098, -1000, 1897, 1883, 2333, -1000, - -1000, -1000, -1000, -1000, -1000, -452, 1289, 272, -1000, -1000, - 223, -1000, 19384, -1000, 19384, -1000, 1282, -1000, -1000, 2203, - 110, -1000, 2367, -1000, 2361, 747, 747, -1000, 1007, -452, - -1000, -1000, 1030, 1030, -1000, -221, -1000, -1000, -1000, -1000, - -1000, 476, 1049, -1000, -1000, -1000, -1000, -1000, 6098, -1000, - -1000, -1000, 203, 203, -1000, -1000, + -1000, 46536, 273, -1000, 1750, 1121, -1000, -1000, 1787, -1000, + -1000, -1000, -1000, 223, 318, 1357, 230, 1353, 230, -1000, + 46536, 616, 1868, 46536, -1000, -1000, -1000, 876, 876, -1000, + -1000, 2121, -1000, 1129, 1274, 19360, 19360, -1000, 679, 255, + -134, 1739, 1739, -1000, 1739, 1740, -1000, 1739, 199, 1739, + 198, 1739, -1000, -1000, 1195, 1195, 1242, -1000, 2138, 1372, + -1000, 1041, 18713, 2358, -1000, -1000, -1000, -1000, -1000, -8, + 2322, 2306, 1274, -1000, 1732, 1731, 18713, 1274, 1195, 1912, + 1274, 1274, 1274, 1274, -1000, 1041, 1242, 2272, 1242, 1274, + 1274, 2251, 333, 1274, 1381, 1381, 1381, 1381, 1381, 1242, + 1242, 1242, 1242, 45242, -1000, -165, -1000, -1000, -203, -208, + -1000, 1195, -165, 1609, 1195, -1000, 1906, 1851, 2239, 1824, + 1274, 2235, 1274, 1274, 1274, 1820, -1000, 2231, 2231, 2231, + 1363, 1045, 46536, -1000, -1000, -1000, -1000, 2325, 2318, 1607, + -1000, -1000, 115, 453, -1000, 1987, 1992, -1000, 2301, 2002, + 2297, -1000, -1000, -1000, -1000, -1000, 1041, -1000, 2155, 1592, + -1000, 740, 1603, -1000, -1000, 17419, 1374, 1954, 603, 1363, + 1625, 2885, 1871, 1860, 1940, -1000, -1000, -1000, -1000, 1861, + -1000, 1830, -1000, -1000, 1700, -1000, 2225, 357, 23891, 1595, + 1595, -1000, 602, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 915, 6195, 2366, -1000, 1351, -1000, 1140, 193, 1013, -1000, + -1000, 724, 724, -1000, 838, 828, -1000, 46536, 1716, -1000, + 368, 1350, 368, 1009, -1000, 1008, -1000, -1000, -1000, -1000, + 1738, 1819, -1000, -1000, -1000, -1000, 46536, -1000, -1000, 46536, + 46536, 46536, 1714, 2294, -1000, 18713, 1711, 726, 2177, 45242, + 45242, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 463, 724, -414, 319, 314, 724, 724, 724, + -443, -1000, -1000, 1349, 1344, -1000, -122, -1000, 18713, -1000, + -1000, -1000, 1061, 1061, 1339, 1337, 1324, -1000, 1700, -1000, + -1000, -1000, 1540, -1000, -1000, -102, 45242, 45242, 45242, 45242, + -1000, -1000, 993, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 679, 1195, 341, -109, 1195, + -1000, -1000, 368, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 18713, -1000, 18713, -1000, 1041, 18713, 2240, + 1304, 18713, 18713, -1000, 1005, 962, 1274, -1000, -1000, -1000, + 18713, -1000, -1000, -1000, -1000, -1000, 18713, -1000, -1000, -1000, + 18713, 221, 887, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1195, 356, -1000, -1000, -1000, -1000, 2328, + -1000, 1195, 18713, -1000, -1000, 18713, -1000, 18713, 18713, -1000, + 18713, -1000, 18713, -1000, -1000, -1000, -1000, 18713, 1672, 2059, + 1672, 1672, 25832, -1000, -1000, 2318, 2274, 2291, 1990, 1993, + 1993, 1987, -1000, 2281, 2275, -1000, 1302, 2262, 1292, 823, + -1000, 45889, 18713, 140, -1000, 389, 45242, 140, 45242, -1000, + 2255, -1000, -1000, 18713, 1710, -1000, 18713, -1000, -1000, -1000, + -1000, 7353, 2325, 1595, -1000, -1000, 693, -1000, 18713, -1000, + -1000, -1000, 3726, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1284, 1232, -1000, -1000, 1709, 18713, -1000, -1000, -1000, + 1518, 1503, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1700, -1000, -1000, -1000, -1000, 355, -438, 1498, 45242, 958, + -1000, 1333, 1606, 334, 140, 1229, 724, 724, 724, 957, + 952, 31008, 1330, -1000, 45242, 455, -1000, 355, -1000, -129, + -131, 1274, -1000, -1000, 2185, -1000, -1000, 13524, -1000, -1000, + 1697, 1794, -1000, -1000, -1000, -1000, 1921, -92, -114, -1000, + -1000, 1274, 1274, 2217, 1195, -1000, 1274, 1274, 1487, 1410, + -1000, 1274, 1242, 1791, -1000, 221, 1195, 1857, -1000, -1000, + 7353, -1000, -1000, 2255, 2249, 110, -1000, -1000, 260, 110, + 1041, 1764, 1274, 1702, 1692, 1274, 1274, 26479, -1000, 2248, + 2247, 31655, 31655, 661, 2274, -172, 18713, 18713, 1984, 996, + -1000, -1000, -1000, -1000, 1215, 1170, -1000, 1167, -1000, 2360, + -1000, 1041, -1000, 140, -1000, 600, 1603, -1000, 2240, 1041, + 45242, 1041, 113, 2255, -1000, 1274, -1000, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, -1000, -1000, 45242, + 1440, -1000, -1000, 2184, 1323, 63, -1000, 1320, 1606, -1000, + -1000, 132, -1000, 18713, -1000, 31008, 1159, 1157, -1000, -1000, + -1000, -1000, -443, -1000, -1000, -1000, -1000, -1000, -1000, 445, + 1605, -1000, 719, 45242, 46536, -1000, 1914, -1000, -1000, -1000, + 18713, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 18713, + -1000, 1195, 1852, -1000, -267, -1000, -417, 18713, -165, -1000, + -1000, -165, -1000, 18713, -1000, -1000, 18713, -1000, 18713, -1000, + -1000, 1290, -1000, -1000, -1000, -1000, -1000, 1290, 1290, -1000, + -172, -1000, 1604, -1000, 45242, 1041, 1598, -1000, 939, -1000, + -1000, -1000, -1000, -1000, 45889, 1603, 45242, -1000, 1272, 1195, + 1672, 2240, -1000, 1268, -1000, 445, -1000, 1686, 1707, -1000, + -1000, -1000, 16772, -1000, -1000, -1000, -1000, -1000, 217, -96, + 13524, 9606, 1266, -1000, -94, 1274, 1242, -1000, -375, -1000, + -1000, -1000, -1000, 150, -1000, -1000, 1598, -1000, -1000, 1517, + 1489, 1431, 30361, -1000, -1000, -1000, -1000, -172, -1000, -1000, + 2178, -1000, -1000, 1338, -1000, -1000, 25832, 44595, -1000, -63, + 626, -96, 18713, 1673, 1195, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 24, -1000, -1000, 591, -1000, -1000, -1000, + 1787, -110, -1000, -1000, -1000, 135, -395, -197, -220, -1000, + -1000, 19360, -1000, 18713, -1000, 18713, -1000, 18713, -1000, -1000, + -1000, 45242, 1672, -1000, 1194, -1000, 4232, -245, 1849, -1000, + -60, -1000, -1000, -1000, 904, 1109, -1000, -1000, -1000, -1000, + -1000, -1000, 1336, 45242, -1000, 468, -1000, -1000, 12871, -102, + -115, 777, -1000, -1000, -1000, -1000, -1000, 1066, 988, 1274, + -1000, 45242, -1000, 44595, -219, 662, 7353, -1000, 1841, 1838, + 2335, -1000, -1000, -1000, -1000, -1000, -1000, -450, 1191, 276, + -1000, -1000, -1000, 135, -1000, 18713, -1000, 18713, -1000, 1195, + -1000, -1000, 2164, 113, -1000, 2355, -1000, 2336, 678, 678, + -1000, 940, -450, -1000, -1000, 1274, 1274, -1000, -246, -1000, + -1000, -1000, -1000, -1000, 458, 1025, -1000, -1000, -1000, -1000, + -1000, 7353, -1000, -1000, -1000, 207, 207, -1000, -1000, } var yyPgo = [...]int{ - 0, 2967, 2966, 38, 2, 36, 35, 2965, 93, 108, - 215, 37, 197, 102, 2964, 2963, 2961, 2959, 2958, 2956, - 2955, 177, 176, 170, 2954, 2951, 2947, 2946, 2945, 2940, - 2937, 2935, 2934, 2921, 171, 159, 195, 2919, 2916, 2910, - 125, 189, 79, 88, 191, 2904, 2901, 81, 2898, 2895, - 2892, 186, 185, 182, 887, 2889, 181, 120, 53, 2888, - 2886, 2882, 2880, 2878, 2877, 2876, 2875, 2873, 2872, 2867, - 2866, 2865, 2863, 2862, 2861, 2859, 294, 2854, 2853, 22, - 2849, 85, 2845, 2844, 2843, 2841, 12, 2839, 2832, 16, - 40, 2831, 2828, 48, 2824, 2819, 2812, 2808, 2804, 17, - 2803, 27, 2796, 39, 2794, 2793, 127, 2787, 2774, 2771, - 41, 2764, 2761, 2754, 2753, 2751, 2750, 2739, 142, 2738, - 2737, 2735, 246, 211, 2734, 2732, 168, 143, 110, 2731, - 2726, 115, 192, 2725, 124, 2722, 2720, 2716, 147, 2715, - 138, 2714, 2708, 69, 71, 2705, 15, 2704, 2703, 11, - 91, 72, 10, 20, 23, 2702, 2701, 65, 78, 2699, - 119, 2698, 2697, 101, 87, 2696, 114, 99, 2695, 2694, - 7, 5, 2691, 3, 1, 4, 68, 2690, 2687, 117, - 2685, 2684, 2681, 98, 2679, 2676, 2164, 2674, 97, 133, - 104, 75, 2653, 50, 58, 2651, 2633, 2632, 2626, 2625, - 54, 2617, 2615, 2612, 140, 380, 164, 2611, 47, 82, - 46, 134, 2609, 61, 80, 196, 167, 2607, 2604, 139, - 137, 2598, 2594, 62, 44, 45, 2593, 113, 131, 122, - 111, 112, 132, 2590, 2580, 60, 74, 2578, 2577, 2573, - 2572, 169, 2565, 2563, 73, 2559, 57, 2558, 165, 2557, - 19, 67, 2556, 49, 160, 2554, 76, 2553, 2552, 63, - 100, 70, 43, 2549, 180, 2546, 56, 162, 129, 156, - 2545, 2540, 2538, 2526, 193, 354, 2525, 2523, 77, 178, - 141, 149, 92, 2518, 345, 2516, 2513, 157, 2603, 5785, - 2512, 42, 163, 2502, 2501, 7129, 166, 52, 26, 2500, - 116, 2490, 2488, 2487, 2486, 202, 183, 109, 161, 59, - 2485, 2470, 2469, 14, 2467, 2463, 2459, 2458, 2457, 2448, - 90, 34, 33, 32, 208, 66, 30, 105, 154, 83, - 2445, 2443, 2442, 128, 95, 2438, 155, 151, 136, 106, - 2435, 179, 144, 123, 2432, 103, 31, 2430, 2428, 2426, - 2425, 94, 2423, 2422, 2421, 2420, 150, 145, 126, 84, - 2418, 86, 121, 146, 148, 55, 2417, 51, 2415, 2414, - 29, 187, 28, 2411, 13, 107, 225, 2410, 5000, 188, - 2408, 21, 344, 158, 2407, 2406, 8, 9, 6, 2404, - 2402, 2401, 2400, 135, 2398, 2397, 2396, 2394, 25, 64, - 24, 18, 118, 89, 2392, 2391, 3799, 0, 130, 2389, - 198, + 0, 2968, 2966, 40, 6, 42, 39, 2962, 83, 107, + 201, 60, 196, 105, 2950, 2945, 2942, 2940, 2939, 2937, + 2936, 182, 181, 172, 2935, 2934, 2931, 2928, 2927, 2925, + 2923, 2921, 2918, 2911, 177, 162, 197, 2910, 2907, 2901, + 122, 185, 90, 96, 193, 2900, 2894, 81, 2893, 2885, + 2884, 190, 188, 186, 837, 2883, 174, 121, 53, 2882, + 2875, 2873, 2872, 2865, 2864, 2861, 2854, 2846, 2838, 2829, + 2826, 2825, 2824, 2823, 2820, 2818, 290, 2807, 2804, 25, + 2803, 84, 2802, 2800, 2798, 2797, 12, 2793, 2790, 16, + 43, 2788, 2787, 51, 2786, 2784, 2781, 2780, 2779, 22, + 2775, 30, 2774, 41, 2766, 2765, 131, 2764, 2762, 2761, + 45, 2759, 2758, 2757, 2756, 2753, 2750, 2749, 144, 2746, + 2737, 2734, 166, 210, 2732, 2730, 167, 108, 116, 2728, + 2725, 117, 194, 2723, 125, 2722, 2720, 2719, 154, 2718, + 686, 2717, 2714, 75, 71, 2713, 28, 2712, 2711, 11, + 85, 72, 9, 8, 4, 2709, 2708, 66, 80, 2704, + 114, 2703, 2702, 106, 87, 2700, 109, 115, 2698, 2697, + 17, 7, 2695, 2, 1, 5, 70, 2694, 2692, 126, + 2685, 2679, 2678, 102, 2677, 2676, 665, 2674, 99, 139, + 111, 78, 2672, 54, 61, 2659, 2654, 2653, 2645, 2633, + 57, 2628, 2626, 2625, 145, 320, 164, 2611, 56, 74, + 59, 133, 2610, 55, 82, 198, 168, 2608, 2606, 137, + 142, 2605, 2594, 65, 47, 44, 2593, 101, 134, 124, + 46, 100, 135, 2592, 2591, 67, 77, 2586, 2580, 2579, + 2578, 170, 2576, 2574, 76, 2572, 58, 2571, 191, 2566, + 19, 69, 2565, 52, 171, 2564, 104, 2563, 2562, 68, + 103, 73, 33, 2561, 176, 2545, 63, 161, 129, 159, + 2539, 2533, 2532, 2531, 195, 357, 2530, 2529, 79, 173, + 153, 149, 97, 2528, 347, 2527, 2523, 20, 2256, 6149, + 2522, 38, 160, 2516, 2515, 5912, 24, 50, 26, 2511, + 119, 2508, 2505, 2502, 2496, 228, 178, 118, 158, 62, + 2494, 2492, 2491, 21, 2490, 2487, 2486, 2485, 2484, 2482, + 98, 37, 36, 35, 199, 88, 14, 110, 155, 89, + 2481, 2480, 2477, 128, 94, 2476, 157, 156, 130, 169, + 2475, 179, 146, 138, 2474, 95, 34, 2473, 2469, 2467, + 2460, 136, 2452, 2443, 2438, 2437, 151, 147, 127, 92, + 2436, 93, 123, 150, 148, 48, 2430, 49, 2428, 2426, + 32, 192, 31, 2424, 18, 113, 112, 2423, 3848, 183, + 2422, 23, 321, 152, 2421, 2420, 10, 13, 15, 2419, + 2416, 2412, 2407, 143, 2404, 2403, 2402, 2397, 29, 64, + 27, 3, 120, 91, 2395, 2391, 5054, 0, 132, 2388, + 204, } -//line sql.y:7884 +//line sql.y:7888 type yySymType struct { union any empty struct{} @@ -7433,68 +7366,68 @@ var yyR1 = [...]int{ 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 277, 277, 277, 385, 385, 385, 385, 385, 385, 384, 384, - 384, 350, 350, 350, 383, 383, 57, 57, 214, 214, - 402, 402, 403, 403, 403, 45, 45, 45, 45, 45, - 45, 44, 44, 44, 40, 40, 40, 40, 40, 40, + 384, 350, 350, 350, 350, 383, 383, 57, 57, 214, + 214, 402, 402, 403, 403, 403, 45, 45, 45, 45, + 45, 45, 44, 44, 44, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 46, 46, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 27, 27, 27, + 40, 40, 40, 40, 40, 40, 46, 46, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 106, 106, 107, 107, 107, - 107, 109, 109, 109, 366, 366, 58, 58, 3, 3, - 169, 171, 172, 172, 170, 170, 170, 170, 170, 170, - 60, 60, 59, 59, 174, 173, 175, 175, 175, 1, - 1, 2, 2, 4, 4, 371, 371, 371, 371, 371, + 27, 27, 27, 27, 27, 27, 106, 106, 107, 107, + 107, 107, 109, 109, 109, 366, 366, 58, 58, 3, + 3, 169, 171, 172, 172, 170, 170, 170, 170, 170, + 170, 60, 60, 59, 59, 174, 173, 175, 175, 175, + 1, 1, 2, 2, 4, 4, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, - 371, 371, 371, 371, 371, 371, 371, 332, 332, 332, - 365, 365, 367, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 112, 111, 111, 110, 113, 113, 113, - 113, 113, 113, 113, 113, 369, 369, 369, 61, 61, - 370, 321, 322, 323, 5, 6, 346, 368, 120, 120, - 28, 37, 37, 29, 29, 29, 29, 30, 30, 62, + 371, 371, 371, 371, 371, 371, 371, 371, 332, 332, + 332, 365, 365, 367, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 112, 111, 111, 110, 113, 113, + 113, 113, 113, 113, 113, 113, 369, 369, 369, 61, + 61, 370, 321, 322, 323, 5, 6, 346, 368, 120, + 120, 28, 37, 37, 29, 29, 29, 29, 30, 30, + 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 276, 276, 285, 285, 275, 275, 300, 300, 300, - 278, 278, 278, 279, 279, 395, 395, 395, 272, 272, - 64, 64, 64, 301, 301, 301, 301, 66, 66, 67, - 68, 68, 303, 303, 304, 304, 69, 70, 82, 82, - 82, 82, 82, 82, 82, 105, 105, 105, 15, 15, - 15, 15, 78, 78, 78, 14, 14, 65, 65, 72, - 392, 392, 393, 394, 394, 394, 394, 73, 75, 31, - 31, 31, 31, 31, 31, 130, 130, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 125, - 125, 125, 119, 119, 409, 76, 77, 77, 123, 123, - 123, 116, 116, 116, 122, 122, 122, 16, 16, 17, - 258, 258, 18, 18, 127, 127, 129, 129, 129, 129, - 129, 131, 131, 131, 131, 131, 131, 131, 126, 126, - 128, 128, 128, 128, 293, 293, 293, 292, 292, 163, - 163, 165, 164, 164, 166, 166, 167, 167, 167, 167, - 212, 212, 189, 189, 251, 251, 252, 252, 250, 250, - 257, 257, 253, 253, 253, 253, 260, 260, 168, 168, - 168, 168, 176, 176, 177, 177, 178, 178, 302, 302, - 298, 298, 298, 297, 297, 182, 182, 182, 184, 183, - 183, 183, 183, 185, 185, 187, 187, 186, 186, 188, - 193, 193, 192, 192, 190, 190, 190, 190, 191, 191, - 191, 191, 194, 194, 140, 140, 140, 140, 140, 140, - 140, 155, 155, 155, 155, 158, 158, 158, 158, 158, - 158, 158, 158, 158, 158, 158, 241, 241, 146, 146, + 63, 63, 276, 276, 285, 285, 275, 275, 300, 300, + 300, 278, 278, 278, 279, 279, 395, 395, 395, 272, + 272, 64, 64, 64, 301, 301, 301, 301, 66, 66, + 67, 68, 68, 303, 303, 304, 304, 69, 70, 82, + 82, 82, 82, 82, 82, 82, 105, 105, 105, 15, + 15, 15, 15, 78, 78, 78, 14, 14, 65, 65, + 72, 392, 392, 393, 394, 394, 394, 394, 73, 75, + 31, 31, 31, 31, 31, 31, 130, 130, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 125, 125, 125, 119, 119, 409, 76, 77, 77, 123, + 123, 123, 116, 116, 116, 122, 122, 122, 16, 16, + 17, 258, 258, 18, 18, 127, 127, 129, 129, 129, + 129, 129, 131, 131, 131, 131, 131, 131, 131, 126, + 126, 128, 128, 128, 128, 293, 293, 293, 292, 292, + 163, 163, 165, 164, 164, 166, 166, 167, 167, 167, + 167, 212, 212, 189, 189, 251, 251, 252, 252, 250, + 250, 257, 257, 253, 253, 253, 253, 260, 260, 168, + 168, 168, 168, 176, 176, 177, 177, 178, 178, 302, + 302, 298, 298, 298, 297, 297, 182, 182, 182, 184, + 183, 183, 183, 183, 185, 185, 187, 187, 186, 186, + 188, 193, 193, 192, 192, 190, 190, 190, 190, 191, + 191, 191, 191, 194, 194, 140, 140, 140, 140, 140, + 140, 140, 155, 155, 155, 155, 158, 158, 158, 158, + 158, 158, 158, 158, 158, 158, 158, 241, 241, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 146, 146, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 149, 217, 217, 216, - 216, 83, 83, 83, 84, 84, 85, 85, 85, 85, - 85, 86, 86, 86, 86, 86, 141, 141, 88, 88, - 87, 87, 207, 207, 290, 290, 89, 90, 90, 93, - 93, 92, 91, 91, 97, 97, 94, 94, 96, 96, - 95, 98, 98, 99, 100, 100, 273, 273, 195, 195, - 203, 203, 203, 203, 196, 196, 196, 196, 196, 196, - 196, 204, 204, 204, 211, 205, 205, 201, 201, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 200, + 150, 150, 150, 150, 150, 150, 150, 149, 217, 217, + 216, 216, 83, 83, 83, 84, 84, 85, 85, 85, + 85, 85, 86, 86, 86, 86, 86, 141, 141, 88, + 88, 87, 87, 207, 207, 290, 290, 89, 90, 90, + 93, 93, 92, 91, 91, 97, 97, 94, 94, 96, + 96, 95, 98, 98, 99, 100, 100, 273, 273, 195, + 195, 203, 203, 203, 203, 196, 196, 196, 196, 196, + 196, 196, 204, 204, 204, 211, 205, 205, 201, 201, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, @@ -7503,34 +7436,34 @@ var yyR1 = [...]int{ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 160, 160, 160, 160, 222, - 222, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 148, 148, 161, 161, - 161, 161, 162, 162, 162, 162, 162, 162, 162, 310, - 310, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 410, 410, 324, 324, 324, 324, 202, 202, - 202, 202, 202, 121, 121, 121, 121, 121, 307, 307, - 307, 311, 311, 311, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 312, - 312, 220, 220, 117, 117, 218, 218, 219, 221, 221, - 213, 213, 213, 213, 215, 215, 198, 198, 198, 223, - 223, 224, 224, 101, 102, 102, 103, 103, 225, 225, - 227, 226, 226, 228, 229, 229, 229, 230, 230, 231, - 231, 231, 47, 47, 47, 47, 47, 42, 42, 42, - 42, 43, 43, 43, 43, 132, 132, 132, 132, 134, - 134, 133, 133, 79, 79, 80, 80, 80, 138, 138, - 139, 139, 139, 136, 136, 137, 137, 248, 248, 232, - 232, 232, 239, 239, 239, 235, 235, 237, 237, 237, - 238, 238, 238, 236, 245, 245, 247, 247, 246, 246, - 242, 242, 243, 243, 244, 244, 244, 240, 240, 197, - 197, 197, 197, 197, 249, 249, 249, 249, 261, 261, - 208, 208, 210, 210, 209, 209, 159, 262, 262, 266, - 263, 263, 267, 267, 267, 267, 255, 255, 255, 264, - 264, 265, 265, 294, 294, 294, 271, 271, 284, 284, - 280, 280, 281, 281, 274, 274, 286, 286, 286, 74, - 206, 206, 362, 362, 359, 289, 289, 291, 291, 295, - 295, 299, 299, 296, 296, 287, 287, 287, 287, 287, + 200, 200, 200, 200, 200, 200, 160, 160, 160, 160, + 222, 222, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 148, 148, 161, + 161, 161, 161, 162, 162, 162, 162, 162, 162, 162, + 310, 310, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 410, 410, 324, 324, 324, 324, 202, + 202, 202, 202, 202, 121, 121, 121, 121, 121, 307, + 307, 307, 311, 311, 311, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 312, 312, 220, 220, 117, 117, 218, 218, 219, 221, + 221, 213, 213, 213, 213, 215, 215, 198, 198, 198, + 223, 223, 224, 224, 101, 102, 102, 103, 103, 225, + 225, 227, 226, 226, 228, 229, 229, 229, 230, 230, + 231, 231, 231, 47, 47, 47, 47, 47, 42, 42, + 42, 42, 43, 43, 43, 43, 132, 132, 132, 132, + 134, 134, 133, 133, 79, 79, 80, 80, 80, 138, + 138, 139, 139, 139, 136, 136, 137, 137, 248, 248, + 232, 232, 232, 239, 239, 239, 235, 235, 237, 237, + 237, 238, 238, 238, 236, 245, 245, 247, 247, 246, + 246, 242, 242, 243, 243, 244, 244, 244, 240, 240, + 197, 197, 197, 197, 197, 249, 249, 249, 249, 261, + 261, 208, 208, 210, 210, 209, 209, 159, 262, 262, + 266, 263, 263, 267, 267, 267, 267, 255, 255, 255, + 264, 264, 265, 265, 294, 294, 294, 271, 271, 284, + 284, 280, 280, 281, 281, 274, 274, 286, 286, 286, + 74, 206, 206, 362, 362, 359, 289, 289, 291, 291, + 295, 295, 299, 299, 296, 296, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, @@ -7545,7 +7478,7 @@ var yyR1 = [...]int{ 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, + 287, 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, @@ -7584,8 +7517,8 @@ var yyR1 = [...]int{ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, - 288, 288, 288, 288, 288, 288, 406, 407, 305, 306, - 306, 306, + 288, 288, 288, 288, 288, 288, 288, 406, 407, 305, + 306, 306, 306, } var yyR2 = [...]int{ @@ -7638,104 +7571,104 @@ var yyR2 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 0, 1, 0, 2, - 0, 2, 0, 2, 2, 0, 1, 5, 1, 3, - 7, 1, 3, 3, 1, 2, 2, 2, 5, 5, - 5, 6, 8, 5, 5, 4, 4, 4, 6, 5, - 5, 5, 2, 2, 2, 2, 3, 3, 3, 4, - 3, 3, 1, 3, 5, 1, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 2, 3, 4, 4, - 2, 11, 3, 6, 8, 6, 6, 6, 13, 8, - 6, 10, 5, 5, 5, 7, 5, 5, 5, 5, - 5, 7, 7, 5, 5, 0, 6, 5, 6, 4, - 5, 0, 8, 9, 0, 3, 0, 1, 0, 3, - 8, 4, 1, 3, 3, 6, 7, 7, 8, 4, - 0, 1, 0, 1, 3, 3, 1, 1, 2, 1, - 1, 0, 2, 0, 2, 5, 3, 7, 4, 4, - 4, 4, 3, 3, 3, 7, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2, 0, 2, 2, - 1, 3, 2, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 1, 3, 3, 0, 2, 2, - 2, 2, 2, 2, 2, 4, 4, 3, 0, 1, - 4, 3, 4, 4, 3, 3, 3, 2, 1, 3, - 3, 3, 5, 7, 7, 6, 5, 3, 2, 3, - 3, 3, 7, 3, 3, 3, 3, 4, 7, 5, - 2, 4, 4, 4, 4, 4, 5, 5, 4, 4, - 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, - 4, 4, 4, 2, 3, 3, 3, 5, 2, 3, - 3, 2, 3, 4, 4, 4, 3, 4, 4, 5, - 3, 0, 1, 0, 1, 1, 1, 0, 2, 2, - 0, 2, 2, 0, 2, 0, 1, 1, 1, 1, - 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, - 1, 5, 0, 1, 0, 1, 2, 3, 0, 3, - 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 4, 4, 2, 2, 3, - 1, 3, 2, 1, 2, 1, 2, 2, 4, 3, - 3, 6, 4, 7, 6, 1, 3, 2, 2, 2, - 2, 1, 1, 1, 3, 2, 1, 1, 1, 0, - 1, 1, 0, 3, 0, 2, 0, 2, 1, 2, - 2, 0, 1, 1, 0, 1, 1, 5, 5, 4, - 0, 2, 4, 4, 0, 1, 0, 1, 2, 3, - 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 2, 3, 5, 0, 1, 2, 1, 1, 0, - 1, 2, 1, 3, 1, 1, 1, 4, 3, 1, - 1, 2, 3, 7, 0, 3, 0, 1, 1, 3, - 1, 3, 1, 1, 3, 3, 1, 3, 4, 4, - 4, 3, 2, 4, 0, 1, 0, 2, 0, 1, - 0, 1, 2, 1, 1, 1, 2, 2, 1, 2, - 3, 2, 3, 2, 2, 2, 1, 1, 3, 3, - 0, 1, 1, 2, 6, 5, 6, 6, 0, 2, - 3, 3, 0, 2, 3, 3, 3, 2, 3, 1, - 6, 3, 4, 3, 1, 3, 4, 5, 6, 3, - 4, 5, 6, 3, 4, 1, 1, 1, 3, 3, + 1, 3, 1, 1, 1, 0, 1, 0, 1, 0, + 2, 0, 2, 0, 2, 2, 0, 1, 5, 1, + 3, 7, 1, 3, 3, 1, 2, 2, 2, 5, + 5, 5, 6, 8, 5, 5, 4, 4, 4, 6, + 5, 5, 5, 2, 2, 2, 2, 3, 3, 3, + 4, 3, 3, 1, 3, 5, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 2, 3, 4, + 4, 2, 11, 3, 6, 8, 6, 6, 6, 13, + 8, 6, 10, 5, 5, 5, 7, 5, 5, 5, + 5, 5, 7, 7, 5, 5, 0, 6, 5, 6, + 4, 5, 0, 8, 9, 0, 3, 0, 1, 0, + 3, 8, 4, 1, 3, 3, 6, 7, 7, 8, + 4, 0, 1, 0, 1, 3, 3, 1, 1, 2, + 1, 1, 0, 2, 0, 2, 5, 3, 7, 4, + 4, 4, 4, 3, 3, 3, 7, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 2, 0, 2, + 2, 1, 3, 2, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 3, 3, 0, 2, + 2, 2, 2, 2, 2, 2, 4, 4, 3, 0, + 1, 4, 3, 4, 4, 3, 3, 3, 2, 1, + 3, 3, 3, 5, 7, 7, 6, 5, 3, 2, + 3, 3, 3, 7, 3, 3, 3, 3, 4, 7, + 5, 2, 4, 4, 4, 4, 4, 5, 5, 4, + 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, + 4, 4, 4, 4, 2, 3, 3, 3, 5, 2, + 3, 3, 2, 3, 4, 4, 4, 3, 4, 4, + 5, 3, 0, 1, 0, 1, 1, 1, 0, 2, + 2, 0, 2, 2, 0, 2, 0, 1, 1, 1, + 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, + 1, 1, 5, 0, 1, 0, 1, 2, 3, 0, + 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 4, 4, 2, 2, + 3, 1, 3, 2, 1, 2, 1, 2, 2, 4, + 3, 3, 6, 4, 7, 6, 1, 3, 2, 2, + 2, 2, 1, 1, 1, 3, 2, 1, 1, 1, + 0, 1, 1, 0, 3, 0, 2, 0, 2, 1, + 2, 2, 0, 1, 1, 0, 1, 1, 5, 5, + 4, 0, 2, 4, 4, 0, 1, 0, 1, 2, + 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 2, 3, 5, 0, 1, 2, 1, 1, + 0, 1, 2, 1, 3, 1, 1, 1, 4, 3, + 1, 1, 2, 3, 7, 0, 3, 0, 1, 1, + 3, 1, 3, 1, 1, 3, 3, 1, 3, 4, + 4, 4, 3, 2, 4, 0, 1, 0, 2, 0, + 1, 0, 1, 2, 1, 1, 1, 2, 2, 1, + 2, 3, 2, 3, 2, 2, 2, 1, 1, 3, + 3, 0, 1, 1, 2, 6, 5, 6, 6, 0, + 2, 3, 3, 0, 2, 3, 3, 3, 2, 3, + 1, 6, 3, 4, 3, 1, 3, 4, 5, 6, + 3, 4, 5, 6, 3, 4, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, - 2, 2, 2, 1, 1, 2, 7, 7, 6, 6, - 2, 2, 1, 6, 3, 3, 3, 1, 3, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 2, 1, 1, 0, 1, - 2, 5, 0, 3, 0, 1, 4, 4, 2, 0, - 1, 1, 2, 2, 1, 1, 2, 2, 0, 1, - 1, 1, 1, 5, 1, 3, 0, 3, 1, 1, - 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 4, 6, 4, - 4, 8, 6, 8, 6, 5, 4, 10, 2, 2, - 1, 2, 2, 2, 4, 5, 5, 5, 5, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 8, 8, 8, 6, 5, 4, 4, 4, 4, 4, - 7, 4, 4, 6, 6, 6, 8, 6, 6, 4, - 4, 3, 4, 6, 6, 4, 4, 4, 6, 8, - 6, 4, 6, 6, 8, 10, 7, 8, 8, 9, - 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 4, 4, 6, 5, 9, 6, - 9, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 2, 6, 8, 10, 12, 14, 6, 8, 8, 10, - 12, 14, 6, 8, 10, 12, 6, 8, 4, 4, - 3, 4, 6, 6, 4, 6, 4, 6, 8, 0, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 2, 2, 2, 2, 1, 1, 2, 7, 7, 6, + 6, 2, 2, 1, 6, 3, 3, 3, 1, 3, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 1, 1, 0, + 1, 2, 5, 0, 3, 0, 1, 4, 4, 2, + 0, 1, 1, 2, 2, 1, 1, 2, 2, 0, + 1, 1, 1, 1, 5, 1, 3, 0, 3, 1, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 4, 6, + 4, 4, 8, 6, 8, 6, 5, 4, 10, 2, + 2, 1, 2, 2, 2, 4, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 8, 8, 8, 6, 5, 4, 4, 4, 4, + 4, 7, 4, 4, 6, 6, 6, 8, 6, 6, + 4, 4, 3, 4, 6, 6, 4, 4, 4, 6, + 8, 6, 4, 6, 6, 8, 10, 7, 8, 8, + 9, 4, 4, 4, 4, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 4, 4, 6, 5, 9, + 6, 9, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 6, 8, 10, 12, 14, 6, 8, 8, + 10, 12, 14, 6, 8, 10, 12, 6, 8, 4, + 4, 3, 4, 6, 6, 4, 6, 4, 6, 8, + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 2, 0, 2, 3, 3, 4, 4, - 4, 4, 4, 0, 3, 4, 7, 3, 1, 1, - 1, 0, 5, 5, 2, 3, 1, 2, 2, 1, - 2, 1, 2, 2, 1, 2, 2, 1, 1, 0, - 1, 0, 1, 0, 2, 1, 2, 4, 0, 2, - 1, 1, 3, 5, 1, 1, 1, 2, 2, 0, - 3, 0, 2, 2, 1, 3, 0, 1, 0, 1, - 3, 1, 3, 2, 0, 1, 1, 0, 1, 2, - 4, 4, 0, 2, 2, 1, 1, 3, 3, 3, - 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, - 3, 1, 1, 0, 4, 0, 1, 1, 0, 3, - 1, 3, 2, 1, 1, 0, 1, 2, 4, 9, - 3, 5, 0, 3, 3, 0, 1, 0, 2, 2, - 0, 2, 2, 2, 0, 2, 1, 2, 3, 3, - 0, 2, 1, 2, 3, 4, 3, 0, 1, 2, - 1, 5, 4, 4, 1, 3, 3, 5, 0, 5, - 1, 3, 1, 2, 3, 4, 1, 1, 3, 3, - 1, 3, 3, 3, 3, 3, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 0, 2, 0, 3, 0, 1, 0, 1, 1, 5, - 0, 1, 0, 1, 2, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 2, 0, 2, 3, 3, 4, + 4, 4, 4, 4, 0, 3, 4, 7, 3, 1, + 1, 1, 0, 5, 5, 2, 3, 1, 2, 2, + 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, + 0, 1, 0, 1, 0, 2, 1, 2, 4, 0, + 2, 1, 1, 3, 5, 1, 1, 1, 2, 2, + 0, 3, 0, 2, 2, 1, 3, 0, 1, 0, + 1, 3, 1, 3, 2, 0, 1, 1, 0, 1, + 2, 4, 4, 0, 2, 2, 1, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, + 0, 3, 1, 1, 0, 4, 0, 1, 1, 0, + 3, 1, 3, 2, 1, 1, 0, 1, 2, 4, + 9, 3, 5, 0, 3, 3, 0, 1, 0, 2, + 2, 0, 2, 2, 2, 0, 2, 1, 2, 3, + 3, 0, 2, 1, 2, 3, 4, 3, 0, 1, + 2, 1, 5, 4, 4, 1, 3, 3, 5, 0, + 5, 1, 3, 1, 2, 3, 4, 1, 1, 3, + 3, 1, 3, 3, 3, 3, 3, 1, 1, 2, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 2, 0, 3, 0, 1, 0, 1, 1, + 5, 0, 1, 0, 1, 2, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -7789,8 +7722,8 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, } var yyChk = [...]int{ @@ -8133,338 +8066,338 @@ var yyChk = [...]int{ -140, -140, 88, -407, -407, -407, -103, 88, -100, -99, -289, 77, 122, -262, -289, 89, -407, -406, -230, 89, -234, -11, 87, -3, 272, -321, -370, -322, -323, -5, - -6, -346, -79, 505, -372, -350, -291, 90, 96, 89, - 505, -407, -407, -86, 145, 624, 594, -141, -152, -149, - 220, -407, 88, -407, 88, -407, 88, -289, 243, -101, - 88, 26, -298, -172, -170, -289, 558, -390, -389, 501, - -400, -396, 119, 143, 101, -398, 596, 552, 128, 129, - -79, -140, 87, -407, -80, 287, 611, -381, 506, -86, - 625, 572, 547, 572, 547, -140, -140, -140, -99, -406, - -407, 88, 23, -313, -60, 569, -387, -388, 77, -391, - 379, 568, 589, 119, 90, 89, -250, 248, -374, 507, - 142, -407, 88, -407, 88, -407, -89, -170, 565, -326, - -154, -388, 77, -387, 77, 14, 13, -4, 655, 89, - 289, -86, -140, -140, -407, -59, 27, -171, -386, 256, - 251, 254, 33, -386, 96, -4, -407, -407, 569, 250, - 32, 119, -154, -174, -173, -173, + -6, -346, -79, 505, -372, -350, -295, -291, 90, 96, + 89, 505, -407, -407, -86, 145, 624, 594, -141, -152, + -149, 220, -407, 88, -407, 88, -407, 88, -289, 243, + -101, 88, 26, -298, -172, -170, -289, 558, -390, -389, + 501, -400, -396, 119, 143, 101, -398, 596, 552, 128, + 129, -79, -140, 87, -407, -80, 287, 611, 221, -381, + 506, -86, 625, 572, 547, 572, 547, -140, -140, -140, + -99, -406, -407, 88, 23, -313, -60, 569, -387, -388, + 77, -391, 379, 568, 589, 119, 90, 89, -250, 248, + -296, -374, 507, 142, -407, 88, -407, 88, -407, -89, + -170, 565, -326, -154, -388, 77, -387, 77, 14, 13, + -4, 655, 89, 289, -86, -140, -140, -407, -59, 27, + -171, -386, 256, 251, 254, 33, -386, 96, -4, -407, + -407, 569, 250, 32, 119, -154, -174, -173, -173, } var yyDef = [...]int{ - 844, -2, -2, 846, 2, 4, 5, 6, 7, 8, + 845, -2, -2, 847, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 69, 71, - 72, 844, 844, 844, 0, 844, 0, 0, 844, -2, - -2, 844, 1461, 0, 844, 0, 0, -2, 771, 777, - 0, 779, -2, 0, 0, 844, 2008, 2008, 839, 0, - 0, 0, 0, 0, 844, 844, 844, 844, 1318, 49, - 844, 0, 84, 85, 795, 796, 797, 64, 0, 2006, - 845, 1, 3, 70, 74, 0, 0, 0, 57, 1327, - 0, 77, 0, 0, 848, 0, 0, 1444, 844, 844, + 72, 845, 845, 845, 0, 845, 0, 0, 845, -2, + -2, 845, 1462, 0, 845, 0, 0, -2, 772, 778, + 0, 780, -2, 0, 0, 845, 2009, 2009, 840, 0, + 0, 0, 0, 0, 845, 845, 845, 845, 1319, 49, + 845, 0, 84, 85, 796, 797, 798, 64, 0, 2007, + 846, 1, 3, 70, 74, 0, 0, 0, 57, 1328, + 0, 77, 0, 0, 849, 0, 0, 1445, 845, 845, 0, 116, 117, 0, 0, 0, -2, 120, -2, 149, - 150, 151, 0, 156, 585, 508, 560, 506, 545, -2, - 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 511, 384, 384, 0, 0, -2, 494, - 494, 494, 1446, 0, 0, 0, 542, 446, 384, 384, + 150, 151, 0, 156, 586, 509, 561, 507, 546, -2, + 495, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 512, 384, 384, 0, 0, -2, 495, + 495, 495, 1447, 0, 0, 0, 543, 446, 384, 384, 384, 0, 384, 384, 384, 384, 0, 0, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, - 384, 384, 384, 384, 384, 1345, 155, 1462, 1459, 1460, - 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, - 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, - 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, - 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, - 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, - 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, - 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, - 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, - 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, - 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, - 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, - 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, - 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, - 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, - 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, - 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, - 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, - 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, - 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, - 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, - 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, - 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, - 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, - 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, - 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, - 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, - 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, - 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, - 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, - 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, - 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, - 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, - 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, - 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, - 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, - 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, - 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, - 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, - 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 0, 1438, 0, 698, 947, 0, 760, 760, - 0, 760, 760, 760, 760, 0, 0, 0, 710, 0, - 0, 0, 0, 757, 0, 726, 727, 0, 757, 0, - 733, 763, 0, 738, 760, 760, 741, 2009, 0, 2009, - 2009, 1429, 0, 754, 752, 766, 767, 39, 770, 773, - 774, 775, 776, 778, 0, 783, 786, 1455, 1456, 0, - 788, 807, 808, 0, 840, 841, 44, 1095, 0, 969, - 974, 985, 1000, 1001, 1002, 1003, 1004, 1006, 1007, 1008, - 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, - 0, 1076, 1022, 0, 0, 0, 0, 1291, 0, 0, - 1252, 1252, 1110, 1252, 1254, 1254, 1662, 1798, 1806, 1923, - 1625, 1630, 1631, 1632, 1916, 1917, 1918, 1919, 1957, 1958, - 1962, 1722, 0, 0, 0, 2005, 1759, 1767, 1768, 1792, - 1889, 1943, 1642, 1787, 1855, 1719, 1741, 1742, 1871, 1872, - 1763, 1764, 1745, 1757, 1760, 1748, 1749, 1751, 1753, 1758, - 1765, 1771, 1750, 1770, 1769, 0, 1746, 1747, 1752, 1762, - 1766, 1754, 1755, 1756, 1761, 1772, 0, 0, 0, 0, - 0, 1191, 1192, 1193, 1194, 0, 0, 0, 0, 0, - 0, 0, 280, 281, 1304, 1305, 42, 43, 1094, 1416, - 1254, 1254, 1254, 1254, 1254, 1036, 1037, 1038, 1039, 1040, - 1064, 1065, 1071, 1072, 1866, 1867, 1868, 1869, 1703, 1952, - 1711, 1712, 1850, 1851, 1724, 1725, 1980, 1981, -2, -2, + 384, 384, 384, 384, 384, 1346, 155, 1463, 1460, 1461, + 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, + 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, + 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, + 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, + 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, + 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, + 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, + 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, + 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, + 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, + 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, + 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, + 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, + 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, + 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, + 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, + 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, + 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, + 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, + 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, + 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, + 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, + 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, + 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, + 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, + 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, + 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, + 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, + 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, + 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, + 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, + 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, + 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, + 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, + 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, + 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, + 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, + 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 0, 1439, 0, 699, 948, 0, 761, 761, + 0, 761, 761, 761, 761, 0, 0, 0, 711, 0, + 0, 0, 0, 758, 0, 727, 728, 0, 758, 0, + 734, 764, 0, 739, 761, 761, 742, 2010, 0, 2010, + 2010, 1430, 0, 755, 753, 767, 768, 39, 771, 774, + 775, 776, 777, 779, 0, 784, 787, 1456, 1457, 0, + 789, 808, 809, 0, 841, 842, 44, 1096, 0, 970, + 975, 986, 1001, 1002, 1003, 1004, 1005, 1007, 1008, 1009, + 0, 0, 0, 0, 1014, 1015, 0, 0, 0, 0, + 0, 1077, 1023, 0, 0, 0, 0, 1292, 0, 0, + 1253, 1253, 1111, 1253, 1255, 1255, 1663, 1799, 1807, 1924, + 1626, 1631, 1632, 1633, 1917, 1918, 1919, 1920, 1958, 1959, + 1963, 1723, 0, 0, 0, 2006, 1760, 1768, 1769, 1793, + 1890, 1944, 1643, 1788, 1856, 1720, 1742, 1743, 1872, 1873, + 1764, 1765, 1746, 1758, 1761, 1749, 1750, 1752, 1754, 1759, + 1766, 1772, 1751, 1771, 1770, 0, 1747, 1748, 1753, 1763, + 1767, 1755, 1756, 1757, 1762, 1773, 0, 0, 0, 0, + 0, 1192, 1193, 1194, 1195, 0, 0, 0, 0, 0, + 0, 0, 280, 281, 1305, 1306, 42, 43, 1095, 1417, + 1255, 1255, 1255, 1255, 1255, 1037, 1038, 1039, 1040, 1041, + 1065, 1066, 1072, 1073, 1867, 1868, 1869, 1870, 1704, 1953, + 1712, 1713, 1851, 1852, 1725, 1726, 1981, 1982, -2, -2, -2, 221, 222, 223, 224, 225, 226, 227, 228, 0, - 1666, 1934, 1935, 217, 0, 0, 285, 286, 282, 283, - 284, 1078, 1079, 238, 239, 240, 241, 242, 243, 244, + 1667, 1935, 1936, 217, 0, 0, 285, 286, 282, 283, + 284, 1079, 1080, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 2008, 0, 817, 0, 0, - 0, 0, 0, 1327, 0, 1319, 1318, 62, 0, 844, - -2, 0, 0, 0, 0, 46, 0, 51, 904, 847, - 76, 75, 1367, 0, 0, 0, 58, 1328, 66, 68, - 1329, 0, 849, 850, 0, 880, 884, 0, 0, 0, - 1445, 1444, 1444, 101, 0, 0, 1420, 113, 114, 115, - 0, 0, 1426, 1427, 1431, 1432, 0, 0, 167, 168, - 0, 40, 411, 0, 163, 0, 404, 345, 0, 1345, - 0, 0, 0, 0, 0, 844, 0, 1439, 144, 145, - 152, 153, 154, 384, 384, 384, 557, 0, 0, 155, - 155, 515, 516, 517, 0, 0, -2, 409, 0, 495, + 275, 276, 277, 278, 279, 2009, 0, 818, 0, 0, + 0, 0, 0, 1328, 0, 1320, 1319, 62, 0, 845, + -2, 0, 0, 0, 0, 46, 0, 51, 905, 848, + 76, 75, 1368, 0, 0, 0, 58, 1329, 66, 68, + 1330, 0, 850, 851, 0, 881, 885, 0, 0, 0, + 1446, 1445, 1445, 101, 0, 0, 1421, 113, 114, 115, + 0, 0, 1427, 1428, 1432, 1433, 0, 0, 167, 168, + 0, 40, 411, 0, 163, 0, 404, 345, 0, 1346, + 0, 0, 0, 0, 0, 845, 0, 1440, 144, 145, + 152, 153, 154, 384, 384, 384, 558, 0, 0, 155, + 155, 516, 517, 518, 0, 0, -2, 409, 0, 496, 0, 0, 398, 398, 402, 400, 401, 0, 0, 0, - 0, 0, 0, 0, 0, 534, 0, 535, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 646, 0, 385, - 0, 555, 556, 447, 0, 0, 0, 0, 0, 0, - 0, 0, 1447, 1448, 0, 532, 533, 0, 0, 0, + 0, 0, 0, 0, 0, 535, 0, 536, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 647, 0, 385, + 0, 556, 557, 447, 0, 0, 0, 0, 0, 0, + 0, 0, 1448, 1449, 0, 533, 534, 0, 0, 0, 384, 384, 0, 0, 0, 0, 384, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 143, 1358, 0, 0, - 0, -2, 0, 690, 0, 0, 0, 1440, 1440, 0, - 697, 0, 699, 700, 0, 0, 701, 0, 757, 757, - 755, 756, 703, 704, 705, 706, 760, 0, 0, 393, - 394, 395, 757, 760, 0, 760, 760, 760, 760, 757, - 757, 757, 760, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2009, 763, 760, 0, 734, 0, 735, 736, - 739, 740, 742, 2010, 2011, 1457, 1458, 1465, 1466, 1467, - 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, - 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, - 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, - 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, - 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, - 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, - 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, - 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, - 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, - 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, - 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, - 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, - 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, - 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, - 1608, 1609, 1610, 1611, 1612, 1613, 2009, 2009, 746, 750, - 1430, 772, 784, 787, 802, 48, 1710, 794, 819, 820, - 825, 0, 0, 0, 0, 831, 832, 833, 0, 0, - 836, 837, 838, 0, 0, 0, 0, 0, 967, 0, - 0, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 986, 987, 0, 0, 0, - 1009, 1010, 1011, 1012, 1015, 0, 1027, 0, 1029, 1300, - -2, 0, 0, 0, 1020, 1021, 0, 0, 0, 0, - 0, 0, 0, 1292, 0, 0, 1108, 0, 1109, 1111, - 1112, 0, 1113, 854, 854, 854, 854, 854, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 854, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1450, + 0, 0, 0, 0, 0, 0, 143, 1359, 0, 0, + 0, -2, 0, 691, 0, 0, 0, 1441, 1441, 0, + 698, 0, 700, 701, 0, 0, 702, 0, 758, 758, + 756, 757, 704, 705, 706, 707, 761, 0, 0, 393, + 394, 395, 758, 761, 0, 761, 761, 761, 761, 758, + 758, 758, 761, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2010, 764, 761, 0, 735, 0, 736, 737, + 740, 741, 743, 2011, 2012, 1458, 1459, 1466, 1467, 1468, + 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, + 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, + 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, + 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, + 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, + 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, + 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, + 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, + 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, + 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, + 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, + 1609, 1610, 1611, 1612, 1613, 1614, 2010, 2010, 747, 751, + 1431, 773, 785, 788, 803, 48, 1711, 795, 820, 821, + 826, 0, 0, 0, 0, 832, 833, 834, 0, 0, + 837, 838, 839, 0, 0, 0, 0, 0, 968, 0, + 0, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 987, 988, 0, 0, 0, + 1010, 1011, 1012, 1013, 1016, 0, 1028, 0, 1030, 1301, + -2, 0, 0, 0, 1021, 1022, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 1109, 0, 1110, 1112, + 1113, 0, 1114, 855, 855, 855, 855, 855, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 855, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1451, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 864, 0, - 0, 864, 864, 0, 0, 210, 211, 212, 213, 214, + 0, 0, 0, 0, 0, 0, 0, 0, 865, 0, + 0, 865, 865, 0, 0, 210, 211, 212, 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 230, 231, 232, 233, 234, - 287, 235, 236, 237, 1094, 0, 0, 0, 45, 809, - 810, 0, 930, 1450, 0, 0, 860, 0, 56, 65, - 67, 1327, 60, 1327, 0, 866, 0, 0, -2, -2, - 867, 873, 874, 875, 876, 877, 53, 2007, 54, 0, - 73, 0, 47, 0, 0, 0, 0, 357, 1370, 0, - 0, 1320, 1321, 1324, 0, 881, 1804, 885, 0, 887, - 888, 0, 0, 99, 0, 946, 0, 0, 0, 0, - 1428, 103, 104, 0, 0, 0, 368, 1433, 1434, 1435, + 287, 235, 236, 237, 1095, 0, 0, 0, 45, 810, + 811, 0, 931, 1451, 0, 0, 861, 0, 56, 65, + 67, 1328, 60, 1328, 0, 867, 0, 0, -2, -2, + 868, 874, 875, 876, 877, 878, 53, 2008, 54, 0, + 73, 0, 47, 0, 0, 0, 0, 357, 1371, 0, + 0, 1321, 1322, 1325, 0, 882, 1805, 886, 0, 888, + 889, 0, 0, 99, 0, 947, 0, 0, 0, 0, + 1429, 103, 104, 0, 0, 0, 368, 1434, 1435, 1436, -2, 391, 0, 368, 352, 295, 296, 297, 345, 299, 345, 345, 345, 345, 357, 357, 357, 357, 328, 329, 330, 331, 332, 0, 0, 314, 345, 345, 345, 345, 335, 336, 337, 338, 339, 340, 341, 342, 300, 301, 302, 303, 304, 305, 306, 307, 308, 347, 347, 347, - 349, 349, 0, 41, 0, 372, 0, 1324, 0, 0, - 1358, 1442, 1452, 0, 0, 0, 1442, 122, 0, 0, - 0, 558, 596, 509, 546, 559, 0, 512, 513, -2, - 0, 0, 494, 0, 496, 0, 392, 0, -2, 0, - 402, 0, 398, 402, 399, 402, 390, 403, 536, 537, - 538, 0, 540, 541, 626, 916, 0, 0, 0, 0, - 0, 632, 633, 634, 0, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 547, 548, 549, 550, 551, - 552, 553, 554, 0, 0, 0, 0, 496, 0, 543, + 349, 349, 0, 41, 0, 372, 0, 1325, 0, 0, + 1359, 1443, 1453, 0, 0, 0, 1443, 122, 0, 0, + 0, 559, 597, 510, 547, 560, 0, 513, 514, -2, + 0, 0, 495, 0, 497, 0, 392, 0, -2, 0, + 402, 0, 398, 402, 399, 402, 390, 403, 537, 538, + 539, 0, 541, 542, 627, 917, 0, 0, 0, 0, + 0, 633, 634, 635, 0, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 548, 549, 550, 551, 552, + 553, 554, 555, 0, 0, 0, 0, 497, 0, 544, 0, 0, 448, 449, 450, 0, 0, 453, 454, 455, - 456, 0, 0, 459, 460, 461, 933, 934, 462, 463, + 456, 0, 0, 459, 460, 461, 934, 935, 462, 463, 488, 489, 490, 464, 465, 466, 467, 468, 469, 470, 482, 483, 484, 485, 486, 487, 471, 472, 473, 474, - 475, 476, 479, 0, 137, 1349, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1440, 0, 0, 0, 0, 863, 948, 1463, 1464, - 761, 762, 0, 396, 397, 760, 760, 707, 747, 0, - 760, 711, 748, 712, 714, 713, 715, 728, 729, 760, - 718, 758, 759, 719, 720, 721, 722, 723, 724, 725, - 743, 730, 731, 732, 764, 0, 768, 769, 744, 745, - 0, 785, 805, 803, 804, 806, 798, 799, 800, 801, - 0, 0, 0, 822, 95, 827, 828, 829, 830, 842, - 835, 1096, 964, 965, 966, 0, 968, 971, 0, 1080, - 1082, 973, 975, 1091, 1092, 1093, 0, 0, 0, 0, - 0, 979, 983, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1005, 1268, 1269, 1270, 1024, - 288, 289, 0, 1025, 0, 0, 0, 0, 0, 0, - 0, 1095, 1026, 0, 878, 0, 0, 1298, 1295, 0, - 0, 0, 1253, 1255, 0, 0, 0, 0, 855, 856, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1231, 1232, - 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, - 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1271, - 0, 0, 0, 0, 0, 1291, 0, 1031, 1032, 1033, - 0, 0, 0, 0, 0, 0, 1151, 0, 0, 0, - 0, 1451, 0, 132, 133, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1195, 1196, 1197, 1198, 38, 0, 0, 0, 865, - 1302, 0, -2, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1220, 0, 0, - 0, 0, 0, 0, 1414, 0, 0, 812, 813, 815, - 0, 950, 0, 931, 0, 0, 818, 0, 859, 0, - 862, 59, 61, 871, 872, 0, 889, 868, 55, 50, - 0, 0, 908, 1368, 357, 1390, 0, 366, 366, 363, - 1330, 1331, 0, 1323, 1325, 1326, 78, 886, 882, 0, - 962, 0, 0, 945, 0, 892, 894, 895, 896, 928, - 0, 899, 900, 0, 0, 0, 0, 0, 97, 947, - 1421, 0, 102, 0, 0, 107, 108, 1422, 1423, 1424, - 1425, 0, 585, -2, 443, 169, 171, 172, 173, 164, + 475, 476, 479, 0, 137, 1350, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1441, 0, 0, 0, 0, 864, 949, 1464, 1465, + 762, 763, 0, 396, 397, 761, 761, 708, 748, 0, + 761, 712, 749, 713, 715, 714, 716, 729, 730, 761, + 719, 759, 760, 720, 721, 722, 723, 724, 725, 726, + 744, 731, 732, 733, 765, 0, 769, 770, 745, 746, + 0, 786, 806, 804, 805, 807, 799, 800, 801, 802, + 0, 0, 0, 823, 95, 828, 829, 830, 831, 843, + 836, 1097, 965, 966, 967, 0, 969, 972, 0, 1081, + 1083, 974, 976, 1092, 1093, 1094, 0, 0, 0, 0, + 0, 980, 984, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1006, 1269, 1270, 1271, 1025, + 288, 289, 0, 1026, 0, 0, 0, 0, 0, 0, + 0, 1096, 1027, 0, 879, 0, 0, 1299, 1296, 0, + 0, 0, 1254, 1256, 0, 0, 0, 0, 856, 857, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1232, 1233, + 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, + 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1272, + 0, 0, 0, 0, 0, 1292, 0, 1032, 1033, 1034, + 0, 0, 0, 0, 0, 0, 1152, 0, 0, 0, + 0, 1452, 0, 132, 133, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1196, 1197, 1198, 1199, 38, 0, 0, 0, 866, + 1303, 0, -2, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1221, 0, 0, + 0, 0, 0, 0, 1415, 0, 0, 813, 814, 816, + 0, 951, 0, 932, 0, 0, 819, 0, 860, 0, + 863, 59, 61, 872, 873, 0, 890, 869, 55, 50, + 0, 0, 909, 1369, 357, 1391, 0, 366, 366, 363, + 1331, 1332, 0, 1324, 1326, 1327, 78, 887, 883, 0, + 963, 0, 0, 946, 0, 893, 895, 896, 897, 929, + 0, 900, 901, 0, 0, 0, 0, 0, 97, 948, + 1422, 0, 102, 0, 0, 107, 108, 1423, 1424, 1425, + 1426, 0, 586, -2, 443, 169, 171, 172, 173, 164, -2, 355, 353, 354, 298, 357, 357, 322, 323, 324, 325, 326, 327, 0, 0, 315, 316, 317, 318, 309, - 0, 310, 311, 312, 0, 313, 410, 0, 1332, 373, + 0, 310, 311, 312, 0, 313, 410, 0, 1333, 373, 374, 376, 384, 0, 379, 380, 0, 384, 384, 0, - 405, 406, 0, 1324, 1349, 0, 0, 0, 1453, 1452, - 1452, 1452, 0, 157, 158, 159, 160, 161, 162, 621, - 0, 0, 597, 619, 620, 155, 0, 0, 165, 498, - 497, 0, 653, 0, 408, 0, 0, 402, 402, 387, - 388, 539, 0, 0, 628, 629, 630, 631, 0, 0, - 0, 525, 437, 0, 526, 527, 496, 498, 0, 0, + 405, 406, 0, 1325, 1350, 0, 0, 0, 1454, 1453, + 1453, 1453, 0, 157, 158, 159, 160, 161, 162, 622, + 0, 0, 598, 620, 621, 155, 0, 0, 165, 499, + 498, 0, 654, 0, 408, 0, 0, 402, 402, 387, + 388, 540, 0, 0, 629, 630, 631, 632, 0, 0, + 0, 526, 437, 0, 527, 528, 497, 499, 0, 0, 368, 451, 452, 457, 458, 477, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 572, 573, 574, - 577, 579, 500, 583, 576, 578, 580, 500, 584, 1346, - 1347, 1348, 0, 0, 691, 0, 0, 434, 93, 1441, - 696, 757, 717, 749, 757, 709, 716, 737, 781, 789, - 790, 791, 792, 793, 826, 0, 0, 0, 0, 834, - 0, 0, 972, 1081, 1083, 976, 0, 980, 984, 0, - 0, 0, 1030, 1028, 1302, 0, 0, 0, 1077, 0, - 0, 1099, 1100, 0, 0, 0, 1296, 0, 0, 1106, - 0, 1256, 1257, 1114, 0, 0, 0, 0, 0, 1120, - 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1318, - 0, 0, 0, 0, 0, 1135, 1136, 1137, 1138, 1139, - 0, 1141, 0, 1142, 0, 0, 0, 0, 1149, 1150, - 1152, 0, 0, 1155, 1156, 0, 0, 1157, 0, 0, - 0, 1161, 0, 0, 0, 0, 1170, 1171, 1172, 1173, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1184, 1185, 0, 1059, 0, 0, 1059, 0, 1097, 864, - 0, 1258, 1259, 1260, 1261, 1262, 0, 0, 0, 0, - 0, 0, 1218, 1219, 1221, 0, 0, 1224, 0, 1226, - 0, 1415, 811, 814, 816, 902, 951, 952, 0, 0, - 0, 0, 932, 1449, 857, 858, 861, 910, 0, 1306, - 0, 0, 889, 962, 890, 0, 869, 52, 905, 0, - 1372, 1371, 1384, 1397, 366, 366, 360, 361, 367, 362, - 364, 365, 1322, 0, 1327, 0, 1408, 0, 0, 1400, - 0, 0, 0, 0, 0, 0, 0, 0, 935, 0, - 0, 938, 0, 0, 0, 0, 929, 900, 0, 901, + 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, + 578, 580, 501, 584, 577, 579, 581, 501, 585, 1347, + 1348, 1349, 0, 0, 692, 0, 0, 434, 93, 1442, + 697, 758, 718, 750, 758, 710, 717, 738, 782, 790, + 791, 792, 793, 794, 827, 0, 0, 0, 0, 835, + 0, 0, 973, 1082, 1084, 977, 0, 981, 985, 0, + 0, 0, 1031, 1029, 1303, 0, 0, 0, 1078, 0, + 0, 1100, 1101, 0, 0, 0, 1297, 0, 0, 1107, + 0, 1257, 1258, 1115, 0, 0, 0, 0, 0, 1121, + 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1319, + 0, 0, 0, 0, 0, 1136, 1137, 1138, 1139, 1140, + 0, 1142, 0, 1143, 0, 0, 0, 0, 1150, 1151, + 1153, 0, 0, 1156, 1157, 0, 0, 1158, 0, 0, + 0, 1162, 0, 0, 0, 0, 1171, 1172, 1173, 1174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1185, 1186, 0, 1060, 0, 0, 1060, 0, 1098, 865, + 0, 1259, 1260, 1261, 1262, 1263, 0, 0, 0, 0, + 0, 0, 1219, 1220, 1222, 0, 0, 1225, 0, 1227, + 0, 1416, 812, 815, 817, 903, 952, 953, 0, 0, + 0, 0, 933, 1450, 858, 859, 862, 911, 0, 1307, + 0, 0, 890, 963, 891, 0, 870, 52, 906, 0, + 1373, 1372, 1385, 1398, 366, 366, 360, 361, 367, 362, + 364, 365, 1323, 0, 1328, 0, 1409, 0, 0, 1401, + 0, 0, 0, 0, 0, 0, 0, 0, 936, 0, + 0, 939, 0, 0, 0, 0, 930, 901, 0, 902, 0, -2, 0, 0, 91, 92, 0, 0, 0, 105, 106, 0, 0, 112, 369, 370, 146, 155, 445, 170, 418, 0, 0, 294, 356, 319, 320, 321, 0, 343, - 0, 0, 0, 439, 118, 1336, 1335, 384, 384, 375, - 0, 378, 0, 0, 0, 1454, 346, 407, 0, 136, - 0, 0, 0, 0, 0, 142, 591, 0, 0, 598, - 0, 0, 0, 507, 0, 518, 519, 0, 625, -2, - 687, 372, 0, 386, 389, 917, 0, 0, 520, 0, - 523, 524, 438, 498, 529, 530, 544, 531, 480, 481, - 478, 0, 0, 1359, 1360, 1365, 1363, 1364, 123, 565, - 567, 566, 570, 0, 0, 0, 502, 0, 502, 563, - 0, 434, 1332, 0, 695, 435, 436, 760, 760, 821, - 96, 0, 824, 0, 0, 0, 0, 977, 981, 1263, - 1289, 345, 345, 1276, 345, 349, 1279, 345, 1281, 345, - 1284, 345, 1287, 1288, 0, 0, 0, 879, 0, 0, - 1105, 1299, 0, 0, 1115, 1116, 1117, 1118, 1119, 1293, - 0, 0, 0, 1134, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 439, 118, 1337, 1336, 384, 384, 375, + 0, 378, 0, 0, 0, 1455, 346, 407, 0, 136, + 0, 0, 0, 0, 0, 142, 592, 0, 0, 599, + 0, 0, 0, 508, 0, 519, 520, 0, 626, -2, + 688, 372, 0, 386, 389, 918, 0, 0, 521, 0, + 524, 525, 438, 499, 530, 531, 545, 532, 480, 481, + 478, 0, 0, 1360, 1361, 1366, 1364, 1365, 123, 566, + 568, 567, 571, 0, 0, 0, 503, 0, 503, 564, + 0, 434, 1333, 0, 696, 435, 436, 761, 761, 822, + 96, 0, 825, 0, 0, 0, 0, 978, 982, 1264, + 1290, 345, 345, 1277, 345, 349, 1280, 345, 1282, 345, + 1285, 345, 1288, 1289, 0, 0, 0, 880, 0, 0, + 1106, 1300, 0, 0, 1116, 1117, 1118, 1119, 1120, 1294, + 0, 0, 0, 1135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 0, 0, 0, 0, - 0, 0, 1229, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1054, 1058, 0, 1060, 1061, 0, 0, - 1187, 0, 0, 1199, 0, 1303, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 953, 958, 958, 958, - 0, 0, 0, 1436, 1437, 1307, 1308, 962, 1309, 891, - 870, 909, 1390, 0, 1383, 0, -2, 1392, 0, 0, - 0, 1398, 358, 359, 883, 79, 963, 82, 0, 1408, - 1417, 0, 1399, 1410, 1412, 0, 0, 0, 1404, 0, - 962, 893, 924, 926, 0, 921, 936, 937, 939, 0, - 941, 0, 943, 944, 904, 898, 0, 99, 0, 962, - 962, 98, 0, 949, 109, 110, 111, 444, 174, 179, + 0, 0, 1230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1055, 1059, 0, 1061, 1062, 0, 0, + 1188, 0, 0, 1200, 0, 1304, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 954, 959, 959, 959, + 0, 0, 0, 1437, 1438, 1308, 1309, 963, 1310, 892, + 871, 910, 1391, 0, 1384, 0, -2, 1393, 0, 0, + 0, 1399, 358, 359, 884, 79, 964, 82, 0, 1409, + 1418, 0, 1400, 1411, 1413, 0, 0, 0, 1405, 0, + 963, 894, 925, 927, 0, 922, 937, 938, 940, 0, + 942, 0, 944, 945, 905, 899, 0, 99, 0, 963, + 963, 98, 0, 950, 109, 110, 111, 444, 174, 179, 0, 0, 0, 184, 0, 186, 0, 0, 0, 191, 192, 384, 384, 419, 0, 291, 293, 0, 0, 177, - 357, 0, 357, 0, 350, 0, 420, 440, 1333, 1334, - 0, 0, 377, 381, 382, 383, 0, 1443, 138, 0, - 0, 0, 594, 0, 622, 0, 0, 0, 0, 0, - 0, 166, 499, 654, 655, 656, 657, 658, 659, 660, - 661, 662, 0, 384, 0, 0, 0, 384, 384, 384, - 0, 679, 371, 0, 0, 650, 647, 521, 0, 215, - 216, 218, 0, 0, 0, 0, 0, 528, 904, 1350, - 1351, 1352, 0, 1362, 1366, 126, 0, 0, 0, 0, - 575, 581, 0, 501, 582, 692, 693, 694, 94, 702, - 708, 823, 843, 970, 978, 982, 0, 0, 0, 0, - 1290, 1274, 357, 1277, 1278, 1280, 1282, 1283, 1285, 1286, - 1018, 1019, 1023, 0, 1102, 0, 1104, 1297, 0, 1327, - 0, 0, 0, 1133, 0, 0, 0, 1144, 1143, 1145, - 0, 1147, 1148, 1153, 1154, 1158, 0, 1160, 1162, 1163, - 0, 0, 0, 1174, 1175, 1176, 1177, 1178, 1179, 1180, - 1181, 1182, 1183, 0, 1052, 1055, 1186, 1062, 1063, 1068, - 1189, 0, 0, 1098, 1201, 0, 1206, 0, 0, 1212, - 0, 1216, 0, 1222, 1223, 1225, 1227, 0, 0, 0, - 0, 0, 930, 911, 63, 1309, 1311, 0, 1377, 1375, - 1375, 1385, 1386, 0, 0, 1393, 0, 0, 0, 0, - 83, 0, 0, 0, 1413, 0, 0, 0, 0, 100, - 1318, 918, 925, 0, 0, 919, 0, 920, 940, 942, - 897, 0, 962, 962, 89, 90, 0, 180, 0, 182, + 357, 0, 357, 0, 350, 0, 420, 440, 1334, 1335, + 0, 0, 377, 381, 382, 383, 0, 1444, 138, 0, + 0, 0, 595, 0, 623, 0, 0, 0, 0, 0, + 0, 166, 500, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 0, 384, 0, 0, 0, 384, 384, 384, + 0, 680, 371, 0, 0, 651, 648, 522, 0, 215, + 216, 218, 0, 0, 0, 0, 0, 529, 905, 1351, + 1352, 1353, 0, 1363, 1367, 126, 0, 0, 0, 0, + 576, 582, 0, 502, 583, 693, 694, 695, 94, 703, + 709, 824, 844, 971, 979, 983, 0, 0, 0, 0, + 1291, 1275, 357, 1278, 1279, 1281, 1283, 1284, 1286, 1287, + 1019, 1020, 1024, 0, 1103, 0, 1105, 1298, 0, 1328, + 0, 0, 0, 1134, 0, 0, 0, 1145, 1144, 1146, + 0, 1148, 1149, 1154, 1155, 1159, 0, 1161, 1163, 1164, + 0, 0, 0, 1175, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1183, 1184, 0, 1053, 1056, 1187, 1063, 1064, 1069, + 1190, 0, 0, 1099, 1202, 0, 1207, 0, 0, 1213, + 0, 1217, 0, 1223, 1224, 1226, 1228, 0, 0, 0, + 0, 0, 931, 912, 63, 1310, 1312, 0, 1378, 1376, + 1376, 1386, 1387, 0, 0, 1394, 0, 0, 0, 0, + 83, 0, 0, 0, 1414, 0, 0, 0, 0, 100, + 1319, 919, 926, 0, 0, 920, 0, 921, 941, 943, + 898, 0, 963, 963, 89, 90, 0, 180, 0, 182, 208, 209, 0, 185, 187, 188, 189, 195, 196, 197, 190, 0, 0, 290, 292, 0, 0, 333, 344, 334, - 0, 0, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, - 904, 139, 140, 141, 586, 0, 596, 0, 906, 0, - 589, 0, 510, 0, 0, 0, 384, 384, 384, 0, - 0, 0, 0, 664, 0, 0, 627, 0, 635, 0, - 0, 0, 219, 220, 0, 1361, 564, 0, 124, 125, - 0, 0, 569, 503, 504, 1016, 0, 0, 0, 1017, - 1275, 0, 0, 0, 0, 1294, 0, 0, 0, 0, - 1140, 0, 0, 0, 1166, 0, 0, 0, 616, 617, - 0, 1230, 1057, 1318, 0, 1059, 1069, 1070, 0, 1059, - 1200, 0, 0, 0, 0, 0, 0, 0, 959, 0, - 0, 0, 0, 950, 1311, 1316, 0, 0, 1380, 0, - 1373, 1376, 1374, 1387, 0, 0, 1394, 0, 1396, 0, - 1418, 1419, 1411, 0, 1403, 1406, 1402, 1405, 1327, 922, - 0, 927, 0, 1318, 88, 0, 183, 0, 0, 0, + 0, 0, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, + 905, 139, 140, 141, 587, 0, 597, 0, 907, 0, + 590, 0, 511, 0, 0, 0, 384, 384, 384, 0, + 0, 0, 0, 665, 0, 0, 628, 0, 636, 0, + 0, 0, 219, 220, 0, 1362, 565, 0, 124, 125, + 0, 0, 570, 504, 505, 1017, 0, 0, 0, 1018, + 1276, 0, 0, 0, 0, 1295, 0, 0, 0, 0, + 1141, 0, 0, 0, 1167, 0, 0, 0, 617, 618, + 0, 1231, 1058, 1319, 0, 1060, 1070, 1071, 0, 1060, + 1201, 0, 0, 0, 0, 0, 0, 0, 960, 0, + 0, 0, 0, 951, 1312, 1317, 0, 0, 1381, 0, + 1374, 1377, 1375, 1388, 0, 0, 1395, 0, 1397, 0, + 1419, 1420, 1412, 0, 1404, 1407, 1403, 1406, 1328, 923, + 0, 928, 0, 1319, 88, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -8472,37 +8405,37 @@ var yyDef = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 194, 0, - 0, 348, 351, 0, 0, 0, 587, 0, 907, 599, - 590, 0, 677, 0, 681, 0, 0, 0, 684, 685, - 686, 663, 0, 667, 412, 651, 648, 649, 522, 0, - 127, 128, 0, 0, 0, 1264, 0, 1267, 1101, 1103, - 0, 1130, 1131, 1132, 1272, 1273, 1146, 1159, 1164, 0, - 1167, 0, 0, 1168, 0, 618, 1048, 0, 0, 1066, - 1067, 0, 1202, 0, 1207, 1208, 0, 1213, 0, 1217, - 1228, 0, 955, 912, 913, 960, 961, 0, 0, 903, - 1316, 81, 1317, 1314, 0, 1312, 1310, 1369, 0, 1378, - 1379, 1388, 1389, 1395, 0, 1401, 0, 86, 0, 0, - 0, 1327, 181, 0, 200, 0, 595, 0, 598, 588, - 675, 676, 0, 688, 680, 682, 683, 665, -2, 1353, - 0, 0, 0, 571, 1265, 0, 0, 1169, 0, 614, - 615, 1056, 1049, 0, 1034, 1035, 1053, 1188, 1190, 0, - 0, 0, 0, 954, 956, 957, 80, 0, 1313, 1074, - 0, 1381, 1382, 1409, 1407, 923, 930, 0, 87, 425, - 418, 1353, 0, 0, 0, 668, 669, 670, 671, 672, - 673, 674, 561, 1355, 129, 130, 491, 492, 493, 123, - 0, 1107, 1165, 1050, 0, 0, 0, 0, 1046, 1047, - 0, 1203, 0, 1209, 0, 1214, 0, 914, 915, 1315, - 0, 0, 600, 0, 602, 0, -2, 413, 426, 0, - 175, 201, 202, 0, 0, 205, 206, 207, 198, 199, - 119, 0, 0, 689, 0, 1356, 1357, 126, 0, 0, - 1041, 1042, 1043, 1044, 1045, 0, 0, 0, 1075, 1054, - 601, 0, 0, 368, 0, 611, 414, 415, 0, 421, - 422, 423, 424, 203, 204, 623, 0, 0, 568, 1266, - 0, 1204, 0, 1210, 0, 1215, 0, 603, 604, 612, - 0, 416, 0, 417, 0, 0, 0, 592, 0, 623, - 1354, 1051, 0, 0, 1073, 0, 613, 609, 427, 429, - 430, 0, 0, 428, 624, 593, 1205, 1211, 0, 431, - 432, 433, 605, 606, 607, 608, + 0, 348, 351, 0, 0, 0, 588, 0, 908, 600, + 591, 0, 678, 0, 682, 0, 0, 0, 685, 686, + 687, 664, 0, 668, 412, 652, 649, 650, 523, 0, + 127, 128, 0, 0, 0, 1265, 0, 1268, 1102, 1104, + 0, 1131, 1132, 1133, 1273, 1274, 1147, 1160, 1165, 0, + 1168, 0, 0, 1169, 0, 619, 1049, 0, 0, 1067, + 1068, 0, 1203, 0, 1208, 1209, 0, 1214, 0, 1218, + 1229, 0, 956, 913, 914, 961, 962, 0, 0, 904, + 1317, 81, 1318, 1315, 0, 1313, 1311, 1370, 0, 1379, + 1380, 1389, 1390, 1396, 0, 1402, 0, 86, 0, 0, + 0, 1328, 181, 0, 200, 0, 596, 0, 599, 589, + 676, 677, 0, 689, 681, 683, 684, 666, -2, 1354, + 0, 0, 0, 572, 1266, 0, 0, 1170, 0, 615, + 616, 1057, 1050, 0, 1035, 1036, 1054, 1189, 1191, 0, + 0, 0, 0, 955, 957, 958, 80, 0, 1314, 1075, + 0, 1382, 1383, 1410, 1408, 924, 931, 0, 87, 425, + 418, 1354, 0, 0, 0, 669, 670, 671, 672, 673, + 674, 675, 562, 1356, 129, 130, 0, 492, 493, 494, + 123, 0, 1108, 1166, 1051, 0, 0, 0, 0, 1047, + 1048, 0, 1204, 0, 1210, 0, 1215, 0, 915, 916, + 1316, 0, 0, 601, 0, 603, 0, -2, 413, 426, + 0, 175, 201, 202, 0, 0, 205, 206, 207, 198, + 199, 119, 0, 0, 690, 0, 1357, 1358, 0, 126, + 0, 0, 1042, 1043, 1044, 1045, 1046, 0, 0, 0, + 1076, 1055, 602, 0, 0, 368, 0, 612, 414, 415, + 0, 421, 422, 423, 424, 203, 204, 624, 0, 0, + 491, 569, 1267, 0, 1205, 0, 1211, 0, 1216, 0, + 604, 605, 613, 0, 416, 0, 417, 0, 0, 0, + 593, 0, 624, 1355, 1052, 0, 0, 1074, 0, 614, + 610, 427, 429, 430, 0, 0, 428, 625, 594, 1206, + 1212, 0, 431, 432, 433, 606, 607, 608, 609, } var yyTok1 = [...]int{ @@ -12279,158 +12212,157 @@ yydefault: yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 491: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2792 { - yyVAL.str = yyDollar[1].identifierCI.String() + yyVAL.str = String(TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}) } case 492: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:2796 { - yyVAL.str = encodeSQLString(yyDollar[1].str) + yyVAL.str = yyDollar[1].identifierCI.String() } case 493: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:2800 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = encodeSQLString(yyDollar[1].str) } case 494: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2804 + { + yyVAL.str = string(yyDollar[1].str) + } + case 495: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2805 +//line sql.y:2809 { yyVAL.str = "" } - case 496: + case 497: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2811 +//line sql.y:2815 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 497: + case 498: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2815 +//line sql.y:2819 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 498: + case 499: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2820 +//line sql.y:2824 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 499: + case 500: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2824 +//line sql.y:2828 { yyLOCAL = yyDollar[2].colNameUnion() } yyVAL.union = yyLOCAL - case 500: + case 501: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2829 +//line sql.y:2833 { yyVAL.str = "" } - case 501: + case 502: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2833 +//line sql.y:2837 { yyVAL.str = string(yyDollar[2].str) } - case 502: + case 503: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2838 +//line sql.y:2842 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 503: + case 504: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2842 +//line sql.y:2846 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 504: + case 505: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2846 +//line sql.y:2850 { yyLOCAL = NewDecimalLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 505: + case 506: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2851 +//line sql.y:2855 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 506: + case 507: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2855 +//line sql.y:2859 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 507: + case 508: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2859 +//line sql.y:2863 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) } - case 508: + case 509: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2863 +//line sql.y:2867 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 509: + case 510: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2867 +//line sql.y:2871 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) } - case 510: + case 511: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2871 +//line sql.y:2875 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } yyVAL.union = yyLOCAL - case 511: + case 512: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2877 +//line sql.y:2881 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 512: - yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2881 - { - yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) - *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) - } case 513: yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2885 @@ -12439,19 +12371,18 @@ yydefault: *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } case 514: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:2891 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:2889 { - yyLOCAL = yyDollar[1].tableOptionsUnion() + yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) + *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - yyVAL.union = yyLOCAL case 515: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption //line sql.y:2895 { - yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} + yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL case 516: @@ -12467,15 +12398,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2903 { - yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} + yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } yyVAL.union = yyLOCAL case 518: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption //line sql.y:2907 { - yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} + yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } yyVAL.union = yyLOCAL case 519: @@ -12483,7 +12414,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2911 { - yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} + yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} } yyVAL.union = yyLOCAL case 520: @@ -12491,49 +12422,49 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2915 { - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} + yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL case 521: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption //line sql.y:2919 { - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion()} + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } yyVAL.union = yyLOCAL case 522: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption //line sql.y:2923 { - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL case 523: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption //line sql.y:2927 { - val := false - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 524: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2932 +//line sql.y:2931 { - val := true + val := false yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} } yyVAL.union = yyLOCAL case 525: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2937 +//line sql.y:2936 { - yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} + val := true + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} } yyVAL.union = yyLOCAL case 526: @@ -12541,7 +12472,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2941 { - yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} + yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL case 527: @@ -12549,23 +12480,23 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2945 { - yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} + yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} } yyVAL.union = yyLOCAL case 528: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption //line sql.y:2949 { - yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} + yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} } yyVAL.union = yyLOCAL case 529: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption //line sql.y:2953 { - yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} + yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} } yyVAL.union = yyLOCAL case 530: @@ -12573,7 +12504,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2957 { - yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} + yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL case 531: @@ -12581,15 +12512,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2961 { - yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} + yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL case 532: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption //line sql.y:2965 { - yyLOCAL = &KeyState{Enable: false} + yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } yyVAL.union = yyLOCAL case 533: @@ -12597,7 +12528,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2969 { - yyLOCAL = &KeyState{Enable: true} + yyLOCAL = &KeyState{Enable: false} } yyVAL.union = yyLOCAL case 534: @@ -12605,7 +12536,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2973 { - yyLOCAL = &TablespaceOperation{Import: false} + yyLOCAL = &KeyState{Enable: true} } yyVAL.union = yyLOCAL case 535: @@ -12613,15 +12544,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2977 { - yyLOCAL = &TablespaceOperation{Import: true} + yyLOCAL = &TablespaceOperation{Import: false} } yyVAL.union = yyLOCAL case 536: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption //line sql.y:2981 { - yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} + yyLOCAL = &TablespaceOperation{Import: true} } yyVAL.union = yyLOCAL case 537: @@ -12629,7 +12560,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2985 { - yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} + yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL case 538: @@ -12637,23 +12568,23 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2989 { - yyLOCAL = &DropKey{Type: PrimaryKeyType} + yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL case 539: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:2993 { - yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} + yyLOCAL = &DropKey{Type: PrimaryKeyType} } yyVAL.union = yyLOCAL case 540: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption //line sql.y:2997 { - yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} + yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL case 541: @@ -12665,52 +12596,52 @@ yydefault: } yyVAL.union = yyLOCAL case 542: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3005 { - yyLOCAL = &Force{} + yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL case 543: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption //line sql.y:3009 { - yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} + yyLOCAL = &Force{} } yyVAL.union = yyLOCAL case 544: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3013 { - yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} + yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL case 545: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL []AlterOption -//line sql.y:3019 + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:3017 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} + yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL case 546: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL []AlterOption //line sql.y:3023 { - yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) - *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } + yyVAL.union = yyLOCAL case 547: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:3029 +//line sql.y:3027 { - yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) + yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) + *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - yyVAL.union = yyLOCAL case 548: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption @@ -12740,7 +12671,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3045 { - yyLOCAL = &LockOption{Type: DefaultType} + yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL case 552: @@ -12748,7 +12679,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3049 { - yyLOCAL = &LockOption{Type: NoneType} + yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL case 553: @@ -12756,7 +12687,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3053 { - yyLOCAL = &LockOption{Type: SharedType} + yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL case 554: @@ -12764,15 +12695,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3057 { - yyLOCAL = &LockOption{Type: ExclusiveType} + yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL case 555: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3061 { - yyLOCAL = &Validation{With: true} + yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL case 556: @@ -12780,13 +12711,21 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3065 { - yyLOCAL = &Validation{With: false} + yyLOCAL = &Validation{With: true} } yyVAL.union = yyLOCAL case 557: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:3069 + { + yyLOCAL = &Validation{With: false} + } + yyVAL.union = yyLOCAL + case 558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3071 +//line sql.y:3075 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12794,10 +12733,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 558: + case 559: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3078 +//line sql.y:3082 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12805,10 +12744,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 559: + case 560: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3085 +//line sql.y:3089 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12816,28 +12755,28 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 560: + case 561: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3092 +//line sql.y:3096 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 561: + case 562: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:3098 +//line sql.y:3102 { yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName.ToViewName(), Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].selStmtUnion(), CheckOption: yyDollar[11].str} } yyVAL.union = yyLOCAL - case 562: + case 563: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3108 +//line sql.y:3112 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -12845,10 +12784,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 563: + case 564: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3115 +//line sql.y:3119 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -12856,10 +12795,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 564: + case 565: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3122 +//line sql.y:3126 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -12872,10 +12811,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 565: + case 566: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3134 +//line sql.y:3138 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -12886,26 +12825,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 566: + case 567: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3144 +//line sql.y:3148 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 567: + case 568: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3148 +//line sql.y:3152 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 568: + case 569: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:3152 +//line sql.y:3156 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -12919,10 +12858,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 569: + case 570: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3165 +//line sql.y:3169 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -12933,18 +12872,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 570: + case 571: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3175 +//line sql.y:3179 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 571: + case 572: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:3179 +//line sql.y:3183 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -12956,10 +12895,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 572: + case 573: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3190 +//line sql.y:3194 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -12967,10 +12906,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 573: + case 574: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3197 +//line sql.y:3201 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -12978,10 +12917,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 574: + case 575: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3204 +//line sql.y:3208 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -12989,10 +12928,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 575: + case 576: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3211 +//line sql.y:3215 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -13001,20 +12940,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 576: + case 577: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3219 +//line sql.y:3223 { yyLOCAL = &AlterMigration{ Type: LaunchAllMigrationType, } } yyVAL.union = yyLOCAL - case 577: + case 578: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3225 +//line sql.y:3229 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -13022,20 +12961,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 578: + case 579: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3232 +//line sql.y:3236 { yyLOCAL = &AlterMigration{ Type: CompleteAllMigrationType, } } yyVAL.union = yyLOCAL - case 579: + case 580: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3238 +//line sql.y:3242 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -13043,20 +12982,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 580: + case 581: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3245 +//line sql.y:3249 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, } } yyVAL.union = yyLOCAL - case 581: + case 582: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3251 +//line sql.y:3255 { yyLOCAL = &AlterMigration{ Type: ThrottleMigrationType, @@ -13066,10 +13005,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 582: + case 583: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3260 +//line sql.y:3264 { yyLOCAL = &AlterMigration{ Type: ThrottleAllMigrationType, @@ -13078,10 +13017,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 583: + case 584: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3268 +//line sql.y:3272 { yyLOCAL = &AlterMigration{ Type: UnthrottleMigrationType, @@ -13089,28 +13028,28 @@ yydefault: } } yyVAL.union = yyLOCAL - case 584: + case 585: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3275 +//line sql.y:3279 { yyLOCAL = &AlterMigration{ Type: UnthrottleAllMigrationType, } } yyVAL.union = yyLOCAL - case 585: + case 586: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3282 +//line sql.y:3286 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 586: + case 587: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3286 +//line sql.y:3290 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -13118,10 +13057,10 @@ yydefault: yyLOCAL = yyDollar[3].partitionOptionUnion() } yyVAL.union = yyLOCAL - case 587: + case 588: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3295 +//line sql.y:3299 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -13130,10 +13069,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 588: + case 589: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3303 +//line sql.y:3307 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -13143,10 +13082,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 589: + case 590: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3312 +//line sql.y:3316 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -13154,10 +13093,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 590: + case 591: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3319 +//line sql.y:3323 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -13165,18 +13104,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 591: + case 592: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3327 +//line sql.y:3331 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 592: + case 593: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3331 +//line sql.y:3335 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -13186,10 +13125,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 593: + case 594: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3340 +//line sql.y:3344 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -13200,292 +13139,284 @@ yydefault: } } yyVAL.union = yyLOCAL - case 594: + case 595: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3351 +//line sql.y:3355 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 595: + case 596: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3355 +//line sql.y:3359 { yyLOCAL = yyDollar[2].partDefsUnion() } yyVAL.union = yyLOCAL - case 596: + case 597: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3360 +//line sql.y:3364 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 597: + case 598: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3364 +//line sql.y:3368 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 598: + case 599: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3369 +//line sql.y:3373 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 599: + case 600: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3373 +//line sql.y:3377 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 600: + case 601: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:3379 +//line sql.y:3383 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].identifierCS} } yyVAL.union = yyLOCAL - case 601: + case 602: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3385 +//line sql.y:3389 { yyLOCAL = yyDollar[3].jtColumnListUnion() } yyVAL.union = yyLOCAL - case 602: + case 603: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3391 +//line sql.y:3395 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL - case 603: + case 604: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3395 +//line sql.y:3399 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) } - case 604: + case 605: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3401 +//line sql.y:3405 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].identifierCI}} } yyVAL.union = yyLOCAL - case 605: + case 606: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3405 +//line sql.y:3409 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 606: + case 607: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3411 +//line sql.y:3415 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 607: + case 608: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3417 +//line sql.y:3421 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 608: + case 609: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3423 +//line sql.y:3427 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 609: + case 610: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3429 +//line sql.y:3433 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} } yyVAL.union = yyLOCAL - case 610: + case 611: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3435 +//line sql.y:3439 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 611: + case 612: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3439 +//line sql.y:3443 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 612: + case 613: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3443 +//line sql.y:3447 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 613: + case 614: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3447 +//line sql.y:3451 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 614: + case 615: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3453 +//line sql.y:3457 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 615: + case 616: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3459 +//line sql.y:3463 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 616: + case 617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3465 +//line sql.y:3469 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } yyVAL.union = yyLOCAL - case 617: + case 618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3469 +//line sql.y:3473 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } yyVAL.union = yyLOCAL - case 618: + case 619: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3473 +//line sql.y:3477 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 619: + case 620: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3479 +//line sql.y:3483 { yyLOCAL = RangeType } yyVAL.union = yyLOCAL - case 620: + case 621: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3483 +//line sql.y:3487 { yyLOCAL = ListType } yyVAL.union = yyLOCAL - case 621: + case 622: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3488 +//line sql.y:3492 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 622: + case 623: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3492 +//line sql.y:3496 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 623: + case 624: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3497 +//line sql.y:3501 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 624: + case 625: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3501 +//line sql.y:3505 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 625: - yyDollar = yyS[yypt-5 : yypt+1] - var yyLOCAL *PartitionSpec -//line sql.y:3507 - { - yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} - } - yyVAL.union = yyLOCAL case 626: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3511 { - yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } yyVAL.union = yyLOCAL case 627: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3515 { - yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} + yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 628: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3519 { - yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } yyVAL.union = yyLOCAL case 629: @@ -13493,7 +13424,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3523 { - yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 630: @@ -13501,7 +13432,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3527 { - yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } yyVAL.union = yyLOCAL case 631: @@ -13509,15 +13440,15 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3531 { - yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 632: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3535 { - yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } yyVAL.union = yyLOCAL case 633: @@ -13525,7 +13456,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3539 { - yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 634: @@ -13533,23 +13464,23 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3543 { - yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} + yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } yyVAL.union = yyLOCAL case 635: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3547 { - yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} + yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL case 636: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3551 { - yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} } yyVAL.union = yyLOCAL case 637: @@ -13557,7 +13488,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3555 { - yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 638: @@ -13565,7 +13496,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3559 { - yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } yyVAL.union = yyLOCAL case 639: @@ -13573,7 +13504,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3563 { - yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 640: @@ -13581,7 +13512,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3567 { - yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } yyVAL.union = yyLOCAL case 641: @@ -13589,7 +13520,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3571 { - yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 642: @@ -13597,7 +13528,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3575 { - yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } yyVAL.union = yyLOCAL case 643: @@ -13605,7 +13536,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3579 { - yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 644: @@ -13613,7 +13544,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3583 { - yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } yyVAL.union = yyLOCAL case 645: @@ -13621,27 +13552,27 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3587 { - yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 646: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3591 { - yyLOCAL = &PartitionSpec{Action: UpgradeAction} + yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } yyVAL.union = yyLOCAL case 647: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL bool -//line sql.y:3596 + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionSpec +//line sql.y:3595 { - yyLOCAL = false + yyLOCAL = &PartitionSpec{Action: UpgradeAction} } yyVAL.union = yyLOCAL case 648: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool //line sql.y:3600 { @@ -13653,229 +13584,237 @@ yydefault: var yyLOCAL bool //line sql.y:3604 { - yyLOCAL = true + yyLOCAL = false } yyVAL.union = yyLOCAL case 650: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL bool +//line sql.y:3608 + { + yyLOCAL = true + } + yyVAL.union = yyLOCAL + case 651: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3610 +//line sql.y:3614 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL - case 651: + case 652: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3614 +//line sql.y:3618 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } - case 652: + case 653: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3620 +//line sql.y:3624 { yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } - case 653: + case 654: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3625 +//line sql.y:3629 { yyLOCAL = &PartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 654: + case 655: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3629 +//line sql.y:3633 { yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 655: + case 656: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3634 +//line sql.y:3638 { yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 656: + case 657: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3639 +//line sql.y:3643 { yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 657: + case 658: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3644 +//line sql.y:3648 { yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 658: + case 659: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3649 +//line sql.y:3653 { yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 659: + case 660: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3654 +//line sql.y:3658 { val := yyDollar[2].integerUnion() yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = &val yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 660: + case 661: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3660 +//line sql.y:3664 { val := yyDollar[2].integerUnion() yyDollar[1].partitionDefinitionOptionsUnion().MinRows = &val yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 661: + case 662: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3666 +//line sql.y:3670 { yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 662: + case 663: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3671 +//line sql.y:3675 { yyDollar[1].partitionDefinitionOptionsUnion().SubPartitionDefinitions = yyDollar[2].subPartitionDefinitionsUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 663: + case 664: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3677 +//line sql.y:3681 { yyLOCAL = yyDollar[2].subPartitionDefinitionsUnion() } yyVAL.union = yyLOCAL - case 664: + case 665: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3683 +//line sql.y:3687 { yyLOCAL = SubPartitionDefinitions{yyDollar[1].subPartitionDefinitionUnion()} } yyVAL.union = yyLOCAL - case 665: + case 666: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3687 +//line sql.y:3691 { yySLICE := (*SubPartitionDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].subPartitionDefinitionUnion()) } - case 666: + case 667: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SubPartitionDefinition -//line sql.y:3693 +//line sql.y:3697 { yyLOCAL = &SubPartitionDefinition{Name: yyDollar[2].identifierCI, Options: yyDollar[3].subPartitionDefinitionOptionsUnion()} } yyVAL.union = yyLOCAL - case 667: + case 668: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3698 +//line sql.y:3702 { yyLOCAL = &SubPartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 668: + case 669: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3702 +//line sql.y:3706 { yyDollar[1].subPartitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 669: + case 670: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3707 +//line sql.y:3711 { yyDollar[1].subPartitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 670: + case 671: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3712 +//line sql.y:3716 { yyDollar[1].subPartitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 671: + case 672: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3717 +//line sql.y:3721 { yyDollar[1].subPartitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 672: + case 673: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3722 +//line sql.y:3726 { val := yyDollar[2].integerUnion() yyDollar[1].subPartitionDefinitionOptionsUnion().MaxRows = &val yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 673: + case 674: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3728 +//line sql.y:3732 { val := yyDollar[2].integerUnion() yyDollar[1].subPartitionDefinitionOptionsUnion().MinRows = &val yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 674: + case 675: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3734 +//line sql.y:3738 { yyDollar[1].subPartitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 675: + case 676: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3741 +//line sql.y:3745 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -13883,10 +13822,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 676: + case 677: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3748 +//line sql.y:3752 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -13894,10 +13833,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 677: + case 678: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3755 +//line sql.y:3759 { yyLOCAL = &PartitionValueRange{ Type: InType, @@ -13905,131 +13844,131 @@ yydefault: } } yyVAL.union = yyLOCAL - case 678: + case 679: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3763 +//line sql.y:3767 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 679: + case 680: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3767 +//line sql.y:3771 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 680: + case 681: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionEngine -//line sql.y:3773 +//line sql.y:3777 { yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].identifierCS.String()} } yyVAL.union = yyLOCAL - case 681: + case 682: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:3779 +//line sql.y:3783 { yyLOCAL = NewStrLiteral(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 682: + case 683: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3785 +//line sql.y:3789 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 683: + case 684: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3791 +//line sql.y:3795 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 684: + case 685: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3797 +//line sql.y:3801 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 685: + case 686: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3803 +//line sql.y:3807 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 686: + case 687: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3809 +//line sql.y:3813 { yyVAL.str = yyDollar[3].identifierCS.String() } - case 687: + case 688: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3815 +//line sql.y:3819 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 688: + case 689: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3821 +//line sql.y:3825 { yyVAL.str = "" } - case 689: + case 690: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3825 +//line sql.y:3829 { yyVAL.str = "" } - case 690: + case 691: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3831 +//line sql.y:3835 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } yyVAL.union = yyLOCAL - case 691: + case 692: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3837 +//line sql.y:3841 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL - case 692: + case 693: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3841 +//line sql.y:3845 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) } - case 693: + case 694: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3847 +//line sql.y:3851 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } yyVAL.union = yyLOCAL - case 694: + case 695: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3851 +//line sql.y:3855 { // Change this to an alter statement if yyDollar[4].identifierCI.Lowered() == "primary" { @@ -14039,52 +13978,44 @@ yydefault: } } yyVAL.union = yyLOCAL - case 695: + case 696: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3860 +//line sql.y:3864 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 696: + case 697: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3864 +//line sql.y:3868 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 697: + case 698: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3870 +//line sql.y:3874 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 698: + case 699: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3874 +//line sql.y:3878 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 699: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL Statement -//line sql.y:3880 - { - yyLOCAL = &OtherRead{} - } - yyVAL.union = yyLOCAL case 700: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3886 +//line sql.y:3884 { - yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &OtherRead{} } yyVAL.union = yyLOCAL case 701: @@ -14092,23 +14023,23 @@ yydefault: var yyLOCAL Statement //line sql.y:3890 { - yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 702: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:3894 { - yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 703: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement //line sql.y:3898 { - yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL case 704: @@ -14124,7 +14055,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3906 { - yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 706: @@ -14136,43 +14067,43 @@ yydefault: } yyVAL.union = yyLOCAL case 707: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:3914 { - yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 708: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:3918 { - yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 709: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement //line sql.y:3922 { - yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL case 710: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:3926 { - yyLOCAL = &Show{&ShowBasic{Command: Privilege}} + yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL case 711: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:3930 { - yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } yyVAL.union = yyLOCAL case 712: @@ -14180,7 +14111,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3934 { - yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 713: @@ -14188,7 +14119,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3938 { - yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 714: @@ -14196,7 +14127,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3942 { - yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 715: @@ -14204,15 +14135,15 @@ yydefault: var yyLOCAL Statement //line sql.y:3946 { - yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 716: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:3950 { - yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 717: @@ -14220,15 +14151,15 @@ yydefault: var yyLOCAL Statement //line sql.y:3954 { - yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL case 718: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:3958 { - yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL case 719: @@ -14236,7 +14167,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3962 { - yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 720: @@ -14244,7 +14175,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3966 { - yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 721: @@ -14252,7 +14183,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3970 { - yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 722: @@ -14260,7 +14191,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3974 { - yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 723: @@ -14268,7 +14199,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3978 { - yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 724: @@ -14276,7 +14207,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3982 { - yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 725: @@ -14284,15 +14215,15 @@ yydefault: var yyLOCAL Statement //line sql.y:3986 { - yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 726: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:3990 { - yyLOCAL = &Show{&ShowBasic{Command: Engines}} + yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 727: @@ -14300,15 +14231,15 @@ yydefault: var yyLOCAL Statement //line sql.y:3994 { - yyLOCAL = &Show{&ShowBasic{Command: Plugins}} + yyLOCAL = &Show{&ShowBasic{Command: Engines}} } yyVAL.union = yyLOCAL case 728: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:3998 { - yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} + yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } yyVAL.union = yyLOCAL case 729: @@ -14316,7 +14247,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4002 { - yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} + yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL case 730: @@ -14324,7 +14255,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4006 { - yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL case 731: @@ -14332,7 +14263,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4010 { - yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} + yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 732: @@ -14340,23 +14271,23 @@ yydefault: var yyLOCAL Statement //line sql.y:4014 { - yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} + yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL case 733: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4018 { - yyLOCAL = &ShowThrottledApps{} + yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL case 734: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4022 { - yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &ShowThrottledApps{} } yyVAL.union = yyLOCAL case 735: @@ -14364,7 +14295,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4026 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} + yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 736: @@ -14372,31 +14303,31 @@ yydefault: var yyLOCAL Statement //line sql.y:4030 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } yyVAL.union = yyLOCAL case 737: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4034 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } yyVAL.union = yyLOCAL case 738: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4038 { - yyLOCAL = &Show{&ShowBasic{Command: Warnings}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } yyVAL.union = yyLOCAL case 739: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4042 { - yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } yyVAL.union = yyLOCAL case 740: @@ -14404,31 +14335,31 @@ yydefault: var yyLOCAL Statement //line sql.y:4046 { - yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 741: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4050 { - yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} + yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 742: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4057 +//line sql.y:4054 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} + yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } yyVAL.union = yyLOCAL case 743: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4061 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} } yyVAL.union = yyLOCAL case 744: @@ -14436,7 +14367,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4065 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 745: @@ -14444,23 +14375,23 @@ yydefault: var yyLOCAL Statement //line sql.y:4069 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} } yyVAL.union = yyLOCAL case 746: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4073 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 747: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4077 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL case 748: @@ -14472,127 +14403,129 @@ yydefault: } yyVAL.union = yyLOCAL case 749: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4085 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL case 750: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4089 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 751: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL Statement +//line sql.y:4093 + { + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + } + yyVAL.union = yyLOCAL + case 752: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4095 +//line sql.y:4099 { yyVAL.str = "" } - case 752: + case 753: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4099 +//line sql.y:4103 { yyVAL.str = "extended " } - case 753: + case 754: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4105 +//line sql.y:4109 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 754: + case 755: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4109 +//line sql.y:4113 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 755: + case 756: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4115 +//line sql.y:4119 { yyVAL.str = string(yyDollar[1].str) } - case 756: + case 757: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4119 +//line sql.y:4123 { yyVAL.str = string(yyDollar[1].str) } - case 757: + case 758: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4125 +//line sql.y:4129 { yyVAL.identifierCS = NewIdentifierCS("") } - case 758: + case 759: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4129 +//line sql.y:4133 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 759: + case 760: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4133 +//line sql.y:4137 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 760: + case 761: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4139 +//line sql.y:4143 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 761: + case 762: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4143 +//line sql.y:4147 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 762: + case 763: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4147 +//line sql.y:4151 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 763: + case 764: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4153 +//line sql.y:4157 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 764: + case 765: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4157 +//line sql.y:4161 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 765: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4163 - { - yyVAL.empty = struct{}{} - } case 766: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4167 { yyVAL.empty = struct{}{} @@ -14605,9 +14538,9 @@ yydefault: } case 768: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4177 +//line sql.y:4175 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.empty = struct{}{} } case 769: yyDollar = yyS[yypt-1 : yypt+1] @@ -14616,147 +14549,145 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 770: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4185 + { + yyVAL.str = string(yyDollar[1].str) + } + case 771: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4187 +//line sql.y:4191 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 771: + case 772: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4191 +//line sql.y:4195 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } yyVAL.union = yyLOCAL - case 772: + case 773: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4195 +//line sql.y:4199 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL - case 773: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4202 - { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) - } case 774: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4206 { - yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 775: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4210 { - yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } case 776: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4214 { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } case 777: yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4218 + { + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + } + case 778: + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4221 +//line sql.y:4225 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 778: + case 779: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4225 +//line sql.y:4229 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 779: + case 780: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4231 +//line sql.y:4235 { yyLOCAL = &Commit{} } yyVAL.union = yyLOCAL - case 780: + case 781: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4237 +//line sql.y:4241 { yyLOCAL = &Rollback{} } yyVAL.union = yyLOCAL - case 781: + case 782: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4241 +//line sql.y:4245 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 782: + case 783: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4246 +//line sql.y:4250 { yyVAL.empty = struct{}{} } - case 783: + case 784: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4248 +//line sql.y:4252 { yyVAL.empty = struct{}{} } - case 784: + case 785: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4251 +//line sql.y:4255 { yyVAL.empty = struct{}{} } - case 785: + case 786: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4253 +//line sql.y:4257 { yyVAL.empty = struct{}{} } - case 786: + case 787: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4257 +//line sql.y:4261 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 787: + case 788: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4263 +//line sql.y:4267 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 788: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL ExplainType -//line sql.y:4268 - { - yyLOCAL = EmptyType - } - yyVAL.union = yyLOCAL case 789: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType //line sql.y:4272 { - yyLOCAL = JSONType + yyLOCAL = EmptyType } yyVAL.union = yyLOCAL case 790: @@ -14764,7 +14695,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4276 { - yyLOCAL = TreeType + yyLOCAL = JSONType } yyVAL.union = yyLOCAL case 791: @@ -14772,7 +14703,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4280 { - yyLOCAL = VitessType + yyLOCAL = TreeType } yyVAL.union = yyLOCAL case 792: @@ -14780,7 +14711,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4284 { - yyLOCAL = VTExplainType + yyLOCAL = VitessType } yyVAL.union = yyLOCAL case 793: @@ -14788,23 +14719,25 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4288 { - yyLOCAL = TraditionalType + yyLOCAL = VTExplainType } yyVAL.union = yyLOCAL case 794: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType //line sql.y:4292 { - yyLOCAL = AnalyzeType + yyLOCAL = TraditionalType } yyVAL.union = yyLOCAL case 795: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4298 + var yyLOCAL ExplainType +//line sql.y:4296 { - yyVAL.str = yyDollar[1].str + yyLOCAL = AnalyzeType } + yyVAL.union = yyLOCAL case 796: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4302 @@ -14819,18 +14752,16 @@ yydefault: } case 798: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL Statement -//line sql.y:4312 +//line sql.y:4310 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyVAL.str = yyDollar[1].str } - yyVAL.union = yyLOCAL case 799: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement //line sql.y:4316 { - yyLOCAL = yyDollar[1].statementUnion() + yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL case 800: @@ -14850,200 +14781,202 @@ yydefault: } yyVAL.union = yyLOCAL case 802: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4329 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Statement +//line sql.y:4328 { - yyVAL.str = "" + yyLOCAL = yyDollar[1].statementUnion() } + yyVAL.union = yyLOCAL case 803: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4333 { - yyVAL.str = yyDollar[1].identifierCI.val + yyVAL.str = "" } case 804: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4337 { - yyVAL.str = encodeSQLString(yyDollar[1].str) + yyVAL.str = yyDollar[1].identifierCI.val } case 805: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4341 + { + yyVAL.str = encodeSQLString(yyDollar[1].str) + } + case 806: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4343 +//line sql.y:4347 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 806: + case 807: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4347 +//line sql.y:4351 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 807: + case 808: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4353 +//line sql.y:4357 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 808: + case 809: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4357 +//line sql.y:4361 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 809: + case 810: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4363 +//line sql.y:4367 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } yyVAL.union = yyLOCAL - case 810: + case 811: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4369 +//line sql.y:4373 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL - case 811: + case 812: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4373 +//line sql.y:4377 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) } - case 812: + case 813: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4379 +//line sql.y:4383 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } yyVAL.union = yyLOCAL - case 813: + case 814: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4385 +//line sql.y:4389 { yyLOCAL = Read } yyVAL.union = yyLOCAL - case 814: + case 815: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4389 +//line sql.y:4393 { yyLOCAL = ReadLocal } yyVAL.union = yyLOCAL - case 815: + case 816: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4393 +//line sql.y:4397 { yyLOCAL = Write } yyVAL.union = yyLOCAL - case 816: + case 817: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4397 +//line sql.y:4401 { yyLOCAL = LowPriorityWrite } yyVAL.union = yyLOCAL - case 817: + case 818: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4403 +//line sql.y:4407 { yyLOCAL = &UnlockTables{} } yyVAL.union = yyLOCAL - case 818: + case 819: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4409 +//line sql.y:4413 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 819: + case 820: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4415 +//line sql.y:4419 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } yyVAL.union = yyLOCAL - case 820: + case 821: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4419 +//line sql.y:4423 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } yyVAL.union = yyLOCAL - case 821: + case 822: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4423 +//line sql.y:4427 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 822: + case 823: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4427 +//line sql.y:4431 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 823: + case 824: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4431 +//line sql.y:4435 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 824: + case 825: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4435 +//line sql.y:4439 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL - case 825: + case 826: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4441 +//line sql.y:4445 { yyVAL.strs = []string{yyDollar[1].str} } - case 826: + case 827: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4445 +//line sql.y:4449 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 827: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4451 - { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) - } case 828: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4455 @@ -15063,10 +14996,10 @@ yydefault: yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 831: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4467 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 832: yyDollar = yyS[yypt-1 : yypt+1] @@ -15081,22 +15014,22 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 834: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4479 { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str + yyVAL.str = string(yyDollar[1].str) } case 835: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:4483 { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } case 836: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4487 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 837: yyDollar = yyS[yypt-1 : yypt+1] @@ -15111,144 +15044,150 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 839: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4499 + { + yyVAL.str = string(yyDollar[1].str) + } + case 840: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4500 +//line sql.y:4504 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 840: + case 841: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4504 +//line sql.y:4508 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 841: + case 842: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4508 +//line sql.y:4512 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 842: + case 843: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4513 +//line sql.y:4517 { yyVAL.str = "" } - case 843: + case 844: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4517 +//line sql.y:4521 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } - case 844: + case 845: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4522 +//line sql.y:4526 { setAllowComments(yylex, true) } - case 845: + case 846: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4526 +//line sql.y:4530 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } - case 846: + case 847: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4532 +//line sql.y:4536 { yyVAL.strs = nil } - case 847: + case 848: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4536 +//line sql.y:4540 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 848: + case 849: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4542 +//line sql.y:4546 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 849: + case 850: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4546 +//line sql.y:4550 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 850: + case 851: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4550 +//line sql.y:4554 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 851: + case 852: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4555 +//line sql.y:4559 { yyVAL.str = "" } - case 852: + case 853: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4559 +//line sql.y:4563 { yyVAL.str = SQLNoCacheStr } - case 853: + case 854: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4563 +//line sql.y:4567 { yyVAL.str = SQLCacheStr } - case 854: + case 855: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4568 +//line sql.y:4572 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 855: + case 856: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4572 +//line sql.y:4576 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 856: + case 857: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4576 +//line sql.y:4580 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 857: + case 858: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4582 +//line sql.y:4586 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 858: + case 859: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4586 +//line sql.y:4590 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -15257,109 +15196,103 @@ yydefault: } } yyVAL.union = yyLOCAL - case 859: + case 860: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4596 +//line sql.y:4600 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } yyVAL.union = yyLOCAL - case 860: + case 861: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4601 +//line sql.y:4605 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 861: + case 862: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4605 +//line sql.y:4609 { yyLOCAL = yyDollar[2].variablesUnion() } yyVAL.union = yyLOCAL - case 862: + case 863: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4611 +//line sql.y:4615 { yyLOCAL = &DeallocateStmt{Type: DeallocateType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 863: + case 864: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4615 +//line sql.y:4619 { yyLOCAL = &DeallocateStmt{Type: DropType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 864: + case 865: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4620 +//line sql.y:4624 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 865: + case 866: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4624 +//line sql.y:4628 { yyLOCAL = yyDollar[1].selectExprsUnion() } yyVAL.union = yyLOCAL - case 866: + case 867: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4629 +//line sql.y:4633 { yyVAL.strs = nil } - case 867: + case 868: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4633 +//line sql.y:4637 { yyVAL.strs = []string{yyDollar[1].str} } - case 868: + case 869: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4637 +//line sql.y:4641 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } - case 869: + case 870: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4641 +//line sql.y:4645 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } - case 870: + case 871: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4645 +//line sql.y:4649 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } - case 871: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4651 - { - yyVAL.str = SQLNoCacheStr - } case 872: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4655 { - yyVAL.str = SQLCacheStr + yyVAL.str = SQLNoCacheStr } case 873: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4659 { - yyVAL.str = DistinctStr + yyVAL.str = SQLCacheStr } case 874: yyDollar = yyS[yypt-1 : yypt+1] @@ -15371,481 +15304,487 @@ yydefault: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4667 { - yyVAL.str = StraightJoinHint + yyVAL.str = DistinctStr } case 876: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4671 { - yyVAL.str = SQLCalcFoundRowsStr + yyVAL.str = StraightJoinHint } case 877: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4675 { - yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway + yyVAL.str = SQLCalcFoundRowsStr } case 878: yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4679 + { + yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway + } + case 879: + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4681 +//line sql.y:4685 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 879: + case 880: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4685 +//line sql.y:4689 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) } - case 880: + case 881: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4691 +//line sql.y:4695 { yyLOCAL = &StarExpr{} } yyVAL.union = yyLOCAL - case 881: + case 882: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4695 +//line sql.y:4699 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 882: + case 883: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4699 +//line sql.y:4703 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } yyVAL.union = yyLOCAL - case 883: + case 884: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4703 +//line sql.y:4707 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 884: + case 885: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4708 +//line sql.y:4712 { yyVAL.identifierCI = IdentifierCI{} } - case 885: + case 886: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4712 +//line sql.y:4716 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 886: + case 887: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4716 +//line sql.y:4720 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 888: + case 889: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4723 +//line sql.y:4727 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 889: + case 890: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4728 +//line sql.y:4732 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } yyVAL.union = yyLOCAL - case 890: + case 891: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4732 +//line sql.y:4736 { yyLOCAL = yyDollar[1].tableExprsUnion() } yyVAL.union = yyLOCAL - case 891: + case 892: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4738 +//line sql.y:4742 { yyLOCAL = yyDollar[2].tableExprsUnion() } yyVAL.union = yyLOCAL - case 892: + case 893: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4744 +//line sql.y:4748 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL - case 893: + case 894: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4748 +//line sql.y:4752 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) } - case 896: + case 897: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4758 +//line sql.y:4762 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } yyVAL.union = yyLOCAL - case 897: + case 898: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4762 +//line sql.y:4766 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 898: + case 899: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4766 +//line sql.y:4770 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } yyVAL.union = yyLOCAL - case 899: + case 900: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4770 +//line sql.y:4774 { yyLOCAL = yyDollar[1].tableExprUnion() } yyVAL.union = yyLOCAL - case 900: + case 901: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4776 +//line sql.y:4780 { yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 901: + case 902: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4780 +//line sql.y:4784 { yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].selStmtUnion()} } yyVAL.union = yyLOCAL - case 902: + case 903: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4786 +//line sql.y:4790 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 903: + case 904: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4790 +//line sql.y:4794 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 904: + case 905: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4795 +//line sql.y:4799 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 905: + case 906: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:4799 +//line sql.y:4803 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 906: + case 907: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4804 +//line sql.y:4808 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 907: + case 908: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4808 +//line sql.y:4812 { yyLOCAL = yyDollar[1].columnsUnion() } yyVAL.union = yyLOCAL - case 908: + case 909: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4814 +//line sql.y:4818 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 909: + case 910: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4818 +//line sql.y:4822 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 910: + case 911: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4824 +//line sql.y:4828 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL - case 911: + case 912: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4828 +//line sql.y:4832 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) } - case 912: + case 913: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4834 +//line sql.y:4838 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 913: + case 914: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4838 +//line sql.y:4842 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 914: + case 915: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4842 +//line sql.y:4846 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 915: + case 916: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4846 +//line sql.y:4850 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) } - case 916: + case 917: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:4852 +//line sql.y:4856 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 917: + case 918: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4856 +//line sql.y:4860 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 918: + case 919: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4869 +//line sql.y:4873 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 919: + case 920: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4873 +//line sql.y:4877 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 920: + case 921: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4877 +//line sql.y:4881 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 921: + case 922: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4881 +//line sql.y:4885 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL - case 922: + case 923: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4887 +//line sql.y:4891 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 923: + case 924: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4889 +//line sql.y:4893 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } - case 924: + case 925: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4893 +//line sql.y:4897 { yyVAL.joinCondition = &JoinCondition{} } - case 925: + case 926: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4895 +//line sql.y:4899 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 926: + case 927: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4899 +//line sql.y:4903 { yyVAL.joinCondition = &JoinCondition{} } - case 927: + case 928: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4901 +//line sql.y:4905 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 928: + case 929: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4904 +//line sql.y:4908 { yyVAL.empty = struct{}{} } - case 929: + case 930: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4906 +//line sql.y:4910 { yyVAL.empty = struct{}{} } - case 930: + case 931: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4909 +//line sql.y:4913 { yyVAL.identifierCS = NewIdentifierCS("") } - case 931: + case 932: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4913 +//line sql.y:4917 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 932: + case 933: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4917 +//line sql.y:4921 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 934: + case 935: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4924 +//line sql.y:4928 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 935: + case 936: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:4930 +//line sql.y:4934 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 936: + case 937: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4934 +//line sql.y:4938 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 937: + case 938: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4938 +//line sql.y:4942 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 938: + case 939: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:4944 +//line sql.y:4948 { yyLOCAL = StraightJoinType } yyVAL.union = yyLOCAL - case 939: + case 940: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4950 +//line sql.y:4954 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 940: + case 941: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:4954 +//line sql.y:4958 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 941: + case 942: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4958 +//line sql.y:4962 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 942: + case 943: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:4962 +//line sql.y:4966 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 943: + case 944: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4968 +//line sql.y:4972 { yyLOCAL = NaturalJoinType } yyVAL.union = yyLOCAL - case 944: + case 945: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4972 +//line sql.y:4976 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -15854,347 +15793,339 @@ yydefault: } } yyVAL.union = yyLOCAL - case 945: + case 946: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4982 +//line sql.y:4986 { yyVAL.tableName = yyDollar[2].tableName } - case 946: + case 947: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4986 +//line sql.y:4990 { yyVAL.tableName = yyDollar[1].tableName } - case 947: + case 948: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4992 +//line sql.y:4996 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 948: + case 949: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4996 +//line sql.y:5000 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } - case 949: + case 950: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5002 +//line sql.y:5006 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 950: + case 951: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5007 +//line sql.y:5011 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 951: + case 952: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5011 +//line sql.y:5015 { yyLOCAL = yyDollar[1].indexHintsUnion() } yyVAL.union = yyLOCAL - case 952: + case 953: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5017 +//line sql.y:5021 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 953: + case 954: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5021 +//line sql.y:5025 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) } - case 954: + case 955: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5027 +//line sql.y:5031 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 955: + case 956: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5031 +//line sql.y:5035 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } yyVAL.union = yyLOCAL - case 956: + case 957: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5035 +//line sql.y:5039 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 957: + case 958: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5039 +//line sql.y:5043 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 958: + case 959: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5044 +//line sql.y:5048 { yyLOCAL = NoForType } yyVAL.union = yyLOCAL - case 959: + case 960: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5048 +//line sql.y:5052 { yyLOCAL = JoinForType } yyVAL.union = yyLOCAL - case 960: + case 961: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5052 +//line sql.y:5056 { yyLOCAL = OrderByForType } yyVAL.union = yyLOCAL - case 961: + case 962: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5056 +//line sql.y:5060 { yyLOCAL = GroupByForType } yyVAL.union = yyLOCAL - case 962: + case 963: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5062 +//line sql.y:5066 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 963: + case 964: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5066 +//line sql.y:5070 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 964: + case 965: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5073 +//line sql.y:5077 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 965: + case 966: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5077 +//line sql.y:5081 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 966: + case 967: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5081 +//line sql.y:5085 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 967: + case 968: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5085 +//line sql.y:5089 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 968: + case 969: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5089 +//line sql.y:5093 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } yyVAL.union = yyLOCAL - case 969: + case 970: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5093 +//line sql.y:5097 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 970: + case 971: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5097 +//line sql.y:5101 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 971: + case 972: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5103 +//line sql.y:5107 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } yyVAL.union = yyLOCAL - case 972: + case 973: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5107 +//line sql.y:5111 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } yyVAL.union = yyLOCAL - case 973: + case 974: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5111 +//line sql.y:5115 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 974: + case 975: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5115 +//line sql.y:5119 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 975: + case 976: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5121 +//line sql.y:5125 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } yyVAL.union = yyLOCAL - case 976: + case 977: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5125 +//line sql.y:5129 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } yyVAL.union = yyLOCAL - case 977: + case 978: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5129 +//line sql.y:5133 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 978: + case 979: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5133 +//line sql.y:5137 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 979: + case 980: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5137 +//line sql.y:5141 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 980: + case 981: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5141 +//line sql.y:5145 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 981: + case 982: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5145 +//line sql.y:5149 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 982: + case 983: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5149 +//line sql.y:5153 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 983: + case 984: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5153 +//line sql.y:5157 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 984: + case 985: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5157 +//line sql.y:5161 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 985: + case 986: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5161 +//line sql.y:5165 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 986: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5167 - { - } case 987: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5170 +//line sql.y:5171 { } case 988: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL Expr -//line sql.y:5176 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:5174 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } - yyVAL.union = yyLOCAL case 989: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5180 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 990: @@ -16202,7 +16133,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5184 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 991: @@ -16210,7 +16141,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5188 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 992: @@ -16218,7 +16149,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5192 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 993: @@ -16226,7 +16157,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5196 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 994: @@ -16234,7 +16165,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5200 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 995: @@ -16242,7 +16173,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5204 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 996: @@ -16250,7 +16181,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5208 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 997: @@ -16258,7 +16189,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5212 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 998: @@ -16266,7 +16197,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5216 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 999: @@ -16274,21 +16205,21 @@ yydefault: var yyLOCAL Expr //line sql.y:5220 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1000: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5224 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1001: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5230 +//line sql.y:5228 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16318,19 +16249,19 @@ yydefault: } yyVAL.union = yyLOCAL case 1005: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5246 { - yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1006: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5250 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL case 1007: @@ -16346,15 +16277,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5258 { - yyLOCAL = yyDollar[1].variableUnion() + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1009: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5262 { - yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? + yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL case 1010: @@ -16362,7 +16293,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5266 { - yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } yyVAL.union = yyLOCAL case 1011: @@ -16370,7 +16301,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5270 { - yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1012: @@ -16378,15 +16309,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5274 { - yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1013: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5278 { - yyLOCAL = yyDollar[1].subqueryUnion() + yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1014: @@ -16394,23 +16325,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5282 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL case 1015: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5286 { - yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1016: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5290 { - yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} + yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } yyVAL.union = yyLOCAL case 1017: @@ -16418,15 +16349,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5294 { - yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} + yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } yyVAL.union = yyLOCAL case 1018: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:5298 { - yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} + yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } yyVAL.union = yyLOCAL case 1019: @@ -16434,13 +16365,21 @@ yydefault: var yyLOCAL Expr //line sql.y:5302 { - yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} + yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1020: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5306 + { + yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} + } + yyVAL.union = yyLOCAL + case 1021: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL Expr +//line sql.y:5310 { // From: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#operator_binary // To convert a string expression to a binary string, these constructs are equivalent: @@ -16449,18 +16388,18 @@ yydefault: yyLOCAL = &ConvertExpr{Expr: yyDollar[2].exprUnion(), Type: &ConvertType{Type: yyDollar[1].str}} } yyVAL.union = yyLOCAL - case 1021: + case 1022: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5314 +//line sql.y:5318 { yyLOCAL = &Default{ColName: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1022: + case 1023: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5318 +//line sql.y:5322 { // INTERVAL can trigger a shift / reduce conflict. We want // to shift here for the interval rule. In case we do have @@ -16469,83 +16408,75 @@ yydefault: yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1023: + case 1024: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5326 +//line sql.y:5330 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1024: + case 1025: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5330 +//line sql.y:5334 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1025: + case 1026: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5334 +//line sql.y:5338 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONUnquoteExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1026: + case 1027: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5340 +//line sql.y:5344 { yyLOCAL = &IntervalExpr{Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].identifierCI.String()} } yyVAL.union = yyLOCAL - case 1027: + case 1028: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5346 +//line sql.y:5350 { yyLOCAL = yyDollar[1].colNamesUnion() } yyVAL.union = yyLOCAL - case 1028: + case 1029: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5350 +//line sql.y:5354 { yyLOCAL = yyDollar[2].colNamesUnion() } yyVAL.union = yyLOCAL - case 1029: + case 1030: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5356 +//line sql.y:5360 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL - case 1030: + case 1031: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5360 +//line sql.y:5364 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) } - case 1031: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL TrimType -//line sql.y:5366 - { - yyLOCAL = BothTrimType - } - yyVAL.union = yyLOCAL case 1032: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType //line sql.y:5370 { - yyLOCAL = LeadingTrimType + yyLOCAL = BothTrimType } yyVAL.union = yyLOCAL case 1033: @@ -16553,15 +16484,15 @@ yydefault: var yyLOCAL TrimType //line sql.y:5374 { - yyLOCAL = TrailingTrimType + yyLOCAL = LeadingTrimType } yyVAL.union = yyLOCAL case 1034: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL FrameUnitType -//line sql.y:5380 + var yyLOCAL TrimType +//line sql.y:5378 { - yyLOCAL = FrameRowsType + yyLOCAL = TrailingTrimType } yyVAL.union = yyLOCAL case 1035: @@ -16569,15 +16500,15 @@ yydefault: var yyLOCAL FrameUnitType //line sql.y:5384 { - yyLOCAL = FrameRangeType + yyLOCAL = FrameRowsType } yyVAL.union = yyLOCAL case 1036: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5391 + var yyLOCAL FrameUnitType +//line sql.y:5388 { - yyLOCAL = CumeDistExprType + yyLOCAL = FrameRangeType } yyVAL.union = yyLOCAL case 1037: @@ -16585,7 +16516,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5395 { - yyLOCAL = DenseRankExprType + yyLOCAL = CumeDistExprType } yyVAL.union = yyLOCAL case 1038: @@ -16593,7 +16524,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5399 { - yyLOCAL = PercentRankExprType + yyLOCAL = DenseRankExprType } yyVAL.union = yyLOCAL case 1039: @@ -16601,7 +16532,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5403 { - yyLOCAL = RankExprType + yyLOCAL = PercentRankExprType } yyVAL.union = yyLOCAL case 1040: @@ -16609,15 +16540,15 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5407 { - yyLOCAL = RowNumberExprType + yyLOCAL = RankExprType } yyVAL.union = yyLOCAL case 1041: - yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL *FramePoint -//line sql.y:5413 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ArgumentLessWindowExprType +//line sql.y:5411 { - yyLOCAL = &FramePoint{Type: CurrentRowType} + yyLOCAL = RowNumberExprType } yyVAL.union = yyLOCAL case 1042: @@ -16625,7 +16556,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5417 { - yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} + yyLOCAL = &FramePoint{Type: CurrentRowType} } yyVAL.union = yyLOCAL case 1043: @@ -16633,7 +16564,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5421 { - yyLOCAL = &FramePoint{Type: UnboundedFollowingType} + yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } yyVAL.union = yyLOCAL case 1044: @@ -16641,7 +16572,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5425 { - yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} + yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } yyVAL.union = yyLOCAL case 1045: @@ -16649,15 +16580,15 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5429 { - yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} + yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1046: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL Expr -//line sql.y:5435 + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *FramePoint +//line sql.y:5433 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1047: @@ -16669,281 +16600,281 @@ yydefault: } yyVAL.union = yyLOCAL case 1048: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Expr +//line sql.y:5443 + { + yyLOCAL = yyDollar[1].exprUnion() + } + yyVAL.union = yyLOCAL + case 1049: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5444 +//line sql.y:5448 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1049: + case 1050: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5448 +//line sql.y:5452 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 1050: + case 1051: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5454 +//line sql.y:5458 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } yyVAL.union = yyLOCAL - case 1051: + case 1052: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5458 +//line sql.y:5462 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } yyVAL.union = yyLOCAL - case 1052: + case 1053: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5463 +//line sql.y:5467 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1053: + case 1054: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5467 +//line sql.y:5471 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1054: + case 1055: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5472 +//line sql.y:5476 { } - case 1055: + case 1056: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5475 +//line sql.y:5479 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1056: + case 1057: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5481 +//line sql.y:5485 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } yyVAL.union = yyLOCAL - case 1057: + case 1058: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5487 +//line sql.y:5491 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1058: + case 1059: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5491 +//line sql.y:5495 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 1059: + case 1060: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5496 +//line sql.y:5500 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1061: + case 1062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5503 +//line sql.y:5507 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } yyVAL.union = yyLOCAL - case 1062: + case 1063: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5509 +//line sql.y:5513 { yyLOCAL = RespectNullsType } yyVAL.union = yyLOCAL - case 1063: + case 1064: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5513 +//line sql.y:5517 { yyLOCAL = IgnoreNullsType } yyVAL.union = yyLOCAL - case 1064: + case 1065: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5519 +//line sql.y:5523 { yyLOCAL = FirstValueExprType } yyVAL.union = yyLOCAL - case 1065: + case 1066: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5523 +//line sql.y:5527 { yyLOCAL = LastValueExprType } yyVAL.union = yyLOCAL - case 1066: + case 1067: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5529 +//line sql.y:5533 { yyLOCAL = FromFirstType } yyVAL.union = yyLOCAL - case 1067: + case 1068: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5533 +//line sql.y:5537 { yyLOCAL = FromLastType } yyVAL.union = yyLOCAL - case 1068: + case 1069: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5538 +//line sql.y:5542 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1070: + case 1071: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5545 +//line sql.y:5549 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } yyVAL.union = yyLOCAL - case 1071: + case 1072: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5551 +//line sql.y:5555 { yyLOCAL = LagExprType } yyVAL.union = yyLOCAL - case 1072: + case 1073: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5555 +//line sql.y:5559 { yyLOCAL = LeadExprType } yyVAL.union = yyLOCAL - case 1073: + case 1074: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5561 +//line sql.y:5565 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1074: + case 1075: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5567 +//line sql.y:5571 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 1075: + case 1076: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5571 +//line sql.y:5575 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } - case 1076: + case 1077: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5577 +//line sql.y:5581 { yyVAL.str = "" } - case 1077: + case 1078: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5581 +//line sql.y:5585 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 1078: + case 1079: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5587 +//line sql.y:5591 { yyLOCAL = BoolVal(true) } yyVAL.union = yyLOCAL - case 1079: + case 1080: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5591 +//line sql.y:5595 { yyLOCAL = BoolVal(false) } yyVAL.union = yyLOCAL - case 1080: + case 1081: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5598 +//line sql.y:5602 { yyLOCAL = IsTrueOp } yyVAL.union = yyLOCAL - case 1081: + case 1082: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5602 +//line sql.y:5606 { yyLOCAL = IsNotTrueOp } yyVAL.union = yyLOCAL - case 1082: + case 1083: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5606 +//line sql.y:5610 { yyLOCAL = IsFalseOp } yyVAL.union = yyLOCAL - case 1083: + case 1084: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5610 +//line sql.y:5614 { yyLOCAL = IsNotFalseOp } yyVAL.union = yyLOCAL - case 1084: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ComparisonExprOperator -//line sql.y:5616 - { - yyLOCAL = EqualOp - } - yyVAL.union = yyLOCAL case 1085: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator //line sql.y:5620 { - yyLOCAL = LessThanOp + yyLOCAL = EqualOp } yyVAL.union = yyLOCAL case 1086: @@ -16951,7 +16882,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5624 { - yyLOCAL = GreaterThanOp + yyLOCAL = LessThanOp } yyVAL.union = yyLOCAL case 1087: @@ -16959,7 +16890,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5628 { - yyLOCAL = LessEqualOp + yyLOCAL = GreaterThanOp } yyVAL.union = yyLOCAL case 1088: @@ -16967,7 +16898,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5632 { - yyLOCAL = GreaterEqualOp + yyLOCAL = LessEqualOp } yyVAL.union = yyLOCAL case 1089: @@ -16975,7 +16906,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5636 { - yyLOCAL = NotEqualOp + yyLOCAL = GreaterEqualOp } yyVAL.union = yyLOCAL case 1090: @@ -16983,15 +16914,15 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5640 { - yyLOCAL = NullSafeEqualOp + yyLOCAL = NotEqualOp } yyVAL.union = yyLOCAL case 1091: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ColTuple -//line sql.y:5646 + var yyLOCAL ComparisonExprOperator +//line sql.y:5644 { - yyLOCAL = yyDollar[1].valTupleUnion() + yyLOCAL = NullSafeEqualOp } yyVAL.union = yyLOCAL case 1092: @@ -16999,159 +16930,159 @@ yydefault: var yyLOCAL ColTuple //line sql.y:5650 { - yyLOCAL = yyDollar[1].subqueryUnion() + yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple //line sql.y:5654 + { + yyLOCAL = yyDollar[1].subqueryUnion() + } + yyVAL.union = yyLOCAL + case 1094: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ColTuple +//line sql.y:5658 { yyLOCAL = ListArg(yyDollar[1].str[2:]) bindVariable(yylex, yyDollar[1].str[2:]) } yyVAL.union = yyLOCAL - case 1094: + case 1095: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5661 +//line sql.y:5665 { yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1095: + case 1096: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5667 +//line sql.y:5671 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1096: + case 1097: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5671 +//line sql.y:5675 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) } - case 1097: + case 1098: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5681 +//line sql.y:5685 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1098: + case 1099: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5685 +//line sql.y:5689 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1099: - yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL Expr -//line sql.y:5695 - { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} - } - yyVAL.union = yyLOCAL case 1100: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5699 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1101: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5703 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1102: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5707 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1103: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5711 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1104: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5715 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1105: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5719 { - yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1106: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5723 { - yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} + yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1107: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5727 { - yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} + yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL case 1108: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr //line sql.y:5731 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} + yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL case 1109: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5742 +//line sql.y:5735 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1110: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5746 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } yyVAL.union = yyLOCAL case 1111: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5752 +//line sql.y:5750 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1112: @@ -17159,31 +17090,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5756 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].exprUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } yyVAL.union = yyLOCAL case 1113: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5761 +//line sql.y:5760 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].exprUnion()} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1114: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5765 { - yyLOCAL = &CountStar{} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1115: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5769 { - yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} + yyLOCAL = &CountStar{} } yyVAL.union = yyLOCAL case 1116: @@ -17191,7 +17122,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5773 { - yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL case 1117: @@ -17199,7 +17130,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5777 { - yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1118: @@ -17207,7 +17138,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5781 { - yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1119: @@ -17215,15 +17146,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5785 { - yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1120: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5789 { - yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1121: @@ -17231,7 +17162,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5793 { - yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1122: @@ -17239,7 +17170,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5797 { - yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1123: @@ -17247,7 +17178,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5801 { - yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1124: @@ -17255,7 +17186,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5805 { - yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1125: @@ -17263,7 +17194,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5809 { - yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1126: @@ -17271,7 +17202,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5813 { - yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1127: @@ -17279,7 +17210,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5817 { - yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1128: @@ -17287,7 +17218,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5821 { - yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1129: @@ -17295,15 +17226,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5825 { - yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1130: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5829 { - yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} + yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1131: @@ -17311,7 +17242,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5833 { - yyLOCAL = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} + yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL case 1132: @@ -17319,31 +17250,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5837 { - yyLOCAL = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} + yyLOCAL = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1133: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5841 { - yyLOCAL = &ExtractFuncExpr{IntervalTypes: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} + yyLOCAL = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1134: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5845 { - yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} + yyLOCAL = &ExtractFuncExpr{IntervalTypes: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1135: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5849 { - yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1136: @@ -17351,7 +17282,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5853 { - yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1137: @@ -17359,7 +17290,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5857 { - yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1138: @@ -17367,7 +17298,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5861 { - yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1139: @@ -17375,23 +17306,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5865 { - yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1140: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5869 { - yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1141: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:5873 { - yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL case 1142: @@ -17399,15 +17330,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5877 { - yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} + yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1143: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5881 { - yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} + yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1144: @@ -17415,7 +17346,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5885 { - yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} + yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } yyVAL.union = yyLOCAL case 1145: @@ -17423,23 +17354,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5889 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1146: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5893 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1147: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5897 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1148: @@ -17447,15 +17378,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5901 { - yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1149: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5905 { - yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1150: @@ -17463,31 +17394,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5909 { - yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1151: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5913 { - yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} + yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1152: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5917 { - yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } yyVAL.union = yyLOCAL case 1153: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5921 { - yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} + yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1154: @@ -17495,15 +17426,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5925 { - yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} + yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1155: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5929 { - yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} + yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1156: @@ -17511,7 +17442,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5933 { - yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} + yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1157: @@ -17519,47 +17450,47 @@ yydefault: var yyLOCAL Expr //line sql.y:5937 { - yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1158: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5941 { - yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} + yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1159: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5945 { - yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} + yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} } yyVAL.union = yyLOCAL case 1160: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5949 { - yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} } yyVAL.union = yyLOCAL case 1161: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5953 { - yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1162: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5957 { - yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} + yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1163: @@ -17567,39 +17498,39 @@ yydefault: var yyLOCAL Expr //line sql.y:5961 { - yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} + yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1164: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5965 { - yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} + yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1165: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5969 { - yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} + yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1166: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr //line sql.y:5973 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} + yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} } yyVAL.union = yyLOCAL case 1167: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:5977 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1168: @@ -17607,23 +17538,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5981 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1169: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5985 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1170: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr //line sql.y:5989 { - yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1171: @@ -17631,7 +17562,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5993 { - yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1172: @@ -17639,7 +17570,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5997 { - yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1173: @@ -17647,15 +17578,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6001 { - yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1174: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6005 { - yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1175: @@ -17663,7 +17594,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6009 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1176: @@ -17671,7 +17602,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6013 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1177: @@ -17679,7 +17610,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6017 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1178: @@ -17687,7 +17618,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6021 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1179: @@ -17695,7 +17626,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6025 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1180: @@ -17703,7 +17634,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6029 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1181: @@ -17711,7 +17642,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6033 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1182: @@ -17719,7 +17650,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6037 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1183: @@ -17727,15 +17658,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6041 { - yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1184: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6045 { - yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} + yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1185: @@ -17743,55 +17674,55 @@ yydefault: var yyLOCAL Expr //line sql.y:6049 { - yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} + yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1186: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6053 { - yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} + yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} } yyVAL.union = yyLOCAL case 1187: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6057 { - yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} + yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL case 1188: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:6061 { - yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} + yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL case 1189: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr //line sql.y:6065 { - yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} + yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL case 1190: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6069 { - yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} + yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1195: - yyDollar = yyS[yypt-1 : yypt+1] + case 1191: + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6079 +//line sql.y:6073 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL case 1196: @@ -17799,7 +17730,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6083 { - yyLOCAL = NewIntLiteral(yyDollar[1].str) + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1197: @@ -17807,296 +17738,296 @@ yydefault: var yyLOCAL Expr //line sql.y:6087 { - yyLOCAL = yyDollar[1].variableUnion() + yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL case 1198: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:6091 + { + yyLOCAL = yyDollar[1].variableUnion() + } + yyVAL.union = yyLOCAL + case 1199: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Expr +//line sql.y:6095 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1199: + case 1200: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6097 +//line sql.y:6101 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1200: + case 1201: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6101 +//line sql.y:6105 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1201: + case 1202: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6107 +//line sql.y:6111 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1202: + case 1203: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6111 +//line sql.y:6115 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1203: + case 1204: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6115 +//line sql.y:6119 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1204: + case 1205: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6119 +//line sql.y:6123 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1205: + case 1206: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6123 +//line sql.y:6127 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1206: + case 1207: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6128 +//line sql.y:6132 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1207: + case 1208: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6132 +//line sql.y:6136 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1208: + case 1209: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6136 +//line sql.y:6140 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1209: + case 1210: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6140 +//line sql.y:6144 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1210: + case 1211: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6144 +//line sql.y:6148 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1211: + case 1212: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6148 +//line sql.y:6152 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1212: + case 1213: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6153 +//line sql.y:6157 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1213: + case 1214: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6157 +//line sql.y:6161 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1214: + case 1215: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6161 +//line sql.y:6165 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1215: + case 1216: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6165 +//line sql.y:6169 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), MatchType: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1216: + case 1217: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6172 +//line sql.y:6176 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1217: + case 1218: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6176 +//line sql.y:6180 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1218: + case 1219: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6182 +//line sql.y:6186 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1219: + case 1220: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6186 +//line sql.y:6190 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1220: + case 1221: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6190 +//line sql.y:6194 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } yyVAL.union = yyLOCAL - case 1221: + case 1222: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6194 +//line sql.y:6198 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1222: + case 1223: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6200 +//line sql.y:6204 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1223: + case 1224: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6204 +//line sql.y:6208 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1224: + case 1225: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6208 +//line sql.y:6212 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1225: + case 1226: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6212 +//line sql.y:6216 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1226: + case 1227: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6216 +//line sql.y:6220 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1227: + case 1228: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6220 +//line sql.y:6224 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1228: + case 1229: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6224 +//line sql.y:6228 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1229: + case 1230: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6229 +//line sql.y:6233 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1230: + case 1231: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6233 +//line sql.y:6237 { yyLOCAL = yyDollar[2].convertTypeUnion() } yyVAL.union = yyLOCAL - case 1231: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6239 - { - } case 1232: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL IntervalTypes -//line sql.y:6241 +//line sql.y:6243 { - yyLOCAL = IntervalDayHour } - yyVAL.union = yyLOCAL case 1233: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes //line sql.y:6245 { - yyLOCAL = IntervalDayMicrosecond + yyLOCAL = IntervalDayHour } yyVAL.union = yyLOCAL case 1234: @@ -18104,7 +18035,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6249 { - yyLOCAL = IntervalDayMinute + yyLOCAL = IntervalDayMicrosecond } yyVAL.union = yyLOCAL case 1235: @@ -18112,7 +18043,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6253 { - yyLOCAL = IntervalDaySecond + yyLOCAL = IntervalDayMinute } yyVAL.union = yyLOCAL case 1236: @@ -18120,7 +18051,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6257 { - yyLOCAL = IntervalHourMicrosecond + yyLOCAL = IntervalDaySecond } yyVAL.union = yyLOCAL case 1237: @@ -18128,7 +18059,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6261 { - yyLOCAL = IntervalHourMinute + yyLOCAL = IntervalHourMicrosecond } yyVAL.union = yyLOCAL case 1238: @@ -18136,7 +18067,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6265 { - yyLOCAL = IntervalHourSecond + yyLOCAL = IntervalHourMinute } yyVAL.union = yyLOCAL case 1239: @@ -18144,7 +18075,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6269 { - yyLOCAL = IntervalMinuteMicrosecond + yyLOCAL = IntervalHourSecond } yyVAL.union = yyLOCAL case 1240: @@ -18152,7 +18083,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6273 { - yyLOCAL = IntervalMinuteSecond + yyLOCAL = IntervalMinuteMicrosecond } yyVAL.union = yyLOCAL case 1241: @@ -18160,7 +18091,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6277 { - yyLOCAL = IntervalSecondMicrosecond + yyLOCAL = IntervalMinuteSecond } yyVAL.union = yyLOCAL case 1242: @@ -18168,15 +18099,15 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6281 { - yyLOCAL = IntervalYearMonth + yyLOCAL = IntervalSecondMicrosecond } yyVAL.union = yyLOCAL case 1243: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6287 +//line sql.y:6285 { - yyLOCAL = IntervalDay + yyLOCAL = IntervalYearMonth } yyVAL.union = yyLOCAL case 1244: @@ -18184,7 +18115,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6291 { - yyLOCAL = IntervalWeek + yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL case 1245: @@ -18192,7 +18123,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6295 { - yyLOCAL = IntervalHour + yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL case 1246: @@ -18200,7 +18131,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6299 { - yyLOCAL = IntervalMinute + yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL case 1247: @@ -18208,7 +18139,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6303 { - yyLOCAL = IntervalMonth + yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL case 1248: @@ -18216,7 +18147,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6307 { - yyLOCAL = IntervalQuarter + yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL case 1249: @@ -18224,7 +18155,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6311 { - yyLOCAL = IntervalSecond + yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL case 1250: @@ -18232,7 +18163,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6315 { - yyLOCAL = IntervalMicrosecond + yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL case 1251: @@ -18240,19 +18171,19 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6319 { - yyLOCAL = IntervalYear + yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1254: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL Expr -//line sql.y:6329 + case 1252: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL IntervalTypes +//line sql.y:6323 { - yyLOCAL = nil + yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL case 1255: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr //line sql.y:6333 { @@ -18260,11 +18191,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1256: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:6337 { - yyLOCAL = NewIntLiteral(yyDollar[2].str) + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1257: @@ -18272,16 +18203,16 @@ yydefault: var yyLOCAL Expr //line sql.y:6341 { - yyLOCAL = NewArgument(yyDollar[2].str[1:]) - bindVariable(yylex, yyDollar[2].str[1:]) + yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL case 1258: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6352 +//line sql.y:6345 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = NewArgument(yyDollar[2].str[1:]) + bindVariable(yylex, yyDollar[2].str[1:]) } yyVAL.union = yyLOCAL case 1259: @@ -18289,7 +18220,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6356 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1260: @@ -18297,7 +18228,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6360 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1261: @@ -18305,7 +18236,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6364 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1262: @@ -18313,60 +18244,62 @@ yydefault: var yyLOCAL Expr //line sql.y:6368 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1263: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL MatchExprOption -//line sql.y:6374 + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Expr +//line sql.y:6372 { - yyLOCAL = NoOption + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1264: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6378 { - yyLOCAL = BooleanModeOpt + yyLOCAL = NoOption } yyVAL.union = yyLOCAL case 1265: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6382 { - yyLOCAL = NaturalLanguageModeOpt + yyLOCAL = BooleanModeOpt } yyVAL.union = yyLOCAL case 1266: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6386 { - yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt + yyLOCAL = NaturalLanguageModeOpt } yyVAL.union = yyLOCAL case 1267: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6390 { - yyLOCAL = QueryExpansionOpt + yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } yyVAL.union = yyLOCAL case 1268: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6396 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL MatchExprOption +//line sql.y:6394 { - yyVAL.str = string(yyDollar[1].identifierCI.String()) + yyLOCAL = QueryExpansionOpt } + yyVAL.union = yyLOCAL case 1269: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:6400 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 1270: yyDollar = yyS[yypt-1 : yypt+1] @@ -18375,19 +18308,17 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1271: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL *ConvertType -//line sql.y:6410 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6408 { - yyLOCAL = nil + yyVAL.str = string(yyDollar[1].str) } - yyVAL.union = yyLOCAL case 1272: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6414 { - yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1273: @@ -18399,35 +18330,35 @@ yydefault: } yyVAL.union = yyLOCAL case 1274: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6424 +//line sql.y:6422 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL case 1275: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6428 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1276: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6432 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} } yyVAL.union = yyLOCAL case 1277: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6436 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1278: @@ -18435,37 +18366,37 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6440 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} - yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length - yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1279: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6446 +//line sql.y:6444 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length + yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale } yyVAL.union = yyLOCAL case 1280: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6450 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1281: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6454 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1282: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6458 { @@ -18477,19 +18408,19 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6462 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1284: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6466 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1285: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6470 { @@ -18501,15 +18432,15 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6474 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1287: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6478 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1288: @@ -18521,140 +18452,148 @@ yydefault: } yyVAL.union = yyLOCAL case 1289: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL *ConvertType +//line sql.y:6486 + { + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + } + yyVAL.union = yyLOCAL + case 1290: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:6488 +//line sql.y:6492 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1290: + case 1291: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:6492 +//line sql.y:6496 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1291: + case 1292: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6497 +//line sql.y:6501 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1292: + case 1293: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6501 +//line sql.y:6505 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1293: + case 1294: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6506 +//line sql.y:6510 { yyVAL.str = string("") } - case 1294: + case 1295: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6510 +//line sql.y:6514 { yyVAL.str = " separator " + encodeSQLString(yyDollar[2].str) } - case 1295: + case 1296: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:6516 +//line sql.y:6520 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL - case 1296: + case 1297: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6520 +//line sql.y:6524 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) } - case 1297: + case 1298: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:6526 +//line sql.y:6530 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1298: + case 1299: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6531 +//line sql.y:6535 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1299: + case 1300: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6535 +//line sql.y:6539 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1300: + case 1301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:6541 +//line sql.y:6545 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1301: + case 1302: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:6545 +//line sql.y:6549 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 1302: + case 1303: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:6549 +//line sql.y:6553 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1303: + case 1304: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:6553 +//line sql.y:6557 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 1304: + case 1305: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6559 +//line sql.y:6563 { yyLOCAL = yyDollar[1].colNameUnion() } yyVAL.union = yyLOCAL - case 1305: + case 1306: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6563 +//line sql.y:6567 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1306: + case 1307: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6569 +//line sql.y:6573 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -18664,219 +18603,211 @@ yydefault: yyLOCAL = NewIntLiteral("1") } yyVAL.union = yyLOCAL - case 1307: + case 1308: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6578 +//line sql.y:6582 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1308: + case 1309: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6582 +//line sql.y:6586 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1309: + case 1310: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:6588 +//line sql.y:6592 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1310: + case 1311: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:6592 +//line sql.y:6596 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1311: + case 1312: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6597 +//line sql.y:6601 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1312: + case 1313: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6601 +//line sql.y:6605 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1313: + case 1314: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:6607 +//line sql.y:6611 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 1314: + case 1315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6613 +//line sql.y:6617 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL - case 1315: + case 1316: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6617 +//line sql.y:6621 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) } - case 1316: + case 1317: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6622 +//line sql.y:6626 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1317: + case 1318: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6626 +//line sql.y:6630 { yyLOCAL = yyDollar[1].namedWindowsUnion() } yyVAL.union = yyLOCAL - case 1318: + case 1319: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6631 +//line sql.y:6635 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1319: + case 1320: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6635 +//line sql.y:6639 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1320: + case 1321: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6641 +//line sql.y:6645 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1321: + case 1322: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6647 +//line sql.y:6651 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1322: + case 1323: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6651 +//line sql.y:6655 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) } - case 1323: + case 1324: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:6657 +//line sql.y:6661 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 1324: + case 1325: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6662 +//line sql.y:6666 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1325: + case 1326: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6666 +//line sql.y:6670 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1326: + case 1327: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6670 +//line sql.y:6674 { yyLOCAL = DescOrder } yyVAL.union = yyLOCAL - case 1327: + case 1328: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:6675 +//line sql.y:6679 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1328: + case 1329: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:6679 +//line sql.y:6683 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1329: + case 1330: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:6685 +//line sql.y:6689 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1330: + case 1331: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:6689 +//line sql.y:6693 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1331: + case 1332: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:6693 +//line sql.y:6697 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1332: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL []AlterOption -//line sql.y:6698 - { - yyLOCAL = nil - } - yyVAL.union = yyLOCAL case 1333: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption //line sql.y:6702 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1334: @@ -18888,11 +18819,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1335: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption //line sql.y:6710 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL case 1336: @@ -18904,11 +18835,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1337: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:6721 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL []AlterOption +//line sql.y:6718 { - yyLOCAL = &LockOption{Type: DefaultType} + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 1338: @@ -18916,7 +18847,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6725 { - yyLOCAL = &LockOption{Type: NoneType} + yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL case 1339: @@ -18924,7 +18855,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6729 { - yyLOCAL = &LockOption{Type: SharedType} + yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL case 1340: @@ -18932,15 +18863,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6733 { - yyLOCAL = &LockOption{Type: ExclusiveType} + yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL case 1341: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6739 +//line sql.y:6737 { - yyLOCAL = AlgorithmValue(yyDollar[3].str) + yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL case 1342: @@ -18968,16 +18899,18 @@ yydefault: } yyVAL.union = yyLOCAL case 1345: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6756 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:6755 { - yyVAL.str = "" + yyLOCAL = AlgorithmValue(yyDollar[3].str) } + yyVAL.union = yyLOCAL case 1346: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6760 { - yyVAL.str = string(yyDollar[3].str) + yyVAL.str = "" } case 1347: yyDollar = yyS[yypt-3 : yypt+1] @@ -18992,22 +18925,22 @@ yydefault: yyVAL.str = string(yyDollar[3].str) } case 1349: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6773 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:6772 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[3].str) } case 1350: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6777 { - yyVAL.str = yyDollar[3].str + yyVAL.str = "" } case 1351: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6783 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:6781 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = yyDollar[3].str } case 1352: yyDollar = yyS[yypt-1 : yypt+1] @@ -19016,28 +18949,28 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1353: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6792 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6791 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[1].str) } case 1354: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6796 { - yyVAL.str = yyDollar[2].str + yyVAL.str = "" } case 1355: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6801 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:6800 { - yyVAL.str = "cascaded" + yyVAL.str = yyDollar[2].str } case 1356: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6805 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = "cascaded" } case 1357: yyDollar = yyS[yypt-1 : yypt+1] @@ -19046,45 +18979,51 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1358: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6813 + { + yyVAL.str = string(yyDollar[1].str) + } + case 1359: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:6814 +//line sql.y:6818 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1359: + case 1360: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:6818 +//line sql.y:6822 { yyLOCAL = yyDollar[3].definerUnion() } yyVAL.union = yyLOCAL - case 1360: + case 1361: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:6824 +//line sql.y:6828 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1361: + case 1362: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:6830 +//line sql.y:6834 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1362: + case 1363: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:6836 +//line sql.y:6840 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -19092,369 +19031,369 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1363: + case 1364: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6845 +//line sql.y:6849 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 1364: + case 1365: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6849 +//line sql.y:6853 { yyVAL.str = formatIdentifier(yyDollar[1].str) } - case 1365: + case 1366: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6854 +//line sql.y:6858 { yyVAL.str = "" } - case 1366: + case 1367: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6858 +//line sql.y:6862 { yyVAL.str = formatAddress(yyDollar[1].str) } - case 1367: + case 1368: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:6864 +//line sql.y:6868 { yyLOCAL = ForUpdateLock } yyVAL.union = yyLOCAL - case 1368: + case 1369: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:6868 +//line sql.y:6872 { yyLOCAL = ShareModeLock } yyVAL.union = yyLOCAL - case 1369: + case 1370: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:6874 +//line sql.y:6878 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].columnCharset, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } yyVAL.union = yyLOCAL - case 1370: + case 1371: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:6878 +//line sql.y:6882 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1371: + case 1372: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:6882 +//line sql.y:6886 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1372: + case 1373: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6887 +//line sql.y:6891 { yyVAL.str = "" } - case 1373: + case 1374: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6891 +//line sql.y:6895 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1374: + case 1375: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6895 +//line sql.y:6899 { yyVAL.str = " format text" + yyDollar[3].str } - case 1375: + case 1376: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6900 +//line sql.y:6904 { yyVAL.str = "" } - case 1376: + case 1377: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6904 +//line sql.y:6908 { yyVAL.str = " header" } - case 1377: + case 1378: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6909 +//line sql.y:6913 { yyVAL.str = "" } - case 1378: + case 1379: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6913 +//line sql.y:6917 { yyVAL.str = " manifest on" } - case 1379: + case 1380: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6917 +//line sql.y:6921 { yyVAL.str = " manifest off" } - case 1380: + case 1381: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6922 +//line sql.y:6926 { yyVAL.str = "" } - case 1381: + case 1382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6926 +//line sql.y:6930 { yyVAL.str = " overwrite on" } - case 1382: + case 1383: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6930 +//line sql.y:6934 { yyVAL.str = " overwrite off" } - case 1383: + case 1384: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6936 +//line sql.y:6940 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1384: + case 1385: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6941 +//line sql.y:6945 { yyVAL.str = "" } - case 1385: + case 1386: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6945 +//line sql.y:6949 { yyVAL.str = " lines" + yyDollar[2].str } - case 1386: + case 1387: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6951 +//line sql.y:6955 { yyVAL.str = yyDollar[1].str } - case 1387: + case 1388: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6955 +//line sql.y:6959 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1388: + case 1389: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6961 +//line sql.y:6965 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1389: + case 1390: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6965 +//line sql.y:6969 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1390: + case 1391: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6970 +//line sql.y:6974 { yyVAL.str = "" } - case 1391: + case 1392: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6974 +//line sql.y:6978 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1392: + case 1393: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6980 +//line sql.y:6984 { yyVAL.str = yyDollar[1].str } - case 1393: + case 1394: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6984 +//line sql.y:6988 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1394: + case 1395: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6990 +//line sql.y:6994 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1395: + case 1396: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:6994 +//line sql.y:6998 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1396: + case 1397: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6998 +//line sql.y:7002 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1397: + case 1398: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7003 +//line sql.y:7007 { yyVAL.str = "" } - case 1398: + case 1399: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7007 +//line sql.y:7011 { yyVAL.str = " optionally" } - case 1399: + case 1400: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Insert -//line sql.y:7020 +//line sql.y:7024 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion()} } yyVAL.union = yyLOCAL - case 1400: + case 1401: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7024 +//line sql.y:7028 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1401: + case 1402: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7028 +//line sql.y:7032 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion()} } yyVAL.union = yyLOCAL - case 1402: + case 1403: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7032 +//line sql.y:7036 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion()} } yyVAL.union = yyLOCAL - case 1403: + case 1404: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7036 +//line sql.y:7040 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1404: + case 1405: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7042 +//line sql.y:7046 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1405: + case 1406: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7046 +//line sql.y:7050 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1406: + case 1407: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7050 +//line sql.y:7054 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1407: + case 1408: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7054 +//line sql.y:7058 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1408: + case 1409: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7059 +//line sql.y:7063 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1409: + case 1410: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7063 +//line sql.y:7067 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1410: + case 1411: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7069 +//line sql.y:7073 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1411: + case 1412: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7073 +//line sql.y:7077 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1412: + case 1413: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7079 +//line sql.y:7083 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1413: + case 1414: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7083 +//line sql.y:7087 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1414: + case 1415: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7089 +//line sql.y:7093 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1415: + case 1416: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7093 +//line sql.y:7097 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1416: + case 1417: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7098 +//line sql.y:7102 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -19463,283 +19402,277 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1417: + case 1418: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7108 +//line sql.y:7112 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1418: + case 1419: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7112 +//line sql.y:7116 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1419: + case 1420: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7118 +//line sql.y:7122 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1420: + case 1421: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:7124 +//line sql.y:7128 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL - case 1421: + case 1422: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7128 +//line sql.y:7132 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) } - case 1422: + case 1423: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:7134 +//line sql.y:7138 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL - case 1423: + case 1424: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:7138 +//line sql.y:7142 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("off")} } yyVAL.union = yyLOCAL - case 1424: + case 1425: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:7142 +//line sql.y:7146 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1425: + case 1426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:7146 +//line sql.y:7150 { yyLOCAL = &SetExpr{Var: NewSetVariable(string(yyDollar[1].str), SessionScope), Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1426: + case 1427: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:7152 +//line sql.y:7156 { yyLOCAL = NewSetVariable(string(yyDollar[1].str), SessionScope) } yyVAL.union = yyLOCAL - case 1427: + case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:7156 +//line sql.y:7160 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1428: + case 1429: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Variable -//line sql.y:7160 +//line sql.y:7164 { yyLOCAL = NewSetVariable(string(yyDollar[2].str), yyDollar[1].scopeUnion()) } yyVAL.union = yyLOCAL - case 1430: + case 1431: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7167 +//line sql.y:7171 { yyVAL.str = "charset" } - case 1433: + case 1434: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7177 +//line sql.y:7181 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1434: + case 1435: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7181 +//line sql.y:7185 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1435: + case 1436: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7185 +//line sql.y:7189 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1438: + case 1439: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7194 +//line sql.y:7198 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1439: + case 1440: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7196 +//line sql.y:7200 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1440: + case 1441: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7199 +//line sql.y:7203 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1441: + case 1442: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7201 +//line sql.y:7205 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1442: + case 1443: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7204 +//line sql.y:7208 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1443: + case 1444: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7206 +//line sql.y:7210 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1444: + case 1445: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7209 +//line sql.y:7213 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1445: + case 1446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7211 +//line sql.y:7215 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1446: + case 1447: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7214 +//line sql.y:7218 { yyVAL.empty = struct{}{} } - case 1447: + case 1448: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7216 +//line sql.y:7220 { yyVAL.empty = struct{}{} } - case 1448: + case 1449: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7218 +//line sql.y:7222 { yyVAL.empty = struct{}{} } - case 1449: + case 1450: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7222 +//line sql.y:7226 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1450: + case 1451: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7227 +//line sql.y:7231 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1451: + case 1452: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:7231 +//line sql.y:7235 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1452: + case 1453: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7236 +//line sql.y:7240 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1453: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7238 +//line sql.y:7242 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1454: + case 1455: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:7242 +//line sql.y:7246 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1455: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7248 - { - yyVAL.identifierCI = yyDollar[1].identifierCI - } case 1456: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:7252 { - yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) + yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1458: + case 1457: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7259 +//line sql.y:7256 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1459: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7265 +//line sql.y:7263 { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1460: yyDollar = yyS[yypt-1 : yypt+1] @@ -19748,52 +19681,52 @@ yydefault: yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1461: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7273 + { + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + } + case 1462: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7275 +//line sql.y:7279 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1462: + case 1463: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7279 +//line sql.y:7283 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1464: + case 1465: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7286 +//line sql.y:7290 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 2006: + case 2007: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7854 +//line sql.y:7858 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 2007: + case 2008: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7863 +//line sql.y:7867 { decNesting(yylex) } - case 2008: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7868 - { - skipToEnd(yylex) - } case 2009: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7873 +//line sql.y:7872 { skipToEnd(yylex) } case 2010: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:7877 { skipToEnd(yylex) @@ -19804,6 +19737,12 @@ yydefault: { skipToEnd(yylex) } + case 2012: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7885 + { + skipToEnd(yylex) + } } goto yystack /* stack new state and value */ } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 989d6fd60fe..a7300cb50ef 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -2788,7 +2788,11 @@ insert_method_options: | LAST table_opt_value: - reserved_sql_id + table_id '.' reserved_table_id + { + $$ = String(TableName{Qualifier: $1, Name: $3}) + } +| reserved_sql_id { $$ = $1.String() } diff --git a/go/vt/vtgate/executor_vschema_ddl_test.go b/go/vt/vtgate/executor_vschema_ddl_test.go index f6aa8d70572..ce89b9ca505 100644 --- a/go/vt/vtgate/executor_vschema_ddl_test.go +++ b/go/vt/vtgate/executor_vschema_ddl_test.go @@ -579,6 +579,18 @@ func TestExecutorAddDropVindexDDL(t *testing.T) { } utils.MustMatch(t, wantqr, qr) + // now make sure we can create another vindex that references a table with dashes (i.e. escaping is necessary) + stmt = "alter vschema on test2 add vindex test_lookup_fqn(c1,c2) using consistent_lookup_unique with owner=`test`, from=`c1,c2`, table=`test-keyspace`.`lookup-fqn`, to=`keyspace_id`" + _, err = executor.Execute(context.Background(), "TestExecute", session, stmt, nil) + require.NoError(t, err) + + _, vindex = waitForVindex(t, ks, "test_lookup_fqn", vschemaUpdates, executor) + require.Equal(t, "consistent_lookup_unique", vindex.Type) + require.Equal(t, "test", vindex.Owner) + require.Equal(t, "c1,c2", vindex.Params["from"]) + require.Equal(t, "`test-keyspace`.`lookup-fqn`", vindex.Params["table"]) + require.Equal(t, "keyspace_id", vindex.Params["to"]) + stmt = "alter vschema on test2 add vindex nonexistent (c1,c2)" _, err = executor.Execute(context.Background(), "TestExecute", session, stmt, nil) require.EqualError(t, err, "vindex nonexistent does not exist in keyspace TestExecutor") From 54908d993ab5580523bc046fb8e4336dcf968bbf Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Wed, 29 Mar 2023 11:49:28 -0400 Subject: [PATCH 52/53] Code freeze of release-15.0 (#12764) Signed-off-by: Matt Lord --- .github/workflows/code_freeze.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 381793fa84d..b6dde0a0220 100644 --- a/.github/workflows/code_freeze.yml +++ b/.github/workflows/code_freeze.yml @@ -9,4 +9,4 @@ jobs: steps: - name: Fail if Code Freeze is enabled run: | - exit 0 + exit 1 From 652b0da1b8dc96879f72fd86de6dad55772efbf6 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 30 Mar 2023 11:37:29 -0400 Subject: [PATCH 53/53] Release of v15.0.3 (#12767) * Release notes for 15.0.3 Signed-off-by: Matt Lord * Release commit for 15.0.3 Signed-off-by: Matt Lord * Rename directory Signed-off-by: Matt Lord * Update changelog/15.0/15.0.3/release_notes.md Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --------- Signed-off-by: Matt Lord Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --- .github/workflows/code_freeze.yml | 2 +- changelog/15.0/15.0.3/changelog.md | 89 +++++++++++++++++++ changelog/15.0/15.0.3/release_notes.md | 7 ++ docker/release.sh | 2 +- examples/compose/docker-compose.beginners.yml | 20 ++--- examples/compose/docker-compose.yml | 26 +++--- .../compose/vtcompose/docker-compose.test.yml | 26 +++--- examples/compose/vtcompose/vtcompose.go | 18 ++-- examples/operator/101_initial_cluster.yaml | 14 +-- examples/operator/201_customer_tablets.yaml | 14 +-- examples/operator/302_new_shards.yaml | 14 +-- examples/operator/306_down_shard_0.yaml | 14 +-- examples/operator/operator.yaml | 2 +- go/vt/servenv/version.go | 4 +- java/client/pom.xml | 2 +- java/example/pom.xml | 2 +- java/grpc-client/pom.xml | 2 +- java/jdbc/pom.xml | 2 +- java/pom.xml | 2 +- 19 files changed, 179 insertions(+), 83 deletions(-) create mode 100644 changelog/15.0/15.0.3/changelog.md create mode 100644 changelog/15.0/15.0.3/release_notes.md diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index b6dde0a0220..381793fa84d 100644 --- a/.github/workflows/code_freeze.yml +++ b/.github/workflows/code_freeze.yml @@ -9,4 +9,4 @@ jobs: steps: - name: Fail if Code Freeze is enabled run: | - exit 1 + exit 0 diff --git a/changelog/15.0/15.0.3/changelog.md b/changelog/15.0/15.0.3/changelog.md new file mode 100644 index 00000000000..5634b7aa24a --- /dev/null +++ b/changelog/15.0/15.0.3/changelog.md @@ -0,0 +1,89 @@ +# Changelog of Vitess v15.0.3 + +### Bug fixes +#### Backup and Restore + * mysqlctl: flags should be added to vtbackup [#12048](https://github.com/vitessio/vitess/pull/12048) +#### Build/CI + * Fix `codeql` workflow timeout issue [#11760](https://github.com/vitessio/vitess/pull/11760) + * [release-15.0] Use `go1.20.1` in upgrade/downgrade tests [#12512](https://github.com/vitessio/vitess/pull/12512) +#### CLI + * Purge logs without panicking [#12187](https://github.com/vitessio/vitess/pull/12187) + * Fix `vtctldclient`'s Root command to return an error on unknown command [#12481](https://github.com/vitessio/vitess/pull/12481) +#### Cluster management + * Skip `TestReparentDoesntHangIfPrimaryFails` in vttablet v16 and above [#12387](https://github.com/vitessio/vitess/pull/12387) + * Fix initialization code to also stop replication to prevent crash [#12534](https://github.com/vitessio/vitess/pull/12534) +#### Observability + * Reset the current lag when closing the replication lag reader. [#12683](https://github.com/vitessio/vitess/pull/12683) +#### Online DDL + * Bugfix/Backport to v15: Fix schema migrations requested_timestamp zero values [#12263](https://github.com/vitessio/vitess/pull/12263) + * Mysqld.GetSchema: tolerate tables being dropped while inspecting schema [#12641](https://github.com/vitessio/vitess/pull/12641) +#### Operator + * Fix rbac config in the vtop example [#12034](https://github.com/vitessio/vitess/pull/12034) +#### Query Serving + * [release-15.0] only expand when we have full information (#11998) [#12002](https://github.com/vitessio/vitess/pull/12002) + * Fix: Date math with Interval keyword [#12082](https://github.com/vitessio/vitess/pull/12082) + * BugFix: Cast expression translation by evaluation engine [#12111](https://github.com/vitessio/vitess/pull/12111) + * [Gen4] Fix lookup vindexes with `autocommit` enabled [#12172](https://github.com/vitessio/vitess/pull/12172) + * VTGate: Ensure HealthCheck Cache Secondary Maps Stay in Sync With Authoritative Map on Tablet Delete [#12178](https://github.com/vitessio/vitess/pull/12178) + * Fix aggregation on outer joins [#12298](https://github.com/vitessio/vitess/pull/12298) + * [release-15.0] fix: added null safe operator precendence rule (#12297) [#12306](https://github.com/vitessio/vitess/pull/12306) + * [release-15.0] Fix bug in vtexplain around JOINs (#12376) [#12383](https://github.com/vitessio/vitess/pull/12383) + * Fix scalar aggregation engine primitive for column truncation [#12468](https://github.com/vitessio/vitess/pull/12468) + * [release-16.0] BugFix: Unsharded query using a derived table and a dual table [#12484](https://github.com/vitessio/vitess/pull/12484) + * [bug fix] USING planning on information_schema [#12542](https://github.com/vitessio/vitess/pull/12542) + * handle filter on top of UNION [#12543](https://github.com/vitessio/vitess/pull/12543) + * collations: fix sorting in UCA900 collations [#12555](https://github.com/vitessio/vitess/pull/12555) + * VSchema DDL: Add grammar to accept qualified table names in Vindex option values [#12577](https://github.com/vitessio/vitess/pull/12577) + * [release-15.0] `ApplyVSchemaDDL`: escape Sequence names when writing the VSchema (#12519) [#12598](https://github.com/vitessio/vitess/pull/12598) + * [gen4 planner] Make sure to not push down expressions when not possible [#12607](https://github.com/vitessio/vitess/pull/12607) + * Fix `panic` when executing a prepare statement with over `65,528` parameters [#12614](https://github.com/vitessio/vitess/pull/12614) + * [planner bugfix] add expressions to HAVING [#12668](https://github.com/vitessio/vitess/pull/12668) + * Use a left join to make sure that tables with tablespace=innodb_system are included in the schema [#12672](https://github.com/vitessio/vitess/pull/12672) + * [release-15.0] Always add columns in the `Derived` operator [#12680](https://github.com/vitessio/vitess/pull/12680) + * [planner fix] make unknown column an error only for sharded queries [#12704](https://github.com/vitessio/vitess/pull/12704) +#### VReplication + * VReplication Last Error: retry error if it happens after timeout [#12114](https://github.com/vitessio/vitess/pull/12114) +#### VTorc + * Fix unhandled error in VTOrc `recoverDeadPrimary` [#12511](https://github.com/vitessio/vitess/pull/12511) +### CI/Build +#### Build/CI + * [release-15.0] Make upgrade downgrade job names unique [#12498](https://github.com/vitessio/vitess/pull/12498) + * v15 backport: CI: increase overall test timeouts for all OnlineDDL tests [#12591](https://github.com/vitessio/vitess/pull/12591) +#### Online DDL + * CI: extend timeouts in onlineddl_vrepl due to slow CI runners [#12583](https://github.com/vitessio/vitess/pull/12583) +#### Query Serving + * [release-15.0] Flakes: Properly Test HealthCheck Cache Response Handling (#12226) [#12227](https://github.com/vitessio/vitess/pull/12227) +### Dependabot +#### Build/CI + * Bump golang.org/x/net from 0.5.0 to 0.7.0 (#12390) [#12405](https://github.com/vitessio/vitess/pull/12405) +### Enhancement +#### Build/CI + * Auto upgrade the Golang version [#12585](https://github.com/vitessio/vitess/pull/12585) +#### Governance + * [release-15.0] Add manan and florent to Docker files CODEOWNERS (#11981) [#11983](https://github.com/vitessio/vitess/pull/11983) +#### VTorc + * Release-15: Cherry pick vtorc no cgo [#12223](https://github.com/vitessio/vitess/pull/12223) +### Internal Cleanup +#### Build/CI + * [15.0] CI: remove pitrtls test [#12064](https://github.com/vitessio/vitess/pull/12064) +#### General + * Remove removed flags from being used for v16+ binaries [#12128](https://github.com/vitessio/vitess/pull/12128) + * [release-15.0] Fix release script for the version in the docker script [#12285](https://github.com/vitessio/vitess/pull/12285) +### Other +#### Other + * Code freeze of release-15.0 [#12764](https://github.com/vitessio/vitess/pull/12764) +### Performance +#### Cluster management + * Bug fix: Cache filtered out tablets in topology watcher to avoid unnecessary GetTablet calls to topo [#12194](https://github.com/vitessio/vitess/pull/12194) +### Release +#### Build/CI + * [release-15.0] Tooling improvements backports [#12527](https://github.com/vitessio/vitess/pull/12527) +#### Documentation + * Re-organize the `releasenotes` directory into `changelog` [#12566](https://github.com/vitessio/vitess/pull/12566) +#### General + * Release of v15.0.2 [#11961](https://github.com/vitessio/vitess/pull/11961) + * Back to dev mode after v15.0.2 [#11962](https://github.com/vitessio/vitess/pull/11962) +### Testing +#### General + * Fix vtbackup upgrade/downgrade test [#12437](https://github.com/vitessio/vitess/pull/12437) + diff --git a/changelog/15.0/15.0.3/release_notes.md b/changelog/15.0/15.0.3/release_notes.md new file mode 100644 index 00000000000..aabb3770528 --- /dev/null +++ b/changelog/15.0/15.0.3/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v15.0.3 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/15.0/15.0.3/changelog.md). + +The release includes 52 commits (excluding merges) + +Thanks to all our contributors: @GuptaManan100, @ajm188, @dbussink, @deepthi, @frouioui, @harshit-gangal, @mattlord, @rsajwani, @shlomi-noach, @systay, @vitess-bot[bot], @vmg + diff --git a/docker/release.sh b/docker/release.sh index 163c718f431..13d467b40d9 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='15.0.3-SNAPSHOT' +vt_base_version='v15.0.3' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/examples/compose/docker-compose.beginners.yml b/examples/compose/docker-compose.beginners.yml index 5073807f910..3c132b88cec 100644 --- a/examples/compose/docker-compose.beginners.yml +++ b/examples/compose/docker-compose.beginners.yml @@ -58,7 +58,7 @@ services: - "3306" vtctld: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -83,7 +83,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -113,7 +113,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 command: - sh - -c @@ -146,12 +146,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vttablet100: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -183,7 +183,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -215,7 +215,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -247,7 +247,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -279,7 +279,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -309,7 +309,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index c63547db1c7..b6e40154a7f 100644 --- a/examples/compose/docker-compose.yml +++ b/examples/compose/docker-compose.yml @@ -75,7 +75,7 @@ services: - SCHEMA_FILES=lookup_keyspace_schema_file.sql - POST_LOAD_FILE= - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script schemaload_test_keyspace: @@ -101,7 +101,7 @@ services: - SCHEMA_FILES=test_keyspace_schema_file.sql - POST_LOAD_FILE= - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vreplication: @@ -129,7 +129,7 @@ services: - TOPOLOGY_FLAGS=--topo_implementation consul --topo_global_server_address consul1:8500 --topo_global_root vitess/global - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 13000:8080 volumes: @@ -217,7 +217,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15101:8080 - "15999" @@ -254,7 +254,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15102:8080 - "15999" @@ -291,7 +291,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15201:8080 - "15999" @@ -328,7 +328,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15202:8080 - "15999" @@ -365,7 +365,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15301:8080 - "15999" @@ -402,7 +402,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index d8d8bb7f310..3a858eed1a3 100644 --- a/examples/compose/vtcompose/docker-compose.test.yml +++ b/examples/compose/vtcompose/docker-compose.test.yml @@ -79,7 +79,7 @@ services: - SCHEMA_FILES=test_keyspace_schema_file.sql - POST_LOAD_FILE= - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script schemaload_unsharded_keyspace: @@ -103,7 +103,7 @@ services: - SCHEMA_FILES=unsharded_keyspace_schema_file.sql - POST_LOAD_FILE= - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vreplication: @@ -144,7 +144,7 @@ services: - TOPOLOGY_FLAGS=--topo_implementation consul --topo_global_server_address consul1:8500 --topo_global_root vitess/global - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 13000:8080 volumes: @@ -234,7 +234,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15101:8080 - "15999" @@ -271,7 +271,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15102:8080 - "15999" @@ -308,7 +308,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15201:8080 - "15999" @@ -345,7 +345,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15202:8080 - "15999" @@ -382,7 +382,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index e0f66a652b9..57a352ffb06 100644 --- a/examples/compose/vtcompose/vtcompose.go +++ b/examples/compose/vtcompose/vtcompose.go @@ -533,7 +533,7 @@ func generateDefaultShard(tabAlias int, shard string, keyspaceData keyspaceInfo, - op: add path: /services/init_shard_primary%[2]d value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 command: ["sh", "-c", "/vt/bin/vtctlclient %[5]s InitShardPrimary -force %[4]s/%[3]s %[6]s-%[2]d "] %[1]s `, dependsOn, aliases[0], shard, keyspaceData.keyspace, opts.topologyFlags, opts.cell) @@ -565,7 +565,7 @@ func generateExternalPrimary( - op: add path: /services/vttablet%[1]d value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15%[1]d:%[3]d" - "%[4]d" @@ -627,7 +627,7 @@ func generateDefaultTablet(tabAlias int, shard, role, keyspace string, dbInfo ex - op: add path: /services/vttablet%[1]d value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15%[1]d:%[4]d" - "%[5]d" @@ -665,7 +665,7 @@ func generateVtctld(opts vtOptions) string { - op: add path: /services/vtctld value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15000:%[1]d" - "%[2]d" @@ -698,7 +698,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15099:%[1]d" - "%[2]d" @@ -740,7 +740,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: @@ -765,7 +765,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: @@ -793,7 +793,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: @@ -830,7 +830,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index eed05b75a9d..f3381214915 100644 --- a/examples/operator/101_initial_cluster.yaml +++ b/examples/operator/101_initial_cluster.yaml @@ -8,14 +8,14 @@ metadata: name: example spec: images: - vtctld: vitess/lite:v15.0.2 - vtadmin: vitess/vtadmin:v15.0.0-rc1 - vtgate: vitess/lite:v15.0.2 - vttablet: vitess/lite:v15.0.2 - vtbackup: vitess/lite:v15.0.2 - vtorc: vitess/lite:v15.0.2 + vtctld: vitess/lite:v15.0.3 + vtadmin: vitess/vtadmin:v15.0.3 + vtgate: vitess/lite:v15.0.3 + vttablet: vitess/lite:v15.0.3 + vtbackup: vitess/lite:v15.0.3 + vtorc: vitess/lite:v15.0.3 mysqld: - mysql56Compatible: vitess/lite:v15.0.2 + mysql56Compatible: vitess/lite:v15.0.3 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/201_customer_tablets.yaml b/examples/operator/201_customer_tablets.yaml index 0b2f459c668..c3f96e3ac9a 100644 --- a/examples/operator/201_customer_tablets.yaml +++ b/examples/operator/201_customer_tablets.yaml @@ -4,14 +4,14 @@ metadata: name: example spec: images: - vtctld: vitess/lite:v15.0.2 - vtadmin: vitess/vtadmin:v15.0.0-rc1 - vtgate: vitess/lite:v15.0.2 - vttablet: vitess/lite:v15.0.2 - vtbackup: vitess/lite:v15.0.2 - vtorc: vitess/lite:v15.0.2 + vtctld: vitess/lite:v15.0.3 + vtadmin: vitess/vtadmin:v15.0.3 + vtgate: vitess/lite:v15.0.3 + vttablet: vitess/lite:v15.0.3 + vtbackup: vitess/lite:v15.0.3 + vtorc: vitess/lite:v15.0.3 mysqld: - mysql56Compatible: vitess/lite:v15.0.2 + mysql56Compatible: vitess/lite:v15.0.3 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/302_new_shards.yaml b/examples/operator/302_new_shards.yaml index 9082abd9d24..e268b3e907c 100644 --- a/examples/operator/302_new_shards.yaml +++ b/examples/operator/302_new_shards.yaml @@ -4,14 +4,14 @@ metadata: name: example spec: images: - vtctld: vitess/lite:v15.0.2 - vtadmin: vitess/vtadmin:v15.0.0-rc1 - vtgate: vitess/lite:v15.0.2 - vttablet: vitess/lite:v15.0.2 - vtbackup: vitess/lite:v15.0.2 - vtorc: vitess/lite:v15.0.2 + vtctld: vitess/lite:v15.0.3 + vtadmin: vitess/vtadmin:v15.0.3 + vtgate: vitess/lite:v15.0.3 + vttablet: vitess/lite:v15.0.3 + vtbackup: vitess/lite:v15.0.3 + vtorc: vitess/lite:v15.0.3 mysqld: - mysql56Compatible: vitess/lite:v15.0.2 + mysql56Compatible: vitess/lite:v15.0.3 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/306_down_shard_0.yaml b/examples/operator/306_down_shard_0.yaml index 6109c2369c5..50be80d0d72 100644 --- a/examples/operator/306_down_shard_0.yaml +++ b/examples/operator/306_down_shard_0.yaml @@ -4,14 +4,14 @@ metadata: name: example spec: images: - vtctld: vitess/lite:v15.0.2 - vtadmin: vitess/vtadmin:v15.0.0-rc1 - vtgate: vitess/lite:v15.0.2 - vttablet: vitess/lite:v15.0.2 - vtbackup: vitess/lite:v15.0.2 - vtorc: vitess/lite:v15.0.2 + vtctld: vitess/lite:v15.0.3 + vtadmin: vitess/vtadmin:v15.0.3 + vtgate: vitess/lite:v15.0.3 + vttablet: vitess/lite:v15.0.3 + vtbackup: vitess/lite:v15.0.3 + vtorc: vitess/lite:v15.0.3 mysqld: - mysql56Compatible: vitess/lite:v15.0.2 + mysql56Compatible: vitess/lite:v15.0.3 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index 18e72584887..caa0ec3ea53 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -5615,7 +5615,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: vitess-operator - image: planetscale/vitess-operator:v2.8.2 + image: planetscale/vitess-operator:v2.8.3 name: vitess-operator resources: limits: diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 58d1431f6b8..f4cab7cbb11 100644 --- a/go/vt/servenv/version.go +++ b/go/vt/servenv/version.go @@ -1,5 +1,5 @@ /* -Copyright 2022 The Vitess Authors. +Copyright 2023 The Vitess Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,4 +19,4 @@ package servenv // THIS FILE IS AUTO-GENERATED DURING NEW RELEASES BY ./tools/do_releases.sh // DO NOT EDIT -const versionName = "15.0.3-SNAPSHOT" +const versionName = "15.0.3" diff --git a/java/client/pom.xml b/java/client/pom.xml index 7e8b1fbc41e..00051ee2963 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 15.0.3-SNAPSHOT + 15.0.3 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index d37f0611623..e9aa6ece458 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 15.0.3-SNAPSHOT + 15.0.3 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 8231a9f012c..bf42ca91ef0 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 15.0.3-SNAPSHOT + 15.0.3 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 3d846e504c8..0815d6f0849 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 15.0.3-SNAPSHOT + 15.0.3 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index b3be19edf86..0db16d2b375 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 15.0.3-SNAPSHOT + 15.0.3 pom Vitess Java Client libraries [Parent]